diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml
new file mode 100644
index 0000000000..0c673d15f1
--- /dev/null
+++ b/.github/workflows/go.yml
@@ -0,0 +1,23 @@
+name: i386 linux tests
+
+on:
+ push:
+ branches: [ master ]
+ pull_request:
+ branches: [ master ]
+ workflow_dispatch:
+
+jobs:
+ build:
+ runs-on: self-hosted
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set up Go
+ uses: actions/setup-go@v2
+ with:
+ go-version: 1.21.4
+ - name: Run tests
+ run: go test -short ./...
+ env:
+ GOOS: linux
+ GOARCH: 386
diff --git a/.golangci.yml b/.golangci.yml
index 8a054667e6..0343c4b4eb 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -12,7 +12,6 @@ run:
linters:
disable-all: true
enable:
- - goconst
- goimports
- gosimple
- govet
@@ -39,9 +38,6 @@ linters:
linters-settings:
gofmt:
simplify: true
- goconst:
- min-len: 3 # minimum length of string constant
- min-occurrences: 6 # minimum number of occurrences
issues:
exclude-rules:
diff --git a/.travis.yml b/.travis.yml
index c2bfc3f2bf..a55583a703 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -9,18 +9,6 @@ jobs:
- azure-osx
include:
- # This builder only tests code linters on latest version of Go
- - stage: lint
- os: linux
- dist: bionic
- go: 1.21.x
- env:
- - lint
- git:
- submodules: false # avoid cloning ethereum/tests
- script:
- - go run build/ci.go lint
-
# These builders create the Docker sub-images for multi-arch push and each
# will attempt to push the multi-arch image if they are the last builder
- stage: build
diff --git a/README.md b/README.md
index 77317090c1..d6bc1af05c 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
Official Golang execution layer implementation of the Ethereum protocol.
[](https://pkg.go.dev/github.com/ethereum/go-ethereum?tab=doc)
[](https://goreportcard.com/report/github.com/ethereum/go-ethereum)
[](https://travis-ci.com/ethereum/go-ethereum)
diff --git a/accounts/abi/abi.go b/accounts/abi/abi.go
index 6e1075c715..4abf298068 100644
--- a/accounts/abi/abi.go
+++ b/accounts/abi/abi.go
@@ -251,7 +251,7 @@ var revertSelector = crypto.Keccak256([]byte("Error(string)"))[:4]
var panicSelector = crypto.Keccak256([]byte("Panic(uint256)"))[:4]
// panicReasons map is for readable panic codes
-// see this linkage for the deails
+// see this linkage for the details
// https://docs.soliditylang.org/en/v0.8.21/control-structures.html#panic-via-assert-and-error-via-require
// the reason string list is copied from ether.js
// https://github.com/ethers-io/ethers.js/blob/fa3a883ff7c88611ce766f58bdd4b8ac90814470/src.ts/abi/interface.ts#L207-L218
diff --git a/accounts/abi/abi_test.go b/accounts/abi/abi_test.go
index 84175df4bb..bc76df0dc2 100644
--- a/accounts/abi/abi_test.go
+++ b/accounts/abi/abi_test.go
@@ -120,6 +120,7 @@ var methods = map[string]Method{
}
func TestReader(t *testing.T) {
+ t.Parallel()
abi := ABI{
Methods: methods,
}
@@ -151,6 +152,7 @@ func TestReader(t *testing.T) {
}
func TestInvalidABI(t *testing.T) {
+ t.Parallel()
json := `[{ "type" : "function", "name" : "", "constant" : fals }]`
_, err := JSON(strings.NewReader(json))
if err == nil {
@@ -170,6 +172,7 @@ func TestInvalidABI(t *testing.T) {
// constructor(uint256 a, uint256 b) public{}
// }
func TestConstructor(t *testing.T) {
+ t.Parallel()
json := `[{ "inputs": [{"internalType": "uint256","name": "a","type": "uint256" },{ "internalType": "uint256","name": "b","type": "uint256"}],"stateMutability": "nonpayable","type": "constructor"}]`
method := NewMethod("", "", Constructor, "nonpayable", false, false, []Argument{{"a", Uint256, false}, {"b", Uint256, false}}, nil)
// Test from JSON
@@ -199,6 +202,7 @@ func TestConstructor(t *testing.T) {
}
func TestTestNumbers(t *testing.T) {
+ t.Parallel()
abi, err := JSON(strings.NewReader(jsondata))
if err != nil {
t.Fatal(err)
@@ -236,6 +240,7 @@ func TestTestNumbers(t *testing.T) {
}
func TestMethodSignature(t *testing.T) {
+ t.Parallel()
m := NewMethod("foo", "foo", Function, "", false, false, []Argument{{"bar", String, false}, {"baz", String, false}}, nil)
exp := "foo(string,string)"
if m.Sig != exp {
@@ -274,6 +279,7 @@ func TestMethodSignature(t *testing.T) {
}
func TestOverloadedMethodSignature(t *testing.T) {
+ t.Parallel()
json := `[{"constant":true,"inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"}],"name":"foo","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"i","type":"uint256"}],"name":"foo","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"i","type":"uint256"}],"name":"bar","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"i","type":"uint256"},{"indexed":false,"name":"j","type":"uint256"}],"name":"bar","type":"event"}]`
abi, err := JSON(strings.NewReader(json))
if err != nil {
@@ -297,6 +303,7 @@ func TestOverloadedMethodSignature(t *testing.T) {
}
func TestCustomErrors(t *testing.T) {
+ t.Parallel()
json := `[{ "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ],"name": "MyError", "type": "error"} ]`
abi, err := JSON(strings.NewReader(json))
if err != nil {
@@ -311,6 +318,7 @@ func TestCustomErrors(t *testing.T) {
}
func TestMultiPack(t *testing.T) {
+ t.Parallel()
abi, err := JSON(strings.NewReader(jsondata))
if err != nil {
t.Fatal(err)
@@ -348,6 +356,7 @@ func ExampleJSON() {
}
func TestInputVariableInputLength(t *testing.T) {
+ t.Parallel()
const definition = `[
{ "type" : "function", "name" : "strOne", "constant" : true, "inputs" : [ { "name" : "str", "type" : "string" } ] },
{ "type" : "function", "name" : "bytesOne", "constant" : true, "inputs" : [ { "name" : "str", "type" : "bytes" } ] },
@@ -476,6 +485,7 @@ func TestInputVariableInputLength(t *testing.T) {
}
func TestInputFixedArrayAndVariableInputLength(t *testing.T) {
+ t.Parallel()
abi, err := JSON(strings.NewReader(jsondata))
if err != nil {
t.Error(err)
@@ -650,6 +660,7 @@ func TestInputFixedArrayAndVariableInputLength(t *testing.T) {
}
func TestDefaultFunctionParsing(t *testing.T) {
+ t.Parallel()
const definition = `[{ "name" : "balance", "type" : "function" }]`
abi, err := JSON(strings.NewReader(definition))
@@ -663,6 +674,7 @@ func TestDefaultFunctionParsing(t *testing.T) {
}
func TestBareEvents(t *testing.T) {
+ t.Parallel()
const definition = `[
{ "type" : "event", "name" : "balance" },
{ "type" : "event", "name" : "anon", "anonymous" : true},
@@ -739,6 +751,7 @@ func TestBareEvents(t *testing.T) {
//
// receipt{status=1 cgas=23949 bloom=00000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000040200000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 logs=[log: b6818c8064f645cd82d99b59a1a267d6d61117ef [75fd880d39c1daf53b6547ab6cb59451fc6452d27caa90e5b6649dd8293b9eed] 000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158 9ae378b6d4409eada347a5dc0c180f186cb62dc68fcc0f043425eb917335aa28 0 95d429d309bb9d753954195fe2d69bd140b4ae731b9b5b605c34323de162cf00 0]}
func TestUnpackEvent(t *testing.T) {
+ t.Parallel()
const abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"}],"name":"receivedAddr","type":"event"}]`
abi, err := JSON(strings.NewReader(abiJSON))
if err != nil {
@@ -777,6 +790,7 @@ func TestUnpackEvent(t *testing.T) {
}
func TestUnpackEventIntoMap(t *testing.T) {
+ t.Parallel()
const abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"}],"name":"receivedAddr","type":"event"}]`
abi, err := JSON(strings.NewReader(abiJSON))
if err != nil {
@@ -827,6 +841,7 @@ func TestUnpackEventIntoMap(t *testing.T) {
}
func TestUnpackMethodIntoMap(t *testing.T) {
+ t.Parallel()
const abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"send","outputs":[{"name":"amount","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"get","outputs":[{"name":"hash","type":"bytes"}],"payable":true,"stateMutability":"payable","type":"function"}]`
abi, err := JSON(strings.NewReader(abiJSON))
if err != nil {
@@ -877,6 +892,7 @@ func TestUnpackMethodIntoMap(t *testing.T) {
}
func TestUnpackIntoMapNamingConflict(t *testing.T) {
+ t.Parallel()
// Two methods have the same name
var abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"get","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"send","outputs":[{"name":"amount","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"get","outputs":[{"name":"hash","type":"bytes"}],"payable":true,"stateMutability":"payable","type":"function"}]`
abi, err := JSON(strings.NewReader(abiJSON))
@@ -960,6 +976,7 @@ func TestUnpackIntoMapNamingConflict(t *testing.T) {
}
func TestABI_MethodById(t *testing.T) {
+ t.Parallel()
abi, err := JSON(strings.NewReader(jsondata))
if err != nil {
t.Fatal(err)
@@ -992,6 +1009,7 @@ func TestABI_MethodById(t *testing.T) {
}
func TestABI_EventById(t *testing.T) {
+ t.Parallel()
tests := []struct {
name string
json string
@@ -1058,6 +1076,7 @@ func TestABI_EventById(t *testing.T) {
}
func TestABI_ErrorByID(t *testing.T) {
+ t.Parallel()
abi, err := JSON(strings.NewReader(`[
{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"MyError1","type":"error"},
{"inputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"string","name":"b","type":"string"},{"internalType":"address","name":"c","type":"address"}],"internalType":"struct MyError.MyStruct","name":"x","type":"tuple"},{"internalType":"address","name":"y","type":"address"},{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"string","name":"b","type":"string"},{"internalType":"address","name":"c","type":"address"}],"internalType":"struct MyError.MyStruct","name":"z","type":"tuple"}],"name":"MyError2","type":"error"},
@@ -1088,6 +1107,7 @@ func TestABI_ErrorByID(t *testing.T) {
// TestDoubleDuplicateMethodNames checks that if transfer0 already exists, there won't be a name
// conflict and that the second transfer method will be renamed transfer1.
func TestDoubleDuplicateMethodNames(t *testing.T) {
+ t.Parallel()
abiJSON := `[{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"}],"name":"transfer0","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"},{"name":"customFallback","type":"string"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]`
contractAbi, err := JSON(strings.NewReader(abiJSON))
if err != nil {
@@ -1117,6 +1137,7 @@ func TestDoubleDuplicateMethodNames(t *testing.T) {
// event send();
// }
func TestDoubleDuplicateEventNames(t *testing.T) {
+ t.Parallel()
abiJSON := `[{"anonymous": false,"inputs": [{"indexed": false,"internalType": "uint256","name": "a","type": "uint256"}],"name": "send","type": "event"},{"anonymous": false,"inputs": [],"name": "send0","type": "event"},{ "anonymous": false, "inputs": [],"name": "send","type": "event"}]`
contractAbi, err := JSON(strings.NewReader(abiJSON))
if err != nil {
@@ -1144,6 +1165,7 @@ func TestDoubleDuplicateEventNames(t *testing.T) {
// event send(uint256, uint256);
// }
func TestUnnamedEventParam(t *testing.T) {
+ t.Parallel()
abiJSON := `[{ "anonymous": false, "inputs": [{ "indexed": false,"internalType": "uint256", "name": "","type": "uint256"},{"indexed": false,"internalType": "uint256","name": "","type": "uint256"}],"name": "send","type": "event"}]`
contractAbi, err := JSON(strings.NewReader(abiJSON))
if err != nil {
@@ -1177,7 +1199,9 @@ func TestUnpackRevert(t *testing.T) {
{"4e487b7100000000000000000000000000000000000000000000000000000000000000ff", "unknown panic code: 0xff", nil},
}
for index, c := range cases {
+ index, c := index, c
t.Run(fmt.Sprintf("case %d", index), func(t *testing.T) {
+ t.Parallel()
got, err := UnpackRevert(common.Hex2Bytes(c.input))
if c.expectErr != nil {
if err == nil {
diff --git a/accounts/abi/abifuzzer_test.go b/accounts/abi/abifuzzer_test.go
index 4b67947815..dbf6ab6c54 100644
--- a/accounts/abi/abifuzzer_test.go
+++ b/accounts/abi/abifuzzer_test.go
@@ -28,6 +28,7 @@ import (
// TestReplicate can be used to replicate crashers from the fuzzing tests.
// Just replace testString with the data in .quoted
func TestReplicate(t *testing.T) {
+ t.Parallel()
//t.Skip("Test only useful for reproducing issues")
fuzzAbi([]byte("\x20\x20\x20\x20\x20\x20\x20\x20\x80\x00\x00\x00\x20\x20\x20\x20\x00"))
//fuzzAbi([]byte("asdfasdfkadsf;lasdf;lasd;lfk"))
diff --git a/accounts/abi/bind/auth.go b/accounts/abi/bind/auth.go
index 494dc88a57..0740c69510 100644
--- a/accounts/abi/bind/auth.go
+++ b/accounts/abi/bind/auth.go
@@ -56,7 +56,7 @@ func NewTransactor(keyin io.Reader, passphrase string) (*TransactOpts, error) {
}
// NewKeyStoreTransactor is a utility method to easily create a transaction signer from
-// an decrypted key from a keystore.
+// a decrypted key from a keystore.
//
// Deprecated: Use NewKeyStoreTransactorWithChainID instead.
func NewKeyStoreTransactor(keystore *keystore.KeyStore, account accounts.Account) (*TransactOpts, error) {
@@ -117,7 +117,7 @@ func NewTransactorWithChainID(keyin io.Reader, passphrase string, chainID *big.I
}
// NewKeyStoreTransactorWithChainID is a utility method to easily create a transaction signer from
-// an decrypted key from a keystore.
+// a decrypted key from a keystore.
func NewKeyStoreTransactorWithChainID(keystore *keystore.KeyStore, account accounts.Account, chainID *big.Int) (*TransactOpts, error) {
if chainID == nil {
return nil, ErrNoChainID
diff --git a/accounts/abi/bind/backend.go b/accounts/abi/bind/backend.go
index d13b919641..38b3046970 100644
--- a/accounts/abi/bind/backend.go
+++ b/accounts/abi/bind/backend.go
@@ -75,7 +75,7 @@ type BlockHashContractCaller interface {
// CodeAtHash returns the code of the given account in the state at the specified block hash.
CodeAtHash(ctx context.Context, contract common.Address, blockHash common.Hash) ([]byte, error)
- // CallContractAtHash executes an Ethereum contract all against the state at the specified block hash.
+ // CallContractAtHash executes an Ethereum contract call against the state at the specified block hash.
CallContractAtHash(ctx context.Context, call ethereum.CallMsg, blockHash common.Hash) ([]byte, error)
}
@@ -84,6 +84,11 @@ type BlockHashContractCaller interface {
// used when the user does not provide some needed values, but rather leaves it up
// to the transactor to decide.
type ContractTransactor interface {
+ ethereum.GasEstimator
+ ethereum.GasPricer
+ ethereum.GasPricer1559
+ ethereum.TransactionSender
+
// HeaderByNumber returns a block header from the current canonical chain. If
// number is nil, the latest known header is returned.
HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error)
@@ -93,38 +98,6 @@ type ContractTransactor interface {
// PendingNonceAt retrieves the current pending nonce associated with an account.
PendingNonceAt(ctx context.Context, account common.Address) (uint64, error)
-
- // SuggestGasPrice retrieves the currently suggested gas price to allow a timely
- // execution of a transaction.
- SuggestGasPrice(ctx context.Context) (*big.Int, error)
-
- // SuggestGasTipCap retrieves the currently suggested 1559 priority fee to allow
- // a timely execution of a transaction.
- SuggestGasTipCap(ctx context.Context) (*big.Int, error)
-
- // EstimateGas tries to estimate the gas needed to execute a specific
- // transaction based on the current pending state of the backend blockchain.
- // There is no guarantee that this is the true gas limit requirement as other
- // transactions may be added or removed by miners, but it should provide a basis
- // for setting a reasonable default.
- EstimateGas(ctx context.Context, call ethereum.CallMsg) (gas uint64, err error)
-
- // SendTransaction injects the transaction into the pending pool for execution.
- SendTransaction(ctx context.Context, tx *types.Transaction) error
-}
-
-// ContractFilterer defines the methods needed to access log events using one-off
-// queries or continuous event subscriptions.
-type ContractFilterer interface {
- // FilterLogs executes a log filter operation, blocking during execution and
- // returning all the results in one batch.
- //
- // TODO(karalabe): Deprecate when the subscription one can return past data too.
- FilterLogs(ctx context.Context, query ethereum.FilterQuery) ([]types.Log, error)
-
- // SubscribeFilterLogs creates a background log filtering operation, returning
- // a subscription immediately, which can be used to stream the found events.
- SubscribeFilterLogs(ctx context.Context, query ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error)
}
// DeployBackend wraps the operations needed by WaitMined and WaitDeployed.
@@ -133,6 +106,12 @@ type DeployBackend interface {
CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error)
}
+// ContractFilterer defines the methods needed to access log events using one-off
+// queries or continuous event subscriptions.
+type ContractFilterer interface {
+ ethereum.LogFilterer
+}
+
// ContractBackend defines the methods needed to work with contracts on a read-write basis.
type ContractBackend interface {
ContractCaller
diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go
index 2faf274dbd..756a9d3552 100644
--- a/accounts/abi/bind/backends/simulated.go
+++ b/accounts/abi/bind/backends/simulated.go
@@ -18,958 +18,35 @@ package backends
import (
"context"
- "errors"
- "fmt"
- "math/big"
- "sync"
- "time"
- "github.com/ethereum/go-ethereum"
- "github.com/ethereum/go-ethereum/accounts/abi"
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/common/hexutil"
- "github.com/ethereum/go-ethereum/common/math"
- "github.com/ethereum/go-ethereum/consensus/ethash"
"github.com/ethereum/go-ethereum/core"
- "github.com/ethereum/go-ethereum/core/bloombits"
- "github.com/ethereum/go-ethereum/core/rawdb"
- "github.com/ethereum/go-ethereum/core/state"
- "github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/core/vm"
- "github.com/ethereum/go-ethereum/eth/filters"
- "github.com/ethereum/go-ethereum/ethdb"
- "github.com/ethereum/go-ethereum/event"
- "github.com/ethereum/go-ethereum/log"
- "github.com/ethereum/go-ethereum/params"
- "github.com/ethereum/go-ethereum/rpc"
+ "github.com/ethereum/go-ethereum/ethclient/simulated"
)
-// This nil assignment ensures at compile time that SimulatedBackend implements bind.ContractBackend.
-var _ bind.ContractBackend = (*SimulatedBackend)(nil)
-
-var (
- errBlockNumberUnsupported = errors.New("simulatedBackend cannot access blocks other than the latest block")
- errBlockHashUnsupported = errors.New("simulatedBackend cannot access blocks by hash other than the latest block")
- errBlockDoesNotExist = errors.New("block does not exist in blockchain")
- errTransactionDoesNotExist = errors.New("transaction does not exist")
-)
-
-// SimulatedBackend implements bind.ContractBackend, simulating a blockchain in
-// the background. Its main purpose is to allow for easy testing of contract bindings.
-// Simulated backend implements the following interfaces:
-// ChainReader, ChainStateReader, ContractBackend, ContractCaller, ContractFilterer, ContractTransactor,
-// DeployBackend, GasEstimator, GasPricer, LogFilterer, PendingContractCaller, TransactionReader, and TransactionSender
+// SimulatedBackend is a simulated blockchain.
+// Deprecated: use package github.com/ethereum/go-ethereum/ethclient/simulated instead.
type SimulatedBackend struct {
- database ethdb.Database // In memory database to store our testing data
- blockchain *core.BlockChain // Ethereum blockchain to handle the consensus
-
- mu sync.Mutex
- pendingBlock *types.Block // Currently pending block that will be imported on request
- pendingState *state.StateDB // Currently pending state that will be the active on request
- pendingReceipts types.Receipts // Currently receipts for the pending block
-
- events *filters.EventSystem // for filtering log events live
- filterSystem *filters.FilterSystem // for filtering database logs
-
- config *params.ChainConfig
+ *simulated.Backend
+ simulated.Client
}
-// NewSimulatedBackendWithDatabase creates a new binding backend based on the given database
-// and uses a simulated blockchain for testing purposes.
-// A simulated backend always uses chainID 1337.
-func NewSimulatedBackendWithDatabase(database ethdb.Database, alloc core.GenesisAlloc, gasLimit uint64) *SimulatedBackend {
- genesis := core.Genesis{
- Config: params.AllEthashProtocolChanges,
- GasLimit: gasLimit,
- Alloc: alloc,
- }
- blockchain, _ := core.NewBlockChain(database, nil, &genesis, nil, ethash.NewFaker(), vm.Config{}, nil, nil)
-
- backend := &SimulatedBackend{
- database: database,
- blockchain: blockchain,
- config: genesis.Config,
- }
-
- filterBackend := &filterBackend{database, blockchain, backend}
- backend.filterSystem = filters.NewFilterSystem(filterBackend, filters.Config{})
- backend.events = filters.NewEventSystem(backend.filterSystem, false)
-
- header := backend.blockchain.CurrentBlock()
- block := backend.blockchain.GetBlock(header.Hash(), header.Number.Uint64())
-
- backend.rollback(block)
- return backend
+// Fork sets the head to a new block, which is based on the provided parentHash.
+func (b *SimulatedBackend) Fork(ctx context.Context, parentHash common.Hash) error {
+ return b.Backend.Fork(parentHash)
}
// NewSimulatedBackend creates a new binding backend using a simulated blockchain
// for testing purposes.
+//
// A simulated backend always uses chainID 1337.
+//
+// Deprecated: please use simulated.Backend from package
+// github.com/ethereum/go-ethereum/ethclient/simulated instead.
func NewSimulatedBackend(alloc core.GenesisAlloc, gasLimit uint64) *SimulatedBackend {
- return NewSimulatedBackendWithDatabase(rawdb.NewMemoryDatabase(), alloc, gasLimit)
-}
-
-// Close terminates the underlying blockchain's update loop.
-func (b *SimulatedBackend) Close() error {
- b.blockchain.Stop()
- return nil
-}
-
-// Commit imports all the pending transactions as a single block and starts a
-// fresh new state.
-func (b *SimulatedBackend) Commit() common.Hash {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- if _, err := b.blockchain.InsertChain([]*types.Block{b.pendingBlock}); err != nil {
- panic(err) // This cannot happen unless the simulator is wrong, fail in that case
- }
- blockHash := b.pendingBlock.Hash()
-
- // Using the last inserted block here makes it possible to build on a side
- // chain after a fork.
- b.rollback(b.pendingBlock)
-
- return blockHash
-}
-
-// Rollback aborts all pending transactions, reverting to the last committed state.
-func (b *SimulatedBackend) Rollback() {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- header := b.blockchain.CurrentBlock()
- block := b.blockchain.GetBlock(header.Hash(), header.Number.Uint64())
-
- b.rollback(block)
-}
-
-func (b *SimulatedBackend) rollback(parent *types.Block) {
- blocks, _ := core.GenerateChain(b.config, parent, ethash.NewFaker(), b.database, 1, func(int, *core.BlockGen) {})
-
- b.pendingBlock = blocks[0]
- b.pendingState, _ = state.New(b.pendingBlock.Root(), b.blockchain.StateCache(), nil)
-}
-
-// Fork creates a side-chain that can be used to simulate reorgs.
-//
-// This function should be called with the ancestor block where the new side
-// chain should be started. Transactions (old and new) can then be applied on
-// top and Commit-ed.
-//
-// Note, the side-chain will only become canonical (and trigger the events) when
-// it becomes longer. Until then CallContract will still operate on the current
-// canonical chain.
-//
-// There is a % chance that the side chain becomes canonical at the same length
-// to simulate live network behavior.
-func (b *SimulatedBackend) Fork(ctx context.Context, parent common.Hash) error {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- if len(b.pendingBlock.Transactions()) != 0 {
- return errors.New("pending block dirty")
- }
- block, err := b.blockByHash(ctx, parent)
- if err != nil {
- return err
- }
- b.rollback(block)
- return nil
-}
-
-// stateByBlockNumber retrieves a state by a given blocknumber.
-func (b *SimulatedBackend) stateByBlockNumber(ctx context.Context, blockNumber *big.Int) (*state.StateDB, error) {
- if blockNumber == nil || blockNumber.Cmp(b.blockchain.CurrentBlock().Number) == 0 {
- return b.blockchain.State()
- }
- block, err := b.blockByNumber(ctx, blockNumber)
- if err != nil {
- return nil, err
- }
- return b.blockchain.StateAt(block.Root())
-}
-
-// CodeAt returns the code associated with a certain account in the blockchain.
-func (b *SimulatedBackend) CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- stateDB, err := b.stateByBlockNumber(ctx, blockNumber)
- if err != nil {
- return nil, err
- }
- return stateDB.GetCode(contract), nil
-}
-
-// CodeAtHash returns the code associated with a certain account in the blockchain.
-func (b *SimulatedBackend) CodeAtHash(ctx context.Context, contract common.Address, blockHash common.Hash) ([]byte, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- header, err := b.headerByHash(blockHash)
- if err != nil {
- return nil, err
- }
-
- stateDB, err := b.blockchain.StateAt(header.Root)
- if err != nil {
- return nil, err
- }
-
- return stateDB.GetCode(contract), nil
-}
-
-// BalanceAt returns the wei balance of a certain account in the blockchain.
-func (b *SimulatedBackend) BalanceAt(ctx context.Context, contract common.Address, blockNumber *big.Int) (*big.Int, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- stateDB, err := b.stateByBlockNumber(ctx, blockNumber)
- if err != nil {
- return nil, err
- }
- return stateDB.GetBalance(contract), nil
-}
-
-// NonceAt returns the nonce of a certain account in the blockchain.
-func (b *SimulatedBackend) NonceAt(ctx context.Context, contract common.Address, blockNumber *big.Int) (uint64, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- stateDB, err := b.stateByBlockNumber(ctx, blockNumber)
- if err != nil {
- return 0, err
- }
- return stateDB.GetNonce(contract), nil
-}
-
-// StorageAt returns the value of key in the storage of an account in the blockchain.
-func (b *SimulatedBackend) StorageAt(ctx context.Context, contract common.Address, key common.Hash, blockNumber *big.Int) ([]byte, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- stateDB, err := b.stateByBlockNumber(ctx, blockNumber)
- if err != nil {
- return nil, err
- }
- val := stateDB.GetState(contract, key)
- return val[:], nil
-}
-
-// TransactionReceipt returns the receipt of a transaction.
-func (b *SimulatedBackend) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- receipt, _, _, _ := rawdb.ReadReceipt(b.database, txHash, b.config)
- if receipt == nil {
- return nil, ethereum.NotFound
- }
- return receipt, nil
-}
-
-// TransactionByHash checks the pool of pending transactions in addition to the
-// blockchain. The isPending return value indicates whether the transaction has been
-// mined yet. Note that the transaction may not be part of the canonical chain even if
-// it's not pending.
-func (b *SimulatedBackend) TransactionByHash(ctx context.Context, txHash common.Hash) (*types.Transaction, bool, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- tx := b.pendingBlock.Transaction(txHash)
- if tx != nil {
- return tx, true, nil
- }
- tx, _, _, _ = rawdb.ReadTransaction(b.database, txHash)
- if tx != nil {
- return tx, false, nil
- }
- return nil, false, ethereum.NotFound
-}
-
-// BlockByHash retrieves a block based on the block hash.
-func (b *SimulatedBackend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- return b.blockByHash(ctx, hash)
-}
-
-// blockByHash retrieves a block based on the block hash without Locking.
-func (b *SimulatedBackend) blockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) {
- if hash == b.pendingBlock.Hash() {
- return b.pendingBlock, nil
- }
-
- block := b.blockchain.GetBlockByHash(hash)
- if block != nil {
- return block, nil
- }
-
- return nil, errBlockDoesNotExist
-}
-
-// BlockByNumber retrieves a block from the database by number, caching it
-// (associated with its hash) if found.
-func (b *SimulatedBackend) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- return b.blockByNumber(ctx, number)
-}
-
-// blockByNumber retrieves a block from the database by number, caching it
-// (associated with its hash) if found without Lock.
-func (b *SimulatedBackend) blockByNumber(ctx context.Context, number *big.Int) (*types.Block, error) {
- if number == nil || number.Cmp(b.pendingBlock.Number()) == 0 {
- return b.blockByHash(ctx, b.blockchain.CurrentBlock().Hash())
- }
-
- block := b.blockchain.GetBlockByNumber(uint64(number.Int64()))
- if block == nil {
- return nil, errBlockDoesNotExist
- }
-
- return block, nil
-}
-
-// HeaderByHash returns a block header from the current canonical chain.
-func (b *SimulatedBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
- return b.headerByHash(hash)
-}
-
-// headerByHash retrieves a header from the database by hash without Lock.
-func (b *SimulatedBackend) headerByHash(hash common.Hash) (*types.Header, error) {
- if hash == b.pendingBlock.Hash() {
- return b.pendingBlock.Header(), nil
- }
-
- header := b.blockchain.GetHeaderByHash(hash)
- if header == nil {
- return nil, errBlockDoesNotExist
- }
-
- return header, nil
-}
-
-// HeaderByNumber returns a block header from the current canonical chain. If number is
-// nil, the latest known header is returned.
-func (b *SimulatedBackend) HeaderByNumber(ctx context.Context, block *big.Int) (*types.Header, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- if block == nil || block.Cmp(b.pendingBlock.Number()) == 0 {
- return b.blockchain.CurrentHeader(), nil
- }
-
- return b.blockchain.GetHeaderByNumber(uint64(block.Int64())), nil
-}
-
-// TransactionCount returns the number of transactions in a given block.
-func (b *SimulatedBackend) TransactionCount(ctx context.Context, blockHash common.Hash) (uint, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- if blockHash == b.pendingBlock.Hash() {
- return uint(b.pendingBlock.Transactions().Len()), nil
- }
-
- block := b.blockchain.GetBlockByHash(blockHash)
- if block == nil {
- return uint(0), errBlockDoesNotExist
- }
-
- return uint(block.Transactions().Len()), nil
-}
-
-// TransactionInBlock returns the transaction for a specific block at a specific index.
-func (b *SimulatedBackend) TransactionInBlock(ctx context.Context, blockHash common.Hash, index uint) (*types.Transaction, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- if blockHash == b.pendingBlock.Hash() {
- transactions := b.pendingBlock.Transactions()
- if uint(len(transactions)) < index+1 {
- return nil, errTransactionDoesNotExist
- }
-
- return transactions[index], nil
- }
-
- block := b.blockchain.GetBlockByHash(blockHash)
- if block == nil {
- return nil, errBlockDoesNotExist
- }
-
- transactions := block.Transactions()
- if uint(len(transactions)) < index+1 {
- return nil, errTransactionDoesNotExist
- }
-
- return transactions[index], nil
-}
-
-// PendingCodeAt returns the code associated with an account in the pending state.
-func (b *SimulatedBackend) PendingCodeAt(ctx context.Context, contract common.Address) ([]byte, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- return b.pendingState.GetCode(contract), nil
-}
-
-func newRevertError(result *core.ExecutionResult) *revertError {
- reason, errUnpack := abi.UnpackRevert(result.Revert())
- err := errors.New("execution reverted")
- if errUnpack == nil {
- err = fmt.Errorf("execution reverted: %v", reason)
- }
- return &revertError{
- error: err,
- reason: hexutil.Encode(result.Revert()),
+ b := simulated.NewBackend(alloc, simulated.WithBlockGasLimit(gasLimit))
+ return &SimulatedBackend{
+ Backend: b,
+ Client: b.Client(),
}
}
-
-// revertError is an API error that encompasses an EVM revert with JSON error
-// code and a binary data blob.
-type revertError struct {
- error
- reason string // revert reason hex encoded
-}
-
-// ErrorCode returns the JSON error code for a revert.
-// See: https://github.com/ethereum/wiki/wiki/JSON-RPC-Error-Codes-Improvement-Proposal
-func (e *revertError) ErrorCode() int {
- return 3
-}
-
-// ErrorData returns the hex encoded revert reason.
-func (e *revertError) ErrorData() interface{} {
- return e.reason
-}
-
-// CallContract executes a contract call.
-func (b *SimulatedBackend) CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- if blockNumber != nil && blockNumber.Cmp(b.blockchain.CurrentBlock().Number) != 0 {
- return nil, errBlockNumberUnsupported
- }
- return b.callContractAtHead(ctx, call)
-}
-
-// CallContractAtHash executes a contract call on a specific block hash.
-func (b *SimulatedBackend) CallContractAtHash(ctx context.Context, call ethereum.CallMsg, blockHash common.Hash) ([]byte, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- if blockHash != b.blockchain.CurrentBlock().Hash() {
- return nil, errBlockHashUnsupported
- }
- return b.callContractAtHead(ctx, call)
-}
-
-// callContractAtHead executes a contract call against the latest block state.
-func (b *SimulatedBackend) callContractAtHead(ctx context.Context, call ethereum.CallMsg) ([]byte, error) {
- stateDB, err := b.blockchain.State()
- if err != nil {
- return nil, err
- }
- res, err := b.callContract(ctx, call, b.blockchain.CurrentBlock(), stateDB)
- if err != nil {
- return nil, err
- }
- // If the result contains a revert reason, try to unpack and return it.
- if len(res.Revert()) > 0 {
- return nil, newRevertError(res)
- }
- return res.Return(), res.Err
-}
-
-// PendingCallContract executes a contract call on the pending state.
-func (b *SimulatedBackend) PendingCallContract(ctx context.Context, call ethereum.CallMsg) ([]byte, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
- defer b.pendingState.RevertToSnapshot(b.pendingState.Snapshot())
-
- res, err := b.callContract(ctx, call, b.pendingBlock.Header(), b.pendingState)
- if err != nil {
- return nil, err
- }
- // If the result contains a revert reason, try to unpack and return it.
- if len(res.Revert()) > 0 {
- return nil, newRevertError(res)
- }
- return res.Return(), res.Err
-}
-
-// PendingNonceAt implements PendingStateReader.PendingNonceAt, retrieving
-// the nonce currently pending for the account.
-func (b *SimulatedBackend) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- return b.pendingState.GetOrNewStateObject(account).Nonce(), nil
-}
-
-// SuggestGasPrice implements ContractTransactor.SuggestGasPrice. Since the simulated
-// chain doesn't have miners, we just return a gas price of 1 for any call.
-func (b *SimulatedBackend) SuggestGasPrice(ctx context.Context) (*big.Int, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- if b.pendingBlock.Header().BaseFee != nil {
- return b.pendingBlock.Header().BaseFee, nil
- }
- return big.NewInt(1), nil
-}
-
-// SuggestGasTipCap implements ContractTransactor.SuggestGasTipCap. Since the simulated
-// chain doesn't have miners, we just return a gas tip of 1 for any call.
-func (b *SimulatedBackend) SuggestGasTipCap(ctx context.Context) (*big.Int, error) {
- return big.NewInt(1), nil
-}
-
-// EstimateGas executes the requested code against the currently pending block/state and
-// returns the used amount of gas.
-func (b *SimulatedBackend) EstimateGas(ctx context.Context, call ethereum.CallMsg) (uint64, error) {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- // Determine the lowest and highest possible gas limits to binary search in between
- var (
- lo uint64 = params.TxGas - 1
- hi uint64
- cap uint64
- )
- if call.Gas >= params.TxGas {
- hi = call.Gas
- } else {
- hi = b.pendingBlock.GasLimit()
- }
- // Normalize the max fee per gas the call is willing to spend.
- var feeCap *big.Int
- if call.GasPrice != nil && (call.GasFeeCap != nil || call.GasTipCap != nil) {
- return 0, errors.New("both gasPrice and (maxFeePerGas or maxPriorityFeePerGas) specified")
- } else if call.GasPrice != nil {
- feeCap = call.GasPrice
- } else if call.GasFeeCap != nil {
- feeCap = call.GasFeeCap
- } else {
- feeCap = common.Big0
- }
- // Recap the highest gas allowance with account's balance.
- if feeCap.BitLen() != 0 {
- balance := b.pendingState.GetBalance(call.From) // from can't be nil
- available := new(big.Int).Set(balance)
- if call.Value != nil {
- if call.Value.Cmp(available) >= 0 {
- return 0, core.ErrInsufficientFundsForTransfer
- }
- available.Sub(available, call.Value)
- }
- allowance := new(big.Int).Div(available, feeCap)
- if allowance.IsUint64() && hi > allowance.Uint64() {
- transfer := call.Value
- if transfer == nil {
- transfer = new(big.Int)
- }
- log.Warn("Gas estimation capped by limited funds", "original", hi, "balance", balance,
- "sent", transfer, "feecap", feeCap, "fundable", allowance)
- hi = allowance.Uint64()
- }
- }
- cap = hi
-
- // Create a helper to check if a gas allowance results in an executable transaction
- executable := func(gas uint64) (bool, *core.ExecutionResult, error) {
- call.Gas = gas
-
- snapshot := b.pendingState.Snapshot()
- res, err := b.callContract(ctx, call, b.pendingBlock.Header(), b.pendingState)
- b.pendingState.RevertToSnapshot(snapshot)
-
- if err != nil {
- if errors.Is(err, core.ErrIntrinsicGas) {
- return true, nil, nil // Special case, raise gas limit
- }
- return true, nil, err // Bail out
- }
- return res.Failed(), res, nil
- }
- // Execute the binary search and hone in on an executable gas limit
- for lo+1 < hi {
- mid := (hi + lo) / 2
- failed, _, err := executable(mid)
-
- // If the error is not nil(consensus error), it means the provided message
- // call or transaction will never be accepted no matter how much gas it is
- // assigned. Return the error directly, don't struggle any more
- if err != nil {
- return 0, err
- }
- if failed {
- lo = mid
- } else {
- hi = mid
- }
- }
- // Reject the transaction as invalid if it still fails at the highest allowance
- if hi == cap {
- failed, result, err := executable(hi)
- if err != nil {
- return 0, err
- }
- if failed {
- if result != nil && !errors.Is(result.Err, vm.ErrOutOfGas) {
- if len(result.Revert()) > 0 {
- return 0, newRevertError(result)
- }
- return 0, result.Err
- }
- // Otherwise, the specified gas cap is too low
- return 0, fmt.Errorf("gas required exceeds allowance (%d)", cap)
- }
- }
- return hi, nil
-}
-
-// callContract implements common code between normal and pending contract calls.
-// state is modified during execution, make sure to copy it if necessary.
-func (b *SimulatedBackend) callContract(ctx context.Context, call ethereum.CallMsg, header *types.Header, stateDB *state.StateDB) (*core.ExecutionResult, error) {
- // Gas prices post 1559 need to be initialized
- if call.GasPrice != nil && (call.GasFeeCap != nil || call.GasTipCap != nil) {
- return nil, errors.New("both gasPrice and (maxFeePerGas or maxPriorityFeePerGas) specified")
- }
- if !b.blockchain.Config().IsLondon(header.Number) {
- // If there's no basefee, then it must be a non-1559 execution
- if call.GasPrice == nil {
- call.GasPrice = new(big.Int)
- }
- call.GasFeeCap, call.GasTipCap = call.GasPrice, call.GasPrice
- } else {
- // A basefee is provided, necessitating 1559-type execution
- if call.GasPrice != nil {
- // User specified the legacy gas field, convert to 1559 gas typing
- call.GasFeeCap, call.GasTipCap = call.GasPrice, call.GasPrice
- } else {
- // User specified 1559 gas fields (or none), use those
- if call.GasFeeCap == nil {
- call.GasFeeCap = new(big.Int)
- }
- if call.GasTipCap == nil {
- call.GasTipCap = new(big.Int)
- }
- // Backfill the legacy gasPrice for EVM execution, unless we're all zeroes
- call.GasPrice = new(big.Int)
- if call.GasFeeCap.BitLen() > 0 || call.GasTipCap.BitLen() > 0 {
- call.GasPrice = math.BigMin(new(big.Int).Add(call.GasTipCap, header.BaseFee), call.GasFeeCap)
- }
- }
- }
- // Ensure message is initialized properly.
- if call.Gas == 0 {
- call.Gas = 10 * header.GasLimit
- }
- if call.Value == nil {
- call.Value = new(big.Int)
- }
-
- // Set infinite balance to the fake caller account.
- from := stateDB.GetOrNewStateObject(call.From)
- from.SetBalance(math.MaxBig256)
-
- // Execute the call.
- msg := &core.Message{
- From: call.From,
- To: call.To,
- Value: call.Value,
- GasLimit: call.Gas,
- GasPrice: call.GasPrice,
- GasFeeCap: call.GasFeeCap,
- GasTipCap: call.GasTipCap,
- Data: call.Data,
- AccessList: call.AccessList,
- SkipAccountChecks: true,
- }
-
- // Create a new environment which holds all relevant information
- // about the transaction and calling mechanisms.
- txContext := core.NewEVMTxContext(msg)
- evmContext := core.NewEVMBlockContext(header, b.blockchain, nil)
- vmEnv := vm.NewEVM(evmContext, txContext, stateDB, b.config, vm.Config{NoBaseFee: true})
- gasPool := new(core.GasPool).AddGas(math.MaxUint64)
-
- return core.ApplyMessage(vmEnv, msg, gasPool)
-}
-
-// SendTransaction updates the pending block to include the given transaction.
-func (b *SimulatedBackend) SendTransaction(ctx context.Context, tx *types.Transaction) error {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- // Get the last block
- block, err := b.blockByHash(ctx, b.pendingBlock.ParentHash())
- if err != nil {
- return errors.New("could not fetch parent")
- }
- // Check transaction validity
- signer := types.MakeSigner(b.blockchain.Config(), block.Number(), block.Time())
- sender, err := types.Sender(signer, tx)
- if err != nil {
- return fmt.Errorf("invalid transaction: %v", err)
- }
- nonce := b.pendingState.GetNonce(sender)
- if tx.Nonce() != nonce {
- return fmt.Errorf("invalid transaction nonce: got %d, want %d", tx.Nonce(), nonce)
- }
- // Include tx in chain
- blocks, receipts := core.GenerateChain(b.config, block, ethash.NewFaker(), b.database, 1, func(number int, block *core.BlockGen) {
- for _, tx := range b.pendingBlock.Transactions() {
- block.AddTxWithChain(b.blockchain, tx)
- }
- block.AddTxWithChain(b.blockchain, tx)
- })
- stateDB, err := b.blockchain.State()
- if err != nil {
- return err
- }
- b.pendingBlock = blocks[0]
- b.pendingState, _ = state.New(b.pendingBlock.Root(), stateDB.Database(), nil)
- b.pendingReceipts = receipts[0]
- return nil
-}
-
-// FilterLogs executes a log filter operation, blocking during execution and
-// returning all the results in one batch.
-//
-// TODO(karalabe): Deprecate when the subscription one can return past data too.
-func (b *SimulatedBackend) FilterLogs(ctx context.Context, query ethereum.FilterQuery) ([]types.Log, error) {
- var filter *filters.Filter
- if query.BlockHash != nil {
- // Block filter requested, construct a single-shot filter
- filter = b.filterSystem.NewBlockFilter(*query.BlockHash, query.Addresses, query.Topics)
- } else {
- // Initialize unset filter boundaries to run from genesis to chain head
- from := int64(0)
- if query.FromBlock != nil {
- from = query.FromBlock.Int64()
- }
- to := int64(-1)
- if query.ToBlock != nil {
- to = query.ToBlock.Int64()
- }
- // Construct the range filter
- filter = b.filterSystem.NewRangeFilter(from, to, query.Addresses, query.Topics)
- }
- // Run the filter and return all the logs
- logs, err := filter.Logs(ctx)
- if err != nil {
- return nil, err
- }
- res := make([]types.Log, len(logs))
- for i, nLog := range logs {
- res[i] = *nLog
- }
- return res, nil
-}
-
-// SubscribeFilterLogs creates a background log filtering operation, returning a
-// subscription immediately, which can be used to stream the found events.
-func (b *SimulatedBackend) SubscribeFilterLogs(ctx context.Context, query ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) {
- // Subscribe to contract events
- sink := make(chan []*types.Log)
-
- sub, err := b.events.SubscribeLogs(query, sink)
- if err != nil {
- return nil, err
- }
- // Since we're getting logs in batches, we need to flatten them into a plain stream
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case logs := <-sink:
- for _, nlog := range logs {
- select {
- case ch <- *nlog:
- case err := <-sub.Err():
- return err
- case <-quit:
- return nil
- }
- }
- case err := <-sub.Err():
- return err
- case <-quit:
- return nil
- }
- }
- }), nil
-}
-
-// SubscribeNewHead returns an event subscription for a new header.
-func (b *SimulatedBackend) SubscribeNewHead(ctx context.Context, ch chan<- *types.Header) (ethereum.Subscription, error) {
- // subscribe to a new head
- sink := make(chan *types.Header)
- sub := b.events.SubscribeNewHeads(sink)
-
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case head := <-sink:
- select {
- case ch <- head:
- case err := <-sub.Err():
- return err
- case <-quit:
- return nil
- }
- case err := <-sub.Err():
- return err
- case <-quit:
- return nil
- }
- }
- }), nil
-}
-
-// AdjustTime adds a time shift to the simulated clock.
-// It can only be called on empty blocks.
-func (b *SimulatedBackend) AdjustTime(adjustment time.Duration) error {
- b.mu.Lock()
- defer b.mu.Unlock()
-
- if len(b.pendingBlock.Transactions()) != 0 {
- return errors.New("could not adjust time on non-empty block")
- }
- // Get the last block
- block := b.blockchain.GetBlockByHash(b.pendingBlock.ParentHash())
- if block == nil {
- return errors.New("could not find parent")
- }
-
- blocks, _ := core.GenerateChain(b.config, block, ethash.NewFaker(), b.database, 1, func(number int, block *core.BlockGen) {
- block.OffsetTime(int64(adjustment.Seconds()))
- })
- stateDB, err := b.blockchain.State()
- if err != nil {
- return err
- }
- b.pendingBlock = blocks[0]
- b.pendingState, _ = state.New(b.pendingBlock.Root(), stateDB.Database(), nil)
- return nil
-}
-
-// Blockchain returns the underlying blockchain.
-func (b *SimulatedBackend) Blockchain() *core.BlockChain {
- return b.blockchain
-}
-
-// filterBackend implements filters.Backend to support filtering for logs without
-// taking bloom-bits acceleration structures into account.
-type filterBackend struct {
- db ethdb.Database
- bc *core.BlockChain
- backend *SimulatedBackend
-}
-
-func (fb *filterBackend) ChainDb() ethdb.Database { return fb.db }
-
-func (fb *filterBackend) EventMux() *event.TypeMux { panic("not supported") }
-
-func (fb *filterBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) {
- switch number {
- case rpc.PendingBlockNumber:
- if block := fb.backend.pendingBlock; block != nil {
- return block.Header(), nil
- }
- return nil, nil
- case rpc.LatestBlockNumber:
- return fb.bc.CurrentHeader(), nil
- case rpc.FinalizedBlockNumber:
- return fb.bc.CurrentFinalBlock(), nil
- case rpc.SafeBlockNumber:
- return fb.bc.CurrentSafeBlock(), nil
- default:
- return fb.bc.GetHeaderByNumber(uint64(number.Int64())), nil
- }
-}
-
-func (fb *filterBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) {
- return fb.bc.GetHeaderByHash(hash), nil
-}
-
-func (fb *filterBackend) GetBody(ctx context.Context, hash common.Hash, number rpc.BlockNumber) (*types.Body, error) {
- if body := fb.bc.GetBody(hash); body != nil {
- return body, nil
- }
- return nil, errors.New("block body not found")
-}
-
-func (fb *filterBackend) PendingBlockAndReceipts() (*types.Block, types.Receipts) {
- return fb.backend.pendingBlock, fb.backend.pendingReceipts
-}
-
-func (fb *filterBackend) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) {
- number := rawdb.ReadHeaderNumber(fb.db, hash)
- if number == nil {
- return nil, nil
- }
- header := rawdb.ReadHeader(fb.db, hash, *number)
- if header == nil {
- return nil, nil
- }
- return rawdb.ReadReceipts(fb.db, hash, *number, header.Time, fb.bc.Config()), nil
-}
-
-func (fb *filterBackend) GetLogs(ctx context.Context, hash common.Hash, number uint64) ([][]*types.Log, error) {
- logs := rawdb.ReadLogs(fb.db, hash, number)
- return logs, nil
-}
-
-func (fb *filterBackend) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription {
- return nullSubscription()
-}
-
-func (fb *filterBackend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription {
- return fb.bc.SubscribeChainEvent(ch)
-}
-
-func (fb *filterBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription {
- return fb.bc.SubscribeRemovedLogsEvent(ch)
-}
-
-func (fb *filterBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription {
- return fb.bc.SubscribeLogsEvent(ch)
-}
-
-func (fb *filterBackend) SubscribePendingLogsEvent(ch chan<- []*types.Log) event.Subscription {
- return nullSubscription()
-}
-
-func (fb *filterBackend) BloomStatus() (uint64, uint64) { return 4096, 0 }
-
-func (fb *filterBackend) ServiceFilter(ctx context.Context, ms *bloombits.MatcherSession) {
- panic("not supported")
-}
-
-func (fb *filterBackend) ChainConfig() *params.ChainConfig {
- panic("not supported")
-}
-
-func (fb *filterBackend) CurrentHeader() *types.Header {
- panic("not supported")
-}
-
-func nullSubscription() event.Subscription {
- return event.NewSubscription(func(quit <-chan struct{}) error {
- <-quit
- return nil
- })
-}
diff --git a/accounts/abi/bind/backends/simulated_test.go b/accounts/abi/bind/backends/simulated_test.go
deleted file mode 100644
index a41d168411..0000000000
--- a/accounts/abi/bind/backends/simulated_test.go
+++ /dev/null
@@ -1,1454 +0,0 @@
-// Copyright 2019 The go-ethereum Authors
-// This file is part of the go-ethereum library.
-//
-// The go-ethereum library is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// The go-ethereum library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with the go-ethereum library. If not, see .
-
-package backends
-
-import (
- "bytes"
- "context"
- "errors"
- "math/big"
- "math/rand"
- "reflect"
- "strings"
- "testing"
- "time"
-
- "github.com/ethereum/go-ethereum"
- "github.com/ethereum/go-ethereum/accounts/abi"
- "github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core"
- "github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/crypto"
- "github.com/ethereum/go-ethereum/params"
-)
-
-func TestSimulatedBackend(t *testing.T) {
- var gasLimit uint64 = 8000029
- key, _ := crypto.GenerateKey() // nolint: gosec
- auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
- genAlloc := make(core.GenesisAlloc)
- genAlloc[auth.From] = core.GenesisAccount{Balance: big.NewInt(9223372036854775807)}
-
- sim := NewSimulatedBackend(genAlloc, gasLimit)
- defer sim.Close()
-
- // should return an error if the tx is not found
- txHash := common.HexToHash("2")
- _, isPending, err := sim.TransactionByHash(context.Background(), txHash)
-
- if isPending {
- t.Fatal("transaction should not be pending")
- }
- if err != ethereum.NotFound {
- t.Fatalf("err should be `ethereum.NotFound` but received %v", err)
- }
-
- // generate a transaction and confirm you can retrieve it
- head, _ := sim.HeaderByNumber(context.Background(), nil) // Should be child's, good enough
- gasPrice := new(big.Int).Add(head.BaseFee, big.NewInt(1))
-
- code := `6060604052600a8060106000396000f360606040526008565b00`
- var gas uint64 = 3000000
- tx := types.NewContractCreation(0, big.NewInt(0), gas, gasPrice, common.FromHex(code))
- tx, _ = types.SignTx(tx, types.HomesteadSigner{}, key)
-
- err = sim.SendTransaction(context.Background(), tx)
- if err != nil {
- t.Fatal("error sending transaction")
- }
-
- txHash = tx.Hash()
- _, isPending, err = sim.TransactionByHash(context.Background(), txHash)
- if err != nil {
- t.Fatalf("error getting transaction with hash: %v", txHash.String())
- }
- if !isPending {
- t.Fatal("transaction should have pending status")
- }
-
- sim.Commit()
- _, isPending, err = sim.TransactionByHash(context.Background(), txHash)
- if err != nil {
- t.Fatalf("error getting transaction with hash: %v", txHash.String())
- }
- if isPending {
- t.Fatal("transaction should not have pending status")
- }
-}
-
-var testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
-
-// the following is based on this contract:
-//
-// contract T {
-// event received(address sender, uint amount, bytes memo);
-// event receivedAddr(address sender);
-//
-// function receive(bytes calldata memo) external payable returns (string memory res) {
-// emit received(msg.sender, msg.value, memo);
-// emit receivedAddr(msg.sender);
-// return "hello world";
-// }
-// }
-const abiJSON = `[ { "constant": false, "inputs": [ { "name": "memo", "type": "bytes" } ], "name": "receive", "outputs": [ { "name": "res", "type": "string" } ], "payable": true, "stateMutability": "payable", "type": "function" }, { "anonymous": false, "inputs": [ { "indexed": false, "name": "sender", "type": "address" }, { "indexed": false, "name": "amount", "type": "uint256" }, { "indexed": false, "name": "memo", "type": "bytes" } ], "name": "received", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "name": "sender", "type": "address" } ], "name": "receivedAddr", "type": "event" } ]`
-const abiBin = `0x608060405234801561001057600080fd5b506102a0806100206000396000f3fe60806040526004361061003b576000357c010000000000000000000000000000000000000000000000000000000090048063a69b6ed014610040575b600080fd5b6100b76004803603602081101561005657600080fd5b810190808035906020019064010000000081111561007357600080fd5b82018360208201111561008557600080fd5b803590602001918460018302840111640100000000831117156100a757600080fd5b9091929391929390505050610132565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f75780820151818401526020810190506100dc565b50505050905090810190601f1680156101245780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60607f75fd880d39c1daf53b6547ab6cb59451fc6452d27caa90e5b6649dd8293b9eed33348585604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509550505050505060405180910390a17f46923992397eac56cf13058aced2a1871933622717e27b24eabc13bf9dd329c833604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a16040805190810160405280600b81526020017f68656c6c6f20776f726c6400000000000000000000000000000000000000000081525090509291505056fea165627a7a72305820ff0c57dad254cfeda48c9cfb47f1353a558bccb4d1bc31da1dae69315772d29e0029`
-const deployedCode = `60806040526004361061003b576000357c010000000000000000000000000000000000000000000000000000000090048063a69b6ed014610040575b600080fd5b6100b76004803603602081101561005657600080fd5b810190808035906020019064010000000081111561007357600080fd5b82018360208201111561008557600080fd5b803590602001918460018302840111640100000000831117156100a757600080fd5b9091929391929390505050610132565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f75780820151818401526020810190506100dc565b50505050905090810190601f1680156101245780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60607f75fd880d39c1daf53b6547ab6cb59451fc6452d27caa90e5b6649dd8293b9eed33348585604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509550505050505060405180910390a17f46923992397eac56cf13058aced2a1871933622717e27b24eabc13bf9dd329c833604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a16040805190810160405280600b81526020017f68656c6c6f20776f726c6400000000000000000000000000000000000000000081525090509291505056fea165627a7a72305820ff0c57dad254cfeda48c9cfb47f1353a558bccb4d1bc31da1dae69315772d29e0029`
-
-// expected return value contains "hello world"
-var expectedReturn = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
-
-func simTestBackend(testAddr common.Address) *SimulatedBackend {
- return NewSimulatedBackend(
- core.GenesisAlloc{
- testAddr: {Balance: big.NewInt(10000000000000000)},
- }, 10000000,
- )
-}
-
-func TestNewSimulatedBackend(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
- expectedBal := big.NewInt(10000000000000000)
- sim := simTestBackend(testAddr)
- defer sim.Close()
-
- if sim.config != params.AllEthashProtocolChanges {
- t.Errorf("expected sim config to equal params.AllEthashProtocolChanges, got %v", sim.config)
- }
-
- if sim.blockchain.Config() != params.AllEthashProtocolChanges {
- t.Errorf("expected sim blockchain config to equal params.AllEthashProtocolChanges, got %v", sim.config)
- }
-
- stateDB, _ := sim.blockchain.State()
- bal := stateDB.GetBalance(testAddr)
- if bal.Cmp(expectedBal) != 0 {
- t.Errorf("expected balance for test address not received. expected: %v actual: %v", expectedBal, bal)
- }
-}
-
-func TestAdjustTime(t *testing.T) {
- sim := NewSimulatedBackend(
- core.GenesisAlloc{}, 10000000,
- )
- defer sim.Close()
-
- prevTime := sim.pendingBlock.Time()
- if err := sim.AdjustTime(time.Second); err != nil {
- t.Error(err)
- }
- newTime := sim.pendingBlock.Time()
-
- if newTime-prevTime != uint64(time.Second.Seconds()) {
- t.Errorf("adjusted time not equal to a second. prev: %v, new: %v", prevTime, newTime)
- }
-}
-
-func TestNewAdjustTimeFail(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
- sim := simTestBackend(testAddr)
- defer sim.blockchain.Stop()
-
- // Create tx and send
- head, _ := sim.HeaderByNumber(context.Background(), nil) // Should be child's, good enough
- gasPrice := new(big.Int).Add(head.BaseFee, big.NewInt(1))
-
- tx := types.NewTransaction(0, testAddr, big.NewInt(1000), params.TxGas, gasPrice, nil)
- signedTx, err := types.SignTx(tx, types.HomesteadSigner{}, testKey)
- if err != nil {
- t.Errorf("could not sign tx: %v", err)
- }
- sim.SendTransaction(context.Background(), signedTx)
- // AdjustTime should fail on non-empty block
- if err := sim.AdjustTime(time.Second); err == nil {
- t.Error("Expected adjust time to error on non-empty block")
- }
- sim.Commit()
-
- prevTime := sim.pendingBlock.Time()
- if err := sim.AdjustTime(time.Minute); err != nil {
- t.Error(err)
- }
- newTime := sim.pendingBlock.Time()
- if newTime-prevTime != uint64(time.Minute.Seconds()) {
- t.Errorf("adjusted time not equal to a minute. prev: %v, new: %v", prevTime, newTime)
- }
- // Put a transaction after adjusting time
- tx2 := types.NewTransaction(1, testAddr, big.NewInt(1000), params.TxGas, gasPrice, nil)
- signedTx2, err := types.SignTx(tx2, types.HomesteadSigner{}, testKey)
- if err != nil {
- t.Errorf("could not sign tx: %v", err)
- }
- sim.SendTransaction(context.Background(), signedTx2)
- sim.Commit()
- newTime = sim.pendingBlock.Time()
- if newTime-prevTime >= uint64(time.Minute.Seconds()) {
- t.Errorf("time adjusted, but shouldn't be: prev: %v, new: %v", prevTime, newTime)
- }
-}
-
-func TestBalanceAt(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
- expectedBal := big.NewInt(10000000000000000)
- sim := simTestBackend(testAddr)
- defer sim.Close()
- bgCtx := context.Background()
-
- bal, err := sim.BalanceAt(bgCtx, testAddr, nil)
- if err != nil {
- t.Error(err)
- }
-
- if bal.Cmp(expectedBal) != 0 {
- t.Errorf("expected balance for test address not received. expected: %v actual: %v", expectedBal, bal)
- }
-}
-
-func TestBlockByHash(t *testing.T) {
- sim := NewSimulatedBackend(
- core.GenesisAlloc{}, 10000000,
- )
- defer sim.Close()
- bgCtx := context.Background()
-
- block, err := sim.BlockByNumber(bgCtx, nil)
- if err != nil {
- t.Errorf("could not get recent block: %v", err)
- }
- blockByHash, err := sim.BlockByHash(bgCtx, block.Hash())
- if err != nil {
- t.Errorf("could not get recent block: %v", err)
- }
-
- if block.Hash() != blockByHash.Hash() {
- t.Errorf("did not get expected block")
- }
-}
-
-func TestBlockByNumber(t *testing.T) {
- sim := NewSimulatedBackend(
- core.GenesisAlloc{}, 10000000,
- )
- defer sim.Close()
- bgCtx := context.Background()
-
- block, err := sim.BlockByNumber(bgCtx, nil)
- if err != nil {
- t.Errorf("could not get recent block: %v", err)
- }
- if block.NumberU64() != 0 {
- t.Errorf("did not get most recent block, instead got block number %v", block.NumberU64())
- }
-
- // create one block
- sim.Commit()
-
- block, err = sim.BlockByNumber(bgCtx, nil)
- if err != nil {
- t.Errorf("could not get recent block: %v", err)
- }
- if block.NumberU64() != 1 {
- t.Errorf("did not get most recent block, instead got block number %v", block.NumberU64())
- }
-
- blockByNumber, err := sim.BlockByNumber(bgCtx, big.NewInt(1))
- if err != nil {
- t.Errorf("could not get block by number: %v", err)
- }
- if blockByNumber.Hash() != block.Hash() {
- t.Errorf("did not get the same block with height of 1 as before")
- }
-}
-
-func TestNonceAt(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
-
- sim := simTestBackend(testAddr)
- defer sim.Close()
- bgCtx := context.Background()
-
- nonce, err := sim.NonceAt(bgCtx, testAddr, big.NewInt(0))
- if err != nil {
- t.Errorf("could not get nonce for test addr: %v", err)
- }
-
- if nonce != uint64(0) {
- t.Errorf("received incorrect nonce. expected 0, got %v", nonce)
- }
-
- // create a signed transaction to send
- head, _ := sim.HeaderByNumber(context.Background(), nil) // Should be child's, good enough
- gasPrice := new(big.Int).Add(head.BaseFee, big.NewInt(1))
-
- tx := types.NewTransaction(nonce, testAddr, big.NewInt(1000), params.TxGas, gasPrice, nil)
- signedTx, err := types.SignTx(tx, types.HomesteadSigner{}, testKey)
- if err != nil {
- t.Errorf("could not sign tx: %v", err)
- }
-
- // send tx to simulated backend
- err = sim.SendTransaction(bgCtx, signedTx)
- if err != nil {
- t.Errorf("could not add tx to pending block: %v", err)
- }
- sim.Commit()
-
- newNonce, err := sim.NonceAt(bgCtx, testAddr, big.NewInt(1))
- if err != nil {
- t.Errorf("could not get nonce for test addr: %v", err)
- }
-
- if newNonce != nonce+uint64(1) {
- t.Errorf("received incorrect nonce. expected 1, got %v", nonce)
- }
- // create some more blocks
- sim.Commit()
- // Check that we can get data for an older block/state
- newNonce, err = sim.NonceAt(bgCtx, testAddr, big.NewInt(1))
- if err != nil {
- t.Fatalf("could not get nonce for test addr: %v", err)
- }
- if newNonce != nonce+uint64(1) {
- t.Fatalf("received incorrect nonce. expected 1, got %v", nonce)
- }
-}
-
-func TestSendTransaction(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
-
- sim := simTestBackend(testAddr)
- defer sim.Close()
- bgCtx := context.Background()
-
- // create a signed transaction to send
- head, _ := sim.HeaderByNumber(context.Background(), nil) // Should be child's, good enough
- gasPrice := new(big.Int).Add(head.BaseFee, big.NewInt(1))
-
- tx := types.NewTransaction(uint64(0), testAddr, big.NewInt(1000), params.TxGas, gasPrice, nil)
- signedTx, err := types.SignTx(tx, types.HomesteadSigner{}, testKey)
- if err != nil {
- t.Errorf("could not sign tx: %v", err)
- }
-
- // send tx to simulated backend
- err = sim.SendTransaction(bgCtx, signedTx)
- if err != nil {
- t.Errorf("could not add tx to pending block: %v", err)
- }
- sim.Commit()
-
- block, err := sim.BlockByNumber(bgCtx, big.NewInt(1))
- if err != nil {
- t.Errorf("could not get block at height 1: %v", err)
- }
-
- if signedTx.Hash() != block.Transactions()[0].Hash() {
- t.Errorf("did not commit sent transaction. expected hash %v got hash %v", block.Transactions()[0].Hash(), signedTx.Hash())
- }
-}
-
-func TestTransactionByHash(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
-
- sim := NewSimulatedBackend(
- core.GenesisAlloc{
- testAddr: {Balance: big.NewInt(10000000000000000)},
- }, 10000000,
- )
- defer sim.Close()
- bgCtx := context.Background()
-
- // create a signed transaction to send
- head, _ := sim.HeaderByNumber(context.Background(), nil) // Should be child's, good enough
- gasPrice := new(big.Int).Add(head.BaseFee, big.NewInt(1))
-
- tx := types.NewTransaction(uint64(0), testAddr, big.NewInt(1000), params.TxGas, gasPrice, nil)
- signedTx, err := types.SignTx(tx, types.HomesteadSigner{}, testKey)
- if err != nil {
- t.Errorf("could not sign tx: %v", err)
- }
-
- // send tx to simulated backend
- err = sim.SendTransaction(bgCtx, signedTx)
- if err != nil {
- t.Errorf("could not add tx to pending block: %v", err)
- }
-
- // ensure tx is committed pending
- receivedTx, pending, err := sim.TransactionByHash(bgCtx, signedTx.Hash())
- if err != nil {
- t.Errorf("could not get transaction by hash %v: %v", signedTx.Hash(), err)
- }
- if !pending {
- t.Errorf("expected transaction to be in pending state")
- }
- if receivedTx.Hash() != signedTx.Hash() {
- t.Errorf("did not received committed transaction. expected hash %v got hash %v", signedTx.Hash(), receivedTx.Hash())
- }
-
- sim.Commit()
-
- // ensure tx is not and committed pending
- receivedTx, pending, err = sim.TransactionByHash(bgCtx, signedTx.Hash())
- if err != nil {
- t.Errorf("could not get transaction by hash %v: %v", signedTx.Hash(), err)
- }
- if pending {
- t.Errorf("expected transaction to not be in pending state")
- }
- if receivedTx.Hash() != signedTx.Hash() {
- t.Errorf("did not received committed transaction. expected hash %v got hash %v", signedTx.Hash(), receivedTx.Hash())
- }
-}
-
-func TestEstimateGas(t *testing.T) {
- /*
- pragma solidity ^0.6.4;
- contract GasEstimation {
- function PureRevert() public { revert(); }
- function Revert() public { revert("revert reason");}
- function OOG() public { for (uint i = 0; ; i++) {}}
- function Assert() public { assert(false);}
- function Valid() public {}
- }
- */
- const contractAbi = "[{\"inputs\":[],\"name\":\"Assert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OOG\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PureRevert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"Revert\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"Valid\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"
- const contractBin = "0x60806040523480156100115760006000fd5b50610017565b61016e806100266000396000f3fe60806040523480156100115760006000fd5b506004361061005c5760003560e01c806350f6fe3414610062578063aa8b1d301461006c578063b9b046f914610076578063d8b9839114610080578063e09fface1461008a5761005c565b60006000fd5b61006a610094565b005b6100746100ad565b005b61007e6100b5565b005b6100886100c2565b005b610092610135565b005b6000600090505b5b808060010191505061009b565b505b565b60006000fd5b565b600015156100bf57fe5b5b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f72657665727420726561736f6e0000000000000000000000000000000000000081526020015060200191505060405180910390fd5b565b5b56fea2646970667358221220345bbcbb1a5ecf22b53a78eaebf95f8ee0eceff6d10d4b9643495084d2ec934a64736f6c63430006040033"
-
- key, _ := crypto.GenerateKey()
- addr := crypto.PubkeyToAddress(key.PublicKey)
- opts, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
-
- sim := NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: big.NewInt(params.Ether)}}, 10000000)
- defer sim.Close()
-
- parsed, _ := abi.JSON(strings.NewReader(contractAbi))
- contractAddr, _, _, _ := bind.DeployContract(opts, parsed, common.FromHex(contractBin), sim)
- sim.Commit()
-
- var cases = []struct {
- name string
- message ethereum.CallMsg
- expect uint64
- expectError error
- expectData interface{}
- }{
- {"plain transfer(valid)", ethereum.CallMsg{
- From: addr,
- To: &addr,
- Gas: 0,
- GasPrice: big.NewInt(0),
- Value: big.NewInt(1),
- Data: nil,
- }, params.TxGas, nil, nil},
-
- {"plain transfer(invalid)", ethereum.CallMsg{
- From: addr,
- To: &contractAddr,
- Gas: 0,
- GasPrice: big.NewInt(0),
- Value: big.NewInt(1),
- Data: nil,
- }, 0, errors.New("execution reverted"), nil},
-
- {"Revert", ethereum.CallMsg{
- From: addr,
- To: &contractAddr,
- Gas: 0,
- GasPrice: big.NewInt(0),
- Value: nil,
- Data: common.Hex2Bytes("d8b98391"),
- }, 0, errors.New("execution reverted: revert reason"), "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000d72657665727420726561736f6e00000000000000000000000000000000000000"},
-
- {"PureRevert", ethereum.CallMsg{
- From: addr,
- To: &contractAddr,
- Gas: 0,
- GasPrice: big.NewInt(0),
- Value: nil,
- Data: common.Hex2Bytes("aa8b1d30"),
- }, 0, errors.New("execution reverted"), nil},
-
- {"OOG", ethereum.CallMsg{
- From: addr,
- To: &contractAddr,
- Gas: 100000,
- GasPrice: big.NewInt(0),
- Value: nil,
- Data: common.Hex2Bytes("50f6fe34"),
- }, 0, errors.New("gas required exceeds allowance (100000)"), nil},
-
- {"Assert", ethereum.CallMsg{
- From: addr,
- To: &contractAddr,
- Gas: 100000,
- GasPrice: big.NewInt(0),
- Value: nil,
- Data: common.Hex2Bytes("b9b046f9"),
- }, 0, errors.New("invalid opcode: INVALID"), nil},
-
- {"Valid", ethereum.CallMsg{
- From: addr,
- To: &contractAddr,
- Gas: 100000,
- GasPrice: big.NewInt(0),
- Value: nil,
- Data: common.Hex2Bytes("e09fface"),
- }, 21275, nil, nil},
- }
- for _, c := range cases {
- got, err := sim.EstimateGas(context.Background(), c.message)
- if c.expectError != nil {
- if err == nil {
- t.Fatalf("Expect error, got nil")
- }
- if c.expectError.Error() != err.Error() {
- t.Fatalf("Expect error, want %v, got %v", c.expectError, err)
- }
- if c.expectData != nil {
- if err, ok := err.(*revertError); !ok {
- t.Fatalf("Expect revert error, got %T", err)
- } else if !reflect.DeepEqual(err.ErrorData(), c.expectData) {
- t.Fatalf("Error data mismatch, want %v, got %v", c.expectData, err.ErrorData())
- }
- }
- continue
- }
- if got != c.expect {
- t.Fatalf("Gas estimation mismatch, want %d, got %d", c.expect, got)
- }
- }
-}
-
-func TestEstimateGasWithPrice(t *testing.T) {
- key, _ := crypto.GenerateKey()
- addr := crypto.PubkeyToAddress(key.PublicKey)
-
- sim := NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: big.NewInt(params.Ether*2 + 2e17)}}, 10000000)
- defer sim.Close()
-
- recipient := common.HexToAddress("deadbeef")
- var cases = []struct {
- name string
- message ethereum.CallMsg
- expect uint64
- expectError error
- }{
- {"EstimateWithoutPrice", ethereum.CallMsg{
- From: addr,
- To: &recipient,
- Gas: 0,
- GasPrice: big.NewInt(0),
- Value: big.NewInt(100000000000),
- Data: nil,
- }, 21000, nil},
-
- {"EstimateWithPrice", ethereum.CallMsg{
- From: addr,
- To: &recipient,
- Gas: 0,
- GasPrice: big.NewInt(100000000000),
- Value: big.NewInt(100000000000),
- Data: nil,
- }, 21000, nil},
-
- {"EstimateWithVeryHighPrice", ethereum.CallMsg{
- From: addr,
- To: &recipient,
- Gas: 0,
- GasPrice: big.NewInt(1e14), // gascost = 2.1ether
- Value: big.NewInt(1e17), // the remaining balance for fee is 2.1ether
- Data: nil,
- }, 21000, nil},
-
- {"EstimateWithSuperhighPrice", ethereum.CallMsg{
- From: addr,
- To: &recipient,
- Gas: 0,
- GasPrice: big.NewInt(2e14), // gascost = 4.2ether
- Value: big.NewInt(100000000000),
- Data: nil,
- }, 21000, errors.New("gas required exceeds allowance (10999)")}, // 10999=(2.2ether-1000wei)/(2e14)
-
- {"EstimateEIP1559WithHighFees", ethereum.CallMsg{
- From: addr,
- To: &addr,
- Gas: 0,
- GasFeeCap: big.NewInt(1e14), // maxgascost = 2.1ether
- GasTipCap: big.NewInt(1),
- Value: big.NewInt(1e17), // the remaining balance for fee is 2.1ether
- Data: nil,
- }, params.TxGas, nil},
-
- {"EstimateEIP1559WithSuperHighFees", ethereum.CallMsg{
- From: addr,
- To: &addr,
- Gas: 0,
- GasFeeCap: big.NewInt(1e14), // maxgascost = 2.1ether
- GasTipCap: big.NewInt(1),
- Value: big.NewInt(1e17 + 1), // the remaining balance for fee is 2.1ether
- Data: nil,
- }, params.TxGas, errors.New("gas required exceeds allowance (20999)")}, // 20999=(2.2ether-0.1ether-1wei)/(1e14)
- }
- for i, c := range cases {
- got, err := sim.EstimateGas(context.Background(), c.message)
- if c.expectError != nil {
- if err == nil {
- t.Fatalf("test %d: expect error, got nil", i)
- }
- if c.expectError.Error() != err.Error() {
- t.Fatalf("test %d: expect error, want %v, got %v", i, c.expectError, err)
- }
- continue
- }
- if c.expectError == nil && err != nil {
- t.Fatalf("test %d: didn't expect error, got %v", i, err)
- }
- if got != c.expect {
- t.Fatalf("test %d: gas estimation mismatch, want %d, got %d", i, c.expect, got)
- }
- }
-}
-
-func TestHeaderByHash(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
-
- sim := simTestBackend(testAddr)
- defer sim.Close()
- bgCtx := context.Background()
-
- header, err := sim.HeaderByNumber(bgCtx, nil)
- if err != nil {
- t.Errorf("could not get recent block: %v", err)
- }
- headerByHash, err := sim.HeaderByHash(bgCtx, header.Hash())
- if err != nil {
- t.Errorf("could not get recent block: %v", err)
- }
-
- if header.Hash() != headerByHash.Hash() {
- t.Errorf("did not get expected block")
- }
-}
-
-func TestHeaderByNumber(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
-
- sim := simTestBackend(testAddr)
- defer sim.Close()
- bgCtx := context.Background()
-
- latestBlockHeader, err := sim.HeaderByNumber(bgCtx, nil)
- if err != nil {
- t.Errorf("could not get header for tip of chain: %v", err)
- }
- if latestBlockHeader == nil {
- t.Errorf("received a nil block header")
- } else if latestBlockHeader.Number.Uint64() != uint64(0) {
- t.Errorf("expected block header number 0, instead got %v", latestBlockHeader.Number.Uint64())
- }
-
- sim.Commit()
-
- latestBlockHeader, err = sim.HeaderByNumber(bgCtx, nil)
- if err != nil {
- t.Errorf("could not get header for blockheight of 1: %v", err)
- }
-
- blockHeader, err := sim.HeaderByNumber(bgCtx, big.NewInt(1))
- if err != nil {
- t.Errorf("could not get header for blockheight of 1: %v", err)
- }
-
- if blockHeader.Hash() != latestBlockHeader.Hash() {
- t.Errorf("block header and latest block header are not the same")
- }
- if blockHeader.Number.Int64() != int64(1) {
- t.Errorf("did not get blockheader for block 1. instead got block %v", blockHeader.Number.Int64())
- }
-
- block, err := sim.BlockByNumber(bgCtx, big.NewInt(1))
- if err != nil {
- t.Errorf("could not get block for blockheight of 1: %v", err)
- }
-
- if block.Hash() != blockHeader.Hash() {
- t.Errorf("block hash and block header hash do not match. expected %v, got %v", block.Hash(), blockHeader.Hash())
- }
-}
-
-func TestTransactionCount(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
-
- sim := simTestBackend(testAddr)
- defer sim.Close()
- bgCtx := context.Background()
- currentBlock, err := sim.BlockByNumber(bgCtx, nil)
- if err != nil || currentBlock == nil {
- t.Error("could not get current block")
- }
-
- count, err := sim.TransactionCount(bgCtx, currentBlock.Hash())
- if err != nil {
- t.Error("could not get current block's transaction count")
- }
-
- if count != 0 {
- t.Errorf("expected transaction count of %v does not match actual count of %v", 0, count)
- }
- // create a signed transaction to send
- head, _ := sim.HeaderByNumber(context.Background(), nil) // Should be child's, good enough
- gasPrice := new(big.Int).Add(head.BaseFee, big.NewInt(1))
-
- tx := types.NewTransaction(uint64(0), testAddr, big.NewInt(1000), params.TxGas, gasPrice, nil)
- signedTx, err := types.SignTx(tx, types.HomesteadSigner{}, testKey)
- if err != nil {
- t.Errorf("could not sign tx: %v", err)
- }
-
- // send tx to simulated backend
- err = sim.SendTransaction(bgCtx, signedTx)
- if err != nil {
- t.Errorf("could not add tx to pending block: %v", err)
- }
-
- sim.Commit()
-
- lastBlock, err := sim.BlockByNumber(bgCtx, nil)
- if err != nil {
- t.Errorf("could not get header for tip of chain: %v", err)
- }
-
- count, err = sim.TransactionCount(bgCtx, lastBlock.Hash())
- if err != nil {
- t.Error("could not get current block's transaction count")
- }
-
- if count != 1 {
- t.Errorf("expected transaction count of %v does not match actual count of %v", 1, count)
- }
-}
-
-func TestTransactionInBlock(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
-
- sim := simTestBackend(testAddr)
- defer sim.Close()
- bgCtx := context.Background()
-
- transaction, err := sim.TransactionInBlock(bgCtx, sim.pendingBlock.Hash(), uint(0))
- if err == nil && err != errTransactionDoesNotExist {
- t.Errorf("expected a transaction does not exist error to be received but received %v", err)
- }
- if transaction != nil {
- t.Errorf("expected transaction to be nil but received %v", transaction)
- }
-
- // expect pending nonce to be 0 since account has not been used
- pendingNonce, err := sim.PendingNonceAt(bgCtx, testAddr)
- if err != nil {
- t.Errorf("did not get the pending nonce: %v", err)
- }
-
- if pendingNonce != uint64(0) {
- t.Errorf("expected pending nonce of 0 got %v", pendingNonce)
- }
- // create a signed transaction to send
- head, _ := sim.HeaderByNumber(context.Background(), nil) // Should be child's, good enough
- gasPrice := new(big.Int).Add(head.BaseFee, big.NewInt(1))
-
- tx := types.NewTransaction(uint64(0), testAddr, big.NewInt(1000), params.TxGas, gasPrice, nil)
- signedTx, err := types.SignTx(tx, types.HomesteadSigner{}, testKey)
- if err != nil {
- t.Errorf("could not sign tx: %v", err)
- }
-
- // send tx to simulated backend
- err = sim.SendTransaction(bgCtx, signedTx)
- if err != nil {
- t.Errorf("could not add tx to pending block: %v", err)
- }
-
- sim.Commit()
-
- lastBlock, err := sim.BlockByNumber(bgCtx, nil)
- if err != nil {
- t.Errorf("could not get header for tip of chain: %v", err)
- }
-
- transaction, err = sim.TransactionInBlock(bgCtx, lastBlock.Hash(), uint(1))
- if err == nil && err != errTransactionDoesNotExist {
- t.Errorf("expected a transaction does not exist error to be received but received %v", err)
- }
- if transaction != nil {
- t.Errorf("expected transaction to be nil but received %v", transaction)
- }
-
- transaction, err = sim.TransactionInBlock(bgCtx, lastBlock.Hash(), uint(0))
- if err != nil {
- t.Errorf("could not get transaction in the lastest block with hash %v: %v", lastBlock.Hash().String(), err)
- }
-
- if signedTx.Hash().String() != transaction.Hash().String() {
- t.Errorf("received transaction that did not match the sent transaction. expected hash %v, got hash %v", signedTx.Hash().String(), transaction.Hash().String())
- }
-}
-
-func TestPendingNonceAt(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
-
- sim := simTestBackend(testAddr)
- defer sim.Close()
- bgCtx := context.Background()
-
- // expect pending nonce to be 0 since account has not been used
- pendingNonce, err := sim.PendingNonceAt(bgCtx, testAddr)
- if err != nil {
- t.Errorf("did not get the pending nonce: %v", err)
- }
-
- if pendingNonce != uint64(0) {
- t.Errorf("expected pending nonce of 0 got %v", pendingNonce)
- }
-
- // create a signed transaction to send
- head, _ := sim.HeaderByNumber(context.Background(), nil) // Should be child's, good enough
- gasPrice := new(big.Int).Add(head.BaseFee, big.NewInt(1))
-
- tx := types.NewTransaction(uint64(0), testAddr, big.NewInt(1000), params.TxGas, gasPrice, nil)
- signedTx, err := types.SignTx(tx, types.HomesteadSigner{}, testKey)
- if err != nil {
- t.Errorf("could not sign tx: %v", err)
- }
-
- // send tx to simulated backend
- err = sim.SendTransaction(bgCtx, signedTx)
- if err != nil {
- t.Errorf("could not add tx to pending block: %v", err)
- }
-
- // expect pending nonce to be 1 since account has submitted one transaction
- pendingNonce, err = sim.PendingNonceAt(bgCtx, testAddr)
- if err != nil {
- t.Errorf("did not get the pending nonce: %v", err)
- }
-
- if pendingNonce != uint64(1) {
- t.Errorf("expected pending nonce of 1 got %v", pendingNonce)
- }
-
- // make a new transaction with a nonce of 1
- tx = types.NewTransaction(uint64(1), testAddr, big.NewInt(1000), params.TxGas, gasPrice, nil)
- signedTx, err = types.SignTx(tx, types.HomesteadSigner{}, testKey)
- if err != nil {
- t.Errorf("could not sign tx: %v", err)
- }
- err = sim.SendTransaction(bgCtx, signedTx)
- if err != nil {
- t.Errorf("could not send tx: %v", err)
- }
-
- // expect pending nonce to be 2 since account now has two transactions
- pendingNonce, err = sim.PendingNonceAt(bgCtx, testAddr)
- if err != nil {
- t.Errorf("did not get the pending nonce: %v", err)
- }
-
- if pendingNonce != uint64(2) {
- t.Errorf("expected pending nonce of 2 got %v", pendingNonce)
- }
-}
-
-func TestTransactionReceipt(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
-
- sim := simTestBackend(testAddr)
- defer sim.Close()
- bgCtx := context.Background()
-
- // create a signed transaction to send
- head, _ := sim.HeaderByNumber(context.Background(), nil) // Should be child's, good enough
- gasPrice := new(big.Int).Add(head.BaseFee, big.NewInt(1))
-
- tx := types.NewTransaction(uint64(0), testAddr, big.NewInt(1000), params.TxGas, gasPrice, nil)
- signedTx, err := types.SignTx(tx, types.HomesteadSigner{}, testKey)
- if err != nil {
- t.Errorf("could not sign tx: %v", err)
- }
-
- // send tx to simulated backend
- err = sim.SendTransaction(bgCtx, signedTx)
- if err != nil {
- t.Errorf("could not add tx to pending block: %v", err)
- }
- sim.Commit()
-
- receipt, err := sim.TransactionReceipt(bgCtx, signedTx.Hash())
- if err != nil {
- t.Errorf("could not get transaction receipt: %v", err)
- }
-
- if receipt.ContractAddress != testAddr && receipt.TxHash != signedTx.Hash() {
- t.Errorf("received receipt is not correct: %v", receipt)
- }
-}
-
-func TestSuggestGasPrice(t *testing.T) {
- sim := NewSimulatedBackend(
- core.GenesisAlloc{},
- 10000000,
- )
- defer sim.Close()
- bgCtx := context.Background()
- gasPrice, err := sim.SuggestGasPrice(bgCtx)
- if err != nil {
- t.Errorf("could not get gas price: %v", err)
- }
- if gasPrice.Uint64() != sim.pendingBlock.Header().BaseFee.Uint64() {
- t.Errorf("gas price was not expected value of %v. actual: %v", sim.pendingBlock.Header().BaseFee.Uint64(), gasPrice.Uint64())
- }
-}
-
-func TestPendingCodeAt(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
- sim := simTestBackend(testAddr)
- defer sim.Close()
- bgCtx := context.Background()
- code, err := sim.CodeAt(bgCtx, testAddr, nil)
- if err != nil {
- t.Errorf("could not get code at test addr: %v", err)
- }
- if len(code) != 0 {
- t.Errorf("got code for account that does not have contract code")
- }
-
- parsed, err := abi.JSON(strings.NewReader(abiJSON))
- if err != nil {
- t.Errorf("could not get code at test addr: %v", err)
- }
- auth, _ := bind.NewKeyedTransactorWithChainID(testKey, big.NewInt(1337))
- contractAddr, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(abiBin), sim)
- if err != nil {
- t.Errorf("could not deploy contract: %v tx: %v contract: %v", err, tx, contract)
- }
-
- code, err = sim.PendingCodeAt(bgCtx, contractAddr)
- if err != nil {
- t.Errorf("could not get code at test addr: %v", err)
- }
- if len(code) == 0 {
- t.Errorf("did not get code for account that has contract code")
- }
- // ensure code received equals code deployed
- if !bytes.Equal(code, common.FromHex(deployedCode)) {
- t.Errorf("code received did not match expected deployed code:\n expected %v\n actual %v", common.FromHex(deployedCode), code)
- }
-}
-
-func TestCodeAt(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
- sim := simTestBackend(testAddr)
- defer sim.Close()
- bgCtx := context.Background()
- code, err := sim.CodeAt(bgCtx, testAddr, nil)
- if err != nil {
- t.Errorf("could not get code at test addr: %v", err)
- }
- if len(code) != 0 {
- t.Errorf("got code for account that does not have contract code")
- }
-
- parsed, err := abi.JSON(strings.NewReader(abiJSON))
- if err != nil {
- t.Errorf("could not get code at test addr: %v", err)
- }
- auth, _ := bind.NewKeyedTransactorWithChainID(testKey, big.NewInt(1337))
- contractAddr, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(abiBin), sim)
- if err != nil {
- t.Errorf("could not deploy contract: %v tx: %v contract: %v", err, tx, contract)
- }
-
- sim.Commit()
- code, err = sim.CodeAt(bgCtx, contractAddr, nil)
- if err != nil {
- t.Errorf("could not get code at test addr: %v", err)
- }
- if len(code) == 0 {
- t.Errorf("did not get code for account that has contract code")
- }
- // ensure code received equals code deployed
- if !bytes.Equal(code, common.FromHex(deployedCode)) {
- t.Errorf("code received did not match expected deployed code:\n expected %v\n actual %v", common.FromHex(deployedCode), code)
- }
-}
-
-func TestCodeAtHash(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
- sim := simTestBackend(testAddr)
- defer sim.Close()
- bgCtx := context.Background()
- code, err := sim.CodeAtHash(bgCtx, testAddr, sim.Blockchain().CurrentHeader().Hash())
- if err != nil {
- t.Errorf("could not get code at test addr: %v", err)
- }
- if len(code) != 0 {
- t.Errorf("got code for account that does not have contract code")
- }
-
- parsed, err := abi.JSON(strings.NewReader(abiJSON))
- if err != nil {
- t.Errorf("could not get code at test addr: %v", err)
- }
- auth, _ := bind.NewKeyedTransactorWithChainID(testKey, big.NewInt(1337))
- contractAddr, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(abiBin), sim)
- if err != nil {
- t.Errorf("could not deploy contract: %v tx: %v contract: %v", err, tx, contract)
- }
-
- blockHash := sim.Commit()
- code, err = sim.CodeAtHash(bgCtx, contractAddr, blockHash)
- if err != nil {
- t.Errorf("could not get code at test addr: %v", err)
- }
- if len(code) == 0 {
- t.Errorf("did not get code for account that has contract code")
- }
- // ensure code received equals code deployed
- if !bytes.Equal(code, common.FromHex(deployedCode)) {
- t.Errorf("code received did not match expected deployed code:\n expected %v\n actual %v", common.FromHex(deployedCode), code)
- }
-}
-
-// When receive("X") is called with sender 0x00... and value 1, it produces this tx receipt:
-//
-// receipt{status=1 cgas=23949 bloom=00000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000040200000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 logs=[log: b6818c8064f645cd82d99b59a1a267d6d61117ef [75fd880d39c1daf53b6547ab6cb59451fc6452d27caa90e5b6649dd8293b9eed] 000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158 9ae378b6d4409eada347a5dc0c180f186cb62dc68fcc0f043425eb917335aa28 0 95d429d309bb9d753954195fe2d69bd140b4ae731b9b5b605c34323de162cf00 0]}
-func TestPendingAndCallContract(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
- sim := simTestBackend(testAddr)
- defer sim.Close()
- bgCtx := context.Background()
-
- parsed, err := abi.JSON(strings.NewReader(abiJSON))
- if err != nil {
- t.Errorf("could not get code at test addr: %v", err)
- }
- contractAuth, _ := bind.NewKeyedTransactorWithChainID(testKey, big.NewInt(1337))
- addr, _, _, err := bind.DeployContract(contractAuth, parsed, common.FromHex(abiBin), sim)
- if err != nil {
- t.Errorf("could not deploy contract: %v", err)
- }
-
- input, err := parsed.Pack("receive", []byte("X"))
- if err != nil {
- t.Errorf("could not pack receive function on contract: %v", err)
- }
-
- // make sure you can call the contract in pending state
- res, err := sim.PendingCallContract(bgCtx, ethereum.CallMsg{
- From: testAddr,
- To: &addr,
- Data: input,
- })
- if err != nil {
- t.Errorf("could not call receive method on contract: %v", err)
- }
- if len(res) == 0 {
- t.Errorf("result of contract call was empty: %v", res)
- }
-
- // while comparing against the byte array is more exact, also compare against the human readable string for readability
- if !bytes.Equal(res, expectedReturn) || !strings.Contains(string(res), "hello world") {
- t.Errorf("response from calling contract was expected to be 'hello world' instead received %v", string(res))
- }
-
- blockHash := sim.Commit()
-
- // make sure you can call the contract
- res, err = sim.CallContract(bgCtx, ethereum.CallMsg{
- From: testAddr,
- To: &addr,
- Data: input,
- }, nil)
- if err != nil {
- t.Errorf("could not call receive method on contract: %v", err)
- }
- if len(res) == 0 {
- t.Errorf("result of contract call was empty: %v", res)
- }
-
- if !bytes.Equal(res, expectedReturn) || !strings.Contains(string(res), "hello world") {
- t.Errorf("response from calling contract was expected to be 'hello world' instead received %v", string(res))
- }
-
- // make sure you can call the contract by hash
- res, err = sim.CallContractAtHash(bgCtx, ethereum.CallMsg{
- From: testAddr,
- To: &addr,
- Data: input,
- }, blockHash)
- if err != nil {
- t.Errorf("could not call receive method on contract: %v", err)
- }
- if len(res) == 0 {
- t.Errorf("result of contract call was empty: %v", res)
- }
-
- if !bytes.Equal(res, expectedReturn) || !strings.Contains(string(res), "hello world") {
- t.Errorf("response from calling contract was expected to be 'hello world' instead received %v", string(res))
- }
-}
-
-// This test is based on the following contract:
-/*
-contract Reverter {
- function revertString() public pure{
- require(false, "some error");
- }
- function revertNoString() public pure {
- require(false, "");
- }
- function revertASM() public pure {
- assembly {
- revert(0x0, 0x0)
- }
- }
- function noRevert() public pure {
- assembly {
- // Assembles something that looks like require(false, "some error") but is not reverted
- mstore(0x0, 0x08c379a000000000000000000000000000000000000000000000000000000000)
- mstore(0x4, 0x0000000000000000000000000000000000000000000000000000000000000020)
- mstore(0x24, 0x000000000000000000000000000000000000000000000000000000000000000a)
- mstore(0x44, 0x736f6d65206572726f7200000000000000000000000000000000000000000000)
- return(0x0, 0x64)
- }
- }
-}*/
-func TestCallContractRevert(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
- sim := simTestBackend(testAddr)
- defer sim.Close()
- bgCtx := context.Background()
-
- reverterABI := `[{"inputs": [],"name": "noRevert","outputs": [],"stateMutability": "pure","type": "function"},{"inputs": [],"name": "revertASM","outputs": [],"stateMutability": "pure","type": "function"},{"inputs": [],"name": "revertNoString","outputs": [],"stateMutability": "pure","type": "function"},{"inputs": [],"name": "revertString","outputs": [],"stateMutability": "pure","type": "function"}]`
- reverterBin := "608060405234801561001057600080fd5b506101d3806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80634b409e01146100515780639b340e361461005b5780639bd6103714610065578063b7246fc11461006f575b600080fd5b610059610079565b005b6100636100ca565b005b61006d6100cf565b005b610077610145565b005b60006100c8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526000815260200160200191505060405180910390fd5b565b600080fd5b6000610143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f736f6d65206572726f720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b565b7f08c379a0000000000000000000000000000000000000000000000000000000006000526020600452600a6024527f736f6d65206572726f720000000000000000000000000000000000000000000060445260646000f3fea2646970667358221220cdd8af0609ec4996b7360c7c780bad5c735740c64b1fffc3445aa12d37f07cb164736f6c63430006070033"
-
- parsed, err := abi.JSON(strings.NewReader(reverterABI))
- if err != nil {
- t.Errorf("could not get code at test addr: %v", err)
- }
- contractAuth, _ := bind.NewKeyedTransactorWithChainID(testKey, big.NewInt(1337))
- addr, _, _, err := bind.DeployContract(contractAuth, parsed, common.FromHex(reverterBin), sim)
- if err != nil {
- t.Errorf("could not deploy contract: %v", err)
- }
-
- inputs := make(map[string]interface{}, 3)
- inputs["revertASM"] = nil
- inputs["revertNoString"] = ""
- inputs["revertString"] = "some error"
-
- call := make([]func([]byte) ([]byte, error), 2)
- call[0] = func(input []byte) ([]byte, error) {
- return sim.PendingCallContract(bgCtx, ethereum.CallMsg{
- From: testAddr,
- To: &addr,
- Data: input,
- })
- }
- call[1] = func(input []byte) ([]byte, error) {
- return sim.CallContract(bgCtx, ethereum.CallMsg{
- From: testAddr,
- To: &addr,
- Data: input,
- }, nil)
- }
-
- // Run pending calls then commit
- for _, cl := range call {
- for key, val := range inputs {
- input, err := parsed.Pack(key)
- if err != nil {
- t.Errorf("could not pack %v function on contract: %v", key, err)
- }
-
- res, err := cl(input)
- if err == nil {
- t.Errorf("call to %v was not reverted", key)
- }
- if res != nil {
- t.Errorf("result from %v was not nil: %v", key, res)
- }
- if val != nil {
- rerr, ok := err.(*revertError)
- if !ok {
- t.Errorf("expect revert error")
- }
- if rerr.Error() != "execution reverted: "+val.(string) {
- t.Errorf("error was malformed: got %v want %v", rerr.Error(), val)
- }
- } else {
- // revert(0x0,0x0)
- if err.Error() != "execution reverted" {
- t.Errorf("error was malformed: got %v want %v", err, "execution reverted")
- }
- }
- }
- input, err := parsed.Pack("noRevert")
- if err != nil {
- t.Errorf("could not pack noRevert function on contract: %v", err)
- }
- res, err := cl(input)
- if err != nil {
- t.Error("call to noRevert was reverted")
- }
- if res == nil {
- t.Errorf("result from noRevert was nil")
- }
- sim.Commit()
- }
-}
-
-// TestFork check that the chain length after a reorg is correct.
-// Steps:
-// 1. Save the current block which will serve as parent for the fork.
-// 2. Mine n blocks with n ∈ [0, 20].
-// 3. Assert that the chain length is n.
-// 4. Fork by using the parent block as ancestor.
-// 5. Mine n+1 blocks which should trigger a reorg.
-// 6. Assert that the chain length is n+1.
-// Since Commit() was called 2n+1 times in total,
-// having a chain length of just n+1 means that a reorg occurred.
-func TestFork(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
- sim := simTestBackend(testAddr)
- defer sim.Close()
- // 1.
- parent := sim.blockchain.CurrentBlock()
- // 2.
- n := int(rand.Int31n(21))
- for i := 0; i < n; i++ {
- sim.Commit()
- }
- // 3.
- if sim.blockchain.CurrentBlock().Number.Uint64() != uint64(n) {
- t.Error("wrong chain length")
- }
- // 4.
- sim.Fork(context.Background(), parent.Hash())
- // 5.
- for i := 0; i < n+1; i++ {
- sim.Commit()
- }
- // 6.
- if sim.blockchain.CurrentBlock().Number.Uint64() != uint64(n+1) {
- t.Error("wrong chain length")
- }
-}
-
-/*
-Example contract to test event emission:
-
- pragma solidity >=0.7.0 <0.9.0;
- contract Callable {
- event Called();
- function Call() public { emit Called(); }
- }
-*/
-const callableAbi = "[{\"anonymous\":false,\"inputs\":[],\"name\":\"Called\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"Call\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"
-
-const callableBin = "6080604052348015600f57600080fd5b5060998061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c806334e2292114602d575b600080fd5b60336035565b005b7f81fab7a4a0aa961db47eefc81f143a5220e8c8495260dd65b1356f1d19d3c7b860405160405180910390a156fea2646970667358221220029436d24f3ac598ceca41d4d712e13ced6d70727f4cdc580667de66d2f51d8b64736f6c63430008010033"
-
-// TestForkLogsReborn check that the simulated reorgs
-// correctly remove and reborn logs.
-// Steps:
-// 1. Deploy the Callable contract.
-// 2. Set up an event subscription.
-// 3. Save the current block which will serve as parent for the fork.
-// 4. Send a transaction.
-// 5. Check that the event was included.
-// 6. Fork by using the parent block as ancestor.
-// 7. Mine two blocks to trigger a reorg.
-// 8. Check that the event was removed.
-// 9. Re-send the transaction and mine a block.
-// 10. Check that the event was reborn.
-func TestForkLogsReborn(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
- sim := simTestBackend(testAddr)
- defer sim.Close()
- // 1.
- parsed, _ := abi.JSON(strings.NewReader(callableAbi))
- auth, _ := bind.NewKeyedTransactorWithChainID(testKey, big.NewInt(1337))
- _, _, contract, err := bind.DeployContract(auth, parsed, common.FromHex(callableBin), sim)
- if err != nil {
- t.Errorf("deploying contract: %v", err)
- }
- sim.Commit()
- // 2.
- logs, sub, err := contract.WatchLogs(nil, "Called")
- if err != nil {
- t.Errorf("watching logs: %v", err)
- }
- defer sub.Unsubscribe()
- // 3.
- parent := sim.blockchain.CurrentBlock()
- // 4.
- tx, err := contract.Transact(auth, "Call")
- if err != nil {
- t.Errorf("transacting: %v", err)
- }
- sim.Commit()
- // 5.
- log := <-logs
- if log.TxHash != tx.Hash() {
- t.Error("wrong event tx hash")
- }
- if log.Removed {
- t.Error("Event should be included")
- }
- // 6.
- if err := sim.Fork(context.Background(), parent.Hash()); err != nil {
- t.Errorf("forking: %v", err)
- }
- // 7.
- sim.Commit()
- sim.Commit()
- // 8.
- log = <-logs
- if log.TxHash != tx.Hash() {
- t.Error("wrong event tx hash")
- }
- if !log.Removed {
- t.Error("Event should be removed")
- }
- // 9.
- if err := sim.SendTransaction(context.Background(), tx); err != nil {
- t.Errorf("sending transaction: %v", err)
- }
- sim.Commit()
- // 10.
- log = <-logs
- if log.TxHash != tx.Hash() {
- t.Error("wrong event tx hash")
- }
- if log.Removed {
- t.Error("Event should be included")
- }
-}
-
-// TestForkResendTx checks that re-sending a TX after a fork
-// is possible and does not cause a "nonce mismatch" panic.
-// Steps:
-// 1. Save the current block which will serve as parent for the fork.
-// 2. Send a transaction.
-// 3. Check that the TX is included in block 1.
-// 4. Fork by using the parent block as ancestor.
-// 5. Mine a block, Re-send the transaction and mine another one.
-// 6. Check that the TX is now included in block 2.
-func TestForkResendTx(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
- sim := simTestBackend(testAddr)
- defer sim.Close()
- // 1.
- parent := sim.blockchain.CurrentBlock()
- // 2.
- head, _ := sim.HeaderByNumber(context.Background(), nil) // Should be child's, good enough
- gasPrice := new(big.Int).Add(head.BaseFee, big.NewInt(1))
-
- _tx := types.NewTransaction(0, testAddr, big.NewInt(1000), params.TxGas, gasPrice, nil)
- tx, _ := types.SignTx(_tx, types.HomesteadSigner{}, testKey)
- sim.SendTransaction(context.Background(), tx)
- sim.Commit()
- // 3.
- receipt, _ := sim.TransactionReceipt(context.Background(), tx.Hash())
- if h := receipt.BlockNumber.Uint64(); h != 1 {
- t.Errorf("TX included in wrong block: %d", h)
- }
- // 4.
- if err := sim.Fork(context.Background(), parent.Hash()); err != nil {
- t.Errorf("forking: %v", err)
- }
- // 5.
- sim.Commit()
- if err := sim.SendTransaction(context.Background(), tx); err != nil {
- t.Errorf("sending transaction: %v", err)
- }
- sim.Commit()
- // 6.
- receipt, _ = sim.TransactionReceipt(context.Background(), tx.Hash())
- if h := receipt.BlockNumber.Uint64(); h != 2 {
- t.Errorf("TX included in wrong block: %d", h)
- }
-}
-
-func TestCommitReturnValue(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
- sim := simTestBackend(testAddr)
- defer sim.Close()
-
- startBlockHeight := sim.blockchain.CurrentBlock().Number.Uint64()
-
- // Test if Commit returns the correct block hash
- h1 := sim.Commit()
- if h1 != sim.blockchain.CurrentBlock().Hash() {
- t.Error("Commit did not return the hash of the last block.")
- }
-
- // Create a block in the original chain (containing a transaction to force different block hashes)
- head, _ := sim.HeaderByNumber(context.Background(), nil) // Should be child's, good enough
- gasPrice := new(big.Int).Add(head.BaseFee, big.NewInt(1))
- _tx := types.NewTransaction(0, testAddr, big.NewInt(1000), params.TxGas, gasPrice, nil)
- tx, _ := types.SignTx(_tx, types.HomesteadSigner{}, testKey)
- sim.SendTransaction(context.Background(), tx)
- h2 := sim.Commit()
-
- // Create another block in the original chain
- sim.Commit()
-
- // Fork at the first bock
- if err := sim.Fork(context.Background(), h1); err != nil {
- t.Errorf("forking: %v", err)
- }
-
- // Test if Commit returns the correct block hash after the reorg
- h2fork := sim.Commit()
- if h2 == h2fork {
- t.Error("The block in the fork and the original block are the same block!")
- }
- if sim.blockchain.GetHeader(h2fork, startBlockHeight+2) == nil {
- t.Error("Could not retrieve the just created block (side-chain)")
- }
-}
-
-// TestAdjustTimeAfterFork ensures that after a fork, AdjustTime uses the pending fork
-// block's parent rather than the canonical head's parent.
-func TestAdjustTimeAfterFork(t *testing.T) {
- testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
- sim := simTestBackend(testAddr)
- defer sim.Close()
-
- sim.Commit() // h1
- h1 := sim.blockchain.CurrentHeader().Hash()
- sim.Commit() // h2
- sim.Fork(context.Background(), h1)
- sim.AdjustTime(1 * time.Second)
- sim.Commit()
-
- head := sim.blockchain.CurrentHeader()
- if head.Number == common.Big2 && head.ParentHash != h1 {
- t.Errorf("failed to build block on fork")
- }
-}
diff --git a/accounts/abi/bind/base.go b/accounts/abi/bind/base.go
index 6da15f147c..96d284cdcc 100644
--- a/accounts/abi/bind/base.go
+++ b/accounts/abi/bind/base.go
@@ -238,7 +238,7 @@ func (c *BoundContract) Transact(opts *TransactOpts, method string, params ...in
if err != nil {
return nil, err
}
- // todo(rjl493456442) check the method is payable or not,
+ // todo(rjl493456442) check whether the method is payable or not,
// reject invalid transaction at the first place
return c.transact(opts, &c.address, input)
}
@@ -246,7 +246,7 @@ func (c *BoundContract) Transact(opts *TransactOpts, method string, params ...in
// RawTransact initiates a transaction with the given raw calldata as the input.
// It's usually used to initiate transactions for invoking **Fallback** function.
func (c *BoundContract) RawTransact(opts *TransactOpts, calldata []byte) (*types.Transaction, error) {
- // todo(rjl493456442) check the method is payable or not,
+ // todo(rjl493456442) check whether the method is payable or not,
// reject invalid transaction at the first place
return c.transact(opts, &c.address, calldata)
}
diff --git a/accounts/abi/bind/base_test.go b/accounts/abi/bind/base_test.go
index 44552ab121..f7eb7d14d3 100644
--- a/accounts/abi/bind/base_test.go
+++ b/accounts/abi/bind/base_test.go
@@ -135,6 +135,7 @@ func (mc *mockBlockHashCaller) CallContractAtHash(ctx context.Context, call ethe
}
func TestPassingBlockNumber(t *testing.T) {
+ t.Parallel()
mc := &mockPendingCaller{
mockCaller: &mockCaller{
codeAtBytes: []byte{1, 2, 3},
@@ -186,6 +187,7 @@ func TestPassingBlockNumber(t *testing.T) {
const hexData = "0x000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158"
func TestUnpackIndexedStringTyLogIntoMap(t *testing.T) {
+ t.Parallel()
hash := crypto.Keccak256Hash([]byte("testName"))
topics := []common.Hash{
crypto.Keccak256Hash([]byte("received(string,address,uint256,bytes)")),
@@ -207,6 +209,7 @@ func TestUnpackIndexedStringTyLogIntoMap(t *testing.T) {
}
func TestUnpackAnonymousLogIntoMap(t *testing.T) {
+ t.Parallel()
mockLog := newMockLog(nil, common.HexToHash("0x0"))
abiString := `[{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"received","type":"event"}]`
@@ -224,6 +227,7 @@ func TestUnpackAnonymousLogIntoMap(t *testing.T) {
}
func TestUnpackIndexedSliceTyLogIntoMap(t *testing.T) {
+ t.Parallel()
sliceBytes, err := rlp.EncodeToBytes([]string{"name1", "name2", "name3", "name4"})
if err != nil {
t.Fatal(err)
@@ -249,6 +253,7 @@ func TestUnpackIndexedSliceTyLogIntoMap(t *testing.T) {
}
func TestUnpackIndexedArrayTyLogIntoMap(t *testing.T) {
+ t.Parallel()
arrBytes, err := rlp.EncodeToBytes([2]common.Address{common.HexToAddress("0x0"), common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2")})
if err != nil {
t.Fatal(err)
@@ -274,6 +279,7 @@ func TestUnpackIndexedArrayTyLogIntoMap(t *testing.T) {
}
func TestUnpackIndexedFuncTyLogIntoMap(t *testing.T) {
+ t.Parallel()
mockAddress := common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2")
addrBytes := mockAddress.Bytes()
hash := crypto.Keccak256Hash([]byte("mockFunction(address,uint)"))
@@ -300,6 +306,7 @@ func TestUnpackIndexedFuncTyLogIntoMap(t *testing.T) {
}
func TestUnpackIndexedBytesTyLogIntoMap(t *testing.T) {
+ t.Parallel()
bytes := []byte{1, 2, 3, 4, 5}
hash := crypto.Keccak256Hash(bytes)
topics := []common.Hash{
@@ -322,6 +329,7 @@ func TestUnpackIndexedBytesTyLogIntoMap(t *testing.T) {
}
func TestTransactGasFee(t *testing.T) {
+ t.Parallel()
assert := assert.New(t)
// GasTipCap and GasFeeCap
@@ -397,6 +405,7 @@ func newMockLog(topics []common.Hash, txHash common.Hash) types.Log {
}
func TestCall(t *testing.T) {
+ t.Parallel()
var method, methodWithArg = "something", "somethingArrrrg"
tests := []struct {
name, method string
@@ -572,6 +581,7 @@ func TestCall(t *testing.T) {
// TestCrashers contains some strings which previously caused the abi codec to crash.
func TestCrashers(t *testing.T) {
+ t.Parallel()
abi.JSON(strings.NewReader(`[{"inputs":[{"type":"tuple[]","components":[{"type":"bool","name":"_1"}]}]}]`))
abi.JSON(strings.NewReader(`[{"inputs":[{"type":"tuple[]","components":[{"type":"bool","name":"&"}]}]}]`))
abi.JSON(strings.NewReader(`[{"inputs":[{"type":"tuple[]","components":[{"type":"bool","name":"----"}]}]}]`))
diff --git a/accounts/abi/bind/bind.go b/accounts/abi/bind/bind.go
index 8a54a0e6ef..e902345f09 100644
--- a/accounts/abi/bind/bind.go
+++ b/accounts/abi/bind/bind.go
@@ -79,7 +79,7 @@ func isKeyWord(arg string) bool {
// Bind generates a Go wrapper around a contract ABI. This wrapper isn't meant
// to be used as is in client code, but rather as an intermediate struct which
-// enforces compile time type safety and naming convention opposed to having to
+// enforces compile time type safety and naming convention as opposed to having to
// manually maintain hard coded strings that break on runtime.
func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]string, pkg string, lang Lang, libs map[string]string, aliases map[string]string) (string, error) {
var (
@@ -363,7 +363,7 @@ func bindTopicTypeGo(kind abi.Type, structs map[string]*tmplStruct) string {
// parameters that are not value types i.e. arrays and structs are not
// stored directly but instead a keccak256-hash of an encoding is stored.
//
- // We only convert stringS and bytes to hash, still need to deal with
+ // We only convert strings and bytes to hash, still need to deal with
// array(both fixed-size and dynamic-size) and struct.
if bound == "string" || bound == "[]byte" {
bound = "common.Hash"
diff --git a/accounts/abi/bind/bind_test.go b/accounts/abi/bind/bind_test.go
index 1069f3d396..a6ffe7609d 100644
--- a/accounts/abi/bind/bind_test.go
+++ b/accounts/abi/bind/bind_test.go
@@ -305,6 +305,7 @@ var bindTests = []struct {
if err != nil {
t.Fatalf("Failed to deploy interactor contract: %v", err)
}
+ sim.Commit()
if _, err := interactor.Transact(auth, "Transact string"); err != nil {
t.Fatalf("Failed to transact with interactor contract: %v", err)
}
@@ -512,6 +513,7 @@ var bindTests = []struct {
if err != nil {
t.Fatalf("Failed to deploy defaulter contract: %v", err)
}
+ sim.Commit()
if _, err := (&DefaulterRaw{defaulter}).Transfer(auth); err != nil {
t.Fatalf("Failed to invoke default method: %v", err)
}
@@ -1677,7 +1679,7 @@ var bindTests = []struct {
}
sim.Commit()
- // This test the existence of the free retreiver call for view and pure functions
+ // This test the existence of the free retriever call for view and pure functions
if num, err := pav.PureFunc(nil); err != nil {
t.Fatalf("Failed to call anonymous field retriever: %v", err)
} else if num.Cmp(big.NewInt(42)) != 0 {
@@ -1874,6 +1876,7 @@ var bindTests = []struct {
[]string{"0x6080604052348015600f57600080fd5b5060998061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063726c638214602d575b600080fd5b60336035565b005b60405163024876cd60e61b815260016004820152600260248201526003604482015260640160405180910390fdfea264697066735822122093f786a1bc60216540cd999fbb4a6109e0fef20abcff6e9107fb2817ca968f3c64736f6c63430008070033"},
[]string{`[{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"MyError","type":"error"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"MyError1","type":"error"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"MyError2","type":"error"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"},{"internalType":"uint256","name":"c","type":"uint256"}],"name":"MyError3","type":"error"},{"inputs":[],"name":"Error","outputs":[],"stateMutability":"pure","type":"function"}]`},
`
+ "context"
"math/big"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
@@ -1895,7 +1898,7 @@ var bindTests = []struct {
t.Fatal(err)
}
sim.Commit()
- _, err = bind.WaitDeployed(nil, sim, tx)
+ _, err = bind.WaitDeployed(context.Background(), sim, tx)
if err != nil {
t.Error(err)
}
@@ -1926,6 +1929,7 @@ var bindTests = []struct {
bytecode: []string{`0x608060405234801561001057600080fd5b506040516101c43803806101c48339818101604052810190610032919061014a565b50610177565b6000604051905090565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6100958261004c565b810181811067ffffffffffffffff821117156100b4576100b361005d565b5b80604052505050565b60006100c7610038565b90506100d3828261008c565b919050565b6000819050919050565b6100eb816100d8565b81146100f657600080fd5b50565b600081519050610108816100e2565b92915050565b60006020828403121561012457610123610047565b5b61012e60206100bd565b9050600061013e848285016100f9565b60008301525092915050565b6000602082840312156101605761015f610042565b5b600061016e8482850161010e565b91505092915050565b603f806101856000396000f3fe6080604052600080fdfea2646970667358221220cdffa667affecefac5561f65f4a4ba914204a8d4eb859d8cd426fb306e5c12a364736f6c634300080a0033`},
abi: []string{`[{"inputs":[{"components":[{"internalType":"uint256","name":"field","type":"uint256"}],"internalType":"struct ConstructorWithStructParam.StructType","name":"st","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"}]`},
imports: `
+ "context"
"math/big"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
@@ -1948,7 +1952,7 @@ var bindTests = []struct {
}
sim.Commit()
- if _, err = bind.WaitDeployed(nil, sim, tx); err != nil {
+ if _, err = bind.WaitDeployed(context.Background(), sim, tx); err != nil {
t.Logf("Deployment tx: %+v", tx)
t.Errorf("bind.WaitDeployed(nil, %T, ) got err %v; want nil err", sim, err)
}
@@ -1974,6 +1978,7 @@ var bindTests = []struct {
bytecode: []string{"0x608060405234801561001057600080fd5b5061042b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063c2bb515f1461003b578063cce7b04814610059575b600080fd5b610043610075565b60405161005091906101af565b60405180910390f35b610073600480360381019061006e91906103ac565b6100b5565b005b61007d6100b8565b604051806040016040528060405180602001604052806000815250815260200160405180602001604052806000815250815250905090565b50565b604051806040016040528060608152602001606081525090565b600081519050919050565b600082825260208201905092915050565b60005b8381101561010c5780820151818401526020810190506100f1565b8381111561011b576000848401525b50505050565b6000601f19601f8301169050919050565b600061013d826100d2565b61014781856100dd565b93506101578185602086016100ee565b61016081610121565b840191505092915050565b600060408301600083015184820360008601526101888282610132565b915050602083015184820360208601526101a28282610132565b9150508091505092915050565b600060208201905081810360008301526101c9818461016b565b905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61022282610121565b810181811067ffffffffffffffff82111715610241576102406101ea565b5b80604052505050565b60006102546101d1565b90506102608282610219565b919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff82111561028f5761028e6101ea565b5b61029882610121565b9050602081019050919050565b82818337600083830152505050565b60006102c76102c284610274565b61024a565b9050828152602081018484840111156102e3576102e261026f565b5b6102ee8482856102a5565b509392505050565b600082601f83011261030b5761030a61026a565b5b813561031b8482602086016102b4565b91505092915050565b60006040828403121561033a576103396101e5565b5b610344604061024a565b9050600082013567ffffffffffffffff81111561036457610363610265565b5b610370848285016102f6565b600083015250602082013567ffffffffffffffff81111561039457610393610265565b5b6103a0848285016102f6565b60208301525092915050565b6000602082840312156103c2576103c16101db565b5b600082013567ffffffffffffffff8111156103e0576103df6101e0565b5b6103ec84828501610324565b9150509291505056fea264697066735822122033bca1606af9b6aeba1673f98c52003cec19338539fb44b86690ce82c51483b564736f6c634300080e0033"},
abi: []string{`[ { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "int256", "name": "msg", "type": "int256" }, { "indexed": false, "internalType": "int256", "name": "_msg", "type": "int256" } ], "name": "log", "type": "event" }, { "inputs": [ { "components": [ { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "bytes", "name": "_data", "type": "bytes" } ], "internalType": "struct oracle.request", "name": "req", "type": "tuple" } ], "name": "addRequest", "outputs": [], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "getRequest", "outputs": [ { "components": [ { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "bytes", "name": "_data", "type": "bytes" } ], "internalType": "struct oracle.request", "name": "", "type": "tuple" } ], "stateMutability": "pure", "type": "function" } ]`},
imports: `
+ "context"
"math/big"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
@@ -1996,7 +2001,7 @@ var bindTests = []struct {
}
sim.Commit()
- if _, err = bind.WaitDeployed(nil, sim, tx); err != nil {
+ if _, err = bind.WaitDeployed(context.Background(), sim, tx); err != nil {
t.Logf("Deployment tx: %+v", tx)
t.Errorf("bind.WaitDeployed(nil, %T, ) got err %v; want nil err", sim, err)
}
@@ -2014,6 +2019,7 @@ var bindTests = []struct {
bytecode: []string{"0x608060405234801561001057600080fd5b5060dc8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063527a119f14602d575b600080fd5b60436004803603810190603f9190605b565b6045565b005b50565b6000813590506055816092565b92915050565b600060208284031215606e57606d608d565b5b6000607a848285016048565b91505092915050565b6000819050919050565b600080fd5b6099816083565b811460a357600080fd5b5056fea2646970667358221220d4f4525e2615516394055d369fb17df41c359e5e962734f27fd683ea81fd9db164736f6c63430008070033"},
abi: []string{`[{"inputs":[{"internalType":"uint256","name":"range","type":"uint256"}],"name":"functionWithKeywordParameter","outputs":[],"stateMutability":"pure","type":"function"}]`},
imports: `
+ "context"
"math/big"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
@@ -2034,7 +2040,7 @@ var bindTests = []struct {
}
sim.Commit()
- if _, err = bind.WaitDeployed(nil, sim, tx); err != nil {
+ if _, err = bind.WaitDeployed(context.Background(), sim, tx); err != nil {
t.Errorf("error deploying the contract: %v", err)
}
`,
@@ -2067,6 +2073,7 @@ var bindTests = []struct {
// Tests that packages generated by the binder can be successfully compiled and
// the requested tester run against it.
func TestGolangBindings(t *testing.T) {
+ t.Parallel()
// Skip the test if no Go command can be found
gocmd := runtime.GOROOT() + "/bin/go"
if !common.FileExist(gocmd) {
diff --git a/accounts/abi/bind/util_test.go b/accounts/abi/bind/util_test.go
index b34c5bc226..9fd919a295 100644
--- a/accounts/abi/bind/util_test.go
+++ b/accounts/abi/bind/util_test.go
@@ -24,11 +24,12 @@ import (
"time"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/ethclient/simulated"
+ "github.com/ethereum/go-ethereum/params"
)
var testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
@@ -53,21 +54,21 @@ var waitDeployedTests = map[string]struct {
}
func TestWaitDeployed(t *testing.T) {
+ t.Parallel()
for name, test := range waitDeployedTests {
- backend := backends.NewSimulatedBackend(
+ backend := simulated.NewBackend(
core.GenesisAlloc{
crypto.PubkeyToAddress(testKey.PublicKey): {Balance: big.NewInt(10000000000000000)},
},
- 10000000,
)
defer backend.Close()
// Create the transaction
- head, _ := backend.HeaderByNumber(context.Background(), nil) // Should be child's, good enough
+ head, _ := backend.Client().HeaderByNumber(context.Background(), nil) // Should be child's, good enough
gasPrice := new(big.Int).Add(head.BaseFee, big.NewInt(1))
tx := types.NewContractCreation(0, big.NewInt(0), test.gas, gasPrice, common.FromHex(test.code))
- tx, _ = types.SignTx(tx, types.HomesteadSigner{}, testKey)
+ tx, _ = types.SignTx(tx, types.LatestSignerForChainID(big.NewInt(1337)), testKey)
// Wait for it to get mined in the background.
var (
@@ -77,12 +78,12 @@ func TestWaitDeployed(t *testing.T) {
ctx = context.Background()
)
go func() {
- address, err = bind.WaitDeployed(ctx, backend, tx)
+ address, err = bind.WaitDeployed(ctx, backend.Client(), tx)
close(mined)
}()
// Send and mine the transaction.
- backend.SendTransaction(ctx, tx)
+ backend.Client().SendTransaction(ctx, tx)
backend.Commit()
select {
@@ -100,41 +101,40 @@ func TestWaitDeployed(t *testing.T) {
}
func TestWaitDeployedCornerCases(t *testing.T) {
- backend := backends.NewSimulatedBackend(
+ backend := simulated.NewBackend(
core.GenesisAlloc{
crypto.PubkeyToAddress(testKey.PublicKey): {Balance: big.NewInt(10000000000000000)},
},
- 10000000,
)
defer backend.Close()
- head, _ := backend.HeaderByNumber(context.Background(), nil) // Should be child's, good enough
+ head, _ := backend.Client().HeaderByNumber(context.Background(), nil) // Should be child's, good enough
gasPrice := new(big.Int).Add(head.BaseFee, big.NewInt(1))
// Create a transaction to an account.
code := "6060604052600a8060106000396000f360606040526008565b00"
tx := types.NewTransaction(0, common.HexToAddress("0x01"), big.NewInt(0), 3000000, gasPrice, common.FromHex(code))
- tx, _ = types.SignTx(tx, types.HomesteadSigner{}, testKey)
+ tx, _ = types.SignTx(tx, types.LatestSigner(params.AllDevChainProtocolChanges), testKey)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- backend.SendTransaction(ctx, tx)
+ backend.Client().SendTransaction(ctx, tx)
backend.Commit()
- notContentCreation := errors.New("tx is not contract creation")
- if _, err := bind.WaitDeployed(ctx, backend, tx); err.Error() != notContentCreation.Error() {
- t.Errorf("error mismatch: want %q, got %q, ", notContentCreation, err)
+ notContractCreation := errors.New("tx is not contract creation")
+ if _, err := bind.WaitDeployed(ctx, backend.Client(), tx); err.Error() != notContractCreation.Error() {
+ t.Errorf("error mismatch: want %q, got %q, ", notContractCreation, err)
}
// Create a transaction that is not mined.
tx = types.NewContractCreation(1, big.NewInt(0), 3000000, gasPrice, common.FromHex(code))
- tx, _ = types.SignTx(tx, types.HomesteadSigner{}, testKey)
+ tx, _ = types.SignTx(tx, types.LatestSigner(params.AllDevChainProtocolChanges), testKey)
go func() {
contextCanceled := errors.New("context canceled")
- if _, err := bind.WaitDeployed(ctx, backend, tx); err.Error() != contextCanceled.Error() {
+ if _, err := bind.WaitDeployed(ctx, backend.Client(), tx); err.Error() != contextCanceled.Error() {
t.Errorf("error mismatch: want %q, got %q, ", contextCanceled, err)
}
}()
- backend.SendTransaction(ctx, tx)
+ backend.Client().SendTransaction(ctx, tx)
cancel()
}
diff --git a/accounts/abi/event_test.go b/accounts/abi/event_test.go
index 8f73419496..fffe28ea63 100644
--- a/accounts/abi/event_test.go
+++ b/accounts/abi/event_test.go
@@ -81,6 +81,7 @@ var pledgeData1 = "00000000000000000000000000ce0d46d924cc8437c806721496599fc3ffa
var mixedCaseData1 = "00000000000000000000000000000000000000000000000000000000000f42400000000000000000000000000000000000000000000000000000020489e8000000000000000000000000000000000000000000000000000000000000000f4241"
func TestEventId(t *testing.T) {
+ t.Parallel()
var table = []struct {
definition string
expectations map[string]common.Hash
@@ -112,6 +113,7 @@ func TestEventId(t *testing.T) {
}
func TestEventString(t *testing.T) {
+ t.Parallel()
var table = []struct {
definition string
expectations map[string]string
@@ -146,6 +148,7 @@ func TestEventString(t *testing.T) {
// TestEventMultiValueWithArrayUnpack verifies that array fields will be counted after parsing array.
func TestEventMultiValueWithArrayUnpack(t *testing.T) {
+ t.Parallel()
definition := `[{"name": "test", "type": "event", "inputs": [{"indexed": false, "name":"value1", "type":"uint8[2]"},{"indexed": false, "name":"value2", "type":"uint8"}]}]`
abi, err := JSON(strings.NewReader(definition))
require.NoError(t, err)
@@ -161,6 +164,7 @@ func TestEventMultiValueWithArrayUnpack(t *testing.T) {
}
func TestEventTupleUnpack(t *testing.T) {
+ t.Parallel()
type EventTransfer struct {
Value *big.Int
}
@@ -351,6 +355,7 @@ func unpackTestEventData(dest interface{}, hexData string, jsonEvent []byte, ass
// TestEventUnpackIndexed verifies that indexed field will be skipped by event decoder.
func TestEventUnpackIndexed(t *testing.T) {
+ t.Parallel()
definition := `[{"name": "test", "type": "event", "inputs": [{"indexed": true, "name":"value1", "type":"uint8"},{"indexed": false, "name":"value2", "type":"uint8"}]}]`
type testStruct struct {
Value1 uint8 // indexed
@@ -368,6 +373,7 @@ func TestEventUnpackIndexed(t *testing.T) {
// TestEventIndexedWithArrayUnpack verifies that decoder will not overflow when static array is indexed input.
func TestEventIndexedWithArrayUnpack(t *testing.T) {
+ t.Parallel()
definition := `[{"name": "test", "type": "event", "inputs": [{"indexed": true, "name":"value1", "type":"uint8[2]"},{"indexed": false, "name":"value2", "type":"string"}]}]`
type testStruct struct {
Value1 [2]uint8 // indexed
diff --git a/accounts/abi/method_test.go b/accounts/abi/method_test.go
index 9230e307aa..6322173920 100644
--- a/accounts/abi/method_test.go
+++ b/accounts/abi/method_test.go
@@ -35,6 +35,7 @@ const methoddata = `
]`
func TestMethodString(t *testing.T) {
+ t.Parallel()
var table = []struct {
method string
expectation string
@@ -99,6 +100,7 @@ func TestMethodString(t *testing.T) {
}
func TestMethodSig(t *testing.T) {
+ t.Parallel()
var cases = []struct {
method string
expect string
diff --git a/accounts/abi/pack_test.go b/accounts/abi/pack_test.go
index 5c7cb1cc1a..00bdae469e 100644
--- a/accounts/abi/pack_test.go
+++ b/accounts/abi/pack_test.go
@@ -32,8 +32,11 @@ import (
// TestPack tests the general pack/unpack tests in packing_test.go
func TestPack(t *testing.T) {
+ t.Parallel()
for i, test := range packUnpackTests {
+ i, test := i, test
t.Run(strconv.Itoa(i), func(t *testing.T) {
+ t.Parallel()
encb, err := hex.DecodeString(test.packed)
if err != nil {
t.Fatalf("invalid hex %s: %v", test.packed, err)
@@ -57,6 +60,7 @@ func TestPack(t *testing.T) {
}
func TestMethodPack(t *testing.T) {
+ t.Parallel()
abi, err := JSON(strings.NewReader(jsondata))
if err != nil {
t.Fatal(err)
@@ -177,6 +181,7 @@ func TestMethodPack(t *testing.T) {
}
func TestPackNumber(t *testing.T) {
+ t.Parallel()
tests := []struct {
value reflect.Value
packed []byte
diff --git a/accounts/abi/reflect_test.go b/accounts/abi/reflect_test.go
index 76ef1ad2aa..6c7ae57087 100644
--- a/accounts/abi/reflect_test.go
+++ b/accounts/abi/reflect_test.go
@@ -170,8 +170,11 @@ var reflectTests = []reflectTest{
}
func TestReflectNameToStruct(t *testing.T) {
+ t.Parallel()
for _, test := range reflectTests {
+ test := test
t.Run(test.name, func(t *testing.T) {
+ t.Parallel()
m, err := mapArgNamesToStructFields(test.args, reflect.ValueOf(test.struc))
if len(test.err) > 0 {
if err == nil || err.Error() != test.err {
@@ -192,6 +195,7 @@ func TestReflectNameToStruct(t *testing.T) {
}
func TestConvertType(t *testing.T) {
+ t.Parallel()
// Test Basic Struct
type T struct {
X *big.Int
diff --git a/accounts/abi/selector_parser_test.go b/accounts/abi/selector_parser_test.go
index f6f134492b..6cb0ae0e70 100644
--- a/accounts/abi/selector_parser_test.go
+++ b/accounts/abi/selector_parser_test.go
@@ -24,6 +24,7 @@ import (
)
func TestParseSelector(t *testing.T) {
+ t.Parallel()
mkType := func(types ...interface{}) []ArgumentMarshaling {
var result []ArgumentMarshaling
for i, typeOrComponents := range types {
diff --git a/accounts/abi/topics.go b/accounts/abi/topics.go
index 360df7d5e8..7ce9b7273c 100644
--- a/accounts/abi/topics.go
+++ b/accounts/abi/topics.go
@@ -24,6 +24,7 @@ import (
"reflect"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/common/math"
"github.com/ethereum/go-ethereum/crypto"
)
@@ -41,8 +42,7 @@ func MakeTopics(query ...[]interface{}) ([][]common.Hash, error) {
case common.Address:
copy(topic[common.HashLength-common.AddressLength:], rule[:])
case *big.Int:
- blob := rule.Bytes()
- copy(topic[common.HashLength-len(blob):], blob)
+ copy(topic[:], math.U256Bytes(rule))
case bool:
if rule {
topic[common.HashLength-1] = 1
@@ -75,7 +75,7 @@ func MakeTopics(query ...[]interface{}) ([][]common.Hash, error) {
copy(topic[:], hash[:])
default:
- // todo(rjl493456442) according solidity documentation, indexed event
+ // todo(rjl493456442) according to solidity documentation, indexed event
// parameters that are not value types i.e. arrays and structs are not
// stored directly but instead a keccak256-hash of an encoding is stored.
//
diff --git a/accounts/abi/topics_test.go b/accounts/abi/topics_test.go
index 30cf21d0b8..9e1efd3821 100644
--- a/accounts/abi/topics_test.go
+++ b/accounts/abi/topics_test.go
@@ -17,6 +17,7 @@
package abi
import (
+ "math"
"math/big"
"reflect"
"testing"
@@ -26,6 +27,7 @@ import (
)
func TestMakeTopics(t *testing.T) {
+ t.Parallel()
type args struct {
query [][]interface{}
}
@@ -54,9 +56,27 @@ func TestMakeTopics(t *testing.T) {
false,
},
{
- "support *big.Int types in topics",
- args{[][]interface{}{{big.NewInt(1).Lsh(big.NewInt(2), 254)}}},
- [][]common.Hash{{common.Hash{128}}},
+ "support positive *big.Int types in topics",
+ args{[][]interface{}{
+ {big.NewInt(1)},
+ {big.NewInt(1).Lsh(big.NewInt(2), 254)},
+ }},
+ [][]common.Hash{
+ {common.HexToHash("0000000000000000000000000000000000000000000000000000000000000001")},
+ {common.Hash{128}},
+ },
+ false,
+ },
+ {
+ "support negative *big.Int types in topics",
+ args{[][]interface{}{
+ {big.NewInt(-1)},
+ {big.NewInt(math.MinInt64)},
+ }},
+ [][]common.Hash{
+ {common.MaxHash},
+ {common.HexToHash("ffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000")},
+ },
false,
},
{
@@ -117,7 +137,9 @@ func TestMakeTopics(t *testing.T) {
},
}
for _, tt := range tests {
+ tt := tt
t.Run(tt.name, func(t *testing.T) {
+ t.Parallel()
got, err := MakeTopics(tt.args.query...)
if (err != nil) != tt.wantErr {
t.Errorf("makeTopics() error = %v, wantErr %v", err, tt.wantErr)
@@ -347,10 +369,13 @@ func setupTopicsTests() []topicTest {
}
func TestParseTopics(t *testing.T) {
+ t.Parallel()
tests := setupTopicsTests()
for _, tt := range tests {
+ tt := tt
t.Run(tt.name, func(t *testing.T) {
+ t.Parallel()
createObj := tt.args.createObj()
if err := ParseTopics(createObj, tt.args.fields, tt.args.topics); (err != nil) != tt.wantErr {
t.Errorf("parseTopics() error = %v, wantErr %v", err, tt.wantErr)
@@ -364,10 +389,13 @@ func TestParseTopics(t *testing.T) {
}
func TestParseTopicsIntoMap(t *testing.T) {
+ t.Parallel()
tests := setupTopicsTests()
for _, tt := range tests {
+ tt := tt
t.Run(tt.name, func(t *testing.T) {
+ t.Parallel()
outMap := make(map[string]interface{})
if err := ParseTopicsIntoMap(outMap, tt.args.fields, tt.args.topics); (err != nil) != tt.wantErr {
t.Errorf("parseTopicsIntoMap() error = %v, wantErr %v", err, tt.wantErr)
diff --git a/accounts/abi/type_test.go b/accounts/abi/type_test.go
index a72531ba27..ae69872ad8 100644
--- a/accounts/abi/type_test.go
+++ b/accounts/abi/type_test.go
@@ -31,6 +31,7 @@ type typeWithoutStringer Type
// Tests that all allowed types get recognized by the type parser.
func TestTypeRegexp(t *testing.T) {
+ t.Parallel()
tests := []struct {
blob string
components []ArgumentMarshaling
@@ -117,6 +118,7 @@ func TestTypeRegexp(t *testing.T) {
}
func TestTypeCheck(t *testing.T) {
+ t.Parallel()
for i, test := range []struct {
typ string
components []ArgumentMarshaling
@@ -308,6 +310,7 @@ func TestTypeCheck(t *testing.T) {
}
func TestInternalType(t *testing.T) {
+ t.Parallel()
components := []ArgumentMarshaling{{Name: "a", Type: "int64"}}
internalType := "struct a.b[]"
kind := Type{
@@ -332,6 +335,7 @@ func TestInternalType(t *testing.T) {
}
func TestGetTypeSize(t *testing.T) {
+ t.Parallel()
var testCases = []struct {
typ string
components []ArgumentMarshaling
@@ -368,6 +372,7 @@ func TestGetTypeSize(t *testing.T) {
}
func TestNewFixedBytesOver32(t *testing.T) {
+ t.Parallel()
_, err := NewType("bytes4096", "", nil)
if err == nil {
t.Errorf("fixed bytes with size over 32 is not spec'd")
diff --git a/accounts/abi/unpack_test.go b/accounts/abi/unpack_test.go
index a7ee1d9202..29891ec0a4 100644
--- a/accounts/abi/unpack_test.go
+++ b/accounts/abi/unpack_test.go
@@ -33,6 +33,7 @@ import (
// TestUnpack tests the general pack/unpack tests in packing_test.go
func TestUnpack(t *testing.T) {
+ t.Parallel()
for i, test := range packUnpackTests {
t.Run(strconv.Itoa(i)+" "+test.def, func(t *testing.T) {
//Unpack
@@ -224,6 +225,7 @@ var unpackTests = []unpackTest{
// TestLocalUnpackTests runs test specially designed only for unpacking.
// All test cases that can be used to test packing and unpacking should move to packing_test.go
func TestLocalUnpackTests(t *testing.T) {
+ t.Parallel()
for i, test := range unpackTests {
t.Run(strconv.Itoa(i), func(t *testing.T) {
//Unpack
@@ -251,6 +253,7 @@ func TestLocalUnpackTests(t *testing.T) {
}
func TestUnpackIntoInterfaceSetDynamicArrayOutput(t *testing.T) {
+ t.Parallel()
abi, err := JSON(strings.NewReader(`[{"constant":true,"inputs":[],"name":"testDynamicFixedBytes15","outputs":[{"name":"","type":"bytes15[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"testDynamicFixedBytes32","outputs":[{"name":"","type":"bytes32[]"}],"payable":false,"stateMutability":"view","type":"function"}]`))
if err != nil {
t.Fatal(err)
@@ -321,6 +324,7 @@ func methodMultiReturn(require *require.Assertions) (ABI, []byte, methodMultiOut
}
func TestMethodMultiReturn(t *testing.T) {
+ t.Parallel()
type reversed struct {
String string
Int *big.Int
@@ -400,6 +404,7 @@ func TestMethodMultiReturn(t *testing.T) {
}
func TestMultiReturnWithArray(t *testing.T) {
+ t.Parallel()
const definition = `[{"name" : "multi", "type": "function", "outputs": [{"type": "uint64[3]"}, {"type": "uint64"}]}]`
abi, err := JSON(strings.NewReader(definition))
if err != nil {
@@ -423,6 +428,7 @@ func TestMultiReturnWithArray(t *testing.T) {
}
func TestMultiReturnWithStringArray(t *testing.T) {
+ t.Parallel()
const definition = `[{"name" : "multi", "type": "function", "outputs": [{"name": "","type": "uint256[3]"},{"name": "","type": "address"},{"name": "","type": "string[2]"},{"name": "","type": "bool"}]}]`
abi, err := JSON(strings.NewReader(definition))
if err != nil {
@@ -453,6 +459,7 @@ func TestMultiReturnWithStringArray(t *testing.T) {
}
func TestMultiReturnWithStringSlice(t *testing.T) {
+ t.Parallel()
const definition = `[{"name" : "multi", "type": "function", "outputs": [{"name": "","type": "string[]"},{"name": "","type": "uint256[]"}]}]`
abi, err := JSON(strings.NewReader(definition))
if err != nil {
@@ -485,6 +492,7 @@ func TestMultiReturnWithStringSlice(t *testing.T) {
}
func TestMultiReturnWithDeeplyNestedArray(t *testing.T) {
+ t.Parallel()
// Similar to TestMultiReturnWithArray, but with a special case in mind:
// values of nested static arrays count towards the size as well, and any element following
// after such nested array argument should be read with the correct offset,
@@ -525,6 +533,7 @@ func TestMultiReturnWithDeeplyNestedArray(t *testing.T) {
}
func TestUnmarshal(t *testing.T) {
+ t.Parallel()
const definition = `[
{ "name" : "int", "type": "function", "outputs": [ { "type": "uint256" } ] },
{ "name" : "bool", "type": "function", "outputs": [ { "type": "bool" } ] },
@@ -774,6 +783,7 @@ func TestUnmarshal(t *testing.T) {
}
func TestUnpackTuple(t *testing.T) {
+ t.Parallel()
const simpleTuple = `[{"name":"tuple","type":"function","outputs":[{"type":"tuple","name":"ret","components":[{"type":"int256","name":"a"},{"type":"int256","name":"b"}]}]}]`
abi, err := JSON(strings.NewReader(simpleTuple))
if err != nil {
@@ -876,6 +886,7 @@ func TestUnpackTuple(t *testing.T) {
}
func TestOOMMaliciousInput(t *testing.T) {
+ t.Parallel()
oomTests := []unpackTest{
{
def: `[{"type": "uint8[]"}]`,
@@ -946,6 +957,7 @@ func TestOOMMaliciousInput(t *testing.T) {
}
func TestPackAndUnpackIncompatibleNumber(t *testing.T) {
+ t.Parallel()
var encodeABI Arguments
uint256Ty, err := NewType("uint256", "", nil)
if err != nil {
diff --git a/accounts/accounts_test.go b/accounts/accounts_test.go
index e8274f9f04..2c4138aa78 100644
--- a/accounts/accounts_test.go
+++ b/accounts/accounts_test.go
@@ -24,6 +24,7 @@ import (
)
func TestTextHash(t *testing.T) {
+ t.Parallel()
hash := TextHash([]byte("Hello Joe"))
want := hexutil.MustDecode("0xa080337ae51c4e064c189e113edd0ba391df9206e2f49db658bb32cf2911730b")
if !bytes.Equal(hash, want) {
diff --git a/accounts/hd_test.go b/accounts/hd_test.go
index 0743bbe666..118ec5187b 100644
--- a/accounts/hd_test.go
+++ b/accounts/hd_test.go
@@ -25,6 +25,7 @@ import (
// Tests that HD derivation paths can be correctly parsed into our internal binary
// representation.
func TestHDPathParsing(t *testing.T) {
+ t.Parallel()
tests := []struct {
input string
output DerivationPath
@@ -89,6 +90,7 @@ func testDerive(t *testing.T, next func() DerivationPath, expected []string) {
}
func TestHdPathIteration(t *testing.T) {
+ t.Parallel()
testDerive(t, DefaultIterator(DefaultBaseDerivationPath),
[]string{
"m/44'/60'/0'/0/0", "m/44'/60'/0'/0/1",
diff --git a/accounts/keystore/account_cache_test.go b/accounts/keystore/account_cache_test.go
index 371d274441..48a238048f 100644
--- a/accounts/keystore/account_cache_test.go
+++ b/accounts/keystore/account_cache_test.go
@@ -152,6 +152,7 @@ func TestWatchNoDir(t *testing.T) {
}
func TestCacheInitialReload(t *testing.T) {
+ t.Parallel()
cache, _ := newAccountCache(cachetestDir)
accounts := cache.accounts()
if !reflect.DeepEqual(accounts, cachetestAccounts) {
@@ -160,6 +161,7 @@ func TestCacheInitialReload(t *testing.T) {
}
func TestCacheAddDeleteOrder(t *testing.T) {
+ t.Parallel()
cache, _ := newAccountCache("testdata/no-such-dir")
cache.watcher.running = true // prevent unexpected reloads
@@ -244,6 +246,7 @@ func TestCacheAddDeleteOrder(t *testing.T) {
}
func TestCacheFind(t *testing.T) {
+ t.Parallel()
dir := filepath.Join("testdata", "dir")
cache, _ := newAccountCache(dir)
cache.watcher.running = true // prevent unexpected reloads
diff --git a/accounts/keystore/keystore_test.go b/accounts/keystore/keystore_test.go
index deb7cae9f9..c9a23eddd6 100644
--- a/accounts/keystore/keystore_test.go
+++ b/accounts/keystore/keystore_test.go
@@ -36,6 +36,7 @@ import (
var testSigData = make([]byte, 32)
func TestKeyStore(t *testing.T) {
+ t.Parallel()
dir, ks := tmpKeyStore(t, true)
a, err := ks.NewAccount("foo")
@@ -70,6 +71,7 @@ func TestKeyStore(t *testing.T) {
}
func TestSign(t *testing.T) {
+ t.Parallel()
_, ks := tmpKeyStore(t, true)
pass := "" // not used but required by API
@@ -86,6 +88,7 @@ func TestSign(t *testing.T) {
}
func TestSignWithPassphrase(t *testing.T) {
+ t.Parallel()
_, ks := tmpKeyStore(t, true)
pass := "passwd"
@@ -280,6 +283,7 @@ type walletEvent struct {
// Tests that wallet notifications and correctly fired when accounts are added
// or deleted from the keystore.
func TestWalletNotifications(t *testing.T) {
+ t.Parallel()
_, ks := tmpKeyStore(t, false)
// Subscribe to the wallet feed and collect events.
@@ -341,6 +345,7 @@ func TestWalletNotifications(t *testing.T) {
// TestImportExport tests the import functionality of a keystore.
func TestImportECDSA(t *testing.T) {
+ t.Parallel()
_, ks := tmpKeyStore(t, true)
key, err := crypto.GenerateKey()
if err != nil {
@@ -359,6 +364,7 @@ func TestImportECDSA(t *testing.T) {
// TestImportECDSA tests the import and export functionality of a keystore.
func TestImportExport(t *testing.T) {
+ t.Parallel()
_, ks := tmpKeyStore(t, true)
acc, err := ks.NewAccount("old")
if err != nil {
@@ -387,6 +393,7 @@ func TestImportExport(t *testing.T) {
// TestImportRace tests the keystore on races.
// This test should fail under -race if importing races.
func TestImportRace(t *testing.T) {
+ t.Parallel()
_, ks := tmpKeyStore(t, true)
acc, err := ks.NewAccount("old")
if err != nil {
diff --git a/accounts/keystore/passphrase.go b/accounts/keystore/passphrase.go
index 8d6ed2b14e..e7a7f8d0cb 100644
--- a/accounts/keystore/passphrase.go
+++ b/accounts/keystore/passphrase.go
@@ -136,7 +136,7 @@ func (ks keyStorePassphrase) JoinPath(filename string) string {
return filepath.Join(ks.keysDirPath, filename)
}
-// Encryptdata encrypts the data given as 'data' with the password 'auth'.
+// EncryptDataV3 encrypts the data given as 'data' with the password 'auth'.
func EncryptDataV3(data, auth []byte, scryptN, scryptP int) (CryptoJSON, error) {
salt := make([]byte, 32)
if _, err := io.ReadFull(rand.Reader, salt); err != nil {
diff --git a/accounts/keystore/passphrase_test.go b/accounts/keystore/passphrase_test.go
index 1de43a96da..20ec0f5519 100644
--- a/accounts/keystore/passphrase_test.go
+++ b/accounts/keystore/passphrase_test.go
@@ -30,6 +30,7 @@ const (
// Tests that a json key file can be decrypted and encrypted in multiple rounds.
func TestKeyEncryptDecrypt(t *testing.T) {
+ t.Parallel()
keyjson, err := os.ReadFile("testdata/very-light-scrypt.json")
if err != nil {
t.Fatal(err)
diff --git a/accounts/keystore/plain_test.go b/accounts/keystore/plain_test.go
index 93165d5cd3..737eb7fd61 100644
--- a/accounts/keystore/plain_test.go
+++ b/accounts/keystore/plain_test.go
@@ -40,6 +40,7 @@ func tmpKeyStoreIface(t *testing.T, encrypted bool) (dir string, ks keyStore) {
}
func TestKeyStorePlain(t *testing.T) {
+ t.Parallel()
_, ks := tmpKeyStoreIface(t, false)
pass := "" // not used but required by API
@@ -60,6 +61,7 @@ func TestKeyStorePlain(t *testing.T) {
}
func TestKeyStorePassphrase(t *testing.T) {
+ t.Parallel()
_, ks := tmpKeyStoreIface(t, true)
pass := "foo"
@@ -80,6 +82,7 @@ func TestKeyStorePassphrase(t *testing.T) {
}
func TestKeyStorePassphraseDecryptionFail(t *testing.T) {
+ t.Parallel()
_, ks := tmpKeyStoreIface(t, true)
pass := "foo"
@@ -93,6 +96,7 @@ func TestKeyStorePassphraseDecryptionFail(t *testing.T) {
}
func TestImportPreSaleKey(t *testing.T) {
+ t.Parallel()
dir, ks := tmpKeyStoreIface(t, true)
// file content of a presale key file generated with:
diff --git a/accounts/manager.go b/accounts/manager.go
index a0b5c329cd..cbe4f7c79d 100644
--- a/accounts/manager.go
+++ b/accounts/manager.go
@@ -98,6 +98,9 @@ func NewManager(config *Config, backends ...Backend) *Manager {
// Close terminates the account manager's internal notification processes.
func (am *Manager) Close() error {
+ for _, w := range am.wallets {
+ w.Close()
+ }
errc := make(chan error)
am.quit <- errc
return <-errc
diff --git a/accounts/url_test.go b/accounts/url_test.go
index 52be4c558d..f481a1016d 100644
--- a/accounts/url_test.go
+++ b/accounts/url_test.go
@@ -21,6 +21,7 @@ import (
)
func TestURLParsing(t *testing.T) {
+ t.Parallel()
url, err := parseURL("https://ethereum.org")
if err != nil {
t.Errorf("unexpected error: %v", err)
@@ -40,6 +41,7 @@ func TestURLParsing(t *testing.T) {
}
func TestURLString(t *testing.T) {
+ t.Parallel()
url := URL{Scheme: "https", Path: "ethereum.org"}
if url.String() != "https://ethereum.org" {
t.Errorf("expected: %v, got: %v", "https://ethereum.org", url.String())
@@ -52,6 +54,7 @@ func TestURLString(t *testing.T) {
}
func TestURLMarshalJSON(t *testing.T) {
+ t.Parallel()
url := URL{Scheme: "https", Path: "ethereum.org"}
json, err := url.MarshalJSON()
if err != nil {
@@ -63,6 +66,7 @@ func TestURLMarshalJSON(t *testing.T) {
}
func TestURLUnmarshalJSON(t *testing.T) {
+ t.Parallel()
url := &URL{}
err := url.UnmarshalJSON([]byte("\"https://ethereum.org\""))
if err != nil {
@@ -77,6 +81,7 @@ func TestURLUnmarshalJSON(t *testing.T) {
}
func TestURLComparison(t *testing.T) {
+ t.Parallel()
tests := []struct {
urlA URL
urlB URL
diff --git a/accounts/usbwallet/ledger.go b/accounts/usbwallet/ledger.go
index 723df0f2b3..d0cb93e74e 100644
--- a/accounts/usbwallet/ledger.go
+++ b/accounts/usbwallet/ledger.go
@@ -279,7 +279,7 @@ func (w *ledgerDriver) ledgerDerive(derivationPath []uint32) (common.Address, er
}
hexstr := reply[1 : 1+int(reply[0])]
- // Decode the hex sting into an Ethereum address and return
+ // Decode the hex string into an Ethereum address and return
var address common.Address
if _, err = hex.Decode(address[:], hexstr); err != nil {
return common.Address{}, err
diff --git a/accounts/usbwallet/wallet.go b/accounts/usbwallet/wallet.go
index 05add081ab..69083dc893 100644
--- a/accounts/usbwallet/wallet.go
+++ b/accounts/usbwallet/wallet.go
@@ -483,6 +483,10 @@ func (w *wallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Accoun
w.stateLock.Lock()
defer w.stateLock.Unlock()
+ if w.device == nil {
+ return accounts.Account{}, accounts.ErrWalletClosed
+ }
+
if _, ok := w.paths[address]; !ok {
w.accounts = append(w.accounts, account)
w.paths[address] = make(accounts.DerivationPath, len(path))
diff --git a/beacon/light/canonical.go b/beacon/light/canonical.go
new file mode 100644
index 0000000000..b5371493b4
--- /dev/null
+++ b/beacon/light/canonical.go
@@ -0,0 +1,125 @@
+// Copyright 2023 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see .
+
+package light
+
+import (
+ "encoding/binary"
+ "fmt"
+
+ "github.com/ethereum/go-ethereum/common/lru"
+ "github.com/ethereum/go-ethereum/ethdb"
+ "github.com/ethereum/go-ethereum/log"
+ "github.com/ethereum/go-ethereum/rlp"
+)
+
+// canonicalStore stores instances of the given type in a database and caches
+// them in memory, associated with a continuous range of period numbers.
+// Note: canonicalStore is not thread safe and it is the caller's responsibility
+// to avoid concurrent access.
+type canonicalStore[T any] struct {
+ keyPrefix []byte
+ periods periodRange
+ cache *lru.Cache[uint64, T]
+}
+
+// newCanonicalStore creates a new canonicalStore and loads all keys associated
+// with the keyPrefix in order to determine the ranges available in the database.
+func newCanonicalStore[T any](db ethdb.Iteratee, keyPrefix []byte) (*canonicalStore[T], error) {
+ cs := &canonicalStore[T]{
+ keyPrefix: keyPrefix,
+ cache: lru.NewCache[uint64, T](100),
+ }
+ var (
+ iter = db.NewIterator(keyPrefix, nil)
+ kl = len(keyPrefix)
+ first = true
+ )
+ defer iter.Release()
+
+ for iter.Next() {
+ if len(iter.Key()) != kl+8 {
+ log.Warn("Invalid key length in the canonical chain database", "key", fmt.Sprintf("%#x", iter.Key()))
+ continue
+ }
+ period := binary.BigEndian.Uint64(iter.Key()[kl : kl+8])
+ if first {
+ cs.periods.Start = period
+ } else if cs.periods.End != period {
+ return nil, fmt.Errorf("gap in the canonical chain database between periods %d and %d", cs.periods.End, period-1)
+ }
+ first = false
+ cs.periods.End = period + 1
+ }
+ return cs, nil
+}
+
+// databaseKey returns the database key belonging to the given period.
+func (cs *canonicalStore[T]) databaseKey(period uint64) []byte {
+ return binary.BigEndian.AppendUint64(append([]byte{}, cs.keyPrefix...), period)
+}
+
+// add adds the given item to the database. It also ensures that the range remains
+// continuous. Can be used either with a batch or database backend.
+func (cs *canonicalStore[T]) add(backend ethdb.KeyValueWriter, period uint64, value T) error {
+ if !cs.periods.canExpand(period) {
+ return fmt.Errorf("period expansion is not allowed, first: %d, next: %d, period: %d", cs.periods.Start, cs.periods.End, period)
+ }
+ enc, err := rlp.EncodeToBytes(value)
+ if err != nil {
+ return err
+ }
+ if err := backend.Put(cs.databaseKey(period), enc); err != nil {
+ return err
+ }
+ cs.cache.Add(period, value)
+ cs.periods.expand(period)
+ return nil
+}
+
+// deleteFrom removes items starting from the given period.
+func (cs *canonicalStore[T]) deleteFrom(db ethdb.KeyValueWriter, fromPeriod uint64) (deleted periodRange) {
+ keepRange, deleteRange := cs.periods.split(fromPeriod)
+ deleteRange.each(func(period uint64) {
+ db.Delete(cs.databaseKey(period))
+ cs.cache.Remove(period)
+ })
+ cs.periods = keepRange
+ return deleteRange
+}
+
+// get returns the item at the given period or the null value of the given type
+// if no item is present.
+func (cs *canonicalStore[T]) get(backend ethdb.KeyValueReader, period uint64) (T, bool) {
+ var null, value T
+ if !cs.periods.contains(period) {
+ return null, false
+ }
+ if value, ok := cs.cache.Get(period); ok {
+ return value, true
+ }
+ enc, err := backend.Get(cs.databaseKey(period))
+ if err != nil {
+ log.Error("Canonical store value not found", "period", period, "start", cs.periods.Start, "end", cs.periods.End)
+ return null, false
+ }
+ if err := rlp.DecodeBytes(enc, &value); err != nil {
+ log.Error("Error decoding canonical store value", "error", err)
+ return null, false
+ }
+ cs.cache.Add(period, value)
+ return value, true
+}
diff --git a/beacon/light/committee_chain.go b/beacon/light/committee_chain.go
new file mode 100644
index 0000000000..d707f8cc34
--- /dev/null
+++ b/beacon/light/committee_chain.go
@@ -0,0 +1,514 @@
+// Copyright 2023 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see .
+
+package light
+
+import (
+ "errors"
+ "fmt"
+ "math"
+ "sync"
+ "time"
+
+ "github.com/ethereum/go-ethereum/beacon/params"
+ "github.com/ethereum/go-ethereum/beacon/types"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/common/lru"
+ "github.com/ethereum/go-ethereum/common/mclock"
+ "github.com/ethereum/go-ethereum/core/rawdb"
+ "github.com/ethereum/go-ethereum/ethdb"
+ "github.com/ethereum/go-ethereum/log"
+)
+
+var (
+ ErrNeedCommittee = errors.New("sync committee required")
+ ErrInvalidUpdate = errors.New("invalid committee update")
+ ErrInvalidPeriod = errors.New("invalid update period")
+ ErrWrongCommitteeRoot = errors.New("wrong committee root")
+ ErrCannotReorg = errors.New("can not reorg committee chain")
+)
+
+// CommitteeChain is a passive data structure that can validate, hold and update
+// a chain of beacon light sync committees and updates. It requires at least one
+// externally set fixed committee root at the beginning of the chain which can
+// be set either based on a BootstrapData or a trusted source (a local beacon
+// full node). This makes the structure useful for both light client and light
+// server setups.
+//
+// It always maintains the following consistency constraints:
+// - a committee can only be present if its root hash matches an existing fixed
+// root or if it is proven by an update at the previous period
+// - an update can only be present if a committee is present at the same period
+// and the update signature is valid and has enough participants.
+// The committee at the next period (proven by the update) should also be
+// present (note that this means they can only be added together if neither
+// is present yet). If a fixed root is present at the next period then the
+// update can only be present if it proves the same committee root.
+//
+// Once synced to the current sync period, CommitteeChain can also validate
+// signed beacon headers.
+type CommitteeChain struct {
+ // chainmu guards against concurrent access to the canonicalStore structures
+ // (updates, committees, fixedCommitteeRoots) and ensures that they stay consistent
+ // with each other and with committeeCache.
+ chainmu sync.RWMutex
+ db ethdb.KeyValueStore
+ updates *canonicalStore[*types.LightClientUpdate]
+ committees *canonicalStore[*types.SerializedSyncCommittee]
+ fixedCommitteeRoots *canonicalStore[common.Hash]
+ committeeCache *lru.Cache[uint64, syncCommittee] // cache deserialized committees
+
+ clock mclock.Clock // monotonic clock (simulated clock in tests)
+ unixNano func() int64 // system clock (simulated clock in tests)
+ sigVerifier committeeSigVerifier // BLS sig verifier (dummy verifier in tests)
+
+ config *types.ChainConfig
+ signerThreshold int
+ minimumUpdateScore types.UpdateScore
+ enforceTime bool // enforceTime specifies whether the age of a signed header should be checked
+}
+
+// NewCommitteeChain creates a new CommitteeChain.
+func NewCommitteeChain(db ethdb.KeyValueStore, config *types.ChainConfig, signerThreshold int, enforceTime bool) *CommitteeChain {
+ return newCommitteeChain(db, config, signerThreshold, enforceTime, blsVerifier{}, &mclock.System{}, func() int64 { return time.Now().UnixNano() })
+}
+
+// newCommitteeChain creates a new CommitteeChain with the option of replacing the
+// clock source and signature verification for testing purposes.
+func newCommitteeChain(db ethdb.KeyValueStore, config *types.ChainConfig, signerThreshold int, enforceTime bool, sigVerifier committeeSigVerifier, clock mclock.Clock, unixNano func() int64) *CommitteeChain {
+ s := &CommitteeChain{
+ committeeCache: lru.NewCache[uint64, syncCommittee](10),
+ db: db,
+ sigVerifier: sigVerifier,
+ clock: clock,
+ unixNano: unixNano,
+ config: config,
+ signerThreshold: signerThreshold,
+ enforceTime: enforceTime,
+ minimumUpdateScore: types.UpdateScore{
+ SignerCount: uint32(signerThreshold),
+ SubPeriodIndex: params.SyncPeriodLength / 16,
+ },
+ }
+
+ var err1, err2, err3 error
+ if s.fixedCommitteeRoots, err1 = newCanonicalStore[common.Hash](db, rawdb.FixedCommitteeRootKey); err1 != nil {
+ log.Error("Error creating fixed committee root store", "error", err1)
+ }
+ if s.committees, err2 = newCanonicalStore[*types.SerializedSyncCommittee](db, rawdb.SyncCommitteeKey); err2 != nil {
+ log.Error("Error creating committee store", "error", err2)
+ }
+ if s.updates, err3 = newCanonicalStore[*types.LightClientUpdate](db, rawdb.BestUpdateKey); err3 != nil {
+ log.Error("Error creating update store", "error", err3)
+ }
+ if err1 != nil || err2 != nil || err3 != nil || !s.checkConstraints() {
+ log.Info("Resetting invalid committee chain")
+ s.Reset()
+ }
+ // roll back invalid updates (might be necessary if forks have been changed since last time)
+ for !s.updates.periods.isEmpty() {
+ update, ok := s.updates.get(s.db, s.updates.periods.End-1)
+ if !ok {
+ log.Error("Sync committee update missing", "period", s.updates.periods.End-1)
+ s.Reset()
+ break
+ }
+ if valid, err := s.verifyUpdate(update); err != nil {
+ log.Error("Error validating update", "period", s.updates.periods.End-1, "error", err)
+ } else if valid {
+ break
+ }
+ if err := s.rollback(s.updates.periods.End); err != nil {
+ log.Error("Error writing batch into chain database", "error", err)
+ }
+ }
+ if !s.committees.periods.isEmpty() {
+ log.Trace("Sync committee chain loaded", "first period", s.committees.periods.Start, "last period", s.committees.periods.End-1)
+ }
+ return s
+}
+
+// checkConstraints checks committee chain validity constraints
+func (s *CommitteeChain) checkConstraints() bool {
+ isNotInFixedCommitteeRootRange := func(r periodRange) bool {
+ return s.fixedCommitteeRoots.periods.isEmpty() ||
+ r.Start < s.fixedCommitteeRoots.periods.Start ||
+ r.Start >= s.fixedCommitteeRoots.periods.End
+ }
+
+ valid := true
+ if !s.updates.periods.isEmpty() {
+ if isNotInFixedCommitteeRootRange(s.updates.periods) {
+ log.Error("Start update is not in the fixed roots range")
+ valid = false
+ }
+ if s.committees.periods.Start > s.updates.periods.Start || s.committees.periods.End <= s.updates.periods.End {
+ log.Error("Missing committees in update range")
+ valid = false
+ }
+ }
+ if !s.committees.periods.isEmpty() {
+ if isNotInFixedCommitteeRootRange(s.committees.periods) {
+ log.Error("Start committee is not in the fixed roots range")
+ valid = false
+ }
+ if s.committees.periods.End > s.fixedCommitteeRoots.periods.End && s.committees.periods.End > s.updates.periods.End+1 {
+ log.Error("Last committee is neither in the fixed roots range nor proven by updates")
+ valid = false
+ }
+ }
+ return valid
+}
+
+// Reset resets the committee chain.
+func (s *CommitteeChain) Reset() {
+ s.chainmu.Lock()
+ defer s.chainmu.Unlock()
+
+ if err := s.rollback(0); err != nil {
+ log.Error("Error writing batch into chain database", "error", err)
+ }
+}
+
+// CheckpointInit initializes a CommitteeChain based on the checkpoint.
+// Note: if the chain is already initialized and the committees proven by the
+// checkpoint do match the existing chain then the chain is retained and the
+// new checkpoint becomes fixed.
+func (s *CommitteeChain) CheckpointInit(bootstrap *types.BootstrapData) error {
+ s.chainmu.Lock()
+ defer s.chainmu.Unlock()
+
+ if err := bootstrap.Validate(); err != nil {
+ return err
+ }
+
+ period := bootstrap.Header.SyncPeriod()
+ if err := s.deleteFixedCommitteeRootsFrom(period + 2); err != nil {
+ s.Reset()
+ return err
+ }
+ if s.addFixedCommitteeRoot(period, bootstrap.CommitteeRoot) != nil {
+ s.Reset()
+ if err := s.addFixedCommitteeRoot(period, bootstrap.CommitteeRoot); err != nil {
+ s.Reset()
+ return err
+ }
+ }
+ if err := s.addFixedCommitteeRoot(period+1, common.Hash(bootstrap.CommitteeBranch[0])); err != nil {
+ s.Reset()
+ return err
+ }
+ if err := s.addCommittee(period, bootstrap.Committee); err != nil {
+ s.Reset()
+ return err
+ }
+ return nil
+}
+
+// addFixedCommitteeRoot sets a fixed committee root at the given period.
+// Note that the period where the first committee is added has to have a fixed
+// root which can either come from a BootstrapData or a trusted source.
+func (s *CommitteeChain) addFixedCommitteeRoot(period uint64, root common.Hash) error {
+ if root == (common.Hash{}) {
+ return ErrWrongCommitteeRoot
+ }
+
+ batch := s.db.NewBatch()
+ oldRoot := s.getCommitteeRoot(period)
+ if !s.fixedCommitteeRoots.periods.canExpand(period) {
+ // Note: the fixed committee root range should always be continuous and
+ // therefore the expected syncing method is to forward sync and optionally
+ // backward sync periods one by one, starting from a checkpoint. The only
+ // case when a root that is not adjacent to the already fixed ones can be
+ // fixed is when the same root has already been proven by an update chain.
+ // In this case the all roots in between can and should be fixed.
+ // This scenario makes sense when a new trusted checkpoint is added to an
+ // existing chain, ensuring that it will not be rolled back (might be
+ // important in case of low signer participation rate).
+ if root != oldRoot {
+ return ErrInvalidPeriod
+ }
+ // if the old root exists and matches the new one then it is guaranteed
+ // that the given period is after the existing fixed range and the roots
+ // in between can also be fixed.
+ for p := s.fixedCommitteeRoots.periods.End; p < period; p++ {
+ if err := s.fixedCommitteeRoots.add(batch, p, s.getCommitteeRoot(p)); err != nil {
+ return err
+ }
+ }
+ }
+ if oldRoot != (common.Hash{}) && (oldRoot != root) {
+ // existing old root was different, we have to reorg the chain
+ if err := s.rollback(period); err != nil {
+ return err
+ }
+ }
+ if err := s.fixedCommitteeRoots.add(batch, period, root); err != nil {
+ return err
+ }
+ if err := batch.Write(); err != nil {
+ log.Error("Error writing batch into chain database", "error", err)
+ return err
+ }
+ return nil
+}
+
+// deleteFixedCommitteeRootsFrom deletes fixed roots starting from the given period.
+// It also maintains chain consistency, meaning that it also deletes updates and
+// committees if they are no longer supported by a valid update chain.
+func (s *CommitteeChain) deleteFixedCommitteeRootsFrom(period uint64) error {
+ if period >= s.fixedCommitteeRoots.periods.End {
+ return nil
+ }
+ batch := s.db.NewBatch()
+ s.fixedCommitteeRoots.deleteFrom(batch, period)
+ if s.updates.periods.isEmpty() || period <= s.updates.periods.Start {
+ // Note: the first period of the update chain should always be fixed so if
+ // the fixed root at the first update is removed then the entire update chain
+ // and the proven committees have to be removed. Earlier committees in the
+ // remaining fixed root range can stay.
+ s.updates.deleteFrom(batch, period)
+ s.deleteCommitteesFrom(batch, period)
+ } else {
+ // The update chain stays intact, some previously fixed committee roots might
+ // get unfixed but are still proven by the update chain. If there were
+ // committees present after the range proven by updates, those should be
+ // removed if the belonging fixed roots are also removed.
+ fromPeriod := s.updates.periods.End + 1 // not proven by updates
+ if period > fromPeriod {
+ fromPeriod = period // also not justified by fixed roots
+ }
+ s.deleteCommitteesFrom(batch, fromPeriod)
+ }
+ if err := batch.Write(); err != nil {
+ log.Error("Error writing batch into chain database", "error", err)
+ return err
+ }
+ return nil
+}
+
+// deleteCommitteesFrom deletes committees starting from the given period.
+func (s *CommitteeChain) deleteCommitteesFrom(batch ethdb.Batch, period uint64) {
+ deleted := s.committees.deleteFrom(batch, period)
+ for period := deleted.Start; period < deleted.End; period++ {
+ s.committeeCache.Remove(period)
+ }
+}
+
+// addCommittee adds a committee at the given period if possible.
+func (s *CommitteeChain) addCommittee(period uint64, committee *types.SerializedSyncCommittee) error {
+ if !s.committees.periods.canExpand(period) {
+ return ErrInvalidPeriod
+ }
+ root := s.getCommitteeRoot(period)
+ if root == (common.Hash{}) {
+ return ErrInvalidPeriod
+ }
+ if root != committee.Root() {
+ return ErrWrongCommitteeRoot
+ }
+ if !s.committees.periods.contains(period) {
+ if err := s.committees.add(s.db, period, committee); err != nil {
+ return err
+ }
+ s.committeeCache.Remove(period)
+ }
+ return nil
+}
+
+// InsertUpdate adds a new update if possible.
+func (s *CommitteeChain) InsertUpdate(update *types.LightClientUpdate, nextCommittee *types.SerializedSyncCommittee) error {
+ s.chainmu.Lock()
+ defer s.chainmu.Unlock()
+
+ period := update.AttestedHeader.Header.SyncPeriod()
+ if !s.updates.periods.canExpand(period) || !s.committees.periods.contains(period) {
+ return ErrInvalidPeriod
+ }
+ if s.minimumUpdateScore.BetterThan(update.Score()) {
+ return ErrInvalidUpdate
+ }
+ oldRoot := s.getCommitteeRoot(period + 1)
+ reorg := oldRoot != (common.Hash{}) && oldRoot != update.NextSyncCommitteeRoot
+ if oldUpdate, ok := s.updates.get(s.db, period); ok && !update.Score().BetterThan(oldUpdate.Score()) {
+ // a better or equal update already exists; no changes, only fail if new one tried to reorg
+ if reorg {
+ return ErrCannotReorg
+ }
+ return nil
+ }
+ if s.fixedCommitteeRoots.periods.contains(period+1) && reorg {
+ return ErrCannotReorg
+ }
+ if ok, err := s.verifyUpdate(update); err != nil {
+ return err
+ } else if !ok {
+ return ErrInvalidUpdate
+ }
+ addCommittee := !s.committees.periods.contains(period+1) || reorg
+ if addCommittee {
+ if nextCommittee == nil {
+ return ErrNeedCommittee
+ }
+ if nextCommittee.Root() != update.NextSyncCommitteeRoot {
+ return ErrWrongCommitteeRoot
+ }
+ }
+ if reorg {
+ if err := s.rollback(period + 1); err != nil {
+ return err
+ }
+ }
+ batch := s.db.NewBatch()
+ if addCommittee {
+ if err := s.committees.add(batch, period+1, nextCommittee); err != nil {
+ return err
+ }
+ s.committeeCache.Remove(period + 1)
+ }
+ if err := s.updates.add(batch, period, update); err != nil {
+ return err
+ }
+ if err := batch.Write(); err != nil {
+ log.Error("Error writing batch into chain database", "error", err)
+ return err
+ }
+ log.Info("Inserted new committee update", "period", period, "next committee root", update.NextSyncCommitteeRoot)
+ return nil
+}
+
+// NextSyncPeriod returns the next period where an update can be added and also
+// whether the chain is initialized at all.
+func (s *CommitteeChain) NextSyncPeriod() (uint64, bool) {
+ s.chainmu.RLock()
+ defer s.chainmu.RUnlock()
+
+ if s.committees.periods.isEmpty() {
+ return 0, false
+ }
+ if !s.updates.periods.isEmpty() {
+ return s.updates.periods.End, true
+ }
+ return s.committees.periods.End - 1, true
+}
+
+// rollback removes all committees and fixed roots from the given period and updates
+// starting from the previous period.
+func (s *CommitteeChain) rollback(period uint64) error {
+ max := s.updates.periods.End + 1
+ if s.committees.periods.End > max {
+ max = s.committees.periods.End
+ }
+ if s.fixedCommitteeRoots.periods.End > max {
+ max = s.fixedCommitteeRoots.periods.End
+ }
+ for max > period {
+ max--
+ batch := s.db.NewBatch()
+ s.deleteCommitteesFrom(batch, max)
+ s.fixedCommitteeRoots.deleteFrom(batch, max)
+ if max > 0 {
+ s.updates.deleteFrom(batch, max-1)
+ }
+ if err := batch.Write(); err != nil {
+ log.Error("Error writing batch into chain database", "error", err)
+ return err
+ }
+ }
+ return nil
+}
+
+// getCommitteeRoot returns the committee root at the given period, either fixed,
+// proven by a previous update or both. It returns an empty hash if the committee
+// root is unknown.
+func (s *CommitteeChain) getCommitteeRoot(period uint64) common.Hash {
+ if root, ok := s.fixedCommitteeRoots.get(s.db, period); ok || period == 0 {
+ return root
+ }
+ if update, ok := s.updates.get(s.db, period-1); ok {
+ return update.NextSyncCommitteeRoot
+ }
+ return common.Hash{}
+}
+
+// getSyncCommittee returns the deserialized sync committee at the given period.
+func (s *CommitteeChain) getSyncCommittee(period uint64) (syncCommittee, error) {
+ if c, ok := s.committeeCache.Get(period); ok {
+ return c, nil
+ }
+ if sc, ok := s.committees.get(s.db, period); ok {
+ c, err := s.sigVerifier.deserializeSyncCommittee(sc)
+ if err != nil {
+ return nil, fmt.Errorf("Sync committee #%d deserialization error: %v", period, err)
+ }
+ s.committeeCache.Add(period, c)
+ return c, nil
+ }
+ return nil, fmt.Errorf("Missing serialized sync committee #%d", period)
+}
+
+// VerifySignedHeader returns true if the given signed header has a valid signature
+// according to the local committee chain. The caller should ensure that the
+// committees advertised by the same source where the signed header came from are
+// synced before verifying the signature.
+// The age of the header is also returned (the time elapsed since the beginning
+// of the given slot, according to the local system clock). If enforceTime is
+// true then negative age (future) headers are rejected.
+func (s *CommitteeChain) VerifySignedHeader(head types.SignedHeader) (bool, time.Duration, error) {
+ s.chainmu.RLock()
+ defer s.chainmu.RUnlock()
+
+ return s.verifySignedHeader(head)
+}
+
+func (s *CommitteeChain) verifySignedHeader(head types.SignedHeader) (bool, time.Duration, error) {
+ var age time.Duration
+ now := s.unixNano()
+ if head.Header.Slot < (uint64(now-math.MinInt64)/uint64(time.Second)-s.config.GenesisTime)/12 {
+ age = time.Duration(now - int64(time.Second)*int64(s.config.GenesisTime+head.Header.Slot*12))
+ } else {
+ age = time.Duration(math.MinInt64)
+ }
+ if s.enforceTime && age < 0 {
+ return false, age, nil
+ }
+ committee, err := s.getSyncCommittee(types.SyncPeriod(head.SignatureSlot))
+ if err != nil {
+ return false, 0, err
+ }
+ if committee == nil {
+ return false, age, nil
+ }
+ if signingRoot, err := s.config.Forks.SigningRoot(head.Header); err == nil {
+ return s.sigVerifier.verifySignature(committee, signingRoot, &head.Signature), age, nil
+ }
+ return false, age, nil
+}
+
+// verifyUpdate checks whether the header signature is correct and the update
+// fits into the specified constraints (assumes that the update has been
+// successfully validated previously)
+func (s *CommitteeChain) verifyUpdate(update *types.LightClientUpdate) (bool, error) {
+ // Note: SignatureSlot determines the sync period of the committee used for signature
+ // verification. Though in reality SignatureSlot is always bigger than update.Header.Slot,
+ // setting them as equal here enforces the rule that they have to be in the same sync
+ // period in order for the light client update proof to be meaningful.
+ ok, age, err := s.verifySignedHeader(update.AttestedHeader)
+ if age < 0 {
+ log.Warn("Future committee update received", "age", age)
+ }
+ return ok, err
+}
diff --git a/beacon/light/committee_chain_test.go b/beacon/light/committee_chain_test.go
new file mode 100644
index 0000000000..60ea2a0efd
--- /dev/null
+++ b/beacon/light/committee_chain_test.go
@@ -0,0 +1,356 @@
+// Copyright 2022 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see .
+
+package light
+
+import (
+ "crypto/rand"
+ "testing"
+ "time"
+
+ "github.com/ethereum/go-ethereum/beacon/params"
+ "github.com/ethereum/go-ethereum/beacon/types"
+ "github.com/ethereum/go-ethereum/common/mclock"
+ "github.com/ethereum/go-ethereum/ethdb/memorydb"
+)
+
+var (
+ testGenesis = newTestGenesis()
+ testGenesis2 = newTestGenesis()
+
+ tfBase = newTestForks(testGenesis, types.Forks{
+ &types.Fork{Epoch: 0, Version: []byte{0}},
+ })
+ tfAlternative = newTestForks(testGenesis, types.Forks{
+ &types.Fork{Epoch: 0, Version: []byte{0}},
+ &types.Fork{Epoch: 0x700, Version: []byte{1}},
+ })
+ tfAnotherGenesis = newTestForks(testGenesis2, types.Forks{
+ &types.Fork{Epoch: 0, Version: []byte{0}},
+ })
+
+ tcBase = newTestCommitteeChain(nil, tfBase, true, 0, 10, 400, false)
+ tcBaseWithInvalidUpdates = newTestCommitteeChain(tcBase, tfBase, false, 5, 10, 200, false) // signer count too low
+ tcBaseWithBetterUpdates = newTestCommitteeChain(tcBase, tfBase, false, 5, 10, 440, false)
+ tcReorgWithWorseUpdates = newTestCommitteeChain(tcBase, tfBase, true, 5, 10, 400, false)
+ tcReorgWithWorseUpdates2 = newTestCommitteeChain(tcBase, tfBase, true, 5, 10, 380, false)
+ tcReorgWithBetterUpdates = newTestCommitteeChain(tcBase, tfBase, true, 5, 10, 420, false)
+ tcReorgWithFinalizedUpdates = newTestCommitteeChain(tcBase, tfBase, true, 5, 10, 400, true)
+ tcFork = newTestCommitteeChain(tcBase, tfAlternative, true, 7, 10, 400, false)
+ tcAnotherGenesis = newTestCommitteeChain(nil, tfAnotherGenesis, true, 0, 10, 400, false)
+)
+
+func TestCommitteeChainFixedCommitteeRoots(t *testing.T) {
+ for _, reload := range []bool{false, true} {
+ c := newCommitteeChainTest(t, tfBase, 300, true)
+ c.setClockPeriod(7)
+ c.addFixedCommitteeRoot(tcBase, 4, nil)
+ c.addFixedCommitteeRoot(tcBase, 5, nil)
+ c.addFixedCommitteeRoot(tcBase, 6, nil)
+ c.addFixedCommitteeRoot(tcBase, 8, ErrInvalidPeriod) // range has to be continuous
+ c.addFixedCommitteeRoot(tcBase, 3, nil)
+ c.addFixedCommitteeRoot(tcBase, 2, nil)
+ if reload {
+ c.reloadChain()
+ }
+ c.addCommittee(tcBase, 4, nil)
+ c.addCommittee(tcBase, 6, ErrInvalidPeriod) // range has to be continuous
+ c.addCommittee(tcBase, 5, nil)
+ c.addCommittee(tcBase, 6, nil)
+ c.addCommittee(tcAnotherGenesis, 3, ErrWrongCommitteeRoot)
+ c.addCommittee(tcBase, 3, nil)
+ if reload {
+ c.reloadChain()
+ }
+ c.verifyRange(tcBase, 3, 6)
+ }
+}
+
+func TestCommitteeChainCheckpointSync(t *testing.T) {
+ for _, enforceTime := range []bool{false, true} {
+ for _, reload := range []bool{false, true} {
+ c := newCommitteeChainTest(t, tfBase, 300, enforceTime)
+ if enforceTime {
+ c.setClockPeriod(6)
+ }
+ c.insertUpdate(tcBase, 3, true, ErrInvalidPeriod)
+ c.addFixedCommitteeRoot(tcBase, 3, nil)
+ c.addFixedCommitteeRoot(tcBase, 4, nil)
+ c.insertUpdate(tcBase, 4, true, ErrInvalidPeriod) // still no committee
+ c.addCommittee(tcBase, 3, nil)
+ c.addCommittee(tcBase, 4, nil)
+ if reload {
+ c.reloadChain()
+ }
+ c.verifyRange(tcBase, 3, 4)
+ c.insertUpdate(tcBase, 3, false, nil) // update can be added without committee here
+ c.insertUpdate(tcBase, 4, false, ErrNeedCommittee) // but not here as committee 5 is not there yet
+ c.insertUpdate(tcBase, 4, true, nil)
+ c.verifyRange(tcBase, 3, 5)
+ c.insertUpdate(tcBaseWithInvalidUpdates, 5, true, ErrInvalidUpdate) // signer count too low
+ c.insertUpdate(tcBase, 5, true, nil)
+ if reload {
+ c.reloadChain()
+ }
+ if enforceTime {
+ c.insertUpdate(tcBase, 6, true, ErrInvalidUpdate) // future update rejected
+ c.setClockPeriod(7)
+ }
+ c.insertUpdate(tcBase, 6, true, nil) // when the time comes it's accepted
+ if reload {
+ c.reloadChain()
+ }
+ if enforceTime {
+ c.verifyRange(tcBase, 3, 6) // committee 7 is there but still in the future
+ c.setClockPeriod(8)
+ }
+ c.verifyRange(tcBase, 3, 7) // now period 7 can also be verified
+ // try reverse syncing an update
+ c.insertUpdate(tcBase, 2, false, ErrInvalidPeriod) // fixed committee is needed first
+ c.addFixedCommitteeRoot(tcBase, 2, nil)
+ c.addCommittee(tcBase, 2, nil)
+ c.insertUpdate(tcBase, 2, false, nil)
+ c.verifyRange(tcBase, 2, 7)
+ }
+ }
+}
+
+func TestCommitteeChainReorg(t *testing.T) {
+ for _, reload := range []bool{false, true} {
+ for _, addBetterUpdates := range []bool{false, true} {
+ c := newCommitteeChainTest(t, tfBase, 300, true)
+ c.setClockPeriod(11)
+ c.addFixedCommitteeRoot(tcBase, 3, nil)
+ c.addFixedCommitteeRoot(tcBase, 4, nil)
+ c.addCommittee(tcBase, 3, nil)
+ for period := uint64(3); period < 10; period++ {
+ c.insertUpdate(tcBase, period, true, nil)
+ }
+ if reload {
+ c.reloadChain()
+ }
+ c.verifyRange(tcBase, 3, 10)
+ c.insertUpdate(tcReorgWithWorseUpdates, 5, true, ErrCannotReorg)
+ c.insertUpdate(tcReorgWithWorseUpdates2, 5, true, ErrCannotReorg)
+ if addBetterUpdates {
+ // add better updates for the base chain and expect first reorg to fail
+ // (only add updates as committees should be the same)
+ for period := uint64(5); period < 10; period++ {
+ c.insertUpdate(tcBaseWithBetterUpdates, period, false, nil)
+ }
+ if reload {
+ c.reloadChain()
+ }
+ c.verifyRange(tcBase, 3, 10) // still on the same chain
+ c.insertUpdate(tcReorgWithBetterUpdates, 5, true, ErrCannotReorg)
+ } else {
+ // reorg with better updates
+ c.insertUpdate(tcReorgWithBetterUpdates, 5, false, ErrNeedCommittee)
+ c.verifyRange(tcBase, 3, 10) // no success yet, still on the base chain
+ c.verifyRange(tcReorgWithBetterUpdates, 3, 5)
+ c.insertUpdate(tcReorgWithBetterUpdates, 5, true, nil)
+ // successful reorg, base chain should only match before the reorg period
+ if reload {
+ c.reloadChain()
+ }
+ c.verifyRange(tcBase, 3, 5)
+ c.verifyRange(tcReorgWithBetterUpdates, 3, 6)
+ for period := uint64(6); period < 10; period++ {
+ c.insertUpdate(tcReorgWithBetterUpdates, period, true, nil)
+ }
+ c.verifyRange(tcReorgWithBetterUpdates, 3, 10)
+ }
+ // reorg with finalized updates; should succeed even if base chain updates
+ // have been improved because a finalized update beats everything else
+ c.insertUpdate(tcReorgWithFinalizedUpdates, 5, false, ErrNeedCommittee)
+ c.insertUpdate(tcReorgWithFinalizedUpdates, 5, true, nil)
+ if reload {
+ c.reloadChain()
+ }
+ c.verifyRange(tcReorgWithFinalizedUpdates, 3, 6)
+ for period := uint64(6); period < 10; period++ {
+ c.insertUpdate(tcReorgWithFinalizedUpdates, period, true, nil)
+ }
+ c.verifyRange(tcReorgWithFinalizedUpdates, 3, 10)
+ }
+ }
+}
+
+func TestCommitteeChainFork(t *testing.T) {
+ c := newCommitteeChainTest(t, tfAlternative, 300, true)
+ c.setClockPeriod(11)
+ // trying to sync a chain on an alternative fork with the base chain data
+ c.addFixedCommitteeRoot(tcBase, 0, nil)
+ c.addFixedCommitteeRoot(tcBase, 1, nil)
+ c.addCommittee(tcBase, 0, nil)
+ // shared section should sync without errors
+ for period := uint64(0); period < 7; period++ {
+ c.insertUpdate(tcBase, period, true, nil)
+ }
+ c.insertUpdate(tcBase, 7, true, ErrInvalidUpdate) // wrong fork
+ // committee root #7 is still the same but signatures are already signed with
+ // a different fork id so period 7 should only verify on the alternative fork
+ c.verifyRange(tcBase, 0, 6)
+ c.verifyRange(tcFork, 0, 7)
+ for period := uint64(7); period < 10; period++ {
+ c.insertUpdate(tcFork, period, true, nil)
+ }
+ c.verifyRange(tcFork, 0, 10)
+ // reload the chain while switching to the base fork
+ c.config = tfBase
+ c.reloadChain()
+ // updates 7..9 should be rolled back now
+ c.verifyRange(tcFork, 0, 6) // again, period 7 only verifies on the right fork
+ c.verifyRange(tcBase, 0, 7)
+ c.insertUpdate(tcFork, 7, true, ErrInvalidUpdate) // wrong fork
+ for period := uint64(7); period < 10; period++ {
+ c.insertUpdate(tcBase, period, true, nil)
+ }
+ c.verifyRange(tcBase, 0, 10)
+}
+
+type committeeChainTest struct {
+ t *testing.T
+ db *memorydb.Database
+ clock *mclock.Simulated
+ config types.ChainConfig
+ signerThreshold int
+ enforceTime bool
+ chain *CommitteeChain
+}
+
+func newCommitteeChainTest(t *testing.T, config types.ChainConfig, signerThreshold int, enforceTime bool) *committeeChainTest {
+ c := &committeeChainTest{
+ t: t,
+ db: memorydb.New(),
+ clock: &mclock.Simulated{},
+ config: config,
+ signerThreshold: signerThreshold,
+ enforceTime: enforceTime,
+ }
+ c.chain = newCommitteeChain(c.db, &config, signerThreshold, enforceTime, dummyVerifier{}, c.clock, func() int64 { return int64(c.clock.Now()) })
+ return c
+}
+
+func (c *committeeChainTest) reloadChain() {
+ c.chain = newCommitteeChain(c.db, &c.config, c.signerThreshold, c.enforceTime, dummyVerifier{}, c.clock, func() int64 { return int64(c.clock.Now()) })
+}
+
+func (c *committeeChainTest) setClockPeriod(period float64) {
+ target := mclock.AbsTime(period * float64(time.Second*12*params.SyncPeriodLength))
+ wait := time.Duration(target - c.clock.Now())
+ if wait < 0 {
+ c.t.Fatalf("Invalid setClockPeriod")
+ }
+ c.clock.Run(wait)
+}
+
+func (c *committeeChainTest) addFixedCommitteeRoot(tc *testCommitteeChain, period uint64, expErr error) {
+ if err := c.chain.addFixedCommitteeRoot(period, tc.periods[period].committee.Root()); err != expErr {
+ c.t.Errorf("Incorrect error output from addFixedCommitteeRoot at period %d (expected %v, got %v)", period, expErr, err)
+ }
+}
+
+func (c *committeeChainTest) addCommittee(tc *testCommitteeChain, period uint64, expErr error) {
+ if err := c.chain.addCommittee(period, tc.periods[period].committee); err != expErr {
+ c.t.Errorf("Incorrect error output from addCommittee at period %d (expected %v, got %v)", period, expErr, err)
+ }
+}
+
+func (c *committeeChainTest) insertUpdate(tc *testCommitteeChain, period uint64, addCommittee bool, expErr error) {
+ var committee *types.SerializedSyncCommittee
+ if addCommittee {
+ committee = tc.periods[period+1].committee
+ }
+ if err := c.chain.InsertUpdate(tc.periods[period].update, committee); err != expErr {
+ c.t.Errorf("Incorrect error output from InsertUpdate at period %d (expected %v, got %v)", period, expErr, err)
+ }
+}
+
+func (c *committeeChainTest) verifySignedHeader(tc *testCommitteeChain, period float64, expOk bool) {
+ slot := uint64(period * float64(params.SyncPeriodLength))
+ signedHead := GenerateTestSignedHeader(types.Header{Slot: slot}, &tc.config, tc.periods[types.SyncPeriod(slot)].committee, slot+1, 400)
+ if ok, _, _ := c.chain.VerifySignedHeader(signedHead); ok != expOk {
+ c.t.Errorf("Incorrect output from VerifySignedHeader at period %f (expected %v, got %v)", period, expOk, ok)
+ }
+}
+
+func (c *committeeChainTest) verifyRange(tc *testCommitteeChain, begin, end uint64) {
+ if begin > 0 {
+ c.verifySignedHeader(tc, float64(begin)-0.5, false)
+ }
+ for period := begin; period <= end; period++ {
+ c.verifySignedHeader(tc, float64(period)+0.5, true)
+ }
+ c.verifySignedHeader(tc, float64(end)+1.5, false)
+}
+
+func newTestGenesis() types.ChainConfig {
+ var config types.ChainConfig
+ rand.Read(config.GenesisValidatorsRoot[:])
+ return config
+}
+
+func newTestForks(config types.ChainConfig, forks types.Forks) types.ChainConfig {
+ for _, fork := range forks {
+ config.AddFork(fork.Name, fork.Epoch, fork.Version)
+ }
+ return config
+}
+
+func newTestCommitteeChain(parent *testCommitteeChain, config types.ChainConfig, newCommittees bool, begin, end int, signerCount int, finalizedHeader bool) *testCommitteeChain {
+ tc := &testCommitteeChain{
+ config: config,
+ }
+ if parent != nil {
+ tc.periods = make([]testPeriod, len(parent.periods))
+ copy(tc.periods, parent.periods)
+ }
+ if newCommittees {
+ if begin == 0 {
+ tc.fillCommittees(begin, end+1)
+ } else {
+ tc.fillCommittees(begin+1, end+1)
+ }
+ }
+ tc.fillUpdates(begin, end, signerCount, finalizedHeader)
+ return tc
+}
+
+type testPeriod struct {
+ committee *types.SerializedSyncCommittee
+ update *types.LightClientUpdate
+}
+
+type testCommitteeChain struct {
+ periods []testPeriod
+ config types.ChainConfig
+}
+
+func (tc *testCommitteeChain) fillCommittees(begin, end int) {
+ if len(tc.periods) <= end {
+ tc.periods = append(tc.periods, make([]testPeriod, end+1-len(tc.periods))...)
+ }
+ for i := begin; i <= end; i++ {
+ tc.periods[i].committee = GenerateTestCommittee()
+ }
+}
+
+func (tc *testCommitteeChain) fillUpdates(begin, end int, signerCount int, finalizedHeader bool) {
+ for i := begin; i <= end; i++ {
+ tc.periods[i].update = GenerateTestUpdate(&tc.config, uint64(i), tc.periods[i].committee, tc.periods[i+1].committee, signerCount, finalizedHeader)
+ }
+}
diff --git a/beacon/light/range.go b/beacon/light/range.go
new file mode 100644
index 0000000000..76ebe2381a
--- /dev/null
+++ b/beacon/light/range.go
@@ -0,0 +1,78 @@
+// Copyright 2023 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see .
+
+package light
+
+// periodRange represents a (possibly zero-length) range of integers (sync periods).
+type periodRange struct {
+ Start, End uint64
+}
+
+// isEmpty returns true if the length of the range is zero.
+func (a periodRange) isEmpty() bool {
+ return a.End == a.Start
+}
+
+// contains returns true if the range includes the given period.
+func (a periodRange) contains(period uint64) bool {
+ return period >= a.Start && period < a.End
+}
+
+// canExpand returns true if the range includes or can be expanded with the given
+// period (either the range is empty or the given period is inside, right before or
+// right after the range).
+func (a periodRange) canExpand(period uint64) bool {
+ return a.isEmpty() || (period+1 >= a.Start && period <= a.End)
+}
+
+// expand expands the range with the given period.
+// This method assumes that canExpand returned true: otherwise this is a no-op.
+func (a *periodRange) expand(period uint64) {
+ if a.isEmpty() {
+ a.Start, a.End = period, period+1
+ return
+ }
+ if a.Start == period+1 {
+ a.Start--
+ }
+ if a.End == period {
+ a.End++
+ }
+}
+
+// split splits the range into two ranges. The 'fromPeriod' will be the first
+// element in the second range (if present).
+// The original range is unchanged by this operation
+func (a *periodRange) split(fromPeriod uint64) (periodRange, periodRange) {
+ if fromPeriod <= a.Start {
+ // First range empty, everything in second range,
+ return periodRange{}, *a
+ }
+ if fromPeriod >= a.End {
+ // Second range empty, everything in first range,
+ return *a, periodRange{}
+ }
+ x := periodRange{a.Start, fromPeriod}
+ y := periodRange{fromPeriod, a.End}
+ return x, y
+}
+
+// each invokes the supplied function fn once per period in range
+func (a *periodRange) each(fn func(uint64)) {
+ for p := a.Start; p < a.End; p++ {
+ fn(p)
+ }
+}
diff --git a/beacon/light/test_helpers.go b/beacon/light/test_helpers.go
new file mode 100644
index 0000000000..f537d963a6
--- /dev/null
+++ b/beacon/light/test_helpers.go
@@ -0,0 +1,152 @@
+// Copyright 2023 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see .
+
+package light
+
+import (
+ "crypto/rand"
+ "crypto/sha256"
+ mrand "math/rand"
+
+ "github.com/ethereum/go-ethereum/beacon/merkle"
+ "github.com/ethereum/go-ethereum/beacon/params"
+ "github.com/ethereum/go-ethereum/beacon/types"
+ "github.com/ethereum/go-ethereum/common"
+)
+
+func GenerateTestCommittee() *types.SerializedSyncCommittee {
+ s := new(types.SerializedSyncCommittee)
+ rand.Read(s[:32])
+ return s
+}
+
+func GenerateTestUpdate(config *types.ChainConfig, period uint64, committee, nextCommittee *types.SerializedSyncCommittee, signerCount int, finalizedHeader bool) *types.LightClientUpdate {
+ update := new(types.LightClientUpdate)
+ update.NextSyncCommitteeRoot = nextCommittee.Root()
+ var attestedHeader types.Header
+ if finalizedHeader {
+ update.FinalizedHeader = new(types.Header)
+ *update.FinalizedHeader, update.NextSyncCommitteeBranch = makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+100, params.StateIndexNextSyncCommittee, merkle.Value(update.NextSyncCommitteeRoot))
+ attestedHeader, update.FinalityBranch = makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+200, params.StateIndexFinalBlock, merkle.Value(update.FinalizedHeader.Hash()))
+ } else {
+ attestedHeader, update.NextSyncCommitteeBranch = makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+2000, params.StateIndexNextSyncCommittee, merkle.Value(update.NextSyncCommitteeRoot))
+ }
+ update.AttestedHeader = GenerateTestSignedHeader(attestedHeader, config, committee, attestedHeader.Slot+1, signerCount)
+ return update
+}
+
+func GenerateTestSignedHeader(header types.Header, config *types.ChainConfig, committee *types.SerializedSyncCommittee, signatureSlot uint64, signerCount int) types.SignedHeader {
+ bitmask := makeBitmask(signerCount)
+ signingRoot, _ := config.Forks.SigningRoot(header)
+ c, _ := dummyVerifier{}.deserializeSyncCommittee(committee)
+ return types.SignedHeader{
+ Header: header,
+ Signature: types.SyncAggregate{
+ Signers: bitmask,
+ Signature: makeDummySignature(c.(dummySyncCommittee), signingRoot, bitmask),
+ },
+ SignatureSlot: signatureSlot,
+ }
+}
+
+func GenerateTestCheckpoint(period uint64, committee *types.SerializedSyncCommittee) *types.BootstrapData {
+ header, branch := makeTestHeaderWithMerkleProof(types.SyncPeriodStart(period)+200, params.StateIndexSyncCommittee, merkle.Value(committee.Root()))
+ return &types.BootstrapData{
+ Header: header,
+ Committee: committee,
+ CommitteeRoot: committee.Root(),
+ CommitteeBranch: branch,
+ }
+}
+
+func makeBitmask(signerCount int) (bitmask [params.SyncCommitteeBitmaskSize]byte) {
+ for i := 0; i < params.SyncCommitteeSize; i++ {
+ if mrand.Intn(params.SyncCommitteeSize-i) < signerCount {
+ bitmask[i/8] += byte(1) << (i & 7)
+ signerCount--
+ }
+ }
+ return
+}
+
+func makeTestHeaderWithMerkleProof(slot, index uint64, value merkle.Value) (types.Header, merkle.Values) {
+ var branch merkle.Values
+ hasher := sha256.New()
+ for index > 1 {
+ var proofHash merkle.Value
+ rand.Read(proofHash[:])
+ hasher.Reset()
+ if index&1 == 0 {
+ hasher.Write(value[:])
+ hasher.Write(proofHash[:])
+ } else {
+ hasher.Write(proofHash[:])
+ hasher.Write(value[:])
+ }
+ hasher.Sum(value[:0])
+ index >>= 1
+ branch = append(branch, proofHash)
+ }
+ return types.Header{Slot: slot, StateRoot: common.Hash(value)}, branch
+}
+
+// syncCommittee holds either a blsSyncCommittee or a fake dummySyncCommittee used for testing
+type syncCommittee interface{}
+
+// committeeSigVerifier verifies sync committee signatures (either proper BLS
+// signatures or fake signatures used for testing)
+type committeeSigVerifier interface {
+ deserializeSyncCommittee(s *types.SerializedSyncCommittee) (syncCommittee, error)
+ verifySignature(committee syncCommittee, signedRoot common.Hash, aggregate *types.SyncAggregate) bool
+}
+
+// blsVerifier implements committeeSigVerifier
+type blsVerifier struct{}
+
+// deserializeSyncCommittee implements committeeSigVerifier
+func (blsVerifier) deserializeSyncCommittee(s *types.SerializedSyncCommittee) (syncCommittee, error) {
+ return s.Deserialize()
+}
+
+// verifySignature implements committeeSigVerifier
+func (blsVerifier) verifySignature(committee syncCommittee, signingRoot common.Hash, aggregate *types.SyncAggregate) bool {
+ return committee.(*types.SyncCommittee).VerifySignature(signingRoot, aggregate)
+}
+
+type dummySyncCommittee [32]byte
+
+// dummyVerifier implements committeeSigVerifier
+type dummyVerifier struct{}
+
+// deserializeSyncCommittee implements committeeSigVerifier
+func (dummyVerifier) deserializeSyncCommittee(s *types.SerializedSyncCommittee) (syncCommittee, error) {
+ var sc dummySyncCommittee
+ copy(sc[:], s[:32])
+ return sc, nil
+}
+
+// verifySignature implements committeeSigVerifier
+func (dummyVerifier) verifySignature(committee syncCommittee, signingRoot common.Hash, aggregate *types.SyncAggregate) bool {
+ return aggregate.Signature == makeDummySignature(committee.(dummySyncCommittee), signingRoot, aggregate.Signers)
+}
+
+func makeDummySignature(committee dummySyncCommittee, signingRoot common.Hash, bitmask [params.SyncCommitteeBitmaskSize]byte) (sig [params.BLSSignatureSize]byte) {
+ for i, b := range committee[:] {
+ sig[i] = b ^ signingRoot[i]
+ }
+ copy(sig[32:], bitmask[:])
+ return
+}
diff --git a/beacon/types/update.go b/beacon/types/light_sync.go
similarity index 88%
rename from beacon/types/update.go
rename to beacon/types/light_sync.go
index 06c1b61792..3284081e4d 100644
--- a/beacon/types/update.go
+++ b/beacon/types/light_sync.go
@@ -25,6 +25,24 @@ import (
"github.com/ethereum/go-ethereum/common"
)
+// BootstrapData contains a sync committee where light sync can be started,
+// together with a proof through a beacon header and corresponding state.
+// Note: BootstrapData is fetched from a server based on a known checkpoint hash.
+type BootstrapData struct {
+ Header Header
+ CommitteeRoot common.Hash
+ Committee *SerializedSyncCommittee `rlp:"-"`
+ CommitteeBranch merkle.Values
+}
+
+// Validate verifies the proof included in BootstrapData.
+func (c *BootstrapData) Validate() error {
+ if c.CommitteeRoot != c.Committee.Root() {
+ return errors.New("wrong committee root")
+ }
+ return merkle.VerifyProof(c.Header.StateRoot, params.StateIndexSyncCommittee, c.CommitteeBranch, merkle.Value(c.CommitteeRoot))
+}
+
// LightClientUpdate is a proof of the next sync committee root based on a header
// signed by the sync committee of the given period. Optionally, the update can
// prove quasi-finality by the signed header referring to a previous, finalized
diff --git a/build/checksums.txt b/build/checksums.txt
index c96bd85667..b9d322aa1a 100644
--- a/build/checksums.txt
+++ b/build/checksums.txt
@@ -5,52 +5,53 @@
# https://github.com/ethereum/execution-spec-tests/releases/download/v1.0.6/
485af7b66cf41eb3a8c1bd46632913b8eb95995df867cf665617bbc9b4beedd1 fixtures_develop.tar.gz
-# version:golang 1.21.4
+# version:golang 1.21.5
# https://go.dev/dl/
-47b26a83d2b65a3c1c1bcace273b69bee49a7a7b5168a7604ded3d26a37bd787 go1.21.4.src.tar.gz
-cd3bdcc802b759b70e8418bc7afbc4a65ca73a3fe576060af9fc8a2a5e71c3b8 go1.21.4.darwin-amd64.tar.gz
-8b7caf2ac60bdff457dba7d4ff2a01def889592b834453431ae3caecf884f6a5 go1.21.4.darwin-arm64.tar.gz
-f1e685d086eb36f4be5b8b953b52baf7752bc6235400d84bb7d87e500b65f03e go1.21.4.freebsd-386.tar.gz
-59f9b32187efb98d344a3818a631d3815ebb5c7bbefc367bab6515caaca544e9 go1.21.4.freebsd-amd64.tar.gz
-64d3e5d295806e137c9e39d1e1f10b00a30fcd5c2f230d72b3298f579bb3c89a go1.21.4.linux-386.tar.gz
-73cac0215254d0c7d1241fa40837851f3b9a8a742d0b54714cbdfb3feaf8f0af go1.21.4.linux-amd64.tar.gz
-ce1983a7289856c3a918e1fd26d41e072cc39f928adfb11ba1896440849b95da go1.21.4.linux-arm64.tar.gz
-6c62e89113750cc77c498194d13a03fadfda22bd2c7d44e8a826fd354db60252 go1.21.4.linux-armv6l.tar.gz
-2c63b36d2adcfb22013102a2ee730f058ec2f93b9f27479793c80b2e3641783f go1.21.4.linux-ppc64le.tar.gz
-7a75ba4afc7a96058ca65903d994cd862381825d7dca12b2183f087c757c26c0 go1.21.4.linux-s390x.tar.gz
-870a0e462b94671dc2d6cac707e9e19f7524fdc3c90711e6cd4450c3713a8ce0 go1.21.4.windows-386.zip
-79e5428e068c912d9cfa6cd115c13549856ec689c1332eac17f5d6122e19d595 go1.21.4.windows-amd64.zip
-58bc7c6f4d4c72da2df4d2650c8222fe03c9978070eb3c66be8bbaa2a4757ac1 go1.21.4.windows-arm64.zip
+285cbbdf4b6e6e62ed58f370f3f6d8c30825d6e56c5853c66d3c23bcdb09db19 go1.21.5.src.tar.gz
+a2e1d5743e896e5fe1e7d96479c0a769254aed18cf216cf8f4c3a2300a9b3923 go1.21.5.darwin-amd64.tar.gz
+d0f8ac0c4fb3efc223a833010901d02954e3923cfe2c9a2ff0e4254a777cc9cc go1.21.5.darwin-arm64.tar.gz
+2c05bbe0dc62456b90b7ddd354a54f373b7c377a98f8b22f52ab694b4f6cca58 go1.21.5.freebsd-386.tar.gz
+30b6c64e9a77129605bc12f836422bf09eec577a8c899ee46130aeff81567003 go1.21.5.freebsd-amd64.tar.gz
+8f4dba9cf5c61757bbd7e9ebdb93b6a30a1b03f4a636a1ba0cc2f27b907ab8e1 go1.21.5.linux-386.tar.gz
+e2bc0b3e4b64111ec117295c088bde5f00eeed1567999ff77bc859d7df70078e go1.21.5.linux-amd64.tar.gz
+841cced7ecda9b2014f139f5bab5ae31785f35399f236b8b3e75dff2a2978d96 go1.21.5.linux-arm64.tar.gz
+837f4bf4e22fcdf920ffeaa4abf3d02d1314e03725431065f4d44c46a01b42fe go1.21.5.linux-armv6l.tar.gz
+907b8c6ec4be9b184952e5d3493be66b1746442394a8bc78556c56834cd7c38b go1.21.5.linux-ppc64le.tar.gz
+9c4a81b72ebe44368813cd03684e1080a818bf915d84163abae2ed325a1b2dc0 go1.21.5.linux-s390x.tar.gz
+6da2418889dfb37763d0eb149c4a8d728c029e12f0cd54fbca0a31ae547e2d34 go1.21.5.windows-386.zip
+bbe603cde7c9dee658f45164b4d06de1eff6e6e6b800100824e7c00d56a9a92f go1.21.5.windows-amd64.zip
+9b7acca50e674294e43202df4fbc26d5af4d8bc3170a3342a1514f09a2dab5e9 go1.21.5.windows-arm64.zip
-# version:golangci 1.51.1
+# version:golangci 1.55.2
# https://github.com/golangci/golangci-lint/releases/
-# https://github.com/golangci/golangci-lint/releases/download/v1.51.1/
-fba08acc4027f69f07cef48fbff70b8a7ecdfaa1c2aba9ad3fb31d60d9f5d4bc golangci-lint-1.51.1-darwin-amd64.tar.gz
-75b8f0ff3a4e68147156be4161a49d4576f1be37a0b506473f8c482140c1e7f2 golangci-lint-1.51.1-darwin-arm64.tar.gz
-e06b3459aaed356e1667580be00b05f41f3b2e29685d12cdee571c23e1edb414 golangci-lint-1.51.1-freebsd-386.tar.gz
-623ce2d0fa4d35cc2e8d69fa7334227ab592380962a13b4d9cdc77cf41db2008 golangci-lint-1.51.1-freebsd-amd64.tar.gz
-131365feb0584cc2736c43192fa673ca50e5b6b765456990cb379ecfb787e568 golangci-lint-1.51.1-freebsd-armv6.tar.gz
-98fb627927cbb654f5bf85dcffc5f646666b2ce96ea0fed977c9fb28abd51532 golangci-lint-1.51.1-freebsd-armv7.tar.gz
-b36a99702fa762c15840261bc0fb41b4b1b16b8b19b8c0941bae98c85bb0f8b8 golangci-lint-1.51.1-linux-386.tar.gz
-17aeb26c76820c22efa0e1838b0ab93e90cfedef43fbfc9a2f33f27eb9e5e070 golangci-lint-1.51.1-linux-amd64.tar.gz
-9744bc34e7b8d82ca788b667bfb7155a39b4be9aef43bf9f10318b1372cea338 golangci-lint-1.51.1-linux-arm64.tar.gz
-0dda8dbeb2ff7455a044ec8e347f2fc6d655d2e99d281b3b95e88167031c673d golangci-lint-1.51.1-linux-armv6.tar.gz
-0512f311b11d43b8b22989d929f0fe8a2e1e5ebe497f1eb0ff73a0fc3d188fd1 golangci-lint-1.51.1-linux-armv7.tar.gz
-d767108dcf84a8eaa844df3454cb0f75a492f4e7102ecc2b0a3545cfe073a566 golangci-lint-1.51.1-linux-loong64.tar.gz
-3bd56c54daec16585b2668e0dfabb27af2c2b38cc0fdb46923e2521e1634846b golangci-lint-1.51.1-linux-mips64.tar.gz
-f72f5adfa2219e15d2414c9a2966f86e74556cf17a85c727a7fb7770a16cf814 golangci-lint-1.51.1-linux-mips64le.tar.gz
-e605521dac98096d8737e1997c954f41f1d0d8275b8731f62783d410c23574b9 golangci-lint-1.51.1-linux-ppc64le.tar.gz
-2f683217b814339e74d61ca700922d8407f15addd6d4c5e8b156fbab79f26a87 golangci-lint-1.51.1-linux-riscv64.tar.gz
-d98528292b65971a3594e5880530e7624597dc9806fcfccdfbe39be411713d63 golangci-lint-1.51.1-linux-s390x.tar.gz
-9bb2d0fe9e692ed0aea4f2537e3e6862b2f6768fe2849a84f4a6ad09da9fd971 golangci-lint-1.51.1-netbsd-386.tar.gz
-34cafdcd11ae73ae88d66c33eb8449f5c976fc3e37b44774dbe9c71caa95e592 golangci-lint-1.51.1-netbsd-amd64.tar.gz
-f8b4e1e47ac17caafe8a5f32f975a2b6a7cb14c27c0f73c1fb15c20ca91c2e03 golangci-lint-1.51.1-netbsd-armv6.tar.gz
-c4f58b7e227b9fd41f0e9310dc83f4a4e7d026598e2f6e95b78761081a6d9bd2 golangci-lint-1.51.1-netbsd-armv7.tar.gz
-6710e2f5375dc75521c1a17980a6cbbe6ff76c2f8b852964a8af558899a97cf5 golangci-lint-1.51.1-windows-386.zip
-722d7b87b9cdda0a3835d5030b3fc5385c2eba4c107f63f6391cfb2ac35f051d golangci-lint-1.51.1-windows-amd64.zip
-eb57f9bcb56646f2e3d6ccaf02ec227815fb05077b2e0b1bf9e755805acdc2b9 golangci-lint-1.51.1-windows-arm64.zip
-bce02f7232723cb727755ee11f168a700a00896a25d37f87c4b173bce55596b4 golangci-lint-1.51.1-windows-armv6.zip
-cf6403f84707ce8c98664736772271bc8874f2e760c2fd0f00cf3e85963507e9 golangci-lint-1.51.1-windows-armv7.zip
+# https://github.com/golangci/golangci-lint/releases/download/v1.55.2/
+632e96e6d5294fbbe7b2c410a49c8fa01c60712a0af85a567de85bcc1623ea21 golangci-lint-1.55.2-darwin-amd64.tar.gz
+234463f059249f82045824afdcdd5db5682d0593052f58f6a3039a0a1c3899f6 golangci-lint-1.55.2-darwin-arm64.tar.gz
+2bdd105e2d4e003a9058c33a22bb191a1e0f30fa0790acca0d8fbffac1d6247c golangci-lint-1.55.2-freebsd-386.tar.gz
+e75056e8b082386676ce23eba455cf893931a792c0d87e1e3743c0aec33c7fb5 golangci-lint-1.55.2-freebsd-amd64.tar.gz
+5789b933facaf6136bd23f1d50add67b79bbcf8dfdfc9069a37f729395940a66 golangci-lint-1.55.2-freebsd-armv6.tar.gz
+7f21ab1008d05f32c954f99470fc86a83a059e530fe2add1d0b7d8ed4d8992a7 golangci-lint-1.55.2-freebsd-armv7.tar.gz
+33ab06139b9219a28251f10821da94423db30285cc2af97494cbb2a281927de9 golangci-lint-1.55.2-illumos-amd64.tar.gz
+57ce6f8ce3ad6ee45d7cc3d9a047545a851c2547637834a3fcb086c7b40b1e6b golangci-lint-1.55.2-linux-386.tar.gz
+ca21c961a33be3bc15e4292dc40c98c8dcc5463a7b6768a3afc123761630c09c golangci-lint-1.55.2-linux-amd64.tar.gz
+8eb0cee9b1dbf0eaa49871798c7f8a5b35f2960c52d776a5f31eb7d886b92746 golangci-lint-1.55.2-linux-arm64.tar.gz
+3195f3e0f37d353fd5bd415cabcd4e263f5c29d3d0ffb176c26ff3d2c75eb3bb golangci-lint-1.55.2-linux-armv6.tar.gz
+c823ee36eb1a719e171de1f2f5ca3068033dce8d9817232fd10ed71fd6650406 golangci-lint-1.55.2-linux-armv7.tar.gz
+758a5d2a356dc494bd13ed4c0d4bf5a54a4dc91267ea5ecdd87b86c7ca0624e7 golangci-lint-1.55.2-linux-loong64.tar.gz
+2c7b9abdce7cae802a67d583cd7c6dca520bff6d0e17c8535a918e2f2b437aa0 golangci-lint-1.55.2-linux-mips64.tar.gz
+024e0a15b85352cc27271285526e16a4ab66d3e67afbbe446c9808c06cb8dbed golangci-lint-1.55.2-linux-mips64le.tar.gz
+6b00f89ba5506c1de1efdd9fa17c54093013a294fefd8b9b31534db626a672ee golangci-lint-1.55.2-linux-ppc64le.tar.gz
+0faa0d047d9bf7b703ed3ea65b6117043c93504f9ca1de25ae929d3901c73d4a golangci-lint-1.55.2-linux-riscv64.tar.gz
+30dec9b22e7d5bb4e9d5ccea96da20f71cd7db3c8cf30b8ddc7cb9174c4d742a golangci-lint-1.55.2-linux-s390x.tar.gz
+5a0ede48f79ad707902fdb29be8cd2abd8302dc122b65ebae3fdfc86751c7698 golangci-lint-1.55.2-netbsd-386.tar.gz
+95af20a2e617126dd5b08122ece7819101070e1582a961067ce8c41172f901ad golangci-lint-1.55.2-netbsd-amd64.tar.gz
+94fb7dacb7527847cc95d7120904e19a2a0a81a0d50d61766c9e0251da72ab9d golangci-lint-1.55.2-netbsd-armv6.tar.gz
+ca906bce5fee9619400e4a321c56476fe4a4efb6ac4fc989d340eb5563348873 golangci-lint-1.55.2-netbsd-armv7.tar.gz
+45b442f69fc8915c4500201c0247b7f3f69544dbc9165403a61f9095f2c57355 golangci-lint-1.55.2-windows-386.zip
+f57d434d231d43417dfa631587522f8c1991220b43c8ffadb9c7bd279508bf81 golangci-lint-1.55.2-windows-amd64.zip
+fd7dc8f4c6829ee6fafb252a4d81d2155cd35da7833665cbb25d53ce7cecd990 golangci-lint-1.55.2-windows-arm64.zip
+1892c3c24f9e7ef44b02f6750c703864b6dc350129f3ec39510300007b2376f1 golangci-lint-1.55.2-windows-armv6.zip
+a5e68ae73d38748b5269fad36ac7575e3c162a5dc63ef58abdea03cc5da4522a golangci-lint-1.55.2-windows-armv7.zip
# This is the builder on PPA that will build Go itself (inception-y), don't modify!
#
diff --git a/build/ci.go b/build/ci.go
index afe1c332b8..1ffbf3074d 100644
--- a/build/ci.go
+++ b/build/ci.go
@@ -123,12 +123,13 @@ var (
// wily, yakkety, zesty, artful, cosmic, disco, eoan, groovy, hirsuite, impish,
// kinetic
debDistroGoBoots = map[string]string{
- "trusty": "golang-1.11", // EOL: 04/2024
- "xenial": "golang-go", // EOL: 04/2026
- "bionic": "golang-go", // EOL: 04/2028
- "focal": "golang-go", // EOL: 04/2030
- "jammy": "golang-go", // EOL: 04/2032
- "lunar": "golang-go", // EOL: 01/2024
+ "trusty": "golang-1.11", // 14.04, EOL: 04/2024
+ "xenial": "golang-go", // 16.04, EOL: 04/2026
+ "bionic": "golang-go", // 18.04, EOL: 04/2028
+ "focal": "golang-go", // 20.04, EOL: 04/2030
+ "jammy": "golang-go", // 22.04, EOL: 04/2032
+ "lunar": "golang-go", // 23.04, EOL: 01/2024
+ "mantic": "golang-go", // 23.10, EOL: 07/2024
}
debGoBootPaths = map[string]string{
@@ -285,7 +286,7 @@ func doTest(cmdline []string) {
coverage = flag.Bool("coverage", false, "Whether to record code coverage")
verbose = flag.Bool("v", false, "Whether to log verbosely")
race = flag.Bool("race", false, "Execute the race detector")
- short = flag.Bool("short", false, "Pass the 'short'-flag to go test")
+ short = flag.Bool("short", false, "Pass the 'short'-flag to go test")
cachedir = flag.String("cachedir", "./build/cache", "directory for caching downloads")
)
flag.CommandLine.Parse(cmdline)
@@ -366,7 +367,7 @@ func doLint(cmdline []string) {
linter := downloadLinter(*cachedir)
lflags := []string{"run", "--config", ".golangci.yml"}
- build.MustRunCommand(linter, append(lflags, packages...)...)
+ build.MustRunCommandWithOutput(linter, append(lflags, packages...)...)
fmt.Println("You have achieved perfection.")
}
diff --git a/build/nsis.geth.nsi b/build/nsis.geth.nsi
index 1034f30235..03710dd95d 100644
--- a/build/nsis.geth.nsi
+++ b/build/nsis.geth.nsi
@@ -20,7 +20,7 @@
# - NSIS Large Strings build, http://nsis.sourceforge.net/Special_Builds
# - SFP, http://nsis.sourceforge.net/NSIS_Simple_Firewall_Plugin (put dll in NSIS\Plugins\x86-ansi)
#
-# After intalling NSIS extra the NSIS Large Strings build zip and replace the makensis.exe and the
+# After installing NSIS extra the NSIS Large Strings build zip and replace the makensis.exe and the
# files found in Stub.
#
# based on: http://nsis.sourceforge.net/A_simple_installer_with_start_menu_shortcut_and_uninstaller
diff --git a/cmd/bootnode/main.go b/cmd/bootnode/main.go
index 1660b43b74..350b85df1e 100644
--- a/cmd/bootnode/main.go
+++ b/cmd/bootnode/main.go
@@ -32,7 +32,6 @@ import (
"github.com/ethereum/go-ethereum/p2p/enode"
"github.com/ethereum/go-ethereum/p2p/nat"
"github.com/ethereum/go-ethereum/p2p/netutil"
- "golang.org/x/exp/slog"
)
func main() {
@@ -45,7 +44,7 @@ func main() {
natdesc = flag.String("nat", "none", "port mapping mechanism (any|none|upnp|pmp|pmp:|extip:)")
netrestrict = flag.String("netrestrict", "", "restrict network communication to the given IP networks (CIDR masks)")
runv5 = flag.Bool("v5", false, "run a v5 topic discovery bootnode")
- verbosity = flag.Int("verbosity", int(log.LvlInfo), "log verbosity (0-5)")
+ verbosity = flag.Int("verbosity", 3, "log verbosity (0-5)")
vmodule = flag.String("vmodule", "", "log verbosity pattern")
nodeKey *ecdsa.PrivateKey
@@ -54,7 +53,8 @@ func main() {
flag.Parse()
glogger := log.NewGlogHandler(log.NewTerminalHandler(os.Stderr, false))
- glogger.Verbosity(slog.Level(*verbosity))
+ slogVerbosity := log.FromLegacyLevel(*verbosity)
+ glogger.Verbosity(slogVerbosity)
glogger.Vmodule(*vmodule)
log.SetDefault(log.NewLogger(glogger))
diff --git a/cmd/clef/README.md b/cmd/clef/README.md
index 85c9c70606..3a43db8c95 100644
--- a/cmd/clef/README.md
+++ b/cmd/clef/README.md
@@ -2,7 +2,7 @@
Clef can be used to sign transactions and data and is meant as a(n eventual) replacement for Geth's account management. This allows DApps to not depend on Geth's account management. When a DApp wants to sign data (or a transaction), it can send the content to Clef, which will then provide the user with context and asks for permission to sign the content. If the users grants the signing request, Clef will send the signature back to the DApp.
-This setup allows a DApp to connect to a remote Ethereum node and send transactions that are locally signed. This can help in situations when a DApp is connected to an untrusted remote Ethereum node, because a local one is not available, not synchronised with the chain, or is a node that has no built-in (or limited) account management.
+This setup allows a DApp to connect to a remote Ethereum node and send transactions that are locally signed. This can help in situations when a DApp is connected to an untrusted remote Ethereum node, because a local one is not available, not synchronized with the chain, or is a node that has no built-in (or limited) account management.
Clef can run as a daemon on the same machine, off a usb-stick like [USB armory](https://inversepath.com/usbarmory), or even a separate VM in a [QubesOS](https://www.qubes-os.org/) type setup.
diff --git a/cmd/clef/main.go b/cmd/clef/main.go
index 27b7b70771..f9b00e4a12 100644
--- a/cmd/clef/main.go
+++ b/cmd/clef/main.go
@@ -57,7 +57,6 @@ import (
"github.com/mattn/go-colorable"
"github.com/mattn/go-isatty"
"github.com/urfave/cli/v2"
- "golang.org/x/exp/slog"
)
const legalWarning = `
@@ -493,7 +492,8 @@ func initialize(c *cli.Context) error {
if usecolor {
output = colorable.NewColorable(logOutput)
}
- log.SetDefault(log.NewLogger(log.NewTerminalHandlerWithLevel(output, slog.Level(c.Int(logLevelFlag.Name)), usecolor)))
+ verbosity := log.FromLegacyLevel(c.Int(logLevelFlag.Name))
+ log.SetDefault(log.NewLogger(log.NewTerminalHandlerWithLevel(output, verbosity, usecolor)))
return nil
}
@@ -704,6 +704,7 @@ func signer(c *cli.Context) error {
log.Info("Starting signer", "chainid", chainId, "keystore", ksLoc,
"light-kdf", lightKdf, "advanced", advanced)
am := core.StartClefAccountManager(ksLoc, nousb, lightKdf, scpath)
+ defer am.Close()
apiImpl := core.NewSignerAPI(am, chainId, nousb, ui, db, advanced, pwStorage)
// Establish the bidirectional communication, by creating a new UI backend and registering
diff --git a/cmd/clef/pythonsigner.py b/cmd/clef/pythonsigner.py
index b9ea1e406a..5d0eb18dcc 100644
--- a/cmd/clef/pythonsigner.py
+++ b/cmd/clef/pythonsigner.py
@@ -91,7 +91,7 @@ class StdIOHandler:
{"jsonrpc":"2.0","id":20,"method":"ui_approveTx","params":[{"transaction":{"from":"0xDEADbEeF000000000000000000000000DeaDbeEf","to":"0xDEADbEeF000000000000000000000000DeaDbeEf","gas":"0x3e8","gasPrice":"0x5","maxFeePerGas":null,"maxPriorityFeePerGas":null,"value":"0x6","nonce":"0x1","data":"0x"},"call_info":null,"meta":{"remote":"clef binary","local":"main","scheme":"in-proc","User-Agent":"","Origin":""}}]}
:param transaction: transaction info
- :param call_info: info abou the call, e.g. if ABI info could not be
+ :param call_info: info about the call, e.g. if ABI info could not be
:param meta: metadata about the request, e.g. where the call comes from
:return:
""" # noqa: E501
diff --git a/cmd/devp2p/README.md b/cmd/devp2p/README.md
index 5ca7b497a2..284dfe0a45 100644
--- a/cmd/devp2p/README.md
+++ b/cmd/devp2p/README.md
@@ -108,31 +108,32 @@ Start the test by running `devp2p discv5 test -listen1 127.0.0.1 -listen2 127.0.
The Eth Protocol test suite is a conformance test suite for the [eth protocol][eth].
-To run the eth protocol test suite against your implementation, the node needs to be initialized as such:
+To run the eth protocol test suite against your implementation, the node needs to be initialized
+with our test chain. The chain files are located in `./cmd/devp2p/internal/ethtest/testdata`.
-1. initialize the geth node with the `genesis.json` file contained in the `testdata` directory
-2. import the `halfchain.rlp` file in the `testdata` directory
-3. run geth with the following flags:
-```
-geth --datadir --nodiscover --nat=none --networkid 19763 --verbosity 5
-```
+1. initialize the geth node with the `genesis.json` file
+2. import blocks from `chain.rlp`
+3. run the client using the resulting database. For geth, use a command like the one below:
-Then, run the following command, replacing `` with the enode of the geth node:
- ```
- devp2p rlpx eth-test cmd/devp2p/internal/ethtest/testdata/chain.rlp cmd/devp2p/internal/ethtest/testdata/genesis.json
-```
+ geth \
+ --datadir \
+ --nodiscover \
+ --nat=none \
+ --networkid 3503995874084926 \
+ --verbosity 5 \
+ --authrpc.jwtsecret 0x7365637265747365637265747365637265747365637265747365637265747365
+
+Note that the tests also require access to the engine API.
+The test suite can now be executed using the devp2p tool.
+
+ devp2p rlpx eth-test \
+ --chain internal/ethtest/testdata \
+ --node enode://.... \
+ --engineapi http://127.0.0.1:8551 \
+ --jwtsecret 0x7365637265747365637265747365637265747365637265747365637265747365
Repeat the above process (re-initialising the node) in order to run the Eth Protocol test suite again.
-#### Eth66 Test Suite
-
-The Eth66 test suite is also a conformance test suite for the eth 66 protocol version specifically.
-To run the eth66 protocol test suite, initialize a geth node as described above and run the following command,
-replacing `` with the enode of the geth node:
-
- ```
- devp2p rlpx eth66-test cmd/devp2p/internal/ethtest/testdata/chain.rlp cmd/devp2p/internal/ethtest/testdata/genesis.json
-```
[eth]: https://github.com/ethereum/devp2p/blob/master/caps/eth.md
[dns-tutorial]: https://geth.ethereum.org/docs/developers/geth-developer/dns-discovery-setup
diff --git a/cmd/devp2p/internal/ethtest/chain.go b/cmd/devp2p/internal/ethtest/chain.go
index 938159ec52..e8b3725b17 100644
--- a/cmd/devp2p/internal/ethtest/chain.go
+++ b/cmd/devp2p/internal/ethtest/chain.go
@@ -17,27 +17,118 @@
package ethtest
import (
+ "bytes"
"compress/gzip"
+ "crypto/ecdsa"
"encoding/json"
"errors"
"fmt"
"io"
"math/big"
"os"
+ "path"
+ "sort"
"strings"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/forkid"
+ "github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/eth/protocols/eth"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rlp"
+ "golang.org/x/exp/slices"
)
+// Chain is a lightweight blockchain-like store which can read a hivechain
+// created chain.
type Chain struct {
- genesis core.Genesis
- blocks []*types.Block
- chainConfig *params.ChainConfig
+ genesis core.Genesis
+ blocks []*types.Block
+ state map[common.Address]state.DumpAccount // state of head block
+ senders map[common.Address]*senderInfo
+ config *params.ChainConfig
+}
+
+// NewChain takes the given chain.rlp file, and decodes and returns
+// the blocks from the file.
+func NewChain(dir string) (*Chain, error) {
+ gen, err := loadGenesis(path.Join(dir, "genesis.json"))
+ if err != nil {
+ return nil, err
+ }
+ gblock := gen.ToBlock()
+
+ blocks, err := blocksFromFile(path.Join(dir, "chain.rlp"), gblock)
+ if err != nil {
+ return nil, err
+ }
+ state, err := readState(path.Join(dir, "headstate.json"))
+ if err != nil {
+ return nil, err
+ }
+ accounts, err := readAccounts(path.Join(dir, "accounts.json"))
+ if err != nil {
+ return nil, err
+ }
+ return &Chain{
+ genesis: gen,
+ blocks: blocks,
+ state: state,
+ senders: accounts,
+ config: gen.Config,
+ }, nil
+}
+
+// senderInfo is an account record as output in the "accounts.json" file from
+// hivechain.
+type senderInfo struct {
+ Key *ecdsa.PrivateKey `json:"key"`
+ Nonce uint64 `json:"nonce"`
+}
+
+// Head returns the chain head.
+func (c *Chain) Head() *types.Block {
+ return c.blocks[c.Len()-1]
+}
+
+// AccountsInHashOrder returns all accounts of the head state, ordered by hash of address.
+func (c *Chain) AccountsInHashOrder() []state.DumpAccount {
+ list := make([]state.DumpAccount, len(c.state))
+ i := 0
+ for addr, acc := range c.state {
+ addr := addr
+ list[i] = acc
+ list[i].Address = &addr
+ if len(acc.AddressHash) != 32 {
+ panic(fmt.Errorf("missing/invalid SecureKey in dump account %v", addr))
+ }
+ i++
+ }
+ slices.SortFunc(list, func(x, y state.DumpAccount) int {
+ return bytes.Compare(x.AddressHash, y.AddressHash)
+ })
+ return list
+}
+
+// CodeHashes returns all bytecode hashes contained in the head state.
+func (c *Chain) CodeHashes() []common.Hash {
+ var hashes []common.Hash
+ seen := make(map[common.Hash]struct{})
+ seen[types.EmptyCodeHash] = struct{}{}
+ for _, acc := range c.state {
+ h := common.BytesToHash(acc.CodeHash)
+ if _, ok := seen[h]; ok {
+ continue
+ }
+ hashes = append(hashes, h)
+ seen[h] = struct{}{}
+ }
+ slices.SortFunc(hashes, (common.Hash).Cmp)
+ return hashes
}
// Len returns the length of the chain.
@@ -45,6 +136,11 @@ func (c *Chain) Len() int {
return len(c.blocks)
}
+// ForkID gets the fork id of the chain.
+func (c *Chain) ForkID() forkid.ID {
+ return forkid.NewID(c.config, c.blocks[0], uint64(c.Len()), c.blocks[c.Len()-1].Time())
+}
+
// TD calculates the total difficulty of the chain at the
// chain head.
func (c *Chain) TD() *big.Int {
@@ -55,19 +151,12 @@ func (c *Chain) TD() *big.Int {
return sum
}
-// TotalDifficultyAt calculates the total difficulty of the chain
-// at the given block height.
-func (c *Chain) TotalDifficultyAt(height int) *big.Int {
- sum := new(big.Int)
- if height >= c.Len() {
- return sum
- }
- for _, block := range c.blocks[:height+1] {
- sum.Add(sum, block.Difficulty())
- }
- return sum
+// GetBlock returns the block at the specified number.
+func (c *Chain) GetBlock(number int) *types.Block {
+ return c.blocks[number]
}
+// RootAt returns the state root for the block at the given height.
func (c *Chain) RootAt(height int) common.Hash {
if height < c.Len() {
return c.blocks[height].Root()
@@ -75,37 +164,56 @@ func (c *Chain) RootAt(height int) common.Hash {
return common.Hash{}
}
-// ForkID gets the fork id of the chain.
-func (c *Chain) ForkID() forkid.ID {
- return forkid.NewID(c.chainConfig, c.blocks[0], uint64(c.Len()), c.blocks[0].Time())
-}
-
-// Shorten returns a copy chain of a desired height from the imported
-func (c *Chain) Shorten(height int) *Chain {
- blocks := make([]*types.Block, height)
- copy(blocks, c.blocks[:height])
-
- config := *c.chainConfig
- return &Chain{
- blocks: blocks,
- chainConfig: &config,
+// GetSender returns the address associated with account at the index in the
+// pre-funded accounts list.
+func (c *Chain) GetSender(idx int) (common.Address, uint64) {
+ var accounts Addresses
+ for addr := range c.senders {
+ accounts = append(accounts, addr)
}
+ sort.Sort(accounts)
+ addr := accounts[idx]
+ return addr, c.senders[addr].Nonce
}
-// Head returns the chain head.
-func (c *Chain) Head() *types.Block {
- return c.blocks[c.Len()-1]
+// IncNonce increases the specified signing account's pending nonce.
+func (c *Chain) IncNonce(addr common.Address, amt uint64) {
+ if _, ok := c.senders[addr]; !ok {
+ panic("nonce increment for non-signer")
+ }
+ c.senders[addr].Nonce += amt
}
-func (c *Chain) GetHeaders(req *GetBlockHeaders) ([]*types.Header, error) {
+// Balance returns the balance of an account at the head of the chain.
+func (c *Chain) Balance(addr common.Address) *big.Int {
+ bal := new(big.Int)
+ if acc, ok := c.state[addr]; ok {
+ bal, _ = bal.SetString(acc.Balance, 10)
+ }
+ return bal
+}
+
+// SignTx signs a transaction for the specified from account, so long as that
+// account was in the hivechain accounts dump.
+func (c *Chain) SignTx(from common.Address, tx *types.Transaction) (*types.Transaction, error) {
+ signer := types.LatestSigner(c.config)
+ acc, ok := c.senders[from]
+ if !ok {
+ return nil, fmt.Errorf("account not available for signing: %s", from)
+ }
+ return types.SignTx(tx, signer, acc.Key)
+}
+
+// GetHeaders returns the headers base on an ethGetPacketHeadersPacket.
+func (c *Chain) GetHeaders(req *eth.GetBlockHeadersPacket) ([]*types.Header, error) {
if req.Amount < 1 {
return nil, errors.New("no block headers requested")
}
-
- headers := make([]*types.Header, req.Amount)
- var blockNumber uint64
-
- // range over blocks to check if our chain has the requested header
+ var (
+ headers = make([]*types.Header, req.Amount)
+ blockNumber uint64
+ )
+ // Range over blocks to check if our chain has the requested header.
for _, block := range c.blocks {
if block.Hash() == req.Origin.Hash || block.Number().Uint64() == req.Origin.Number {
headers[0] = block.Header()
@@ -115,40 +223,30 @@ func (c *Chain) GetHeaders(req *GetBlockHeaders) ([]*types.Header, error) {
if headers[0] == nil {
return nil, fmt.Errorf("no headers found for given origin number %v, hash %v", req.Origin.Number, req.Origin.Hash)
}
-
if req.Reverse {
for i := 1; i < int(req.Amount); i++ {
blockNumber -= (1 - req.Skip)
headers[i] = c.blocks[blockNumber].Header()
}
-
return headers, nil
}
-
for i := 1; i < int(req.Amount); i++ {
blockNumber += (1 + req.Skip)
headers[i] = c.blocks[blockNumber].Header()
}
-
return headers, nil
}
-// loadChain takes the given chain.rlp file, and decodes and returns
-// the blocks from the file.
-func loadChain(chainfile string, genesis string) (*Chain, error) {
- gen, err := loadGenesis(genesis)
- if err != nil {
- return nil, err
- }
- gblock := gen.ToBlock()
+// Shorten returns a copy chain of a desired height from the imported
+func (c *Chain) Shorten(height int) *Chain {
+ blocks := make([]*types.Block, height)
+ copy(blocks, c.blocks[:height])
- blocks, err := blocksFromFile(chainfile, gblock)
- if err != nil {
- return nil, err
+ config := *c.config
+ return &Chain{
+ blocks: blocks,
+ config: &config,
}
-
- c := &Chain{genesis: gen, blocks: blocks, chainConfig: gen.Config}
- return c, nil
}
func loadGenesis(genesisFile string) (core.Genesis, error) {
@@ -163,6 +261,22 @@ func loadGenesis(genesisFile string) (core.Genesis, error) {
return gen, nil
}
+type Addresses []common.Address
+
+func (a Addresses) Len() int {
+ return len(a)
+}
+
+func (a Addresses) Less(i, j int) bool {
+ return bytes.Compare(a[i][:], a[j][:]) < 0
+}
+
+func (a Addresses) Swap(i, j int) {
+ tmp := a[i]
+ a[i] = a[j]
+ a[j] = tmp
+}
+
func blocksFromFile(chainfile string, gblock *types.Block) ([]*types.Block, error) {
// Load chain.rlp.
fh, err := os.Open(chainfile)
@@ -193,3 +307,47 @@ func blocksFromFile(chainfile string, gblock *types.Block) ([]*types.Block, erro
}
return blocks, nil
}
+
+func readState(file string) (map[common.Address]state.DumpAccount, error) {
+ f, err := os.ReadFile(file)
+ if err != nil {
+ return nil, fmt.Errorf("unable to read state: %v", err)
+ }
+ var dump state.Dump
+ if err := json.Unmarshal(f, &dump); err != nil {
+ return nil, fmt.Errorf("unable to unmarshal state: %v", err)
+ }
+
+ state := make(map[common.Address]state.DumpAccount)
+ for key, acct := range dump.Accounts {
+ var addr common.Address
+ if err := addr.UnmarshalText([]byte(key)); err != nil {
+ return nil, fmt.Errorf("invalid address %q", key)
+ }
+ state[addr] = acct
+ }
+ return state, nil
+}
+
+func readAccounts(file string) (map[common.Address]*senderInfo, error) {
+ f, err := os.ReadFile(file)
+ if err != nil {
+ return nil, fmt.Errorf("unable to read state: %v", err)
+ }
+ type account struct {
+ Key hexutil.Bytes `json:"key"`
+ }
+ keys := make(map[common.Address]account)
+ if err := json.Unmarshal(f, &keys); err != nil {
+ return nil, fmt.Errorf("unable to unmarshal accounts: %v", err)
+ }
+ accounts := make(map[common.Address]*senderInfo)
+ for addr, acc := range keys {
+ pk, err := crypto.HexToECDSA(common.Bytes2Hex(acc.Key))
+ if err != nil {
+ return nil, fmt.Errorf("unable to read private key for %s: %v", err, addr)
+ }
+ accounts[addr] = &senderInfo{Key: pk, Nonce: 0}
+ }
+ return accounts, nil
+}
diff --git a/cmd/devp2p/internal/ethtest/chain_test.go b/cmd/devp2p/internal/ethtest/chain_test.go
index a3c7187f5d..62bd6d26ea 100644
--- a/cmd/devp2p/internal/ethtest/chain_test.go
+++ b/cmd/devp2p/internal/ethtest/chain_test.go
@@ -123,30 +123,26 @@ func TestEthProtocolNegotiation(t *testing.T) {
}
}
-// TestChain_GetHeaders tests whether the test suite can correctly
+// TestChainGetHeaders tests whether the test suite can correctly
// respond to a GetBlockHeaders request from a node.
-func TestChain_GetHeaders(t *testing.T) {
+func TestChainGetHeaders(t *testing.T) {
t.Parallel()
- chainFile, err := filepath.Abs("./testdata/chain.rlp")
- if err != nil {
- t.Fatal(err)
- }
- genesisFile, err := filepath.Abs("./testdata/genesis.json")
- if err != nil {
- t.Fatal(err)
- }
- chain, err := loadChain(chainFile, genesisFile)
+ dir, err := filepath.Abs("./testdata")
+ if err != nil {
+ t.Fatal(err)
+ }
+ chain, err := NewChain(dir)
if err != nil {
t.Fatal(err)
}
var tests = []struct {
- req GetBlockHeaders
+ req eth.GetBlockHeadersPacket
expected []*types.Header
}{
{
- req: GetBlockHeaders{
+ req: eth.GetBlockHeadersPacket{
GetBlockHeadersRequest: ð.GetBlockHeadersRequest{
Origin: eth.HashOrNumber{Number: uint64(2)},
Amount: uint64(5),
@@ -163,7 +159,7 @@ func TestChain_GetHeaders(t *testing.T) {
},
},
{
- req: GetBlockHeaders{
+ req: eth.GetBlockHeadersPacket{
GetBlockHeadersRequest: ð.GetBlockHeadersRequest{
Origin: eth.HashOrNumber{Number: uint64(chain.Len() - 1)},
Amount: uint64(3),
@@ -178,7 +174,7 @@ func TestChain_GetHeaders(t *testing.T) {
},
},
{
- req: GetBlockHeaders{
+ req: eth.GetBlockHeadersPacket{
GetBlockHeadersRequest: ð.GetBlockHeadersRequest{
Origin: eth.HashOrNumber{Hash: chain.Head().Hash()},
Amount: uint64(1),
diff --git a/cmd/devp2p/internal/ethtest/conn.go b/cmd/devp2p/internal/ethtest/conn.go
new file mode 100644
index 0000000000..2d36ccb423
--- /dev/null
+++ b/cmd/devp2p/internal/ethtest/conn.go
@@ -0,0 +1,361 @@
+// Copyright 2023 The go-ethereum Authors
+// This file is part of go-ethereum.
+//
+// go-ethereum is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// go-ethereum is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with go-ethereum. If not, see .
+
+package ethtest
+
+import (
+ "crypto/ecdsa"
+ "errors"
+ "fmt"
+ "net"
+ "reflect"
+ "time"
+
+ "github.com/davecgh/go-spew/spew"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/eth/protocols/eth"
+ "github.com/ethereum/go-ethereum/eth/protocols/snap"
+ "github.com/ethereum/go-ethereum/p2p"
+ "github.com/ethereum/go-ethereum/p2p/rlpx"
+ "github.com/ethereum/go-ethereum/rlp"
+)
+
+var (
+ pretty = spew.ConfigState{
+ Indent: " ",
+ DisableCapacities: true,
+ DisablePointerAddresses: true,
+ SortKeys: true,
+ }
+ timeout = 2 * time.Second
+)
+
+// dial attempts to dial the given node and perform a handshake, returning the
+// created Conn if successful.
+func (s *Suite) dial() (*Conn, error) {
+ key, _ := crypto.GenerateKey()
+ return s.dialAs(key)
+}
+
+// dialAs attempts to dial a given node and perform a handshake using the given
+// private key.
+func (s *Suite) dialAs(key *ecdsa.PrivateKey) (*Conn, error) {
+ fd, err := net.Dial("tcp", fmt.Sprintf("%v:%d", s.Dest.IP(), s.Dest.TCP()))
+ if err != nil {
+ return nil, err
+ }
+ conn := Conn{Conn: rlpx.NewConn(fd, s.Dest.Pubkey())}
+ conn.ourKey = key
+ _, err = conn.Handshake(conn.ourKey)
+ if err != nil {
+ conn.Close()
+ return nil, err
+ }
+ conn.caps = []p2p.Cap{
+ {Name: "eth", Version: 67},
+ {Name: "eth", Version: 68},
+ }
+ conn.ourHighestProtoVersion = 68
+ return &conn, nil
+}
+
+// dialSnap creates a connection with snap/1 capability.
+func (s *Suite) dialSnap() (*Conn, error) {
+ conn, err := s.dial()
+ if err != nil {
+ return nil, fmt.Errorf("dial failed: %v", err)
+ }
+ conn.caps = append(conn.caps, p2p.Cap{Name: "snap", Version: 1})
+ conn.ourHighestSnapProtoVersion = 1
+ return conn, nil
+}
+
+// Conn represents an individual connection with a peer
+type Conn struct {
+ *rlpx.Conn
+ ourKey *ecdsa.PrivateKey
+ negotiatedProtoVersion uint
+ negotiatedSnapProtoVersion uint
+ ourHighestProtoVersion uint
+ ourHighestSnapProtoVersion uint
+ caps []p2p.Cap
+}
+
+// Read reads a packet from the connection.
+func (c *Conn) Read() (uint64, []byte, error) {
+ c.SetReadDeadline(time.Now().Add(timeout))
+ code, data, _, err := c.Conn.Read()
+ if err != nil {
+ return 0, nil, err
+ }
+ return code, data, nil
+}
+
+// ReadMsg attempts to read a devp2p message with a specific code.
+func (c *Conn) ReadMsg(proto Proto, code uint64, msg any) error {
+ c.SetReadDeadline(time.Now().Add(timeout))
+ for {
+ got, data, err := c.Read()
+ if err != nil {
+ return err
+ }
+ if protoOffset(proto)+code == got {
+ return rlp.DecodeBytes(data, msg)
+ }
+ }
+}
+
+// Write writes a eth packet to the connection.
+func (c *Conn) Write(proto Proto, code uint64, msg any) error {
+ c.SetWriteDeadline(time.Now().Add(timeout))
+ payload, err := rlp.EncodeToBytes(msg)
+ if err != nil {
+ return err
+ }
+ _, err = c.Conn.Write(protoOffset(proto)+code, payload)
+ return err
+}
+
+// ReadEth reads an Eth sub-protocol wire message.
+func (c *Conn) ReadEth() (any, error) {
+ c.SetReadDeadline(time.Now().Add(timeout))
+ for {
+ code, data, _, err := c.Conn.Read()
+ if err != nil {
+ return nil, err
+ }
+ if code == pingMsg {
+ c.Write(baseProto, pongMsg, []byte{})
+ continue
+ }
+ if getProto(code) != ethProto {
+ // Read until eth message.
+ continue
+ }
+ code -= baseProtoLen
+
+ var msg any
+ switch int(code) {
+ case eth.StatusMsg:
+ msg = new(eth.StatusPacket)
+ case eth.GetBlockHeadersMsg:
+ msg = new(eth.GetBlockHeadersPacket)
+ case eth.BlockHeadersMsg:
+ msg = new(eth.BlockHeadersPacket)
+ case eth.GetBlockBodiesMsg:
+ msg = new(eth.GetBlockBodiesPacket)
+ case eth.BlockBodiesMsg:
+ msg = new(eth.BlockBodiesPacket)
+ case eth.NewBlockMsg:
+ msg = new(eth.NewBlockPacket)
+ case eth.NewBlockHashesMsg:
+ msg = new(eth.NewBlockHashesPacket)
+ case eth.TransactionsMsg:
+ msg = new(eth.TransactionsPacket)
+ case eth.NewPooledTransactionHashesMsg:
+ msg = new(eth.NewPooledTransactionHashesPacket68)
+ case eth.GetPooledTransactionsMsg:
+ msg = new(eth.GetPooledTransactionsPacket)
+ case eth.PooledTransactionsMsg:
+ msg = new(eth.PooledTransactionsPacket)
+ default:
+ panic(fmt.Sprintf("unhandled eth msg code %d", code))
+ }
+ if err := rlp.DecodeBytes(data, msg); err != nil {
+ return nil, fmt.Errorf("unable to decode eth msg: %v", err)
+ }
+ return msg, nil
+ }
+}
+
+// ReadSnap reads a snap/1 response with the given id from the connection.
+func (c *Conn) ReadSnap() (any, error) {
+ c.SetReadDeadline(time.Now().Add(timeout))
+ for {
+ code, data, _, err := c.Conn.Read()
+ if err != nil {
+ return nil, err
+ }
+ if getProto(code) != snapProto {
+ // Read until snap message.
+ continue
+ }
+ code -= baseProtoLen + ethProtoLen
+
+ var msg any
+ switch int(code) {
+ case snap.GetAccountRangeMsg:
+ msg = new(snap.GetAccountRangePacket)
+ case snap.AccountRangeMsg:
+ msg = new(snap.AccountRangePacket)
+ case snap.GetStorageRangesMsg:
+ msg = new(snap.GetStorageRangesPacket)
+ case snap.StorageRangesMsg:
+ msg = new(snap.StorageRangesPacket)
+ case snap.GetByteCodesMsg:
+ msg = new(snap.GetByteCodesPacket)
+ case snap.ByteCodesMsg:
+ msg = new(snap.ByteCodesPacket)
+ case snap.GetTrieNodesMsg:
+ msg = new(snap.GetTrieNodesPacket)
+ case snap.TrieNodesMsg:
+ msg = new(snap.TrieNodesPacket)
+ default:
+ panic(fmt.Errorf("unhandled snap code: %d", code))
+ }
+ if err := rlp.DecodeBytes(data, msg); err != nil {
+ return nil, fmt.Errorf("could not rlp decode message: %v", err)
+ }
+ return msg, nil
+ }
+}
+
+// peer performs both the protocol handshake and the status message
+// exchange with the node in order to peer with it.
+func (c *Conn) peer(chain *Chain, status *eth.StatusPacket) error {
+ if err := c.handshake(); err != nil {
+ return fmt.Errorf("handshake failed: %v", err)
+ }
+ if err := c.statusExchange(chain, status); err != nil {
+ return fmt.Errorf("status exchange failed: %v", err)
+ }
+ return nil
+}
+
+// handshake performs a protocol handshake with the node.
+func (c *Conn) handshake() error {
+ // Write hello to client.
+ pub0 := crypto.FromECDSAPub(&c.ourKey.PublicKey)[1:]
+ ourHandshake := &protoHandshake{
+ Version: 5,
+ Caps: c.caps,
+ ID: pub0,
+ }
+ if err := c.Write(baseProto, handshakeMsg, ourHandshake); err != nil {
+ return fmt.Errorf("write to connection failed: %v", err)
+ }
+ // Read hello from client.
+ code, data, err := c.Read()
+ if err != nil {
+ return fmt.Errorf("erroring reading handshake: %v", err)
+ }
+ switch code {
+ case handshakeMsg:
+ msg := new(protoHandshake)
+ if err := rlp.DecodeBytes(data, &msg); err != nil {
+ return fmt.Errorf("error decoding handshake msg: %v", err)
+ }
+ // Set snappy if version is at least 5.
+ if msg.Version >= 5 {
+ c.SetSnappy(true)
+ }
+ c.negotiateEthProtocol(msg.Caps)
+ if c.negotiatedProtoVersion == 0 {
+ return fmt.Errorf("could not negotiate eth protocol (remote caps: %v, local eth version: %v)", msg.Caps, c.ourHighestProtoVersion)
+ }
+ // If we require snap, verify that it was negotiated.
+ if c.ourHighestSnapProtoVersion != c.negotiatedSnapProtoVersion {
+ return fmt.Errorf("could not negotiate snap protocol (remote caps: %v, local snap version: %v)", msg.Caps, c.ourHighestSnapProtoVersion)
+ }
+ return nil
+ default:
+ return fmt.Errorf("bad handshake: got msg code %d", code)
+ }
+}
+
+// negotiateEthProtocol sets the Conn's eth protocol version to highest
+// advertised capability from peer.
+func (c *Conn) negotiateEthProtocol(caps []p2p.Cap) {
+ var highestEthVersion uint
+ var highestSnapVersion uint
+ for _, capability := range caps {
+ switch capability.Name {
+ case "eth":
+ if capability.Version > highestEthVersion && capability.Version <= c.ourHighestProtoVersion {
+ highestEthVersion = capability.Version
+ }
+ case "snap":
+ if capability.Version > highestSnapVersion && capability.Version <= c.ourHighestSnapProtoVersion {
+ highestSnapVersion = capability.Version
+ }
+ }
+ }
+ c.negotiatedProtoVersion = highestEthVersion
+ c.negotiatedSnapProtoVersion = highestSnapVersion
+}
+
+// statusExchange performs a `Status` message exchange with the given node.
+func (c *Conn) statusExchange(chain *Chain, status *eth.StatusPacket) error {
+loop:
+ for {
+ code, data, err := c.Read()
+ if err != nil {
+ return fmt.Errorf("failed to read from connection: %w", err)
+ }
+ switch code {
+ case eth.StatusMsg + protoOffset(ethProto):
+ msg := new(eth.StatusPacket)
+ if err := rlp.DecodeBytes(data, &msg); err != nil {
+ return fmt.Errorf("error decoding status packet: %w", err)
+ }
+ if have, want := msg.Head, chain.blocks[chain.Len()-1].Hash(); have != want {
+ return fmt.Errorf("wrong head block in status, want: %#x (block %d) have %#x",
+ want, chain.blocks[chain.Len()-1].NumberU64(), have)
+ }
+ if have, want := msg.TD.Cmp(chain.TD()), 0; have != want {
+ return fmt.Errorf("wrong TD in status: have %v want %v", have, want)
+ }
+ if have, want := msg.ForkID, chain.ForkID(); !reflect.DeepEqual(have, want) {
+ return fmt.Errorf("wrong fork ID in status: have %v, want %v", have, want)
+ }
+ if have, want := msg.ProtocolVersion, c.ourHighestProtoVersion; have != uint32(want) {
+ return fmt.Errorf("wrong protocol version: have %v, want %v", have, want)
+ }
+ break loop
+ case discMsg:
+ var msg []p2p.DiscReason
+ if rlp.DecodeBytes(data, &msg); len(msg) == 0 {
+ return errors.New("invalid disconnect message")
+ }
+ return fmt.Errorf("disconnect received: %v", pretty.Sdump(msg))
+ case pingMsg:
+ // TODO (renaynay): in the future, this should be an error
+ // (PINGs should not be a response upon fresh connection)
+ c.Write(baseProto, pongMsg, nil)
+ default:
+ return fmt.Errorf("bad status message: code %d", code)
+ }
+ }
+ // make sure eth protocol version is set for negotiation
+ if c.negotiatedProtoVersion == 0 {
+ return errors.New("eth protocol version must be set in Conn")
+ }
+ if status == nil {
+ // default status message
+ status = ð.StatusPacket{
+ ProtocolVersion: uint32(c.negotiatedProtoVersion),
+ NetworkID: chain.config.ChainID.Uint64(),
+ TD: chain.TD(),
+ Head: chain.blocks[chain.Len()-1].Hash(),
+ Genesis: chain.blocks[0].Hash(),
+ ForkID: chain.ForkID(),
+ }
+ }
+ if err := c.Write(ethProto, eth.StatusMsg, status); err != nil {
+ return fmt.Errorf("write to connection failed: %v", err)
+ }
+ return nil
+}
diff --git a/cmd/devp2p/internal/ethtest/engine.go b/cmd/devp2p/internal/ethtest/engine.go
new file mode 100644
index 0000000000..ea4fc76e6f
--- /dev/null
+++ b/cmd/devp2p/internal/ethtest/engine.go
@@ -0,0 +1,69 @@
+// Copyright 2023 The go-ethereum Authors
+// This file is part of go-ethereum.
+//
+// go-ethereum is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// go-ethereum is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with go-ethereum. If not, see .
+
+package ethtest
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "net/http"
+ "os"
+ "path"
+ "time"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/golang-jwt/jwt/v4"
+)
+
+// EngineClient is a wrapper around engine-related data.
+type EngineClient struct {
+ url string
+ jwt [32]byte
+ headfcu []byte
+}
+
+// NewEngineClient creates a new engine client.
+func NewEngineClient(dir, url, jwt string) (*EngineClient, error) {
+ headfcu, err := os.ReadFile(path.Join(dir, "headfcu.json"))
+ if err != nil {
+ return nil, fmt.Errorf("failed to read headfcu: %w", err)
+ }
+ return &EngineClient{url, common.HexToHash(jwt), headfcu}, nil
+}
+
+// token returns the jwt claim token for authorization.
+func (ec *EngineClient) token() string {
+ claims := jwt.RegisteredClaims{IssuedAt: jwt.NewNumericDate(time.Now())}
+ token, _ := jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString(ec.jwt[:])
+ return token
+}
+
+// sendForkchoiceUpdated sends an fcu for the head of the generated chain.
+func (ec *EngineClient) sendForkchoiceUpdated() error {
+ var (
+ req, _ = http.NewRequest(http.MethodPost, ec.url, io.NopCloser(bytes.NewReader(ec.headfcu)))
+ header = make(http.Header)
+ )
+ // Set header
+ header.Set("accept", "application/json")
+ header.Set("content-type", "application/json")
+ header.Set("Authorization", fmt.Sprintf("Bearer %v", ec.token()))
+ req.Header = header
+
+ _, err := new(http.Client).Do(req)
+ return err
+}
diff --git a/cmd/devp2p/internal/ethtest/helpers.go b/cmd/devp2p/internal/ethtest/helpers.go
deleted file mode 100644
index a0339b88cb..0000000000
--- a/cmd/devp2p/internal/ethtest/helpers.go
+++ /dev/null
@@ -1,650 +0,0 @@
-// Copyright 2021 The go-ethereum Authors
-// This file is part of go-ethereum.
-//
-// go-ethereum is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// go-ethereum is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with go-ethereum. If not, see .
-
-package ethtest
-
-import (
- "errors"
- "fmt"
- "net"
- "reflect"
- "strings"
- "time"
-
- "github.com/davecgh/go-spew/spew"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/crypto"
- "github.com/ethereum/go-ethereum/eth/protocols/eth"
- "github.com/ethereum/go-ethereum/internal/utesting"
- "github.com/ethereum/go-ethereum/p2p"
- "github.com/ethereum/go-ethereum/p2p/rlpx"
-)
-
-var (
- pretty = spew.ConfigState{
- Indent: " ",
- DisableCapacities: true,
- DisablePointerAddresses: true,
- SortKeys: true,
- }
- timeout = 20 * time.Second
-)
-
-// dial attempts to dial the given node and perform a handshake,
-// returning the created Conn if successful.
-func (s *Suite) dial() (*Conn, error) {
- // dial
- fd, err := net.Dial("tcp", fmt.Sprintf("%v:%d", s.Dest.IP(), s.Dest.TCP()))
- if err != nil {
- return nil, err
- }
- conn := Conn{Conn: rlpx.NewConn(fd, s.Dest.Pubkey())}
- // do encHandshake
- conn.ourKey, _ = crypto.GenerateKey()
- _, err = conn.Handshake(conn.ourKey)
- if err != nil {
- conn.Close()
- return nil, err
- }
- // set default p2p capabilities
- conn.caps = []p2p.Cap{
- {Name: "eth", Version: 67},
- {Name: "eth", Version: 68},
- }
- conn.ourHighestProtoVersion = 68
- return &conn, nil
-}
-
-// dialSnap creates a connection with snap/1 capability.
-func (s *Suite) dialSnap() (*Conn, error) {
- conn, err := s.dial()
- if err != nil {
- return nil, fmt.Errorf("dial failed: %v", err)
- }
- conn.caps = append(conn.caps, p2p.Cap{Name: "snap", Version: 1})
- conn.ourHighestSnapProtoVersion = 1
- return conn, nil
-}
-
-// peer performs both the protocol handshake and the status message
-// exchange with the node in order to peer with it.
-func (c *Conn) peer(chain *Chain, status *Status) error {
- if err := c.handshake(); err != nil {
- return fmt.Errorf("handshake failed: %v", err)
- }
- if _, err := c.statusExchange(chain, status); err != nil {
- return fmt.Errorf("status exchange failed: %v", err)
- }
- return nil
-}
-
-// handshake performs a protocol handshake with the node.
-func (c *Conn) handshake() error {
- defer c.SetDeadline(time.Time{})
- c.SetDeadline(time.Now().Add(10 * time.Second))
- // write hello to client
- pub0 := crypto.FromECDSAPub(&c.ourKey.PublicKey)[1:]
- ourHandshake := &Hello{
- Version: 5,
- Caps: c.caps,
- ID: pub0,
- }
- if err := c.Write(ourHandshake); err != nil {
- return fmt.Errorf("write to connection failed: %v", err)
- }
- // read hello from client
- switch msg := c.Read().(type) {
- case *Hello:
- // set snappy if version is at least 5
- if msg.Version >= 5 {
- c.SetSnappy(true)
- }
- c.negotiateEthProtocol(msg.Caps)
- if c.negotiatedProtoVersion == 0 {
- return fmt.Errorf("could not negotiate eth protocol (remote caps: %v, local eth version: %v)", msg.Caps, c.ourHighestProtoVersion)
- }
- // If we require snap, verify that it was negotiated
- if c.ourHighestSnapProtoVersion != c.negotiatedSnapProtoVersion {
- return fmt.Errorf("could not negotiate snap protocol (remote caps: %v, local snap version: %v)", msg.Caps, c.ourHighestSnapProtoVersion)
- }
- return nil
- default:
- return fmt.Errorf("bad handshake: %#v", msg)
- }
-}
-
-// negotiateEthProtocol sets the Conn's eth protocol version to highest
-// advertised capability from peer.
-func (c *Conn) negotiateEthProtocol(caps []p2p.Cap) {
- var highestEthVersion uint
- var highestSnapVersion uint
- for _, capability := range caps {
- switch capability.Name {
- case "eth":
- if capability.Version > highestEthVersion && capability.Version <= c.ourHighestProtoVersion {
- highestEthVersion = capability.Version
- }
- case "snap":
- if capability.Version > highestSnapVersion && capability.Version <= c.ourHighestSnapProtoVersion {
- highestSnapVersion = capability.Version
- }
- }
- }
- c.negotiatedProtoVersion = highestEthVersion
- c.negotiatedSnapProtoVersion = highestSnapVersion
-}
-
-// statusExchange performs a `Status` message exchange with the given node.
-func (c *Conn) statusExchange(chain *Chain, status *Status) (Message, error) {
- defer c.SetDeadline(time.Time{})
- c.SetDeadline(time.Now().Add(20 * time.Second))
-
- // read status message from client
- var message Message
-loop:
- for {
- switch msg := c.Read().(type) {
- case *Status:
- if have, want := msg.Head, chain.blocks[chain.Len()-1].Hash(); have != want {
- return nil, fmt.Errorf("wrong head block in status, want: %#x (block %d) have %#x",
- want, chain.blocks[chain.Len()-1].NumberU64(), have)
- }
- if have, want := msg.TD.Cmp(chain.TD()), 0; have != want {
- return nil, fmt.Errorf("wrong TD in status: have %v want %v", have, want)
- }
- if have, want := msg.ForkID, chain.ForkID(); !reflect.DeepEqual(have, want) {
- return nil, fmt.Errorf("wrong fork ID in status: have %v, want %v", have, want)
- }
- if have, want := msg.ProtocolVersion, c.ourHighestProtoVersion; have != uint32(want) {
- return nil, fmt.Errorf("wrong protocol version: have %v, want %v", have, want)
- }
- message = msg
- break loop
- case *Disconnect:
- return nil, fmt.Errorf("disconnect received: %v", msg.Reason)
- case *Ping:
- c.Write(&Pong{}) // TODO (renaynay): in the future, this should be an error
- // (PINGs should not be a response upon fresh connection)
- default:
- return nil, fmt.Errorf("bad status message: %s", pretty.Sdump(msg))
- }
- }
- // make sure eth protocol version is set for negotiation
- if c.negotiatedProtoVersion == 0 {
- return nil, errors.New("eth protocol version must be set in Conn")
- }
- if status == nil {
- // default status message
- status = &Status{
- ProtocolVersion: uint32(c.negotiatedProtoVersion),
- NetworkID: chain.chainConfig.ChainID.Uint64(),
- TD: chain.TD(),
- Head: chain.blocks[chain.Len()-1].Hash(),
- Genesis: chain.blocks[0].Hash(),
- ForkID: chain.ForkID(),
- }
- }
- if err := c.Write(status); err != nil {
- return nil, fmt.Errorf("write to connection failed: %v", err)
- }
- return message, nil
-}
-
-// createSendAndRecvConns creates two connections, one for sending messages to the
-// node, and one for receiving messages from the node.
-func (s *Suite) createSendAndRecvConns() (*Conn, *Conn, error) {
- sendConn, err := s.dial()
- if err != nil {
- return nil, nil, fmt.Errorf("dial failed: %v", err)
- }
- recvConn, err := s.dial()
- if err != nil {
- sendConn.Close()
- return nil, nil, fmt.Errorf("dial failed: %v", err)
- }
- return sendConn, recvConn, nil
-}
-
-// readAndServe serves GetBlockHeaders requests while waiting
-// on another message from the node.
-func (c *Conn) readAndServe(chain *Chain, timeout time.Duration) Message {
- start := time.Now()
- for time.Since(start) < timeout {
- c.SetReadDeadline(time.Now().Add(10 * time.Second))
-
- msg := c.Read()
- switch msg := msg.(type) {
- case *Ping:
- c.Write(&Pong{})
- case *GetBlockHeaders:
- headers, err := chain.GetHeaders(msg)
- if err != nil {
- return errorf("could not get headers for inbound header request: %v", err)
- }
- resp := &BlockHeaders{
- RequestId: msg.ReqID(),
- BlockHeadersRequest: eth.BlockHeadersRequest(headers),
- }
- if err := c.Write(resp); err != nil {
- return errorf("could not write to connection: %v", err)
- }
- default:
- return msg
- }
- }
- return errorf("no message received within %v", timeout)
-}
-
-// headersRequest executes the given `GetBlockHeaders` request.
-func (c *Conn) headersRequest(request *GetBlockHeaders, chain *Chain, reqID uint64) ([]*types.Header, error) {
- defer c.SetReadDeadline(time.Time{})
- c.SetReadDeadline(time.Now().Add(20 * time.Second))
-
- // write request
- request.RequestId = reqID
- if err := c.Write(request); err != nil {
- return nil, fmt.Errorf("could not write to connection: %v", err)
- }
-
- // wait for response
- msg := c.waitForResponse(chain, timeout, request.RequestId)
- resp, ok := msg.(*BlockHeaders)
- if !ok {
- return nil, fmt.Errorf("unexpected message received: %s", pretty.Sdump(msg))
- }
- headers := []*types.Header(resp.BlockHeadersRequest)
- return headers, nil
-}
-
-func (c *Conn) snapRequest(msg Message, id uint64, chain *Chain) (Message, error) {
- defer c.SetReadDeadline(time.Time{})
- c.SetReadDeadline(time.Now().Add(5 * time.Second))
- if err := c.Write(msg); err != nil {
- return nil, fmt.Errorf("could not write to connection: %v", err)
- }
- return c.ReadSnap(id)
-}
-
-// headersMatch returns whether the received headers match the given request
-func headersMatch(expected []*types.Header, headers []*types.Header) bool {
- return reflect.DeepEqual(expected, headers)
-}
-
-// waitForResponse reads from the connection until a response with the expected
-// request ID is received.
-func (c *Conn) waitForResponse(chain *Chain, timeout time.Duration, requestID uint64) Message {
- for {
- msg := c.readAndServe(chain, timeout)
- if msg.ReqID() == requestID {
- return msg
- }
- }
-}
-
-// sendNextBlock broadcasts the next block in the chain and waits
-// for the node to propagate the block and import it into its chain.
-func (s *Suite) sendNextBlock() error {
- // set up sending and receiving connections
- sendConn, recvConn, err := s.createSendAndRecvConns()
- if err != nil {
- return err
- }
- defer sendConn.Close()
- defer recvConn.Close()
- if err = sendConn.peer(s.chain, nil); err != nil {
- return fmt.Errorf("peering failed: %v", err)
- }
- if err = recvConn.peer(s.chain, nil); err != nil {
- return fmt.Errorf("peering failed: %v", err)
- }
- // create new block announcement
- nextBlock := s.fullChain.blocks[s.chain.Len()]
- blockAnnouncement := &NewBlock{
- Block: nextBlock,
- TD: s.fullChain.TotalDifficultyAt(s.chain.Len()),
- }
- // send announcement and wait for node to request the header
- if err = s.testAnnounce(sendConn, recvConn, blockAnnouncement); err != nil {
- return fmt.Errorf("failed to announce block: %v", err)
- }
- // wait for client to update its chain
- if err = s.waitForBlockImport(recvConn, nextBlock); err != nil {
- return fmt.Errorf("failed to receive confirmation of block import: %v", err)
- }
- // update test suite chain
- s.chain.blocks = append(s.chain.blocks, nextBlock)
- return nil
-}
-
-// testAnnounce writes a block announcement to the node and waits for the node
-// to propagate it.
-func (s *Suite) testAnnounce(sendConn, receiveConn *Conn, blockAnnouncement *NewBlock) error {
- if err := sendConn.Write(blockAnnouncement); err != nil {
- return fmt.Errorf("could not write to connection: %v", err)
- }
- return s.waitAnnounce(receiveConn, blockAnnouncement)
-}
-
-// waitAnnounce waits for a NewBlock or NewBlockHashes announcement from the node.
-func (s *Suite) waitAnnounce(conn *Conn, blockAnnouncement *NewBlock) error {
- for {
- switch msg := conn.readAndServe(s.chain, timeout).(type) {
- case *NewBlock:
- if !reflect.DeepEqual(blockAnnouncement.Block.Header(), msg.Block.Header()) {
- return fmt.Errorf("wrong header in block announcement: \nexpected %v "+
- "\ngot %v", blockAnnouncement.Block.Header(), msg.Block.Header())
- }
- if !reflect.DeepEqual(blockAnnouncement.TD, msg.TD) {
- return fmt.Errorf("wrong TD in announcement: expected %v, got %v", blockAnnouncement.TD, msg.TD)
- }
- return nil
- case *NewBlockHashes:
- hashes := *msg
- if blockAnnouncement.Block.Hash() != hashes[0].Hash {
- return fmt.Errorf("wrong block hash in announcement: expected %v, got %v", blockAnnouncement.Block.Hash(), hashes[0].Hash)
- }
- return nil
-
- // ignore tx announcements from previous tests
- case *NewPooledTransactionHashes66:
- continue
- case *NewPooledTransactionHashes:
- continue
- case *Transactions:
- continue
-
- default:
- return fmt.Errorf("unexpected: %s", pretty.Sdump(msg))
- }
- }
-}
-
-func (s *Suite) waitForBlockImport(conn *Conn, block *types.Block) error {
- defer conn.SetReadDeadline(time.Time{})
- conn.SetReadDeadline(time.Now().Add(20 * time.Second))
- // create request
- req := &GetBlockHeaders{
- GetBlockHeadersRequest: ð.GetBlockHeadersRequest{
- Origin: eth.HashOrNumber{Hash: block.Hash()},
- Amount: 1,
- },
- }
-
- // loop until BlockHeaders response contains desired block, confirming the
- // node imported the block
- for {
- requestID := uint64(54)
- headers, err := conn.headersRequest(req, s.chain, requestID)
- if err != nil {
- return fmt.Errorf("GetBlockHeader request failed: %v", err)
- }
- // if headers response is empty, node hasn't imported block yet, try again
- if len(headers) == 0 {
- time.Sleep(100 * time.Millisecond)
- continue
- }
- if !reflect.DeepEqual(block.Header(), headers[0]) {
- return fmt.Errorf("wrong header returned: wanted %v, got %v", block.Header(), headers[0])
- }
- return nil
- }
-}
-
-func (s *Suite) oldAnnounce() error {
- sendConn, receiveConn, err := s.createSendAndRecvConns()
- if err != nil {
- return err
- }
- defer sendConn.Close()
- defer receiveConn.Close()
- if err := sendConn.peer(s.chain, nil); err != nil {
- return fmt.Errorf("peering failed: %v", err)
- }
- if err := receiveConn.peer(s.chain, nil); err != nil {
- return fmt.Errorf("peering failed: %v", err)
- }
- // create old block announcement
- oldBlockAnnounce := &NewBlock{
- Block: s.chain.blocks[len(s.chain.blocks)/2],
- TD: s.chain.blocks[len(s.chain.blocks)/2].Difficulty(),
- }
- if err := sendConn.Write(oldBlockAnnounce); err != nil {
- return fmt.Errorf("could not write to connection: %v", err)
- }
- // wait to see if the announcement is propagated
- switch msg := receiveConn.readAndServe(s.chain, time.Second*8).(type) {
- case *NewBlock:
- block := *msg
- if block.Block.Hash() == oldBlockAnnounce.Block.Hash() {
- return fmt.Errorf("unexpected: block propagated: %s", pretty.Sdump(msg))
- }
- case *NewBlockHashes:
- hashes := *msg
- for _, hash := range hashes {
- if hash.Hash == oldBlockAnnounce.Block.Hash() {
- return fmt.Errorf("unexpected: block announced: %s", pretty.Sdump(msg))
- }
- }
- case *Error:
- errMsg := *msg
- // check to make sure error is timeout (propagation didn't come through == test successful)
- if !strings.Contains(errMsg.String(), "timeout") {
- return fmt.Errorf("unexpected error: %v", pretty.Sdump(msg))
- }
- default:
- return fmt.Errorf("unexpected: %s", pretty.Sdump(msg))
- }
- return nil
-}
-
-func (s *Suite) maliciousHandshakes(t *utesting.T) error {
- conn, err := s.dial()
- if err != nil {
- return fmt.Errorf("dial failed: %v", err)
- }
- defer conn.Close()
-
- // write hello to client
- pub0 := crypto.FromECDSAPub(&conn.ourKey.PublicKey)[1:]
- handshakes := []*Hello{
- {
- Version: 5,
- Caps: []p2p.Cap{
- {Name: largeString(2), Version: 64},
- },
- ID: pub0,
- },
- {
- Version: 5,
- Caps: []p2p.Cap{
- {Name: "eth", Version: 64},
- {Name: "eth", Version: 65},
- },
- ID: append(pub0, byte(0)),
- },
- {
- Version: 5,
- Caps: []p2p.Cap{
- {Name: "eth", Version: 64},
- {Name: "eth", Version: 65},
- },
- ID: append(pub0, pub0...),
- },
- {
- Version: 5,
- Caps: []p2p.Cap{
- {Name: "eth", Version: 64},
- {Name: "eth", Version: 65},
- },
- ID: largeBuffer(2),
- },
- {
- Version: 5,
- Caps: []p2p.Cap{
- {Name: largeString(2), Version: 64},
- },
- ID: largeBuffer(2),
- },
- }
- for i, handshake := range handshakes {
- t.Logf("Testing malicious handshake %v\n", i)
- if err := conn.Write(handshake); err != nil {
- return fmt.Errorf("could not write to connection: %v", err)
- }
- // check that the peer disconnected
- for i := 0; i < 2; i++ {
- switch msg := conn.readAndServe(s.chain, 20*time.Second).(type) {
- case *Disconnect:
- case *Error:
- case *Hello:
- // Discard one hello as Hello's are sent concurrently
- continue
- default:
- return fmt.Errorf("unexpected: %s", pretty.Sdump(msg))
- }
- }
- // dial for the next round
- conn, err = s.dial()
- if err != nil {
- return fmt.Errorf("dial failed: %v", err)
- }
- }
- return nil
-}
-
-func (s *Suite) maliciousStatus(conn *Conn) error {
- if err := conn.handshake(); err != nil {
- return fmt.Errorf("handshake failed: %v", err)
- }
- status := &Status{
- ProtocolVersion: uint32(conn.negotiatedProtoVersion),
- NetworkID: s.chain.chainConfig.ChainID.Uint64(),
- TD: largeNumber(2),
- Head: s.chain.blocks[s.chain.Len()-1].Hash(),
- Genesis: s.chain.blocks[0].Hash(),
- ForkID: s.chain.ForkID(),
- }
-
- // get status
- msg, err := conn.statusExchange(s.chain, status)
- if err != nil {
- return fmt.Errorf("status exchange failed: %v", err)
- }
- switch msg := msg.(type) {
- case *Status:
- default:
- return fmt.Errorf("expected status, got: %#v ", msg)
- }
-
- // wait for disconnect
- switch msg := conn.readAndServe(s.chain, timeout).(type) {
- case *Disconnect:
- return nil
- case *Error:
- return nil
- default:
- return fmt.Errorf("expected disconnect, got: %s", pretty.Sdump(msg))
- }
-}
-
-func (s *Suite) hashAnnounce() error {
- // create connections
- sendConn, recvConn, err := s.createSendAndRecvConns()
- if err != nil {
- return fmt.Errorf("failed to create connections: %v", err)
- }
- defer sendConn.Close()
- defer recvConn.Close()
- if err := sendConn.peer(s.chain, nil); err != nil {
- return fmt.Errorf("peering failed: %v", err)
- }
- if err := recvConn.peer(s.chain, nil); err != nil {
- return fmt.Errorf("peering failed: %v", err)
- }
-
- // create NewBlockHashes announcement
- type anno struct {
- Hash common.Hash // Hash of one particular block being announced
- Number uint64 // Number of one particular block being announced
- }
- nextBlock := s.fullChain.blocks[s.chain.Len()]
- announcement := anno{Hash: nextBlock.Hash(), Number: nextBlock.Number().Uint64()}
- newBlockHash := &NewBlockHashes{announcement}
- if err := sendConn.Write(newBlockHash); err != nil {
- return fmt.Errorf("failed to write to connection: %v", err)
- }
-
- // Announcement sent, now wait for a header request
- msg := sendConn.Read()
- blockHeaderReq, ok := msg.(*GetBlockHeaders)
- if !ok {
- return fmt.Errorf("unexpected %s", pretty.Sdump(msg))
- }
- if blockHeaderReq.Amount != 1 {
- return fmt.Errorf("unexpected number of block headers requested: %v", blockHeaderReq.Amount)
- }
- if blockHeaderReq.Origin.Hash != announcement.Hash {
- return fmt.Errorf("unexpected block header requested. Announced:\n %v\n Remote request:\n%v",
- pretty.Sdump(announcement),
- pretty.Sdump(blockHeaderReq))
- }
- err = sendConn.Write(&BlockHeaders{
- RequestId: blockHeaderReq.ReqID(),
- BlockHeadersRequest: eth.BlockHeadersRequest{nextBlock.Header()},
- })
- if err != nil {
- return fmt.Errorf("failed to write to connection: %v", err)
- }
-
- // wait for block announcement
- msg = recvConn.readAndServe(s.chain, timeout)
- switch msg := msg.(type) {
- case *NewBlockHashes:
- hashes := *msg
- if len(hashes) != 1 {
- return fmt.Errorf("unexpected new block hash announcement: wanted 1 announcement, got %d", len(hashes))
- }
- if nextBlock.Hash() != hashes[0].Hash {
- return fmt.Errorf("unexpected block hash announcement, wanted %v, got %v", nextBlock.Hash(),
- hashes[0].Hash)
- }
-
- case *NewBlock:
- // node should only propagate NewBlock without having requested the body if the body is empty
- nextBlockBody := nextBlock.Body()
- if len(nextBlockBody.Transactions) != 0 || len(nextBlockBody.Uncles) != 0 {
- return fmt.Errorf("unexpected non-empty new block propagated: %s", pretty.Sdump(msg))
- }
- if msg.Block.Hash() != nextBlock.Hash() {
- return fmt.Errorf("mismatched hash of propagated new block: wanted %v, got %v",
- nextBlock.Hash(), msg.Block.Hash())
- }
- // check to make sure header matches header that was sent to the node
- if !reflect.DeepEqual(nextBlock.Header(), msg.Block.Header()) {
- return fmt.Errorf("incorrect header received: wanted %v, got %v", nextBlock.Header(), msg.Block.Header())
- }
- default:
- return fmt.Errorf("unexpected: %s", pretty.Sdump(msg))
- }
- // confirm node imported block
- if err := s.waitForBlockImport(recvConn, nextBlock); err != nil {
- return fmt.Errorf("error waiting for node to import new block: %v", err)
- }
- // update the chain
- s.chain.blocks = append(s.chain.blocks, nextBlock)
- return nil
-}
diff --git a/cmd/devp2p/internal/ethtest/large.go b/cmd/devp2p/internal/ethtest/large.go
deleted file mode 100644
index 40626c2068..0000000000
--- a/cmd/devp2p/internal/ethtest/large.go
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2020 The go-ethereum Authors
-// This file is part of go-ethereum.
-//
-// go-ethereum is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// go-ethereum is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with go-ethereum. If not, see .
-
-package ethtest
-
-import (
- "crypto/rand"
- "math/big"
-
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/common/hexutil"
- "github.com/ethereum/go-ethereum/core/types"
-)
-
-// largeNumber returns a very large big.Int.
-func largeNumber(megabytes int) *big.Int {
- buf := make([]byte, megabytes*1024*1024)
- rand.Read(buf)
- bigint := new(big.Int)
- bigint.SetBytes(buf)
- return bigint
-}
-
-// largeBuffer returns a very large buffer.
-func largeBuffer(megabytes int) []byte {
- buf := make([]byte, megabytes*1024*1024)
- rand.Read(buf)
- return buf
-}
-
-// largeString returns a very large string.
-func largeString(megabytes int) string {
- buf := make([]byte, megabytes*1024*1024)
- rand.Read(buf)
- return hexutil.Encode(buf)
-}
-
-func largeBlock() *types.Block {
- return types.NewBlockWithHeader(largeHeader())
-}
-
-// Returns a random hash
-func randHash() common.Hash {
- var h common.Hash
- rand.Read(h[:])
- return h
-}
-
-func largeHeader() *types.Header {
- return &types.Header{
- MixDigest: randHash(),
- ReceiptHash: randHash(),
- TxHash: randHash(),
- Nonce: types.BlockNonce{},
- Extra: []byte{},
- Bloom: types.Bloom{},
- GasUsed: 0,
- Coinbase: common.Address{},
- GasLimit: 0,
- UncleHash: types.EmptyUncleHash,
- Time: 1337,
- ParentHash: randHash(),
- Root: randHash(),
- Number: largeNumber(2),
- Difficulty: largeNumber(2),
- }
-}
diff --git a/cmd/devp2p/internal/ethtest/mkchain.sh b/cmd/devp2p/internal/ethtest/mkchain.sh
new file mode 100644
index 0000000000..b9253e8ca7
--- /dev/null
+++ b/cmd/devp2p/internal/ethtest/mkchain.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+hivechain generate \
+ --fork-interval 6 \
+ --tx-interval 1 \
+ --length 500 \
+ --outdir testdata \
+ --lastfork cancun \
+ --outputs accounts,genesis,chain,headstate,txinfo,headblock,headfcu,newpayload,forkenv
diff --git a/cmd/devp2p/internal/ethtest/protocol.go b/cmd/devp2p/internal/ethtest/protocol.go
new file mode 100644
index 0000000000..f5f5f7e489
--- /dev/null
+++ b/cmd/devp2p/internal/ethtest/protocol.go
@@ -0,0 +1,87 @@
+// Copyright 2023 The go-ethereum Authors
+// This file is part of go-ethereum.
+//
+// go-ethereum is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// go-ethereum is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with go-ethereum. If not, see .
+package ethtest
+
+import (
+ "github.com/ethereum/go-ethereum/p2p"
+ "github.com/ethereum/go-ethereum/rlp"
+)
+
+// Unexported devp2p message codes from p2p/peer.go.
+const (
+ handshakeMsg = 0x00
+ discMsg = 0x01
+ pingMsg = 0x02
+ pongMsg = 0x03
+)
+
+// Unexported devp2p protocol lengths from p2p package.
+const (
+ baseProtoLen = 16
+ ethProtoLen = 17
+ snapProtoLen = 8
+)
+
+// Unexported handshake structure from p2p/peer.go.
+type protoHandshake struct {
+ Version uint64
+ Name string
+ Caps []p2p.Cap
+ ListenPort uint64
+ ID []byte
+ Rest []rlp.RawValue `rlp:"tail"`
+}
+
+type Hello = protoHandshake
+
+// Proto is an enum representing devp2p protocol types.
+type Proto int
+
+const (
+ baseProto Proto = iota
+ ethProto
+ snapProto
+)
+
+// getProto returns the protocol a certain message code is associated with
+// (assuming the negotiated capabilities are exactly {eth,snap})
+func getProto(code uint64) Proto {
+ switch {
+ case code < baseProtoLen:
+ return baseProto
+ case code < baseProtoLen+ethProtoLen:
+ return ethProto
+ case code < baseProtoLen+ethProtoLen+snapProtoLen:
+ return snapProto
+ default:
+ panic("unhandled msg code beyond last protocol")
+ }
+}
+
+// protoOffset will return the offset at which the specified protocol's messages
+// begin.
+func protoOffset(proto Proto) uint64 {
+ switch proto {
+ case baseProto:
+ return 0
+ case ethProto:
+ return baseProtoLen
+ case snapProto:
+ return baseProtoLen + ethProtoLen
+ default:
+ panic("unhandled protocol")
+ }
+}
diff --git a/cmd/devp2p/internal/ethtest/snap.go b/cmd/devp2p/internal/ethtest/snap.go
index 21a5c8232a..64e0633585 100644
--- a/cmd/devp2p/internal/ethtest/snap.go
+++ b/cmd/devp2p/internal/ethtest/snap.go
@@ -20,9 +20,12 @@ import (
"bytes"
"errors"
"fmt"
+ "math/big"
"math/rand"
+ "reflect"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/eth/protocols/snap"
@@ -32,6 +35,13 @@ import (
"golang.org/x/crypto/sha3"
)
+func (c *Conn) snapRequest(code uint64, msg any) (any, error) {
+ if err := c.Write(snapProto, code, msg); err != nil {
+ return nil, fmt.Errorf("could not write to connection: %v", err)
+ }
+ return c.ReadSnap()
+}
+
func (s *Suite) TestSnapStatus(t *utesting.T) {
conn, err := s.dialSnap()
if err != nil {
@@ -44,74 +54,269 @@ func (s *Suite) TestSnapStatus(t *utesting.T) {
}
type accRangeTest struct {
- nBytes uint64
- root common.Hash
- origin common.Hash
- limit common.Hash
+ nBytes uint64
+ root common.Hash
+ startingHash common.Hash
+ limitHash common.Hash
expAccounts int
expFirst common.Hash
expLast common.Hash
+
+ desc string
}
// TestSnapGetAccountRange various forms of GetAccountRange requests.
func (s *Suite) TestSnapGetAccountRange(t *utesting.T) {
var (
- root = s.chain.RootAt(999)
- ffHash = common.MaxHash
- zero = common.Hash{}
- firstKeyMinus1 = common.HexToHash("0x00bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf29")
- firstKey = common.HexToHash("0x00bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2a")
- firstKeyPlus1 = common.HexToHash("0x00bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2b")
- secondKey = common.HexToHash("0x09e47cd5056a689e708f22fe1f932709a320518e444f5f7d8d46a3da523d6606")
- storageRoot = common.HexToHash("0xbe3d75a1729be157e79c3b77f00206db4d54e3ea14375a015451c88ec067c790")
+ ffHash = common.MaxHash
+ zero = common.Hash{}
+
+ // test values derived from chain/ account dump
+ root = s.chain.Head().Root()
+ headstate = s.chain.AccountsInHashOrder()
+ firstKey = common.BytesToHash(headstate[0].AddressHash)
+ secondKey = common.BytesToHash(headstate[1].AddressHash)
+ storageRoot = findNonEmptyStorageRoot(headstate)
)
- for i, tc := range []accRangeTest{
+
+ tests := []accRangeTest{
// Tests decreasing the number of bytes
- {4000, root, zero, ffHash, 76, firstKey, common.HexToHash("0xd2669dcf3858e7f1eecb8b5fedbf22fbea3e9433848a75035f79d68422c2dcda")},
- {3000, root, zero, ffHash, 57, firstKey, common.HexToHash("0x9b63fa753ece5cb90657d02ecb15df4dc1508d8c1d187af1bf7f1a05e747d3c7")},
- {2000, root, zero, ffHash, 38, firstKey, common.HexToHash("0x5e6140ecae4354a9e8f47559a8c6209c1e0e69cb077b067b528556c11698b91f")},
- {1, root, zero, ffHash, 1, firstKey, firstKey},
+ {
+ nBytes: 4000,
+ root: root,
+ startingHash: zero,
+ limitHash: ffHash,
+ expAccounts: 86,
+ expFirst: firstKey,
+ expLast: common.HexToHash("0x445cb5c1278fdce2f9cbdb681bdd76c52f8e50e41dbd9e220242a69ba99ac099"),
+ desc: "In this test, we request the entire state range, but limit the response to 4000 bytes.",
+ },
+ {
+ nBytes: 3000,
+ root: root,
+ startingHash: zero,
+ limitHash: ffHash,
+ expAccounts: 65,
+ expFirst: firstKey,
+ expLast: common.HexToHash("0x2e6fe1362b3e388184fd7bf08e99e74170b26361624ffd1c5f646da7067b58b6"),
+ desc: "In this test, we request the entire state range, but limit the response to 3000 bytes.",
+ },
+ {
+ nBytes: 2000,
+ root: root,
+ startingHash: zero,
+ limitHash: ffHash,
+ expAccounts: 44,
+ expFirst: firstKey,
+ expLast: common.HexToHash("0x1c3f74249a4892081ba0634a819aec9ed25f34c7653f5719b9098487e65ab595"),
+ desc: "In this test, we request the entire state range, but limit the response to 2000 bytes.",
+ },
+ {
+ nBytes: 1,
+ root: root,
+ startingHash: zero,
+ limitHash: ffHash,
+ expAccounts: 1,
+ expFirst: firstKey,
+ expLast: firstKey,
+ desc: `In this test, we request the entire state range, but limit the response to 1 byte.
+The server should return the first account of the state.`,
+ },
+ {
+ nBytes: 0,
+ root: root,
+ startingHash: zero,
+ limitHash: ffHash,
+ expAccounts: 1,
+ expFirst: firstKey,
+ expLast: firstKey,
+ desc: `Here we request with a responseBytes limit of zero.
+The server should return one account.`,
+ },
// Tests variations of the range
- //
- // [00b to firstkey]: should return [firstkey, secondkey], where secondkey is out of bounds
- {4000, root, common.HexToHash("0x00bf000000000000000000000000000000000000000000000000000000000000"), common.HexToHash("0x00bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2b"), 2, firstKey, secondKey},
- // [00b0 to 0bf0]: where both are before firstkey. Should return firstKey (even though it's out of bounds)
- {4000, root, common.HexToHash("0x00b0000000000000000000000000000000000000000000000000000000000000"), common.HexToHash("0x00bf100000000000000000000000000000000000000000000000000000000000"), 1, firstKey, firstKey},
- {4000, root, zero, zero, 1, firstKey, firstKey},
- {4000, root, firstKey, ffHash, 76, firstKey, common.HexToHash("0xd2669dcf3858e7f1eecb8b5fedbf22fbea3e9433848a75035f79d68422c2dcda")},
- {4000, root, firstKeyPlus1, ffHash, 76, secondKey, common.HexToHash("0xd28f55d3b994f16389f36944ad685b48e0fc3f8fbe86c3ca92ebecadf16a783f")},
+ {
+ nBytes: 4000,
+ root: root,
+ startingHash: hashAdd(firstKey, -500),
+ limitHash: hashAdd(firstKey, 1),
+ expAccounts: 2,
+ expFirst: firstKey,
+ expLast: secondKey,
+ desc: `In this test, we request a range where startingHash is before the first available
+account key, and limitHash is after. The server should return the first and second
+account of the state (because the second account is the 'next available').`,
+ },
+
+ {
+ nBytes: 4000,
+ root: root,
+ startingHash: hashAdd(firstKey, -500),
+ limitHash: hashAdd(firstKey, -450),
+ expAccounts: 1,
+ expFirst: firstKey,
+ expLast: firstKey,
+ desc: `Here we request range where both bounds are before the first available account key.
+This should return the first account (even though it's out of bounds).`,
+ },
+
+ // More range tests:
+ {
+ nBytes: 4000,
+ root: root,
+ startingHash: zero,
+ limitHash: zero,
+ expAccounts: 1,
+ expFirst: firstKey,
+ expLast: firstKey,
+ desc: `In this test, both startingHash and limitHash are zero.
+The server should return the first available account.`,
+ },
+ {
+ nBytes: 4000,
+ root: root,
+ startingHash: firstKey,
+ limitHash: ffHash,
+ expAccounts: 86,
+ expFirst: firstKey,
+ expLast: common.HexToHash("0x445cb5c1278fdce2f9cbdb681bdd76c52f8e50e41dbd9e220242a69ba99ac099"),
+ desc: `In this test, startingHash is exactly the first available account key.
+The server should return the first available account of the state as the first item.`,
+ },
+ {
+ nBytes: 4000,
+ root: root,
+ startingHash: hashAdd(firstKey, 1),
+ limitHash: ffHash,
+ expAccounts: 86,
+ expFirst: secondKey,
+ expLast: common.HexToHash("0x4615e5f5df5b25349a00ad313c6cd0436b6c08ee5826e33a018661997f85ebaa"),
+ desc: `In this test, startingHash is after the first available key.
+The server should return the second account of the state as the first item.`,
+ },
// Test different root hashes
- //
- // A stateroot that does not exist
- {4000, common.Hash{0x13, 37}, zero, ffHash, 0, zero, zero},
+
+ {
+ nBytes: 4000,
+ root: common.Hash{0x13, 0x37},
+ startingHash: zero,
+ limitHash: ffHash,
+ expAccounts: 0,
+ expFirst: zero,
+ expLast: zero,
+ desc: `This test requests a non-existent state root.`,
+ },
+
// The genesis stateroot (we expect it to not be served)
- {4000, s.chain.RootAt(0), zero, ffHash, 0, zero, zero},
- // A 127 block old stateroot, expected to be served
- {4000, s.chain.RootAt(999 - 127), zero, ffHash, 77, firstKey, common.HexToHash("0xe4c6fdef5dd4e789a2612390806ee840b8ec0fe52548f8b4efe41abb20c37aac")},
- // A root which is not actually an account root, but a storage root
- {4000, storageRoot, zero, ffHash, 0, zero, zero},
+ {
+ nBytes: 4000,
+ root: s.chain.RootAt(0),
+ startingHash: zero,
+ limitHash: ffHash,
+ expAccounts: 0,
+ expFirst: zero,
+ expLast: zero,
+ desc: `This test requests data at the state root of the genesis block. We expect the
+server to return no data because genesis is older than 127 blocks.`,
+ },
+
+ {
+ nBytes: 4000,
+ root: s.chain.RootAt(int(s.chain.Head().Number().Uint64()) - 127),
+ startingHash: zero,
+ limitHash: ffHash,
+ expAccounts: 84,
+ expFirst: firstKey,
+ expLast: common.HexToHash("0x580aa878e2f92d113a12c0a3ce3c21972b03dbe80786858d49a72097e2c491a3"),
+ desc: `This test requests data at a state root that is 127 blocks old.
+We expect the server to have this state available.`,
+ },
+
+ {
+ nBytes: 4000,
+ root: storageRoot,
+ startingHash: zero,
+ limitHash: ffHash,
+ expAccounts: 0,
+ expFirst: zero,
+ expLast: zero,
+ desc: `This test requests data at a state root that is actually the storage root of
+an existing account. The server is supposed to ignore this request.`,
+ },
// And some non-sensical requests
- //
- // range from [0xFF to 0x00], wrong order. Expect not to be serviced
- {4000, root, ffHash, zero, 0, zero, zero},
- // range from [firstkey, firstkey-1], wrong order. Expect to get first key.
- {4000, root, firstKey, firstKeyMinus1, 1, firstKey, firstKey},
+
+ {
+ nBytes: 4000,
+ root: root,
+ startingHash: ffHash,
+ limitHash: zero,
+ expAccounts: 0,
+ expFirst: zero,
+ expLast: zero,
+ desc: `In this test, the startingHash is after limitHash (wrong order). The server
+should ignore this invalid request.`,
+ },
+
+ {
+ nBytes: 4000,
+ root: root,
+ startingHash: firstKey,
+ limitHash: hashAdd(firstKey, -1),
+ expAccounts: 1,
+ expFirst: firstKey,
+ expLast: firstKey,
+ desc: `In this test, the startingHash is the first available key, and limitHash is
+a key before startingHash (wrong order). The server should return the first available key.`,
+ },
+
// range from [firstkey, 0], wrong order. Expect to get first key.
- {4000, root, firstKey, zero, 1, firstKey, firstKey},
- // Max bytes: 0. Expect to deliver one account.
- {0, root, zero, ffHash, 1, firstKey, firstKey},
- } {
+ {
+ nBytes: 4000,
+ root: root,
+ startingHash: firstKey,
+ limitHash: zero,
+ expAccounts: 1,
+ expFirst: firstKey,
+ expLast: firstKey,
+ desc: `In this test, the startingHash is the first available key and limitHash is zero.
+(wrong order). The server should return the first available key.`,
+ },
+ }
+
+ for i, tc := range tests {
tc := tc
+ if i > 0 {
+ t.Log("\n")
+ }
+ t.Logf("-- Test %d", i)
+ t.Log(tc.desc)
+ t.Log(" request:")
+ t.Logf(" root: %x", tc.root)
+ t.Logf(" range: %#x - %#x", tc.startingHash, tc.limitHash)
+ t.Logf(" responseBytes: %d", tc.nBytes)
if err := s.snapGetAccountRange(t, &tc); err != nil {
- t.Errorf("test %d \n root: %x\n range: %#x - %#x\n bytes: %d\nfailed: %v", i, tc.root, tc.origin, tc.limit, tc.nBytes, err)
+ t.Errorf("test %d failed: %v", i, err)
}
}
}
+func hashAdd(h common.Hash, n int64) common.Hash {
+ hb := h.Big()
+ return common.BigToHash(hb.Add(hb, big.NewInt(n)))
+}
+
+func findNonEmptyStorageRoot(accounts []state.DumpAccount) common.Hash {
+ for i := range accounts {
+ if len(accounts[i].Storage) != 0 {
+ return common.BytesToHash(accounts[i].Root)
+ }
+ }
+ panic("can't find account with non-empty storage")
+}
+
type stRangesTest struct {
root common.Hash
accounts []common.Hash
@@ -119,87 +324,125 @@ type stRangesTest struct {
limit []byte
nBytes uint64
- expSlots int
+ expSlots [][]*snap.StorageData
+
+ desc string
}
// TestSnapGetStorageRanges various forms of GetStorageRanges requests.
func (s *Suite) TestSnapGetStorageRanges(t *utesting.T) {
var (
+ acct = common.HexToAddress("0x8bebc8ba651aee624937e7d897853ac30c95a067")
+ acctHash = common.BytesToHash(s.chain.state[acct].AddressHash)
ffHash = common.MaxHash
zero = common.Hash{}
- firstKey = common.HexToHash("0x00bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2a")
- secondKey = common.HexToHash("0x09e47cd5056a689e708f22fe1f932709a320518e444f5f7d8d46a3da523d6606")
+ blockroot = s.chain.Head().Root()
)
- for i, tc := range []stRangesTest{
- {
- root: s.chain.RootAt(999),
- accounts: []common.Hash{secondKey, firstKey},
- origin: zero[:],
- limit: ffHash[:],
- nBytes: 500,
- expSlots: 0,
- },
+ // These are the storage slots of the test account, encoded as snap response data.
+ acctSlots := []*snap.StorageData{
+ {
+ Hash: common.HexToHash("0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace"),
+ Body: []byte{0x02},
+ },
+ {
+ Hash: common.HexToHash("0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6"),
+ Body: []byte{0x01},
+ },
+ {
+ Hash: common.HexToHash("0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b"),
+ Body: []byte{0x03},
+ },
+ }
+
+ tests := []stRangesTest{
/*
Some tests against this account:
- {
- "balance": "0",
- "nonce": 1,
- "root": "0xbe3d75a1729be157e79c3b77f00206db4d54e3ea14375a015451c88ec067c790",
- "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
- "storage": {
- "0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace": "02",
- "0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6": "01",
- "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b": "03"
- },
- "key": "0xf493f79c43bd747129a226ad42529885a4b108aba6046b2d12071695a6627844"
+
+ "0x8bebc8ba651aee624937e7d897853ac30c95a067": {
+ "balance": "1",
+ "nonce": 1,
+ "root": "0xe318dff15b33aa7f2f12d5567d58628e3e3f2e8859e46b56981a4083b391da17",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ // Note: keys below are hashed!!!
+ "0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace": "02",
+ "0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6": "01",
+ "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b": "03"
+ },
+ "key": "0x445cb5c1278fdce2f9cbdb681bdd76c52f8e50e41dbd9e220242a69ba99ac099"
}
*/
+
{ // [:] -> [slot1, slot2, slot3]
- root: s.chain.RootAt(999),
- accounts: []common.Hash{common.HexToHash("0xf493f79c43bd747129a226ad42529885a4b108aba6046b2d12071695a6627844")},
+ desc: `This request has a range of 00..ff.
+The server should return all storage slots of the test account.`,
+ root: blockroot,
+ accounts: []common.Hash{acctHash},
origin: zero[:],
limit: ffHash[:],
nBytes: 500,
- expSlots: 3,
+ expSlots: [][]*snap.StorageData{acctSlots},
},
+
{ // [slot1:] -> [slot1, slot2, slot3]
- root: s.chain.RootAt(999),
- accounts: []common.Hash{common.HexToHash("0xf493f79c43bd747129a226ad42529885a4b108aba6046b2d12071695a6627844")},
+ desc: `This test requests slots starting at the first available key.
+The server should return all storage slots of the test account.`,
+ root: blockroot,
+ accounts: []common.Hash{acctHash},
origin: common.FromHex("0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace"),
limit: ffHash[:],
- nBytes: 500,
- expSlots: 3,
+ nBytes: 1000,
+ expSlots: [][]*snap.StorageData{acctSlots},
},
- { // [slot1+ :] -> [slot2, slot3]
- root: s.chain.RootAt(999),
- accounts: []common.Hash{common.HexToHash("0xf493f79c43bd747129a226ad42529885a4b108aba6046b2d12071695a6627844")},
+
+ { // [slot1+:] -> [slot2, slot3]
+ desc: `This test requests slots starting at a key one past the first available key.
+The server should return the remaining two slots of the test account.`,
+ root: blockroot,
+ accounts: []common.Hash{acctHash},
origin: common.FromHex("0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf"),
limit: ffHash[:],
nBytes: 500,
- expSlots: 2,
+ expSlots: [][]*snap.StorageData{acctSlots[1:]},
},
+
{ // [slot1:slot2] -> [slot1, slot2]
- root: s.chain.RootAt(999),
- accounts: []common.Hash{common.HexToHash("0xf493f79c43bd747129a226ad42529885a4b108aba6046b2d12071695a6627844")},
+ desc: `This test requests a range which is exactly the first and second available key.`,
+ root: blockroot,
+ accounts: []common.Hash{acctHash},
origin: common.FromHex("0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace"),
limit: common.FromHex("0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6"),
nBytes: 500,
- expSlots: 2,
+ expSlots: [][]*snap.StorageData{acctSlots[:2]},
},
+
{ // [slot1+:slot2+] -> [slot2, slot3]
- root: s.chain.RootAt(999),
- accounts: []common.Hash{common.HexToHash("0xf493f79c43bd747129a226ad42529885a4b108aba6046b2d12071695a6627844")},
+ desc: `This test requests a range where limitHash is after the second, but before the third slot
+of the test account. The server should return slots [2,3] (i.e. the 'next available' needs to be returned).`,
+ root: blockroot,
+ accounts: []common.Hash{acctHash},
origin: common.FromHex("0x4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),
limit: common.FromHex("0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7"),
nBytes: 500,
- expSlots: 2,
+ expSlots: [][]*snap.StorageData{acctSlots[1:]},
},
- } {
+ }
+
+ for i, tc := range tests {
tc := tc
+ if i > 0 {
+ t.Log("\n")
+ }
+ t.Logf("-- Test %d", i)
+ t.Log(tc.desc)
+ t.Log(" request:")
+ t.Logf(" root: %x", tc.root)
+ t.Logf(" accounts: %x", tc.accounts)
+ t.Logf(" range: %#x - %#x", tc.origin, tc.limit)
+ t.Logf(" responseBytes: %d", tc.nBytes)
if err := s.snapGetStorageRanges(t, &tc); err != nil {
- t.Errorf("test %d \n root: %x\n range: %#x - %#x\n bytes: %d\n #accounts: %d\nfailed: %v",
- i, tc.root, tc.origin, tc.limit, tc.nBytes, len(tc.accounts), err)
+ t.Errorf(" failed: %v", err)
}
}
}
@@ -209,87 +452,92 @@ type byteCodesTest struct {
hashes []common.Hash
expHashes int
+
+ desc string
}
// TestSnapGetByteCodes various forms of GetByteCodes requests.
func (s *Suite) TestSnapGetByteCodes(t *utesting.T) {
- // The halfchain import should yield these bytecodes
- var hcBytecodes []common.Hash
- for _, s := range []string{
- "0x200c90460d8b0063210d5f5b9918e053c8f2c024485e0f1b48be8b1fc71b1317",
- "0x20ba67ed4ac6aff626e0d1d4db623e2fada9593daeefc4a6eb4b70e6cff986f3",
- "0x24b5b4902cb3d897c1cee9f16be8e897d8fa277c04c6dc8214f18295fca5de44",
- "0x320b9d0a2be39b8a1c858f9f8cb96b1df0983071681de07ded3a7c0d05db5fd6",
- "0x48cb0d5275936a24632babc7408339f9f7b051274809de565b8b0db76e97e03c",
- "0x67c7a6f5cdaa43b4baa0e15b2be63346d1b9ce9f2c3d7e5804e0cacd44ee3b04",
- "0x6d8418059bdc8c3fabf445e6bfc662af3b6a4ae45999b953996e42c7ead2ab49",
- "0x7043422e5795d03f17ee0463a37235258e609fdd542247754895d72695e3e142",
- "0x727f9e6f0c4bac1ff8d72c2972122d9c8d37ccb37e04edde2339e8da193546f1",
- "0x86ccd5e23c78568a8334e0cebaf3e9f48c998307b0bfb1c378cee83b4bfb29cb",
- "0x8fc89b00d6deafd4c4279531e743365626dbfa28845ec697919d305c2674302d",
- "0x92cfc353bcb9746bb6f9996b6b9df779c88af2e9e0eeac44879ca19887c9b732",
- "0x941b4872104f0995a4898fcf0f615ea6bf46bfbdfcf63ea8f2fd45b3f3286b77",
- "0xa02fe8f41159bb39d2b704c633c3d6389cf4bfcb61a2539a9155f60786cf815f",
- "0xa4b94e0afdffcb0af599677709dac067d3145489ea7aede57672bee43e3b7373",
- "0xaf4e64edd3234c1205b725e42963becd1085f013590bd7ed93f8d711c5eb65fb",
- "0xb69a18fa855b742031420081999086f6fb56c3930ae8840944e8b8ae9931c51e",
- "0xc246c217bc73ce6666c93a93a94faa5250564f50a3fdc27ea74c231c07fe2ca6",
- "0xcd6e4ab2c3034df2a8a1dfaaeb1c4baecd162a93d22de35e854ee2945cbe0c35",
- "0xe24b692d09d6fc2f3d1a6028c400a27c37d7cbb11511907c013946d6ce263d3b",
- "0xe440c5f0e8603fd1ed25976eee261ccee8038cf79d6a4c0eb31b2bf883be737f",
- "0xe6eacbc509203d21ac814b350e72934fde686b7f673c19be8cf956b0c70078ce",
- "0xe8530de4371467b5be7ea0e69e675ab36832c426d6c1ce9513817c0f0ae1486b",
- "0xe85d487abbbc83bf3423cf9731360cf4f5a37220e18e5add54e72ee20861196a",
- "0xf195ea389a5eea28db0be93660014275b158963dec44af1dfa7d4743019a9a49",
- } {
- hcBytecodes = append(hcBytecodes, common.HexToHash(s))
- }
+ var (
+ allHashes = s.chain.CodeHashes()
+ headRoot = s.chain.Head().Root()
+ genesisRoot = s.chain.RootAt(0)
+ )
- for i, tc := range []byteCodesTest{
+ tests := []byteCodesTest{
// A few stateroots
{
- nBytes: 10000, hashes: []common.Hash{s.chain.RootAt(0), s.chain.RootAt(999)},
+ desc: `Here we request state roots as code hashes. The server should deliver an empty response with no items.`,
+ nBytes: 10000,
+ hashes: []common.Hash{genesisRoot, headRoot},
expHashes: 0,
},
{
- nBytes: 10000, hashes: []common.Hash{s.chain.RootAt(0), s.chain.RootAt(0)},
+ desc: `Here we request the genesis state root (which is not an existing code hash) two times. The server should deliver an empty response with no items.`,
+ nBytes: 10000,
+ hashes: []common.Hash{genesisRoot, genesisRoot},
expHashes: 0,
},
// Empties
{
- nBytes: 10000, hashes: []common.Hash{types.EmptyRootHash},
+ desc: `Here we request the empty state root (which is not an existing code hash). The server should deliver an empty response with no items.`,
+ nBytes: 10000,
+ hashes: []common.Hash{types.EmptyRootHash},
expHashes: 0,
},
{
- nBytes: 10000, hashes: []common.Hash{types.EmptyCodeHash},
+ desc: `Here we request the empty code hash. The server should deliver an empty response item.`,
+ nBytes: 10000,
+ hashes: []common.Hash{types.EmptyCodeHash},
expHashes: 1,
},
{
- nBytes: 10000, hashes: []common.Hash{types.EmptyCodeHash, types.EmptyCodeHash, types.EmptyCodeHash},
+ desc: `In this test, we request the empty code hash three times. The server should deliver the empty item three times.`,
+ nBytes: 10000,
+ hashes: []common.Hash{types.EmptyCodeHash, types.EmptyCodeHash, types.EmptyCodeHash},
expHashes: 3,
},
// The existing bytecodes
{
- nBytes: 10000, hashes: hcBytecodes,
- expHashes: len(hcBytecodes),
+ desc: `Here we request all available contract codes. The server should deliver them all in one response.`,
+ nBytes: 100000,
+ hashes: allHashes,
+ expHashes: len(allHashes),
},
// The existing, with limited byte arg
{
- nBytes: 1, hashes: hcBytecodes,
+ desc: `In this test, the request has a bytes limit of one. The server should deliver one item.`,
+ nBytes: 1,
+ hashes: allHashes,
expHashes: 1,
},
{
- nBytes: 0, hashes: hcBytecodes,
+ desc: `In this test, the request has a bytes limit of zero. The server should deliver one item.`,
+ nBytes: 0,
+ hashes: allHashes,
expHashes: 1,
},
+ // Request the same hash multiple times.
{
- nBytes: 1000, hashes: []common.Hash{hcBytecodes[0], hcBytecodes[0], hcBytecodes[0], hcBytecodes[0]},
+ desc: `This test requests the same code hash multiple times. The server should deliver it multiple times.`,
+ nBytes: 1000,
+ hashes: []common.Hash{allHashes[0], allHashes[0], allHashes[0], allHashes[0]},
expHashes: 4,
},
- } {
+ }
+
+ for i, tc := range tests {
tc := tc
+ if i > 0 {
+ t.Log("\n")
+ }
+ t.Logf("-- Test %d", i)
+ t.Log(tc.desc)
+ t.Log(" request:")
+ t.Logf(" hashes: %x", tc.hashes)
+ t.Logf(" responseBytes: %d", tc.nBytes)
if err := s.snapGetByteCodes(t, &tc); err != nil {
- t.Errorf("test %d \n bytes: %d\n #hashes: %d\nfailed: %v", i, tc.nBytes, len(tc.hashes), err)
+ t.Errorf("failed: %v", err)
}
}
}
@@ -299,8 +547,10 @@ type trieNodesTest struct {
paths []snap.TrieNodePathSet
nBytes uint64
- expHashes []common.Hash
- expReject bool
+ expHashes []common.Hash // expected response
+ expReject bool // if true, request should be rejected
+
+ desc string
}
func decodeNibbles(nibbles []byte, bytes []byte) {
@@ -344,29 +594,32 @@ func hexToCompact(hex []byte) []byte {
// TestSnapTrieNodes various forms of GetTrieNodes requests.
func (s *Suite) TestSnapTrieNodes(t *utesting.T) {
- key := common.FromHex("0x00bf49f440a1cd0527e4d06e2765654c0f56452257516d793a9b8d604dcfdf2a")
- // helper function to iterate the key, and generate the compact-encoded
- // trie paths along the way.
- pathTo := func(length int) snap.TrieNodePathSet {
- hex := keybytesToHex(key)[:length]
- hex[len(hex)-1] = 0 // remove term flag
- hKey := hexToCompact(hex)
- return snap.TrieNodePathSet{hKey}
- }
- var accPaths []snap.TrieNodePathSet
+ var (
+ // This is the known address of the snap storage testing contract.
+ storageAcct = common.HexToAddress("0x8bebc8ba651aee624937e7d897853ac30c95a067")
+ storageAcctHash = common.BytesToHash(s.chain.state[storageAcct].AddressHash)
+ // This is the known address of an existing account.
+ key = common.FromHex("0xa87387b50b481431c6ccdb9ae99a54d4dcdd4a3eff75d7b17b4818f7bbfc21e9")
+ empty = types.EmptyCodeHash
+ accPaths []snap.TrieNodePathSet
+ )
for i := 1; i <= 65; i++ {
- accPaths = append(accPaths, pathTo(i))
+ accPaths = append(accPaths, makeSnapPath(key, i))
}
- empty := types.EmptyCodeHash
- for i, tc := range []trieNodesTest{
+
+ tests := []trieNodesTest{
{
- root: s.chain.RootAt(999),
+ desc: `In this test, we send an empty request to the node.`,
+ root: s.chain.Head().Root(),
paths: nil,
nBytes: 500,
expHashes: nil,
},
+
{
- root: s.chain.RootAt(999),
+ desc: `In this test, we send a request containing an empty path-set.
+The server should reject the request.`,
+ root: s.chain.Head().Root(),
paths: []snap.TrieNodePathSet{
{}, // zero-length pathset should 'abort' and kick us off
{[]byte{0}},
@@ -375,18 +628,21 @@ func (s *Suite) TestSnapTrieNodes(t *utesting.T) {
expHashes: []common.Hash{},
expReject: true,
},
+
{
- root: s.chain.RootAt(999),
+ desc: `Here we request the root node of the trie. The server should respond with the root node.`,
+ root: s.chain.RootAt(int(s.chain.Head().NumberU64() - 1)),
paths: []snap.TrieNodePathSet{
{[]byte{0}},
{[]byte{1}, []byte{0}},
},
- nBytes: 5000,
- //0x6b3724a41b8c38b46d4d02fba2bb2074c47a507eb16a9a4b978f91d32e406faf
- expHashes: []common.Hash{s.chain.RootAt(999)},
+ nBytes: 5000,
+ expHashes: []common.Hash{s.chain.RootAt(int(s.chain.Head().NumberU64() - 1))},
},
+
{ // nonsensically long path
- root: s.chain.RootAt(999),
+ desc: `In this test, we request a very long trie node path. The server should respond with an empty node (keccak256("")).`,
+ root: s.chain.Head().Root(),
paths: []snap.TrieNodePathSet{
{[]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8,
0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8}},
@@ -394,25 +650,19 @@ func (s *Suite) TestSnapTrieNodes(t *utesting.T) {
nBytes: 5000,
expHashes: []common.Hash{common.HexToHash("0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470")},
},
- {
- root: s.chain.RootAt(0),
- paths: []snap.TrieNodePathSet{
- {[]byte{0}},
- {[]byte{1}, []byte{0}},
- },
- nBytes: 5000,
- expHashes: []common.Hash{
- common.HexToHash("0x1ee1bb2fbac4d46eab331f3e8551e18a0805d084ed54647883aa552809ca968d"),
- },
- },
+
{
// The leaf is only a couple of levels down, so the continued trie traversal causes lookup failures.
- root: s.chain.RootAt(999),
+ desc: `Here we request some known accounts from the state.`,
+ root: s.chain.Head().Root(),
paths: accPaths,
nBytes: 5000,
expHashes: []common.Hash{
- common.HexToHash("0xbcefee69b37cca1f5bf3a48aebe08b35f2ea1864fa958bb0723d909a0e0d28d8"),
- common.HexToHash("0x4fb1e4e2391e4b4da471d59641319b8fa25d76c973d4bec594d7b00a69ae5135"),
+ // It's a bit unfortunate these are hard-coded, but the result depends on
+ // a lot of aspects of the state trie and can't be guessed in a simple
+ // way. So you'll have to update this when the test chain is changed.
+ common.HexToHash("0x3e963a69401a70224cbfb8c0cc2249b019041a538675d71ccf80c9328d114e2e"),
+ common.HexToHash("0xd0670d09cdfbf3c6320eb3e92c47c57baa6c226551a2d488c05581091e6b1689"),
empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty,
empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty,
empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty,
@@ -420,39 +670,32 @@ func (s *Suite) TestSnapTrieNodes(t *utesting.T) {
empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty, empty,
empty, empty, empty},
},
+
{
- // Basically the same as above, with different ordering
- root: s.chain.RootAt(999),
+ desc: `In this test, we request some known accounts in state. The requested paths are NOT in key order.`,
+ root: s.chain.Head().Root(),
paths: []snap.TrieNodePathSet{
accPaths[10], accPaths[1], accPaths[0],
},
nBytes: 5000,
+ // As with the previous test, this result depends on the whole tree and will have to
+ // be updated when the test chain is changed.
expHashes: []common.Hash{
empty,
- common.HexToHash("0x4fb1e4e2391e4b4da471d59641319b8fa25d76c973d4bec594d7b00a69ae5135"),
- common.HexToHash("0xbcefee69b37cca1f5bf3a48aebe08b35f2ea1864fa958bb0723d909a0e0d28d8"),
+ common.HexToHash("0xd0670d09cdfbf3c6320eb3e92c47c57baa6c226551a2d488c05581091e6b1689"),
+ common.HexToHash("0x3e963a69401a70224cbfb8c0cc2249b019041a538675d71ccf80c9328d114e2e"),
},
},
+
+ // Storage tests.
+ // These use the known storage test account.
+
{
- /*
- A test against this account, requesting trie nodes for the storage trie
- {
- "balance": "0",
- "nonce": 1,
- "root": "0xbe3d75a1729be157e79c3b77f00206db4d54e3ea14375a015451c88ec067c790",
- "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
- "storage": {
- "0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace": "02",
- "0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6": "01",
- "0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b": "03"
- },
- "key": "0xf493f79c43bd747129a226ad42529885a4b108aba6046b2d12071695a6627844"
- }
- */
- root: s.chain.RootAt(999),
+ desc: `This test requests the storage root node of a known account.`,
+ root: s.chain.Head().Root(),
paths: []snap.TrieNodePathSet{
{
- common.FromHex("0xf493f79c43bd747129a226ad42529885a4b108aba6046b2d12071695a6627844"),
+ storageAcctHash[:],
[]byte{0},
},
},
@@ -461,14 +704,50 @@ func (s *Suite) TestSnapTrieNodes(t *utesting.T) {
common.HexToHash("0xbe3d75a1729be157e79c3b77f00206db4d54e3ea14375a015451c88ec067c790"),
},
},
- } {
+
+ {
+ desc: `This test requests multiple storage nodes of a known account.`,
+ root: s.chain.Head().Root(),
+ paths: []snap.TrieNodePathSet{
+ {
+ storageAcctHash[:],
+ []byte{0},
+ []byte{0x1b},
+ },
+ },
+ nBytes: 5000,
+ expHashes: []common.Hash{
+ common.HexToHash("0xbe3d75a1729be157e79c3b77f00206db4d54e3ea14375a015451c88ec067c790"),
+ common.HexToHash("0xf4984a11f61a2921456141df88de6e1a710d28681b91af794c5a721e47839cd7"),
+ },
+ },
+ }
+
+ for i, tc := range tests {
tc := tc
+ if i > 0 {
+ t.Log("\n")
+ }
+ t.Logf("-- Test %d", i)
+ t.Log(tc.desc)
+ t.Log(" request:")
+ t.Logf(" root: %x", tc.root)
+ t.Logf(" paths: %x", tc.paths)
+ t.Logf(" responseBytes: %d", tc.nBytes)
+
if err := s.snapGetTrieNodes(t, &tc); err != nil {
- t.Errorf("test %d \n #hashes %x\n root: %#x\n bytes: %d\nfailed: %v", i, len(tc.expHashes), tc.root, tc.nBytes, err)
+ t.Errorf(" failed: %v", err)
}
}
}
+func makeSnapPath(key []byte, length int) snap.TrieNodePathSet {
+ hex := keybytesToHex(key)[:length]
+ hex[len(hex)-1] = 0 // remove term flag
+ hKey := hexToCompact(hex)
+ return snap.TrieNodePathSet{hKey}
+}
+
func (s *Suite) snapGetAccountRange(t *utesting.T, tc *accRangeTest) error {
conn, err := s.dialSnap()
if err != nil {
@@ -479,22 +758,20 @@ func (s *Suite) snapGetAccountRange(t *utesting.T, tc *accRangeTest) error {
t.Fatalf("peering failed: %v", err)
}
// write request
- req := &GetAccountRange{
+ req := &snap.GetAccountRangePacket{
ID: uint64(rand.Int63()),
Root: tc.root,
- Origin: tc.origin,
- Limit: tc.limit,
+ Origin: tc.startingHash,
+ Limit: tc.limitHash,
Bytes: tc.nBytes,
}
- resp, err := conn.snapRequest(req, req.ID, s.chain)
+ msg, err := conn.snapRequest(snap.GetAccountRangeMsg, req)
if err != nil {
return fmt.Errorf("account range request failed: %v", err)
}
- var res *snap.AccountRangePacket
- if r, ok := resp.(*AccountRange); !ok {
- return fmt.Errorf("account range response wrong: %T %v", resp, resp)
- } else {
- res = (*snap.AccountRangePacket)(r)
+ res, ok := msg.(*snap.AccountRangePacket)
+ if !ok {
+ return fmt.Errorf("account range response wrong: %T %v", msg, msg)
}
if exp, got := tc.expAccounts, len(res.Accounts); exp != got {
return fmt.Errorf("expected %d accounts, got %d", exp, got)
@@ -536,7 +813,7 @@ func (s *Suite) snapGetAccountRange(t *utesting.T, tc *accRangeTest) error {
}
proofdb := nodes.Set()
- _, err = trie.VerifyRangeProof(tc.root, tc.origin[:], keys, accounts, proofdb)
+ _, err = trie.VerifyRangeProof(tc.root, tc.startingHash[:], keys, accounts, proofdb)
return err
}
@@ -549,8 +826,9 @@ func (s *Suite) snapGetStorageRanges(t *utesting.T, tc *stRangesTest) error {
if err = conn.peer(s.chain, nil); err != nil {
t.Fatalf("peering failed: %v", err)
}
+
// write request
- req := &GetStorageRanges{
+ req := &snap.GetStorageRangesPacket{
ID: uint64(rand.Int63()),
Root: tc.root,
Accounts: tc.accounts,
@@ -558,28 +836,38 @@ func (s *Suite) snapGetStorageRanges(t *utesting.T, tc *stRangesTest) error {
Limit: tc.limit,
Bytes: tc.nBytes,
}
- resp, err := conn.snapRequest(req, req.ID, s.chain)
+ msg, err := conn.snapRequest(snap.GetStorageRangesMsg, req)
if err != nil {
return fmt.Errorf("account range request failed: %v", err)
}
- var res *snap.StorageRangesPacket
- if r, ok := resp.(*StorageRanges); !ok {
- return fmt.Errorf("account range response wrong: %T %v", resp, resp)
- } else {
- res = (*snap.StorageRangesPacket)(r)
+ res, ok := msg.(*snap.StorageRangesPacket)
+ if !ok {
+ return fmt.Errorf("account range response wrong: %T %v", msg, msg)
}
- gotSlots := 0
+
// Ensure the ranges are monotonically increasing
for i, slots := range res.Slots {
- gotSlots += len(slots)
for j := 1; j < len(slots); j++ {
if bytes.Compare(slots[j-1].Hash[:], slots[j].Hash[:]) >= 0 {
return fmt.Errorf("storage slots not monotonically increasing for account #%d: #%d [%x] vs #%d [%x]", i, j-1, slots[j-1].Hash[:], j, slots[j].Hash[:])
}
}
}
- if exp, got := tc.expSlots, gotSlots; exp != got {
- return fmt.Errorf("expected %d slots, got %d", exp, got)
+
+ // Compute expected slot hashes.
+ var expHashes [][]common.Hash
+ for _, acct := range tc.expSlots {
+ var list []common.Hash
+ for _, s := range acct {
+ list = append(list, s.Hash)
+ }
+ expHashes = append(expHashes, list)
+ }
+
+ // Check response.
+ if !reflect.DeepEqual(res.Slots, tc.expSlots) {
+ t.Log(" expected slot hashes:", expHashes)
+ return fmt.Errorf("wrong storage slots in response: %#v", res.Slots)
}
return nil
}
@@ -594,24 +882,22 @@ func (s *Suite) snapGetByteCodes(t *utesting.T, tc *byteCodesTest) error {
t.Fatalf("peering failed: %v", err)
}
// write request
- req := &GetByteCodes{
+ req := &snap.GetByteCodesPacket{
ID: uint64(rand.Int63()),
Hashes: tc.hashes,
Bytes: tc.nBytes,
}
- resp, err := conn.snapRequest(req, req.ID, s.chain)
+ msg, err := conn.snapRequest(snap.GetByteCodesMsg, req)
if err != nil {
return fmt.Errorf("getBytecodes request failed: %v", err)
}
- var res *snap.ByteCodesPacket
- if r, ok := resp.(*ByteCodes); !ok {
- return fmt.Errorf("bytecodes response wrong: %T %v", resp, resp)
- } else {
- res = (*snap.ByteCodesPacket)(r)
+ res, ok := msg.(*snap.ByteCodesPacket)
+ if !ok {
+ return fmt.Errorf("bytecodes response wrong: %T %v", msg, msg)
}
if exp, got := tc.expHashes, len(res.Codes); exp != got {
for i, c := range res.Codes {
- fmt.Printf("%d. %#x\n", i, c)
+ t.Logf("%d. %#x\n", i, c)
}
return fmt.Errorf("expected %d bytecodes, got %d", exp, got)
}
@@ -654,25 +940,24 @@ func (s *Suite) snapGetTrieNodes(t *utesting.T, tc *trieNodesTest) error {
if err = conn.peer(s.chain, nil); err != nil {
t.Fatalf("peering failed: %v", err)
}
- // write request
- req := &GetTrieNodes{
+
+ // write0 request
+ req := &snap.GetTrieNodesPacket{
ID: uint64(rand.Int63()),
Root: tc.root,
Paths: tc.paths,
Bytes: tc.nBytes,
}
- resp, err := conn.snapRequest(req, req.ID, s.chain)
+ msg, err := conn.snapRequest(snap.GetTrieNodesMsg, req)
if err != nil {
if tc.expReject {
return nil
}
return fmt.Errorf("trienodes request failed: %v", err)
}
- var res *snap.TrieNodesPacket
- if r, ok := resp.(*TrieNodes); !ok {
- return fmt.Errorf("trienodes response wrong: %T %v", resp, resp)
- } else {
- res = (*snap.TrieNodesPacket)(r)
+ res, ok := msg.(*snap.TrieNodesPacket)
+ if !ok {
+ return fmt.Errorf("trienodes response wrong: %T %v", msg, msg)
}
// Check the correctness
@@ -690,7 +975,7 @@ func (s *Suite) snapGetTrieNodes(t *utesting.T, tc *trieNodesTest) error {
hasher.Write(trienode)
hasher.Read(hash)
if got, want := hash, tc.expHashes[i]; !bytes.Equal(got, want[:]) {
- fmt.Printf("hash %d wrong, got %#x, want %#x\n", i, got, want)
+ t.Logf(" hash %d wrong, got %#x, want %#x\n", i, got, want)
err = fmt.Errorf("hash %d wrong, got %#x, want %#x", i, got, want)
}
}
diff --git a/cmd/devp2p/internal/ethtest/snapTypes.go b/cmd/devp2p/internal/ethtest/snapTypes.go
deleted file mode 100644
index 6bcaa9291a..0000000000
--- a/cmd/devp2p/internal/ethtest/snapTypes.go
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2022 The go-ethereum Authors
-// This file is part of go-ethereum.
-//
-// go-ethereum is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// go-ethereum is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with go-ethereum. If not, see .
-
-package ethtest
-
-import "github.com/ethereum/go-ethereum/eth/protocols/snap"
-
-// GetAccountRange represents an account range query.
-type GetAccountRange snap.GetAccountRangePacket
-
-func (msg GetAccountRange) Code() int { return 33 }
-func (msg GetAccountRange) ReqID() uint64 { return msg.ID }
-
-type AccountRange snap.AccountRangePacket
-
-func (msg AccountRange) Code() int { return 34 }
-func (msg AccountRange) ReqID() uint64 { return msg.ID }
-
-type GetStorageRanges snap.GetStorageRangesPacket
-
-func (msg GetStorageRanges) Code() int { return 35 }
-func (msg GetStorageRanges) ReqID() uint64 { return msg.ID }
-
-type StorageRanges snap.StorageRangesPacket
-
-func (msg StorageRanges) Code() int { return 36 }
-func (msg StorageRanges) ReqID() uint64 { return msg.ID }
-
-type GetByteCodes snap.GetByteCodesPacket
-
-func (msg GetByteCodes) Code() int { return 37 }
-func (msg GetByteCodes) ReqID() uint64 { return msg.ID }
-
-type ByteCodes snap.ByteCodesPacket
-
-func (msg ByteCodes) Code() int { return 38 }
-func (msg ByteCodes) ReqID() uint64 { return msg.ID }
-
-type GetTrieNodes snap.GetTrieNodesPacket
-
-func (msg GetTrieNodes) Code() int { return 39 }
-func (msg GetTrieNodes) ReqID() uint64 { return msg.ID }
-
-type TrieNodes snap.TrieNodesPacket
-
-func (msg TrieNodes) Code() int { return 40 }
-func (msg TrieNodes) ReqID() uint64 { return msg.ID }
diff --git a/cmd/devp2p/internal/ethtest/suite.go b/cmd/devp2p/internal/ethtest/suite.go
index 0b56c8cf4b..4f499d41d8 100644
--- a/cmd/devp2p/internal/ethtest/suite.go
+++ b/cmd/devp2p/internal/ethtest/suite.go
@@ -17,35 +17,47 @@
package ethtest
import (
- "time"
+ "crypto/rand"
+ "math/big"
+ "reflect"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/consensus/misc/eip4844"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/crypto/kzg4844"
"github.com/ethereum/go-ethereum/eth/protocols/eth"
"github.com/ethereum/go-ethereum/internal/utesting"
+ "github.com/ethereum/go-ethereum/p2p"
"github.com/ethereum/go-ethereum/p2p/enode"
+ "github.com/holiman/uint256"
)
// Suite represents a structure used to test a node's conformance
// to the eth protocol.
type Suite struct {
- Dest *enode.Node
-
- chain *Chain
- fullChain *Chain
+ Dest *enode.Node
+ chain *Chain
+ engine *EngineClient
}
// NewSuite creates and returns a new eth-test suite that can
// be used to test the given node against the given blockchain
// data.
-func NewSuite(dest *enode.Node, chainfile string, genesisfile string) (*Suite, error) {
- chain, err := loadChain(chainfile, genesisfile)
+func NewSuite(dest *enode.Node, chainDir, engineURL, jwt string) (*Suite, error) {
+ chain, err := NewChain(chainDir)
if err != nil {
return nil, err
}
+ engine, err := NewEngineClient(chainDir, engineURL, jwt)
+ if err != nil {
+ return nil, err
+ }
+
return &Suite{
- Dest: dest,
- chain: chain.Shorten(1000),
- fullChain: chain,
+ Dest: dest,
+ chain: chain,
+ engine: engine,
}, nil
}
@@ -60,34 +72,30 @@ func (s *Suite) EthTests() []utesting.Test {
{Name: "TestZeroRequestID", Fn: s.TestZeroRequestID},
// get block bodies
{Name: "TestGetBlockBodies", Fn: s.TestGetBlockBodies},
- // broadcast
- {Name: "TestBroadcast", Fn: s.TestBroadcast},
- {Name: "TestLargeAnnounce", Fn: s.TestLargeAnnounce},
- {Name: "TestOldAnnounce", Fn: s.TestOldAnnounce},
- {Name: "TestBlockHashAnnounce", Fn: s.TestBlockHashAnnounce},
- // malicious handshakes + status
+ // // malicious handshakes + status
{Name: "TestMaliciousHandshake", Fn: s.TestMaliciousHandshake},
{Name: "TestMaliciousStatus", Fn: s.TestMaliciousStatus},
// test transactions
+ {Name: "TestLargeTxRequest", Fn: s.TestLargeTxRequest, Slow: true},
{Name: "TestTransaction", Fn: s.TestTransaction},
- {Name: "TestMaliciousTx", Fn: s.TestMaliciousTx},
- {Name: "TestLargeTxRequest", Fn: s.TestLargeTxRequest},
+ {Name: "TestInvalidTxs", Fn: s.TestInvalidTxs},
{Name: "TestNewPooledTxs", Fn: s.TestNewPooledTxs},
+ {Name: "TestBlobViolations", Fn: s.TestBlobViolations},
}
}
func (s *Suite) SnapTests() []utesting.Test {
return []utesting.Test{
- {Name: "TestSnapStatus", Fn: s.TestSnapStatus},
- {Name: "TestSnapAccountRange", Fn: s.TestSnapGetAccountRange},
- {Name: "TestSnapGetByteCodes", Fn: s.TestSnapGetByteCodes},
- {Name: "TestSnapGetTrieNodes", Fn: s.TestSnapTrieNodes},
- {Name: "TestSnapGetStorageRanges", Fn: s.TestSnapGetStorageRanges},
+ {Name: "Status", Fn: s.TestSnapStatus},
+ {Name: "AccountRange", Fn: s.TestSnapGetAccountRange},
+ {Name: "GetByteCodes", Fn: s.TestSnapGetByteCodes},
+ {Name: "GetTrieNodes", Fn: s.TestSnapTrieNodes},
+ {Name: "GetStorageRanges", Fn: s.TestSnapGetStorageRanges},
}
}
-// TestStatus attempts to connect to the given node and exchange
-// a status message with it on the eth protocol.
+// TestStatus attempts to connect to the given node and exchange a status
+// message with it on the eth protocol.
func (s *Suite) TestStatus(t *utesting.T) {
conn, err := s.dial()
if err != nil {
@@ -99,8 +107,13 @@ func (s *Suite) TestStatus(t *utesting.T) {
}
}
-// TestGetBlockHeaders tests whether the given node can respond to
-// an eth `GetBlockHeaders` request and that the response is accurate.
+// headersMatch returns whether the received headers match the given request
+func headersMatch(expected []*types.Header, headers []*types.Header) bool {
+ return reflect.DeepEqual(expected, headers)
+}
+
+// TestGetBlockHeaders tests whether the given node can respond to an eth
+// `GetBlockHeaders` request and that the response is accurate.
func (s *Suite) TestGetBlockHeaders(t *utesting.T) {
conn, err := s.dial()
if err != nil {
@@ -110,8 +123,9 @@ func (s *Suite) TestGetBlockHeaders(t *utesting.T) {
if err = conn.peer(s.chain, nil); err != nil {
t.Fatalf("peering failed: %v", err)
}
- // write request
- req := &GetBlockHeaders{
+ // Send headers request.
+ req := ð.GetBlockHeadersPacket{
+ RequestId: 33,
GetBlockHeadersRequest: ð.GetBlockHeadersRequest{
Origin: eth.HashOrNumber{Hash: s.chain.blocks[1].Hash()},
Amount: 2,
@@ -119,25 +133,31 @@ func (s *Suite) TestGetBlockHeaders(t *utesting.T) {
Reverse: false,
},
}
- headers, err := conn.headersRequest(req, s.chain, 33)
- if err != nil {
- t.Fatalf("could not get block headers: %v", err)
+ // Read headers response.
+ if err := conn.Write(ethProto, eth.GetBlockHeadersMsg, req); err != nil {
+ t.Fatalf("could not write to connection: %v", err)
}
- // check for correct headers
+ headers := new(eth.BlockHeadersPacket)
+ if err := conn.ReadMsg(ethProto, eth.BlockHeadersMsg, &headers); err != nil {
+ t.Fatalf("error reading msg: %v", err)
+ }
+ if got, want := headers.RequestId, req.RequestId; got != want {
+ t.Fatalf("unexpected request id")
+ }
+ // Check for correct headers.
expected, err := s.chain.GetHeaders(req)
if err != nil {
t.Fatalf("failed to get headers for given request: %v", err)
}
- if !headersMatch(expected, headers) {
+ if !headersMatch(expected, headers.BlockHeadersRequest) {
t.Fatalf("header mismatch: \nexpected %v \ngot %v", expected, headers)
}
}
-// TestSimultaneousRequests sends two simultaneous `GetBlockHeader` requests from
-// the same connection with different request IDs and checks to make sure the node
-// responds with the correct headers per request.
+// TestSimultaneousRequests sends two simultaneous `GetBlockHeader` requests
+// from the same connection with different request IDs and checks to make sure
+// the node responds with the correct headers per request.
func (s *Suite) TestSimultaneousRequests(t *utesting.T) {
- // create a connection
conn, err := s.dial()
if err != nil {
t.Fatalf("dial failed: %v", err)
@@ -147,8 +167,8 @@ func (s *Suite) TestSimultaneousRequests(t *utesting.T) {
t.Fatalf("peering failed: %v", err)
}
- // create two requests
- req1 := &GetBlockHeaders{
+ // Create two different requests.
+ req1 := ð.GetBlockHeadersPacket{
RequestId: uint64(111),
GetBlockHeadersRequest: ð.GetBlockHeadersRequest{
Origin: eth.HashOrNumber{
@@ -159,7 +179,7 @@ func (s *Suite) TestSimultaneousRequests(t *utesting.T) {
Reverse: false,
},
}
- req2 := &GetBlockHeaders{
+ req2 := ð.GetBlockHeadersPacket{
RequestId: uint64(222),
GetBlockHeadersRequest: ð.GetBlockHeadersRequest{
Origin: eth.HashOrNumber{
@@ -171,46 +191,45 @@ func (s *Suite) TestSimultaneousRequests(t *utesting.T) {
},
}
- // write the first request
- if err := conn.Write(req1); err != nil {
+ // Send both requests.
+ if err := conn.Write(ethProto, eth.GetBlockHeadersMsg, req1); err != nil {
t.Fatalf("failed to write to connection: %v", err)
}
- // write the second request
- if err := conn.Write(req2); err != nil {
+ if err := conn.Write(ethProto, eth.GetBlockHeadersMsg, req2); err != nil {
t.Fatalf("failed to write to connection: %v", err)
}
- // wait for responses
- msg := conn.waitForResponse(s.chain, timeout, req1.RequestId)
- headers1, ok := msg.(*BlockHeaders)
- if !ok {
- t.Fatalf("unexpected %s", pretty.Sdump(msg))
+ // Wait for responses.
+ headers1 := new(eth.BlockHeadersPacket)
+ if err := conn.ReadMsg(ethProto, eth.BlockHeadersMsg, &headers1); err != nil {
+ t.Fatalf("error reading block headers msg: %v", err)
}
- msg = conn.waitForResponse(s.chain, timeout, req2.RequestId)
- headers2, ok := msg.(*BlockHeaders)
- if !ok {
- t.Fatalf("unexpected %s", pretty.Sdump(msg))
+ if got, want := headers1.RequestId, req1.RequestId; got != want {
+ t.Fatalf("unexpected request id in response: got %d, want %d", got, want)
+ }
+ headers2 := new(eth.BlockHeadersPacket)
+ if err := conn.ReadMsg(ethProto, eth.BlockHeadersMsg, &headers2); err != nil {
+ t.Fatalf("error reading block headers msg: %v", err)
+ }
+ if got, want := headers2.RequestId, req2.RequestId; got != want {
+ t.Fatalf("unexpected request id in response: got %d, want %d", got, want)
}
- // check received headers for accuracy
- expected1, err := s.chain.GetHeaders(req1)
- if err != nil {
+ // Check received headers for accuracy.
+ if expected, err := s.chain.GetHeaders(req1); err != nil {
t.Fatalf("failed to get expected headers for request 1: %v", err)
+ } else if !headersMatch(expected, headers1.BlockHeadersRequest) {
+ t.Fatalf("header mismatch: \nexpected %v \ngot %v", expected, headers1)
}
- expected2, err := s.chain.GetHeaders(req2)
- if err != nil {
+ if expected, err := s.chain.GetHeaders(req2); err != nil {
t.Fatalf("failed to get expected headers for request 2: %v", err)
- }
- if !headersMatch(expected1, headers1.BlockHeadersRequest) {
- t.Fatalf("header mismatch: \nexpected %v \ngot %v", expected1, headers1)
- }
- if !headersMatch(expected2, headers2.BlockHeadersRequest) {
- t.Fatalf("header mismatch: \nexpected %v \ngot %v", expected2, headers2)
+ } else if !headersMatch(expected, headers2.BlockHeadersRequest) {
+ t.Fatalf("header mismatch: \nexpected %v \ngot %v", expected, headers2)
}
}
-// TestSameRequestID sends two requests with the same request ID to a
-// single node.
+// TestSameRequestID sends two requests with the same request ID to a single
+// node.
func (s *Suite) TestSameRequestID(t *utesting.T) {
conn, err := s.dial()
if err != nil {
@@ -220,9 +239,10 @@ func (s *Suite) TestSameRequestID(t *utesting.T) {
if err := conn.peer(s.chain, nil); err != nil {
t.Fatalf("peering failed: %v", err)
}
- // create requests
+
+ // Create two different requests with the same ID.
reqID := uint64(1234)
- request1 := &GetBlockHeaders{
+ request1 := ð.GetBlockHeadersPacket{
RequestId: reqID,
GetBlockHeadersRequest: ð.GetBlockHeadersRequest{
Origin: eth.HashOrNumber{
@@ -231,7 +251,7 @@ func (s *Suite) TestSameRequestID(t *utesting.T) {
Amount: 2,
},
}
- request2 := &GetBlockHeaders{
+ request2 := ð.GetBlockHeadersPacket{
RequestId: reqID,
GetBlockHeadersRequest: ð.GetBlockHeadersRequest{
Origin: eth.HashOrNumber{
@@ -241,40 +261,40 @@ func (s *Suite) TestSameRequestID(t *utesting.T) {
},
}
- // write the requests
- if err = conn.Write(request1); err != nil {
+ // Send the requests.
+ if err = conn.Write(ethProto, eth.GetBlockHeadersMsg, request1); err != nil {
t.Fatalf("failed to write to connection: %v", err)
}
- if err = conn.Write(request2); err != nil {
+ if err = conn.Write(ethProto, eth.GetBlockHeadersMsg, request2); err != nil {
t.Fatalf("failed to write to connection: %v", err)
}
- // wait for responses
- msg := conn.waitForResponse(s.chain, timeout, reqID)
- headers1, ok := msg.(*BlockHeaders)
- if !ok {
- t.Fatalf("unexpected %s", pretty.Sdump(msg))
+ // Wait for the responses.
+ headers1 := new(eth.BlockHeadersPacket)
+ if err := conn.ReadMsg(ethProto, eth.BlockHeadersMsg, &headers1); err != nil {
+ t.Fatalf("error reading from connection: %v", err)
}
- msg = conn.waitForResponse(s.chain, timeout, reqID)
- headers2, ok := msg.(*BlockHeaders)
- if !ok {
- t.Fatalf("unexpected %s", pretty.Sdump(msg))
+ if got, want := headers1.RequestId, request1.RequestId; got != want {
+ t.Fatalf("unexpected request id: got %d, want %d", got, want)
+ }
+ headers2 := new(eth.BlockHeadersPacket)
+ if err := conn.ReadMsg(ethProto, eth.BlockHeadersMsg, &headers2); err != nil {
+ t.Fatalf("error reading from connection: %v", err)
+ }
+ if got, want := headers2.RequestId, request2.RequestId; got != want {
+ t.Fatalf("unexpected request id: got %d, want %d", got, want)
}
- // check if headers match
- expected1, err := s.chain.GetHeaders(request1)
- if err != nil {
+ // Check if headers match.
+ if expected, err := s.chain.GetHeaders(request1); err != nil {
t.Fatalf("failed to get expected block headers: %v", err)
+ } else if !headersMatch(expected, headers1.BlockHeadersRequest) {
+ t.Fatalf("header mismatch: \nexpected %v \ngot %v", expected, headers1)
}
- expected2, err := s.chain.GetHeaders(request2)
- if err != nil {
+ if expected, err := s.chain.GetHeaders(request2); err != nil {
t.Fatalf("failed to get expected block headers: %v", err)
- }
- if !headersMatch(expected1, headers1.BlockHeadersRequest) {
- t.Fatalf("header mismatch: \nexpected %v \ngot %v", expected1, headers1)
- }
- if !headersMatch(expected2, headers2.BlockHeadersRequest) {
- t.Fatalf("header mismatch: \nexpected %v \ngot %v", expected2, headers2)
+ } else if !headersMatch(expected, headers2.BlockHeadersRequest) {
+ t.Fatalf("header mismatch: \nexpected %v \ngot %v", expected, headers2)
}
}
@@ -289,27 +309,32 @@ func (s *Suite) TestZeroRequestID(t *utesting.T) {
if err := conn.peer(s.chain, nil); err != nil {
t.Fatalf("peering failed: %v", err)
}
- req := &GetBlockHeaders{
+ req := ð.GetBlockHeadersPacket{
GetBlockHeadersRequest: ð.GetBlockHeadersRequest{
Origin: eth.HashOrNumber{Number: 0},
Amount: 2,
},
}
- headers, err := conn.headersRequest(req, s.chain, 0)
- if err != nil {
- t.Fatalf("failed to get block headers: %v", err)
+ // Read headers response.
+ if err := conn.Write(ethProto, eth.GetBlockHeadersMsg, req); err != nil {
+ t.Fatalf("could not write to connection: %v", err)
}
- expected, err := s.chain.GetHeaders(req)
- if err != nil {
+ headers := new(eth.BlockHeadersPacket)
+ if err := conn.ReadMsg(ethProto, eth.BlockHeadersMsg, &headers); err != nil {
+ t.Fatalf("error reading msg: %v", err)
+ }
+ if got, want := headers.RequestId, req.RequestId; got != want {
+ t.Fatalf("unexpected request id")
+ }
+ if expected, err := s.chain.GetHeaders(req); err != nil {
t.Fatalf("failed to get expected block headers: %v", err)
- }
- if !headersMatch(expected, headers) {
+ } else if !headersMatch(expected, headers.BlockHeadersRequest) {
t.Fatalf("header mismatch: \nexpected %v \ngot %v", expected, headers)
}
}
-// TestGetBlockBodies tests whether the given node can respond to
-// a `GetBlockBodies` request and that the response is accurate.
+// TestGetBlockBodies tests whether the given node can respond to a
+// `GetBlockBodies` request and that the response is accurate.
func (s *Suite) TestGetBlockBodies(t *utesting.T) {
conn, err := s.dial()
if err != nil {
@@ -319,104 +344,110 @@ func (s *Suite) TestGetBlockBodies(t *utesting.T) {
if err := conn.peer(s.chain, nil); err != nil {
t.Fatalf("peering failed: %v", err)
}
- // create block bodies request
- req := &GetBlockBodies{
- RequestId: uint64(55),
+ // Create block bodies request.
+ req := ð.GetBlockBodiesPacket{
+ RequestId: 55,
GetBlockBodiesRequest: eth.GetBlockBodiesRequest{
s.chain.blocks[54].Hash(),
s.chain.blocks[75].Hash(),
},
}
- if err := conn.Write(req); err != nil {
+ if err := conn.Write(ethProto, eth.GetBlockBodiesMsg, req); err != nil {
t.Fatalf("could not write to connection: %v", err)
}
- // wait for block bodies response
- msg := conn.waitForResponse(s.chain, timeout, req.RequestId)
- resp, ok := msg.(*BlockBodies)
- if !ok {
- t.Fatalf("unexpected: %s", pretty.Sdump(msg))
+ // Wait for response.
+ resp := new(eth.BlockBodiesPacket)
+ if err := conn.ReadMsg(ethProto, eth.BlockBodiesMsg, &resp); err != nil {
+ t.Fatalf("error reading block bodies msg: %v", err)
+ }
+ if got, want := resp.RequestId, req.RequestId; got != want {
+ t.Fatalf("unexpected request id in respond", got, want)
}
bodies := resp.BlockBodiesResponse
- t.Logf("received %d block bodies", len(bodies))
if len(bodies) != len(req.GetBlockBodiesRequest) {
- t.Fatalf("wrong bodies in response: expected %d bodies, "+
- "got %d", len(req.GetBlockBodiesRequest), len(bodies))
+ t.Fatalf("wrong bodies in response: expected %d bodies, got %d", len(req.GetBlockBodiesRequest), len(bodies))
}
}
-// TestBroadcast tests whether a block announcement is correctly
-// propagated to the node's peers.
-func (s *Suite) TestBroadcast(t *utesting.T) {
- if err := s.sendNextBlock(); err != nil {
- t.Fatalf("block broadcast failed: %v", err)
- }
-}
-
-// TestLargeAnnounce tests the announcement mechanism with a large block.
-func (s *Suite) TestLargeAnnounce(t *utesting.T) {
- nextBlock := len(s.chain.blocks)
- blocks := []*NewBlock{
- {
- Block: largeBlock(),
- TD: s.fullChain.TotalDifficultyAt(nextBlock),
- },
- {
- Block: s.fullChain.blocks[nextBlock],
- TD: largeNumber(2),
- },
- {
- Block: largeBlock(),
- TD: largeNumber(2),
- },
- }
-
- for i, blockAnnouncement := range blocks[0:3] {
- t.Logf("Testing malicious announcement: %v\n", i)
- conn, err := s.dial()
- if err != nil {
- t.Fatalf("dial failed: %v", err)
- }
- if err := conn.peer(s.chain, nil); err != nil {
- t.Fatalf("peering failed: %v", err)
- }
- if err := conn.Write(blockAnnouncement); err != nil {
- t.Fatalf("could not write to connection: %v", err)
- }
- // Invalid announcement, check that peer disconnected
- switch msg := conn.readAndServe(s.chain, 8*time.Second).(type) {
- case *Disconnect:
- case *Error:
- break
- default:
- t.Fatalf("unexpected: %s wanted disconnect", pretty.Sdump(msg))
- }
- conn.Close()
- }
- // Test the last block as a valid block
- if err := s.sendNextBlock(); err != nil {
- t.Fatalf("failed to broadcast next block: %v", err)
- }
-}
-
-// TestOldAnnounce tests the announcement mechanism with an old block.
-func (s *Suite) TestOldAnnounce(t *utesting.T) {
- if err := s.oldAnnounce(); err != nil {
- t.Fatal(err)
- }
-}
-
-// TestBlockHashAnnounce sends a new block hash announcement and expects
-// the node to perform a `GetBlockHeaders` request.
-func (s *Suite) TestBlockHashAnnounce(t *utesting.T) {
- if err := s.hashAnnounce(); err != nil {
- t.Fatalf("block hash announcement failed: %v", err)
- }
+// randBuf makes a random buffer size kilobytes large.
+func randBuf(size int) []byte {
+ buf := make([]byte, size*1024)
+ rand.Read(buf)
+ return buf
}
// TestMaliciousHandshake tries to send malicious data during the handshake.
func (s *Suite) TestMaliciousHandshake(t *utesting.T) {
- if err := s.maliciousHandshakes(t); err != nil {
- t.Fatal(err)
+ key, _ := crypto.GenerateKey()
+
+ // Write hello to client.
+ var (
+ pub0 = crypto.FromECDSAPub(&key.PublicKey)[1:]
+ version = eth.ProtocolVersions[0]
+ )
+ handshakes := []*protoHandshake{
+ {
+ Version: 5,
+ Caps: []p2p.Cap{
+ {Name: string(randBuf(2)), Version: version},
+ },
+ ID: pub0,
+ },
+ {
+ Version: 5,
+ Caps: []p2p.Cap{
+ {Name: "eth", Version: version},
+ },
+ ID: append(pub0, byte(0)),
+ },
+ {
+ Version: 5,
+ Caps: []p2p.Cap{
+ {Name: "eth", Version: version},
+ },
+ ID: append(pub0, pub0...),
+ },
+ {
+ Version: 5,
+ Caps: []p2p.Cap{
+ {Name: "eth", Version: version},
+ },
+ ID: randBuf(2),
+ },
+ {
+ Version: 5,
+ Caps: []p2p.Cap{
+ {Name: string(randBuf(2)), Version: version},
+ },
+ ID: randBuf(2),
+ },
+ }
+ for _, handshake := range handshakes {
+ conn, err := s.dialAs(key)
+ if err != nil {
+ t.Fatalf("dial failed: %v", err)
+ }
+ defer conn.Close()
+
+ if err := conn.Write(ethProto, handshakeMsg, handshake); err != nil {
+ t.Fatalf("could not write to connection: %v", err)
+ }
+ // Check that the peer disconnected
+ for i := 0; i < 2; i++ {
+ code, _, err := conn.Read()
+ if err != nil {
+ // Client may have disconnected without sending disconnect msg.
+ continue
+ }
+ switch code {
+ case discMsg:
+ case handshakeMsg:
+ // Discard one hello as Hello's are sent concurrently
+ continue
+ default:
+ t.Fatalf("unexpected msg: code %d", code)
+ }
+ }
}
}
@@ -427,46 +458,184 @@ func (s *Suite) TestMaliciousStatus(t *utesting.T) {
t.Fatalf("dial failed: %v", err)
}
defer conn.Close()
-
- if err := s.maliciousStatus(conn); err != nil {
- t.Fatal(err)
+ if err := conn.handshake(); err != nil {
+ t.Fatalf("handshake failed: %v", err)
+ }
+ // Create status with large total difficulty.
+ status := ð.StatusPacket{
+ ProtocolVersion: uint32(conn.negotiatedProtoVersion),
+ NetworkID: s.chain.config.ChainID.Uint64(),
+ TD: new(big.Int).SetBytes(randBuf(2048)),
+ Head: s.chain.Head().Hash(),
+ Genesis: s.chain.GetBlock(0).Hash(),
+ ForkID: s.chain.ForkID(),
+ }
+ if err := conn.statusExchange(s.chain, status); err != nil {
+ t.Fatalf("status exchange failed: %v", err)
+ }
+ // Wait for disconnect.
+ code, _, err := conn.Read()
+ if err != nil {
+ t.Fatalf("error reading from connection: %v", err)
+ }
+ switch code {
+ case discMsg:
+ break
+ default:
+ t.Fatalf("expected disconnect, got: %d", code)
}
}
-// TestTransaction sends a valid transaction to the node and
-// checks if the transaction gets propagated.
+// TestTransaction sends a valid transaction to the node and checks if the
+// transaction gets propagated.
func (s *Suite) TestTransaction(t *utesting.T) {
- if err := s.sendSuccessfulTxs(t); err != nil {
+ // Nudge client out of syncing mode to accept pending txs.
+ if err := s.engine.sendForkchoiceUpdated(); err != nil {
+ t.Fatalf("failed to send next block: %v", err)
+ }
+ from, nonce := s.chain.GetSender(0)
+ inner := &types.DynamicFeeTx{
+ ChainID: s.chain.config.ChainID,
+ Nonce: nonce,
+ GasTipCap: common.Big1,
+ GasFeeCap: s.chain.Head().BaseFee(),
+ Gas: 30000,
+ To: &common.Address{0xaa},
+ Value: common.Big1,
+ }
+ tx, err := s.chain.SignTx(from, types.NewTx(inner))
+ if err != nil {
+ t.Fatalf("failed to sign tx: %v", err)
+ }
+ if err := s.sendTxs([]*types.Transaction{tx}); err != nil {
t.Fatal(err)
}
+ s.chain.IncNonce(from, 1)
}
-// TestMaliciousTx sends several invalid transactions and tests whether
+// TestInvalidTxs sends several invalid transactions and tests whether
// the node will propagate them.
-func (s *Suite) TestMaliciousTx(t *utesting.T) {
- if err := s.sendMaliciousTxs(t); err != nil {
- t.Fatal(err)
+func (s *Suite) TestInvalidTxs(t *utesting.T) {
+ // Nudge client out of syncing mode to accept pending txs.
+ if err := s.engine.sendForkchoiceUpdated(); err != nil {
+ t.Fatalf("failed to send next block: %v", err)
+ }
+
+ from, nonce := s.chain.GetSender(0)
+ inner := &types.DynamicFeeTx{
+ ChainID: s.chain.config.ChainID,
+ Nonce: nonce,
+ GasTipCap: common.Big1,
+ GasFeeCap: s.chain.Head().BaseFee(),
+ Gas: 30000,
+ To: &common.Address{0xaa},
+ }
+ tx, err := s.chain.SignTx(from, types.NewTx(inner))
+ if err != nil {
+ t.Fatalf("failed to sign tx: %v", err)
+ }
+ if err := s.sendTxs([]*types.Transaction{tx}); err != nil {
+ t.Fatalf("failed to send txs: %v", err)
+ }
+ s.chain.IncNonce(from, 1)
+
+ inners := []*types.DynamicFeeTx{
+ // Nonce already used
+ {
+ ChainID: s.chain.config.ChainID,
+ Nonce: nonce - 1,
+ GasTipCap: common.Big1,
+ GasFeeCap: s.chain.Head().BaseFee(),
+ Gas: 100000,
+ },
+ // Value exceeds balance
+ {
+ Nonce: nonce,
+ GasTipCap: common.Big1,
+ GasFeeCap: s.chain.Head().BaseFee(),
+ Gas: 100000,
+ Value: s.chain.Balance(from),
+ },
+ // Gas limit too low
+ {
+ Nonce: nonce,
+ GasTipCap: common.Big1,
+ GasFeeCap: s.chain.Head().BaseFee(),
+ Gas: 1337,
+ },
+ // Code size too large
+ {
+ Nonce: nonce,
+ GasTipCap: common.Big1,
+ GasFeeCap: s.chain.Head().BaseFee(),
+ Data: randBuf(50),
+ Gas: 1_000_000,
+ },
+ // Data too large
+ {
+ Nonce: nonce,
+ GasTipCap: common.Big1,
+ GasFeeCap: s.chain.Head().BaseFee(),
+ To: &common.Address{0xaa},
+ Data: randBuf(128),
+ Gas: 5_000_000,
+ },
+ }
+
+ var txs []*types.Transaction
+ for _, inner := range inners {
+ tx, err := s.chain.SignTx(from, types.NewTx(inner))
+ if err != nil {
+ t.Fatalf("failed to sign tx: %v", err)
+ }
+ txs = append(txs, tx)
+ }
+ if err := s.sendInvalidTxs(txs); err != nil {
+ t.Fatalf("failed to send invalid txs: %v", err)
}
}
// TestLargeTxRequest tests whether a node can fulfill a large GetPooledTransactions
// request.
func (s *Suite) TestLargeTxRequest(t *utesting.T) {
- // send the next block to ensure the node is no longer syncing and
- // is able to accept txs
- if err := s.sendNextBlock(); err != nil {
+ // Nudge client out of syncing mode to accept pending txs.
+ if err := s.engine.sendForkchoiceUpdated(); err != nil {
t.Fatalf("failed to send next block: %v", err)
}
- // send 2000 transactions to the node
- hashMap, txs, err := generateTxs(s, 2000)
- if err != nil {
- t.Fatalf("failed to generate transactions: %v", err)
+
+ // Generate many transactions to seed target with.
+ var (
+ from, nonce = s.chain.GetSender(1)
+ count = 2000
+ txs []*types.Transaction
+ hashes []common.Hash
+ set = make(map[common.Hash]struct{})
+ )
+ for i := 0; i < count; i++ {
+ inner := &types.DynamicFeeTx{
+ ChainID: s.chain.config.ChainID,
+ Nonce: nonce + uint64(i),
+ GasTipCap: common.Big1,
+ GasFeeCap: s.chain.Head().BaseFee(),
+ Gas: 75000,
+ }
+ tx, err := s.chain.SignTx(from, types.NewTx(inner))
+ if err != nil {
+ t.Fatalf("failed to sign tx: err")
+ }
+ txs = append(txs, tx)
+ set[tx.Hash()] = struct{}{}
+ hashes = append(hashes, tx.Hash())
}
- if err = sendMultipleSuccessfulTxs(t, s, txs); err != nil {
- t.Fatalf("failed to send multiple txs: %v", err)
+ s.chain.IncNonce(from, uint64(count))
+
+ // Send txs.
+ if err := s.sendTxs(txs); err != nil {
+ t.Fatalf("failed to send txs: %v", err)
}
- // set up connection to receive to ensure node is peered with the receiving connection
- // before tx request is sent
+
+ // Set up receive connection to ensure node is peered with the receiving
+ // connection before tx request is sent.
conn, err := s.dial()
if err != nil {
t.Fatalf("dial failed: %v", err)
@@ -475,55 +644,62 @@ func (s *Suite) TestLargeTxRequest(t *utesting.T) {
if err = conn.peer(s.chain, nil); err != nil {
t.Fatalf("peering failed: %v", err)
}
- // create and send pooled tx request
- hashes := make([]common.Hash, 0)
- for _, hash := range hashMap {
- hashes = append(hashes, hash)
- }
- getTxReq := &GetPooledTransactions{
+ // Create and send pooled tx request.
+ req := ð.GetPooledTransactionsPacket{
RequestId: 1234,
GetPooledTransactionsRequest: hashes,
}
- if err = conn.Write(getTxReq); err != nil {
+ if err = conn.Write(ethProto, eth.GetPooledTransactionsMsg, req); err != nil {
t.Fatalf("could not write to conn: %v", err)
}
- // check that all received transactions match those that were sent to node
- switch msg := conn.waitForResponse(s.chain, timeout, getTxReq.RequestId).(type) {
- case *PooledTransactions:
- for _, gotTx := range msg.PooledTransactionsResponse {
- if _, exists := hashMap[gotTx.Hash()]; !exists {
- t.Fatalf("unexpected tx received: %v", gotTx.Hash())
- }
+ // Check that all received transactions match those that were sent to node.
+ msg := new(eth.PooledTransactionsPacket)
+ if err := conn.ReadMsg(ethProto, eth.PooledTransactionsMsg, &msg); err != nil {
+ t.Fatalf("error reading from connection: %v", err)
+ }
+ if got, want := msg.RequestId, req.RequestId; got != want {
+ t.Fatalf("unexpected request id in response: got %d, want %d", got, want)
+ }
+ for _, got := range msg.PooledTransactionsResponse {
+ if _, exists := set[got.Hash()]; !exists {
+ t.Fatalf("unexpected tx received: %v", got.Hash())
}
- default:
- t.Fatalf("unexpected %s", pretty.Sdump(msg))
}
}
-// TestNewPooledTxs tests whether a node will do a GetPooledTransactions
-// request upon receiving a NewPooledTransactionHashes announcement.
+// TestNewPooledTxs tests whether a node will do a GetPooledTransactions request
+// upon receiving a NewPooledTransactionHashes announcement.
func (s *Suite) TestNewPooledTxs(t *utesting.T) {
- // send the next block to ensure the node is no longer syncing and
- // is able to accept txs
- if err := s.sendNextBlock(); err != nil {
+ // Nudge client out of syncing mode to accept pending txs.
+ if err := s.engine.sendForkchoiceUpdated(); err != nil {
t.Fatalf("failed to send next block: %v", err)
}
-
- // generate 50 txs
- _, txs, err := generateTxs(s, 50)
- if err != nil {
- t.Fatalf("failed to generate transactions: %v", err)
- }
- hashes := make([]common.Hash, len(txs))
- types := make([]byte, len(txs))
- sizes := make([]uint32, len(txs))
- for i, tx := range txs {
+ var (
+ count = 50
+ from, nonce = s.chain.GetSender(1)
+ hashes = make([]common.Hash, count)
+ txTypes = make([]byte, count)
+ sizes = make([]uint32, count)
+ )
+ for i := 0; i < count; i++ {
+ inner := &types.DynamicFeeTx{
+ ChainID: s.chain.config.ChainID,
+ Nonce: nonce + uint64(i),
+ GasTipCap: common.Big1,
+ GasFeeCap: s.chain.Head().BaseFee(),
+ Gas: 75000,
+ }
+ tx, err := s.chain.SignTx(from, types.NewTx(inner))
+ if err != nil {
+ t.Fatalf("failed to sign tx: err")
+ }
hashes[i] = tx.Hash()
- types[i] = tx.Type()
+ txTypes[i] = tx.Type()
sizes[i] = uint32(tx.Size())
}
+ s.chain.IncNonce(from, uint64(count))
- // send announcement
+ // Connect to peer.
conn, err := s.dial()
if err != nil {
t.Fatalf("dial failed: %v", err)
@@ -533,40 +709,138 @@ func (s *Suite) TestNewPooledTxs(t *utesting.T) {
t.Fatalf("peering failed: %v", err)
}
- var ann Message = NewPooledTransactionHashes{Types: types, Sizes: sizes, Hashes: hashes}
- if conn.negotiatedProtoVersion < eth.ETH68 {
- ann = NewPooledTransactionHashes66(hashes)
- }
- err = conn.Write(ann)
+ // Send announcement.
+ ann := eth.NewPooledTransactionHashesPacket68{Types: txTypes, Sizes: sizes, Hashes: hashes}
+ err = conn.Write(ethProto, eth.NewPooledTransactionHashesMsg, ann)
if err != nil {
t.Fatalf("failed to write to connection: %v", err)
}
- // wait for GetPooledTxs request
+ // Wait for GetPooledTxs request.
for {
- msg := conn.readAndServe(s.chain, timeout)
+ msg, err := conn.ReadEth()
+ if err != nil {
+ t.Fatalf("failed to read eth msg: %v", err)
+ }
switch msg := msg.(type) {
- case *GetPooledTransactions:
+ case *eth.GetPooledTransactionsPacket:
if len(msg.GetPooledTransactionsRequest) != len(hashes) {
t.Fatalf("unexpected number of txs requested: wanted %d, got %d", len(hashes), len(msg.GetPooledTransactionsRequest))
}
return
-
- // ignore propagated txs from previous tests
- case *NewPooledTransactionHashes66:
+ case *eth.NewPooledTransactionHashesPacket68:
continue
- case *NewPooledTransactionHashes:
- continue
- case *Transactions:
- continue
-
- // ignore block announcements from previous tests
- case *NewBlockHashes:
- continue
- case *NewBlock:
+ case *eth.TransactionsPacket:
continue
default:
t.Fatalf("unexpected %s", pretty.Sdump(msg))
}
}
}
+
+func makeSidecar(data ...byte) *types.BlobTxSidecar {
+ var (
+ blobs = make([]kzg4844.Blob, len(data))
+ commitments []kzg4844.Commitment
+ proofs []kzg4844.Proof
+ )
+ for i := range blobs {
+ blobs[i][0] = data[i]
+ c, _ := kzg4844.BlobToCommitment(blobs[i])
+ p, _ := kzg4844.ComputeBlobProof(blobs[i], c)
+ commitments = append(commitments, c)
+ proofs = append(proofs, p)
+ }
+ return &types.BlobTxSidecar{
+ Blobs: blobs,
+ Commitments: commitments,
+ Proofs: proofs,
+ }
+}
+
+func (s *Suite) makeBlobTxs(count, blobs int, discriminator byte) (txs types.Transactions) {
+ from, nonce := s.chain.GetSender(5)
+ for i := 0; i < count; i++ {
+ // Make blob data, max of 2 blobs per tx.
+ blobdata := make([]byte, blobs%2)
+ for i := range blobdata {
+ blobdata[i] = discriminator
+ blobs -= 1
+ }
+ inner := &types.BlobTx{
+ ChainID: uint256.MustFromBig(s.chain.config.ChainID),
+ Nonce: nonce + uint64(i),
+ GasTipCap: uint256.NewInt(1),
+ GasFeeCap: uint256.MustFromBig(s.chain.Head().BaseFee()),
+ Gas: 100000,
+ BlobFeeCap: uint256.MustFromBig(eip4844.CalcBlobFee(*s.chain.Head().ExcessBlobGas())),
+ BlobHashes: makeSidecar(blobdata...).BlobHashes(),
+ Sidecar: makeSidecar(blobdata...),
+ }
+ tx, err := s.chain.SignTx(from, types.NewTx(inner))
+ if err != nil {
+ panic("blob tx signing failed")
+ }
+ txs = append(txs, tx)
+ }
+ return txs
+}
+
+func (s *Suite) TestBlobViolations(t *utesting.T) {
+ if err := s.engine.sendForkchoiceUpdated(); err != nil {
+ t.Fatalf("send fcu failed: %v", err)
+ }
+ // Create blob txs for each tests with unique tx hashes.
+ var (
+ t1 = s.makeBlobTxs(2, 3, 0x1)
+ t2 = s.makeBlobTxs(2, 3, 0x2)
+ )
+ for _, test := range []struct {
+ ann eth.NewPooledTransactionHashesPacket68
+ resp eth.PooledTransactionsResponse
+ }{
+ // Invalid tx size.
+ {
+ ann: eth.NewPooledTransactionHashesPacket68{
+ Types: []byte{types.BlobTxType, types.BlobTxType},
+ Sizes: []uint32{uint32(t1[0].Size()), uint32(t1[1].Size() + 10)},
+ Hashes: []common.Hash{t1[0].Hash(), t1[1].Hash()},
+ },
+ resp: eth.PooledTransactionsResponse(t1),
+ },
+ // Wrong tx type.
+ {
+ ann: eth.NewPooledTransactionHashesPacket68{
+ Types: []byte{types.DynamicFeeTxType, types.BlobTxType},
+ Sizes: []uint32{uint32(t2[0].Size()), uint32(t2[1].Size())},
+ Hashes: []common.Hash{t2[0].Hash(), t2[1].Hash()},
+ },
+ resp: eth.PooledTransactionsResponse(t2),
+ },
+ } {
+ conn, err := s.dial()
+ if err != nil {
+ t.Fatalf("dial fail: %v", err)
+ }
+ if err := conn.peer(s.chain, nil); err != nil {
+ t.Fatalf("peering failed: %v", err)
+ }
+ if err := conn.Write(ethProto, eth.NewPooledTransactionHashesMsg, test.ann); err != nil {
+ t.Fatalf("sending announcement failed: %v", err)
+ }
+ req := new(eth.GetPooledTransactionsPacket)
+ if err := conn.ReadMsg(ethProto, eth.GetPooledTransactionsMsg, req); err != nil {
+ t.Fatalf("reading pooled tx request failed: %v", err)
+ }
+ resp := eth.PooledTransactionsPacket{RequestId: req.RequestId, PooledTransactionsResponse: test.resp}
+ if err := conn.Write(ethProto, eth.PooledTransactionsMsg, resp); err != nil {
+ t.Fatalf("writing pooled tx response failed: %v", err)
+ }
+ if code, _, err := conn.Read(); err != nil {
+ t.Fatalf("expected disconnect on blob violation, got err: %v", err)
+ } else if code != discMsg {
+ t.Fatalf("expected disconnect on blob violation, got msg code: %d", code)
+ }
+ conn.Close()
+ }
+}
diff --git a/cmd/devp2p/internal/ethtest/suite_test.go b/cmd/devp2p/internal/ethtest/suite_test.go
index b11cdb5b88..ad73bc9f90 100644
--- a/cmd/devp2p/internal/ethtest/suite_test.go
+++ b/cmd/devp2p/internal/ethtest/suite_test.go
@@ -17,38 +17,56 @@
package ethtest
import (
+ crand "crypto/rand"
+ "fmt"
"os"
+ "path"
"testing"
"time"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/eth"
+ "github.com/ethereum/go-ethereum/eth/catalyst"
"github.com/ethereum/go-ethereum/eth/ethconfig"
"github.com/ethereum/go-ethereum/internal/utesting"
"github.com/ethereum/go-ethereum/node"
"github.com/ethereum/go-ethereum/p2p"
)
-var (
- genesisFile = "./testdata/genesis.json"
- halfchainFile = "./testdata/halfchain.rlp"
- fullchainFile = "./testdata/chain.rlp"
-)
+func makeJWTSecret() (string, [32]byte, error) {
+ var secret [32]byte
+ if _, err := crand.Read(secret[:]); err != nil {
+ return "", secret, fmt.Errorf("failed to create jwt secret: %v", err)
+ }
+ jwtPath := path.Join(os.TempDir(), "jwt_secret")
+ if err := os.WriteFile(jwtPath, []byte(hexutil.Encode(secret[:])), 0600); err != nil {
+ return "", secret, fmt.Errorf("failed to prepare jwt secret file: %v", err)
+ }
+ return jwtPath, secret, nil
+}
func TestEthSuite(t *testing.T) {
- t.Parallel()
- geth, err := runGeth()
+ jwtPath, secret, err := makeJWTSecret()
+ if err != nil {
+ t.Fatalf("could not make jwt secret: %v", err)
+ }
+ geth, err := runGeth("./testdata", jwtPath)
if err != nil {
t.Fatalf("could not run geth: %v", err)
}
defer geth.Close()
- suite, err := NewSuite(geth.Server().Self(), fullchainFile, genesisFile)
+ suite, err := NewSuite(geth.Server().Self(), "./testdata", geth.HTTPAuthEndpoint(), common.Bytes2Hex(secret[:]))
if err != nil {
t.Fatalf("could not create new test suite: %v", err)
}
for _, test := range suite.EthTests() {
t.Run(test.Name, func(t *testing.T) {
- result := utesting.RunTAP([]utesting.Test{{Name: test.Name, Fn: test.Fn}}, os.Stdout)
+ if test.Slow && testing.Short() {
+ t.Skipf("%s: skipping in -short mode", test.Name)
+ }
+ result := utesting.RunTests([]utesting.Test{{Name: test.Name, Fn: test.Fn}}, os.Stdout)
if result[0].Failed {
t.Fatal()
}
@@ -57,20 +75,23 @@ func TestEthSuite(t *testing.T) {
}
func TestSnapSuite(t *testing.T) {
- t.Parallel()
- geth, err := runGeth()
+ jwtPath, secret, err := makeJWTSecret()
+ if err != nil {
+ t.Fatalf("could not make jwt secret: %v", err)
+ }
+ geth, err := runGeth("./testdata", jwtPath)
if err != nil {
t.Fatalf("could not run geth: %v", err)
}
defer geth.Close()
- suite, err := NewSuite(geth.Server().Self(), fullchainFile, genesisFile)
+ suite, err := NewSuite(geth.Server().Self(), "./testdata", geth.HTTPAuthEndpoint(), common.Bytes2Hex(secret[:]))
if err != nil {
t.Fatalf("could not create new test suite: %v", err)
}
for _, test := range suite.SnapTests() {
t.Run(test.Name, func(t *testing.T) {
- result := utesting.RunTAP([]utesting.Test{{Name: test.Name, Fn: test.Fn}}, os.Stdout)
+ result := utesting.RunTests([]utesting.Test{{Name: test.Name, Fn: test.Fn}}, os.Stdout)
if result[0].Failed {
t.Fatal()
}
@@ -79,20 +100,23 @@ func TestSnapSuite(t *testing.T) {
}
// runGeth creates and starts a geth node
-func runGeth() (*node.Node, error) {
+func runGeth(dir string, jwtPath string) (*node.Node, error) {
stack, err := node.New(&node.Config{
+ AuthAddr: "127.0.0.1",
+ AuthPort: 0,
P2P: p2p.Config{
ListenAddr: "127.0.0.1:0",
NoDiscovery: true,
MaxPeers: 10, // in case a test requires multiple connections, can be changed in the future
NoDial: true,
},
+ JWTSecret: jwtPath,
})
if err != nil {
return nil, err
}
- err = setupGeth(stack)
+ err = setupGeth(stack, dir)
if err != nil {
stack.Close()
return nil, err
@@ -104,12 +128,11 @@ func runGeth() (*node.Node, error) {
return stack, nil
}
-func setupGeth(stack *node.Node) error {
- chain, err := loadChain(halfchainFile, genesisFile)
+func setupGeth(stack *node.Node, dir string) error {
+ chain, err := NewChain(dir)
if err != nil {
return err
}
-
backend, err := eth.New(stack, ðconfig.Config{
Genesis: &chain.genesis,
NetworkId: chain.genesis.Config.ChainID.Uint64(), // 19763
@@ -122,8 +145,9 @@ func setupGeth(stack *node.Node) error {
if err != nil {
return err
}
- backend.SetSynced()
-
+ if err := catalyst.Register(stack, backend); err != nil {
+ return fmt.Errorf("failed to register catalyst service: %v", err)
+ }
_, err = backend.BlockChain().InsertChain(chain.blocks[1:])
return err
}
diff --git a/cmd/devp2p/internal/ethtest/testdata/accounts.json b/cmd/devp2p/internal/ethtest/testdata/accounts.json
new file mode 100644
index 0000000000..c9666235a8
--- /dev/null
+++ b/cmd/devp2p/internal/ethtest/testdata/accounts.json
@@ -0,0 +1,62 @@
+{
+ "0x0c2c51a0990aee1d73c1228de158688341557508": {
+ "key": "0xbfcd0e032489319f4e5ca03e643b2025db624be6cf99cbfed90c4502e3754850"
+ },
+ "0x14e46043e63d0e3cdcf2530519f4cfaf35058cb2": {
+ "key": "0x457075f6822ac29481154792f65c5f1ec335b4fea9ca20f3fea8fa1d78a12c68"
+ },
+ "0x16c57edf7fa9d9525378b0b81bf8a3ced0620c1c": {
+ "key": "0x865898edcf43206d138c93f1bbd86311f4657b057658558888aa5ac4309626a6"
+ },
+ "0x1f4924b14f34e24159387c0a4cdbaa32f3ddb0cf": {
+ "key": "0xee7f7875d826d7443ccc5c174e38b2c436095018774248a8074ee92d8914dcdb"
+ },
+ "0x1f5bde34b4afc686f136c7a3cb6ec376f7357759": {
+ "key": "0x25e6ce8611cefb5cd338aeaa9292ed2139714668d123a4fb156cabb42051b5b7"
+ },
+ "0x2d389075be5be9f2246ad654ce152cf05990b209": {
+ "key": "0x19168cd7767604b3d19b99dc3da1302b9ccb6ee9ad61660859e07acd4a2625dd"
+ },
+ "0x3ae75c08b4c907eb63a8960c45b86e1e9ab6123c": {
+ "key": "0x71aa7d299c7607dabfc3d0e5213d612b5e4a97455b596c2f642daac43fa5eeaa"
+ },
+ "0x4340ee1b812acb40a1eb561c019c327b243b92df": {
+ "key": "0x47f666f20e2175606355acec0ea1b37870c15e5797e962340da7ad7972a537e8"
+ },
+ "0x4a0f1452281bcec5bd90c3dce6162a5995bfe9df": {
+ "key": "0xa88293fefc623644969e2ce6919fb0dbd0fd64f640293b4bf7e1a81c97e7fc7f"
+ },
+ "0x4dde844b71bcdf95512fb4dc94e84fb67b512ed8": {
+ "key": "0x6e1e16a9c15641c73bf6e237f9293ab1d4e7c12b9adf83cfc94bcf969670f72d"
+ },
+ "0x5f552da00dfb4d3749d9e62dcee3c918855a86a0": {
+ "key": "0x41be4e00aac79f7ffbb3455053ec05e971645440d594c047cdcc56a3c7458bd6"
+ },
+ "0x654aa64f5fbefb84c270ec74211b81ca8c44a72e": {
+ "key": "0xc825f31cd8792851e33a290b3d749e553983111fc1f36dfbbdb45f101973f6a9"
+ },
+ "0x717f8aa2b982bee0e29f573d31df288663e1ce16": {
+ "key": "0x8d0faa04ae0f9bc3cd4c890aa025d5f40916f4729538b19471c0beefe11d9e19"
+ },
+ "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f": {
+ "key": "0x4552dbe6ca4699322b5d923d0c9bcdd24644f5db8bf89a085b67c6c49b8a1b91"
+ },
+ "0x83c7e323d189f18725ac510004fdc2941f8c4a78": {
+ "key": "0x34391cbbf06956bb506f45ec179cdd84df526aa364e27bbde65db9c15d866d00"
+ },
+ "0x84e75c28348fb86acea1a93a39426d7d60f4cc46": {
+ "key": "0xf6a8f1603b8368f3ca373292b7310c53bec7b508aecacd442554ebc1c5d0c856"
+ },
+ "0xc7b99a164efd027a93f147376cc7da7c67c6bbe0": {
+ "key": "0x8d56bcbcf2c1b7109e1396a28d7a0234e33544ade74ea32c460ce4a443b239b1"
+ },
+ "0xd803681e487e6ac18053afc5a6cd813c86ec3e4d": {
+ "key": "0xfc39d1c9ddbba176d806ebb42d7460189fe56ca163ad3eb6143bfc6beb6f6f72"
+ },
+ "0xe7d13f7aa2a838d24c59b40186a0aca1e21cffcc": {
+ "key": "0x9ee3fd550664b246ad7cdba07162dd25530a3b1d51476dd1d85bbc29f0592684"
+ },
+ "0xeda8645ba6948855e3b3cd596bbb07596d59c603": {
+ "key": "0x14cdde09d1640eb8c3cda063891b0453073f57719583381ff78811efa6d4199f"
+ }
+}
\ No newline at end of file
diff --git a/cmd/devp2p/internal/ethtest/testdata/chain.rlp b/cmd/devp2p/internal/ethtest/testdata/chain.rlp
index 5ebc2f3bb7..2964c02bb1 100644
Binary files a/cmd/devp2p/internal/ethtest/testdata/chain.rlp and b/cmd/devp2p/internal/ethtest/testdata/chain.rlp differ
diff --git a/cmd/devp2p/internal/ethtest/testdata/forkenv.json b/cmd/devp2p/internal/ethtest/testdata/forkenv.json
new file mode 100644
index 0000000000..86c49e2b97
--- /dev/null
+++ b/cmd/devp2p/internal/ethtest/testdata/forkenv.json
@@ -0,0 +1,20 @@
+{
+ "HIVE_CANCUN_TIMESTAMP": "840",
+ "HIVE_CHAIN_ID": "3503995874084926",
+ "HIVE_FORK_ARROW_GLACIER": "60",
+ "HIVE_FORK_BERLIN": "48",
+ "HIVE_FORK_BYZANTIUM": "18",
+ "HIVE_FORK_CONSTANTINOPLE": "24",
+ "HIVE_FORK_GRAY_GLACIER": "66",
+ "HIVE_FORK_HOMESTEAD": "0",
+ "HIVE_FORK_ISTANBUL": "36",
+ "HIVE_FORK_LONDON": "54",
+ "HIVE_FORK_MUIR_GLACIER": "42",
+ "HIVE_FORK_PETERSBURG": "30",
+ "HIVE_FORK_SPURIOUS": "12",
+ "HIVE_FORK_TANGERINE": "6",
+ "HIVE_MERGE_BLOCK_ID": "72",
+ "HIVE_NETWORK_ID": "3503995874084926",
+ "HIVE_SHANGHAI_TIMESTAMP": "780",
+ "HIVE_TERMINAL_TOTAL_DIFFICULTY": "9454784"
+}
\ No newline at end of file
diff --git a/cmd/devp2p/internal/ethtest/testdata/genesis.json b/cmd/devp2p/internal/ethtest/testdata/genesis.json
index b4de6e85a5..e8bb66bb3c 100644
--- a/cmd/devp2p/internal/ethtest/testdata/genesis.json
+++ b/cmd/devp2p/internal/ethtest/testdata/genesis.json
@@ -1,27 +1,112 @@
{
- "config": {
- "chainId": 19763,
- "homesteadBlock": 0,
- "eip150Block": 0,
- "eip155Block": 0,
- "eip158Block": 0,
- "byzantiumBlock": 0,
- "terminalTotalDifficultyPassed": true,
- "ethash": {}
+ "config": {
+ "chainId": 3503995874084926,
+ "homesteadBlock": 0,
+ "eip150Block": 6,
+ "eip155Block": 12,
+ "eip158Block": 12,
+ "byzantiumBlock": 18,
+ "constantinopleBlock": 24,
+ "petersburgBlock": 30,
+ "istanbulBlock": 36,
+ "muirGlacierBlock": 42,
+ "berlinBlock": 48,
+ "londonBlock": 54,
+ "arrowGlacierBlock": 60,
+ "grayGlacierBlock": 66,
+ "mergeNetsplitBlock": 72,
+ "shanghaiTime": 780,
+ "cancunTime": 840,
+ "terminalTotalDifficulty": 9454784,
+ "terminalTotalDifficultyPassed": true,
+ "ethash": {}
+ },
+ "nonce": "0x0",
+ "timestamp": "0x0",
+ "extraData": "0x68697665636861696e",
+ "gasLimit": "0x23f3e20",
+ "difficulty": "0x20000",
+ "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "coinbase": "0x0000000000000000000000000000000000000000",
+ "alloc": {
+ "000f3df6d732807ef1319fb7b8bb8522d0beac02": {
+ "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500",
+ "balance": "0x2a"
},
- "nonce": "0xdeadbeefdeadbeef",
- "timestamp": "0x0",
- "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
- "gasLimit": "0x80000000",
- "difficulty": "0x20000",
- "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
- "coinbase": "0x0000000000000000000000000000000000000000",
- "alloc": {
- "71562b71999873db5b286df957af199ec94617f7": {
- "balance": "0xffffffffffffffffffffffffff"
- }
+ "0c2c51a0990aee1d73c1228de158688341557508": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
},
- "number": "0x0",
- "gasUsed": "0x0",
- "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
-}
+ "14e46043e63d0e3cdcf2530519f4cfaf35058cb2": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "16c57edf7fa9d9525378b0b81bf8a3ced0620c1c": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "1f4924b14f34e24159387c0a4cdbaa32f3ddb0cf": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "1f5bde34b4afc686f136c7a3cb6ec376f7357759": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "2d389075be5be9f2246ad654ce152cf05990b209": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "3ae75c08b4c907eb63a8960c45b86e1e9ab6123c": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "4340ee1b812acb40a1eb561c019c327b243b92df": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "4a0f1452281bcec5bd90c3dce6162a5995bfe9df": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "4dde844b71bcdf95512fb4dc94e84fb67b512ed8": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "5f552da00dfb4d3749d9e62dcee3c918855a86a0": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "654aa64f5fbefb84c270ec74211b81ca8c44a72e": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "717f8aa2b982bee0e29f573d31df288663e1ce16": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "7435ed30a8b4aeb0877cef0c6e8cffe834eb865f": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "83c7e323d189f18725ac510004fdc2941f8c4a78": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "84e75c28348fb86acea1a93a39426d7d60f4cc46": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "8bebc8ba651aee624937e7d897853ac30c95a067": {
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000002",
+ "0x0000000000000000000000000000000000000000000000000000000000000003": "0x0000000000000000000000000000000000000000000000000000000000000003"
+ },
+ "balance": "0x1",
+ "nonce": "0x1"
+ },
+ "c7b99a164efd027a93f147376cc7da7c67c6bbe0": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "d803681e487e6ac18053afc5a6cd813c86ec3e4d": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "e7d13f7aa2a838d24c59b40186a0aca1e21cffcc": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ },
+ "eda8645ba6948855e3b3cd596bbb07596d59c603": {
+ "balance": "0xc097ce7bc90715b34b9f1000000000"
+ }
+ },
+ "number": "0x0",
+ "gasUsed": "0x0",
+ "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "baseFeePerGas": null,
+ "excessBlobGas": null,
+ "blobGasUsed": null
+}
\ No newline at end of file
diff --git a/cmd/devp2p/internal/ethtest/testdata/halfchain.rlp b/cmd/devp2p/internal/ethtest/testdata/halfchain.rlp
deleted file mode 100644
index 1a820734e1..0000000000
Binary files a/cmd/devp2p/internal/ethtest/testdata/halfchain.rlp and /dev/null differ
diff --git a/cmd/devp2p/internal/ethtest/testdata/headblock.json b/cmd/devp2p/internal/ethtest/testdata/headblock.json
new file mode 100644
index 0000000000..e84e96b0f0
--- /dev/null
+++ b/cmd/devp2p/internal/ethtest/testdata/headblock.json
@@ -0,0 +1,23 @@
+{
+ "parentHash": "0x96a73007443980c5e0985dfbb45279aa496dadea16918ad42c65c0bf8122ec39",
+ "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
+ "miner": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xea4c1f4d9fa8664c22574c5b2f948a78c4b1a753cebc1861e7fb5b1aa21c5a94",
+ "transactionsRoot": "0xecda39025fc4c609ce778d75eed0aa53b65ce1e3d1373b34bad8578cc31e5b48",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "difficulty": "0x0",
+ "number": "0x1f4",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x1388",
+ "extraData": "0x",
+ "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "nonce": "0x0000000000000000",
+ "baseFeePerGas": "0x7",
+ "withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0",
+ "parentBeaconBlockRoot": "0xf653da50cdff4733f13f7a5e338290e883bdf04adf3f112709728063ea965d6c",
+ "hash": "0x36a166f0dcd160fc5e5c61c9a7c2d7f236d9175bf27f43aaa2150e291f092ef7"
+}
\ No newline at end of file
diff --git a/cmd/devp2p/internal/ethtest/testdata/headfcu.json b/cmd/devp2p/internal/ethtest/testdata/headfcu.json
new file mode 100644
index 0000000000..920212d0c0
--- /dev/null
+++ b/cmd/devp2p/internal/ethtest/testdata/headfcu.json
@@ -0,0 +1,13 @@
+{
+ "jsonrpc": "2.0",
+ "id": "fcu500",
+ "method": "engine_forkchoiceUpdatedV3",
+ "params": [
+ {
+ "headBlockHash": "0x36a166f0dcd160fc5e5c61c9a7c2d7f236d9175bf27f43aaa2150e291f092ef7",
+ "safeBlockHash": "0x36a166f0dcd160fc5e5c61c9a7c2d7f236d9175bf27f43aaa2150e291f092ef7",
+ "finalizedBlockHash": "0x36a166f0dcd160fc5e5c61c9a7c2d7f236d9175bf27f43aaa2150e291f092ef7"
+ },
+ null
+ ]
+}
\ No newline at end of file
diff --git a/cmd/devp2p/internal/ethtest/testdata/headstate.json b/cmd/devp2p/internal/ethtest/testdata/headstate.json
new file mode 100644
index 0000000000..f7b076af69
--- /dev/null
+++ b/cmd/devp2p/internal/ethtest/testdata/headstate.json
@@ -0,0 +1,4204 @@
+{
+ "root": "ea4c1f4d9fa8664c22574c5b2f948a78c4b1a753cebc1861e7fb5b1aa21c5a94",
+ "accounts": {
+ "0x0000000000000000000000000000000000000000": {
+ "balance": "233437500000029008737",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x5380c7b7ae81a58eb98d9c78de4a1fd7fd9535fc953ed2be602daaa41767312a"
+ },
+ "0x000f3df6d732807ef1319fb7b8bb8522d0beac02": {
+ "balance": "42",
+ "nonce": 0,
+ "root": "0xac3162a8b9dbb4318b84219f3140e7a9ec35126234120297dde10f51b25f6a26",
+ "codeHash": "0xf57acd40259872606d76197ef052f3d35588dadf919ee1f0e3cb9b62d3f4b02c",
+ "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000348": "0348",
+ "0x0000000000000000000000000000000000000000000000000000000000000352": "0352",
+ "0x000000000000000000000000000000000000000000000000000000000000035c": "035c",
+ "0x0000000000000000000000000000000000000000000000000000000000000366": "0366",
+ "0x0000000000000000000000000000000000000000000000000000000000000370": "0370",
+ "0x000000000000000000000000000000000000000000000000000000000000037a": "037a",
+ "0x0000000000000000000000000000000000000000000000000000000000000384": "0384",
+ "0x000000000000000000000000000000000000000000000000000000000000038e": "038e",
+ "0x0000000000000000000000000000000000000000000000000000000000000398": "0398",
+ "0x00000000000000000000000000000000000000000000000000000000000003a2": "03a2",
+ "0x00000000000000000000000000000000000000000000000000000000000003ac": "03ac",
+ "0x00000000000000000000000000000000000000000000000000000000000003b6": "03b6",
+ "0x00000000000000000000000000000000000000000000000000000000000003c0": "03c0",
+ "0x00000000000000000000000000000000000000000000000000000000000003ca": "03ca",
+ "0x00000000000000000000000000000000000000000000000000000000000003d4": "03d4",
+ "0x00000000000000000000000000000000000000000000000000000000000003de": "03de",
+ "0x00000000000000000000000000000000000000000000000000000000000003e8": "03e8",
+ "0x00000000000000000000000000000000000000000000000000000000000003f2": "03f2",
+ "0x00000000000000000000000000000000000000000000000000000000000003fc": "03fc",
+ "0x0000000000000000000000000000000000000000000000000000000000000406": "0406",
+ "0x0000000000000000000000000000000000000000000000000000000000000410": "0410",
+ "0x000000000000000000000000000000000000000000000000000000000000041a": "041a",
+ "0x0000000000000000000000000000000000000000000000000000000000000424": "0424",
+ "0x000000000000000000000000000000000000000000000000000000000000042e": "042e",
+ "0x0000000000000000000000000000000000000000000000000000000000000438": "0438",
+ "0x0000000000000000000000000000000000000000000000000000000000000442": "0442",
+ "0x000000000000000000000000000000000000000000000000000000000000044c": "044c",
+ "0x0000000000000000000000000000000000000000000000000000000000000456": "0456",
+ "0x0000000000000000000000000000000000000000000000000000000000000460": "0460",
+ "0x000000000000000000000000000000000000000000000000000000000000046a": "046a",
+ "0x0000000000000000000000000000000000000000000000000000000000000474": "0474",
+ "0x000000000000000000000000000000000000000000000000000000000000047e": "047e",
+ "0x0000000000000000000000000000000000000000000000000000000000000488": "0488",
+ "0x0000000000000000000000000000000000000000000000000000000000000492": "0492",
+ "0x000000000000000000000000000000000000000000000000000000000000049c": "049c",
+ "0x00000000000000000000000000000000000000000000000000000000000004a6": "04a6",
+ "0x00000000000000000000000000000000000000000000000000000000000004b0": "04b0",
+ "0x00000000000000000000000000000000000000000000000000000000000004ba": "04ba",
+ "0x00000000000000000000000000000000000000000000000000000000000004c4": "04c4",
+ "0x00000000000000000000000000000000000000000000000000000000000004ce": "04ce",
+ "0x00000000000000000000000000000000000000000000000000000000000004d8": "04d8",
+ "0x00000000000000000000000000000000000000000000000000000000000004e2": "04e2",
+ "0x00000000000000000000000000000000000000000000000000000000000004ec": "04ec",
+ "0x00000000000000000000000000000000000000000000000000000000000004f6": "04f6",
+ "0x0000000000000000000000000000000000000000000000000000000000000500": "0500",
+ "0x000000000000000000000000000000000000000000000000000000000000050a": "050a",
+ "0x0000000000000000000000000000000000000000000000000000000000000514": "0514",
+ "0x000000000000000000000000000000000000000000000000000000000000051e": "051e",
+ "0x0000000000000000000000000000000000000000000000000000000000000528": "0528",
+ "0x0000000000000000000000000000000000000000000000000000000000000532": "0532",
+ "0x000000000000000000000000000000000000000000000000000000000000053c": "053c",
+ "0x0000000000000000000000000000000000000000000000000000000000000546": "0546",
+ "0x0000000000000000000000000000000000000000000000000000000000000550": "0550",
+ "0x000000000000000000000000000000000000000000000000000000000000055a": "055a",
+ "0x0000000000000000000000000000000000000000000000000000000000000564": "0564",
+ "0x000000000000000000000000000000000000000000000000000000000000056e": "056e",
+ "0x0000000000000000000000000000000000000000000000000000000000000578": "0578",
+ "0x0000000000000000000000000000000000000000000000000000000000000582": "0582",
+ "0x000000000000000000000000000000000000000000000000000000000000058c": "058c",
+ "0x0000000000000000000000000000000000000000000000000000000000000596": "0596",
+ "0x00000000000000000000000000000000000000000000000000000000000005a0": "05a0",
+ "0x00000000000000000000000000000000000000000000000000000000000005aa": "05aa",
+ "0x00000000000000000000000000000000000000000000000000000000000005b4": "05b4",
+ "0x00000000000000000000000000000000000000000000000000000000000005be": "05be",
+ "0x00000000000000000000000000000000000000000000000000000000000005c8": "05c8",
+ "0x00000000000000000000000000000000000000000000000000000000000005d2": "05d2",
+ "0x00000000000000000000000000000000000000000000000000000000000005dc": "05dc",
+ "0x00000000000000000000000000000000000000000000000000000000000005e6": "05e6",
+ "0x00000000000000000000000000000000000000000000000000000000000005f0": "05f0",
+ "0x00000000000000000000000000000000000000000000000000000000000005fa": "05fa",
+ "0x0000000000000000000000000000000000000000000000000000000000000604": "0604",
+ "0x000000000000000000000000000000000000000000000000000000000000060e": "060e",
+ "0x0000000000000000000000000000000000000000000000000000000000000618": "0618",
+ "0x0000000000000000000000000000000000000000000000000000000000000622": "0622",
+ "0x000000000000000000000000000000000000000000000000000000000000062c": "062c",
+ "0x0000000000000000000000000000000000000000000000000000000000000636": "0636",
+ "0x0000000000000000000000000000000000000000000000000000000000000640": "0640",
+ "0x000000000000000000000000000000000000000000000000000000000000064a": "064a",
+ "0x0000000000000000000000000000000000000000000000000000000000000654": "0654",
+ "0x000000000000000000000000000000000000000000000000000000000000065e": "065e",
+ "0x0000000000000000000000000000000000000000000000000000000000000668": "0668",
+ "0x0000000000000000000000000000000000000000000000000000000000000672": "0672",
+ "0x000000000000000000000000000000000000000000000000000000000000067c": "067c",
+ "0x0000000000000000000000000000000000000000000000000000000000000686": "0686",
+ "0x0000000000000000000000000000000000000000000000000000000000000690": "0690",
+ "0x000000000000000000000000000000000000000000000000000000000000069a": "069a",
+ "0x00000000000000000000000000000000000000000000000000000000000006a4": "06a4",
+ "0x00000000000000000000000000000000000000000000000000000000000006ae": "06ae",
+ "0x00000000000000000000000000000000000000000000000000000000000006b8": "06b8",
+ "0x00000000000000000000000000000000000000000000000000000000000006c2": "06c2",
+ "0x00000000000000000000000000000000000000000000000000000000000006cc": "06cc",
+ "0x00000000000000000000000000000000000000000000000000000000000006d6": "06d6",
+ "0x00000000000000000000000000000000000000000000000000000000000006e0": "06e0",
+ "0x00000000000000000000000000000000000000000000000000000000000006ea": "06ea",
+ "0x00000000000000000000000000000000000000000000000000000000000006f4": "06f4",
+ "0x00000000000000000000000000000000000000000000000000000000000006fe": "06fe",
+ "0x0000000000000000000000000000000000000000000000000000000000000708": "0708",
+ "0x0000000000000000000000000000000000000000000000000000000000000712": "0712",
+ "0x000000000000000000000000000000000000000000000000000000000000071c": "071c",
+ "0x0000000000000000000000000000000000000000000000000000000000000726": "0726",
+ "0x0000000000000000000000000000000000000000000000000000000000000730": "0730",
+ "0x000000000000000000000000000000000000000000000000000000000000073a": "073a",
+ "0x0000000000000000000000000000000000000000000000000000000000000744": "0744",
+ "0x000000000000000000000000000000000000000000000000000000000000074e": "074e",
+ "0x0000000000000000000000000000000000000000000000000000000000000758": "0758",
+ "0x0000000000000000000000000000000000000000000000000000000000000762": "0762",
+ "0x000000000000000000000000000000000000000000000000000000000000076c": "076c",
+ "0x0000000000000000000000000000000000000000000000000000000000000776": "0776",
+ "0x0000000000000000000000000000000000000000000000000000000000000780": "0780",
+ "0x000000000000000000000000000000000000000000000000000000000000078a": "078a",
+ "0x0000000000000000000000000000000000000000000000000000000000000794": "0794",
+ "0x000000000000000000000000000000000000000000000000000000000000079e": "079e",
+ "0x00000000000000000000000000000000000000000000000000000000000007a8": "07a8",
+ "0x00000000000000000000000000000000000000000000000000000000000007b2": "07b2",
+ "0x00000000000000000000000000000000000000000000000000000000000007bc": "07bc",
+ "0x00000000000000000000000000000000000000000000000000000000000007c6": "07c6",
+ "0x00000000000000000000000000000000000000000000000000000000000007d0": "07d0",
+ "0x00000000000000000000000000000000000000000000000000000000000007da": "07da",
+ "0x00000000000000000000000000000000000000000000000000000000000007e4": "07e4",
+ "0x00000000000000000000000000000000000000000000000000000000000007ee": "07ee",
+ "0x00000000000000000000000000000000000000000000000000000000000007f8": "07f8",
+ "0x0000000000000000000000000000000000000000000000000000000000000802": "0802",
+ "0x000000000000000000000000000000000000000000000000000000000000080c": "080c",
+ "0x0000000000000000000000000000000000000000000000000000000000000816": "0816",
+ "0x0000000000000000000000000000000000000000000000000000000000000820": "0820",
+ "0x000000000000000000000000000000000000000000000000000000000000082a": "082a",
+ "0x0000000000000000000000000000000000000000000000000000000000000834": "0834",
+ "0x000000000000000000000000000000000000000000000000000000000000083e": "083e",
+ "0x0000000000000000000000000000000000000000000000000000000000000848": "0848",
+ "0x0000000000000000000000000000000000000000000000000000000000000852": "0852",
+ "0x000000000000000000000000000000000000000000000000000000000000085c": "085c",
+ "0x0000000000000000000000000000000000000000000000000000000000000866": "0866",
+ "0x0000000000000000000000000000000000000000000000000000000000000870": "0870",
+ "0x000000000000000000000000000000000000000000000000000000000000087a": "087a",
+ "0x0000000000000000000000000000000000000000000000000000000000000884": "0884",
+ "0x000000000000000000000000000000000000000000000000000000000000088e": "088e",
+ "0x0000000000000000000000000000000000000000000000000000000000000898": "0898",
+ "0x00000000000000000000000000000000000000000000000000000000000008a2": "08a2",
+ "0x00000000000000000000000000000000000000000000000000000000000008ac": "08ac",
+ "0x00000000000000000000000000000000000000000000000000000000000008b6": "08b6",
+ "0x00000000000000000000000000000000000000000000000000000000000008c0": "08c0",
+ "0x00000000000000000000000000000000000000000000000000000000000008ca": "08ca",
+ "0x00000000000000000000000000000000000000000000000000000000000008d4": "08d4",
+ "0x00000000000000000000000000000000000000000000000000000000000008de": "08de",
+ "0x00000000000000000000000000000000000000000000000000000000000008e8": "08e8",
+ "0x00000000000000000000000000000000000000000000000000000000000008f2": "08f2",
+ "0x00000000000000000000000000000000000000000000000000000000000008fc": "08fc",
+ "0x0000000000000000000000000000000000000000000000000000000000000906": "0906",
+ "0x0000000000000000000000000000000000000000000000000000000000000910": "0910",
+ "0x000000000000000000000000000000000000000000000000000000000000091a": "091a",
+ "0x0000000000000000000000000000000000000000000000000000000000000924": "0924",
+ "0x000000000000000000000000000000000000000000000000000000000000092e": "092e",
+ "0x0000000000000000000000000000000000000000000000000000000000000938": "0938",
+ "0x0000000000000000000000000000000000000000000000000000000000000942": "0942",
+ "0x000000000000000000000000000000000000000000000000000000000000094c": "094c",
+ "0x0000000000000000000000000000000000000000000000000000000000000956": "0956",
+ "0x0000000000000000000000000000000000000000000000000000000000000960": "0960",
+ "0x000000000000000000000000000000000000000000000000000000000000096a": "096a",
+ "0x0000000000000000000000000000000000000000000000000000000000000974": "0974",
+ "0x000000000000000000000000000000000000000000000000000000000000097e": "097e",
+ "0x0000000000000000000000000000000000000000000000000000000000000988": "0988",
+ "0x0000000000000000000000000000000000000000000000000000000000000992": "0992",
+ "0x000000000000000000000000000000000000000000000000000000000000099c": "099c",
+ "0x00000000000000000000000000000000000000000000000000000000000009a6": "09a6",
+ "0x00000000000000000000000000000000000000000000000000000000000009b0": "09b0",
+ "0x00000000000000000000000000000000000000000000000000000000000009ba": "09ba",
+ "0x00000000000000000000000000000000000000000000000000000000000009c4": "09c4",
+ "0x00000000000000000000000000000000000000000000000000000000000009ce": "09ce",
+ "0x00000000000000000000000000000000000000000000000000000000000009d8": "09d8",
+ "0x00000000000000000000000000000000000000000000000000000000000009e2": "09e2",
+ "0x00000000000000000000000000000000000000000000000000000000000009ec": "09ec",
+ "0x00000000000000000000000000000000000000000000000000000000000009f6": "09f6",
+ "0x0000000000000000000000000000000000000000000000000000000000000a00": "0a00",
+ "0x0000000000000000000000000000000000000000000000000000000000000a0a": "0a0a",
+ "0x0000000000000000000000000000000000000000000000000000000000000a14": "0a14",
+ "0x0000000000000000000000000000000000000000000000000000000000000a1e": "0a1e",
+ "0x0000000000000000000000000000000000000000000000000000000000000a28": "0a28",
+ "0x0000000000000000000000000000000000000000000000000000000000000a32": "0a32",
+ "0x0000000000000000000000000000000000000000000000000000000000000a3c": "0a3c",
+ "0x0000000000000000000000000000000000000000000000000000000000000a46": "0a46",
+ "0x0000000000000000000000000000000000000000000000000000000000000a50": "0a50",
+ "0x0000000000000000000000000000000000000000000000000000000000000a5a": "0a5a",
+ "0x0000000000000000000000000000000000000000000000000000000000000a64": "0a64",
+ "0x0000000000000000000000000000000000000000000000000000000000000a6e": "0a6e",
+ "0x0000000000000000000000000000000000000000000000000000000000000a78": "0a78",
+ "0x0000000000000000000000000000000000000000000000000000000000000a82": "0a82",
+ "0x0000000000000000000000000000000000000000000000000000000000000a8c": "0a8c",
+ "0x0000000000000000000000000000000000000000000000000000000000000a96": "0a96",
+ "0x0000000000000000000000000000000000000000000000000000000000000aa0": "0aa0",
+ "0x0000000000000000000000000000000000000000000000000000000000000aaa": "0aaa",
+ "0x0000000000000000000000000000000000000000000000000000000000000ab4": "0ab4",
+ "0x0000000000000000000000000000000000000000000000000000000000000abe": "0abe",
+ "0x0000000000000000000000000000000000000000000000000000000000000ac8": "0ac8",
+ "0x0000000000000000000000000000000000000000000000000000000000000ad2": "0ad2",
+ "0x0000000000000000000000000000000000000000000000000000000000000adc": "0adc",
+ "0x0000000000000000000000000000000000000000000000000000000000000ae6": "0ae6",
+ "0x0000000000000000000000000000000000000000000000000000000000000af0": "0af0",
+ "0x0000000000000000000000000000000000000000000000000000000000000afa": "0afa",
+ "0x0000000000000000000000000000000000000000000000000000000000000b04": "0b04",
+ "0x0000000000000000000000000000000000000000000000000000000000000b0e": "0b0e",
+ "0x0000000000000000000000000000000000000000000000000000000000000b18": "0b18",
+ "0x0000000000000000000000000000000000000000000000000000000000000b22": "0b22",
+ "0x0000000000000000000000000000000000000000000000000000000000000b2c": "0b2c",
+ "0x0000000000000000000000000000000000000000000000000000000000000b36": "0b36",
+ "0x0000000000000000000000000000000000000000000000000000000000000b40": "0b40",
+ "0x0000000000000000000000000000000000000000000000000000000000000b4a": "0b4a",
+ "0x0000000000000000000000000000000000000000000000000000000000000b54": "0b54",
+ "0x0000000000000000000000000000000000000000000000000000000000000b5e": "0b5e",
+ "0x0000000000000000000000000000000000000000000000000000000000000b68": "0b68",
+ "0x0000000000000000000000000000000000000000000000000000000000000b72": "0b72",
+ "0x0000000000000000000000000000000000000000000000000000000000000b7c": "0b7c",
+ "0x0000000000000000000000000000000000000000000000000000000000000b86": "0b86",
+ "0x0000000000000000000000000000000000000000000000000000000000000b90": "0b90",
+ "0x0000000000000000000000000000000000000000000000000000000000000b9a": "0b9a",
+ "0x0000000000000000000000000000000000000000000000000000000000000ba4": "0ba4",
+ "0x0000000000000000000000000000000000000000000000000000000000000bae": "0bae",
+ "0x0000000000000000000000000000000000000000000000000000000000000bb8": "0bb8",
+ "0x0000000000000000000000000000000000000000000000000000000000000bc2": "0bc2",
+ "0x0000000000000000000000000000000000000000000000000000000000000bcc": "0bcc",
+ "0x0000000000000000000000000000000000000000000000000000000000000bd6": "0bd6",
+ "0x0000000000000000000000000000000000000000000000000000000000000be0": "0be0",
+ "0x0000000000000000000000000000000000000000000000000000000000000bea": "0bea",
+ "0x0000000000000000000000000000000000000000000000000000000000000bf4": "0bf4",
+ "0x0000000000000000000000000000000000000000000000000000000000000bfe": "0bfe",
+ "0x0000000000000000000000000000000000000000000000000000000000000c08": "0c08",
+ "0x0000000000000000000000000000000000000000000000000000000000000c12": "0c12",
+ "0x0000000000000000000000000000000000000000000000000000000000000c1c": "0c1c",
+ "0x0000000000000000000000000000000000000000000000000000000000000c26": "0c26",
+ "0x0000000000000000000000000000000000000000000000000000000000000c30": "0c30",
+ "0x0000000000000000000000000000000000000000000000000000000000000c3a": "0c3a",
+ "0x0000000000000000000000000000000000000000000000000000000000000c44": "0c44",
+ "0x0000000000000000000000000000000000000000000000000000000000000c4e": "0c4e",
+ "0x0000000000000000000000000000000000000000000000000000000000000c58": "0c58",
+ "0x0000000000000000000000000000000000000000000000000000000000000c62": "0c62",
+ "0x0000000000000000000000000000000000000000000000000000000000000c6c": "0c6c",
+ "0x0000000000000000000000000000000000000000000000000000000000000c76": "0c76",
+ "0x0000000000000000000000000000000000000000000000000000000000000c80": "0c80",
+ "0x0000000000000000000000000000000000000000000000000000000000000c8a": "0c8a",
+ "0x0000000000000000000000000000000000000000000000000000000000000c94": "0c94",
+ "0x0000000000000000000000000000000000000000000000000000000000000c9e": "0c9e",
+ "0x0000000000000000000000000000000000000000000000000000000000000ca8": "0ca8",
+ "0x0000000000000000000000000000000000000000000000000000000000000cb2": "0cb2",
+ "0x0000000000000000000000000000000000000000000000000000000000000cbc": "0cbc",
+ "0x0000000000000000000000000000000000000000000000000000000000000cc6": "0cc6",
+ "0x0000000000000000000000000000000000000000000000000000000000000cd0": "0cd0",
+ "0x0000000000000000000000000000000000000000000000000000000000000cda": "0cda",
+ "0x0000000000000000000000000000000000000000000000000000000000000ce4": "0ce4",
+ "0x0000000000000000000000000000000000000000000000000000000000000cee": "0cee",
+ "0x0000000000000000000000000000000000000000000000000000000000000cf8": "0cf8",
+ "0x0000000000000000000000000000000000000000000000000000000000000d02": "0d02",
+ "0x0000000000000000000000000000000000000000000000000000000000000d0c": "0d0c",
+ "0x0000000000000000000000000000000000000000000000000000000000000d16": "0d16",
+ "0x0000000000000000000000000000000000000000000000000000000000000d20": "0d20",
+ "0x0000000000000000000000000000000000000000000000000000000000000d2a": "0d2a",
+ "0x0000000000000000000000000000000000000000000000000000000000000d34": "0d34",
+ "0x0000000000000000000000000000000000000000000000000000000000000d3e": "0d3e",
+ "0x0000000000000000000000000000000000000000000000000000000000000d48": "0d48",
+ "0x0000000000000000000000000000000000000000000000000000000000000d52": "0d52",
+ "0x0000000000000000000000000000000000000000000000000000000000000d5c": "0d5c",
+ "0x0000000000000000000000000000000000000000000000000000000000000d66": "0d66",
+ "0x0000000000000000000000000000000000000000000000000000000000000d70": "0d70",
+ "0x0000000000000000000000000000000000000000000000000000000000000d7a": "0d7a",
+ "0x0000000000000000000000000000000000000000000000000000000000000d84": "0d84",
+ "0x0000000000000000000000000000000000000000000000000000000000000d8e": "0d8e",
+ "0x0000000000000000000000000000000000000000000000000000000000000d98": "0d98",
+ "0x0000000000000000000000000000000000000000000000000000000000000da2": "0da2",
+ "0x0000000000000000000000000000000000000000000000000000000000000dac": "0dac",
+ "0x0000000000000000000000000000000000000000000000000000000000000db6": "0db6",
+ "0x0000000000000000000000000000000000000000000000000000000000000dc0": "0dc0",
+ "0x0000000000000000000000000000000000000000000000000000000000000dca": "0dca",
+ "0x0000000000000000000000000000000000000000000000000000000000000dd4": "0dd4",
+ "0x0000000000000000000000000000000000000000000000000000000000000dde": "0dde",
+ "0x0000000000000000000000000000000000000000000000000000000000000de8": "0de8",
+ "0x0000000000000000000000000000000000000000000000000000000000000df2": "0df2",
+ "0x0000000000000000000000000000000000000000000000000000000000000dfc": "0dfc",
+ "0x0000000000000000000000000000000000000000000000000000000000000e06": "0e06",
+ "0x0000000000000000000000000000000000000000000000000000000000000e10": "0e10",
+ "0x0000000000000000000000000000000000000000000000000000000000000e1a": "0e1a",
+ "0x0000000000000000000000000000000000000000000000000000000000000e24": "0e24",
+ "0x0000000000000000000000000000000000000000000000000000000000000e2e": "0e2e",
+ "0x0000000000000000000000000000000000000000000000000000000000000e38": "0e38",
+ "0x0000000000000000000000000000000000000000000000000000000000000e42": "0e42",
+ "0x0000000000000000000000000000000000000000000000000000000000000e4c": "0e4c",
+ "0x0000000000000000000000000000000000000000000000000000000000000e56": "0e56",
+ "0x0000000000000000000000000000000000000000000000000000000000000e60": "0e60",
+ "0x0000000000000000000000000000000000000000000000000000000000000e6a": "0e6a",
+ "0x0000000000000000000000000000000000000000000000000000000000000e74": "0e74",
+ "0x0000000000000000000000000000000000000000000000000000000000000e7e": "0e7e",
+ "0x0000000000000000000000000000000000000000000000000000000000000e88": "0e88",
+ "0x0000000000000000000000000000000000000000000000000000000000000e92": "0e92",
+ "0x0000000000000000000000000000000000000000000000000000000000000e9c": "0e9c",
+ "0x0000000000000000000000000000000000000000000000000000000000000ea6": "0ea6",
+ "0x0000000000000000000000000000000000000000000000000000000000000eb0": "0eb0",
+ "0x0000000000000000000000000000000000000000000000000000000000000eba": "0eba",
+ "0x0000000000000000000000000000000000000000000000000000000000000ec4": "0ec4",
+ "0x0000000000000000000000000000000000000000000000000000000000000ece": "0ece",
+ "0x0000000000000000000000000000000000000000000000000000000000000ed8": "0ed8",
+ "0x0000000000000000000000000000000000000000000000000000000000000ee2": "0ee2",
+ "0x0000000000000000000000000000000000000000000000000000000000000eec": "0eec",
+ "0x0000000000000000000000000000000000000000000000000000000000000ef6": "0ef6",
+ "0x0000000000000000000000000000000000000000000000000000000000000f00": "0f00",
+ "0x0000000000000000000000000000000000000000000000000000000000000f0a": "0f0a",
+ "0x0000000000000000000000000000000000000000000000000000000000000f14": "0f14",
+ "0x0000000000000000000000000000000000000000000000000000000000000f1e": "0f1e",
+ "0x0000000000000000000000000000000000000000000000000000000000000f28": "0f28",
+ "0x0000000000000000000000000000000000000000000000000000000000000f32": "0f32",
+ "0x0000000000000000000000000000000000000000000000000000000000000f3c": "0f3c",
+ "0x0000000000000000000000000000000000000000000000000000000000000f46": "0f46",
+ "0x0000000000000000000000000000000000000000000000000000000000000f50": "0f50",
+ "0x0000000000000000000000000000000000000000000000000000000000000f5a": "0f5a",
+ "0x0000000000000000000000000000000000000000000000000000000000000f64": "0f64",
+ "0x0000000000000000000000000000000000000000000000000000000000000f6e": "0f6e",
+ "0x0000000000000000000000000000000000000000000000000000000000000f78": "0f78",
+ "0x0000000000000000000000000000000000000000000000000000000000000f82": "0f82",
+ "0x0000000000000000000000000000000000000000000000000000000000000f8c": "0f8c",
+ "0x0000000000000000000000000000000000000000000000000000000000000f96": "0f96",
+ "0x0000000000000000000000000000000000000000000000000000000000000fa0": "0fa0",
+ "0x0000000000000000000000000000000000000000000000000000000000000faa": "0faa",
+ "0x0000000000000000000000000000000000000000000000000000000000000fb4": "0fb4",
+ "0x0000000000000000000000000000000000000000000000000000000000000fbe": "0fbe",
+ "0x0000000000000000000000000000000000000000000000000000000000000fc8": "0fc8",
+ "0x0000000000000000000000000000000000000000000000000000000000000fd2": "0fd2",
+ "0x0000000000000000000000000000000000000000000000000000000000000fdc": "0fdc",
+ "0x0000000000000000000000000000000000000000000000000000000000000fe6": "0fe6",
+ "0x0000000000000000000000000000000000000000000000000000000000000ff0": "0ff0",
+ "0x0000000000000000000000000000000000000000000000000000000000000ffa": "0ffa",
+ "0x0000000000000000000000000000000000000000000000000000000000001004": "1004",
+ "0x000000000000000000000000000000000000000000000000000000000000100e": "100e",
+ "0x0000000000000000000000000000000000000000000000000000000000001018": "1018",
+ "0x0000000000000000000000000000000000000000000000000000000000001022": "1022",
+ "0x000000000000000000000000000000000000000000000000000000000000102c": "102c",
+ "0x0000000000000000000000000000000000000000000000000000000000001036": "1036",
+ "0x0000000000000000000000000000000000000000000000000000000000001040": "1040",
+ "0x000000000000000000000000000000000000000000000000000000000000104a": "104a",
+ "0x0000000000000000000000000000000000000000000000000000000000001054": "1054",
+ "0x000000000000000000000000000000000000000000000000000000000000105e": "105e",
+ "0x0000000000000000000000000000000000000000000000000000000000001068": "1068",
+ "0x0000000000000000000000000000000000000000000000000000000000001072": "1072",
+ "0x000000000000000000000000000000000000000000000000000000000000107c": "107c",
+ "0x0000000000000000000000000000000000000000000000000000000000001086": "1086",
+ "0x0000000000000000000000000000000000000000000000000000000000001090": "1090",
+ "0x000000000000000000000000000000000000000000000000000000000000109a": "109a",
+ "0x00000000000000000000000000000000000000000000000000000000000010a4": "10a4",
+ "0x00000000000000000000000000000000000000000000000000000000000010ae": "10ae",
+ "0x00000000000000000000000000000000000000000000000000000000000010b8": "10b8",
+ "0x00000000000000000000000000000000000000000000000000000000000010c2": "10c2",
+ "0x00000000000000000000000000000000000000000000000000000000000010cc": "10cc",
+ "0x00000000000000000000000000000000000000000000000000000000000010d6": "10d6",
+ "0x00000000000000000000000000000000000000000000000000000000000010e0": "10e0",
+ "0x00000000000000000000000000000000000000000000000000000000000010ea": "10ea",
+ "0x00000000000000000000000000000000000000000000000000000000000010f4": "10f4",
+ "0x00000000000000000000000000000000000000000000000000000000000010fe": "10fe",
+ "0x0000000000000000000000000000000000000000000000000000000000001108": "1108",
+ "0x0000000000000000000000000000000000000000000000000000000000001112": "1112",
+ "0x000000000000000000000000000000000000000000000000000000000000111c": "111c",
+ "0x0000000000000000000000000000000000000000000000000000000000001126": "1126",
+ "0x0000000000000000000000000000000000000000000000000000000000001130": "1130",
+ "0x000000000000000000000000000000000000000000000000000000000000113a": "113a",
+ "0x0000000000000000000000000000000000000000000000000000000000001144": "1144",
+ "0x000000000000000000000000000000000000000000000000000000000000114e": "114e",
+ "0x0000000000000000000000000000000000000000000000000000000000001158": "1158",
+ "0x0000000000000000000000000000000000000000000000000000000000001162": "1162",
+ "0x000000000000000000000000000000000000000000000000000000000000116c": "116c",
+ "0x0000000000000000000000000000000000000000000000000000000000001176": "1176",
+ "0x0000000000000000000000000000000000000000000000000000000000001180": "1180",
+ "0x000000000000000000000000000000000000000000000000000000000000118a": "118a",
+ "0x0000000000000000000000000000000000000000000000000000000000001194": "1194",
+ "0x000000000000000000000000000000000000000000000000000000000000119e": "119e",
+ "0x00000000000000000000000000000000000000000000000000000000000011a8": "11a8",
+ "0x00000000000000000000000000000000000000000000000000000000000011b2": "11b2",
+ "0x00000000000000000000000000000000000000000000000000000000000011bc": "11bc",
+ "0x00000000000000000000000000000000000000000000000000000000000011c6": "11c6",
+ "0x00000000000000000000000000000000000000000000000000000000000011d0": "11d0",
+ "0x00000000000000000000000000000000000000000000000000000000000011da": "11da",
+ "0x00000000000000000000000000000000000000000000000000000000000011e4": "11e4",
+ "0x00000000000000000000000000000000000000000000000000000000000011ee": "11ee",
+ "0x00000000000000000000000000000000000000000000000000000000000011f8": "11f8",
+ "0x0000000000000000000000000000000000000000000000000000000000001202": "1202",
+ "0x000000000000000000000000000000000000000000000000000000000000120c": "120c",
+ "0x0000000000000000000000000000000000000000000000000000000000001216": "1216",
+ "0x0000000000000000000000000000000000000000000000000000000000001220": "1220",
+ "0x000000000000000000000000000000000000000000000000000000000000122a": "122a",
+ "0x0000000000000000000000000000000000000000000000000000000000001234": "1234",
+ "0x000000000000000000000000000000000000000000000000000000000000123e": "123e",
+ "0x0000000000000000000000000000000000000000000000000000000000001248": "1248",
+ "0x0000000000000000000000000000000000000000000000000000000000001252": "1252",
+ "0x000000000000000000000000000000000000000000000000000000000000125c": "125c",
+ "0x0000000000000000000000000000000000000000000000000000000000001266": "1266",
+ "0x0000000000000000000000000000000000000000000000000000000000001270": "1270",
+ "0x000000000000000000000000000000000000000000000000000000000000127a": "127a",
+ "0x0000000000000000000000000000000000000000000000000000000000001284": "1284",
+ "0x000000000000000000000000000000000000000000000000000000000000128e": "128e",
+ "0x0000000000000000000000000000000000000000000000000000000000001298": "1298",
+ "0x00000000000000000000000000000000000000000000000000000000000012a2": "12a2",
+ "0x00000000000000000000000000000000000000000000000000000000000012ac": "12ac",
+ "0x00000000000000000000000000000000000000000000000000000000000012b6": "12b6",
+ "0x00000000000000000000000000000000000000000000000000000000000012c0": "12c0",
+ "0x00000000000000000000000000000000000000000000000000000000000012ca": "12ca",
+ "0x00000000000000000000000000000000000000000000000000000000000012d4": "12d4",
+ "0x00000000000000000000000000000000000000000000000000000000000012de": "12de",
+ "0x00000000000000000000000000000000000000000000000000000000000012e8": "12e8",
+ "0x00000000000000000000000000000000000000000000000000000000000012f2": "12f2",
+ "0x00000000000000000000000000000000000000000000000000000000000012fc": "12fc",
+ "0x0000000000000000000000000000000000000000000000000000000000001306": "1306",
+ "0x0000000000000000000000000000000000000000000000000000000000001310": "1310",
+ "0x000000000000000000000000000000000000000000000000000000000000131a": "131a",
+ "0x0000000000000000000000000000000000000000000000000000000000001324": "1324",
+ "0x000000000000000000000000000000000000000000000000000000000000132e": "132e",
+ "0x0000000000000000000000000000000000000000000000000000000000001338": "1338",
+ "0x0000000000000000000000000000000000000000000000000000000000001342": "1342",
+ "0x000000000000000000000000000000000000000000000000000000000000134c": "134c",
+ "0x0000000000000000000000000000000000000000000000000000000000001356": "1356",
+ "0x0000000000000000000000000000000000000000000000000000000000001360": "1360",
+ "0x000000000000000000000000000000000000000000000000000000000000136a": "136a",
+ "0x0000000000000000000000000000000000000000000000000000000000001374": "1374",
+ "0x000000000000000000000000000000000000000000000000000000000000137e": "137e",
+ "0x0000000000000000000000000000000000000000000000000000000000001388": "1388",
+ "0x0000000000000000000000000000000000000000000000000000000000002347": "83472eda6eb475906aeeb7f09e757ba9f6663b9f6a5bf8611d6306f677f67ebd",
+ "0x0000000000000000000000000000000000000000000000000000000000002351": "2c809fbc7e3991c8ab560d1431fa8b6f25be4ab50977f0294dfeca9677866b6e",
+ "0x000000000000000000000000000000000000000000000000000000000000235b": "756e335a8778f6aadb2cc18c5bc68892da05a4d8b458eee5ce3335a024000c67",
+ "0x0000000000000000000000000000000000000000000000000000000000002365": "4b118bd31ed2c4eeb81dc9e3919e9989994333fe36f147c2930f12c53f0d3c78",
+ "0x000000000000000000000000000000000000000000000000000000000000236f": "d0122166752d729620d41114ff5a94d36e5d3e01b449c23844900c023d1650a5",
+ "0x0000000000000000000000000000000000000000000000000000000000002379": "60c606c4c44709ac87b367f42d2453744639fc5bee099a11f170de98408c8089",
+ "0x0000000000000000000000000000000000000000000000000000000000002383": "6ee04e1c27edad89a8e5a2253e4d9cca06e4f57d063ed4fe7cc1c478bb57eeca",
+ "0x000000000000000000000000000000000000000000000000000000000000238d": "36616354a17658eb3c3e8e5adda6253660e3744cb8b213006f04302b723749a8",
+ "0x0000000000000000000000000000000000000000000000000000000000002397": "c13802d4378dcb9c616f0c60ea0edd90e6c2dacf61f39ca06add0eaa67473b94",
+ "0x00000000000000000000000000000000000000000000000000000000000023a1": "8b345497936c51d077f414534be3f70472e4df101dee8820eaaff91a6624557b",
+ "0x00000000000000000000000000000000000000000000000000000000000023ab": "e958485d4b3e47b38014cc4eaeb75f13228072e7b362a56fc3ffe10155882629",
+ "0x00000000000000000000000000000000000000000000000000000000000023b5": "3346706b38a2331556153113383581bc6f66f209fdef502f9fc9b6daf6ea555e",
+ "0x00000000000000000000000000000000000000000000000000000000000023bf": "346910f7e777c596be32f0dcf46ccfda2efe8d6c5d3abbfe0f76dba7437f5dad",
+ "0x00000000000000000000000000000000000000000000000000000000000023c9": "e62a7bd9263534b752176d1ff1d428fcc370a3b176c4a6312b6016c2d5f8d546",
+ "0x00000000000000000000000000000000000000000000000000000000000023d3": "ffe267d11268388fd0426a627dedddeb075d68327df9172c0445cd2979ec7e4d",
+ "0x00000000000000000000000000000000000000000000000000000000000023dd": "23cc648c9cd82c08214882b7e28e026d6eb56920f90f64731bb09b6acf515427",
+ "0x00000000000000000000000000000000000000000000000000000000000023e7": "47c896f5986ec29f58ec60eec56ed176910779e9fc9cf45c3c090126aeb21acd",
+ "0x00000000000000000000000000000000000000000000000000000000000023f1": "6d19894928a3ab44077bb85dcb47e0865ce1c4c187bba26bad059aa774c03cfe",
+ "0x00000000000000000000000000000000000000000000000000000000000023fb": "efc50f4fc1430b6d5d043065201692a4a02252fef0699394631f5213a5667547",
+ "0x0000000000000000000000000000000000000000000000000000000000002405": "3cc9f65fc1f46927eb46fbf6d14bc94af078fe8ff982a984bdd117152cd1549f",
+ "0x000000000000000000000000000000000000000000000000000000000000240f": "63eb547e9325bc34fbbbdfda327a71dc929fd8ab6509795e56479e95dbd40a80",
+ "0x0000000000000000000000000000000000000000000000000000000000002419": "67317288cf707b0325748c7947e2dda5e8b41e45e62330d00d80e9be403e5c4c",
+ "0x0000000000000000000000000000000000000000000000000000000000002423": "7fc37e0d22626f96f345b05516c8a3676b9e1de01d354e5eb9524f6776966885",
+ "0x000000000000000000000000000000000000000000000000000000000000242d": "c8c5ffb6f192e9bda046ecd4ebb995af53c9dd6040f4ba8d8db9292c1310e43f",
+ "0x0000000000000000000000000000000000000000000000000000000000002437": "e40a9cfd9babe862d482ca0c07c0a4086641d16c066620cb048c6e673c5a4f91",
+ "0x0000000000000000000000000000000000000000000000000000000000002441": "e82e7cff48aea45fb3f7b199b0b173497bf4c5ea66ff840e2ec618d7eb3d7470",
+ "0x000000000000000000000000000000000000000000000000000000000000244b": "84ceda57767ea709da7ab17897a70da1868c9670931da38f2438519a5249534d",
+ "0x0000000000000000000000000000000000000000000000000000000000002455": "e9dcf640383969359c944cff24b75f71740627f596110ee8568fa09f9a06db1c",
+ "0x000000000000000000000000000000000000000000000000000000000000245f": "430ef678bb92f1af44dcd77af9c5b59fb87d0fc4a09901a54398ad5b7e19a8f4",
+ "0x0000000000000000000000000000000000000000000000000000000000002469": "f7af0b8b729cd17b7826259bc183b196dbd318bd7229d5e8085bf4849c0b12bf",
+ "0x0000000000000000000000000000000000000000000000000000000000002473": "e134e19217f1b4c7e11f193561056303a1f67b69dac96ff79a6d0aafa994f7cb",
+ "0x000000000000000000000000000000000000000000000000000000000000247d": "9cc58ab1a8cb0e983550e61f754aea1dd4f58ac6482a816dc50658de750de613",
+ "0x0000000000000000000000000000000000000000000000000000000000002487": "79c2b067779a94fd3756070885fc8eab5e45033bde69ab17c0173d553df02978",
+ "0x0000000000000000000000000000000000000000000000000000000000002491": "d908ef75d05b895600d3f9938cb5259612c71223b68d30469ff657d61c6b1611",
+ "0x000000000000000000000000000000000000000000000000000000000000249b": "e0d31906b7c46ac7f38478c0872d3c634f7113d54ef0b57ebfaf7f993959f5a3",
+ "0x00000000000000000000000000000000000000000000000000000000000024a5": "2318f5c5e6865200ad890e0a8db21c780a226bec0b2e29af1cb3a0d9b40196ae",
+ "0x00000000000000000000000000000000000000000000000000000000000024af": "523997f8d8fed954658f547954fdeceab818b411862647f2b61a3619f6a4d4bc",
+ "0x00000000000000000000000000000000000000000000000000000000000024b9": "be3396540ea36c6928cccdcfe6c669666edbbbcd4be5e703f59de0e3c2720da7",
+ "0x00000000000000000000000000000000000000000000000000000000000024c3": "2d3fcfd65d0a6881a2e8684d03c2aa27aee6176514d9f6d8ebb3b766f85e1039",
+ "0x00000000000000000000000000000000000000000000000000000000000024cd": "7ce0d5c253a7f910cca7416e949ac04fdaec20a518ab6fcbe4a63d8b439a5cfc",
+ "0x00000000000000000000000000000000000000000000000000000000000024d7": "4da13d835ea44926ee13f34ce8fcd4b9d3dc65be0a351115cf404234c7fbd256",
+ "0x00000000000000000000000000000000000000000000000000000000000024e1": "c5ee7483802009b45feabf4c5f701ec485f27bf7d2c4477b200ac53e210e9844",
+ "0x00000000000000000000000000000000000000000000000000000000000024eb": "0fc71295326a7ae8e0776c61be67f3ed8770311df88e186405b8d75bd0be552b",
+ "0x00000000000000000000000000000000000000000000000000000000000024f5": "7313b4315dd27586f940f8f2bf8af76825d8f24d2ae2c24d885dcb0cdd8d50f5",
+ "0x00000000000000000000000000000000000000000000000000000000000024ff": "2739473baa23a9bca4e8d0f4f221cfa48440b4b73e2bae7386c14caccc6c2059",
+ "0x0000000000000000000000000000000000000000000000000000000000002509": "d4da00e33a11ee18f67b25ad5ff574cddcdccaa30e6743e01a531336b16cbf8f",
+ "0x0000000000000000000000000000000000000000000000000000000000002513": "e651765d4860f0c46f191212c8193e7c82708e5d8bef1ed6f19bdde577f980cf",
+ "0x000000000000000000000000000000000000000000000000000000000000251d": "5b5b49487967b3b60bd859ba2fb13290c6eaf67e97e9f9f9dda935c08564b5f6",
+ "0x0000000000000000000000000000000000000000000000000000000000002527": "57b73780cc42a6a36676ce7008459d5ba206389dc9300f1aecbd77c4b90277fa",
+ "0x0000000000000000000000000000000000000000000000000000000000002531": "217e8514ea30f1431dc3cd006fe730df721f961cebb5d0b52069d1b4e1ae5d13",
+ "0x000000000000000000000000000000000000000000000000000000000000253b": "14b775119c252908bb10b13de9f8ae988302e1ea8b2e7a1b6d3c8ae24ba9396b",
+ "0x0000000000000000000000000000000000000000000000000000000000002545": "e736f0b3c5672f76332a38a6c1e66e5f39e0d01f1ddede2c24671f48e78daf63",
+ "0x000000000000000000000000000000000000000000000000000000000000254f": "7d112c85b58c64c576d34ea7a7c18287981885892fbf95110e62add156ca572e",
+ "0x0000000000000000000000000000000000000000000000000000000000002559": "28fbeedc649ed9d2a6feda6e5a2576949da6812235ebdfd030f8105d012f5074",
+ "0x0000000000000000000000000000000000000000000000000000000000002563": "6f7410cf59e390abe233de2a3e3fe022b63b78a92f6f4e3c54aced57b6c3daa6",
+ "0x000000000000000000000000000000000000000000000000000000000000256d": "d5edc3d8781deea3b577e772f51949a8866f2aa933149f622f05cde2ebba9adb",
+ "0x0000000000000000000000000000000000000000000000000000000000002577": "20308d99bc1e1b1b0717f32b9a3a869f4318f5f0eb4ed81fddd10696c9746c6b",
+ "0x0000000000000000000000000000000000000000000000000000000000002581": "91f7a302057a2e21d5e0ef4b8eea75dfb8b37f2c2db05c5a84517aaebc9d5131",
+ "0x000000000000000000000000000000000000000000000000000000000000258b": "743e5d0a5be47d489b121edb9f98dad7d0a85fc260909083656fabaf6d404774",
+ "0x0000000000000000000000000000000000000000000000000000000000002595": "cdcf99c6e2e7d0951f762e787bdbe0e2b3b320815c9d2be91e9cd0848653e839",
+ "0x000000000000000000000000000000000000000000000000000000000000259f": "cc9476183d27810e9738f382c7f2124976735ed89bbafc7dc19c99db8cfa9ad1",
+ "0x00000000000000000000000000000000000000000000000000000000000025a9": "f67e5fab2e7cacf5b89acd75ec53b0527d45435adddac6ee7523a345dcbcdceb",
+ "0x00000000000000000000000000000000000000000000000000000000000025b3": "e20f8ab522b2f0d12c068043852139965161851ad910b840db53604c8774a579",
+ "0x00000000000000000000000000000000000000000000000000000000000025bd": "f982160785861cb970559d980208dd00e6a2ec315f5857df175891b171438eeb",
+ "0x00000000000000000000000000000000000000000000000000000000000025c7": "230954c737211b72d5c7dcfe420bb07d5d72f2b4868c5976dd22c00d3df0c0b6",
+ "0x00000000000000000000000000000000000000000000000000000000000025d1": "b7743e65d6bbe09d5531f1bc98964f75943d8c13e27527ca6afd40ca069265d4",
+ "0x00000000000000000000000000000000000000000000000000000000000025db": "31ac943dc649c639fa6221400183ca827c07b812a6fbfc1795eb835aa280adf3",
+ "0x00000000000000000000000000000000000000000000000000000000000025e5": "ded49c937c48d466987a4130f4b6d04ef658029673c3afc99f70f33b552e178d",
+ "0x00000000000000000000000000000000000000000000000000000000000025ef": "a0effc449cab515020d2012897155a792bce529cbd8d5a4cf94d0bbf141afeb6",
+ "0x00000000000000000000000000000000000000000000000000000000000025f9": "1f36d9c66a0d437d8e49ffaeaa00f341e9630791b374e8bc0c16059c7445721f",
+ "0x0000000000000000000000000000000000000000000000000000000000002603": "34f89e6134f26e7110b47ffc942a847d8c03deeed1b33b9c041218c4e1a1a4e6",
+ "0x000000000000000000000000000000000000000000000000000000000000260d": "774404c430041ca4a58fdc281e99bf6fcb014973165370556d9e73fdec6d597b",
+ "0x0000000000000000000000000000000000000000000000000000000000002617": "d616971210c381584bf4846ab5837b53e062cbbb89d112c758b4bd00ce577f09",
+ "0x0000000000000000000000000000000000000000000000000000000000002621": "cdf6383634b0431468f6f5af19a2b7a087478b42489608c64555ea1ae0a7ee19",
+ "0x000000000000000000000000000000000000000000000000000000000000262b": "ec22e5df77320b4142c54fceaf2fe7ea30d1a72dc9c969a22acf66858d582b",
+ "0x0000000000000000000000000000000000000000000000000000000000002635": "cb32d77facfda4decff9e08df5a5810fa42585fdf96f0db9b63b196116fbb6af",
+ "0x000000000000000000000000000000000000000000000000000000000000263f": "6d76316f272f0212123d0b4b21d16835fe6f7a2b4d1960386d8a161da2b7c6a2",
+ "0x0000000000000000000000000000000000000000000000000000000000002649": "2de2da72ae329e359b655fc6311a707b06dc930126a27261b0e8ec803bdb5cbf",
+ "0x0000000000000000000000000000000000000000000000000000000000002653": "08bed4b39d14dc1e72e80f605573cde6145b12693204f9af18bbc94a82389500",
+ "0x000000000000000000000000000000000000000000000000000000000000265d": "e437f0465ac29b0e889ef4f577c939dd39363c08fcfc81ee61aa0b4f55805f69",
+ "0x0000000000000000000000000000000000000000000000000000000000002667": "89ca120183cc7085b6d4674d779fc4fbc9de520779bfbc3ebf65f9663cb88080",
+ "0x0000000000000000000000000000000000000000000000000000000000002671": "b15d5954c7b78ab09ede922684487c7a60368e82fdc7b5a0916842e58a44422b",
+ "0x000000000000000000000000000000000000000000000000000000000000267b": "ad13055a49d2b6a4ffc8b781998ff79086adad2fd6470a0563a43b740128c5f2",
+ "0x0000000000000000000000000000000000000000000000000000000000002685": "9e9909e4ed44f5539427ee3bc70ee8b630ccdaea4d0f1ed5337a067e8337119f",
+ "0x000000000000000000000000000000000000000000000000000000000000268f": "bf1f3aba184e08d4c650f05fe3d948bdda6c2d6982f277f2cd6b1a60cd4f3dac",
+ "0x0000000000000000000000000000000000000000000000000000000000002699": "bb70fe131f94783dba356c8d4d9d319247ef61c768134303f0db85ee3ef0496f",
+ "0x00000000000000000000000000000000000000000000000000000000000026a3": "6a81ebd3bde6cc54a2521aa72de29ef191e3b56d94953439a72cafdaa2996da0",
+ "0x00000000000000000000000000000000000000000000000000000000000026ad": "4c83e809a52ac52a587d94590c35c71b72742bd15915fca466a9aaec4f2dbfed",
+ "0x00000000000000000000000000000000000000000000000000000000000026b7": "268fc70790f00ad0759497585267fbdc92afba63ba01e211faae932f0639854a",
+ "0x00000000000000000000000000000000000000000000000000000000000026c1": "7e544f42df99d5666085b70bc57b3ca175be50b7a9643f26f464124df632d562",
+ "0x00000000000000000000000000000000000000000000000000000000000026cb": "d59cf5f55903ba577be835706b27d78a50cacb25271f35a5f57fcb88a3b576f3",
+ "0x00000000000000000000000000000000000000000000000000000000000026d5": "551cced461be11efdeaf8e47f3a91bb66d532af7294c4461c8009c5833bdbf57",
+ "0x00000000000000000000000000000000000000000000000000000000000026df": "c1e0e6907a57eefd12f1f95d28967146c836d72d281e7609de23d0a02351e978",
+ "0x00000000000000000000000000000000000000000000000000000000000026e9": "9d580c0ac3a7f00fdc3b135b758ae7c80ab135e907793fcf9621a3a3023ca205",
+ "0x00000000000000000000000000000000000000000000000000000000000026f3": "a7fd4dbac4bb62307ac7ad285ffa6a11ec679d950de2bd41839b8a846e239886",
+ "0x00000000000000000000000000000000000000000000000000000000000026fd": "6ba7b0ac30a04e11a3116b43700d91359e6b06a49058e543198d4b21e75fb165",
+ "0x0000000000000000000000000000000000000000000000000000000000002707": "8835104ed35ffd4db64660b9049e1c0328e502fd4f3744749e69183677b8474b",
+ "0x0000000000000000000000000000000000000000000000000000000000002711": "562f276b9f9ed46303e700c8863ad75fadff5fc8df27a90744ea04ad1fe8e801",
+ "0x000000000000000000000000000000000000000000000000000000000000271b": "d19f68026d22ae0f60215cfe4a160986c60378f554c763651d872ed82ad69ebb",
+ "0x0000000000000000000000000000000000000000000000000000000000002725": "f087a515b4b62d707991988eb912d082b85ecdd52effc9e8a1ddf15a74388860",
+ "0x000000000000000000000000000000000000000000000000000000000000272f": "f7e28b7daff5fad40ec1ef6a2b7e9066558126f62309a2ab0d0d775d892a06d6",
+ "0x0000000000000000000000000000000000000000000000000000000000002739": "77361844a8f4dd2451e6218d336378b837ba3fab921709708655e3f1ea91a435",
+ "0x0000000000000000000000000000000000000000000000000000000000002743": "e3cb33c7b05692a6f25470fbd63ab9c986970190729fab43191379da38bc0d8c",
+ "0x000000000000000000000000000000000000000000000000000000000000274d": "c893f9de119ec83fe37b178b5671d63448e9b5cde4de9a88cace3f52c2591194",
+ "0x0000000000000000000000000000000000000000000000000000000000002757": "39c96a6461782ac2efbcb5aaac2e133079b86fb29cb5ea69b0101bdad684ef0d",
+ "0x0000000000000000000000000000000000000000000000000000000000002761": "72a2724cdf77138638a109f691465e55d32759d3c044a6cb41ab091c574e3bdb",
+ "0x000000000000000000000000000000000000000000000000000000000000276b": "178ba15f24f0a8c33eed561d7927979c1215ddec20e1aef318db697ccfad0e03",
+ "0x0000000000000000000000000000000000000000000000000000000000002775": "f7b2c01b7c625588c9596972fdebae61db89f0d0f2b21286d4c0fa76683ff946",
+ "0x000000000000000000000000000000000000000000000000000000000000277f": "16e43284b041a4086ad1cbab9283d4ad3e8cc7c3a162f60b3df5538344ecdf54",
+ "0x0000000000000000000000000000000000000000000000000000000000002789": "0a98ea7f737e17706432eba283d50dde10891b49c3424d46918ed2b6af8ecf90",
+ "0x0000000000000000000000000000000000000000000000000000000000002793": "7637225dd61f90c3cb05fae157272985993b34d6c369bfe8372720339fe4ffd2",
+ "0x000000000000000000000000000000000000000000000000000000000000279d": "6a7d064bc053c0f437707df7c36b820cca4a2e9653dd1761941af4070f5273b6",
+ "0x00000000000000000000000000000000000000000000000000000000000027a7": "91c1e6eec8f7944fd6aafdce5477f45d4f6e29298c9ef628a59e441a5e071fae",
+ "0x00000000000000000000000000000000000000000000000000000000000027b1": "a1c227db9bbd2e49934bef01cbb506dd1e1c0671a81aabb1f90a90025980a3c3",
+ "0x00000000000000000000000000000000000000000000000000000000000027bb": "8fcfc1af10f3e8671505afadfd459287ae98be634083b5a35a400cc9186694cf",
+ "0x00000000000000000000000000000000000000000000000000000000000027c5": "cc1ea9c015bd3a6470669f85c5c13e42c1161fc79704143df347c4a621dff44f",
+ "0x00000000000000000000000000000000000000000000000000000000000027cf": "b0a22c625dd0c6534e29bccc9ebf94a550736e2c68140b9afe3ddc7216f797de",
+ "0x00000000000000000000000000000000000000000000000000000000000027d9": "92b8e6ca20622e5fd91a8f58d0d4faaf7be48a53ea262e963bcf26a1698f9df3",
+ "0x00000000000000000000000000000000000000000000000000000000000027e3": "f6253b8e2f31df6ca7a97086c3b4d49d9cbbbdfc5be731b0c3040a4381161c53",
+ "0x00000000000000000000000000000000000000000000000000000000000027ed": "ea8d762903bd24b80037d7ffe80019a086398608ead66208c18f0a5778620e67",
+ "0x00000000000000000000000000000000000000000000000000000000000027f7": "543382975e955588ba19809cfe126ea15dc43c0bfe6a43d861d7ad40eac2c2f4",
+ "0x0000000000000000000000000000000000000000000000000000000000002801": "095294f7fe3eb90cf23b3127d40842f61b85da2f48f71234fb94d957d865a8a2",
+ "0x000000000000000000000000000000000000000000000000000000000000280b": "144c2dd25fd12003ccd2678d69d30245b0222ce2d2bfead687931a7f6688482f",
+ "0x0000000000000000000000000000000000000000000000000000000000002815": "7295f7d57a3547b191f55951f548479cbb9a60b47ba38beb8d85c4ccf0e4ae4c",
+ "0x000000000000000000000000000000000000000000000000000000000000281f": "9e8e241e13f76a4e6d777a2dc64072de4737ac39272bb4987bcecbf60739ccf4",
+ "0x0000000000000000000000000000000000000000000000000000000000002829": "fc753bcea3e720490efded4853ef1a1924665883de46c21039ec43e371e96bb9",
+ "0x0000000000000000000000000000000000000000000000000000000000002833": "5f5204c264b5967682836ed773aee0ea209840fe628fd1c8d61702c416b427ca",
+ "0x000000000000000000000000000000000000000000000000000000000000283d": "5ba9a0326069e000b65b759236f46e54a0e052f379a876d242740c24f6c47aed",
+ "0x0000000000000000000000000000000000000000000000000000000000002847": "b40e9621d5634cd21f70274c345704af2e060c5befaeb2df109a78c7638167c2",
+ "0x0000000000000000000000000000000000000000000000000000000000002851": "70e26b74456e6fea452e04f8144be099b0af0e279febdff17dd4cdf9281e12a7",
+ "0x000000000000000000000000000000000000000000000000000000000000285b": "43d7158f48fb1f124b2962dff613c5b4b8ea415967f2b528af6e7ae280d658e5",
+ "0x0000000000000000000000000000000000000000000000000000000000002865": "b50b2b14efba477dddca9682df1eafc66a9811c9c5bd1ae796abbef27ba14eb4",
+ "0x000000000000000000000000000000000000000000000000000000000000286f": "c14936902147e9a121121f424ecd4d90313ce7fc603f3922cebb7d628ab2c8dd",
+ "0x0000000000000000000000000000000000000000000000000000000000002879": "86609ed192561602f181a9833573213eb7077ee69d65107fa94f657f33b144d2",
+ "0x0000000000000000000000000000000000000000000000000000000000002883": "0a71a6dbc360e176a0f665787ed3e092541c655024d0b136a04ceedf572c57c5",
+ "0x000000000000000000000000000000000000000000000000000000000000288d": "a4bcbab632ddd52cb85f039e48c111a521e8944b9bdbaf79dd7c80b20221e4d6",
+ "0x0000000000000000000000000000000000000000000000000000000000002897": "2bc468eab4fad397f9136f80179729b54caa2cb47c06b0695aab85cf9813620d",
+ "0x00000000000000000000000000000000000000000000000000000000000028a1": "fc7f9a432e6fd69aaf025f64a326ab7221311147dd99d558633579a4d8a0667b",
+ "0x00000000000000000000000000000000000000000000000000000000000028ab": "949613bd67fb0a68cf58a22e60e7b9b2ccbabb60d1d58c64c15e27a9dec2fb35",
+ "0x00000000000000000000000000000000000000000000000000000000000028b5": "289ddb1aee772ad60043ecf17a882c36a988101af91ac177954862e62012fc0e",
+ "0x00000000000000000000000000000000000000000000000000000000000028bf": "bfa48b05faa1a2ee14b3eaed0b75f0d265686b6ce3f2b7fa051b8dc98bc23d6a",
+ "0x00000000000000000000000000000000000000000000000000000000000028c9": "7bf49590a866893dc77444d89717942e09acc299eea972e8a7908e9d694a1150",
+ "0x00000000000000000000000000000000000000000000000000000000000028d3": "992f76aee242737eb21f14b65827f3ebc42524fb422b17f414f33c35a24092db",
+ "0x00000000000000000000000000000000000000000000000000000000000028dd": "da6e4f935d966e90dffc6ac0f6d137d9e9c97d65396627e5486d0089b94076fa",
+ "0x00000000000000000000000000000000000000000000000000000000000028e7": "65467514ed80f25b299dcf74fb74e21e9bb929832a349711cf327c2f8b60b57f",
+ "0x00000000000000000000000000000000000000000000000000000000000028f1": "cc2ac03d7a26ff16c990c5f67fa03dabda95641a988deec72ed2fe38c0f289d6",
+ "0x00000000000000000000000000000000000000000000000000000000000028fb": "096dbe9a0190c6badf79de3747abfd4d5eda3ab95b439922cae7ec0cfcd79290",
+ "0x0000000000000000000000000000000000000000000000000000000000002905": "0c659c769744094f60332ec247799d7ed5ae311d5738daa5dcead3f47ca7a8a2",
+ "0x000000000000000000000000000000000000000000000000000000000000290f": "9cb8a0d41ede6b951c29182422db215e22aedfa1a3549cd27b960a768f6ed522",
+ "0x0000000000000000000000000000000000000000000000000000000000002919": "2510f8256a020f4735e2be224e3bc3e8c14e56f7588315f069630fe24ce2fa26",
+ "0x0000000000000000000000000000000000000000000000000000000000002923": "2d3deb2385a2d230512707ece0bc6098ea788e3d5debb3911abe9a710dd332ea",
+ "0x000000000000000000000000000000000000000000000000000000000000292d": "1cec4b230f3bccfff7ca197c4a35cb5b95ff7785d064be3628235971b7aff27c",
+ "0x0000000000000000000000000000000000000000000000000000000000002937": "18e4a4238d43929180c7a626ae6f8c87a88d723b661549f2f76ff51726833598",
+ "0x0000000000000000000000000000000000000000000000000000000000002941": "700e1755641a437c8dc888df24a5d80f80f9eaa0d17ddab17db4eb364432a1f5",
+ "0x000000000000000000000000000000000000000000000000000000000000294b": "cad29ceb73b2f3c90d864a2c27a464b36b980458e2d8c4c7f32f70afad707312",
+ "0x0000000000000000000000000000000000000000000000000000000000002955": "a85e892063a7fd41d37142ae38037967eb047436c727fcf0bad813d316efe09f",
+ "0x000000000000000000000000000000000000000000000000000000000000295f": "040100f17208bcbd9456c62d98846859f7a5efa0e45a5b3a6f0b763b9c700fec",
+ "0x0000000000000000000000000000000000000000000000000000000000002969": "49d54a5147de1f5208c509b194af6d64b509398e4f255c20315131e921f7bd04",
+ "0x0000000000000000000000000000000000000000000000000000000000002973": "810ff6fcafb9373a4df3e91ab1ca64a2955c9e42ad8af964f829e38e0ea4ee20",
+ "0x000000000000000000000000000000000000000000000000000000000000297d": "9b72096b8b672ac6ff5362c56f5d06446d1693c5d2daa94a30755aa636320e78",
+ "0x0000000000000000000000000000000000000000000000000000000000002987": "f68bff777db51db5f29afc4afe38bd1bf5cdec29caa0dc52535b529e6d99b742",
+ "0x0000000000000000000000000000000000000000000000000000000000002991": "9566690bde717eec59f828a2dba90988fa268a98ed224f8bc02b77bce10443c4",
+ "0x000000000000000000000000000000000000000000000000000000000000299b": "d0e821fbd57a4d382edd638b5c1e6deefb81352d41aa97da52db13f330e03097",
+ "0x00000000000000000000000000000000000000000000000000000000000029a5": "43f9aa6fa63739abec56c4604874523ac6dabfcc08bb283195072aeb29d38dfe",
+ "0x00000000000000000000000000000000000000000000000000000000000029af": "54ebfa924e887a63d643a8277c3394317de0e02e63651b58b6eb0e90df8a20cd",
+ "0x00000000000000000000000000000000000000000000000000000000000029b9": "9e414c994ee35162d3b718c47f8435edc2c93394a378cb41037b671366791fc8",
+ "0x00000000000000000000000000000000000000000000000000000000000029c3": "4356f072bb235238abefb3330465814821097327842b6e0dc4a0ef95680c4d34",
+ "0x00000000000000000000000000000000000000000000000000000000000029cd": "215df775ab368f17ed3f42058861768a3fba25e8d832a00b88559ca5078b8fbc",
+ "0x00000000000000000000000000000000000000000000000000000000000029d7": "d17835a18d61605a04d2e50c4f023966a47036e5c59356a0463db90a76f06e3e",
+ "0x00000000000000000000000000000000000000000000000000000000000029e1": "875032d74e62dbfd73d4617754d36cd88088d1e5a7c5354bf3e0906c749e6637",
+ "0x00000000000000000000000000000000000000000000000000000000000029eb": "6f22ae25f70f4b03a2a2b17f370ace1f2b15d17fc7c2457824348a8f2a1eff9f",
+ "0x00000000000000000000000000000000000000000000000000000000000029f5": "f11fdf2cb985ce7472dc7c6b422c3a8bf2dfbbc6b86b15a1fa62cf9ebae8f6cf",
+ "0x00000000000000000000000000000000000000000000000000000000000029ff": "bbc97696e588f80fbe0316ad430fd4146a29c19b926248febe757cd9408deddc",
+ "0x0000000000000000000000000000000000000000000000000000000000002a09": "71dd15be02efd9f3d5d94d0ed9b5e60a205f439bb46abe6226879e857668881e",
+ "0x0000000000000000000000000000000000000000000000000000000000002a13": "b90e98bd91f1f7cc5c4456bb7a8868a2bb2cd3dda4b5dd6463b88728526dceea",
+ "0x0000000000000000000000000000000000000000000000000000000000002a1d": "4e80fd3123fda9b404a737c9210ccb0bacc95ef93ac40e06ce9f7511012426c4",
+ "0x0000000000000000000000000000000000000000000000000000000000002a27": "afb50d96b2543048dc93045b62357cc18b64d0e103756ce3ad0e04689dd88282",
+ "0x0000000000000000000000000000000000000000000000000000000000002a31": "d73341a1c9edd04a890f949ede6cc1e942ad62b63b6a60177f0f692f141a7e95",
+ "0x0000000000000000000000000000000000000000000000000000000000002a3b": "c26601e9613493118999d9268b401707e42496944ccdbfa91d5d7b791a6d18f1",
+ "0x0000000000000000000000000000000000000000000000000000000000002a45": "fb4619fb12e1b9c4b508797833eef7df65fcf255488660d502def2a7ddceef6d",
+ "0x0000000000000000000000000000000000000000000000000000000000002a4f": "d08b7458cd9d52905403f6f4e9dac15ad18bea1f834858bf48ecae36bf854f98",
+ "0x0000000000000000000000000000000000000000000000000000000000002a59": "df979da2784a3bb9e07c368094dc640aafc514502a62a58b464e50e5e50a34bd",
+ "0x0000000000000000000000000000000000000000000000000000000000002a63": "15855037d4712ce0019f0169dcd58b58493be8373d29decfa80b8df046e3d6ba",
+ "0x0000000000000000000000000000000000000000000000000000000000002a6d": "fd1462a68630956a33e4b65c8e171a08a131097bc7faf5d7f90b5503ab30b69c",
+ "0x0000000000000000000000000000000000000000000000000000000000002a77": "edad57fee633c4b696e519f84ad1765afbef5d2781b382acd9b8dfcf6cd6d572",
+ "0x0000000000000000000000000000000000000000000000000000000000002a81": "c2641ba296c2daa6edf09b63d0f1cfcefd51451fbbc283b6802cbd5392fb145c",
+ "0x0000000000000000000000000000000000000000000000000000000000002a8b": "5615d64e1d3a10972cdea4e4b106b4b6e832bc261129f9ab1d10a670383ae446",
+ "0x0000000000000000000000000000000000000000000000000000000000002a95": "0757c6141fad938002092ff251a64190b060d0e31c31b08fb56b0f993cc4ef0d",
+ "0x0000000000000000000000000000000000000000000000000000000000002a9f": "14ddc31bc9f9c877ae92ca1958e6f3affca7cc3064537d0bbe8ba4d2072c0961",
+ "0x0000000000000000000000000000000000000000000000000000000000002aa9": "490b0f08777ad4364f523f94dccb3f56f4aacb2fb4db1bb042a786ecfd248c79",
+ "0x0000000000000000000000000000000000000000000000000000000000002ab3": "4a37c0e55f539f2ecafa0ce71ee3d80bc9fe33fb841583073c9f524cc5a2615a",
+ "0x0000000000000000000000000000000000000000000000000000000000002abd": "133295fdf94e5e4570e27125807a77272f24622750bcf408be0360ba0dcc89f2",
+ "0x0000000000000000000000000000000000000000000000000000000000002ac7": "a73eb87c45c96b121f9ab081c095bff9a49cfe5a374f316e9a6a66096f532972",
+ "0x0000000000000000000000000000000000000000000000000000000000002ad1": "9040bc28f6e830ca50f459fc3dac39a6cd261ccc8cd1cca5429d59230c10f34c",
+ "0x0000000000000000000000000000000000000000000000000000000000002adb": "ec1d134c49cde6046ee295672a8f11663b6403fb71338181a89dc6bc92f7dea8",
+ "0x0000000000000000000000000000000000000000000000000000000000002ae5": "3130a4c80497c65a7ee6ac20f6888a95bd5b05636d6b4bd13d616dcb01591e16",
+ "0x0000000000000000000000000000000000000000000000000000000000002aef": "ccdfd5b42f2cbd29ab125769380fc1b18a9d272ac5d3508a6bbe4c82360ebcca",
+ "0x0000000000000000000000000000000000000000000000000000000000002af9": "74342c7f25ee7dd1ae6eb9cf4e5ce5bcab56c798aea36b554ccb31a660e123af",
+ "0x0000000000000000000000000000000000000000000000000000000000002b03": "f6f75f51a452481c30509e5de96edae82892a61f8c02c88d710dc782b5f01fc7",
+ "0x0000000000000000000000000000000000000000000000000000000000002b0d": "7ce6539cc82db9730b8c21b12d6773925ff7d1a46c9e8f6c986ada96351f36e9",
+ "0x0000000000000000000000000000000000000000000000000000000000002b17": "1983684da5e48936b761c5e5882bbeb5e42c3a7efe92989281367fa5ab25e918",
+ "0x0000000000000000000000000000000000000000000000000000000000002b21": "c564aa993f2b446325ee674146307601dd87eb7409266a97e695e4bb09dd8bf5",
+ "0x0000000000000000000000000000000000000000000000000000000000002b2b": "9ca2ff57d59decb7670d5f49bcca68fdaf494ba7dc06214d8e838bfcf7a2824e",
+ "0x0000000000000000000000000000000000000000000000000000000000002b35": "6d7b7476cecc036d470a691755f9988409059bd104579c0a2ded58f144236045",
+ "0x0000000000000000000000000000000000000000000000000000000000002b3f": "417504d79d00b85a29f58473a7ad643f88e9cdfe5da2ed25a5965411390fda4a",
+ "0x0000000000000000000000000000000000000000000000000000000000002b49": "e910eb040bf32e56e9447d63497799419957ed7df2572e89768b9139c6fa6a23",
+ "0x0000000000000000000000000000000000000000000000000000000000002b53": "8e462d3d5b17f0157bc100e785e1b8d2ad3262e6f27238fa7e9c62ba29e9c692",
+ "0x0000000000000000000000000000000000000000000000000000000000002b5d": "3e6f040dc96b2e05961c4e28df076fa654761f4b0e2e30f5e36b06f65d1893c1",
+ "0x0000000000000000000000000000000000000000000000000000000000002b67": "07e71d03691704a4bd83c728529642884fc1b1a8cfeb1ddcbf659c9b71367637",
+ "0x0000000000000000000000000000000000000000000000000000000000002b71": "f4d05f5986e4b92a845467d2ae6209ca9b7c6c63ff9cdef3df180660158163ef",
+ "0x0000000000000000000000000000000000000000000000000000000000002b7b": "5ca251408392b25af49419f1ecd9338d1f4b5afa536dc579ab54e1e3ee6914d4",
+ "0x0000000000000000000000000000000000000000000000000000000000002b85": "e98b64599520cf62e68ce0e2cdf03a21d3712c81fa74b5ade4885b7d8aec531b",
+ "0x0000000000000000000000000000000000000000000000000000000000002b8f": "d62ec5a2650450e26aac71a21d45ef795e57c231d28a18d077a01f761bc648fe",
+ "0x0000000000000000000000000000000000000000000000000000000000002b99": "4d3fb38cf24faf44f5b37f248553713af2aa9c3d99ddad4a534e49cd06bb8098",
+ "0x0000000000000000000000000000000000000000000000000000000000002ba3": "36e90abacae8fbe712658e705ac28fa9d00118ef55fe56ea893633680147148a",
+ "0x0000000000000000000000000000000000000000000000000000000000002bad": "164177f08412f7e294fae37457d238c4dd76775263e2c7c9f39e8a7ceca9028a",
+ "0x0000000000000000000000000000000000000000000000000000000000002bb7": "aa5a5586bf2f68df5c206dbe45a9498de0a9b5a2ee92235b740971819838a010",
+ "0x0000000000000000000000000000000000000000000000000000000000002bc1": "99d001850f513efdc613fb7c8ede12a943ff543c578a54bebbb16daecc56cec5",
+ "0x0000000000000000000000000000000000000000000000000000000000002bcb": "30a4501d58b23fc7eee5310f5262783b2dd36a94922d11e5e173ec763be8accb",
+ "0x0000000000000000000000000000000000000000000000000000000000002bd5": "a804188a0434260c0825a988483de064ae01d3e50cb111642c4cfb65bfc2dfb7",
+ "0x0000000000000000000000000000000000000000000000000000000000002bdf": "c554c79292c950bce95e9ef57136684fffb847188607705454909aa5790edc64",
+ "0x0000000000000000000000000000000000000000000000000000000000002be9": "c89e3673025beff5031d48a885098da23d716b743449fd5533a04f25bd2cd203",
+ "0x0000000000000000000000000000000000000000000000000000000000002bf3": "44c310142a326a3822abeb9161413f91010858432d27c9185c800c9c2d92aea6",
+ "0x0000000000000000000000000000000000000000000000000000000000002bfd": "ae3f497ee4bd619d651097d3e04f50caac1f6af55b31b4cbde4faf1c5ddc21e8",
+ "0x0000000000000000000000000000000000000000000000000000000000002c07": "3287d70a7b87db98964e828d5c45a4fa4cd7907be3538a5e990d7a3573ccb9c1",
+ "0x0000000000000000000000000000000000000000000000000000000000002c11": "b52bb578e25d833410fcca7aa6f35f79844537361a43192dce8dcbc72d15e09b",
+ "0x0000000000000000000000000000000000000000000000000000000000002c1b": "ff8f6f17c0f6d208d27dd8b9147586037086b70baf4f70c3629e73f8f053d34f",
+ "0x0000000000000000000000000000000000000000000000000000000000002c25": "70bccc358ad584aacb115076c8aded45961f41920ffedf69ffa0483e0e91fa52",
+ "0x0000000000000000000000000000000000000000000000000000000000002c2f": "e3881eba45a97335a6d450cc37e7f82b81d297c111569e38b6ba0c5fb0ae5d71",
+ "0x0000000000000000000000000000000000000000000000000000000000002c39": "2217beb48c71769d8bf9caaac2858237552fd68cd4ddefb66d04551e7beaa176",
+ "0x0000000000000000000000000000000000000000000000000000000000002c43": "06b56638d2545a02757e7f268b25a0cd3bce792fcb1e88da21b0cc21883b9720",
+ "0x0000000000000000000000000000000000000000000000000000000000002c4d": "ebdc8c9e2a85a1fb6582ca30616a685ec8ec25e9c020a65a85671e8b9dacc6eb",
+ "0x0000000000000000000000000000000000000000000000000000000000002c57": "738f3edb9d8d273aac79f95f3877fd885e1db732e86115fa3d0da18e6c89e9cf",
+ "0x0000000000000000000000000000000000000000000000000000000000002c61": "ae5ccfc8201288b0c5981cdb60e16bc832ac92edc51149bfe40ff4a935a0c13a",
+ "0x0000000000000000000000000000000000000000000000000000000000002c6b": "69a7a19c159c0534e50a98e460707c6c280e7e355fb97cf2b5e0fd56c45a0a97",
+ "0x0000000000000000000000000000000000000000000000000000000000002c75": "4d2a1e9207a1466593e5903c5481a579e38e247afe5e80bd41d629ac3342e6a4",
+ "0x0000000000000000000000000000000000000000000000000000000000002c7f": "d3e7d679c0d232629818cbb94251c24797ce36dd2a45dbe8c77a6a345231c3b3",
+ "0x0000000000000000000000000000000000000000000000000000000000002c89": "d1835b94166e1856dddb6eaa1cfdcc6979193f2ff4541ab274738bd48072899c",
+ "0x0000000000000000000000000000000000000000000000000000000000002c93": "1f12c89436a94d427a69bca5a080edc328bd2424896f3f37223186b440deb45e",
+ "0x0000000000000000000000000000000000000000000000000000000000002c9d": "ccb765890b7107fd98056a257381b6b1d10a83474bbf1bdf8e6b0b8eb9cef2a9",
+ "0x0000000000000000000000000000000000000000000000000000000000002ca7": "8bbf4e534dbf4580edc5a973194a725b7283f7b9fbb7d7d8deb386aaceebfa84",
+ "0x0000000000000000000000000000000000000000000000000000000000002cb1": "85a0516088f78d837352dcf12547ee3c598dda398e78a9f4d95acfbef19f5e19",
+ "0x0000000000000000000000000000000000000000000000000000000000002cbb": "0f669bc7780e2e5719f9c05872a112f6511e7f189a8649cda5d8dda88d6b8ac3",
+ "0x0000000000000000000000000000000000000000000000000000000000002cc5": "a7816288f9712fcab6a2b6fbd0b941b8f48c2acb635580ed80c27bed7e840a57",
+ "0x0000000000000000000000000000000000000000000000000000000000002ccf": "da5168c8c83ac67dfc2772af49d689f11974e960dee4c4351bac637db1a39e82",
+ "0x0000000000000000000000000000000000000000000000000000000000002cd9": "3f720ecec02446f1af948de4eb0f54775562f2d615726375c377114515ac545b",
+ "0x0000000000000000000000000000000000000000000000000000000000002ce3": "273830a0087f6cef0fdb42179aa1c6c8c19f7bc83c3dc7aa1a56e4e05ca473ea",
+ "0x0000000000000000000000000000000000000000000000000000000000002ced": "7044f700543fd542e87e7cdb94f0126b0f6ad9488d0874a8ac903a72bade34e9",
+ "0x0000000000000000000000000000000000000000000000000000000000002cf7": "f63a7ff76bb9713bea8d47831a1510d2c8971accd22a403d5bbfaaa3dc310616",
+ "0x0000000000000000000000000000000000000000000000000000000000002d01": "a68dbd9898dd1589501ca3220784c44d41852ad997a270e215539d461ec090f8",
+ "0x0000000000000000000000000000000000000000000000000000000000002d0b": "59e501ae3ba9e0c3adafdf0f696d2e6a358e1bec43cbe9b0258c2335dd8d764f",
+ "0x0000000000000000000000000000000000000000000000000000000000002d15": "4f19cff0003bdc03c2fee20db950f0efb323be170f0b09c491a20abcf26ecf43",
+ "0x0000000000000000000000000000000000000000000000000000000000002d1f": "52b1b89795a8fabd3c8594bd571b44fd72279979aaa1d49ea7105c787f8f5fa6",
+ "0x0000000000000000000000000000000000000000000000000000000000002d29": "7c1416bd4838b93bc87990c9dcca108675bafab950dd0faf111d9eddc4e54327",
+ "0x0000000000000000000000000000000000000000000000000000000000002d33": "ef87a35bb6e56e7d5a1f804c63c978bbd1c1516c4eb70edad2b8143169262c9f",
+ "0x0000000000000000000000000000000000000000000000000000000000002d3d": "e978f25d16f468c0a0b585994d1e912837f55e1cd8849e140f484a2702385ef2",
+ "0x0000000000000000000000000000000000000000000000000000000000002d47": "c3e85e9260b6fad139e3c42587cc2df7a9da07fadaacaf2381ca0d4a0c91c819",
+ "0x0000000000000000000000000000000000000000000000000000000000002d51": "bd2647c989abfd1d340fd05add92800064ad742cd82be8c2ec5cc7df20eb0351",
+ "0x0000000000000000000000000000000000000000000000000000000000002d5b": "99ac5ad7b62dd843abca85e485a6d4331e006ef9d391b0e89fb2eeccef1d29a2",
+ "0x0000000000000000000000000000000000000000000000000000000000002d65": "02a4349c3ee7403fe2f23cad9cf2fb6933b1ae37e34c9d414dc4f64516ea9f97",
+ "0x0000000000000000000000000000000000000000000000000000000000002d6f": "627b41fdbdf4a95381da5e5186123bf808c119b849dfdd3f515fa8d54c19c771",
+ "0x0000000000000000000000000000000000000000000000000000000000002d79": "c087b16d7caa58e1361a7b158159469975f55582a4ef760465703a40123226d7",
+ "0x0000000000000000000000000000000000000000000000000000000000002d83": "f7a477c0c27d4890e3fb56eb2dc0386e7409d1c59cab6c7f22b84de45b4c6867",
+ "0x0000000000000000000000000000000000000000000000000000000000002d8d": "1cb440b7d88e98ceb953bc46b003fde2150860be05e11b9a5abae2c814a71571",
+ "0x0000000000000000000000000000000000000000000000000000000000002d97": "72613e3e30445e37af38976f6bb3e3bf7debbcf70156eb37c5ac4e41834f9dd2",
+ "0x0000000000000000000000000000000000000000000000000000000000002da1": "e69e7568b9e70ee7e71ebad9548fc8afad5ff4435df5d55624b39df9e8826c91",
+ "0x0000000000000000000000000000000000000000000000000000000000002dab": "c3f1682f65ee45ce7019ee7059d65f8f1b0c0a8f68f94383410f7e6f46f26577",
+ "0x0000000000000000000000000000000000000000000000000000000000002db5": "93ee1e4480ed7935097467737e54c595a2a6424cf8eaed5eacc2bf23ce368192",
+ "0x0000000000000000000000000000000000000000000000000000000000002dbf": "b07f8855348b496166d3906437b8b76fdf7918f2e87858d8a78b1deece6e2558",
+ "0x0000000000000000000000000000000000000000000000000000000000002dc9": "ec60e51de32061c531b80d2c515bfa8f81600b9b50fc02beaf4dc01dd6e0c9ca",
+ "0x0000000000000000000000000000000000000000000000000000000000002dd3": "2fc9f34b3ed6b3cabd7b2b65b4a21381ad4419670eed745007f9efa8dd365ef1",
+ "0x0000000000000000000000000000000000000000000000000000000000002ddd": "f4af3b701f9b088d23f93bb6d5868370ed1cdcb19532ddd164ed3f411f3e5a95",
+ "0x0000000000000000000000000000000000000000000000000000000000002de7": "8272e509366a028b8d6bbae2a411eb3818b5be7dac69104a4e72317e55a9e697",
+ "0x0000000000000000000000000000000000000000000000000000000000002df1": "a194d76f417dafe27d02a6044a913c0b494fe893840b5b745386ae6078a44e9c",
+ "0x0000000000000000000000000000000000000000000000000000000000002dfb": "a255e59e9a27c16430219b18984594fc1edaf88fe47dd427911020fbc0d92507",
+ "0x0000000000000000000000000000000000000000000000000000000000002e05": "7996946b8891ebd0623c7887dd09f50a939f6f29dea4ca3c3630f50ec3c575cb",
+ "0x0000000000000000000000000000000000000000000000000000000000002e0f": "b04cbab069405f18839e6c6cf85cc19beeb9ee98c159510fcb67cb84652b7db9",
+ "0x0000000000000000000000000000000000000000000000000000000000002e19": "6f241a5e530d1e261ef0f5800d7ff252c33ce148865926e6231d4718f0b9eded",
+ "0x0000000000000000000000000000000000000000000000000000000000002e23": "fcfa9f1759f8db6a7e452af747a972cf3b1b493a216dbd32db21f7c2ce279cce",
+ "0x0000000000000000000000000000000000000000000000000000000000002e2d": "df880227742710ac4f31c0466a6da7c56ec54caccfdb8f58e5d3f72e40e800f3",
+ "0x0000000000000000000000000000000000000000000000000000000000002e37": "adfe28a0f8afc89c371dc7b724c78c2e3677904d03580c7141d32ba32f0ed46f",
+ "0x0000000000000000000000000000000000000000000000000000000000002e41": "b264d19d2daf7d5fcf8d2214eba0aacf72cabbc7a2617219e535242258d43a31",
+ "0x0000000000000000000000000000000000000000000000000000000000002e4b": "f2207420648dccc4f01992831e219c717076ff3c74fb88a96676bbcfe1e63f38",
+ "0x0000000000000000000000000000000000000000000000000000000000002e55": "41e8fae73b31870db8546eea6e11b792e0c9daf74d2fbb6471f4f6c6aaead362",
+ "0x0000000000000000000000000000000000000000000000000000000000002e5f": "4e7a5876c1ee2f1833267b5bd85ac35744a258cc3d7171a8a8cd5c87811078a2",
+ "0x0000000000000000000000000000000000000000000000000000000000002e69": "8d4a424d1a0ee910ccdfc38c7e7f421780c337232d061e3528e025d74b362315",
+ "0x0000000000000000000000000000000000000000000000000000000000002e73": "fa65829d54aba84896370599f041413d50f1acdc8a178211b2960827c1f85cbf",
+ "0x0000000000000000000000000000000000000000000000000000000000002e7d": "da5dfc12da14eafad2ac2a1456c241c4683c6e7e40a7c3569bc618cfc9d6dca3",
+ "0x0000000000000000000000000000000000000000000000000000000000002e87": "16243e7995312ffa3983c5858c6560b2abc637c481746003b6c2b58c62e9a547",
+ "0x0000000000000000000000000000000000000000000000000000000000002e91": "b75f0189b31abbbd88cd32c47ed311c93ec429f1253ee715a1b00d1ca6a1e094",
+ "0x0000000000000000000000000000000000000000000000000000000000002e9b": "d087eb94d6347da9322e3904add7ff7dd0fd72b924b917a8e10dae208251b49d",
+ "0x0000000000000000000000000000000000000000000000000000000000002ea5": "bc17244b8519292d8fbb455f6253e57ecc16b5803bd58f62b0d94da7f8b2a1d6",
+ "0x0000000000000000000000000000000000000000000000000000000000002eaf": "3ff8b39a3c6de6646124497b27e8d4e657d103c72f2001bdd4c554208a0566e3",
+ "0x0000000000000000000000000000000000000000000000000000000000002eb9": "4d0f765d2b6a01f0c787bbb13b1360c1624704883e2fd420ea36037fa7e3a563",
+ "0x0000000000000000000000000000000000000000000000000000000000002ec3": "f6f1dc891258163196785ce9516a14056cbe823b17eb9b90eeee7a299c1ce0e0",
+ "0x0000000000000000000000000000000000000000000000000000000000002ecd": "1dbf19b70c0298507d20fb338cc167d9b07b8747351785047e1a736b42d999d1",
+ "0x0000000000000000000000000000000000000000000000000000000000002ed7": "c3b71007b20abbe908fdb7ea11e3a3f0abff3b7c1ced865f82b07f100167de57",
+ "0x0000000000000000000000000000000000000000000000000000000000002ee1": "3f45edc424499d0d4bbc0fd5837d1790cb41c08f0269273fdf66d682429c25cc",
+ "0x0000000000000000000000000000000000000000000000000000000000002eeb": "cb8f5db9446c485eaae7edbc03e3afed72892fa7f11ad8eb7fa9dffbe3c220eb",
+ "0x0000000000000000000000000000000000000000000000000000000000002ef5": "3d151527b5ba165352a450bee69f0afc78cf2ea9645bb5d8f36fb04435f0b67c",
+ "0x0000000000000000000000000000000000000000000000000000000000002eff": "dd96b35b4ffabce80d377420a0b00b7fbf0eff6a910210155d22d9bd981be5d3",
+ "0x0000000000000000000000000000000000000000000000000000000000002f09": "ace0c30b543d3f92f37eaac45d6f8730fb15fcaaaad4097ea42218abe57cb9f4",
+ "0x0000000000000000000000000000000000000000000000000000000000002f13": "f6342dd31867c9bef6ffa06b6cf192db23d0891ed8fe610eb8d1aaa79726da01",
+ "0x0000000000000000000000000000000000000000000000000000000000002f1d": "a6589e823979c2c2ac55e034d547b0c63aa02109133575d9f159e8a7677f03cb",
+ "0x0000000000000000000000000000000000000000000000000000000000002f27": "9ce48bc641cc1d54ffdb409aab7da1304d5ee08042596b3542ca9737bb2b79a8",
+ "0x0000000000000000000000000000000000000000000000000000000000002f31": "a44be801bd978629775c00d70df6d70b76d0ba918595e81415a27d1e3d6fdee9",
+ "0x0000000000000000000000000000000000000000000000000000000000002f3b": "ce17f1e7af9f7ea8a99b2780d87b15d8b80a68fb29ea52f962b00fecfc6634e0",
+ "0x0000000000000000000000000000000000000000000000000000000000002f45": "4bd91febab8df3770c957560e6185e8af59d2a42078756c525cd7769eb943894",
+ "0x0000000000000000000000000000000000000000000000000000000000002f4f": "414c2a52de31de93a3c69531247b016ac578435243073acc516d4ea673c8dd80",
+ "0x0000000000000000000000000000000000000000000000000000000000002f59": "647fb60bdf2683bd46b63d6884745782364a5522282ed1dc67d9e17c4aaab17d",
+ "0x0000000000000000000000000000000000000000000000000000000000002f63": "fa681ffd0b0dd6f6775e99a681241b86a3a24446bc8a69cdae915701243e3855",
+ "0x0000000000000000000000000000000000000000000000000000000000002f6d": "106ca692777b30cb2aa23ca59f5591514b28196ee8e9b06aa2b4deaea30d9ef6",
+ "0x0000000000000000000000000000000000000000000000000000000000002f77": "494ac6d09377eb6a07ff759df61c2508e65e5671373d756c82e648bd9086d91a",
+ "0x0000000000000000000000000000000000000000000000000000000000002f81": "0ae4ccd2bffa603714cc453bfd92f769dce6c9731c03ac3e2083f35388e6c795",
+ "0x0000000000000000000000000000000000000000000000000000000000002f8b": "d860c999490d9836cc00326207393c78445b7fb90b12aa1d3607e3662b3d32cd",
+ "0x0000000000000000000000000000000000000000000000000000000000002f95": "9587384f876dfec24da857c0bcdb3ded17f3328f28a4d59aa35ca7c25c8102cf",
+ "0x0000000000000000000000000000000000000000000000000000000000002f9f": "4df8093d29bc0ec4e2a82be427771e77a206566194734a73c23477e1a9e451f8",
+ "0x0000000000000000000000000000000000000000000000000000000000002fa9": "c56640f78acbd1da07701c365369766f09a19800ba70276f1f1d3cd1cf6e0686",
+ "0x0000000000000000000000000000000000000000000000000000000000002fb3": "7173d4210aa525eece6b4b19b16bab23686ff9ac71bb9d16008bb114365e79f2",
+ "0x0000000000000000000000000000000000000000000000000000000000002fbd": "89698b41d7ac70e767976a9f72ae6a46701456bc5ad8d146c248548409c90015",
+ "0x0000000000000000000000000000000000000000000000000000000000002fc7": "5b605ab5048d9e4a51ca181ac3fa7001ef5d415cb20335b095c54a40c621dbff",
+ "0x0000000000000000000000000000000000000000000000000000000000002fd1": "9129a84b729e7f69a5522a7020db57e27bf8cbb6042e030106c0cbd185bf0ab8",
+ "0x0000000000000000000000000000000000000000000000000000000000002fdb": "31a63d6d54153ab35fc57068db205a3e68908be238658ca82d8bee9873f82159",
+ "0x0000000000000000000000000000000000000000000000000000000000002fe5": "828641bcea1bc6ee1329bc39dca0afddc11e6867f3da13d4bb5170c54158860d",
+ "0x0000000000000000000000000000000000000000000000000000000000002fef": "7e0752ddd86339f512ec1b647d3bf4b9b50c45e309ab9e70911da7716454b053",
+ "0x0000000000000000000000000000000000000000000000000000000000002ff9": "31d973051189456d5998e05b500da6552138644f8cdbe4ec63f96f21173cb6a1",
+ "0x0000000000000000000000000000000000000000000000000000000000003003": "e33e65b3d29c3b55b2d7b584c5d0540eb5c00c9f157287863b0b619339c302f0",
+ "0x000000000000000000000000000000000000000000000000000000000000300d": "78d55514bcef24b40c7eb0fbe55f922d4468c194f313898f28ba85d8534df82c",
+ "0x0000000000000000000000000000000000000000000000000000000000003017": "2e0f4be4d8adf8690fd64deddbc543f35c5b4f3c3a27b10a77b1fdb8d590f1ee",
+ "0x0000000000000000000000000000000000000000000000000000000000003021": "e1b83ea8c4329f421296387826c89100d82bdc2263ffd8eb9368806a55d9b83b",
+ "0x000000000000000000000000000000000000000000000000000000000000302b": "4ddad36d7262dd9201c5bdd58523f4724e3b740fddbed2185e32687fecacdf6b",
+ "0x0000000000000000000000000000000000000000000000000000000000003035": "156c0674e46cdec70505443c5269d42c7bb14ee6c00f86a23962f08906cbb846",
+ "0x000000000000000000000000000000000000000000000000000000000000303f": "dfc56ec6c218a08b471d757e0e7de8dddec9e82f401cb7d77df1f2a9ca54c607",
+ "0x0000000000000000000000000000000000000000000000000000000000003049": "395d660f77c4360705cdc0be895907ec183097f749fac18b6eaa0245c1009074",
+ "0x0000000000000000000000000000000000000000000000000000000000003053": "84c0060087da2c95dbd517d0f2dd4dfba70691a5952fe4048c310e88e9c06e4f",
+ "0x000000000000000000000000000000000000000000000000000000000000305d": "f4df943c52b1d5fb9c1f73294ca743577d83914ec26d6e339b272cdeb62de586",
+ "0x0000000000000000000000000000000000000000000000000000000000003067": "0bb47661741695863ef89d5c2b56666772f871be1cc1dccf695bd357e4bb26d6",
+ "0x0000000000000000000000000000000000000000000000000000000000003071": "4a1f7691f29900287c6931545884881143ecae44cb26fdd644892844fde65dac",
+ "0x000000000000000000000000000000000000000000000000000000000000307b": "9b133cc50cbc46d55ce2910eebaf8a09ab6d4e606062c94aac906da1646bc33f",
+ "0x0000000000000000000000000000000000000000000000000000000000003085": "473b076b542da72798f9de31c282cb1dcd76cba2a22adc7391670ffdbc910766",
+ "0x000000000000000000000000000000000000000000000000000000000000308f": "225dd472ef6b36a51de5c322a31a9f71c80f0f350432884526d9844bb2e676d3",
+ "0x0000000000000000000000000000000000000000000000000000000000003099": "31df97b2c9fc65b5520b89540a42050212e487f46fac67685868f1c3e652a9aa",
+ "0x00000000000000000000000000000000000000000000000000000000000030a3": "4416d885f34ad479409bb9e05e8846456a9be7e74655b9a4d7568a8d710aa06a",
+ "0x00000000000000000000000000000000000000000000000000000000000030ad": "ae627f8802a46c1357fa42a8290fd1366ea21b8ccec1cc624e42022647c53802",
+ "0x00000000000000000000000000000000000000000000000000000000000030b7": "8961e8b83d91487fc32b3d6af26b1d5e7b4010dd8d028fe165187cdfb04e151c",
+ "0x00000000000000000000000000000000000000000000000000000000000030c1": "c22e39f021605c6f3d967aef37f0bf40b09d776bac3edb4264d0dc07389b9845",
+ "0x00000000000000000000000000000000000000000000000000000000000030cb": "7cfa4c7066c690c12b9e8727551bef5fe05b750ac6637a5af632fce4ceb4e2ce",
+ "0x00000000000000000000000000000000000000000000000000000000000030d5": "943d79e4329b86f8e53e8058961955f2b0a205fc3edeea2aae54ba0c22b40c31",
+ "0x00000000000000000000000000000000000000000000000000000000000030df": "66598070dab784e48a153bf9c6c3e57d8ca92bed6592f0b9e9abe308a17aedf0",
+ "0x00000000000000000000000000000000000000000000000000000000000030e9": "ac8fe4eb91577288510a9bdae0d5a8c40b8225172379cd70988465d8b98cfa70",
+ "0x00000000000000000000000000000000000000000000000000000000000030f3": "2b0018a8548e5ce2a6b6b879f56e3236cc69d2efff80f48add54efd53681dfce",
+ "0x00000000000000000000000000000000000000000000000000000000000030fd": "823445936237e14452e253a6692290c1be2e1be529ddbeecc35c9f54f7ea9887",
+ "0x0000000000000000000000000000000000000000000000000000000000003107": "3051a0d0701d233836b2c802060d6ee629816c856a25a62dc73bb2f2fc93b918",
+ "0x0000000000000000000000000000000000000000000000000000000000003111": "44a50fda08d2f7ca96034186475a285a8a570f42891f72d256a52849cb188c85",
+ "0x000000000000000000000000000000000000000000000000000000000000311b": "6e60069a12990ef960c0ac825fd0d9eb44aec9eb419d0df0c25d7a1d16c282e7",
+ "0x0000000000000000000000000000000000000000000000000000000000003125": "581ddf7753c91af00c894f8d5ab22b4733cfeb4e75c763725ebf46fb889fa76a",
+ "0x000000000000000000000000000000000000000000000000000000000000312f": "9a1dfba8b68440fcc9e89b86e2e290367c5e5fb0833b34612d1f4cfc53189526",
+ "0x0000000000000000000000000000000000000000000000000000000000003139": "54a623060b74d56f3c0d6793e40a9269c56f90bcd19898855113e5f9e42abc2d",
+ "0x0000000000000000000000000000000000000000000000000000000000003143": "1cfeb8cd5d56e1d202b4ec2851f22e99d6ad89af8a4e001eb014b724d2d64924",
+ "0x000000000000000000000000000000000000000000000000000000000000314d": "ad223cbf591f71ffd29e2f1c676428643313e3a8e8a7d0b0e623181b3047be92",
+ "0x0000000000000000000000000000000000000000000000000000000000003157": "e13f31f026d42cad54958ad2941f133d8bd85ee159f364a633a79472f7843b67",
+ "0x0000000000000000000000000000000000000000000000000000000000003161": "b45099ae3bbe17f4417d7d42951bd4425bce65f1db69a354a64fead61b56306d",
+ "0x000000000000000000000000000000000000000000000000000000000000316b": "9d2b65379c5561a607df4dae8b36eca78818acec4455eb47cfa437a0b1941707",
+ "0x0000000000000000000000000000000000000000000000000000000000003175": "5855b3546d3becda6d5dd78c6440f879340a5734a18b06340576a3ce6a48d9a0",
+ "0x000000000000000000000000000000000000000000000000000000000000317f": "d6a61c76ae029bb5bca86d68422c55e8241d9fd9b616556b375c91fb7224b79e",
+ "0x0000000000000000000000000000000000000000000000000000000000003189": "96ac5006561083735919ae3cc8d0762a9cba2bdefd4a73b8e69f447f689fba31",
+ "0x0000000000000000000000000000000000000000000000000000000000003193": "4ced18f55676b924d39aa7bcd7170bac6ff4fbf00f6a800d1489924c2a091412",
+ "0x000000000000000000000000000000000000000000000000000000000000319d": "c95a6a7efdbefa710a525085bcb57ea2bf2d4ae9ebfcee4be3777cfcc3e534ea",
+ "0x00000000000000000000000000000000000000000000000000000000000031a7": "2b2917b5b755eb6af226e16781382bd22a907c9c7411c34a248af2b5a0439079",
+ "0x00000000000000000000000000000000000000000000000000000000000031b1": "18d5804f2e9ad3f891ecf05e0bfc2142c2a9f7b4de03aebd1cf18067a1ec6490",
+ "0x00000000000000000000000000000000000000000000000000000000000031bb": "b47682f0ce3783700cbe5ffbb95d22c943cc74af12b9c79908c5a43f10677478",
+ "0x00000000000000000000000000000000000000000000000000000000000031c5": "e4b60e5cfb31d238ec412b0d0e3ad9e1eb00e029c2ded4fea89288f900f7db0e",
+ "0x00000000000000000000000000000000000000000000000000000000000031cf": "fc0ea3604298899c10287bba84c02b9ec5d6289c1493e9fc8d58920e4eaef659",
+ "0x00000000000000000000000000000000000000000000000000000000000031d9": "4c3301a70611b34e423cf713bda7f6f75bd2070f909681d3e54e3a9a6d202e5a",
+ "0x00000000000000000000000000000000000000000000000000000000000031e3": "84a5b4e32a62bf3298d846e64b3896dffbbcc1fafb236df3a047b5223577d07b",
+ "0x00000000000000000000000000000000000000000000000000000000000031ed": "ff70b97d34af8e2ae984ada7bc6f21ed294d9b392a903ad8bbb1be8b44083612",
+ "0x00000000000000000000000000000000000000000000000000000000000031f7": "73e186de72ef30e4be4aeebe3eaec84222f8a325d2d07cd0bd1a49f3939915ce",
+ "0x0000000000000000000000000000000000000000000000000000000000003201": "ed185ec518c0459392b274a3d10554e452577d33ecb72910f613941873e61215",
+ "0x000000000000000000000000000000000000000000000000000000000000320b": "5cfbad3e509733bce64e0f6492b3886300758c47a38e9edec4b279074c7966d4",
+ "0x0000000000000000000000000000000000000000000000000000000000003215": "867a7ab4c504e836dd175bd6a00e8489f36edaeda95db9ce4acbf9fb8df28926",
+ "0x000000000000000000000000000000000000000000000000000000000000321f": "0d01993fd605f101c950c68b4cc2b8096ef7d0009395dec6129f86f195eb2217",
+ "0x0000000000000000000000000000000000000000000000000000000000003229": "8e14fd675e72f78bca934e1ffad52b46fd26913063e7e937bce3fa11aed29075",
+ "0x0000000000000000000000000000000000000000000000000000000000003233": "4ec1847e4361c22cdecc67633e244b9e6d04ec103f4019137f9ba1ecc90198f4",
+ "0x000000000000000000000000000000000000000000000000000000000000323d": "ec69e9bbb0184bf0889df50ec7579fa4029651658d639af456a1f6a7543930ef",
+ "0x0000000000000000000000000000000000000000000000000000000000003247": "efdd626048ad0aa6fcf806c7c2ad7b9ae138136f10a3c2001dc5b6c920db1554",
+ "0x0000000000000000000000000000000000000000000000000000000000003251": "551de1e4cafd706535d77625558f8d3898173273b4353143e5e1c7e859848d6b",
+ "0x000000000000000000000000000000000000000000000000000000000000325b": "137efe559a31d9c5468259102cd8634bba72b0d7a0c7d5bcfc449c5f4bdb997a",
+ "0x0000000000000000000000000000000000000000000000000000000000003265": "fb0a1b66acf5f6bc2393564580d74637945891687e61535aae345dca0b0f5e78",
+ "0x000000000000000000000000000000000000000000000000000000000000326f": "96eea2615f9111ee8386319943898f15c50c0120b8f3263fab029123c5fff80c",
+ "0x0000000000000000000000000000000000000000000000000000000000003279": "68725bebed18cd052386fd6af9b398438c01356223c5cc15f49093b92b673eff",
+ "0x0000000000000000000000000000000000000000000000000000000000003283": "e2f1e4557ed105cf3bd8bc51ebaa4446f554dcb38c005619bd9f203f4494f5dd",
+ "0x000000000000000000000000000000000000000000000000000000000000328d": "48ef06d84d5ad34fe56ce62e095a34ea4a903bf597a8640868706af7b4de7288",
+ "0x0000000000000000000000000000000000000000000000000000000000003297": "5c57714b2a85d0d9331ce1ee539a231b33406ec19adcf1d8f4c88ab8c1f4fbae",
+ "0x00000000000000000000000000000000000000000000000000000000000032a1": "204299e7aa8dfe5328a0b863b20b6b4cea53a469d6dc8d4b31c7873848a93f33",
+ "0x00000000000000000000000000000000000000000000000000000000000032ab": "b74eea6df3ce54ee9f069bebb188f4023673f8230081811ab78ce1c9719879e5",
+ "0x00000000000000000000000000000000000000000000000000000000000032b5": "af5624a3927117b6f1055893330bdf07a64e96041241d3731b9315b5cd6d14d7",
+ "0x00000000000000000000000000000000000000000000000000000000000032bf": "c657b0e79c166b6fdb87c67c7fe2b085f52d12c6843b7d6090e8f230d8306cda",
+ "0x00000000000000000000000000000000000000000000000000000000000032c9": "a0e08ceff3f3c426ab2c30881eff2c2fc1edf04b28e1fb38e622648224ffbc6b",
+ "0x00000000000000000000000000000000000000000000000000000000000032d3": "c9792da588df98731dfcbf54a6264082e791540265acc2b3ccca5cbd5c0c16de",
+ "0x00000000000000000000000000000000000000000000000000000000000032dd": "c74f4bb0f324f42c06e7aeacb9446cd5ea500c3b014d5888d467610eafb69297",
+ "0x00000000000000000000000000000000000000000000000000000000000032e7": "1acd960a8e1dc68da5b1db467e80301438300e720a450ab371483252529a409b",
+ "0x00000000000000000000000000000000000000000000000000000000000032f1": "6cef279ba63cbac953676e889e4fe1b040994f044078196a6ec4e6d868b79aa1",
+ "0x00000000000000000000000000000000000000000000000000000000000032fb": "60eb986cb497a0642b684852f009a1da143adb3128764b772daf51f6efaae90a",
+ "0x0000000000000000000000000000000000000000000000000000000000003305": "c50024557485d98123c9d0e728db4fc392091f366e1639e752dd677901681acc",
+ "0x000000000000000000000000000000000000000000000000000000000000330f": "b860632e22f3e4feb0fdf969b4241442eae0ccf08f345a1cc4bb62076a92d93f",
+ "0x0000000000000000000000000000000000000000000000000000000000003319": "21085bf2d264529bd68f206abc87ac741a2b796919eeee6292ed043e36d23edb",
+ "0x0000000000000000000000000000000000000000000000000000000000003323": "80052afb1f39f11c67be59aef7fe6551a74f6b7d155a73e3d91b3a18392120a7",
+ "0x000000000000000000000000000000000000000000000000000000000000332d": "a3b0793132ed37459f24d6376ecfa8827c4b1d42afcd0a8c60f9066f230d7675",
+ "0x0000000000000000000000000000000000000000000000000000000000003337": "e69d353f4bc38681b4be8cd5bbce5eb4e819399688b0b6225b95384b08dcc8b0",
+ "0x0000000000000000000000000000000000000000000000000000000000003341": "221e784d42a121cd1d13d111128fcae99330408511609ca8b987cc6eecafefc4",
+ "0x000000000000000000000000000000000000000000000000000000000000334b": "dcd669ebef3fb5bebc952ce1c87ae4033b13f37d99cf887022428d024f3a3d2e",
+ "0x0000000000000000000000000000000000000000000000000000000000003355": "4dd1eb9319d86a31fd56007317e059808f7a76eead67aecc1f80597344975f46",
+ "0x000000000000000000000000000000000000000000000000000000000000335f": "5e1834c653d853d146db4ab6d17509579497c5f4c2f9004598bcd83172f07a5f",
+ "0x0000000000000000000000000000000000000000000000000000000000003369": "9f78a30e124d21168645b9196d752a63166a1cf7bbbb9342d0b8fee3363ca8de",
+ "0x0000000000000000000000000000000000000000000000000000000000003373": "1f7c1081e4c48cef7d3cb5fd64b05135775f533ae4dabb934ed198c7e97e7dd8",
+ "0x000000000000000000000000000000000000000000000000000000000000337d": "4d40a7ec354a68cf405cc57404d76de768ad71446e8951da553c91b06c7c2d51",
+ "0x0000000000000000000000000000000000000000000000000000000000003387": "f653da50cdff4733f13f7a5e338290e883bdf04adf3f112709728063ea965d6c"
+ },
+ "key": "0x37d65eaa92c6bc4c13a5ec45527f0c18ea8932588728769ec7aecfe6d9f32e42"
+ },
+ "0x00f691ca9e1403d01344ebbaca0201380cacc99c": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x7c48e400de1f24b4de94c59068fcd91a028576d13a22f900a7fcbd8f4845bcf4"
+ },
+ "0x0300100f529a704d19736a8714837adbc934db7f": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x97b25febb46f44607c87a3498088c605086df207c7ddcd8ee718836a516a9153"
+ },
+ "0x043a718774c572bd8a25adbeb1bfcd5c0256ae11": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x4c310e1f5d2f2e03562c4a5c473ae044b9ee19411f07097ced41e85bd99c3364"
+ },
+ "0x046dc70a4eba21473beb6d9460d880b8cfd66613": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x4fd7c8d583447b937576211163a542d945ac8c0a6e22d0c42ac54e2cbaff9281"
+ },
+ "0x04b85539570fb9501f65453dbfad410a467becdd": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x9e53f0a2ddb430d27f6fffa0a68b5f75db1d68e24113dcca6e33918cdae80846",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000019": "19",
+ "0x000000000000000000000000000000000000000000000000000000000000001a": "1a",
+ "0x000000000000000000000000000000000000000000000000000000000000001b": "1b"
+ },
+ "key": "0xd84f7711be2f8eca69c742153230995afb483855b7c555b08da330139cdb9579"
+ },
+ "0x04b8d34e20e604cadb04b9db8f6778c35f45a2d2": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe99460a483f3369006e3edeb356b3653699f246ec71f30568617ebc702058f59"
+ },
+ "0x04d6c0c946716aac894fc1653383543a91faab60": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x98bb9ba48fda7bb8091271ab0e53d7e0022fb1f1fa8fa00814e193c7d4b91eb3"
+ },
+ "0x050c9c302e904c7786b69caa9dd5b27a6e571b72": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x818eaf5adb56c6728889ba66b6980cd66b41199f0007cdd905ae739405e3c630",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000077": "77",
+ "0x0000000000000000000000000000000000000000000000000000000000000078": "78",
+ "0x0000000000000000000000000000000000000000000000000000000000000079": "79"
+ },
+ "key": "0xc3ac56e9e7f2f2c2c089e966d1b83414951586c3afeb86300531dfa350e38929"
+ },
+ "0x06f647b157b8557a12979ba04cf5ba222b9747cf": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xaf38e0e6a4a4005507b5d3e9470e8ccc0273b74b6971f768cbdf85abeab8a95b"
+ },
+ "0x075198bfe61765d35f990debe90959d438a943ce": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x1d38ada74301c31f3fd7d92dd5ce52dc37ae633e82ac29c4ef18dfc141298e26"
+ },
+ "0x075db7ab5778cd5491d3ed7ab64c1ec0818148f3": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xf84223f460140ad56af9836cfa6c1c58c1397abf599c214689bc881066020ff7"
+ },
+ "0x08037e79bb41c0f1eda6751f0dabb5293ca2d5bf": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xcd07379b0120ad9a9c7fa47e77190be321ab107670f3115fec485bebb467307d"
+ },
+ "0x087d80f7f182dd44f184aa86ca34488853ebcc04": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x867bc89cf8d5b39f1712fbc77414bbd93012af454c226dcee0fb34ccc0017498"
+ },
+ "0x08d3b23dbfe8ef7965a8b5e4d9c21feddbc11491": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x9a4a33f978d84e0aceb3ac3670c2e2df6c8ae27c189a96ed00b806d10ed7b4ee",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000001c6": "01c6",
+ "0x00000000000000000000000000000000000000000000000000000000000001c7": "01c7",
+ "0x00000000000000000000000000000000000000000000000000000000000001c8": "01c8"
+ },
+ "key": "0x792cc9f20a61c16646d5b6136693e7789549adb7d8e35503d0004130ea6528b0"
+ },
+ "0x09b9c1875399cd724b1017f155a193713cb23732": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x47fa48e25d3669a9bb190c59938f4be49de2d083696eb939c3b4072ec67e43b1",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000005e": "5e",
+ "0x000000000000000000000000000000000000000000000000000000000000005f": "5f",
+ "0x0000000000000000000000000000000000000000000000000000000000000060": "60"
+ },
+ "key": "0x23ddaac09188c12e5d88009afa4a34041175c5531f45be53f1560a1cbfec4e8a"
+ },
+ "0x0a3aaee7ccfb1a64f6d7bcd46657c27cb1f4569a": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xc7fc033fe9f00d24cb9c479ddc0598e592737c305263d088001d7419d16feffa"
+ },
+ "0x0badc617ca1bcb1cb1d5272f64b168cbf0e8f86f": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xca39f5f4ee3c6b33efe7bc485439f97f9dc62f65852c7a1cdf54fab1e3b70429",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000002d": "2d",
+ "0x000000000000000000000000000000000000000000000000000000000000002e": "2e",
+ "0x000000000000000000000000000000000000000000000000000000000000002f": "2f"
+ },
+ "key": "0xc250f30c01f4b7910c2eb8cdcd697cf493f6417bb2ed61d637d625a85a400912"
+ },
+ "0x0c2c51a0990aee1d73c1228de158688341557508": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x28f25652ec67d8df6a2e33730e5d0983443e3f759792a0128c06756e8eb6c37f"
+ },
+ "0x0d336bc3778662a1252d29a6f7216055f7a582bf": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xa5a91cf9e815fb55df14b3ee8c1325a988cb3b6dd34796c901385c3cc2992073",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000013f": "013f",
+ "0x0000000000000000000000000000000000000000000000000000000000000140": "0140",
+ "0x0000000000000000000000000000000000000000000000000000000000000141": "0141"
+ },
+ "key": "0x86a73e3c668eb065ecac3402c6dc912e8eb886788ea147c770f119dcd30780c6"
+ },
+ "0x0e4aea2bbb2ae557728f2661ee3639360f1d787a": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x74ed78eb16016d7ff3a173ab1bbcee9daa8e358a9d6c9be5e84ba6f4a34cf96a",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000d1": "d1",
+ "0x00000000000000000000000000000000000000000000000000000000000000d2": "d2",
+ "0x00000000000000000000000000000000000000000000000000000000000000d3": "d3"
+ },
+ "key": "0x517bd5fbe28e4368b0b9fcba13d5e81fb51babdf4ed63bd83885235ee67a8fa0"
+ },
+ "0x0ef32dec5f88a96c2eb042126e8ab982406e0267": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x181abdd5e212171007e085fdc284a84d42d5bfc160960d881ccb6a10005ff089"
+ },
+ "0x0ef96a52f4510f82b049ba991c401a8f5eb823e5": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x59312f89c13e9e24c1cb8b103aa39a9b2800348d97a92c2c9e2a78fa02b70025"
+ },
+ "0x0f228c3ba41142e702ee7306859026c99d3d2df5": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xedd9b1f966f1dfe50234523b479a45e95a1a8ec4a057ba5bfa7b69a13768197c"
+ },
+ "0x0fdcca8fde6d69ecbc9bfadb056ecf62d1966370": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x493f90435402df0907019bffc6dd25a17ce4acd6eb6077ef94c1626f0d77c9f0",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000f9": "f9",
+ "0x00000000000000000000000000000000000000000000000000000000000000fa": "fa",
+ "0x00000000000000000000000000000000000000000000000000000000000000fb": "fb"
+ },
+ "key": "0xfb5a31c5cfd33dce2c80a30c5efc28e5f4025624adcc2205a2504a78c57bdd1c"
+ },
+ "0x0fe037febcc3adf9185b4e2ad4ea43c125f05049": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xb7d9d175039df1ba52c734547844f8805252893c029f7dbba9a63f8bce3ee306"
+ },
+ "0x0fed138ec52bab88db6c068df9125936c7c3e11b": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x66eb16071ba379bf0c632fcb52f9175a656bef62adf0bef5349a7f5a6aad5d88",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000176": "0176",
+ "0x0000000000000000000000000000000000000000000000000000000000000177": "0177",
+ "0x0000000000000000000000000000000000000000000000000000000000000178": "0178"
+ },
+ "key": "0x255ec86eac03ba59f6dfcaa02128adbb22c561ae0c49e9e62e4fff363750626e"
+ },
+ "0x102efa1f2e0ad16ada57759b815245b8f8d27ce4": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x9d42947ac5e61285567f65d4b400d90343dbd3192534c4c1f9d941c04f48f17c"
+ },
+ "0x1037044fabf0421617c47c74681d7cc9c59f136c": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x2290ea88cc63f09ab5e8c989a67e2e06613311801e39c84aae3badd8bb38409c"
+ },
+ "0x1042d41ee3def49e70df4e6c2be307b8015111e5": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xdf3c1bfab8f7e70a8edf94792f91e4b6b2c2aa61caf687e4f6cb689d180adb80",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000095": "95",
+ "0x0000000000000000000000000000000000000000000000000000000000000096": "96",
+ "0x0000000000000000000000000000000000000000000000000000000000000097": "97"
+ },
+ "key": "0xc0ce77c6a355e57b89cca643e70450612c0744c9f0f8bf7dee51d6633dc850b1"
+ },
+ "0x104eb07eb9517a895828ab01a3595d3b94c766d5": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xfab4c6889992a3f4e96b005dfd851021e9e1ec2631a7ccd2a001433e35077968"
+ },
+ "0x1219c38638722b91f3a909f930d3acc16e309804": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xd63070208c85e91c4c8c942cf52c416f0f3004c392a15f579350168f178dba2e"
+ },
+ "0x132432ce1ce64304f1d145eba1772f6edd6cdd17": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x729953a43ed6c913df957172680a17e5735143ad767bda8f58ac84ec62fbec5e"
+ },
+ "0x13dd437fc2ed1cd5d943ac1dd163524c815d305c": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x99e56541f21039c9b7c63655333841a3415de0d27b79d18ade9ec7ecde7a1139"
+ },
+ "0x14e46043e63d0e3cdcf2530519f4cfaf35058cb2": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x9feaf0bd45df0fbf327c964c243b2fbc2f0a3cb48fedfeea1ae87ac1e66bc02f"
+ },
+ "0x1534b43c6dfa3695446aaf2aa07d123132cceceb": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x2a248c1755e977920284c8054fceeb20530dc07cd8bbe876f3ce02000818cc3a"
+ },
+ "0x15af6900147a8730b5ce3e1db6333f33f64ebb2c": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x5264e880ecf7b80afda6cc2a151bac470601ff8e376af91aaf913a36a30c4009"
+ },
+ "0x16032a66fc011dab75416d2449fe1a3d5f4319d8": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe3c79e424fd3a7e5bf8e0426383abd518604272fda87ecd94e1633d36f55bbb6"
+ },
+ "0x16c57edf7fa9d9525378b0b81bf8a3ced0620c1c": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xda81833ff053aff243d305449775c3fb1bd7f62c4a3c95dc9fb91b85e032faee"
+ },
+ "0x17333b15b4a5afd16cac55a104b554fc63cc8731": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x4ceaf2371fcfb54a4d8bc1c804d90b06b3c32c9f17112b57c29b30a25cf8ca12"
+ },
+ "0x17b917f9d79d922b33e41582984712e32b3ad366": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x944f095afbd1383e5d0f91ef02895d398f4f76fdb6d86adf4765f25bdc304f5f",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000081": "81",
+ "0x0000000000000000000000000000000000000000000000000000000000000082": "82",
+ "0x0000000000000000000000000000000000000000000000000000000000000083": "83"
+ },
+ "key": "0x13cfc46f6bdb7a1c30448d41880d061c3b8d36c55a29f1c0c8d95a8e882b8c25"
+ },
+ "0x18291b5f568e45ef0f16709b20c810e08750791f": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x315ccc15883d06b4e743f8252c999bf1ee994583ff6114d89c0f3ddee828302b"
+ },
+ "0x189f40034be7a199f1fa9891668ee3ab6049f82d": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x6225e8f52719d564e8217b5f5260b1d1aac2bcb959e54bc60c5f479116c321b8"
+ },
+ "0x18ac3e7343f016890c510e93f935261169d9e3f5": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xeba984db32038d7f4d71859a9a2fc6e19dde2e23f34b7cedf0c4bf228c319f17"
+ },
+ "0x19041ad672875015bc4041c24b581eafc0869aab": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xfc8d513d1615c763865b984ea9c381032c14a983f80e5b2bd90b20b518329ed7"
+ },
+ "0x19129f84d987b13468846f822882dba0c50ca07d": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x2b8d12301a8af18405b3c826b6edcc60e8e034810f00716ca48bebb84c4ce7ab"
+ },
+ "0x194e49be24c1a94159f127aa9257ded12a0027db": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xe0a3d3b839fca0f54745d0c50a048e424c9259f063b7416410a4422eeb7f837e",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000180": "0180",
+ "0x0000000000000000000000000000000000000000000000000000000000000181": "0181",
+ "0x0000000000000000000000000000000000000000000000000000000000000182": "0182"
+ },
+ "key": "0xd57eafe6d4c5b91fe7114e199318ab640e55d67a1e9e3c7833253808b7dca75f"
+ },
+ "0x19581e27de7ced00ff1ce50b2047e7a567c76b1c": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x7bac5af423cb5e417fa6c103c7cb9777e80660ce3735ca830c238b0d41610186"
+ },
+ "0x196d4a4c50eb47562596429fdecb4e3ac6b2a5fd": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x4e258aa445a0e2a8704cbc57bbe32b859a502cd6f99190162236300fabd86c4a"
+ },
+ "0x1a0eae9b9214d9269a4cff4982c45a67f4ca63aa": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x5622801b1011de8403e44308bbf89a5809b7ad6586268cd72164523587f9b0e4",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000007c": "7c",
+ "0x000000000000000000000000000000000000000000000000000000000000007d": "7d",
+ "0x000000000000000000000000000000000000000000000000000000000000007e": "7e"
+ },
+ "key": "0x6a2c8498657ae4f0f7b1a02492c554f7f8a077e454550727890188f7423ba014"
+ },
+ "0x1ae59138ad95812304b117ee7b0d502bcb885af5": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xf164775805f47d8970d3282188009d4d7a2da1574fe97e5d7bc9836a2eed1d5b"
+ },
+ "0x1b16b1df538ba12dc3f97edbb85caa7050d46c14": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x8ee17a1ec4bae15d8650323b996c55d5fa11a14ceec17ff1d77d725183904914"
+ },
+ "0x1c123d5c0d6c5a22ef480dce944631369fc6ce28": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xa9fd2e3a6de5a9da5badd719bd6e048acefa6d29399d8a99e19fd9626805b60b"
+ },
+ "0x1c972398125398a3665f212930758ae9518a8c94": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x5d97d758e8800d37b6d452a1b1812d0afedba11f3411a17a8d51ee13a38d73f0"
+ },
+ "0x1e345d32d0864f75b16bde837543aa44fac35935": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xd91acf305934a60c960a93fb00f927ec79308b8a919d2449faede722c2324cb3",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000153": "0153",
+ "0x0000000000000000000000000000000000000000000000000000000000000154": "0154",
+ "0x0000000000000000000000000000000000000000000000000000000000000155": "0155"
+ },
+ "key": "0x961508ac3c93b30ee9a5a34a862c9fe1659e570546ac6c2e35da20f6d2bb5393"
+ },
+ "0x1e8ce8258fb47f55bf2c1473acb89a10074b9d0e": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xfb2ab315988de92dcf6ba848e756676265b56e4b84778a2c955fb2b3c848c51c"
+ },
+ "0x1f4924b14f34e24159387c0a4cdbaa32f3ddb0cf": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x7963685967117ffb6fd019663dc9e782ebb1234a38501bffc2eb5380f8dc303b"
+ },
+ "0x1f5746736c7741ae3e8fa0c6e947cade81559a86": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x4e5bab4ebd077c3bbd8239995455989ea2e95427ddeed47d0618d9773332bb05"
+ },
+ "0x1f5bde34b4afc686f136c7a3cb6ec376f7357759": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xc3791fc487a84f3731eb5a8129a7e26f357089971657813b48a821f5582514b3"
+ },
+ "0x2143e52a9d8ad4c55c8fdda755f4889e3e3e7721": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xd9fa858992bc92386a7cebcd748eedd602bf432cb4b31607566bc92b85179624"
+ },
+ "0x2144780b7d04d82239c6570f84ab66376b63dfc9": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x59936c15c454933ebc4989afa77e350f7640301b07341aead5f1b2668eeb1dad",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000db": "db",
+ "0x00000000000000000000000000000000000000000000000000000000000000dc": "dc",
+ "0x00000000000000000000000000000000000000000000000000000000000000dd": "dd"
+ },
+ "key": "0xd37b6f5e5f0fa6a1b3fd15c9b3cf0fb595ba245ab912ad8059e672fa55f061b8"
+ },
+ "0x22694f8f2d0c62f63a25bd0057a80b89084c3b47": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x2369a492b6cddcc0218617a060b40df0e7dda26abe48ba4e4108c532d3f2b84f"
+ },
+ "0x22b3f17adeb5f2ec22135d275fcc6e29f4989401": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xa3abdaefbb886078dc6c5c72e4bc8d12e117dbbd588236c3fa7e0c69420eb24a"
+ },
+ "0x23262ad5ae496588bd793910b55ccf178fbd73f9": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x3437803101a8040aca273fb734d7965a87f823ff1ef78c7edcaad358eb98dee3",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000171": "0171",
+ "0x0000000000000000000000000000000000000000000000000000000000000172": "0172",
+ "0x0000000000000000000000000000000000000000000000000000000000000173": "0173"
+ },
+ "key": "0xd8489fd0ce5e1806b24d1a7ce0e4ba8f0856b87696456539fcbb625a9bed2ccc"
+ },
+ "0x23b17315554bd2928c1f86dd526f7ee065a9607d": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x12e394ad62e51261b4b95c431496e46a39055d7ada7dbf243f938b6d79054630"
+ },
+ "0x23c86a8aded0ad81f8111bb07e6ec0ffb00ce5bf": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xd72e318c1cea7baf503950c9b1bd67cf7caf2f663061fcde48d379047a38d075"
+ },
+ "0x23e6931c964e77b02506b08ebf115bad0e1eca66": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x174f1a19ff1d9ef72d0988653f31074cb59e2cf37cd9d2992c7b0dd3d77d84f9"
+ },
+ "0x24255ef5d941493b9978f3aabb0ed07d084ade19": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x7583557e4e3918c95965fb610dc1424976c0eee606151b6dfc13640e69e5cb15"
+ },
+ "0x245843abef9e72e7efac30138a994bf6301e7e1d": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xfe6e594c507ec0ac14917f7a8032f83cd0c3c58b461d459b822190290852c0e1"
+ },
+ "0x25261a7e8395b6e798e9b411c962fccc0fb31e38": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x1017b10a7cc3732d729fe1f71ced25e5b7bc73dc62ca61309a8c7e5ac0af2f72"
+ },
+ "0x2553ec67bc75f75d7de13db86b14290f0f76e342": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x8078f3259d8199b7ca39d51e35d5b58d71ff148606731060386d323c5d19182c",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000185": "0185",
+ "0x0000000000000000000000000000000000000000000000000000000000000186": "0186",
+ "0x0000000000000000000000000000000000000000000000000000000000000187": "0187"
+ },
+ "key": "0x0f30822f90f33f1d1ba6d1521a00935630d2c81ab12fa03d4a0f4915033134f3"
+ },
+ "0x2604439a795970de2047e339293a450c0565f625": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x8678559b30b321b0f0420a4a3e8cecfde90c6e56766b78c1723062c93c1f041f"
+ },
+ "0x26704bf05b1da795939788ef05c8804dcf4b9009": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xd60ee4ad5abbe759622fca5c536109b11e85aa2b48c0be2aebf01df597e74dba",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000015d": "015d",
+ "0x000000000000000000000000000000000000000000000000000000000000015e": "015e",
+ "0x000000000000000000000000000000000000000000000000000000000000015f": "015f"
+ },
+ "key": "0xd1691564c6a5ab1391f0495634e749b9782de33756b6a058f4a9536c1b37bca6"
+ },
+ "0x2727d12b98783b2c3641b5672bcfcdf007971d28": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x59739ba3b156eb78f8bbb14bbf3dacdebfde95140f586db66f72e3117b94bb67",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000112": "0112",
+ "0x0000000000000000000000000000000000000000000000000000000000000113": "0113",
+ "0x0000000000000000000000000000000000000000000000000000000000000114": "0114"
+ },
+ "key": "0x88bf4121c2d189670cb4d0a16e68bdf06246034fd0a59d0d46fb5cec0209831e"
+ },
+ "0x2795044ce0f83f718bc79c5f2add1e52521978df": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xee9186a01e5e1122b61223b0e6acc6a069c9dcdb7307b0a296421272275f821b"
+ },
+ "0x27952171c7fcdf0ddc765ab4f4e1c537cb29e5e5": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x0a93a7231976ad485379a3b66c2d8983ba0b2ca87abaf0ca44836b2a06a2b102"
+ },
+ "0x27abdeddfe8503496adeb623466caa47da5f63ab": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x482814ea8f103c39dcf6ba7e75df37145bde813964d82e81e5d7e3747b95303d"
+ },
+ "0x281c93990bac2c69cf372c9a3b66c406c86cca82": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x81c0c51e15c9679ef12d02729c09db84220ba007efe7ced37a57132f6f0e83c9"
+ },
+ "0x2847213288f0988543a76512fab09684131809d9": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe1b86a365b0f1583a07fc014602efc3f7dedfa90c66e738e9850719d34ac194e"
+ },
+ "0x28969cdfa74a12c82f3bad960b0b000aca2ac329": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x96d7104053877823b058fd9248e0bba2a540328e52ffad9bb18805e89ff579dc"
+ },
+ "0x2a0ab732b4e9d85ef7dc25303b64ab527c25a4d7": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x5e88e876a3af177e6daafe173b67f186a53f1771a663747f26b278c5acb4c219"
+ },
+ "0x2aac4746638ae1457010747a5b0fd2380a388f4f": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x5a82aff126ffebff76002b1e4de03c40ba494b81cb3fbc528f23e4be35a9afe6",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000004b": "4b",
+ "0x000000000000000000000000000000000000000000000000000000000000004c": "4c",
+ "0x000000000000000000000000000000000000000000000000000000000000004d": "4d"
+ },
+ "key": "0x96c43ef9dce3410b78df97be69e7ccef8ed40d6e5bfe6582ea4cd7d577aa4569"
+ },
+ "0x2bb3295506aa5a21b58f1fd40f3b0f16d6d06bbc": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x303f57a0355c50bf1a0e1cf0fa8f9bdbc8d443b70f2ad93ac1c6b9c1d1fe29a2"
+ },
+ "0x2c0cd3c60f41d56ed7664dbce39630395614bf4b": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x92d0f0954f4ec68bd32163a2bd7bc69f933c7cdbfc6f3d2457e065f841666b1c"
+ },
+ "0x2c1287779024c3a2f0924b54816d79b7e378907d": {
+ "balance": "0",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x09d6e6745d272389182a510994e2b54d14b731fac96b9c9ef434bc1924315371"
+ },
+ "0x2c582db705c5721bb3ba59f4ec8e44fb4ef6b920": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe02ec497b66cb57679eb01de1bed2ad385a3d18130441a9d337bd14897e85d39"
+ },
+ "0x2d389075be5be9f2246ad654ce152cf05990b209": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xa9233a729f0468c9c309c48b82934c99ba1fd18447947b3bc0621adb7a5fc643"
+ },
+ "0x2d711642b726b04401627ca9fbac32f5c8530fb1": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xfe2149c5c256a5eb2578c013d33e3af6a87a514965c7ddf4a8131e2d978f09f9"
+ },
+ "0x2e350f8e7f890a9301f33edbf55f38e67e02d72b": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xf33a7b66489679fa665dbfb4e6dd4b673495f853850eedc81d5f28bd2f4bd3b5"
+ },
+ "0x2e5f413fd8d378ed081a76e1468dad8cbf6e9ed5": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe69f40f00148bf0d4dfa28b3f3f5a0297790555eca01a00e49517c6645096a6c"
+ },
+ "0x2eb6db4e06119ab31a3acf4f406ccbaa85e39c66": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xaeaf19d38b69be4fb41cc89e4888708daa6b9b1c3f519fa28fe9a0da70cd8697"
+ },
+ "0x2f01c1c8c735a9a1b89898d3f14bbf61c91bf0fd": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xd2f394b4549b085fb9b9a8b313a874ea660808a4323ab2598ee15ddd1eb7e897"
+ },
+ "0x2fb64110da9389ce8567938a78f21b79222332f9": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x415ded122ff7b6fe5862f5c443ea0375e372862b9001c5fe527d276a3a420280"
+ },
+ "0x2fc7b26c1fd501c57e57db3e876dc6ae7af6979b": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x3d20fedd270b3771706fe00a580a155439be57e8d550762def10906e83ed58bb",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000009f": "9f",
+ "0x00000000000000000000000000000000000000000000000000000000000000a0": "a0",
+ "0x00000000000000000000000000000000000000000000000000000000000000a1": "a1"
+ },
+ "key": "0xb9cddc73dfdacd009e55f27bdfd1cd37eef022ded5ce686ab0ffe890e6bf311e"
+ },
+ "0x30a5bfa58e128af9e5a4955725d8ad26d4d574a5": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe1eb1e18ae510d0066d60db5c2752e8c33604d4da24c38d2bda07c0cb6ad19e4"
+ },
+ "0x30c72b4fb390ff1d387821e210f3ab04fbe86d13": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xdf97f94bc47471870606f626fb7a0b42eed2d45fcc84dc1200ce62f7831da990",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000d6": "d6",
+ "0x00000000000000000000000000000000000000000000000000000000000000d7": "d7",
+ "0x00000000000000000000000000000000000000000000000000000000000000d8": "d8"
+ },
+ "key": "0x005e94bf632e80cde11add7d3447cd4ca93a5f2205d9874261484ae180718bd6"
+ },
+ "0x311df588ca5f412f970891e4cc3ac23648968ca2": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x974a4800ec4c0e998f581c6ee8c3972530989e97a179c6b2d40b8710c036e7b1"
+ },
+ "0x312e8fca5ac7dfc591031831bff6fede6ecf12a8": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x64bfba8a4688bdee41c4b998e101567b8b56fea53d30ab85393f2d5b70c5da90"
+ },
+ "0x32c417b98c3d9bdd37550c0070310526347b4648": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x80cd4a7b601d4ba0cb09e527a246c2b5dd25b6dbf862ac4e87c6b189bfce82d7"
+ },
+ "0x33afd8244c9c1a37f5bddb3254cd08779a196458": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x210ce6d692a21d75de3764b6c0356c63a51550ebec2c01f56c154c24b1cf8888"
+ },
+ "0x33fc6e8ad066231eb5527d1a39214c1eb390985d": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x87e33f70e1dd3c6ff68e3b71757d697fbeb20daae7a3cc8a7b1b3aa894592c50"
+ },
+ "0x360671abc40afd33ae0091e87e589fc320bf9e3d": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x12c1bb3dddf0f06f62d70ed5b7f7db7d89b591b3f23a838062631c4809c37196"
+ },
+ "0x3632d1763078069ca77b90e27061147a3b17ddc3": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x0463e52cda557221b0b66bd7285b043071df4c2ab146260f4e010970f3a0cccf"
+ },
+ "0x368b766f1e4d7bf437d2a709577a5210a99002b6": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x4845aac9f26fcd628b39b83d1ccb5c554450b9666b66f83aa93a1523f4db0ab6"
+ },
+ "0x36a9e7f1c95b82ffb99743e0c5c4ce95d83c9a43": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xcac96145454c46255fccca35343d9505164dabe319c17d81fda93cf1171e4c6e"
+ },
+ "0x38d0bd409abe8d78f9f0e0a03671e44e81c41c27": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x23a888c0a464ce461651fc1be2cfa0cb6ba4d1b125abe5b447eeadf9c5adf1f1",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000167": "0167",
+ "0x0000000000000000000000000000000000000000000000000000000000000168": "0168",
+ "0x0000000000000000000000000000000000000000000000000000000000000169": "0169"
+ },
+ "key": "0xb58e67c536550fdf7140c8333ca62128df469a7270b16d528bc778909e0ac9a5"
+ },
+ "0x3ae75c08b4c907eb63a8960c45b86e1e9ab6123c": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x878040f46b1b4a065e6b82abd35421eb69eededc0c9598b82e3587ae47c8a651"
+ },
+ "0x3bcc2d6d48ffeade5ac5af3ee7acd7875082e50a": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xb5bca5e9ccef948c2431372315acc3b96e098d0e962b0c99d634a0475b670dc3"
+ },
+ "0x3c204ccddfebae334988367b5cf372387dc49ebd": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xc7bf2b34294065afb9a2c15f906cba1f7a1a9f0da34ea9c46603b52cae9028ec",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000194": "0194",
+ "0x0000000000000000000000000000000000000000000000000000000000000195": "0195",
+ "0x0000000000000000000000000000000000000000000000000000000000000196": "0196"
+ },
+ "key": "0x5ec55391e89ac4c3cf9e61801cd13609e8757ab6ed08687237b789f666ea781b"
+ },
+ "0x3c2572436de9a5f3c450071e391c8a9410ba517d": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xbfba1bc2ac42655f5a97450be62b9430822232f1ce4998eaf5239b0c243b2b84",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000090": "90",
+ "0x0000000000000000000000000000000000000000000000000000000000000091": "91",
+ "0x0000000000000000000000000000000000000000000000000000000000000092": "92"
+ },
+ "key": "0x606059a65065e5f41347f38754e6ddb99b2d709fbff259343d399a4f9832b48f"
+ },
+ "0x3c5c4713708c72b519144ba8e595a8865505000d": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x52d6d2913ae44bca11b5a116021db97c91a13e385ed48ba06628e74201231dba",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000001c1": "01c1",
+ "0x00000000000000000000000000000000000000000000000000000000000001c2": "01c2",
+ "0x00000000000000000000000000000000000000000000000000000000000001c3": "01c3"
+ },
+ "key": "0x37ddfcbcb4b2498578f90e0fcfef9965dcde4d4dfabe2f2836d2257faa169947"
+ },
+ "0x3cf2e7052ebd484a8d6fbca579ddb3cf920de9d3": {
+ "balance": "0",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xa95c88d7dc0f2373287c3b2407ba8e7419063833c424b06d8bb3b29181bb632e"
+ },
+ "0x3ee253436fc50e5a136ee01489a318afe2bbd572": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xc57604a461c94ecdac12dbb706a52b32913d72253baffb8906e742724ae12449",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000001b2": "01b2",
+ "0x00000000000000000000000000000000000000000000000000000000000001b3": "01b3",
+ "0x00000000000000000000000000000000000000000000000000000000000001b4": "01b4"
+ },
+ "key": "0xaf7c37d08a73483eff9ef5054477fb5d836a184aa07c3edb4409b9eb22dd56ca"
+ },
+ "0x3f31becc97226d3c17bf574dd86f39735fe0f0c1": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xb40cc623b26a22203675787ca05b3be2c2af34b6b565bab95d43e7057e458684"
+ },
+ "0x3f79bb7b435b05321651daefd374cdc681dc06fa": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x8c7bfaa19ea367dec5272872114c46802724a27d9b67ea3eed85431df664664e"
+ },
+ "0x3fba9ae304c21d19f50c23db133073f4f9665fc1": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x0b564e4a0203cbcec8301709a7449e2e7371910778df64c89f48507390f2d129"
+ },
+ "0x402f57de890877def439a753fcc0c37ac7808ef5": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x5c20f6ee05edbb60beeab752d87412b2f6e12c8feefa2079e6bd989f814ed4da"
+ },
+ "0x40b7ab67fb92dbcb4ff4e39e1155cad2fa066523": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xd352b05571154d9a2061143fe6df190a740a2d321c59eb94a54acb7f3054e489"
+ },
+ "0x414a21e525a759e3ffeb22556be6348a92d5a13e": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x15293aec87177f6c88f58bc51274ba75f1331f5cb94f0c973b1deab8b3524dfe"
+ },
+ "0x417fe11f58b6a2d089826b60722fbed1d2db96dd": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xd5e252ab2fba10107258010f154445cf7dffc42b7d8c5476de9a7adb533d73f1"
+ },
+ "0x41b45640640c98c953feef23468e0d275515f82f": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x82b326641825378faa11c641c916f2e22c01080f487de0463e30d5e32b960f97",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000013a": "013a",
+ "0x000000000000000000000000000000000000000000000000000000000000013b": "013b",
+ "0x000000000000000000000000000000000000000000000000000000000000013c": "013c"
+ },
+ "key": "0xc2406cbd93e511ef493ac81ebe2b6a3fbecd05a3ba52d82a23a88eeb9d8604f0"
+ },
+ "0x426fcdc383c8becb38926ec0569ec4a810105fab": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x6bd9fb206b22c76b4f9630248940855b842c684db89adff0eb9371846ea625a9"
+ },
+ "0x4340ee1b812acb40a1eb561c019c327b243b92df": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xa13bfef92e05edee891599aa5e447ff2baa1708d9a6473a04ef66ab94f2a11e4"
+ },
+ "0x44bd7ae60f478fae1061e11a7739f4b94d1daf91": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xb66092bc3624d84ff94ee42b097e846baf6142197d2c31245734d56a275c8eb9"
+ },
+ "0x452705f08c621987b14d5f729ca81829041f6373": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xac7183ebb421005a660509b070d3d47fc4e134cb7379c31dc35dc03ebd02e1cf"
+ },
+ "0x45dcb3e20af2d8ba583d774404ee8fedcd97672b": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x465311df0bf146d43750ed7d11b0451b5f6d5bfc69b8a216ef2f1c79c93cd848"
+ },
+ "0x45f83d17e10b34fca01eb8f4454dac34a777d940": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x6dc09fdec00aa9a30dd8db984406a33e3ca15e35222a74773071207a5e56d2c2"
+ },
+ "0x469542b3ece7ae501372a11c673d7627294a85ca": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x6dbe5551f50400859d14228606bf221beff07238bfa3866454304abb572f9512"
+ },
+ "0x469dacecdef1d68cb354c4a5c015df7cb6d655bf": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x8b76305d3f00d33f77bd41496b4144fd3d113a2ec032983bd5830a8b73f61cf0"
+ },
+ "0x46b61db0aac95a332cecadad86e52531e578cf1f": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x5677600b2af87d21fdab2ac8ed39bd1be2f790c04600de0400c1989040d9879c"
+ },
+ "0x478508483cbb05defd7dcdac355dadf06282a6f2": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x5fc13d7452287b5a8e3c3be9e4f9057b5c2dd82aeaff4ed892c96fc944ec31e7"
+ },
+ "0x47ce7195b6d53aaa737ff17d57db20d0d4874ef1": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x3d0e2ba537f35941068709450f25fee45aaf4dc6ae2ed22ad12e0743ac7c54a7",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000108": "0108",
+ "0x0000000000000000000000000000000000000000000000000000000000000109": "0109",
+ "0x000000000000000000000000000000000000000000000000000000000000010a": "010a"
+ },
+ "key": "0x0579e46a5ed8a88504ac7d579b12eb346fbe4fd7e281bdd226b891f8abed4789"
+ },
+ "0x47dc540c94ceb704a23875c11273e16bb0b8a87a": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x025f478d53bf78add6fa3708d9e061d59bfe14b21329b2a4cf1156d4f81b3d2d"
+ },
+ "0x47e642c9a2f80499964cfda089e0b1f52ed0f57d": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x05f6de281d8c2b5d98e8e01cd529bd76416b248caf11e0552047c5f1d516aab6"
+ },
+ "0x4816ce9dd68c07ab1e12b5ddc4dbef38792751c5": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x93843d6fa1fe5709a3035573f61cc06832f0377544d16d3a0725e78a0fa0267c"
+ },
+ "0x48701721ec0115f04bc7404058f6c0f386946e09": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x12be3bf1f9b1dab5f908ca964115bee3bcff5371f84ede45bc60591b21117c51"
+ },
+ "0x494d799e953876ac6022c3f7da5e0f3c04b549be": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x04d9aa4f67f8b24d70a0ffd757e82456d9184113106b7d9e8eb6c3e8a8df27ee"
+ },
+ "0x4a0f1452281bcec5bd90c3dce6162a5995bfe9df": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x5c1d92594d6377fe6423257781b382f94dffcde4fadbf571aa328f6eb18f8fcd"
+ },
+ "0x4a64a107f0cb32536e5bce6c98c393db21cca7f4": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xf16522fc36907ee1e9948240b0c1d1d105a75cc63b71006f16c20d79ad469bd7"
+ },
+ "0x4ae81572f06e1b88fd5ced7a1a000945432e83e1": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x2116ab29b4cb8547af547fe472b7ce30713f234ed49cb1801ea6d3cf9c796d57"
+ },
+ "0x4b227777d4dd1fc61c6f884f48641d02b4d121d3": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x246cc8a2b79a30ec71390d829d0cb37cce1b953e89cb14deae4945526714a71c"
+ },
+ "0x4ba91e785d2361ddb198bcd71d6038305021a9b8": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x99ce1680f73f2adfa8e6bed135baa3360e3d17f185521918f9341fc236526321"
+ },
+ "0x4bfa260a661d68110a7a0a45264d2d43af9727de": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x6f358b4e903d31fdd5c05cddaa174296bb30b6b2f72f1ff6410e6c1069198989"
+ },
+ "0x4dde844b71bcdf95512fb4dc94e84fb67b512ed8": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x5602444769b5fd1ddfca48e3c38f2ecad326fe2433f22b90f6566a38496bd426"
+ },
+ "0x4f362f9093bb8e7012f466224ff1237c0746d8c8": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xcb6f450b4720c6b36d3a12271e35ace27f1d527d46b073771541ad39cc59398d"
+ },
+ "0x4f3e7da249f34e3cc8b261a7dc5b2d8e1cd85b78": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x4d79fea6c7fef10cb0b5a8b3d85b66836a131bec0b04d891864e6fdb9794af75"
+ },
+ "0x4fb733bedb74fec8d65bedf056b935189a289e92": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xa02abeb418f26179beafd96457bda8c690c6b1f3fbabac392d0920863edddbc6"
+ },
+ "0x4fffb6fbd0372228cb5e4d1f033a29f30cb668c8": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xcd3e75299e967d5f88d306be905a134343b224d3fd5a861b1a690de0e2dfe1ba",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000b3": "b3",
+ "0x00000000000000000000000000000000000000000000000000000000000000b4": "b4",
+ "0x00000000000000000000000000000000000000000000000000000000000000b5": "b5"
+ },
+ "key": "0xf19ee923ed66b7b9264c2644aa20e5268a251b4914ca81b1dffee96ecb074cb1"
+ },
+ "0x50996999ff63a9a1a07da880af8f8c745a7fe72c": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x0e57ffa6cc6cbd96c1400150417dd9b30d958c58f63c36230a90a02b076f78b5"
+ },
+ "0x5123198d8a827fe0c788c409e7d2068afde64339": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xa15773c9bfabef49e9825460ed95bf67b22b67d7806c840e0eb546d73c424768"
+ },
+ "0x526e1ff4cddb5033849a114c54eb71a176f6440c": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x834718111121e2058fdb90a51f448028071857e11fbd55d43256174df56af01a",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000c7": "c7",
+ "0x00000000000000000000000000000000000000000000000000000000000000c8": "c8",
+ "0x00000000000000000000000000000000000000000000000000000000000000c9": "c9"
+ },
+ "key": "0xb3a33a7f35ca5d08552516f58e9f76219716f9930a3a11ce9ae5db3e7a81445d"
+ },
+ "0x5371ac01baa0b8aa9cbfcd36a49e0b5f7fb7109d": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x385b84d27059a3c78e7ea63a691eeb9c5376f77af11336762f8c18882ff7471a",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000028": "28",
+ "0x0000000000000000000000000000000000000000000000000000000000000029": "29",
+ "0x000000000000000000000000000000000000000000000000000000000000002a": "2a"
+ },
+ "key": "0x7a08bb8417e6b18da3ba926568f1022c15553b2b0f1a32f2fd9e5a605469e54f"
+ },
+ "0x54314225e5efd5b8283d6ec2f7a03d5a92106374": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xcade985c7fb6d371d0c7f7cb40178e7873d623eadcc37545798ec33a04bb2173"
+ },
+ "0x549abf1ae8db6de0d131a7b2b094c813ec1c6731": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x73bffc68a947fa19b7becd45661d22c870fac8dbf2b25703e1bdab5367f29543",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000086": "86",
+ "0x0000000000000000000000000000000000000000000000000000000000000087": "87",
+ "0x0000000000000000000000000000000000000000000000000000000000000088": "88"
+ },
+ "key": "0x910fb8b22867289cb57531ad39070ef8dbdbbe7aee941886a0e9f572b63ae9ee"
+ },
+ "0x5502b2da1a3a08ad258aa08c0c6e0312cf047e64": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xf73591e791af4c7c5fa039c33dd9d169cab14b1d9b0ca78bcc4e740d553b1acf",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000f4": "f4",
+ "0x00000000000000000000000000000000000000000000000000000000000000f5": "f5",
+ "0x00000000000000000000000000000000000000000000000000000000000000f6": "f6"
+ },
+ "key": "0x1d6ee979097e29141ad6b97ae19bb592420652b7000003c55eb52d5225c3307d"
+ },
+ "0x553f68e60e9f8ea74c831449525dc1bc4f6fc58e": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x14f9f4b9445c7547d5a4671a38b0b12bbc0e7198c3b2934b82b695c8630d4972",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000126": "0126",
+ "0x0000000000000000000000000000000000000000000000000000000000000127": "0127",
+ "0x0000000000000000000000000000000000000000000000000000000000000128": "0128"
+ },
+ "key": "0x6ad3ba011e031431dc057c808b85346d58001b85b32a4b5c90ccccea0f82e170"
+ },
+ "0x56270eccd88bcd5ad8d2b08f82d96cd8dace4eb3": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xb0700fe13dbaf94be50bcbec13a7b53e6cba034b29a3daba98fa861f5897213f",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000063": "63",
+ "0x0000000000000000000000000000000000000000000000000000000000000064": "64",
+ "0x0000000000000000000000000000000000000000000000000000000000000065": "65"
+ },
+ "key": "0xcd6b3739d4dbce17dafc156790f2a3936eb75ce95e9bba039dd76661f40ea309"
+ },
+ "0x56d3f289b889e65c4268a1b56b3da2d3860d0afb": {
+ "balance": "0",
+ "nonce": 0,
+ "root": "0x207f6c3e450546b0d1f3bc6a6faf5bfa0bff80396c55d567b834cf0e7c760347",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000000a": "0a",
+ "0x000000000000000000000000000000000000000000000000000000000000000b": "0b",
+ "0x000000000000000000000000000000000000000000000000000000000000000c": "0c"
+ },
+ "key": "0xdc9ea08bdea052acab7c990edbb85551f2af3e1f1a236356ab345ac5bcc84562"
+ },
+ "0x56dc3a6c5ca1e1b773e5fdfc8a92e9a42feaa6e9": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xdbd66b6a89e01c76ae5f8cb0dcd8a24e787f58f015c9b08972bfabefa2eae0d5"
+ },
+ "0x579ab019e6b461188300c7fb202448d34669e5ff": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x18f4256a59e1b2e01e96ac465e1d14a45d789ce49728f42082289fc25cf32b8d"
+ },
+ "0x5820871100e656b0d84b950f0a557e37419bf17d": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x4615e5f5df5b25349a00ad313c6cd0436b6c08ee5826e33a018661997f85ebaa"
+ },
+ "0x58d77a134c11f45f9573d5c105fa6c8ae9b4237a": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xd9f987fec216556304eba05bcdae47bb736eea5a4183eb3e2c3a5045734ae8c7"
+ },
+ "0x591317752b32e45c9d44d925a4bcb4898f6b51fb": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x89bde89df7f2d83344a503944bb347b847f208df837228bb2cdfd6c3228ca3df",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000011c": "011c",
+ "0x000000000000000000000000000000000000000000000000000000000000011d": "011d",
+ "0x000000000000000000000000000000000000000000000000000000000000011e": "011e"
+ },
+ "key": "0x88a5635dabc83e4e021167be484b62cbed0ecdaa9ac282dab2cd9405e97ed602"
+ },
+ "0x5a6e7a4754af8e7f47fc9493040d853e7b01e39d": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x3e57e37bc3f588c244ffe4da1f48a360fa540b77c92f0c76919ec4ee22b63599"
+ },
+ "0x5b35d3e1ac7a2c61d247046d38773decf4f2839a": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x55cab9586acb40e66f66147ff3a059cfcbbad785dddd5c0cc31cb43edf98a5d5"
+ },
+ "0x5c019738b38feae2a8944bd644f7acd5e6f40e5c": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xea83389383152270104093ed5dfe34ba403c75308133aa1be8f51ad804b3e9ee",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000103": "0103",
+ "0x0000000000000000000000000000000000000000000000000000000000000104": "0104",
+ "0x0000000000000000000000000000000000000000000000000000000000000105": "0105"
+ },
+ "key": "0xbccd85b63dba6300f84c561c5f52ce08a240564421e382e6f550ce0c12f2f632"
+ },
+ "0x5c04401b6f6a5e318c7b6f3106a6217d20008427": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x6c37093a34016ae687da7aabb18e42009b71edff70a94733c904aea51a4853c1"
+ },
+ "0x5c23d95614dce3317e7be72de3c81479c3172a8a": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x4f446329b5ee3d13d4f6b5e5f210ddc2d90fedba384b950e36a1d19af95c5cb1",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000000f": "0f",
+ "0x0000000000000000000000000000000000000000000000000000000000000010": "10",
+ "0x0000000000000000000000000000000000000000000000000000000000000011": "11"
+ },
+ "key": "0x34a715e08b77afd68cde30b62e222542f3db90758370400c94d0563959a1d1a0"
+ },
+ "0x5c62e091b8c0565f1bafad0dad5934276143ae2c": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x1bf7626cec5330a127e439e68e6ee1a1537e73b2de1aa6d6f7e06bc0f1e9d763"
+ },
+ "0x5d6bc8f87dd221a9f8c4144a256391979ff6426b": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xcc74930e1ee0e71a8081f247ec47442a3e5d00897966754a5b3ee8beb2c1160c"
+ },
+ "0x5df7504bc193ee4c3deadede1459eccca172e87c": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x4f458f480644b18c0e8207f405b82da7f75c7b3b5a34fe6771a0ecf644677f33"
+ },
+ "0x5ee0dd4d4840229fab4a86438efbcaf1b9571af9": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x3848b7da914222540b71e398081d04e3849d2ee0d328168a3cc173a1cd4e783b"
+ },
+ "0x5f4755a4bd689dc90425fb2fdb64a4b191a7264d": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xaf867e6cbae810caa924b8b6ac3d8c0891831491a6906dd0be7ad324dcd1533d",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000016c": "016c",
+ "0x000000000000000000000000000000000000000000000000000000000000016d": "016d",
+ "0x000000000000000000000000000000000000000000000000000000000000016e": "016e"
+ },
+ "key": "0x1c3f74249a4892081ba0634a819aec9ed25f34c7653f5719b9098487e65ab595"
+ },
+ "0x5f552da00dfb4d3749d9e62dcee3c918855a86a0": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xd52564daf6d32a6ae29470732726859261f5a7409b4858101bd233ed5cc2f662"
+ },
+ "0x5f553e0d115af809cfc1396b4823378b2c7cced5": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xcc48f8d1c0dd6ec8ab7bbd792d94f6a74c8876b41bc859cee2228e8dad8207a4",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000ae": "ae",
+ "0x00000000000000000000000000000000000000000000000000000000000000af": "af",
+ "0x00000000000000000000000000000000000000000000000000000000000000b0": "b0"
+ },
+ "key": "0xe3c2e12be28e2e36dc852e76dd32e091954f99f2a6480853cd7b9e01ec6cd889"
+ },
+ "0x6096d8459f8e424f514468098e6a0f2a871c815d": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xa20e6a21244af8ffccd5442297ad9b7a76ac72d7d8ac9e16f12fcc50e90b734e",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000018f": "018f",
+ "0x0000000000000000000000000000000000000000000000000000000000000190": "0190",
+ "0x0000000000000000000000000000000000000000000000000000000000000191": "0191"
+ },
+ "key": "0x67cc0bf5341efbb7c8e1bdbf83d812b72170e6edec0263eeebdea6f107bbef0d"
+ },
+ "0x60d0debc5c81432ee294b9a06dcf58964224bbc2": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x5446b818f4c669669cd3314726ff134cf18c58a9a536df13c700610705a8b7c8",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000041": "41",
+ "0x0000000000000000000000000000000000000000000000000000000000000042": "42",
+ "0x0000000000000000000000000000000000000000000000000000000000000043": "43"
+ },
+ "key": "0x395b92f75f8e06b5378a84ba03379f025d785d8b626b2b6a1c84b718244b9a91"
+ },
+ "0x61774970e93c00a3e206a26c64707d3e33f89972": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x869acb929f591c54cb85842a51f296635e7d895798c547a293afe43e7bf7f417",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000006d": "6d",
+ "0x000000000000000000000000000000000000000000000000000000000000006e": "6e",
+ "0x000000000000000000000000000000000000000000000000000000000000006f": "6f"
+ },
+ "key": "0x07b49045c401bcc408f983d91a199c908cdf0d646049b5b83629a70b0117e295"
+ },
+ "0x6269e930eee66e89863db1ff8e4744d65e1fb6bf": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x419809ad1512ed1ab3fb570f98ceb2f1d1b5dea39578583cd2b03e9378bbe418"
+ },
+ "0x62b67e1f685b7fef51102005dddd27774be3fee3": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xf462aaa112b195c148974ff796a81c0e7f9a972d04e60c178ac109102d593a88"
+ },
+ "0x6325c46e45d96f775754b39a17d733c4920d0038": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x7c463797c90e9ba42b45ae061ffaa6bbd0dad48bb4998f761e81859f2a904a49"
+ },
+ "0x63eb2d6ec7c526fd386631f71824bad098f39813": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xfdaf2549ea901a469b3e91cd1c4290fab376ef687547046751e10b7b461ff297"
+ },
+ "0x6510225e743d73828aa4f73a3133818490bd8820": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe6d72f72fd2fc8af227f75ab3ab199f12dfb939bdcff5f0acdac06a90084def8"
+ },
+ "0x653b3bb3e18ef84d5b1e8ff9884aecf1950c7a1c": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xc2c26fbc0b7893d872fa528d6c235caab9164feb5b54c48381ff3d82c8244e77"
+ },
+ "0x654aa64f5fbefb84c270ec74211b81ca8c44a72e": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x00aa781aff39a8284ef43790e3a511b2caa50803613c5096bc782e8de08fa4c5"
+ },
+ "0x65c74c15a686187bb6bbf9958f494fc6b8006803": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x570210539713235b442bbbad50c58bee81b70efd2dad78f99e41a6c462faeb43"
+ },
+ "0x662fb906c0fb671022f9914d6bba12250ea6adfb": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xb58e22a9ece8f9b3fdbaa7d17fe5fc92345df11d6863db4159647d64a34ff10b"
+ },
+ "0x66378d2edcc2176820e951f080dd6e9e15a0e695": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xa02c8b02efb52fad3056fc96029467937c38c96d922250f6d2c0f77b923c85aa"
+ },
+ "0x670dc376ecca46823e13bab90acab2004fb1706c": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xae440143d21e24a931b6756f6b3d50d337eaf0db3e6c34e36ab46fe2d99ef83e",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000199": "0199",
+ "0x000000000000000000000000000000000000000000000000000000000000019a": "019a",
+ "0x000000000000000000000000000000000000000000000000000000000000019b": "019b"
+ },
+ "key": "0xdcda5b5203c2257997a574bdf85b2bea6d04829e8d7e048a709badc0fb99288c"
+ },
+ "0x6741149452787eb4384ebbd8456643f246217034": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x37e51740ad994839549a56ef8606d71ace79adc5f55c988958d1c450eea5ac2d"
+ },
+ "0x684888c0ebb17f374298b65ee2807526c066094c": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xb062c716d86a832649bccd53e9b11c77fc8a2a00ef0cc0dd2f561688a69d54f7"
+ },
+ "0x6922e93e3827642ce4b883c756b31abf80036649": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x3be526914a7d688e00adca06a0c47c580cb7aa934115ca26006a1ed5455dd2ce"
+ },
+ "0x6a632187a3abf9bebb66d43368fccd612f631cbc": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x9de451c4f48bdb56c6df198ff8e1f5e349a84a4dc11de924707718e6ac897aa6"
+ },
+ "0x6b23c0d5f35d1b11f9b683f0b0a617355deb1127": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x099d5081762b8b265e8ba4cd8e43f08be4715d903a0b1d96b3d9c4e811cbfb33"
+ },
+ "0x6b2884fef44bd4288621a2cda9f88ca07b480861": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe6c5edf6a0fbdcff100e5ceafb63cba9aea355ba397a93fdb42a1a67b91375f8"
+ },
+ "0x6c49c19c40a44bbf1cf9d2d8741ec1126e815fc6": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xe00c49a65849d05cbf27a4d7788a68bc7b6013ae33411d40bc89282fc064f33d",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000001ad": "01ad",
+ "0x00000000000000000000000000000000000000000000000000000000000001ae": "01ae",
+ "0x00000000000000000000000000000000000000000000000000000000000001af": "01af"
+ },
+ "key": "0x0304d8eaccf0b942c468074250cbcb625ec5c4688b6b5d17d2a9bdd8dd565d5a"
+ },
+ "0x6ca60a92cbf88c7f527978dc183a22e774755551": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x52d034ca6ebd21c7ba62a2ad3b6359aa4a1cdc88bdaa64bb2271d898777293ab"
+ },
+ "0x6cc0ab95752bf25ec58c91b1d603c5eb41b8fbd7": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xaa0ac2f707a3dc131374839d4ee969eeb1cb55adea878f56e7b5b83d187d925c"
+ },
+ "0x6d09a879576c0d941bea7833fb2285051b10d511": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xaa0ffaa57269b865dccce764bf412de1dff3e7bba22ce319ef09e5907317b3e7"
+ },
+ "0x6d8b8f27857e10b21c0ff227110d7533cea03d0e": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xd3d9839f87c29fb007fd9928d38bbf84ef089f0cd640c838f4a42631e828c667",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000117": "0117",
+ "0x0000000000000000000000000000000000000000000000000000000000000118": "0118",
+ "0x0000000000000000000000000000000000000000000000000000000000000119": "0119"
+ },
+ "key": "0xfdbb8ddca8cecfe275da1ea1c36e494536f581d64ddf0c4f2e6dae9c7d891427"
+ },
+ "0x6e09a59a69b41abca97268b05595c074ad157872": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x7a3870cc1ed4fc29e9ab4dd3218dbb239dd32c9bf05bff03e325b7ba68486c47"
+ },
+ "0x6e3d512a9328fa42c7ca1e20064071f88958ed93": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xc1a6a0bf60ee7b3228ecf6cb7c9e5491fbf62642a3650d73314e976d9eb9a966"
+ },
+ "0x6e3faf1e27d45fca70234ae8f6f0a734622cff8a": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x97f72ff641eb40ee1f1163544931635acb7550a0d44bfb9f4cc3aeae829b6d7d"
+ },
+ "0x6f80f6a318ea88bf0115d693f564139a5fb488f6": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe73b3367629c8cb991f244ac073c0863ad1d8d88c2e180dd582cefda2de4415e"
+ },
+ "0x7021bf21ecdbefcb33d09e4b812a47b273aa1d5c": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xb9400acf38453fd206bc18f67ba04f55b807b20e4efc2157909d91d3a9f7bed2"
+ },
+ "0x706be462488699e89b722822dcec9822ad7d05a7": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x78948842ff476b87544c189ce744d4d924ffd0907107a0dbaa4b71d0514f2225"
+ },
+ "0x717f8aa2b982bee0e29f573d31df288663e1ce16": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xc3c8e2dc64e67baa83b844263fe31bfe24de17bb72bfed790ab345b97b007816"
+ },
+ "0x7212449475dcc75d408ad62a9acc121d94288f6d": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe333845edc60ed469a894c43ed8c06ec807dafd079b3c948077da56e18436290"
+ },
+ "0x72dfcfb0c470ac255cde83fb8fe38de8a128188e": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x2fe5767f605b7b821675b223a22e4e5055154f75e7f3041fdffaa02e4787fab8"
+ },
+ "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f": {
+ "balance": "999999999999999999999518871495454239",
+ "nonce": 402,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x4363d332a0d4df8582a84932729892387c623fe1ec42e2cfcbe85c183ed98e0e"
+ },
+ "0x75b9236dfe7d0e12eb21b6d175276a7c5d4e851d": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xc54ffffcbaa5b566a7cf37386c4ce5a338d558612343caaa99788343d516aa5f"
+ },
+ "0x77adfc95029e73b173f60e556f915b0cd8850848": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x0993fd5b750fe4414f93c7880b89744abb96f7af1171ed5f47026bdf01df1874"
+ },
+ "0x788adf954fc28a524008ea1f2d0e87ae8893afdc": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x903f24b3d3d45bc50c082b2e71c7339c7060f633f868db2065ef611885abe37e"
+ },
+ "0x7a19252e8c9b457eb07f52d0ddbe16820b5b7830": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xab7bdc41a80ae9c8fcb9426ba716d8d47e523f94ffb4b9823512d259c9eca8cd"
+ },
+ "0x7ace431cb61584cb9b8dc7ec08cf38ac0a2d6496": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x71dee9adfef0940a36336903bd6830964865180b98c0506f9bf7ba8f2740fbf9"
+ },
+ "0x7c5bd2d144fdde498406edcb9fe60ce65b0dfa5f": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xfcc08928955d4e5e17e17e46d5adbb8011e0a8a74cabbdd3e138c367e89a4428"
+ },
+ "0x7cb7c4547cf2653590d7a9ace60cc623d25148ad": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x55d0609468d8d4147a942e88cfc5f667daff850788d821889fbb03298924767c"
+ },
+ "0x7d80ad47bf8699f49853640b12ee55b1f51691f1": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x65cf42efacdee07ed87a1c2de0752a4e3b959f33f9f9f8c77424ba759e01fcf2"
+ },
+ "0x7da59d0dfbe21f43e842e8afb43e12a6445bbac0": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x7c3e44534b1398abc786e4591364c329e976dbde3b3ed3a4d55589de84bcb9a6"
+ },
+ "0x7dcef881c305fb208500cc9509db689047ed0967": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x6d2b8a074c78a0e5a8095d7a010d4961c639c541cf56fbb7049480cc8f199765",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000001bc": "01bc",
+ "0x00000000000000000000000000000000000000000000000000000000000001bd": "01bd",
+ "0x00000000000000000000000000000000000000000000000000000000000001be": "01be"
+ },
+ "key": "0x68fc814efedf52ac8032da358ddcb61eab4138cb56b536884b86e229c995689c"
+ },
+ "0x7f2dce06acdeea2633ff324e5cb502ee2a42d979": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe04fdefc4f2eefd22721d5944411b282d0fcb1f9ac218f54793a35bca8199c25"
+ },
+ "0x7f774bb46e7e342a2d9d0514b27cee622012f741": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x720f25b62fc39426f70eb219c9dd481c1621821c8c0fa5367a1df6e59e3edf59"
+ },
+ "0x7fd02a3bb5d5926d4981efbf63b66de2a7b1aa63": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x7bf542bdaff5bfe3d33c26a88777773b5e525461093c36acb0dab591a319e509",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000032": "32",
+ "0x0000000000000000000000000000000000000000000000000000000000000033": "33",
+ "0x0000000000000000000000000000000000000000000000000000000000000034": "34"
+ },
+ "key": "0xfc3d2e27841c0913d10aa11fc4af4793bf376efe3d90ce8360aa392d0ecefa24"
+ },
+ "0x8074971c7d405ba1e70af34f5af7d564ddc495df": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x60fc69100d8e632667c80b94d434008823ed75416b71cbd112b4d0b02f563027",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000a4": "a4",
+ "0x00000000000000000000000000000000000000000000000000000000000000a5": "a5",
+ "0x00000000000000000000000000000000000000000000000000000000000000a6": "a6"
+ },
+ "key": "0x0e0e4646090b881949ec9991e48dec768ccd1980896aefd0d51fd56fd5689790"
+ },
+ "0x8120ff763f8283e574fc767702056b57fcc89003": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xa2e7084ba9cec179519c7e8950c66ad3cba8586a60cff9f4d60c188dd621522a",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000037": "37",
+ "0x0000000000000000000000000000000000000000000000000000000000000038": "38",
+ "0x0000000000000000000000000000000000000000000000000000000000000039": "39"
+ },
+ "key": "0x48e291f8a256ab15da8401c8cae555d5417a992dff3848926fa5b71655740059"
+ },
+ "0x8176caac8654abc74a905b137a37ecf7be2a9e95": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xc4bab059ee8f7b36c82ada44d22129671d8f47f254ca6a48fded94a8ff591c88"
+ },
+ "0x81bda6e29da8c3e4806b64dfa1cd32cd9c8fa70e": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xd5e5e7be8a61bb5bfa271dfc265aa9744dea85de957b6cffff0ecb403f9697db"
+ },
+ "0x828a91cb304a669deff703bb8506a19eba28e250": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x936ac6251848da69a191cc91174e4b7583a12a43d896e243841ea98b65f264ad",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000017b": "017b",
+ "0x000000000000000000000000000000000000000000000000000000000000017c": "017c",
+ "0x000000000000000000000000000000000000000000000000000000000000017d": "017d"
+ },
+ "key": "0xea810ea64a420acfa917346a4a02580a50483890cba1d8d1d158d11f1c59ed02"
+ },
+ "0x82c291ed50c5f02d7e15e655c6353c9278e1bbec": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x12de4544640fc8a027e1a912d776b90675bebfd50710c2876b2a24ec9eced367",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000cc": "cc",
+ "0x00000000000000000000000000000000000000000000000000000000000000cd": "cd",
+ "0x00000000000000000000000000000000000000000000000000000000000000ce": "ce"
+ },
+ "key": "0xa9970b3744a0e46b248aaf080a001441d24175b5534ad80755661d271b976d67"
+ },
+ "0x83c7e323d189f18725ac510004fdc2941f8c4a78": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xb17ea61d092bd5d77edd9d5214e9483607689cdcc35a30f7ea49071b3be88c64"
+ },
+ "0x847f88846c35337cbf57e37ffc18316a99ac2f14": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x310a2ac83d7e3e4d333102b1f7153bb0416b38427eb2e335dc6632d779a8b4af",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000bd": "bd",
+ "0x00000000000000000000000000000000000000000000000000000000000000be": "be",
+ "0x00000000000000000000000000000000000000000000000000000000000000bf": "bf"
+ },
+ "key": "0xbea55c1dc9f4a9fb50cbedc70448a4e162792b9502bb28b936c7e0a2fd7fe41d"
+ },
+ "0x84873854dba02cf6a765a6277a311301b2656a7f": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x3197690074092fe51694bdb96aaab9ae94dac87f129785e498ab171a363d3b40"
+ },
+ "0x84e75c28348fb86acea1a93a39426d7d60f4cc46": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x5162f18d40405c59ef279ad71d87fbec2bbfedc57139d56986fbf47daf8bcbf2"
+ },
+ "0x85f97e04d754c81dac21f0ce857adc81170d08c6": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x2baa718b760c0cbd0ec40a3c6df7f2948b40ba096e6e4b116b636f0cca023bde"
+ },
+ "0x8642821710100a9a3ab10cd4223278a713318096": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x4fbc5fc8df4f0a578c3be3549f1cb3ef135cbcdf75f620c7a1d412462e9b3b94"
+ },
+ "0x8749e96779cd1b9fa62b2a19870d9efc28acae09": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xa3d8baf7ae7c96b1020753d12154e28cc7206402037c28c49c332a08cf7c4b51"
+ },
+ "0x87610688d55c08238eacf52864b5a5920a00b764": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x2da86eb3d4ffdd895170bc7ef02b69a116fe21ac2ce45a3ed8e0bb8af17cf92b",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000fe": "fe",
+ "0x00000000000000000000000000000000000000000000000000000000000000ff": "ff",
+ "0x0000000000000000000000000000000000000000000000000000000000000100": "0100"
+ },
+ "key": "0x80a2c1f38f8e2721079a0de39f187adedcb81b2ab5ae718ec1b8d64e4aa6930e"
+ },
+ "0x878dedd9474cfa24d91bccc8b771e180cf01ac40": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x7e1ef9f8d2fa6d4f8e6717c3dcccff352ea9b8b46b57f6106cdbeed109441799"
+ },
+ "0x882e7e5d12617c267a72948e716f231fa79e6d51": {
+ "balance": "0",
+ "nonce": 0,
+ "root": "0x491b2cfba976b2e78bd9be3bc15c9964927205fc34c9954a4d61bbe8170ba533",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000005": "05",
+ "0x0000000000000000000000000000000000000000000000000000000000000006": "06",
+ "0x0000000000000000000000000000000000000000000000000000000000000007": "07"
+ },
+ "key": "0xd2501ae11a14bf0c2283a24b7e77c846c00a63e71908c6a5e1caff201bad0762"
+ },
+ "0x88654f0e7be1751967bba901ed70257a3cb79940": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x30ce5b7591126d5464dfb4fc576a970b1368475ce097e244132b06d8cc8ccffe"
+ },
+ "0x892f60b39450a0e770f00a836761c8e964fd7467": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x74614a0c4ba7d7c70b162dad186b6cc77984ab4070534ad9757e04a5b776dcc8"
+ },
+ "0x8a5edab282632443219e051e4ade2d1d5bbc671c": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xc251a3acb75a90ff0cdca31da1408a27ef7dcaa42f18e648f2be1a28b35eac32"
+ },
+ "0x8a817bc42b2e2146dc4ca4dc686db0a4051d2944": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x17984cc4b4aac0492699d37662b53ec2acf8cbe540c968b817061e4ed27026d0"
+ },
+ "0x8a8950f7623663222542c9469c73be3c4c81bbdf": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xaef83ad0ab332330a20e88cd3b5a4bcf6ac6c175ee780ed4183d11340df17833"
+ },
+ "0x8ba7e4a56d8d4a4a2fd7d0c8b9e6f032dc76cefb": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x72e962dfe7e2828809f5906996dedeba50950140555b193fceb94f12fd6f0a22"
+ },
+ "0x8bebc8ba651aee624937e7d897853ac30c95a067": {
+ "balance": "1",
+ "nonce": 1,
+ "root": "0xbe3d75a1729be157e79c3b77f00206db4d54e3ea14375a015451c88ec067c790",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000001": "01",
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "02",
+ "0x0000000000000000000000000000000000000000000000000000000000000003": "03"
+ },
+ "key": "0x445cb5c1278fdce2f9cbdb681bdd76c52f8e50e41dbd9e220242a69ba99ac099"
+ },
+ "0x8cf42eb93b1426f22a30bd22539503bdf838830c": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x0267c643f67b47cac9efacf6fcf0e4f4e1b273a727ded155db60eb9907939eb6"
+ },
+ "0x8d33f520a3c4cef80d2453aef81b612bfe1cb44c": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xb8d9b988ed60dbf5dca3e9d169343ca667498605f34fb6c30b45b2ed0f996f1a"
+ },
+ "0x8d36bbb3d6fbf24f38ba020d9ceeef5d4562f5f2": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xc13c19f53ce8b6411d6cdaafd8480dfa462ffdf39e2eb68df90181a128d88992"
+ },
+ "0x8fa24283a8c1cc8a0f76ac69362139a173592567": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xefaff7acc3ad3417517b21a92187d2e63d7a77bc284290ed406d1bc07ab3d885"
+ },
+ "0x8fb778e47caf2df14eca7a389955ca74ac8f4924": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xae2e7f1c933c6ca84ce8be811ef411dee773fb69508056d72448048ea1db5c47",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000001ee": "01ee",
+ "0x00000000000000000000000000000000000000000000000000000000000001ef": "01ef",
+ "0x00000000000000000000000000000000000000000000000000000000000001f0": "01f0"
+ },
+ "key": "0x4973f6aa8cf5b1190fc95379aa01cff99570ee6b670725880217237fb49e4b24"
+ },
+ "0x90fd8e600ae1a7c69fa6ef2c537b533ca77366e8": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xee9821621aa5ec9ab7d5878b2a995228adcdcacb710df522d2f91b434d3bdc79",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000c2": "c2",
+ "0x00000000000000000000000000000000000000000000000000000000000000c3": "c3",
+ "0x00000000000000000000000000000000000000000000000000000000000000c4": "c4"
+ },
+ "key": "0xbfaac98225451c56b2f9aec858cffc1eb253909615f3d9617627c793b938694f"
+ },
+ "0x913f841dfc8703ae76a4e1b8b84cd67aab15f17a": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xcb54add475a18ea02ab1adf9e2e73da7f23ecd3e92c4fa8ca4e8f588258cb5d3"
+ },
+ "0x923f800cf288500f8e53f04e4698c9b885dcf030": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xb91824b28183c95881ada12404d5ee8af8123689a98054d41aaf4dd5bec50e90"
+ },
+ "0x9344b07175800259691961298ca11c824e65032d": {
+ "balance": "0",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0x8e0388ecf64cfa76b3a6af159f77451519a7f9bb862e4cce24175c791fdcb0df",
+ "code": "0x60004381526020014681526020014181526020014881526020014481526020013281526020013481526020016000f3",
+ "key": "0x2e6fe1362b3e388184fd7bf08e99e74170b26361624ffd1c5f646da7067b58b6"
+ },
+ "0x93747f73c18356c6b202f527f552436a0e06116a": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x73cd1b7cd355f3f77c570a01100a616757408bb7abb78fe9ee1262b99688fcc4"
+ },
+ "0x9380b994c5738f68312f0e517902da81f63cdcfa": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x51b829f0f2c3de9cfbd94e47828a89940c329a49cd59540ca3c6d751a8d214d6",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000135": "0135",
+ "0x0000000000000000000000000000000000000000000000000000000000000136": "0136",
+ "0x0000000000000000000000000000000000000000000000000000000000000137": "0137"
+ },
+ "key": "0x50d83ef5194d06752cd5594b57e809b135f24eedd124a51137feaaf049bc2efd"
+ },
+ "0x94d068bff1af651dd9d9c2e75adfb7eec6f66be7": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x0754035aa4073381a211342b507de8e775c97c961096e6e2275df0bfcbb3a01c",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000059": "59",
+ "0x000000000000000000000000000000000000000000000000000000000000005a": "5a",
+ "0x000000000000000000000000000000000000000000000000000000000000005b": "5b"
+ },
+ "key": "0x0cd2a7c53c76f228ed3aa7a29644b1915fde9ec22e0433808bf5467d914e7c7a"
+ },
+ "0x956062137518b270d730d4753000896de17c100a": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x5aa3b4a2ebdd402721c3953b724f4fe90900250bb4ef89ce417ec440da318cd6"
+ },
+ "0x96a1cabb97e1434a6e23e684dd4572e044c243ea": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe7c6828e1fe8c586b263a81aafc9587d313c609c6db8665a42ae1267cd9ade59"
+ },
+ "0x984c16459ded76438d98ce9b608f175c28a910a0": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x4b9f335ce0bdffdd77fdb9830961c5bc7090ae94703d0392d3f0ff10e6a4fbab"
+ },
+ "0x99a1c0703485b331fa0302d6077b583082e242ea": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x2cf292c1e382bdd0e72e126701d7b02484e6e272f4c0d814f5a6fae233fc7935",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000121": "0121",
+ "0x0000000000000000000000000000000000000000000000000000000000000122": "0122",
+ "0x0000000000000000000000000000000000000000000000000000000000000123": "0123"
+ },
+ "key": "0x734ee4981754a3f1403c4e8887d35addfb31717d93de3e00ede78368c230861e"
+ },
+ "0x99d40a710cb552eaaee1599d4040055859b1610d": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x946bfb429d90f1b39bb47ada75376a8d90a5778068027d4b8b8514ac13f53eca"
+ },
+ "0x9a7b7b3a5d50781b4f4768cd7ce223168f6b449b": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xd16e029e8c67c3f330cddaa86f82d31f523028404dfccd16d288645d718eb9da"
+ },
+ "0x9ae62b6d840756c238b5ce936b910bb99d565047": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x8989651e80c20af78b37fdb693d74ecafc9239426ff1315e1fb7b674dcdbdb75"
+ },
+ "0x9b3cf956056937dfb6f9e3dc02e3979a4e421c0a": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xb1b2c1c59637202bb0e0d21255e44e0df719fe990be05f213b1b813e3d8179d7"
+ },
+ "0x9bb981f592bc1f9c31db67f30bbf1ff44b649886": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x1ee7e0292fba90d9733f619f976a2655c484adb30135ef0c5153b5a2f32169df"
+ },
+ "0x9bfb328671c108c9ba4d45734d9f4462d8c9a9cb": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xc15b43e5f4853ec8da53ebde03de87b94afce42a9c02f648ad8bdb224604c4ad",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000001da": "01da",
+ "0x00000000000000000000000000000000000000000000000000000000000001db": "01db",
+ "0x00000000000000000000000000000000000000000000000000000000000001dc": "01dc"
+ },
+ "key": "0xa683478d0c949580d5738b490fac8129275bb6e921dfe5eae37292be3ee281b9"
+ },
+ "0x9defb0a9e163278be0e05aa01b312ec78cfa3726": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xb31919583a759b75e83c14d00d0a89bb36adc452f73cee2933a346ccebaa8e31"
+ },
+ "0x9e59004e909ff011e5882332e421b6772e68ed10": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x3897cb9b6f68765022f3c74f84a9f2833132858f661f4bc91ccd7a98f4e5b1ee"
+ },
+ "0x9f50ec6c8a595869d71ce8c3b1c17c02599a5cc3": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x2705244734f69af78e16c74784e1dc921cb8b6a98fe76f577cc441c831e973bf"
+ },
+ "0xa0794cd73f564baeeda23fa4ce635a3f8ae39621": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xfb79021e7fa54b9bd2df64f6db57897d52ae85f7c195af518de48200a1325e2c",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000ef": "ef",
+ "0x00000000000000000000000000000000000000000000000000000000000000f0": "f0",
+ "0x00000000000000000000000000000000000000000000000000000000000000f1": "f1"
+ },
+ "key": "0x60535eeb3ffb721c1688b879368c61a54e13f8881bdef6bd4a17b8b92e050e06"
+ },
+ "0xa12b147dd542518f44f821a4d436066c64932b0d": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xae88076d02b19c4d09cb13fca14303687417b632444f3e30fc4880c225867be3"
+ },
+ "0xa179dbdd51c56d0988551f92535797bcf47ca0e7": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x6d1da4cf1127d654ed731a93105f481b315ecfc2f62b1ccb5f6d2717d6a40f9b"
+ },
+ "0xa1fce4363854ff888cff4b8e7875d600c2682390": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xad99b5bc38016547d5859f96be59bf18f994314116454def33ebfe9a892c508a"
+ },
+ "0xa225fe6df11a4f364234dd6a785a17cd38309acb": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xc1686045288a5952ad57de0e971bd25007723c9f749f49f391e715c27bf526c8",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000072": "72",
+ "0x0000000000000000000000000000000000000000000000000000000000000073": "73",
+ "0x0000000000000000000000000000000000000000000000000000000000000074": "74"
+ },
+ "key": "0x4e0ab2902f57bf2a250c0f87f088acc325d55f2320f2e33abd8e50ba273c9244"
+ },
+ "0xa25513c7e0f6eaa80a3337ee18081b9e2ed09e00": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xfb9474d0e5538fcd99e8d8d024db335b4e057f4bcd359e85d78f4a5226b33272"
+ },
+ "0xa5ab782c805e8bfbe34cb65742a0471cf5a53a97": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x6188c4510d25576535a642b15b1dbdb8922fe572b099f504390f923c19799777"
+ },
+ "0xa64f449891f282b87e566036f981023dba4ed477": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x61176dbc05a8537d8de85f82a03b8e1049cea7ad0a9f0e5b60ee15fca6fe0d42",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000012b": "012b",
+ "0x000000000000000000000000000000000000000000000000000000000000012c": "012c",
+ "0x000000000000000000000000000000000000000000000000000000000000012d": "012d"
+ },
+ "key": "0x7c1edabb98857d64572f03c64ac803e4a14b1698fccffffd51675d99ee3ba217"
+ },
+ "0xa6515a495ec7723416665ebb54fc002bf1e9a873": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xbbdc59572cc62c338fb6e027ab00c57cdeed233c8732680a56a5747141d20c7c"
+ },
+ "0xa6a54695341f038ad15e9e32f1096f5201236512": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xe2a72f5bfbeba70fc9ab506237ba27c096a4e96c3968cabf5b1b2fb54431b5cf",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000023": "23",
+ "0x0000000000000000000000000000000000000000000000000000000000000024": "24",
+ "0x0000000000000000000000000000000000000000000000000000000000000025": "25"
+ },
+ "key": "0xa87387b50b481431c6ccdb9ae99a54d4dcdd4a3eff75d7b17b4818f7bbfc21e9"
+ },
+ "0xa8100ae6aa1940d0b663bb31cd466142ebbdbd51": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x02547b56492bfe767f3d18be2aab96441c449cd945770ef7ef8555acc505b2e4"
+ },
+ "0xa8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x913e2a02a28d71d595d7216a12311f6921a4caf40aeabf0f28edf937f1df72b4"
+ },
+ "0xa92bb60b61e305ddd888015189d6591b0eab0233": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xdd1589b1fe1d9b4ca947f98ff324de7887af299d5490ed92ae40e95eec944118"
+ },
+ "0xa956ca63bf28e7da621475d6b077da1ab9812b3a": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xa090b66fbca46cb71abd1daa8d419d2c6e291094f52872978dfcb1c31ad7a900",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000001e4": "01e4",
+ "0x00000000000000000000000000000000000000000000000000000000000001e5": "01e5",
+ "0x00000000000000000000000000000000000000000000000000000000000001e6": "01e6"
+ },
+ "key": "0xaad7b91d085a94c11a2f7e77dc95cfcfc5daf4f509ca4e0c0e493b86c6cbff78"
+ },
+ "0xaa0d6dfdb7588017c80ea088768a5f3d0cdeacdb": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x89ecb0ceeea20ccd7d1b18cf1d35b7a2fd7b76ddc8d627f43304ed8b31b01248",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000144": "0144",
+ "0x0000000000000000000000000000000000000000000000000000000000000145": "0145",
+ "0x0000000000000000000000000000000000000000000000000000000000000146": "0146"
+ },
+ "key": "0xb990eaca858ea15fda296f3f47baa2939e8aa8bbccc12ca0c3746d9b5d5fb2ae"
+ },
+ "0xaa53ff4bb2334faf9f4447197ef69c39c0bb1379": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xe547c0050253075b1be4210608bc639cffe70110194c316481235e738be961e7",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000ea": "ea",
+ "0x00000000000000000000000000000000000000000000000000000000000000eb": "eb",
+ "0x00000000000000000000000000000000000000000000000000000000000000ec": "ec"
+ },
+ "key": "0xed263a22f0e8be37bcc1873e589c54fe37fdde92902dc75d656997a7158a9d8c"
+ },
+ "0xaa7225e7d5b0a2552bbb58880b3ec00c286995b8": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x5a4a3feecfc77b402e938e28df0c4cbb874771cb3c5a92524f303cffb82a2862"
+ },
+ "0xab12a5f97f03edbff03eded9d1a2a1179d2fc69e": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xba1d0afdfee510e8852f24dff964afd824bf36d458cf5f5d45f02f04b7c0b35d"
+ },
+ "0xab557835ab3e5c43bf34ac9b2ab730c5e0bc9967": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xc9ea69dc9e84712b1349c9b271956cc0cb9473106be92d7a937b29e78e7e970e"
+ },
+ "0xab9025d4a9f93c65cd4fe978d38526860af0aa62": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x4ce79cd9645650f0a00effa86f6fea733cecea9ea26964828ff25cf0577bc974",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000009a": "9a",
+ "0x000000000000000000000000000000000000000000000000000000000000009b": "9b",
+ "0x000000000000000000000000000000000000000000000000000000000000009c": "9c"
+ },
+ "key": "0x17350c7adae7f08d7bbb8befcc97234462831638443cd6dfea186cbf5a08b7c7"
+ },
+ "0xabd693b23d55dec7d0d0cba2ecbc9298dc4edf02": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xafd54e81f3e415407f0812a678856f1b4068ed64a08b3f3bf5b2190fcfb2322d",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000001b7": "01b7",
+ "0x00000000000000000000000000000000000000000000000000000000000001b8": "01b8",
+ "0x00000000000000000000000000000000000000000000000000000000000001b9": "01b9"
+ },
+ "key": "0xbe7d987a9265c0e44e9c5736fb2eb38c41973ce96e5e8e6c3c713f9d50a079ff"
+ },
+ "0xabe2b033c497e091c1e494c98c178e8aa06bcb00": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x2374954008440ca3d17b1472d34cc52a6493a94fb490d5fb427184d7d5fd1cbf"
+ },
+ "0xac4d51af4cb7bab4743fa57bc80b144d7a091268": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xfb00729a5f4f9a2436b999aa7159497a9cd88d155770f873a818b55052c5f067",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000149": "0149",
+ "0x000000000000000000000000000000000000000000000000000000000000014a": "014a",
+ "0x000000000000000000000000000000000000000000000000000000000000014b": "014b"
+ },
+ "key": "0xe42a85d04a1d0d9fe0703020ef98fa89ecdeb241a48de2db73f2feeaa2e49b0f"
+ },
+ "0xac7d8d5f6be7d251ec843ddbc09095150df59965": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xa9580109be2f7d35b5360050c2ced74e5d4dea2f82d46e8d266ed89157636004",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000046": "46",
+ "0x0000000000000000000000000000000000000000000000000000000000000047": "47",
+ "0x0000000000000000000000000000000000000000000000000000000000000048": "48"
+ },
+ "key": "0x943f42ad91e8019f75695946d491bb95729f0dfc5dbbb953a7239ac73f208943"
+ },
+ "0xac9e61d54eb6967e212c06aab15408292f8558c4": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xf2b9bc1163840284f3eb15c539972edad583cda91946f344f4cb57be15af9c8f"
+ },
+ "0xaceac762ff518b4cf93a6eebbc55987e7b79b2ce": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x1960414a11f8896c7fc4243aba7ed8179b0bc6979b7c25da7557b17f5dee7bf7"
+ },
+ "0xacfa6b0e008d0208f16026b4d17a4c070e8f9f8d": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x58e416a0dd96454bd2b1fe3138c3642f5dee52e011305c5c3416d97bc8ba5cf0"
+ },
+ "0xad108e31c9632ad9e20614b3ca40644d32948dbb": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x2625f8a23d24a5dff6a79f632b1020593362a6ac622fa5237460bc67b0aa0ed3",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000001a3": "01a3",
+ "0x00000000000000000000000000000000000000000000000000000000000001a4": "01a4",
+ "0x00000000000000000000000000000000000000000000000000000000000001a5": "01a5"
+ },
+ "key": "0xdce547cc70c79575ef72c061502d6066db1cbce200bd904d5d2b20d4f1cb5963"
+ },
+ "0xae3f4619b0413d70d3004b9131c3752153074e45": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xb1b2fd7758f73e25a2f9e72edde82995b2b32ab798bcffd2c7143f2fc8196fd8"
+ },
+ "0xae58b7e08e266680e93e46639a2a7e89fde78a6f": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe09e5f27b8a7bf61805df6e5fefc24eb6894281550c2d06250adecfe1e6581d7"
+ },
+ "0xaf17b30f5ab8e6a4d7a563bdb0194f3e0bd50209": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x2434bfc643ec364116cd71519a397662b20c52d1adcff0b830e80a738e19f30e",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000b8": "b8",
+ "0x00000000000000000000000000000000000000000000000000000000000000b9": "b9",
+ "0x00000000000000000000000000000000000000000000000000000000000000ba": "ba"
+ },
+ "key": "0x26ce7d83dfb0ab0e7f15c42aeb9e8c0c5dba538b07c8e64b35fb64a37267dd96"
+ },
+ "0xaf193a8cdcd0e3fb39e71147e59efa5cad40763d": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x1a28912018f78f7e754df6b9fcec33bea25e5a232224db622e0c3343cf079eff"
+ },
+ "0xaf2c6f1512d1cabedeaf129e0643863c57419732": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xad6a4a6ebd5166c9b5cc8cfbaec176cced40fa88c73d83c67f0c3ed426121ebc"
+ },
+ "0xb0b2988b6bbe724bacda5e9e524736de0bc7dae4": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x053df2c3b574026812b154a99b13b626220af85cd01bb1693b1d42591054bce6"
+ },
+ "0xb0ee91ba61e8a3914a7eab120786e9e61bfe4faf": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xa14913d548ac1d3f9962a21a569fe52f1436b6d2f5ea4e36de13ea855ede54e0",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000068": "68",
+ "0x0000000000000000000000000000000000000000000000000000000000000069": "69",
+ "0x000000000000000000000000000000000000000000000000000000000000006a": "6a"
+ },
+ "key": "0x4bd8ef9873a5e85d4805dbcb0dbf6810e558ea175167549ef80545a9cafbb0e1"
+ },
+ "0xb12dc850a3b0a3b79fc2255e175241ce20489fe4": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x4ccd31891378d2025ef58980481608f11f5b35a988e877652e7cbb0a6127287c"
+ },
+ "0xb47f70b774d780c3ec5ac411f2f9198293b9df7a": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xdef989cb85107747de11222bd7418411f8f3264855e1939ef6bef9447e42076d"
+ },
+ "0xb4bc136e1fb4ea0b3340d06b158277c4a8537a13": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xb7c2ef96238f635f86f9950700e36368efaaa70e764865dddc43ff6e96f6b346"
+ },
+ "0xb519be874447e0f0a38ee8ec84ecd2198a9fac77": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x92b13a73440c6421da22e848d23f9af80610085ab05662437d850c97a012d8d3"
+ },
+ "0xb55a3d332d267493105927b892545d2cd4c83bd6": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xc781c7c3babeb06adfe8f09ecb61dbe0eb671e41f3a1163faac82fdfa2bc83e8"
+ },
+ "0xb609bc528052bd9669595a35f6eb6a4d7a30ac3d": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe6388bfcbbd6000e90a10633c72c43b0b0fed7cf38eab785a71e6f0c5b80a26a"
+ },
+ "0xb68176634dde4d9402ecb148265db047d17cb4ab": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xf4a1c4554b186a354b3e0c467eef03df9907cd5a5d96086c1a542b9e5160ca78"
+ },
+ "0xb70654fead634e1ede4518ef34872c9d4f083a53": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x7f9726a7b2f5f3a501b2d7b18ec726f25f22c86348fae0f459d882ec5fd7d0c7"
+ },
+ "0xb71de80778f2783383f5d5a3028af84eab2f18a4": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x64d0de66ea29cbcf7f237dae1c5f883fa6ff0ba52b90f696bb0348224dbc82ce"
+ },
+ "0xb787c848479278cfdb56950cda545cd45881722d": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x1098f06082dc467088ecedb143f9464ebb02f19dc10bd7491b03ba68d751ce45"
+ },
+ "0xb911abeead298d03c21c6c5ff397cd80eb375d73": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x54abcdbc8b04bc9b70e9bd46cb9db9b8eb08cfd4addba4c941dacc34dd28648e",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000054": "54",
+ "0x0000000000000000000000000000000000000000000000000000000000000055": "55",
+ "0x0000000000000000000000000000000000000000000000000000000000000056": "56"
+ },
+ "key": "0x873429def7829ff8227e4ef554591291907892fc8f3a1a0667dada3dc2a3eb84"
+ },
+ "0xb917b7f3d49770d3d2f0ad2f497e5bfe0f25dc5f": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x11d4eec7df52cd54e74690a487884e56371976c2b8c49ffc4c8f34831166bf4e",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000162": "0162",
+ "0x0000000000000000000000000000000000000000000000000000000000000163": "0163",
+ "0x0000000000000000000000000000000000000000000000000000000000000164": "0164"
+ },
+ "key": "0x65e6b6521e4f1f97e80710581f42063392c9b33e0aeea4081a102a32238992ea"
+ },
+ "0xb9b85616fc8ed95979a5e31b8968847e7518b165": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x6a5e43139d88da6cfba857e458ae0b5359c3fde36e362b6e5f782a90ce351f14"
+ },
+ "0xbac9d93678c9b032c393a23e4c013e37641ad850": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x8a8266874b43f78d4097f27b2842132faed7e7e430469eec7354541eb97c3ea0"
+ },
+ "0xbbeebd879e1dff6918546dc0c179fdde505f2a21": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x170c927130fe8f1db3ae682c22b57f33f54eb987a7902ec251fe5dba358a2b25"
+ },
+ "0xbbf3f11cb5b43e700273a78d12de55e4a7eab741": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe74ac72f03e8c514c2c75f3c4f54ba31e920374ea7744ef1c33937e64c7d54f1"
+ },
+ "0xbc5959f43bc6e47175374b6716e53c9a7d72c594": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xfd3a8bacd3b2061cbe54f8d38cf13c5c87a92816937683652886dee936dfae10"
+ },
+ "0xbceef655b5a034911f1c3718ce056531b45ef03b": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x6c05d8abc81143ce7c7568c98aadfe6561635c049c07b2b4bce3019cef328cb9"
+ },
+ "0xbd079b0337a29cccd2ec95b395ef5c01e992b6a5": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xf0877d51b7712e08f2a3c96cddf50ff61b8b90f80b8b9817ea613a8a157b0c45"
+ },
+ "0xbe3eea9a483308cb3134ce068e77b56e7c25af19": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x7026c939a9158beedff127a64f07a98b328c3d1770690437afdb21c34560fc57"
+ },
+ "0xc04b5bb1a5b2eb3e9cd4805420dba5a9d133da5b": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x72d91596112f9d7e61d09ffa7575f3587ad9636172ae09641882761cc369ecc0"
+ },
+ "0xc18d2be47547904f88a4f46cee75f8f4a94e1807": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x9c32ffd5059115bba9aed9174f5ab8b4352e3f51a85dde33000f703c9b9fe7c2",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000018a": "018a",
+ "0x000000000000000000000000000000000000000000000000000000000000018b": "018b",
+ "0x000000000000000000000000000000000000000000000000000000000000018c": "018c"
+ },
+ "key": "0xa601eb611972ca80636bc39087a1dae7be5a189b94bda392f84d6ce0d3c866b9"
+ },
+ "0xc19a797fa1fd590cd2e5b42d1cf5f246e29b9168": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x99dba7e9230d5151cc37ff592fa1592f27c7c81d203760dfaf62ddc9f3a6b8fd"
+ },
+ "0xc305dd6cfc073cfe5e194fc817536c419410a27d": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x016d92531f4754834b0502de5b0342ceff21cde5bef386a83d2292f4445782c2"
+ },
+ "0xc337ded6f56c07205fb7b391654d7d463c9e0c72": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x7c608293e741d1eb5ae6916c249a87b6540cf0c2369e96d293b1a7b5b9bd8b31"
+ },
+ "0xc57aa6a4279377063b17c554d3e33a3490e67a9a": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xc192ea2d2bb89e9bb7f17f3a282ebe8d1dd672355b5555f516b99b91799b01f6"
+ },
+ "0xc5eaec262d853fbdaccca406cdcada6fa6dd0944": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x471bf8988ad0d7602d6bd5493c08733096c116ac788b76f22a682bc4558e3aa7",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000158": "0158",
+ "0x0000000000000000000000000000000000000000000000000000000000000159": "0159",
+ "0x000000000000000000000000000000000000000000000000000000000000015a": "015a"
+ },
+ "key": "0x580aa878e2f92d113a12c0a3ce3c21972b03dbe80786858d49a72097e2c491a3"
+ },
+ "0xc7a0a19ea8fc63cc6021af2e11ac0584d75c97b7": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xe2a164e2c30cf30391c88ff32a0e202194b08f2a61a9cd2927ea5ed6dfbf1056",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000e5": "e5",
+ "0x00000000000000000000000000000000000000000000000000000000000000e6": "e6",
+ "0x00000000000000000000000000000000000000000000000000000000000000e7": "e7"
+ },
+ "key": "0x86d03d0f6bed220d046a4712ec4f451583b276df1aed33f96495d22569dc3485"
+ },
+ "0xc7b99a164efd027a93f147376cc7da7c67c6bbe0": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x8e11480987056c309d7064ebbd887f086d815353cdbaadb796891ed25f8dcf61"
+ },
+ "0xc7d4ef05550c226c50cf0d4231ba1566d03fa98d": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x3a2985c6ada67e5604b99fa2fc1a302abd0dc241ee7f14c428fa67d476868bb6",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000010d": "010d",
+ "0x000000000000000000000000000000000000000000000000000000000000010e": "010e",
+ "0x000000000000000000000000000000000000000000000000000000000000010f": "010f"
+ },
+ "key": "0x5a356862c79afffd6a01af752d950e11490146e4d86dfb8ab1531e9aef4945a1"
+ },
+ "0xca358758f6d27e6cf45272937977a748fd88391d": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xbccd3d2f920dfb8d70a38c9ccd5ed68c2ef6e3372199381767ce222f13f36c87"
+ },
+ "0xca87240ef598bd6e4b8f67b3761af07d5f575514": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x11f5d399ca8fb7a9af5ad481be60cf61d45493cd20206c9d0a237ce7d7571e5f",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000001f3": "01f3",
+ "0x00000000000000000000000000000000000000000000000000000000000001f4": "01f4",
+ "0x00000000000000000000000000000000000000000000000000000000000001f5": "01f5"
+ },
+ "key": "0x4b238e08b80378d0815e109f350a08e5d41ec4094df2cfce7bc8b9e3115bda70"
+ },
+ "0xcb925b74da97bdff2130523c2a788d4beff7b3c3": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe0c5acf66bda927704953fdf7fb4b99e116857121c069eca7fb9bd8acfc25434"
+ },
+ "0xcccc369c5141675a9e9b1925164f30cdd60992dc": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xfe2511e8a33ac9973b773aaedcb4daa73ae82481fe5a1bf78b41281924260cf5"
+ },
+ "0xce24f30695b735e48b67467d76f5185ee3c7a0c5": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x5442e0279d3f1149de4ce8d9e2d3f01d1854755038ac1a0fae5c48749bf71f20",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000001e9": "01e9",
+ "0x00000000000000000000000000000000000000000000000000000000000001ea": "01ea",
+ "0x00000000000000000000000000000000000000000000000000000000000001eb": "01eb"
+ },
+ "key": "0x47450e5beefbd5e3a3f80cbbac474bb3db98d5e609aa8d15485c3f0d733dea3a"
+ },
+ "0xd048d242574c45095c72eaf58d2808778117afcb": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x7217cb747054306f826e78aa3fc68fe4441299a337ecea1d62582f2da8a7f336",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000001a8": "01a8",
+ "0x00000000000000000000000000000000000000000000000000000000000001a9": "01a9",
+ "0x00000000000000000000000000000000000000000000000000000000000001aa": "01aa"
+ },
+ "key": "0xa9656c0192bb27f0ef3f93ecc6cc990dd146da97ac11f3d8d0899fba68d5749a"
+ },
+ "0xd0752b60adb148ca0b3b4d2591874e2dabd34637": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x625e5c85d5f4b6385574b572709d0f704b097527a251b7c658c0c4441aef2af6"
+ },
+ "0xd089c853b406be547d8e331d31cbd5c4d472a349": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x389093badcaa24c3a8cbb4461f262fba44c4f178a162664087924e85f3d55710"
+ },
+ "0xd0918e2e24c5ddc0557a61ca11e055d2ac210fe5": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x25b42ec5480843a0328c63bc50eff8595d90f1d1b0afcab2f4a19b888c794f37",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000a9": "a9",
+ "0x00000000000000000000000000000000000000000000000000000000000000aa": "aa",
+ "0x00000000000000000000000000000000000000000000000000000000000000ab": "ab"
+ },
+ "key": "0xbaae09901e990935de19456ac6a6c8bc1e339d0b80ca129b8622d989b5c79120"
+ },
+ "0xd10b36aa74a59bcf4a88185837f658afaf3646ef": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x9fe8b6e43098a4df56e206d479c06480801485dfd8ec3da4ccc3cebf5fba89a1"
+ },
+ "0xd1211001882d2ce16a8553e449b6c8b7f71e6183": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x61088707d2910974000e63c2d1a376f4480ba19dde19c4e6a757aeb3d62d5439"
+ },
+ "0xd1347bfa3d09ec56b821e17c905605cd5225069f": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x287acc7869421fb9f49a3549b902fb01b7accc032243bd7e1accd8965d95d915",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000019e": "019e",
+ "0x000000000000000000000000000000000000000000000000000000000000019f": "019f",
+ "0x00000000000000000000000000000000000000000000000000000000000001a0": "01a0"
+ },
+ "key": "0x5b90bb05df9514b2d8e3a8feb3d6c8c22526b02398f289b42111426edc4fe6cf"
+ },
+ "0xd20b702303d7d7c8afe50344d66a8a711bae1425": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x4d67d989fdb264fa4b2524d306f7b3f70ddce0b723411581d1740407da325462"
+ },
+ "0xd282cf9c585bb4f6ce71e16b6453b26aa8d34a53": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x0e27113c09de0a0cb0ff268c677aba17d39a3190fe15aec0ff7f54184955cba4"
+ },
+ "0xd2e2adf7177b7a8afddbc12d1634cf23ea1a7102": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x79afb7a5ffe6ccd537f9adff8287b78f75c37d97ea8a4dd504a08bc09926c3fa"
+ },
+ "0xd39b94587711196640659ec81855bcf397e419ff": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xa9de128e7d4347403eb97f45e969cd1882dfe22c1abe8857aab3af6d0f9e9b92"
+ },
+ "0xd48171b7166f5e467abcba12698df579328e637d": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x188111c233bf6516bb9da8b5c4c31809a42e8604cd0158d933435cfd8e06e413"
+ },
+ "0xd4f09e5c5af99a24c7e304ca7997d26cb0090169": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe1068e9986da7636501d8893f67aa94f5d73df849feab36505fd990e2d6240e9"
+ },
+ "0xd803681e487e6ac18053afc5a6cd813c86ec3e4d": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe5302e42ca6111d3515cbbb2225265077da41d997f069a6c492fa3fcb0fdf284"
+ },
+ "0xd854d6dd2b74dc45c9b883677584c3ac7854e01a": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x9a1896e612ca43ecb7601990af0c3bc135b9012c50d132769dfb75d0038cc3be"
+ },
+ "0xd8c50d6282a1ba47f0a23430d177bbfbb72e2b84": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xfc4870c3cd21d694424c88f0f31f75b2426e1530fdea26a14031ccf9baed84c4"
+ },
+ "0xd917458e88a37b9ae35f72d4cc315ef2020b2418": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x4c2765139cace1d217e238cc7ccfbb751ef200e0eae7ec244e77f37e92dfaee5"
+ },
+ "0xdbe726e81a7221a385e007ef9e834a975a4b528c": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x5fcd9b6fce3394ad1d44733056b3e5f6306240974a16f9de8e96ebdd14ae06b1"
+ },
+ "0xdc60d4434411b2608150f68c4c1b818b6208acc2": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x27e9b6a54cf0fb188499c508bd96d450946cd6ba1cf76cf5343b5c74450f6690",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000001df": "01df",
+ "0x00000000000000000000000000000000000000000000000000000000000001e0": "01e0",
+ "0x00000000000000000000000000000000000000000000000000000000000001e1": "01e1"
+ },
+ "key": "0x8510660ad5e3d35a30d4fb7c2615c040f9f698faae2ac48022e366deaeecbe77"
+ },
+ "0xdd1e2826c0124a6d4f7397a5a71f633928926c06": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xf0a51b55aadfa3cafdd214b0676816e574931a683f51218207c625375884e785"
+ },
+ "0xdd9ee108e8d5d2e8937e9fd029ec3a6640708af0": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x8289b558865f2ca1f54c98b5ff5df95f07c24ec605e247b58c7798605dcd794f",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000001cb": "01cb",
+ "0x00000000000000000000000000000000000000000000000000000000000001cc": "01cc",
+ "0x00000000000000000000000000000000000000000000000000000000000001cd": "01cd"
+ },
+ "key": "0x2a39afbe88f572c23c90da2d059af3de125f1da5c3753c530dc5619a4857119f"
+ },
+ "0xde5a6f78116eca62d7fc5ce159d23ae6b889b365": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xbb861b82d884a70666afeb78bbf30cab7fdccf838f4d5ce5f4e5ca1be6be61b1"
+ },
+ "0xde7d1b721a1e0632b7cf04edf5032c8ecffa9f9a": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x9966a8b4cd856b175855258fa7e412ffef06d9e92b519050fa7ac06d8952ac84"
+ },
+ "0xdfe052578c96df94fa617102199e66110181ed2c": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x54c12444ede3e2567dd7f4d9a06d4db8c6ab800d5b3863f8ff22a0db6d09bf24"
+ },
+ "0xe3a71b4caf54df7d2480743c5a6770a1a5a9bcda": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe4d9c31cc9b4a9050bbbf77cc08ac26d134253dcb6fd994275c5c3468f5b7810"
+ },
+ "0xe3b98a4da31a127d4bde6e43033f66ba274cab0e": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x70aae390a762a4347a4d167a2431874554edf1d77579213e55fea3ec39a1257c"
+ },
+ "0xe439e4ea04e52cf38d0925f0722d341097378b88": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x6c00e091dae3d4226facd6be802c865d5db0f524754d22666406138b54fab0e6",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000008b": "8b",
+ "0x000000000000000000000000000000000000000000000000000000000000008c": "8c",
+ "0x000000000000000000000000000000000000000000000000000000000000008d": "8d"
+ },
+ "key": "0x38152bce526b7e1c2bedfc9d297250fcead02818be7806638564377af145103b"
+ },
+ "0xe43ce33cdb88a2efe8a3d652bfb252fd91a950a7": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xc157e0d637d64b90e2c59bc8bed2acd75696ea1ac6b633661c12ce8f2bce0d62"
+ },
+ "0xe52c0f008957444c48eba77467eaf2b7c127e3c5": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xb888c9946a84be90a9e77539b5ac68a3c459761950a460f3e671b708bb39c41f"
+ },
+ "0xe5ec19296e6d1518a6a38c1dbc7ad024b8a1a248": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x519abb269c3c5710f1979ca84192e020ba5c838bdd267b2d07436a187f171232"
+ },
+ "0xe6dddbffde545e58030d4b8ca9e00cfb68975b5d": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x2afe93e1b0f26e588d2809127e4360ad7e28cf552498b2bc4847d6bcda738cdb",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000130": "0130",
+ "0x0000000000000000000000000000000000000000000000000000000000000131": "0131",
+ "0x0000000000000000000000000000000000000000000000000000000000000132": "0132"
+ },
+ "key": "0xa0f5dc2d18608f8e522ffffd86828e3d792b36d924d5505c614383ddff9be2eb"
+ },
+ "0xe75db02929f3d5d7c28ecdb064ece929602c06bd": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x9eda8eb6ca03d7c4afe47279acc90a45d1b2ca6a11afd95206f8868d20520d06",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000001e": "1e",
+ "0x000000000000000000000000000000000000000000000000000000000000001f": "1f",
+ "0x0000000000000000000000000000000000000000000000000000000000000020": "20"
+ },
+ "key": "0x600a7a5f41a67f6f759dcb664198f1c5d9b657fb51a870ce9e234e686dff008e"
+ },
+ "0xe7b2ceb8674516c4aeb43979808b237656ab3b6b": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xcd31ed5d5da79990afed0d993cb725c4e34dd97544b03466ed34212e42c28d68",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000014e": "014e",
+ "0x000000000000000000000000000000000000000000000000000000000000014f": "014f",
+ "0x0000000000000000000000000000000000000000000000000000000000000150": "0150"
+ },
+ "key": "0x75d231f57a1a9751f58769d5691f4807ab31ac0e802b1a1f6bfc77f5dff0adbf"
+ },
+ "0xe7d13f7aa2a838d24c59b40186a0aca1e21cffcc": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xec3e92967d10ac66eff64a5697258b8acf87e661962b2938a0edcd78788f360d"
+ },
+ "0xe82c38488eded9fb72a5ed9e039404c537f20b13": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x7a2464bc24d90557940e93a3b73308ea354ed7d988be720c545974a17959f93f"
+ },
+ "0xe920ab4e34595482e98b2c0d16be164c49190546": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xd623b1845175b206c127c08046281c013e4a3316402a771f1b3b77a9831143f5"
+ },
+ "0xe99c76a6c3b831a926ab623476d2ec14560c09b4": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x0fd8e99b1b4ab4eb8c6c2218221ae6978cc67433341ed8a1ad6185d34fa82c61",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000014": "14",
+ "0x0000000000000000000000000000000000000000000000000000000000000015": "15",
+ "0x0000000000000000000000000000000000000000000000000000000000000016": "16"
+ },
+ "key": "0x6641e3ed1f264cf275b53bb7012dabecf4c1fca700e3db989e314c24cc167074"
+ },
+ "0xe9b17e54dba3344a23160cb2b64f88024648c53e": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xb4f179efc346197df9c3a1cb3e95ea743ddde97c27b31ad472d352dba09ee1f5"
+ },
+ "0xebe708edc62858621542b7354bb478228eb95577": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x7bff1b6b56891e66584ced453d09450c2fed9453b1644e8509bef9f9dd081bbb"
+ },
+ "0xebf37af41b6d7913aed3b9cc650d1e8f58a3d785": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x209b102e507b8dfc6acfe2cf55f4133b9209357af679a6d507e6ee87112bfe10"
+ },
+ "0xeda8645ba6948855e3b3cd596bbb07596d59c603": {
+ "balance": "1000000000000000000000000000000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xabd8afe9fbf5eaa36c506d7c8a2d48a35d013472f8182816be9c833be35e50da"
+ },
+ "0xef6cbd2161eaea7943ce8693b9824d23d1793ffb": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xce732a5e3b88ae26790aeb390a2bc02c449fdf57665c6d2c2b0dbce338c4377e"
+ },
+ "0xf031efa58744e97a34555ca98621d4e8a52ceb5f": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x00748bacab20da9ae19dd26a33bd10bbf825e28b3de84fc8fe1d15a21645067f"
+ },
+ "0xf068ae4089a66c79afe47d6e513f718838d8f73f": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x72c89221daedccdd3fbba66c1b081b3634ce89d5a069be97ff7832778f7b023a",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000003c": "3c",
+ "0x000000000000000000000000000000000000000000000000000000000000003d": "3d",
+ "0x000000000000000000000000000000000000000000000000000000000000003e": "3e"
+ },
+ "key": "0x37310559ceaade42e45b3e3f05925aadca9e60aeeb9dd60d824875d9e9e71e26"
+ },
+ "0xf0a279d2276de583ebcd7f69a6532f13349ad656": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x11eb0304c1baa92e67239f6947cb93e485a7db05e2b477e1167a8960458fa8cc"
+ },
+ "0xf0a5f15ef71424b5d543394ec46c46bfd2817747": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xbefe55b606a865c3898ec2093bd160b37c3976011516f43736cac2a9a7ecd4ca",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000000e0": "e0",
+ "0x00000000000000000000000000000000000000000000000000000000000000e1": "e1",
+ "0x00000000000000000000000000000000000000000000000000000000000000e2": "e2"
+ },
+ "key": "0xdbea1fd70fe1c93dfef412ce5d8565d87d6843aac044d3a015fc3db4d20a351b"
+ },
+ "0xf14d90dc2815f1fc7536fc66ca8f73562feeedd1": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xabdc44a9bc7ccf1ce76b942d25cd9d731425cd04989597d7a2e36423e2dac7ee"
+ },
+ "0xf16ba6fa61da3398815be2a6c0f7cb1351982dbc": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x728325587fa336e318b54298e1701d246c4f90d6094eb95635d8a47f080f4603"
+ },
+ "0xf1fc98c0060f0d12ae263986be65770e2ae42eae": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xca7ad42d3c4fe14ddb81bf27d4679725a1f6c3f23b688681bb6f24262d63212f"
+ },
+ "0xf4f97c88c409dcf3789b5b518da3f7d266c48806": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x84c7ee50e102d0abf5750e781c1635d60346f20ab0d5e5f9830db1a592c658ff"
+ },
+ "0xf5347043ae5fca9412ca2c72aee17a1d3ba37691": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xf390264acaf1433c0ea670b2c094a30076641469524ae24f5fddc44e99c5b032",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x000000000000000000000000000000000000000000000000000000000000004f": "4f",
+ "0x0000000000000000000000000000000000000000000000000000000000000050": "50",
+ "0x0000000000000000000000000000000000000000000000000000000000000051": "51"
+ },
+ "key": "0xa5541b637a896d30688a80b7affda987d9597aac7ccd9799c15999a1d7d094e2"
+ },
+ "0xf57fd44ccea35d9c530ef23f3e55de2f6e5415bf": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x6d4162ce16817e46fa2ddc5e70cee790b80abc3d6f7778cfbaed327c5d2af36c"
+ },
+ "0xf6152f2ad8a93dc0f8f825f2a8d162d6da46e81f": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x7e839d9fd8a767e90a8b2f48a571f111dd2451bc5910cf2bf3ae79963e47e34d"
+ },
+ "0xf61ac2a10b7981a12822e3e48671ebd969bce9c2": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xbfe5dee42bddd2860a8ebbcdd09f9c52a588ba38659cf5e74b07d20f396e04d4"
+ },
+ "0xf7eaadcf76ffcf006a86deb2f17d0b8fe0b211a8": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x1dff76635b74ddba16bba3054cc568eed2571ea6becaabd0592b980463f157e2"
+ },
+ "0xf83af0ceb5f72a5725ffb7e5a6963647be7d8847": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x662d147a16d7c23a2ba6d3940133e65044a90985e26207501bfca9ae47a2468c"
+ },
+ "0xf8d20e598df20877e4d826246fc31ffb4615cbc0": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xa248850a2e0d6fe62259d33fc498203389fa754c3bd098163e86946888e455bd"
+ },
+ "0xf91193b7442e274125c63003ee53f4ce5836f424": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xb25f9e4f6f913a4a1e8debf7d4752bfa521d147bb67c69d5855301e76dd80633",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000001d5": "01d5",
+ "0x00000000000000000000000000000000000000000000000000000000000001d6": "01d6",
+ "0x00000000000000000000000000000000000000000000000000000000000001d7": "01d7"
+ },
+ "key": "0xbfe731f071443795cef55325f32e6e03c8c0d0398671548dfd5bc96b5a6555c0"
+ },
+ "0xf997ed224012b1323eb2a6a0c0044a956c6b8070": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xbcebc35bfc663ecd6d4410ee2363e5b7741ee953c7d3359aa585095e503d20c8"
+ },
+ "0xfb7b49bc3178263f3a205349c0e8060f44584500": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xa03fe040e4264070290e95ffe06bf9da0006556091f17c5df5abaa041de0c2f7"
+ },
+ "0xfb95aa98d6e6c5827a57ec17b978d647fcc01d98": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xf63360f8bb23f88b0a564f9e07631c38c73b4074ba4192d6131336ef02ee9cf2"
+ },
+ "0xfcc8d4cd5a42cca8ac9f9437a6d0ac09f1d08785": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xd3443fa37ee617edc09a9c930be4873c21af2c47c99601d5e20483ce6d01960a"
+ },
+ "0xfd5e6e8c850fafa2ba2293c851479308c0f0c9e7": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0x1c248f110218eaae2feb51bc82e9dcc2844bf93b88172c52afcb86383d262323"
+ },
+ "0xfde502858306c235a3121e42326b53228b7ef469": {
+ "balance": "1",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe3d7213321be060ae2e1ff70871131ab3e4c9f4214a17fe9441453745c29365b"
+ },
+ "0xfe1dcd3abfcd6b1655a026e60a05d03a7f71e4b6": {
+ "balance": "100000000000",
+ "nonce": 0,
+ "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "key": "0xe31747e6542bf4351087edfbeb23e225e4217b5fa25d385f33cd024df0c9ae12"
+ },
+ "0xfe96089d9b79f2d10f3e8b0fb9629aeb6cc7cde6": {
+ "balance": "0",
+ "nonce": 1,
+ "root": "0xcf2123d110997f426821d3e541334e43fdd6b5286c3c33252c24b5f8aafc7aa2",
+ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
+ "storage": {
+ "0x00000000000000000000000000000000000000000000000000000000000001d0": "01d0",
+ "0x00000000000000000000000000000000000000000000000000000000000001d1": "01d1",
+ "0x00000000000000000000000000000000000000000000000000000000000001d2": "01d2"
+ },
+ "key": "0xbf632670b6fa18a8ad174a36180202bfef9a92c2eeda55412460491ae0f6a969"
+ }
+ }
+}
\ No newline at end of file
diff --git a/cmd/devp2p/internal/ethtest/testdata/newpayload.json b/cmd/devp2p/internal/ethtest/testdata/newpayload.json
new file mode 100644
index 0000000000..7f8c99afa9
--- /dev/null
+++ b/cmd/devp2p/internal/ethtest/testdata/newpayload.json
@@ -0,0 +1,13268 @@
+[
+ {
+ "jsonrpc": "2.0",
+ "id": "np72",
+ "method": "engine_newPayloadV1",
+ "params": [
+ {
+ "parentHash": "0x9e8a444b740df016941ecc815fe9eebeaa04a047db6569855573a52a8cb78cdd",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x74035b613e4ea1072fd029f35d0fa5b26fbfaa54cabebcec88b9ee07cca321ae",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x48",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x2d0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x568d2f9",
+ "blockHash": "0xf0a50b18d597552b6ad8a711f4ac1f7ab225d59daa74137f689256a16a0ff809",
+ "transactions": [
+ "0xf86a39840568d2fa8252089444bd7ae60f478fae1061e11a7739f4b94d1daf9101808718e5bb3abd10a0a050fc2310f542cf90b3376f54d296158f5be7ad852db200f9956e3210c0f8125ca04f880fe872915a7843c37147a69758eff0a93cfaf8ce54f36502190e54b6e5c7"
+ ],
+ "withdrawals": null,
+ "blobGasUsed": null,
+ "excessBlobGas": null
+ }
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np73",
+ "method": "engine_newPayloadV1",
+ "params": [
+ {
+ "parentHash": "0xf0a50b18d597552b6ad8a711f4ac1f7ab225d59daa74137f689256a16a0ff809",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x18b68edcdfc835d5db51310e7960eaf0c0afcc5a6611282d2085f3282b2f9e3f",
+ "receiptsRoot": "0xabc882591cb5b81b276a4e5cd873e1be7e1b4a69f630d2127f06d63c8db5acb2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x49",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146e8",
+ "timestamp": "0x2da",
+ "extraData": "0x",
+ "baseFeePerGas": "0x4bbd14a",
+ "blockHash": "0x662ab680f6b14375e7642874a16a514d1ecffc9921a9d8e143b5ade129ad554b",
+ "transactions": [
+ "0xf8853a8404bbd14b830146e88080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a027748abc264040530bca00d1cc86b199586c1fe26955cd5e250b97e2b9ca3128a050a822d9df3b63e6911766d4ae8c722f5afee7a6c06a7b5eb73772a5b137ca36"
+ ],
+ "withdrawals": null,
+ "blobGasUsed": null,
+ "excessBlobGas": null
+ }
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np74",
+ "method": "engine_newPayloadV1",
+ "params": [
+ {
+ "parentHash": "0x662ab680f6b14375e7642874a16a514d1ecffc9921a9d8e143b5ade129ad554b",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6fb7295e0a62bff03ddeba56ba643cd817fab6bc8df11309f8e8a3dbcf7d502e",
+ "receiptsRoot": "0x7b9d8080a095524251324dc00e77d3ecf4c249c48eebed2e4a5acedc678c70b4",
+ "logsBloom": "0x000800000000000000000000000000000900000000000000000000000000c0080000000000000010000000020000000000000004100000000480008020100000000000000000000000000000001000200000000000000010000010000000000000000000000000000000000000000000000000000000000200000000000000800001000000000000000000000000000000000004000000000000000800000000008000000000000001000000000002000000000000000000000000000000080000000000000000200404000000000000000000000000000000000000000000000000080100000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x4a",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc61",
+ "timestamp": "0x2e4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x424ad37",
+ "blockHash": "0x9981d4e953d402b0b1554ef62ebbeb7760790a5e53191c9753329b6a3eab3d13",
+ "transactions": [
+ "0xf87c3b840424ad3883011f548080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a050e3677064fe82b08a8fae8cea250fbaf00dbca1b6921cffd311ca17c7979865a051e738138eab4b31f1ba163b8ed2cfd778af98eff583cd5a26fcd9bd673fe027"
+ ],
+ "withdrawals": null,
+ "blobGasUsed": null,
+ "excessBlobGas": null
+ }
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np75",
+ "method": "engine_newPayloadV1",
+ "params": [
+ {
+ "parentHash": "0x9981d4e953d402b0b1554ef62ebbeb7760790a5e53191c9753329b6a3eab3d13",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x65038690e44bf1ee49d47beb6efc7cc84d7f01d2ba645768e3a584a50979b36d",
+ "receiptsRoot": "0xf5419129ce2f36d1b2206d4723f3e499691ad9aee741223426cda1b22e601a19",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x4b",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36c",
+ "timestamp": "0x2ee",
+ "extraData": "0x",
+ "baseFeePerGas": "0x3a051bc",
+ "blockHash": "0xc5e8361f3f3ba7bfbed66940c015f351d498ed34d48f8de6e020ffffbcbbec61",
+ "transactions": [
+ "0xf8673c8403a051bd83020888808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0dd01417c1ac62f9e593b07848f93c1f5ab729e73a493e22141f6e1c6e8a4f94fa00b9e979c6bae8ab4a90b7b2ba61d590d800e5411bc12be320efc3fb7310506e3"
+ ],
+ "withdrawals": null,
+ "blobGasUsed": null,
+ "excessBlobGas": null
+ }
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np76",
+ "method": "engine_newPayloadV1",
+ "params": [
+ {
+ "parentHash": "0xc5e8361f3f3ba7bfbed66940c015f351d498ed34d48f8de6e020ffffbcbbec61",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3b8d5706f2e3d66bb968de876e2683d75dce76d04118bc0184d6af44fb10196f",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x4c",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x2f8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x32ca5cf",
+ "blockHash": "0xcb51fdebc936f135546a0ff78a7ce246aee0a5c73b41b7accdc547825bb97766",
+ "transactions": [
+ "0x02f86d870c72dd9d5e883e3d0184032ca5d08252089472dfcfb0c470ac255cde83fb8fe38de8a128188e0180c080a0116da1fc19daf120ddc2cc3fa0a834f9c176028e65d5f5d4c86834a0b4fe2a36a017001c3ad456650dd1b28c12f41c94f50b4571da5b62e9f2a95dff4c8c3f61fd"
+ ],
+ "withdrawals": null,
+ "blobGasUsed": null,
+ "excessBlobGas": null
+ }
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np77",
+ "method": "engine_newPayloadV1",
+ "params": [
+ {
+ "parentHash": "0xcb51fdebc936f135546a0ff78a7ce246aee0a5c73b41b7accdc547825bb97766",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3b8d17721b733ce2b6e7607a69fb6bf678dbabcb708f64cb5d211915b3238090",
+ "receiptsRoot": "0xabc882591cb5b81b276a4e5cd873e1be7e1b4a69f630d2127f06d63c8db5acb2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x4d",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146e8",
+ "timestamp": "0x302",
+ "extraData": "0x",
+ "baseFeePerGas": "0x2c71f92",
+ "blockHash": "0x49b74bc0dea88f3125f95f1eb9c0503e90440f7f23b362c4f66269a14a2dcc3e",
+ "transactions": [
+ "0xf8853e8402c71f93830146e88080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a00cb7fb1bba811ea1948e035550c66840f0491d29d0ae9a6e4726e77a57ca8058a041523fc7133a6473784720a68d7f7f1d54d8a5a1f868640783a0284fb22f4309"
+ ],
+ "withdrawals": null,
+ "blobGasUsed": null,
+ "excessBlobGas": null
+ }
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np78",
+ "method": "engine_newPayloadV2",
+ "params": [
+ {
+ "parentHash": "0x49b74bc0dea88f3125f95f1eb9c0503e90440f7f23b362c4f66269a14a2dcc3e",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf21b9b380d6c5833270617a17ea187e1f85a6556f1c1dfaf6bcb0700c88abe24",
+ "receiptsRoot": "0xb08f0ccb7116304320035e77c514c9234f2d5a916d68de82ba20f0a24ab6d9e4",
+ "logsBloom": "0x00000000000000400000000000200000000000000000000000000000000000000000200010000000000000000000000000000040000400000010000000000020000000000000000000000000000000000000000000000000000000900000000000800000000800000010000008000000000000000000000102000000000000100000080000000100000000000000000000000000000008000000000000008000800800000000000000000000400000000008200000000200200000000000000000000000000000200000000000000000000000000000000000000000000000000000000011000000000000800000000000000000000000000000000000000008",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x4e",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x30c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x26e6e24",
+ "blockHash": "0x157062b78da942ff0b0e892142e8230ffdf9330f60c5f82c2d66291a6472fd7c",
+ "transactions": [
+ "0xf87c3f84026e6e2583011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0fa1ba7a3639ec15944466d72a2e972d5eda143fc54f07aa47ecd56769ba5fbf8a041018f9af7a55685cbfa25d35f353e4bccef32a5e0bcdb373191d34cfed9a8db"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": null,
+ "excessBlobGas": null
+ }
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np79",
+ "method": "engine_newPayloadV2",
+ "params": [
+ {
+ "parentHash": "0x157062b78da942ff0b0e892142e8230ffdf9330f60c5f82c2d66291a6472fd7c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x8bb2c279cf46bd7eb856cc00fdce9bb396b21f65da47fdf0f13b41e0c0e0aa7f",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x4f",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x316",
+ "extraData": "0x",
+ "baseFeePerGas": "0x220c283",
+ "blockHash": "0x39a05d1b50f4334060d2b37724df159784c5cbfe1a679f3b99d9f725aed4d619",
+ "transactions": [
+ "0xf86740840220c2848302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0bcd36ef6498fd3ce093febc53b3e35004a9d9200816306515f5ffad98140426fa00656b7e75310845c1d2e47495ed7765d687f0a943a604644d9cf7b97b01f300f"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": null,
+ "excessBlobGas": null
+ }
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np80",
+ "method": "engine_newPayloadV2",
+ "params": [
+ {
+ "parentHash": "0x39a05d1b50f4334060d2b37724df159784c5cbfe1a679f3b99d9f725aed4d619",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x62b57c9d164c28bc924ec89b1fe49adc736ee45e171f759f697899a766e3f7a4",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x50",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x320",
+ "extraData": "0x",
+ "baseFeePerGas": "0x1dce188",
+ "blockHash": "0xa7806a3f4d0f3d523bf65b89164372b524c897688d22d2ef2e218f7abb9cbddb",
+ "transactions": [
+ "0xf869418401dce189825208945c62e091b8c0565f1bafad0dad5934276143ae2c01808718e5bb3abd10a0a0b82a5be85322581d1e611c5871123983563adb99e97980574d63257ab98807d59fdd49901bf0b0077d71c9922c4bd8449a78e2918c6d183a6653be9aaa334148"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": null,
+ "excessBlobGas": null
+ }
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np81",
+ "method": "engine_newPayloadV2",
+ "params": [
+ {
+ "parentHash": "0xa7806a3f4d0f3d523bf65b89164372b524c897688d22d2ef2e218f7abb9cbddb",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x1820989c0844509c8b60af1baa9030bdcc357bc9462b8612493af9d17c76eb3d",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x51",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x32a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x1a14dd8",
+ "blockHash": "0x7ec45b0f5667acb560d6e0fee704bb74f7738deb2711e5f380e4a9b2528d29c1",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x0",
+ "validatorIndex": "0x5",
+ "address": "0x4ae81572f06e1b88fd5ced7a1a000945432e83e1",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": null,
+ "excessBlobGas": null
+ }
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np82",
+ "method": "engine_newPayloadV2",
+ "params": [
+ {
+ "parentHash": "0x7ec45b0f5667acb560d6e0fee704bb74f7738deb2711e5f380e4a9b2528d29c1",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x8145365a52eb3a4b608966d28a8ed05598c13af426c7ab24f28f2bdc7a00b12b",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x52",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x334",
+ "extraData": "0x",
+ "baseFeePerGas": "0x16d241d",
+ "blockHash": "0x8dbcafaa0e32cd9f71f1d5b0f22f549aee0fddce3bda577ac200e24c7dc8ba62",
+ "transactions": [
+ "0xf8854284016d241e830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a061c5ecaf5f73e89370f5b35c31bce60d04c7417cc70cc897beae6429cb6d3880a02271644378271ec296459da5181507d52bdbd4489600690c32998cdb4b032042"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": null,
+ "excessBlobGas": null
+ }
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np83",
+ "method": "engine_newPayloadV2",
+ "params": [
+ {
+ "parentHash": "0x8dbcafaa0e32cd9f71f1d5b0f22f549aee0fddce3bda577ac200e24c7dc8ba62",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x07cc0bca2e8f3b243635dc6f988372dd2427b6090f1035d06f2eff2e99315170",
+ "receiptsRoot": "0xace7ae7e3c226cecca4b33082b19cd1023960138a576ef77fddadcc223b4250a",
+ "logsBloom": "0x40000010010000000000000100000c00000001000000000000000000000000000000000200000000000042000000000000001000000000000000000000000000000000000000000000000820040000800000000000004000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000001000800000001000000000000000000000000000000000000000004000004000000000000000410000000000000000000000040000000000000000004000000000000000000000000000400001000000000000000000400000000000000000000200080000000000000000000000010000000040000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x53",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x33e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x13f998a",
+ "blockHash": "0x686c223412a42d17a7fe0fe2a8b15d6181afa366cccd26a0b35a7581c0686721",
+ "transactions": [
+ "0xf87c4384013f998b83011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a01001f6f02c9dac33915eb5d0fe81d88599a29341d84ee6f46b1ef05d270a0c1fa05ea1dbc664d9f4a83b4743bc40579e6b727ff8b5e78c4249bd59aa47c33d770f"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": null,
+ "excessBlobGas": null
+ }
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np84",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x686c223412a42d17a7fe0fe2a8b15d6181afa366cccd26a0b35a7581c0686721",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe1a71059650ccefaf7d0a407c43a87ccc9fe63a6369a46509074658f714c54ad",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x54",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x348",
+ "extraData": "0x",
+ "baseFeePerGas": "0x117b7e1",
+ "blockHash": "0x8a76d39e76bdf6ccf937b5253ae5c1db1bdc80ca64a71edccd41ba0c35b17b84",
+ "transactions": [
+ "0xf86744840117b7e28302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0b4a7e6c791f457a428f870b8df8ee0148acac74050aeea658c3dad552a7e8140a0793951ba22a6f628dd86ec8964b09c74e0f77306a28dd276dfe42f40ee76c73c"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x83472eda6eb475906aeeb7f09e757ba9f6663b9f6a5bf8611d6306f677f67ebd"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np85",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x8a76d39e76bdf6ccf937b5253ae5c1db1bdc80ca64a71edccd41ba0c35b17b84",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x198575d6df4370febe3a96865e4a2280a5caa2f7bd55058b27ea5f3082db8d99",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x55",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x352",
+ "extraData": "0x",
+ "baseFeePerGas": "0xf4dd4f",
+ "blockHash": "0xc0d03736d9e3c2d4e14115f9702497daf53b39875122e51932f4b9b752ba7059",
+ "transactions": [
+ "0x02f86c870c72dd9d5e883e450183f4dd5082520894a25513c7e0f6eaa80a3337ee18081b9e2ed09e000180c080a0e8ac7cb5028b3e20e8fc1ec90520dab2be89c8f50f4a14e315f6aa2229d33ce8a07c2504ac2e5b2fe4d430db81a923f6cc2d73b8fd71281d9f4e75ee9fc18759b9"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x2c809fbc7e3991c8ab560d1431fa8b6f25be4ab50977f0294dfeca9677866b6e"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np86",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xc0d03736d9e3c2d4e14115f9702497daf53b39875122e51932f4b9b752ba7059",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x90c402a8569aae0c095540a9762aefac4f43df4e97fc7a24df1d4051c555bc2c",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x56",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x35c",
+ "extraData": "0x",
+ "baseFeePerGas": "0xd64603",
+ "blockHash": "0xa7323a02aa9acf63f26368292292d4bcb9dc7ef33296bbd98f423b24db3408bd",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x1",
+ "validatorIndex": "0x5",
+ "address": "0xde5a6f78116eca62d7fc5ce159d23ae6b889b365",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x756e335a8778f6aadb2cc18c5bc68892da05a4d8b458eee5ce3335a024000c67"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np87",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa7323a02aa9acf63f26368292292d4bcb9dc7ef33296bbd98f423b24db3408bd",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x7e1765cf5abdf835814ee20c9e401b0e99e2b31f2ad8ea14c62ef732c6e63d2d",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x57",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x366",
+ "extraData": "0x",
+ "baseFeePerGas": "0xbb7d43",
+ "blockHash": "0xbbd89c9c2805888d9d1397d066495db1ce1c570e23b5b6f853dc0ff698575a04",
+ "transactions": [
+ "0xf8844683bb7d44830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a052c928a2062b214d44b9a641faf87e439fbc5a07f571021f0f3c8fd2a2087a57a0650c77ab1cd522a7d3a435058f53636b6ae86d19fd4f691bf61c13fd8b7de69a"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4b118bd31ed2c4eeb81dc9e3919e9989994333fe36f147c2930f12c53f0d3c78"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np88",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xbbd89c9c2805888d9d1397d066495db1ce1c570e23b5b6f853dc0ff698575a04",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3ec8183c28814317cb7a7b86633041db40de94b45a47dab5614b21087c308648",
+ "receiptsRoot": "0xe2e7a47b1c0009f35c3a46c96e604a459822fe9f02929afa823f2c514f1fbd39",
+ "logsBloom": "0x00000000000000000000000000000002000000000000000000000000000000000000000800000000000000000000000200000000008000000000000000000000000000000800000000000000800000000000000000000002000000000100000000000000000000000000000000000000001000000000400000000000000000000000000000000001000000000000000000000000000000000000000000000020000000000000400000000000000100000000000100000000000000000000100200000000000000000000000000000010400000000000000050080004000000400000000010000000800030001000000000000000004000000000000000000a00",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x58",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x370",
+ "extraData": "0x",
+ "baseFeePerGas": "0xa41aed",
+ "blockHash": "0xe67371f91330dd937081250eeda098394453c2ced0b6ffd31a67f8d95261d849",
+ "transactions": [
+ "0xf87b4783a41aee83011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa09799e22509fcf203235570e7ba0df80bad6124b89b812146b50bca27f03161a9a0118a4f264815d7cf1a069009bff736f04369e19e364bd1a409a4c4865ec7d81f"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xd0122166752d729620d41114ff5a94d36e5d3e01b449c23844900c023d1650a5"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np89",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe67371f91330dd937081250eeda098394453c2ced0b6ffd31a67f8d95261d849",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x07118ca8999c49a924f92b54d21cecad7cbcc27401d16181bbcdee05b613399c",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x59",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x37a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x8fa090",
+ "blockHash": "0x395eda9767326b57bbab88abee96eea91286c412a7297bedc3f1956f56db8b18",
+ "transactions": [
+ "0xf86648838fa0918302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0fd5a86a96cbf94d2bba5c7fb6efd2bf501dd30c8b37e896ae360b40ab693272aa0331e570a5b3ce2cef67731c331bba3e6de2ede8145dd0719ce6dfcca587c64ba"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x60c606c4c44709ac87b367f42d2453744639fc5bee099a11f170de98408c8089"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np90",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x395eda9767326b57bbab88abee96eea91286c412a7297bedc3f1956f56db8b18",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x0d9d080dde44cc511dc9dc457b9839409e1b3a186e6b9a5ae642b5354acc6cc4",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x5a",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x384",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7dbb15",
+ "blockHash": "0x919c92e04181d139a4860cce64252ab9c14a5be9fa6adfc76b4b27f804fce2b9",
+ "transactions": [
+ "0xf86949837dbb1682520894bbeebd879e1dff6918546dc0c179fdde505f2a2101808718e5bb3abd10a0a002f0119acaae03520f87748a1a855d0ef7ac4d5d1961d8f72f42734b5316a849a0182ad3a9efddba6be75007e91afe800869a18a36a11feee4743dde2ab6cc54d9"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x6ee04e1c27edad89a8e5a2253e4d9cca06e4f57d063ed4fe7cc1c478bb57eeca"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np91",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x919c92e04181d139a4860cce64252ab9c14a5be9fa6adfc76b4b27f804fce2b9",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa5aea2e2c617a5a3a341e01c72fbf960e809dd589b4a988a04d50f6fb666b6c8",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x5b",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x38e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x6e05f1",
+ "blockHash": "0x17a574ee7489840acc4a8aecd1d7b540ba9b033b7236c13d0b0a5403ff07f7f3",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x2",
+ "validatorIndex": "0x5",
+ "address": "0x245843abef9e72e7efac30138a994bf6301e7e1d",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x36616354a17658eb3c3e8e5adda6253660e3744cb8b213006f04302b723749a8"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np92",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x17a574ee7489840acc4a8aecd1d7b540ba9b033b7236c13d0b0a5403ff07f7f3",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd1e927e1a7106591aa46d3e327e9e7d493248786b4c6284bd138d329c6cb1fbb",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x5c",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x398",
+ "extraData": "0x",
+ "baseFeePerGas": "0x604533",
+ "blockHash": "0x7848fe02daea45d47101fbe84b6d94576452c2d0cb9261bc346343b5b2df844f",
+ "transactions": [
+ "0xf8844a83604534830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0667955bfddc6500ad6a0a298d08a0fdeb453d483be41f7496f557039c99d5b8ea06ad5f6871f3d78ea543484d51590454f8a65b5b1b89f58992ff94a02a30c0c93"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc13802d4378dcb9c616f0c60ea0edd90e6c2dacf61f39ca06add0eaa67473b94"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np93",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x7848fe02daea45d47101fbe84b6d94576452c2d0cb9261bc346343b5b2df844f",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x8d4e68f0a1ad7578b1627d665263c04856efa4eb4938014a8c794547d597f89b",
+ "receiptsRoot": "0xa37a62134a71ef21b16f2eee431b806a4d13c0a80a11ddeb5cbb18e3707aecdf",
+ "logsBloom": "0x00000000000000000000000002000000000021000000000000000000240000000000000000000000000004000000010000000000000000000000000000000000000008000000000000000000000000000020000000000000000400000400000000000400000000000000000000000000000000000080000004000000000000000000000000000800000000000000000000000000000000000000000000002000000080000002010000420000000000000000000000000040402002000200000000000000000000000000008000000000000000000000000100000000000000000000000000000000000084000000000080000000000000000000040000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x5d",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x3a2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x544364",
+ "blockHash": "0x6c5d29870c54d8c4e318523a7ea7fb9756b6633bbdf70dcb1e4659ff3564615b",
+ "transactions": [
+ "0xf87b4b8354436583011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a09662003f67b0c146ecaa0c074b010d1f27d0803dc1809fd4f6ea80a5f09c34aea0100a5c0fbfdbee733f1baecb893a33ce2d42316303a5ddf1515645dfbb40d103"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x8b345497936c51d077f414534be3f70472e4df101dee8820eaaff91a6624557b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np94",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x6c5d29870c54d8c4e318523a7ea7fb9756b6633bbdf70dcb1e4659ff3564615b",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xbd07ab096fc1b3e50229bcff0fc5fca9e9f7d368e77fe43a71e468b7b0adb133",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x5e",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x3ac",
+ "extraData": "0x",
+ "baseFeePerGas": "0x49bf97",
+ "blockHash": "0xe7b8c1ca432a521b1e7f0cf3cb63be25da67e3364cc0b02b0a28e06ba8deed80",
+ "transactions": [
+ "0xf8664c8349bf988302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa03b3113a7b1919311fbc03ee25c4829b60f07341c72107de061da06eef7ec0856a01bc4eeb29301e1610984ee042f8236863ad78402d3d55c69a6922d67238dde75"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe958485d4b3e47b38014cc4eaeb75f13228072e7b362a56fc3ffe10155882629"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np95",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe7b8c1ca432a521b1e7f0cf3cb63be25da67e3364cc0b02b0a28e06ba8deed80",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x4a154c665e5b68adadf9455bd905da607f0279b5d2b4bfb0c1a3db5b6a908d4d",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x5f",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x3b6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x408f22",
+ "blockHash": "0xaa62b2faefe50fe1562f3fb5bf96a765ca7c92164465e226fc9a8ba75cabc387",
+ "transactions": [
+ "0x02f86c870c72dd9d5e883e4d0183408f2382520894d2e2adf7177b7a8afddbc12d1634cf23ea1a71020180c001a08556dcfea479b34675db3fe08e29486fe719c2b22f6b0c1741ecbbdce4575cc6a01cd48009ccafd6b9f1290bbe2ceea268f94101d1d322c787018423ebcbc87ab4"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x3346706b38a2331556153113383581bc6f66f209fdef502f9fc9b6daf6ea555e"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np96",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xaa62b2faefe50fe1562f3fb5bf96a765ca7c92164465e226fc9a8ba75cabc387",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3b2adb11488a7634a20bc6f81bcc0211993fe790f75eeb1f4889a98d1bdbcb37",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x60",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x3c0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x387e65",
+ "blockHash": "0x6a6df67e09c4411bb89664cbc78f78237bb6a2fc299bc6a682cca406feb8dd4d",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x3",
+ "validatorIndex": "0x5",
+ "address": "0x8d33f520a3c4cef80d2453aef81b612bfe1cb44c",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x346910f7e777c596be32f0dcf46ccfda2efe8d6c5d3abbfe0f76dba7437f5dad"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np97",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x6a6df67e09c4411bb89664cbc78f78237bb6a2fc299bc6a682cca406feb8dd4d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd67c810501ca4f4ee4262e86dcaf793ca75637249bf157dee4800274372f236f",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x61",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x3ca",
+ "extraData": "0x",
+ "baseFeePerGas": "0x316e99",
+ "blockHash": "0xfec8ebc1c3d312ec3537d860b406110aeac3980763165d0026ecab156a377bdf",
+ "transactions": [
+ "0xf8844e83316e9a830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a036b2adb5bbd4d43198587067bf0b669e00862b0807adb947ee4c9869d79f9d8ca063e0b200645435853dceed29fd3b4c55d94b868a0aa6513ca6bd730705f2c9ef"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe62a7bd9263534b752176d1ff1d428fcc370a3b176c4a6312b6016c2d5f8d546"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np98",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xfec8ebc1c3d312ec3537d860b406110aeac3980763165d0026ecab156a377bdf",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xae82dda9df38bcc8d99e311b63ae055591953577b6b560840658eca24ecacee9",
+ "receiptsRoot": "0x675ab823f90b9bdd3d04afb108bc1a1dcd77654a0de4c8a539e355b6d24f29f4",
+ "logsBloom": "0x10000000000000000010000000000020000000000008000000000000000000000000000000000000000000020000000000000000000000000000040000010000000000000000000000000000000000000000000000008000000000000000000000000080000110000000000800000002000000800040800000000040000000000000004000000000001000000000000000000000000000000000008000000000000000000000000000000020010080001000000000000000000000000004008000004000008000000000000000040000000400000000000001000000000000000000000008000000000000000000000200000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x62",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x3d4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x2b4449",
+ "blockHash": "0x3124d842afa1334bb72f0a8f058d7d3ad489d6c6bd684f81d3ecdf71d287f517",
+ "transactions": [
+ "0xf87b4f832b444a83011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0824522ae97a912dd75a883798f4f296d960f6a7be8510e2a4a121d85f496da16a008cade93390e31f7b0e6615b4defe3bd4225b7a4d97a7835c02ad0b4d004fb5b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xffe267d11268388fd0426a627dedddeb075d68327df9172c0445cd2979ec7e4d"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np99",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x3124d842afa1334bb72f0a8f058d7d3ad489d6c6bd684f81d3ecdf71d287f517",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x588419f24b32499745bbae81eb1a303d563c31b2743c8621d39b820c2affb3cb",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x63",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x3de",
+ "extraData": "0x",
+ "baseFeePerGas": "0x25de20",
+ "blockHash": "0x53d785a42c58a40edbc18e6bee93d4072a4281c744f697f9b5cae1d0b3bf2962",
+ "transactions": [
+ "0xf866508325de218302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0744b7f5fb26cc6dd16b1849d0c04236e3b4e993f37e5b91de6e55f5f899450baa0456225c91372bddd4e3a1dde449e59ad62d63f0c850f9b869870ea2621494fd7"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x23cc648c9cd82c08214882b7e28e026d6eb56920f90f64731bb09b6acf515427"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np100",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x53d785a42c58a40edbc18e6bee93d4072a4281c744f697f9b5cae1d0b3bf2962",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xfee7a27147c7984caec35dc4cee4f3a38fee046e5d8f17ce7ec82b982decd9aa",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x64",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x3e8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x212635",
+ "blockHash": "0x96d2a59527aa149efe64eef6b2fbf4722c9c833aba48e0c7cb0cb4033fa1af5e",
+ "transactions": [
+ "0xf86951832126368252089418ac3e7343f016890c510e93f935261169d9e3f501808718e5bb3abd10a0a099aba91f70df4d53679a578ed17e955f944dc96c7c449506b577ac1288dac6d4a0582c7577f2343dd5a7c7892e723e98122227fca8486debd9a43cd86f65d4448a"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x47c896f5986ec29f58ec60eec56ed176910779e9fc9cf45c3c090126aeb21acd"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np101",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x96d2a59527aa149efe64eef6b2fbf4722c9c833aba48e0c7cb0cb4033fa1af5e",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xb1600603ea31446c716fece48a379fb946eab40182133a8032914e868bb4929e",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x65",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x3f2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x1d0206",
+ "blockHash": "0xf2750d7772a6dcdcad79562ddf2dee24c1c2b7862905024a8468adfb62f8ef14",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x4",
+ "validatorIndex": "0x5",
+ "address": "0x3f79bb7b435b05321651daefd374cdc681dc06fa",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x6d19894928a3ab44077bb85dcb47e0865ce1c4c187bba26bad059aa774c03cfe"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np102",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xf2750d7772a6dcdcad79562ddf2dee24c1c2b7862905024a8468adfb62f8ef14",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd3908889240ecc36175f7ac23e9596230ea200b98ee9c9ca078154288b69c637",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x66",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x3fc",
+ "extraData": "0x",
+ "baseFeePerGas": "0x1961c6",
+ "blockHash": "0x57054aa8d635c98b3b71d24e11e22e9235bc384995b7b7b4acd5ca271d0898b4",
+ "transactions": [
+ "0xf88452831961c7830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a0c43b4e8ddaecaadfc1fd4b35659ced2bbaa2ab24b1cff975685cd35f486a723fa056a91d2ff05b4eae02ee1d87442ec57759e66ec13bfd3ea2655cf4f04b6e863d"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xefc50f4fc1430b6d5d043065201692a4a02252fef0699394631f5213a5667547"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np103",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x57054aa8d635c98b3b71d24e11e22e9235bc384995b7b7b4acd5ca271d0898b4",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd66957c43447a6edfb6b9bc9c4e985f28c24e6ce3253c68e5937c31c5d376f94",
+ "receiptsRoot": "0xd99d12e61c8e9be69f1eb49cea2f72664c7e569463415b064954bf5e0dbc6a01",
+ "logsBloom": "0x00000000000000000000100000000000200000000000000000200000000000000000000000040000000000200000000000000000000000000200000000000000000018000000000000000000010000000000000000000000000000000000100000000000000000000000000000000000000000000000000000800200000000021000000000002000000000002088400000000000000000000000000000000000000000000000000000000010000000000800000080000000000000000000000008000000000000000020000100001000000000080000002000400000000400000000000000002200000000000000000000000000000000000000000020000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x67",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x406",
+ "extraData": "0x",
+ "baseFeePerGas": "0x16375b",
+ "blockHash": "0xf4f1f726bcb9a3db29481be3a2e00c6ab4bf594ae85927414540ec9ede649d4d",
+ "transactions": [
+ "0xf87b538316375c83011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0e59d36f30ed2dfc5eb71433457547f63bf4ad98e0a2181c4373a5e7ddf04d17ea06dce4f88f48f6fd93c2c834537a8baef27bb2965b9e2ce68dc437adb3d657d28"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x3cc9f65fc1f46927eb46fbf6d14bc94af078fe8ff982a984bdd117152cd1549f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np104",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xf4f1f726bcb9a3db29481be3a2e00c6ab4bf594ae85927414540ec9ede649d4d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe06685d528d0c69051bcf8a6776d6c96c1f1c203da29851979c037be2faac486",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x68",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x410",
+ "extraData": "0x",
+ "baseFeePerGas": "0x1371a8",
+ "blockHash": "0xc8fe6583a2370fa9bda247532a8fb7845fceea9b54c9e81cda787947bb0ad41d",
+ "transactions": [
+ "0xf86654831371a98302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0a427e65413948a8a1cf63c15214525d05bffca4667149c6a4019513defe57e6ba02819aa7d6a404a7f0194ef3ba7ec45b876f4226b278ebbcfa4012a90a1af3905"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x63eb547e9325bc34fbbbdfda327a71dc929fd8ab6509795e56479e95dbd40a80"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np105",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xc8fe6583a2370fa9bda247532a8fb7845fceea9b54c9e81cda787947bb0ad41d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x32d5d07d12d91b8b4392872b740f46492fea678e9f5dc334c21101767bd54833",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x69",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x41a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x11056d",
+ "blockHash": "0xb30b266de816c61ef16e4abfc94fbed8b4032710f4275407df2bf716a1f0bbd7",
+ "transactions": [
+ "0x02f86c870c72dd9d5e883e55018311056e82520894de7d1b721a1e0632b7cf04edf5032c8ecffa9f9a0180c080a02a6c70afb68bff0d4e452f17042700e1ea43c10fc75e55d842344c1eb55e2e97a027c64f6f48cfa60dc47bfb2063f9f742a0a4f284d6b65cb394871caca2928cde"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x67317288cf707b0325748c7947e2dda5e8b41e45e62330d00d80e9be403e5c4c"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np106",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb30b266de816c61ef16e4abfc94fbed8b4032710f4275407df2bf716a1f0bbd7",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf89d6d5f7a16d98062e1ef668ee9a1819b0634bd768ece2fc2b687f8968dc373",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x6a",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x424",
+ "extraData": "0x",
+ "baseFeePerGas": "0xee50e",
+ "blockHash": "0x35221530b572a05628d99d8ca9434287c581e30473f83d612cbbfb7f394c587b",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x5",
+ "validatorIndex": "0x5",
+ "address": "0x189f40034be7a199f1fa9891668ee3ab6049f82d",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x7fc37e0d22626f96f345b05516c8a3676b9e1de01d354e5eb9524f6776966885"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np107",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x35221530b572a05628d99d8ca9434287c581e30473f83d612cbbfb7f394c587b",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xaf4107a57da519d24d0c0e3ae6a5c81f3958ddc49e3f1c2792154b47d58d79a1",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x6b",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x42e",
+ "extraData": "0x",
+ "baseFeePerGas": "0xd086d",
+ "blockHash": "0xe3981baf40fc5dac54055fab95177a854a37ff2627208247697d5627b8ae3c35",
+ "transactions": [
+ "0xf88456830d086e830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a04c088a3642c3cfad977a0927e6d694bd26be96246f127f03d37fe2b494b99da2a00ef5b6e7aca1ac95ef964978a7ec4bb66688fbb7abace43f90f0c344196379e5"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc8c5ffb6f192e9bda046ecd4ebb995af53c9dd6040f4ba8d8db9292c1310e43f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np108",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe3981baf40fc5dac54055fab95177a854a37ff2627208247697d5627b8ae3c35",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x9afc46d870489ac06cac1ea0b65c417d8e0086f0fb828dd92dca30da737c827b",
+ "receiptsRoot": "0x9b9c6d15a59d6b1c222cc63abe6aa28d734463877a3c34d4b3d9e80b768b77aa",
+ "logsBloom": "0x00000000000000000000000000000080000000000002000000000002000000000000004000000000000000000000010000000000000000000000000000000000000400000000000000100000000000000000200000000000000000000200000000000000000008000010000000000000000080000000000200000008000400000000000000000400000000000000000008000000001000000001000000000000000000000000008000000200000000000000000008400000000000000000000000001000000000000000000000001000010000000020000000040000000000000000000000000000000200080000000000000000000000040000000200000400",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x6c",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x438",
+ "extraData": "0x",
+ "baseFeePerGas": "0xb684d",
+ "blockHash": "0x54fcc3af800dbeae5c45ac8acba05313bd8d4c1bb06502702a14a225259367aa",
+ "transactions": [
+ "0xf87b57830b684e83011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a06789a9252207970001fd703c22b2b7e5c0388bf018bc070a0469129f80cc5d63a048de0e437b02a8dd3a783892ad1691a1062cd73ddd35c481d9632f5158650317"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe40a9cfd9babe862d482ca0c07c0a4086641d16c066620cb048c6e673c5a4f91"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np109",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x54fcc3af800dbeae5c45ac8acba05313bd8d4c1bb06502702a14a225259367aa",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x02324f55d0548cb8743857fe938f91e6f15bfbe94654aadde56c59f83083980a",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x6d",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x442",
+ "extraData": "0x",
+ "baseFeePerGas": "0x9fbe4",
+ "blockHash": "0x62bb35defc0aac7bfbe789de02062f7ac622e9e354cfea5dceeccb792a61bae3",
+ "transactions": [
+ "0xf866588309fbe58302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa07e3ef87807ccd797a0020fade1b7d65a7b190fbe40a6f8bdc35cd6a3a6fbed73a0283ad99e27eb389ca3b389bce3c29b3c711b74b6ecd05b290c7be33389830fab"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe82e7cff48aea45fb3f7b199b0b173497bf4c5ea66ff840e2ec618d7eb3d7470"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np110",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x62bb35defc0aac7bfbe789de02062f7ac622e9e354cfea5dceeccb792a61bae3",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x9932915761c4c894fc50819df189e875d3b025a7c045406fe415abe61d0e3086",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x6e",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x44c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x8bd6c",
+ "blockHash": "0x2c4731fbb4f4adae94723c078548c510649e8973dfdb229fd6031b1b06eb75c0",
+ "transactions": [
+ "0xf869598308bd6d825208941b16b1df538ba12dc3f97edbb85caa7050d46c1401808718e5bb3abd109fa0abbde17fddcc6495e854f86ae50052db04671ae3b6f502d45ba1363ae68ee62ca03aa20e294b56797a930e48eda73a4b036b0d9389893806f65af26b05f303100f"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x84ceda57767ea709da7ab17897a70da1868c9670931da38f2438519a5249534d"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np111",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x2c4731fbb4f4adae94723c078548c510649e8973dfdb229fd6031b1b06eb75c0",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x2849b35fb3ec8146f637be768e3eaefda559928f8bb35753584d5b326a400ff5",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x6f",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x456",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7a5e7",
+ "blockHash": "0x76b385d3f8a4b6e66ea8c246ed7c6275ad164d028ec5a986f9524bfe7437dcc7",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x6",
+ "validatorIndex": "0x5",
+ "address": "0x65c74c15a686187bb6bbf9958f494fc6b8006803",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe9dcf640383969359c944cff24b75f71740627f596110ee8568fa09f9a06db1c"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np112",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x76b385d3f8a4b6e66ea8c246ed7c6275ad164d028ec5a986f9524bfe7437dcc7",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x2f24b6182543c677e7d1cab81bc020033c64e034571a20ecd632e252c8f202b3",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x70",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x460",
+ "extraData": "0x",
+ "baseFeePerGas": "0x6b12b",
+ "blockHash": "0x33385ec44cfd01ba27c927a3ebe607a27e55fd8e89965af09b991a7cdc127dbc",
+ "transactions": [
+ "0xf8845a8306b12c830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0bf8a8863f63a16d43652b12e54dc61bd71c8ab86d88aebb756c6e420fca56a1aa01f62e0032c57f1629ee82b4fefb8d6c59a85c5c2889b1671ce0713581e773b6e"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x430ef678bb92f1af44dcd77af9c5b59fb87d0fc4a09901a54398ad5b7e19a8f4"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np113",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x33385ec44cfd01ba27c927a3ebe607a27e55fd8e89965af09b991a7cdc127dbc",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6d6c9c24ef7d93db6ba57324fb6f3604b09611301e12d250162c2b2b50871625",
+ "receiptsRoot": "0x257c29f688aaf63db2244378182225d104d84cfbd188c82b92323623d11574e9",
+ "logsBloom": "0x00000000000000000000080040000000000000000000000000008000000000000000000000000000000000000001000000000000000000000040000000040010000100000000000000400000000000000000020000000000000000800000000400000000000000000000000040000000000002000100400000000000000200000000000000000000000008000000010000000000000800000000000000000000000080000000000000000000000000000000080400000000000000000000400000000000010000000004000000000000000000000010020000000000000000000000000000000100000000040000000000000000000000200000001800000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x71",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x46a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x5db80",
+ "blockHash": "0x66ad7aaacf3efede70dda0c82629af2046e67b96713cf3cf02a9a2613ca25b6f",
+ "transactions": [
+ "0xf87b5b8305db8183011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0f893fcd21c2a882bc3968ea3c41dd37a8dbfbf07a34a8694a49fdd8081996e25a0502578b516e04b1939fdad45fd0688e636d57f59826a8e252b63f496b919d91c"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf7af0b8b729cd17b7826259bc183b196dbd318bd7229d5e8085bf4849c0b12bf"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np114",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x66ad7aaacf3efede70dda0c82629af2046e67b96713cf3cf02a9a2613ca25b6f",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x61c50266ae62e14edea48c9238f79f6369fd44e7f3d6519c7139aa1e87ee13ba",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x72",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x474",
+ "extraData": "0x",
+ "baseFeePerGas": "0x52063",
+ "blockHash": "0x00fd70a53be9c85c986d3dd87f46e079e4ce4a4a3dd95c1e497457c50bacbe2d",
+ "transactions": [
+ "0xf8665c830520648302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0961de3e3657fdc49c722cc23de35eaf41de51c3aab3ca9a09b3d358fc19195aca060ee48b2fad3f3798111a93038fcb5c9c9791daf3c6acbaf70134fd182b5c663"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe134e19217f1b4c7e11f193561056303a1f67b69dac96ff79a6d0aafa994f7cb"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np115",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x00fd70a53be9c85c986d3dd87f46e079e4ce4a4a3dd95c1e497457c50bacbe2d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x2bebf2f158ec1b8c7be21ef7c47c63fa5a3eb2292f409f365b40fa41bacb351e",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x73",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x47e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x47cdc",
+ "blockHash": "0xbb9f244470573774df6fca785d3e11e6bd1b896213cacd43cdfcb131f806ca4c",
+ "transactions": [
+ "0x02f86c870c72dd9d5e883e5d0183047cdd82520894043a718774c572bd8a25adbeb1bfcd5c0256ae110180c001a02ae4b3f6fa0e08145814f9e8da8305b9ca422e0da5508a7ae82e21f17d8c1196a077a6ea7a39bbfe93f6b43a48be83fa6f9363775a5bdb956c8d36d567216ea648"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x9cc58ab1a8cb0e983550e61f754aea1dd4f58ac6482a816dc50658de750de613"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np116",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xbb9f244470573774df6fca785d3e11e6bd1b896213cacd43cdfcb131f806ca4c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3b359e20c5966cdcbb7b0298480621892d43f8efa58488b3548d84cf2ee514c1",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x74",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x488",
+ "extraData": "0x",
+ "baseFeePerGas": "0x3ed55",
+ "blockHash": "0x6d18b9bca4ee00bd7dc6ec4eb269cd4ba0aceb83a12520e5b825b827cb875fd9",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x7",
+ "validatorIndex": "0x5",
+ "address": "0xe3b98a4da31a127d4bde6e43033f66ba274cab0e",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x79c2b067779a94fd3756070885fc8eab5e45033bde69ab17c0173d553df02978"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np117",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x6d18b9bca4ee00bd7dc6ec4eb269cd4ba0aceb83a12520e5b825b827cb875fd9",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x9776b87f7c94469bd3f80d7d9b639dace4981230bbb7c14df9326aafe66f3da4",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x75",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x492",
+ "extraData": "0x",
+ "baseFeePerGas": "0x36fab",
+ "blockHash": "0xcef84ea2c6fac4a2af80a594bbe5a40bf5f5285efe67fab7ceb858844c593ae9",
+ "transactions": [
+ "0xf8845e83036fac830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a08315d9fb30662071b05a4e38240e4b85b8e240c0c3e190f27ada50678236c6e7a00ee07dc873780f17ac9d0c7b3d434f89be92231cfca042ca5f23d3f3d7346861"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xd908ef75d05b895600d3f9938cb5259612c71223b68d30469ff657d61c6b1611"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np118",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xcef84ea2c6fac4a2af80a594bbe5a40bf5f5285efe67fab7ceb858844c593ae9",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xcd5cc668a3b28217e9fd05ddaea82d453a6a7394770a888b7d88013a4c9bcb22",
+ "receiptsRoot": "0xe35b2accd70b81901c8d0c931a12687e493a489ed7b82d78ade199815c466d5f",
+ "logsBloom": "0x0000000000000000000000000000000000000a00000000000000000000000000000000000000000000018000000000000000000000000000008000000000000048000000000000004000000000000000000008000000000000000000000020000000000000000002201010000000000000000400000000200000000000000000000000000000000000000000200000000000a200000001000000000000000000000000200000000000000000000400040000000000000000000000800000000000000000001800000000000802000000000000000000000080000000000000000000000000000000000000000000000000400000010800000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x76",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x49c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x301f5",
+ "blockHash": "0x7b65cb3becfab6b30f0d643095b11c6853a33ca064a272f1326adb74e876e305",
+ "transactions": [
+ "0xf87b5f830301f683011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0a3952a3372b48d4ef804b20a0ff5bbd5440156de3b71d37024356a3c1c5205d8a02ff03cae2dc449ca7ed7d25c91f99b17f0bafcdaf0ecc6e20bdeb80895c83e82"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe0d31906b7c46ac7f38478c0872d3c634f7113d54ef0b57ebfaf7f993959f5a3"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np119",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x7b65cb3becfab6b30f0d643095b11c6853a33ca064a272f1326adb74e876e305",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xdd592cc191ae4ba2be51a47d5056c2f0ba8799c74445ea3f294e0fc95a973f16",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x77",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x4a6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x2a1e1",
+ "blockHash": "0x5d089bec3bbf3a0c83c7796afaa1ae4d21df034a3e33a6acb80e700e19bcaab0",
+ "transactions": [
+ "0xf866608302a1e28302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0fd1714b8a15fa8a4e3ffe824632ec26f1daa6ce681e92845d1c1dfe60f032b4ea074bd5a60859bd735bbc70c9531a3ff48421f5c3b87e144406ee37ef78b8fda37"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x2318f5c5e6865200ad890e0a8db21c780a226bec0b2e29af1cb3a0d9b40196ae"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np120",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x5d089bec3bbf3a0c83c7796afaa1ae4d21df034a3e33a6acb80e700e19bcaab0",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x4b5122bd4713cd58711f405c4bd9a0e924347ffce532693cce1dd51f36094676",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x78",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x4b0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x24dea",
+ "blockHash": "0x02c9511703f78db34f67541d80704165d8a698726ef2cbcfbdc257bcf51594dd",
+ "transactions": [
+ "0xf8696183024deb825208942d711642b726b04401627ca9fbac32f5c8530fb101808718e5bb3abd109fa0b4d70622cd8182ff705beb3dfa5ffa4b8c9e4b6ad5ad00a14613e28b076443f6a0676eb97410d3d70cfa78513f5ac156b9797abbecc7a8c69df814135947dc7d42"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x523997f8d8fed954658f547954fdeceab818b411862647f2b61a3619f6a4d4bc"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np121",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x02c9511703f78db34f67541d80704165d8a698726ef2cbcfbdc257bcf51594dd",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x18484e0a8e7bcccf7fbf4f6c7e1eff4b4a8c5b5e0ba7c2f2b27da315a0a06f97",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x79",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x4ba",
+ "extraData": "0x",
+ "baseFeePerGas": "0x20438",
+ "blockHash": "0x1edbbce4143b5cb30e707564f7ada75afe632e72b13d7de14224e3ed0044a403",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x8",
+ "validatorIndex": "0x5",
+ "address": "0xa1fce4363854ff888cff4b8e7875d600c2682390",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xbe3396540ea36c6928cccdcfe6c669666edbbbcd4be5e703f59de0e3c2720da7"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np122",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x1edbbce4143b5cb30e707564f7ada75afe632e72b13d7de14224e3ed0044a403",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6c921d64a95659dd6c62a919f2df9da2fda7cb8ec519aeb3b50ffb4e635dc561",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x7a",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x4c4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x1c3b1",
+ "blockHash": "0x38e1ce2b062e29a9dbe5f29a5fc2b3c47bf2eed39c98d2b2689a2e01650e97ca",
+ "transactions": [
+ "0xf884628301c3b2830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a0f48d056f98b681d69f84fcde715c63b1669b11563164d7c17e03e5d3a4641a0fa010fce327ee99c5206995065cbb134d5458143a34cbc64b326476aeef47ae482a"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x2d3fcfd65d0a6881a2e8684d03c2aa27aee6176514d9f6d8ebb3b766f85e1039"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np123",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x38e1ce2b062e29a9dbe5f29a5fc2b3c47bf2eed39c98d2b2689a2e01650e97ca",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x09df4733053f80da4904bce8d847883472e20bc3b1378eb1579e2e3df44d3948",
+ "receiptsRoot": "0x03ecb1b96e21ef88b48a9f1a85a170bdb0406e26918c7b14b9602e6f9a7e6937",
+ "logsBloom": "0x00000004000000000000002000000000000000004000000000000000000000000000400000400000000000000000010000080000000024404000000000000000000000000000000800000000020000000001000100000080000000000000000000000000000800000000000000000000000014000000000000000000000000001000000000000002000000100000000000000000000000000000040000000000000000000000000000040000020000000000000000200000000000000000000000000000000000000000000480010000000000000000000000040000000000000000000000000008000000000000000020000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x7b",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x4ce",
+ "extraData": "0x",
+ "baseFeePerGas": "0x18b5b",
+ "blockHash": "0xda82bddbddc44bf3ce23eb1f6f94ae987861720b6b180176080919015b1e4e90",
+ "transactions": [
+ "0xf87b6383018b5c83011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0b223787310f8ba4f9271d98c8bfc4f7e926ced7773cab6b5c856fb4c43b6dad5a07d0edf043f5b767ffd513479a43cbdc3dcbd18f254e3eb11043d4d7aa4dd7445"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x7ce0d5c253a7f910cca7416e949ac04fdaec20a518ab6fcbe4a63d8b439a5cfc"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np124",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xda82bddbddc44bf3ce23eb1f6f94ae987861720b6b180176080919015b1e4e90",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x15da947afcb1ba68f9fe2328e500881a302de649bd7d37f6e969bf7ec1aca37d",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x7c",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x4d8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x15a06",
+ "blockHash": "0x8948407592d9c816f63c7194fa010c12115bee74e86c3b7d9e6ca30589830f21",
+ "transactions": [
+ "0xf8666483015a078302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa037c41575c8abba9465870babe53a436d036974edf6a9de15d40fff1b4cca7552a07e815124c036ad7c603e7faa56d1d9e517d60cee33c1e47122a303e42d59b6fa"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4da13d835ea44926ee13f34ce8fcd4b9d3dc65be0a351115cf404234c7fbd256"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np125",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x8948407592d9c816f63c7194fa010c12115bee74e86c3b7d9e6ca30589830f21",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa085ae940536d1e745cf78acd4001cb88fbc1e939151193c4e792cb659fe1aa0",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x7d",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x4e2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x12ee9",
+ "blockHash": "0x5f66e4813f2b86dc401a90a05aafd8a2c38f6f1241e8a947bf54d679014a06a5",
+ "transactions": [
+ "0x02f86c870c72dd9d5e883e650183012eea82520894d10b36aa74a59bcf4a88185837f658afaf3646ef0180c080a0882e961b849dc71672ce1014a55792da7aa8a43b07175d2b7452302c5b3cac2aa041356d00a158aa670c1a280b28b3bc8bb9d194a159c05812fa0a545f5b4bc57b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc5ee7483802009b45feabf4c5f701ec485f27bf7d2c4477b200ac53e210e9844"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np126",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x5f66e4813f2b86dc401a90a05aafd8a2c38f6f1241e8a947bf54d679014a06a5",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xfb39354666f43e8f8b88f105333d6f595054b2e1b0019f89bf5dbddf7ec9a0ab",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x7e",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x4ec",
+ "extraData": "0x",
+ "baseFeePerGas": "0x10912",
+ "blockHash": "0x1b452f327c51d7a41d706af9b74ac14ff50b74dcef77fdb94333a8f5c86436a8",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x9",
+ "validatorIndex": "0x5",
+ "address": "0x7ace431cb61584cb9b8dc7ec08cf38ac0a2d6496",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x0fc71295326a7ae8e0776c61be67f3ed8770311df88e186405b8d75bd0be552b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np127",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x1b452f327c51d7a41d706af9b74ac14ff50b74dcef77fdb94333a8f5c86436a8",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xb042b6a0d783d5e3757a9799dbc66d75515d0a511e5157650048a883a48d7c75",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x7f",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x4f6",
+ "extraData": "0x",
+ "baseFeePerGas": "0xe7f0",
+ "blockHash": "0x4831cdabfa81a5a7c4a8bb9fee309515e2d60dd5e754dfef4456794385771161",
+ "transactions": [
+ "0xf8836682e7f1830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0e5232243797a918b702f03aa9ccf4e944ff52293e7f5b7b1cb6874047f064ed6a02ae2cefc3e4fdb15fb4172d6fe04c7d54a312d077dcd15f91bf5f7047c10d079"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x7313b4315dd27586f940f8f2bf8af76825d8f24d2ae2c24d885dcb0cdd8d50f5"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np128",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x4831cdabfa81a5a7c4a8bb9fee309515e2d60dd5e754dfef4456794385771161",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x0400502ad286f8ca3e6e362d38ec9f2119eddc480e9af1ec646bc48e5451a379",
+ "receiptsRoot": "0xdcfb036965921ecaf598a6a02e3fb77784da94be9ed9aeee279d085a20342e47",
+ "logsBloom": "0x00000002000041000000000200000200400000000000000008000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00080000000000000000000000000000000000000000000400000000000000008000000000000000000000014800000000000000000000000000000000000000000000000000000000000080000000000008000000000000000000000000000008000000000000000000000100000000000000000200000000000000000000000000000000000000030000800000000000000000000001000000002000000000000000020000400005002000004000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x80",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x500",
+ "extraData": "0x",
+ "baseFeePerGas": "0xcb03",
+ "blockHash": "0xfadcdb29ddbfaed75902beaecb3b9e859bf4faefe78591baf8ac9c99faec09d2",
+ "transactions": [
+ "0xf87a6782cb0483011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa07e94803268c610035c580891ef0c6edd5c21babd8a2bb54d22373e982db9bf46a0375bc266e5e65f0a899b2299ddddbdc0e0d7d40c21e6d254d664abd7d0698076"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x2739473baa23a9bca4e8d0f4f221cfa48440b4b73e2bae7386c14caccc6c2059"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np129",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xfadcdb29ddbfaed75902beaecb3b9e859bf4faefe78591baf8ac9c99faec09d2",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x1f1fc8702bf538caf0df25f854999a44a7583b4339011bc24dadcee848e3daf5",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x81",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x50a",
+ "extraData": "0x",
+ "baseFeePerGas": "0xb1ae",
+ "blockHash": "0x5bc61ce8add484ead933542e385d4592d82aac6d47b46dcb2451390b884b8c3d",
+ "transactions": [
+ "0xf8656882b1af8302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a064097d6048ea289fa6b8a002f4a7d53d8381ee46bf0dadd3ac1befa477cef309a0300f780844db5eaa99ff65752886da8b671329d7c12db4e65dd7f525abe9b1d8"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xd4da00e33a11ee18f67b25ad5ff574cddcdccaa30e6743e01a531336b16cbf8f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np130",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x5bc61ce8add484ead933542e385d4592d82aac6d47b46dcb2451390b884b8c3d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xb04a7bb7f21e64f23bd415ee3ad1dc8a191975c86e0f0d43a92a4204a32ac090",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x82",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x514",
+ "extraData": "0x",
+ "baseFeePerGas": "0x9b8b",
+ "blockHash": "0x30fcf7ed7c580b55b92289383259c5c1d380d54c1f527bfdc8b062af1e898b8f",
+ "transactions": [
+ "0xf86869829b8c82520894a5ab782c805e8bfbe34cb65742a0471cf5a53a9701808718e5bb3abd10a0a078e180a6afd88ae67d063c032ffa7e1ee629ec053306ce2c0eb305b2fb98245ea07563e1d27126c9294391a71da19044cb964fd6c093e8bc2a606b6cb5a0a604ac"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe651765d4860f0c46f191212c8193e7c82708e5d8bef1ed6f19bdde577f980cf"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np131",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x30fcf7ed7c580b55b92289383259c5c1d380d54c1f527bfdc8b062af1e898b8f",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xfd2a1032389a1b7c6221d287a69e56a32d8a618396b8ef829601a9bcb3e91cce",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x83",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x51e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x881d",
+ "blockHash": "0x8b3a8443b32d2085952d89ca1b1ecb7574b37483cb38e71b150c00d001fea498",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0xa",
+ "validatorIndex": "0x5",
+ "address": "0x5ee0dd4d4840229fab4a86438efbcaf1b9571af9",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x5b5b49487967b3b60bd859ba2fb13290c6eaf67e97e9f9f9dda935c08564b5f6"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np132",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x8b3a8443b32d2085952d89ca1b1ecb7574b37483cb38e71b150c00d001fea498",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x91120613028234db2b47071a122f6ff291d837abe46f1f79830276fd23934c56",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x84",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x528",
+ "extraData": "0x",
+ "baseFeePerGas": "0x771a",
+ "blockHash": "0xc9a9cc06b8a5d6edad0116a50740cb23d1cb130f6c3052bae9f69a20abf639c3",
+ "transactions": [
+ "0xf8836a82771b830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a0a295fe01d21a6f8ffd36f8415e00da318f965a12155808a0d3b51c2c1914cf65a055022813f479686f077e227f3b00dc983081ad361dd8c8240b84d1cf86721ccf"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x57b73780cc42a6a36676ce7008459d5ba206389dc9300f1aecbd77c4b90277fa"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np133",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xc9a9cc06b8a5d6edad0116a50740cb23d1cb130f6c3052bae9f69a20abf639c3",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x1ec4000ab57cb0fec41b7221fff5ad7ec0dd4a042a739349045110b8116650c8",
+ "receiptsRoot": "0x870c88b91d896f4d6c0d6d8d9924dee345e36915e9244af9785f4ca1fea5fda3",
+ "logsBloom": "0x000000000008000000004000000000000000000000000000000000000000000400000000080000000000000000000000000000000000000000000000000c0000000000000000000002000000080000000000000000000004000000000000000000000000000000000000000000020000000400000000010000000040000000000000000000000000000004000000800008000100000202000000000000040000000000000000002000000000200000100000000000010000000000000001010000000000000000000000100000100000000401000000000000000000000000000000000000000000000000000000410000000800000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x85",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x532",
+ "extraData": "0x",
+ "baseFeePerGas": "0x6840",
+ "blockHash": "0x4d61445a8ece151e7938bc9c2f4f819a10afddf32c0f2600d62281ecd6b1af69",
+ "transactions": [
+ "0xf87a6b82684183011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa09ce0e0b4fb662dd87cf69350e376568655ce9436941c42e7815a0688db3d8281a037208359ff73e2b9389d9d6e32df5203a0239e5dbbf016e87b3714c122ff081f"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x217e8514ea30f1431dc3cd006fe730df721f961cebb5d0b52069d1b4e1ae5d13"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np134",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x4d61445a8ece151e7938bc9c2f4f819a10afddf32c0f2600d62281ecd6b1af69",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xb078e743044057e03f894971bfc3dca4dc78990d5cba60c7c979182c419528cf",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x86",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x53c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x5b3e",
+ "blockHash": "0xadcc471cc18ae64a1ece9ef42013441477843c72962bcc0f1291df9dc8906324",
+ "transactions": [
+ "0xf8656c825b3f8302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0fd01a89a43af89dfba5de6077a24873a459ee0c8de3beaa03e444bb712fdbebda04f920e07882701d12f9016e32bfe5859d3c1bf971e844c6fcd336953190a8aad"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x14b775119c252908bb10b13de9f8ae988302e1ea8b2e7a1b6d3c8ae24ba9396b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np135",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xadcc471cc18ae64a1ece9ef42013441477843c72962bcc0f1291df9dc8906324",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x5ed1a679a1844883bb7c09f1349702b93a298fc8a77885f18810230f0322d292",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x87",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x546",
+ "extraData": "0x",
+ "baseFeePerGas": "0x4fe0",
+ "blockHash": "0xd2e3126fb4b0cc3e1e98f8f2201e7a27192a721136d12c808f32a4ff0994601b",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e6d01824fe1825208944bfa260a661d68110a7a0a45264d2d43af9727de0180c001a00bb105cab879992d2769014717857e3c9f036abf31aa59aed2c2da524d938ff8a03b5386a238de98973ff1a9cafa80c90cdcbdfdb4ca0e59ff2f48c925f0ea872e"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe736f0b3c5672f76332a38a6c1e66e5f39e0d01f1ddede2c24671f48e78daf63"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np136",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xd2e3126fb4b0cc3e1e98f8f2201e7a27192a721136d12c808f32a4ff0994601b",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd4db74075dc9ae020d6016214314a7602a834c72ec99e34396e1d326aa112a27",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x88",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x550",
+ "extraData": "0x",
+ "baseFeePerGas": "0x45e6",
+ "blockHash": "0xa503a85bc5c12d4108445d5eab6518f1e4ccaeab30434202b53204a9378419fa",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0xb",
+ "validatorIndex": "0x5",
+ "address": "0x4f362f9093bb8e7012f466224ff1237c0746d8c8",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x7d112c85b58c64c576d34ea7a7c18287981885892fbf95110e62add156ca572e"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np137",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa503a85bc5c12d4108445d5eab6518f1e4ccaeab30434202b53204a9378419fa",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xfd5f001adc20a6ab7bcb9cd5ce2ea1de26d9ecc573a7b595d2f6d682cf006610",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x89",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x55a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x3d2a",
+ "blockHash": "0xe0b036f2df5813e2e265d606ee533cd46924a8a7de2988e0e872c8b92c26399c",
+ "transactions": [
+ "0xf8836e823d2b830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0e853c07d5aba01cfcacc3a4191551d7b47d2e90aba323bd29b5b552147bc4055a03a7e1dee0d461376b43ac4c0dd1a85cc94e9fa64aa8effec98c026293e47240a"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x28fbeedc649ed9d2a6feda6e5a2576949da6812235ebdfd030f8105d012f5074"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np138",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe0b036f2df5813e2e265d606ee533cd46924a8a7de2988e0e872c8b92c26399c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3bf11932c08c5317c7463697409eba5a6904575cc03593cb0eac6c82093d79b7",
+ "receiptsRoot": "0x3ef7cc7ec86f1ace231cdf7c7fadaf27ae84ad4afdd5f2261b60d5be03794001",
+ "logsBloom": "0x00000000000000000000080000000000000000000000000000000000000000000000000010000000004000008000000000000000000000000000000080001000000020000000000000000000000000000000000000000000000010000010200000040220000000000000000000010001000000800000000000400000002000000000000000000000400000000000000800000000000400000000000000080000500000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000004002000000000008000000000002000000400000000000000000000000000002000000000002000000000000002000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x8a",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x564",
+ "extraData": "0x",
+ "baseFeePerGas": "0x358a",
+ "blockHash": "0xfcca6f4e35f290be297bf6403b84c99d1a7b6d78299b5e2690d915bf834e85da",
+ "transactions": [
+ "0xf87a6f82358b83011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0c28b8f557aaf82e47d9e1425824709427513131908ac636f142990468e40909ea05fe11510da000868cfe1a05bdf689a8c1954c87afeb9ef2defbed3075458a6ad"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x6f7410cf59e390abe233de2a3e3fe022b63b78a92f6f4e3c54aced57b6c3daa6"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np139",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xfcca6f4e35f290be297bf6403b84c99d1a7b6d78299b5e2690d915bf834e85da",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe8258bde0dceac7f4b4734c8fa80fe5be662ae7238d9beb9669bc3ae4699efa8",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x8b",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x56e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x2edc",
+ "blockHash": "0x762df3955fc857f4c97acb59e4d7b69779986e20e3a8ea6bc5219dfd9e5a3d7e",
+ "transactions": [
+ "0xf86570822edd8302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a02206472edd9c816508c6711c004500028a4a6a206caf23b20c6828dd60e1533fa0186dc116a92a8455d1cb92ed4b599c3f7cade6cf59da63b1aef46936c3a507e9"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xd5edc3d8781deea3b577e772f51949a8866f2aa933149f622f05cde2ebba9adb"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np140",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x762df3955fc857f4c97acb59e4d7b69779986e20e3a8ea6bc5219dfd9e5a3d7e",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x9ff9a193050e74dfa00105084fa236099def4aa7993691c911db0a3f93422aeb",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x8c",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x578",
+ "extraData": "0x",
+ "baseFeePerGas": "0x2906",
+ "blockHash": "0xffe6c202961ee6b5098db912c7203b49aa3b303b4482234371b49f7ef7a95f84",
+ "transactions": [
+ "0xf86871822907825208949defb0a9e163278be0e05aa01b312ec78cfa372601808718e5bb3abd109fa04adf7509b10551a97f2cb6262c331096d354c6c8742aca384e63986006b8ac93a0581250d189e9e1557ccc88190cff66de404c99754b4eb3c94bb3c6ce89157281"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x20308d99bc1e1b1b0717f32b9a3a869f4318f5f0eb4ed81fddd10696c9746c6b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np141",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xffe6c202961ee6b5098db912c7203b49aa3b303b4482234371b49f7ef7a95f84",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf63dc083849dc5e722a7ca08620f43fc5cd558669664a485a3933b4dae3b84f4",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x8d",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x582",
+ "extraData": "0x",
+ "baseFeePerGas": "0x23e6",
+ "blockHash": "0xfa0dcd8b9d6e1c42eeea7bb90a311dd8b7215d858b6c4fb0f64ee01f2be00cfe",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0xc",
+ "validatorIndex": "0x5",
+ "address": "0x075198bfe61765d35f990debe90959d438a943ce",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x91f7a302057a2e21d5e0ef4b8eea75dfb8b37f2c2db05c5a84517aaebc9d5131"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np142",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xfa0dcd8b9d6e1c42eeea7bb90a311dd8b7215d858b6c4fb0f64ee01f2be00cfe",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6222bb96d397776358dd71f14580f5464202313769960ec680c50d9ccc2fa778",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x8e",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x58c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x1f6a",
+ "blockHash": "0xe501e9f498cd6b1a6d22c96a556c9218e3a7960eea3e9ab4ac2760cc09fdca0d",
+ "transactions": [
+ "0xf88372821f6b830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa067091ae37d21fdc5f9eed2877bddb24e52f69e80af27a89608b6fba1c5053f32a04817ab7dc0c3eaac266b08a1683c34fcd43098c6219ea5771d35fa3387b705a1"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x743e5d0a5be47d489b121edb9f98dad7d0a85fc260909083656fabaf6d404774"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np143",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe501e9f498cd6b1a6d22c96a556c9218e3a7960eea3e9ab4ac2760cc09fdca0d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xbe8a51adbc81161927f0b6f3e562cd046f1894145010a1b3d77394780478df3c",
+ "receiptsRoot": "0x8c32e3da3725025cad909cb977e252fd127d54c4f4da3852d18ef3976bfe4610",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000001000000000000004000000000000000000000000000800000000000000000000028000000020008000000008000000000000000000000000010000000000080000100000400100000000000000000000000100000000010000000000000000000000000000004000000000000000000008000000000080008000000000000000000000000000000000000000000080002800000000000120000000000004000000000000000000000004000000400000002000800000020000000080000000000000008000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x8f",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x596",
+ "extraData": "0x",
+ "baseFeePerGas": "0x1b7f",
+ "blockHash": "0xdb3eb92355d58f317e762879ec891a76e0d9ba32a43f0a70f862af93780ef078",
+ "transactions": [
+ "0xf87a73821b8083011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0de521643ceaf711d0d3b6cda406ef8fba599658fccc750139851846435eba8afa057f5427948ca8d46609925641f81f72115860c16228821020b8020846a4c3158"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xcdcf99c6e2e7d0951f762e787bdbe0e2b3b320815c9d2be91e9cd0848653e839"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np144",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xdb3eb92355d58f317e762879ec891a76e0d9ba32a43f0a70f862af93780ef078",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xb7933a921b5acf566cc2b8edb815d81a221222a0ac36dac609927aa75744daaf",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x90",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x5a0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x1811",
+ "blockHash": "0x6718dc62462698e0df2188c40596275679d2b8a49ab6fd6532a3d7c37efd30a6",
+ "transactions": [
+ "0xf865748218128302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0afbda9fa76936bc6be4d26905bc000b4b14cae781a8e3acb69675b6c5be20835a03858ad4e7e694bf0da56994a1e5f855ff845bae344de14109ae46607aa4172ca"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xcc9476183d27810e9738f382c7f2124976735ed89bbafc7dc19c99db8cfa9ad1"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np145",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x6718dc62462698e0df2188c40596275679d2b8a49ab6fd6532a3d7c37efd30a6",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa8a6a6386a956afbc3163f2ccdcaeffeb9b12c10d4bb40f2ef67bcb6df7cf64c",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x91",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x5aa",
+ "extraData": "0x",
+ "baseFeePerGas": "0x1512",
+ "blockHash": "0x891051fb49d284166b72a30c29b63bfe59994c9db2d89e54ca0791b4dfdb68fb",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e7501821513825208947da59d0dfbe21f43e842e8afb43e12a6445bbac00180c080a06ca026ba6084e875f3ae5220bc6beb1cdb34e8415b4082a23dd2a0f7c13f81eca0568da83b9f5855b786ac46fb241eee56b6165c3cc350d604e155aca72b0e0eb1"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf67e5fab2e7cacf5b89acd75ec53b0527d45435adddac6ee7523a345dcbcdceb"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np146",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x891051fb49d284166b72a30c29b63bfe59994c9db2d89e54ca0791b4dfdb68fb",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x9ee7ad908d7c553d62d14ecd6a1e9eac6ed728f9a0d0dd8aa8db149e6e803262",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x92",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x5b4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x1271",
+ "blockHash": "0x2ef94fa352357c07d9be6e271d8096b2cbf7dcae9bad922e95bc7c7c24375e7c",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0xd",
+ "validatorIndex": "0x5",
+ "address": "0x956062137518b270d730d4753000896de17c100a",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe20f8ab522b2f0d12c068043852139965161851ad910b840db53604c8774a579"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np147",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x2ef94fa352357c07d9be6e271d8096b2cbf7dcae9bad922e95bc7c7c24375e7c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x14111c2a0f5c36f6b8ea455b9b897ab921a0f530aaee00447af56ffc35940e32",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x93",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x5be",
+ "extraData": "0x",
+ "baseFeePerGas": "0x1023",
+ "blockHash": "0x406fbf5c2aa4db48fce6fe0041d09a3387c2c18c57a4fb77eca5d073586ca3ea",
+ "transactions": [
+ "0xf88376821024830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa08e5e1207971ec2479337fa7c80f843dd80d51224eb9f9d8c37b1758d3d5acae4a04d2f89fb9005dc18fa4c72e8b1b4e611f90ca9c5e346b6201dfe4b83ec39c519"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf982160785861cb970559d980208dd00e6a2ec315f5857df175891b171438eeb"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np148",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x406fbf5c2aa4db48fce6fe0041d09a3387c2c18c57a4fb77eca5d073586ca3ea",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xc43ae2200cea3bdd1b211157150bd773118c818669e2650659ef3807ac7d2c29",
+ "receiptsRoot": "0x1f4bdefd1b3ded1be79051fe46e6e09f4543d4c983fdc21dee02b1e43fb34959",
+ "logsBloom": "0x00000000000000000000000000000110000000000002000000000000000000020008000000000000000800001000000000000000000000000020000010000400000000000000000000001000000000000000000000000000000020000000000000101000000000800000000000000000080000000000000000000000000000010000080000080000800000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000200000020000000000000000000000000002000001000000000040002000000024000000000280000000000000000000000000020000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x94",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x5c8",
+ "extraData": "0x",
+ "baseFeePerGas": "0xe20",
+ "blockHash": "0x34ca9a29c1cef7e8011dcce6240c1e36ee8e64643fc0ed98cb436d2f9a21baa2",
+ "transactions": [
+ "0xf87a77820e2183011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0b5b7b281fbe78ca0f9819a9015997a42ee896462db5ea7de089cd7e2cf84b346a02bc85175e51da947f89f947c30d7c1d77daa6e654a0007e56de98812039a76bd"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x230954c737211b72d5c7dcfe420bb07d5d72f2b4868c5976dd22c00d3df0c0b6"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np149",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x34ca9a29c1cef7e8011dcce6240c1e36ee8e64643fc0ed98cb436d2f9a21baa2",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x21cafe51bfa7793c9a02f20282b59cbb5156dce1e252ab61f98fdd5cdecf8495",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x95",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x5d2",
+ "extraData": "0x",
+ "baseFeePerGas": "0xc5d",
+ "blockHash": "0xed939dcec9a20516bd7bb357af132b884efb9f6a6fc2bc04d4a1e5063f653031",
+ "transactions": [
+ "0xf86578820c5e8302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0371194d9f0d8b28bc888d45cc571dd73c9dd620d54184b9776256d5e07049350a05f7bfb7cdccb54a2f0ea01374f1474e694daa1b128076bdc33efcee9bc0d56a7"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xb7743e65d6bbe09d5531f1bc98964f75943d8c13e27527ca6afd40ca069265d4"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np150",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xed939dcec9a20516bd7bb357af132b884efb9f6a6fc2bc04d4a1e5063f653031",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x503c44cab4d6c0010c3493e219249f1e30cfff1979b9da7268fd1121af73d872",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x96",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x5dc",
+ "extraData": "0x",
+ "baseFeePerGas": "0xad3",
+ "blockHash": "0x136665ab7316f05d4419e1f96315d3386b85ec0baeed10c0233f6e4148815746",
+ "transactions": [
+ "0xf86879820ad48252089484873854dba02cf6a765a6277a311301b2656a7f01808718e5bb3abd10a0a0ab3202c9ba5532322b9d4eb7f4bdf19369f04c97f008cf407a2668f5353e8a1fa05affa251c8d29f1741d26b42a8720c416f7832593cd3b64dff1311a337799e8f"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x31ac943dc649c639fa6221400183ca827c07b812a6fbfc1795eb835aa280adf3"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np151",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x136665ab7316f05d4419e1f96315d3386b85ec0baeed10c0233f6e4148815746",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x2e257bca2ea424f7c304c42fc35b14c8d3fd46c9066c7f895f775a2065a14bab",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x97",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x5e6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x979",
+ "blockHash": "0xefc08cafa0b7c0e0bc67c0dbd563a855ba55f389d947bd9c524be5ef789505ba",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0xe",
+ "validatorIndex": "0x5",
+ "address": "0x2a0ab732b4e9d85ef7dc25303b64ab527c25a4d7",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xded49c937c48d466987a4130f4b6d04ef658029673c3afc99f70f33b552e178d"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np152",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xefc08cafa0b7c0e0bc67c0dbd563a855ba55f389d947bd9c524be5ef789505ba",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa124fe0abd3682da7263262172c9d2c57fb42d4f131cbc9f24ddea0ec1505e48",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x98",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x5f0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x84a",
+ "blockHash": "0xb7a12ba1b0cd24019d0b9864ed28c0d460425eb1bd32837538d99da90f5c65b7",
+ "transactions": [
+ "0xf8837a82084b830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a0be58da9e68f28cf1dd209a610214982ba767249f3b92cd8c0fb3850a9ee194d6a0613f59eec6c092b6d2fc55de85bc67b21c261dc48f1ddb74af3aac438b27ccd5"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xa0effc449cab515020d2012897155a792bce529cbd8d5a4cf94d0bbf141afeb6"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np153",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb7a12ba1b0cd24019d0b9864ed28c0d460425eb1bd32837538d99da90f5c65b7",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3c05bdceef0bdc9f676a3a0c00151f975e469e5bb08ab08f3eed090987119672",
+ "receiptsRoot": "0x73faa109b88bfbf7e2a71c36d556d9286c0a26988680cbe3058f045fd361b3b0",
+ "logsBloom": "0x00004000000800000000000000000000000000000000000000000000000000000004000000080000000000000800000000000000500000000000000000000200000000001000000800000000000002008000080000000000000000000000000000000000000000000008000200000000000000000000000000000001000000000000000000101000004000000000000000000000000000000000000000000000000000000080000000000000000000008200000000000080000000000000000000000000000000000800000000000000000000000400000080020002000000001040000000000000000000000000004000000000000000008000008000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x99",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x5fa",
+ "extraData": "0x",
+ "baseFeePerGas": "0x742",
+ "blockHash": "0x0292db163d287eeb39bd22b82c483c9b83a9103a0c425a4f3954ef2330cc1718",
+ "transactions": [
+ "0xf87a7b82074383011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0b9eb0510fdc334dde88b8ac75869aa2dd53988191ae1df94b7b926eae9b18050a00cbd9e12b7185723ed407175a7a70fa5cc0dbc4014b3040a9ade24a4eb97c8c1"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x1f36d9c66a0d437d8e49ffaeaa00f341e9630791b374e8bc0c16059c7445721f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np154",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x0292db163d287eeb39bd22b82c483c9b83a9103a0c425a4f3954ef2330cc1718",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xc2e93862e26d4df238b2b83a3ee0e008f25123aa211d83906fcd77bc9fd226ab",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x9a",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x604",
+ "extraData": "0x",
+ "baseFeePerGas": "0x65b",
+ "blockHash": "0xaeab3fe4b09329235bd8a0399db4d944fe1b247a91055c7de7f53703c94357ea",
+ "transactions": [
+ "0xf8657c82065c8302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0e5959821e9fe4b896ef2559fe6524aadead228d89f923061b6d2d340f6b9307fa02ed2929f37d24a57229f7a579aaab2d9551e71b0822895e91f04e7824da9a861"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x34f89e6134f26e7110b47ffc942a847d8c03deeed1b33b9c041218c4e1a1a4e6"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np155",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xaeab3fe4b09329235bd8a0399db4d944fe1b247a91055c7de7f53703c94357ea",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x0c94e7ea002f7b3bcc5100783e1e792160fb73ff4e836cd295e34423ff72f2a6",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x9b",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x60e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x591",
+ "blockHash": "0xcc221bd9ee16f8302994c688cd7cc18313e686cf21f29edea5da5ac08a28a9b6",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e7d01820592825208948d36bbb3d6fbf24f38ba020d9ceeef5d4562f5f20180c001a0f9075613b9069dab277505c54e8381b0bb91032f688a6fe036ef83f016771897a04cb4fc2e695439af564635863f0855e1f40865997663d900bc2ab572e78a70a2"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x774404c430041ca4a58fdc281e99bf6fcb014973165370556d9e73fdec6d597b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np156",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xcc221bd9ee16f8302994c688cd7cc18313e686cf21f29edea5da5ac08a28a9b6",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x04ba5addea7916f0483658ea884c052ea6d759eeda62b9b47ee307bd46525bb0",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x9c",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x618",
+ "extraData": "0x",
+ "baseFeePerGas": "0x4df",
+ "blockHash": "0x8c922bb4a1c7aad6fdc09082e5c90427d0643ffd281d0154cdd71a372108c5da",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0xf",
+ "validatorIndex": "0x5",
+ "address": "0x6e3faf1e27d45fca70234ae8f6f0a734622cff8a",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xd616971210c381584bf4846ab5837b53e062cbbb89d112c758b4bd00ce577f09"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np157",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x8c922bb4a1c7aad6fdc09082e5c90427d0643ffd281d0154cdd71a372108c5da",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3ae465791b7ce8492961c071fc50b34434552a1ab36c1854fbc308f55729e827",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x9d",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x622",
+ "extraData": "0x",
+ "baseFeePerGas": "0x444",
+ "blockHash": "0x1a883eed15a2f61dc157140d45f50e4bc6cc08ead08adf3ff0804ec9f1104c8a",
+ "transactions": [
+ "0xf8837e820445830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0140e450a0bc12c61bdf6acca1a56178466d88014d00a4a09c1088ce184128327a07daad374bb0d7fe879212bd7bdc8d454b4996bd7bebd6f6d0d4636ec7df28d0b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xcdf6383634b0431468f6f5af19a2b7a087478b42489608c64555ea1ae0a7ee19"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np158",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x1a883eed15a2f61dc157140d45f50e4bc6cc08ead08adf3ff0804ec9f1104c8a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe01f0f54fba649cdc0d6da6a9f519b6918149d82f134845e99847ff7b362b050",
+ "receiptsRoot": "0x36340e11a5f180862d423a676049d1c934b8d27940fdd50dc8704563ffd27b0f",
+ "logsBloom": "0x00000000000000008000000000800080000000000000000018040000000100100000000000010000000000000000000000000000000000000000000000010000000080080000800000000000010000000010000000000802000000000000000000000000001000000000004000000000000000000000004000000000000000004000000000000000000000000000000000000000000000401000000000010000000000000000000000000000000080000000000000000000000040000240000000000000000000000001000000000000000000000000100000000080000040000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x9e",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x62c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x3bc",
+ "blockHash": "0x5efcd9acd57f0652b1aa46406cf889b0da1f05e34fa9b642f7dec1bd924f3fd0",
+ "transactions": [
+ "0xf87a7f8203bd83011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0331dd2ec5bf4bddde96cacb8a28ed1cc577d4a2289bae6da0e6ef3c9b1287fc3a04c2925895dfbed2b00ac9a2040371970da1a7fd333dc1e551e2e268c56717c79"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x00ec22e5df77320b4142c54fceaf2fe7ea30d1a72dc9c969a22acf66858d582b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np159",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x5efcd9acd57f0652b1aa46406cf889b0da1f05e34fa9b642f7dec1bd924f3fd0",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa6e1d00e54b539beb170e510a8594fdd73ad2bf8e695a0f052291454ee1f3ade",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x9f",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x636",
+ "extraData": "0x",
+ "baseFeePerGas": "0x345",
+ "blockHash": "0x97570840bed5a39a4580302a64cbaf7ed55bcc82e9296502c4873d84f8384004",
+ "transactions": [
+ "0xf86681808203468302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0f4a1b0681bb3c513fa757b560ef9cf0f004b8da91d920e157506ebb60d0d3954a0738da3b003ce68a9b4032770c0fe6481f54ea43baba54cad7153369486728790"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xcb32d77facfda4decff9e08df5a5810fa42585fdf96f0db9b63b196116fbb6af"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np160",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x97570840bed5a39a4580302a64cbaf7ed55bcc82e9296502c4873d84f8384004",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x9277b9454326e993436cef0b9a2e775cff46439f3d683da55a983e9850943a20",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xa0",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x640",
+ "extraData": "0x",
+ "baseFeePerGas": "0x2dd",
+ "blockHash": "0x4b01a4f9f924e7e386d2c94653c80bab2e3069d744ab107dd181d9b5f5d176d0",
+ "transactions": [
+ "0xf86981818202de82520894c19a797fa1fd590cd2e5b42d1cf5f246e29b916801808718e5bb3abd109fa0857754afc3330f54a3e6400f502ad4a850a968671b641e271dcb9f68aacea291a07d8f3fb2f3062c39d4271535a7d02960be9cb5a0a8de0baef2211604576369bf"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x6d76316f272f0212123d0b4b21d16835fe6f7a2b4d1960386d8a161da2b7c6a2"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np161",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x4b01a4f9f924e7e386d2c94653c80bab2e3069d744ab107dd181d9b5f5d176d0",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xc9f74f81ace1e39dd67d9903221e22f1558da032968a4aaff354eaa92289f5c6",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xa1",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x64a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x282",
+ "blockHash": "0x9431a8d1844da9cc43e8b338de21722e23f78ed5b46391a6d924595759773286",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x10",
+ "validatorIndex": "0x5",
+ "address": "0x8a8950f7623663222542c9469c73be3c4c81bbdf",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x2de2da72ae329e359b655fc6311a707b06dc930126a27261b0e8ec803bdb5cbf"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np162",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x9431a8d1844da9cc43e8b338de21722e23f78ed5b46391a6d924595759773286",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x853c0a8e4e964cc857f2dd40b10de2cefb2294a7da4d83d7b1da2f9581ee0961",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xa2",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x654",
+ "extraData": "0x",
+ "baseFeePerGas": "0x232",
+ "blockHash": "0x604f361dbc1085fb70812b618e53035d4747c3969a96620e4c179a93be5d124d",
+ "transactions": [
+ "0xf8848182820233830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa01a7b8af754eba43e369957a413a3fef1255659f2bd05f902b29ee213c3989d46a00ca88ac892d58fdb0d9bd7640ca797280081275886cc2ac155a814eb498e7d7b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x08bed4b39d14dc1e72e80f605573cde6145b12693204f9af18bbc94a82389500"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np163",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x604f361dbc1085fb70812b618e53035d4747c3969a96620e4c179a93be5d124d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd89e02bde63bf214ad6a3bc94f3b092bc2a1fbc13f172049c854ecb070630fe6",
+ "receiptsRoot": "0x596413315e1e3fd6fc21e4ce81e618b76ad2bf7babfa040c822a5bcbffeb63be",
+ "logsBloom": "0x00080000001044010000000800000000000000000010000000040000000020000000800000000040000000000000000001008000000000800000000000000000000000001000000000020000080000000000000000000000000000000000000002000044000000000000000000000000000000000000000000000000000000000000002000000000000000800000000000000000000000000000000000104000800000000000000004000004000002000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000800020000000000000000000040000000000000000020",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xa3",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x65e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x1ec",
+ "blockHash": "0x00979cd18ef128aa75a51ad8606b381ce53f72c37d17bc6c6613d8de722abcfa",
+ "transactions": [
+ "0xf87b81838201ed83011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa06e6e8187c035f2788ba44e3f47b4102a1f263ae2f601b2fbfa9e2cdc3b0c22b1a06c229eebca1bdda1aba424cd8cf296f386cf2d50a6add950fd6cb34aac442c5a"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe437f0465ac29b0e889ef4f577c939dd39363c08fcfc81ee61aa0b4f55805f69"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np164",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x00979cd18ef128aa75a51ad8606b381ce53f72c37d17bc6c6613d8de722abcfa",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe2672f9ae97aeaeb22f42c389301a3b79ad6c47ad88c54e18e1d7a4ed5e9c903",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xa4",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x668",
+ "extraData": "0x",
+ "baseFeePerGas": "0x1af",
+ "blockHash": "0xcabf8c1b47839908f6eb28261876b52404f3f8787c94d8aadc0aca721ff35d13",
+ "transactions": [
+ "0xf86681848201b08302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa08ab61fe0265afe289954f7c2af8e070f3c40dda39e6cb6ff5c798fc7bc87b55ba00a8a440a7ba5a04a7bb73b093e94734dda228d33a43c640d719aef5ea5e81764"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x89ca120183cc7085b6d4674d779fc4fbc9de520779bfbc3ebf65f9663cb88080"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np165",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xcabf8c1b47839908f6eb28261876b52404f3f8787c94d8aadc0aca721ff35d13",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x4d9cd7b52c0daaec9a019730c237a2c3424f5d5a004c8bc9fa23997f3ec33768",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xa5",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x672",
+ "extraData": "0x",
+ "baseFeePerGas": "0x17a",
+ "blockHash": "0x6dcec039f7777c1fd96bbdd342e0ed787211132f753cf73a59847dc6cb30a6ff",
+ "transactions": [
+ "0x02f86c870c72dd9d5e883e81850182017b825208946922e93e3827642ce4b883c756b31abf800366490180c080a089e6d36baf81743f164397205ded9e5b3c807e943610d5b9adb9cfeb71b90299a03d56c57f842a92a5eb71c8f9f394fe106d993960421c711498013806957fdcaf"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xb15d5954c7b78ab09ede922684487c7a60368e82fdc7b5a0916842e58a44422b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np166",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x6dcec039f7777c1fd96bbdd342e0ed787211132f753cf73a59847dc6cb30a6ff",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x03629dac3f669a8262e8246d46bac9acfb7cbca336d02e90c081561fa0b22aba",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xa6",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x67c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x14b",
+ "blockHash": "0x760da169c77450231e6a0d2dd4aad67de84633eb6918fc8607a3a709eea07bef",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x11",
+ "validatorIndex": "0x5",
+ "address": "0xfe1dcd3abfcd6b1655a026e60a05d03a7f71e4b6",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xad13055a49d2b6a4ffc8b781998ff79086adad2fd6470a0563a43b740128c5f2"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np167",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x760da169c77450231e6a0d2dd4aad67de84633eb6918fc8607a3a709eea07bef",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x4f5e79d4af5565b3b53649b1ddc3a03209cb583e7beb03db8b32924c641e6912",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xa7",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x686",
+ "extraData": "0x",
+ "baseFeePerGas": "0x122",
+ "blockHash": "0xfcb210229cb48baf3d535e48a7577041268eadd6027942084a56dbec8f8423a9",
+ "transactions": [
+ "0xf8848186820123830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0b2aafb3e2678dd48e6f31874bd478778480815c9d110ec8cc77a42f7d52999daa00705b1266fc1087167cc531caa9d2e0a0c8779e4ad5020d9d3a16500bf5b96a1"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x9e9909e4ed44f5539427ee3bc70ee8b630ccdaea4d0f1ed5337a067e8337119f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np168",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xfcb210229cb48baf3d535e48a7577041268eadd6027942084a56dbec8f8423a9",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x8c6c100b7c75ced82b38315fd50c5439478a7ee256073ce17b845e0815912eab",
+ "receiptsRoot": "0xf8f8c85b17ada66c06f8e41b58b45213619bb309a197896adbaff4e9139967b1",
+ "logsBloom": "0x80000000000000000000000000000000800000000004008000200000000000000002820000000000000000000000000000000000000040020400000000000000000000000200000000000000000000000000000040000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000040080000000000000000000000000000000000200000000000000080000200000000000000000000000000000000000000000000000000000100000003000200000000000000000000000000000000000000200000000000000000000000004000000004000000040001010000000080400000000000000040000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xa8",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x690",
+ "extraData": "0x",
+ "baseFeePerGas": "0xfe",
+ "blockHash": "0x796a4e02d1da9c86b1a2e7b2ef1d82e1ebdac143ec7ff4a67dae2b241b22c3c1",
+ "transactions": [
+ "0xf87a818781ff83011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0b1e7ca73ef581fc880deb34aa6cf7958f6ce110efd121d48fb2292a747864815a02bf94b17dc034d8934b885faa269a9430a755ebfb4c6e87378376a094704f464"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xbf1f3aba184e08d4c650f05fe3d948bdda6c2d6982f277f2cd6b1a60cd4f3dac"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np169",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x796a4e02d1da9c86b1a2e7b2ef1d82e1ebdac143ec7ff4a67dae2b241b22c3c1",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x9f527744fd44cf4c2ba60fe62d25d4f19e64c034cbf24785e0128d5fafa19e2a",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xa9",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x69a",
+ "extraData": "0x",
+ "baseFeePerGas": "0xdf",
+ "blockHash": "0x29a0d081e8aec6b2dcb307d73ca48d7d50e434617daf0e81fd28b35be9c7995d",
+ "transactions": [
+ "0xf865818881e08302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0c583bd1010c1e4158466575fb0c09ff710a5ff07c8f7a6e7960d90bffef8bd34a059ea0ba5c6fc64aad73252c780de287599d3100d80f7b1d3201b4865d82c0cad"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xbb70fe131f94783dba356c8d4d9d319247ef61c768134303f0db85ee3ef0496f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np170",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x29a0d081e8aec6b2dcb307d73ca48d7d50e434617daf0e81fd28b35be9c7995d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x45c5f07a7d94c320222f43c12b04081fdbe870be18a2b76f7122bd7f4554118b",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xaa",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x6a4",
+ "extraData": "0x",
+ "baseFeePerGas": "0xc4",
+ "blockHash": "0xe878e98d05f60a8fd741a4aaab17a91c538f21552ac41922fe2b755e4f0e534c",
+ "transactions": [
+ "0xf868818981c582520894bceef655b5a034911f1c3718ce056531b45ef03b01808718e5bb3abd109fa0626dfd18ca500eedb8b439667d9b8d965da2f2d8ffcd36a5c5b60b9a05a52d9fa07271175e4b74032edeb9b678ffb5e460edb2986652e45ff9123aece5f6c66838"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x6a81ebd3bde6cc54a2521aa72de29ef191e3b56d94953439a72cafdaa2996da0"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np171",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe878e98d05f60a8fd741a4aaab17a91c538f21552ac41922fe2b755e4f0e534c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf4a19b9765604687783462dbf36a0063ada2ba7babb4dd1c4857b2449565a41d",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xab",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x6ae",
+ "extraData": "0x",
+ "baseFeePerGas": "0xac",
+ "blockHash": "0xc3f33c71274b456303efd80efacba7d5fccb0ed278ee24e5594a38c45a294315",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x12",
+ "validatorIndex": "0x5",
+ "address": "0x087d80f7f182dd44f184aa86ca34488853ebcc04",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4c83e809a52ac52a587d94590c35c71b72742bd15915fca466a9aaec4f2dbfed"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np172",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xc3f33c71274b456303efd80efacba7d5fccb0ed278ee24e5594a38c45a294315",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x4f9e280291036fb6cd64598fe0517d64d6da264d07d7fc3b8d664221d7af9021",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xac",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x6b8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x97",
+ "blockHash": "0xd785018f59628b9f13cc2d4a45e0b4b3af183acce4e5752346e79dbcdf7de4e5",
+ "transactions": [
+ "0xf883818a8198830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a05f47b0ab77130dcc8f7143a2afaace6a2d1f82e25839cb9adee5aaebfe7dc681a05af90b75de35c90709b83861d8fdfd7805a89b1e76a4bdd5987e578ba72fc37e"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x268fc70790f00ad0759497585267fbdc92afba63ba01e211faae932f0639854a"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np173",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xd785018f59628b9f13cc2d4a45e0b4b3af183acce4e5752346e79dbcdf7de4e5",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe01cadedc509806ea9cd7475312a3768de034d1c849abadc46237b8cd4163179",
+ "receiptsRoot": "0x15dc68f6de1b068b96d32dbc11a048b915e7d62bd3662689ae5c095bb6ddab37",
+ "logsBloom": "0x00000100000000004000000004000000000000000000000000000000000000000000000004000000018004000000000000000000000000000002000000000000000020002000400000002000020000000100000000000000000080010000400000000000000200000000040000000000000000000000010000002000000000000000000000000004040000000000000000000000000000000000000000004000000000000000000000080000004000000000000000000000001000000000000100000800040000000000000000000000000000000000000000000000000000000000000000400000000000004001000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xad",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x6c2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x85",
+ "blockHash": "0xbcff8f4e8c3d70d310900cd8246c3456e237ab8ea9fc036601995404b141e3bb",
+ "transactions": [
+ "0xf87a818b818683011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa04a74ea0833e42d624ba0d9b589a16e05feae1c2dee89abfb29df95b650d3e756a037135f3e24572eb9d927a02c0c4eee7fd5d8a181e2384ef3b3b04c49c9dbbbe1"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x7e544f42df99d5666085b70bc57b3ca175be50b7a9643f26f464124df632d562"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np174",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xbcff8f4e8c3d70d310900cd8246c3456e237ab8ea9fc036601995404b141e3bb",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa862687747ffc388414ee5953589a70f2161a130886348157257a52347be9157",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xae",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x6cc",
+ "extraData": "0x",
+ "baseFeePerGas": "0x75",
+ "blockHash": "0x943b23302ffed329664d45fee15ca334c92aa6195b22cb44c7fdd5bdbbe4e7d4",
+ "transactions": [
+ "0xf864818c768302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a024414367540c94b1bd3ce29dd0b4ee6bdece373f9417e96f0ef8d632e82c4ecba031dae9539e84f7351a5b92f1246dfd909dd5a383011fbd44bb8e87fb6870189b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xd59cf5f55903ba577be835706b27d78a50cacb25271f35a5f57fcb88a3b576f3"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np175",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x943b23302ffed329664d45fee15ca334c92aa6195b22cb44c7fdd5bdbbe4e7d4",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd70339e1158ecc97dc7db86b3177202ffa3dcba386fd52e54e6fe8b728003154",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xaf",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x6d6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x67",
+ "blockHash": "0xd2a0fc154d0bb77b346c7bb3532d24581bc1a5b5bf9ced18b419a6309ff84351",
+ "transactions": [
+ "0x02f86a870c72dd9d5e883e818d0168825208945a6e7a4754af8e7f47fc9493040d853e7b01e39d0180c001a08c62285d8318f84e669d3a135f99bbfe054422c48e44c5b9ce95891f87a37122a028e75a73707ee665c58ff54791b62bd43a79de1522918f4f13f00ed4bd82b71b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x551cced461be11efdeaf8e47f3a91bb66d532af7294c4461c8009c5833bdbf57"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np176",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xd2a0fc154d0bb77b346c7bb3532d24581bc1a5b5bf9ced18b419a6309ff84351",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x1bc27508b52de3a750cc928dd89954462b4e4dbfb60707442e60b4b23aabb816",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xb0",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x6e0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x5b",
+ "blockHash": "0xe3072603b13de812d2c58ece96eeb4f32ff7e3e93c8b9121dd18f0682a750970",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x13",
+ "validatorIndex": "0x5",
+ "address": "0xf4f97c88c409dcf3789b5b518da3f7d266c48806",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc1e0e6907a57eefd12f1f95d28967146c836d72d281e7609de23d0a02351e978"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np177",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe3072603b13de812d2c58ece96eeb4f32ff7e3e93c8b9121dd18f0682a750970",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x78497ebf1fbf03732772a8c96b2fe6902af5ab844e49f2685763b4366ce8ddf6",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xb1",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x6ea",
+ "extraData": "0x",
+ "baseFeePerGas": "0x50",
+ "blockHash": "0x996acbdde853cdc1e21426f4e53d07c09a13ed50798ee071582f24cc1014e238",
+ "transactions": [
+ "0xf882818e51830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a0fd5ea8b7df5c3ecd87220b8ad7d15198722d94a64b0e8e099c8c7384c1d08a33a039707925aba6dad8d06c162fd292df0bf03033b7b6d1204ae4be0ce6f487fa71"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x9d580c0ac3a7f00fdc3b135b758ae7c80ab135e907793fcf9621a3a3023ca205"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np178",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x996acbdde853cdc1e21426f4e53d07c09a13ed50798ee071582f24cc1014e238",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x197c4166e7f8f68ee6965c87c8ce720bee776a7b7119870371e6262bc913468d",
+ "receiptsRoot": "0x7c66f99e4434aa19cdf8845c495068fa5be336b71978d6fa90966129f300218a",
+ "logsBloom": "0x00000000000000000000000000400200000000000000800000000000000000008000008000000000000000000000000000000000000000000040000004000041004000000000000000000000000800000000000000000000000000000000080100000000000000000000000020000000004200000000001000000002000000100008080200000004000000000000200000000000000010000000000000000000000000000000000000000000000000000000000000000020000000000000000000800000000000000000000800000000200000000000000000000100002000000000000000000002000000000000000000100000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xb2",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x6f4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x47",
+ "blockHash": "0xf00d6a4f13579131abcd2c856040cf9295caed200698d7cf7a1574690b36b0bf",
+ "transactions": [
+ "0xf879818f4883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a03e0f9aa0ca6ec8b4f9e7fccd9b710c0de4414618726e298b36816cd6d689a89aa07d3950b5ebbaa58f5c4e0bc0571499d9d58d563ce2c039664cf210815e43d0e5"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xa7fd4dbac4bb62307ac7ad285ffa6a11ec679d950de2bd41839b8a846e239886"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np179",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xf00d6a4f13579131abcd2c856040cf9295caed200698d7cf7a1574690b36b0bf",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf56610f73e08c2ccaaa314c23bc79022214919c02d450cab12975da3546b68fd",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xb3",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x6fe",
+ "extraData": "0x",
+ "baseFeePerGas": "0x3f",
+ "blockHash": "0x5711092388b2fd00bf4234aca7eede2bdc9329ea12e2777893d9001f4f2c8468",
+ "transactions": [
+ "0xf8648190408302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0f41a67e92f032c43cc601daa205026cc5a97affb0f92064991122a1aa92428dfa0237053c462847907c840ada5076caab16adc071da181e9277926a310adcb8e3d"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x6ba7b0ac30a04e11a3116b43700d91359e6b06a49058e543198d4b21e75fb165"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np180",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x5711092388b2fd00bf4234aca7eede2bdc9329ea12e2777893d9001f4f2c8468",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xfa57370da0cc72170d7838b8f8198b0ebd949e629ca3a09795b9c344dead4af5",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xb4",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x708",
+ "extraData": "0x",
+ "baseFeePerGas": "0x38",
+ "blockHash": "0xb58807a37c03cf3b0f1c9104cfd96f6cb02b1e08e0eecdd369cac48d0003b517",
+ "transactions": [
+ "0xf8678191398252089427952171c7fcdf0ddc765ab4f4e1c537cb29e5e501808718e5bb3abd109fa076a045602a7de6b1414bdc881a321db0ce5255e878a65513bad6ac3b7f473aa7a01a33017b5bcf6e059de612293db8e62b4c4a3414a7ba057c08dd6172fb78a86c"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x8835104ed35ffd4db64660b9049e1c0328e502fd4f3744749e69183677b8474b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np181",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb58807a37c03cf3b0f1c9104cfd96f6cb02b1e08e0eecdd369cac48d0003b517",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6d3f029e56f9ee3db9ed8f9156cd853fb1fcafe05475ec8c2a4dd337a5e3e20e",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xb5",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x712",
+ "extraData": "0x",
+ "baseFeePerGas": "0x32",
+ "blockHash": "0x56b5aa12ccfcbd86737fe279608cb7585fbc1e48ddfcdac859bb959f4d3aa92a",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x14",
+ "validatorIndex": "0x5",
+ "address": "0x892f60b39450a0e770f00a836761c8e964fd7467",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x562f276b9f9ed46303e700c8863ad75fadff5fc8df27a90744ea04ad1fe8e801"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np182",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x56b5aa12ccfcbd86737fe279608cb7585fbc1e48ddfcdac859bb959f4d3aa92a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x58a6332c9e7b85155106515f20355c54bb03c6682024baa694cbaff31c3b84ff",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xb6",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x71c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x2c",
+ "blockHash": "0xb0d7fbd46bd67d4c3fa51d0e1b1defaf69237d0f6e2049486c907b049b47e01c",
+ "transactions": [
+ "0xf88281922d830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa01ae40537174a716b5f33d153e9251ae8c1d72852da25823f6d954b9dbc5740cca02ff07812990e0645cab5c9d89028f7255f50d0eee5bee334b3ba10d71485c421"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xd19f68026d22ae0f60215cfe4a160986c60378f554c763651d872ed82ad69ebb"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np183",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb0d7fbd46bd67d4c3fa51d0e1b1defaf69237d0f6e2049486c907b049b47e01c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x55d4e87d040358926c84414b854fc47a75b9963df75e359a2182464c51201088",
+ "receiptsRoot": "0x1fccfe93768ce1ed60d0f83cbc8bef650cb1d056c35a4b233ae41a1b8219f92d",
+ "logsBloom": "0x00000080000000000000000000000000000000000000004000000000000010000000000000000000000000000000014000800000000000000100102000000000000000000000020000000000200000000000000000100000000000200000002000000000000000000000002000000000000000000000000000000000000000001000002000400020040000000000000200000000000000000000000000000000000000002000000000000000000000100000000000022000000000000000000000000000000004000000080000000000000000000000000004004000000000040002000040000000000000000000000000000000000000000000000000100000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xb7",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x726",
+ "extraData": "0x",
+ "baseFeePerGas": "0x27",
+ "blockHash": "0x66011454670d5664e8e555d01d612c70cadabfb6a4a317f375495ef3daa9d1b4",
+ "transactions": [
+ "0xf87981932883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa02d1dcc844efba97a51917ab3d79f837680f42e2e76ab51b4b630cbe9a6e4e10ea03d3f624c82de14b23b0c5553621cc9a4c649cd856a616f5a91bad8bf0c0d1709"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf087a515b4b62d707991988eb912d082b85ecdd52effc9e8a1ddf15a74388860"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np184",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x66011454670d5664e8e555d01d612c70cadabfb6a4a317f375495ef3daa9d1b4",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd3ec16ab633987e17a4e8c573014b1fc9919f004b3cb80da11280d1caad1fe3e",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xb8",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x730",
+ "extraData": "0x",
+ "baseFeePerGas": "0x23",
+ "blockHash": "0x36e1e3513460407c80dfcfab2d2826ea432dadb99aa7415f9cffcf56faf27f94",
+ "transactions": [
+ "0xf8648194248302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a01e5301a3386e11893c0275367ac5d31fea88f31731e66ee769bfddc3486cff1aa0203dbf8bbfa9df2d635e1889d51e06611e8c2a769609908aeb5e97decb03b141"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf7e28b7daff5fad40ec1ef6a2b7e9066558126f62309a2ab0d0d775d892a06d6"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np185",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x36e1e3513460407c80dfcfab2d2826ea432dadb99aa7415f9cffcf56faf27f94",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x692ddd6938f00a07474233619f579b30c1eaaef353a2b0cc24b47d7898aa5c49",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xb9",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x73a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x1f",
+ "blockHash": "0x44e05b6820cf1d7cf9cd2148d6f71a6a649c9a829b861539d2c950f701e27260",
+ "transactions": [
+ "0x02f86a870c72dd9d5e883e819501208252089404d6c0c946716aac894fc1653383543a91faab600180c080a0039c18634a9f085ba0cd63685a54ef8f5c5b648856382896c7b0812ee603cd8aa05ecfde61ea3757f59f0d8f0c77df00c0e68392eea1d8b76e726cb94fb5052b8a"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x77361844a8f4dd2451e6218d336378b837ba3fab921709708655e3f1ea91a435"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np186",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x44e05b6820cf1d7cf9cd2148d6f71a6a649c9a829b861539d2c950f701e27260",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x9eac86abf4371646a564bb6df622644682e5de5bf01fed388ccaf10700e46e88",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xba",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x744",
+ "extraData": "0x",
+ "baseFeePerGas": "0x1c",
+ "blockHash": "0xcc3b1096f3ce63881c77751baec2048561baa2dc84ea0ef9d3a5515061aa74e0",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x15",
+ "validatorIndex": "0x5",
+ "address": "0x281c93990bac2c69cf372c9a3b66c406c86cca82",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe3cb33c7b05692a6f25470fbd63ab9c986970190729fab43191379da38bc0d8c"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np187",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xcc3b1096f3ce63881c77751baec2048561baa2dc84ea0ef9d3a5515061aa74e0",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xff13e99ee95ffe82139758f33a816389654a5c73169b82983de9cf2f1f3dbd9f",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xbb",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x74e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x19",
+ "blockHash": "0x871cb66f77db23f8e70541a647329c5ca9b6d40afd3950d48df4915f300e664a",
+ "transactions": [
+ "0xf88281961a830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a0276782d84f5f6ab0805be5e57923747bae9fa2b06ed4b45bcc364bdb4f09eca1a0484f9fc2a31a4b5f24ba33da54649e6a3261c0bee52d91576246bb54698c1535"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc893f9de119ec83fe37b178b5671d63448e9b5cde4de9a88cace3f52c2591194"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np188",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x871cb66f77db23f8e70541a647329c5ca9b6d40afd3950d48df4915f300e664a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x522c1eb0c4d1332668a2e3676efd54899579d85fd4e7007fd228702d9c964baa",
+ "receiptsRoot": "0x90d4e326daf1e15e41687f281f8e638992c4cdfbe590eb4956fd943aa39f1bba",
+ "logsBloom": "0x48000040000000000000000000004000000000000000000000400000000000002000000000000000000000000000000018000000000000000000002000000000000000000000100000002000000800000000000000000000000000002000000000000000000000000000000000000000040000020000040000000000000000000000000101000000000000000000010000000000040000000000000000000000008000000000000000000000800000000000201008000000000000001000000000000010000000000000100000000000000000000000040100000000000000000008000000000000000000000000000000000000004000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xbc",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x758",
+ "extraData": "0x",
+ "baseFeePerGas": "0x16",
+ "blockHash": "0x174a8681a0d28b9a3d49afb279714acb2bfe4a3abfe490522bb3d899d3c71c8d",
+ "transactions": [
+ "0xf87981971783011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0870548904b9e901c294fd1c04a6cff92fbb40491e00a1ffcbc551c6c5eba2db3a0524ff53000a94b71aef3a2c516354bc5d7fdb3f236d4647020762a56d9bd2fbf"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x39c96a6461782ac2efbcb5aaac2e133079b86fb29cb5ea69b0101bdad684ef0d"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np189",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x174a8681a0d28b9a3d49afb279714acb2bfe4a3abfe490522bb3d899d3c71c8d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xfb0eecb29a002997c00e0f67a77d21dd4fa07f2db85e3e362af4bbfcb69b6c12",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xbd",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x762",
+ "extraData": "0x",
+ "baseFeePerGas": "0x14",
+ "blockHash": "0x1b56a73d407c9a5e222c2097149c2f2cbb480a70437ee41779974b8ab968a8e1",
+ "transactions": [
+ "0xf8648198158302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0111d3d32f82c89fc830943a4aa0b20e013886491e06acede59ea4252b3366c05a07b9f9199ecdb210151db8a50c74fa1488b198db4e5dda3ad1fa003b70d9bd03a"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x72a2724cdf77138638a109f691465e55d32759d3c044a6cb41ab091c574e3bdb"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np190",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x1b56a73d407c9a5e222c2097149c2f2cbb480a70437ee41779974b8ab968a8e1",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x36fce9409ec76cfda58bd4145be0289d761c81131ed0102347b96127fd0888e2",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xbe",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x76c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x12",
+ "blockHash": "0x07d1571c1d0fbaf6cd5c2fa18e868d6dfc2aa56f7ee3bd5aaf61fa816d775ee9",
+ "transactions": [
+ "0xf86781991382520894478508483cbb05defd7dcdac355dadf06282a6f201808718e5bb3abd109fa0910304dbb7d545a9c528785d26bf9e4c06d4c84fdb1b8d38bc6ee28f3db06178a02ffc39c46a66af7b3af96e1e016a62ca92fc5e7e6b9dbe631acbdc325b7230a1"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x178ba15f24f0a8c33eed561d7927979c1215ddec20e1aef318db697ccfad0e03"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np191",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x07d1571c1d0fbaf6cd5c2fa18e868d6dfc2aa56f7ee3bd5aaf61fa816d775ee9",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd5d1fc871c3a4694da0e9a9f453c0e6f4c8f38fbef45db36c67cd354e22eb303",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xbf",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x776",
+ "extraData": "0x",
+ "baseFeePerGas": "0x10",
+ "blockHash": "0xda1708aede1e87f052ee6e9637f879462b613e4cbddacb18aa49907b55094ce4",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x16",
+ "validatorIndex": "0x5",
+ "address": "0xb12dc850a3b0a3b79fc2255e175241ce20489fe4",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf7b2c01b7c625588c9596972fdebae61db89f0d0f2b21286d4c0fa76683ff946"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np192",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xda1708aede1e87f052ee6e9637f879462b613e4cbddacb18aa49907b55094ce4",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x4d19a2ce0d61642b6420c9f23ea32bb72ebe24384ed110394d7e5ca98589f055",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xc0",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x780",
+ "extraData": "0x",
+ "baseFeePerGas": "0xe",
+ "blockHash": "0x082079039cffbdf78a5cc86fddb47d96c888e0e90b092f9e0591e0099086cc45",
+ "transactions": [
+ "0xf882819a0f830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa02356373d8d8ca7c15e547e717f7327ab0d803867cfabedf8d75e4d1cb264862ca011a3879ae15ab356e9558926382b7fa68b5c5a5c5b127b6f5176523dfe0ae986"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x16e43284b041a4086ad1cbab9283d4ad3e8cc7c3a162f60b3df5538344ecdf54"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np193",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x082079039cffbdf78a5cc86fddb47d96c888e0e90b092f9e0591e0099086cc45",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd67263b379522c5059bb0a7164b9cd3fa70697e4012b3b5c519ecf888dbc5700",
+ "receiptsRoot": "0xc1c820ad9bde8ce9524a7fa712d4849dc2f9f9553e8c00f1fe6c41323e31fbf7",
+ "logsBloom": "0x00000000000000000000000000000000000000000080000000000200000040000000000000000000000000000000000000000000000000000000001000000000000000000000000000001002000004020000000000000000000011000000000000000080000082000082080000000404000000080010000000000000000000000000100000010000000000000400000000000000000000000000000000400402000000000000000000000000000000000000000000200000000000002000000004000000400000002000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000800000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xc1",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x78a",
+ "extraData": "0x",
+ "baseFeePerGas": "0xd",
+ "blockHash": "0xe1207296a903bee61a02dd94d685640d76ab57ea96dd5789819583e35f2d7eb3",
+ "transactions": [
+ "0xf879819b0e83011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa03423551e59962468cb263c416cb4025c462624b8c8c687177571976c345a8d20a0190d3ab5979e300998fc96429a75c50e1c195115cada83e01fb14a28f2e294de"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x0a98ea7f737e17706432eba283d50dde10891b49c3424d46918ed2b6af8ecf90"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np194",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe1207296a903bee61a02dd94d685640d76ab57ea96dd5789819583e35f2d7eb3",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x2111d275b4901e864fcded894a9d9a046f9077d8f6c5af65a72c2243a32dbeaa",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xc2",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x794",
+ "extraData": "0x",
+ "baseFeePerGas": "0xc",
+ "blockHash": "0x8fd42cbdbbe1b8de72a5bb13684131e04572585077e0d61a0dfbb38d72ef309f",
+ "transactions": [
+ "0xf864819c0d8302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0b4dac384ec258b1a752856b3fcda42244c3e648577bf52d74f25313b3327bf1ca02f7b54b9475768335aab1778fd7ec882f3adbc9e78d4d04a0b78e93e4d41a76b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x7637225dd61f90c3cb05fae157272985993b34d6c369bfe8372720339fe4ffd2"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np195",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x8fd42cbdbbe1b8de72a5bb13684131e04572585077e0d61a0dfbb38d72ef309f",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x2efd726637cb91156021ac4ae337a87f9a1f28efd620de55b77faef0d3b84b22",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xc3",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x79e",
+ "extraData": "0x",
+ "baseFeePerGas": "0xb",
+ "blockHash": "0x326484b702b3c743f907227c8aad8733b1a6b7fda510512fe4fec0380bfbc0f1",
+ "transactions": [
+ "0x02f86a870c72dd9d5e883e819d010c82520894ae3f4619b0413d70d3004b9131c3752153074e450180c001a07cb73f8bf18eacc2c753098683a80208ac92089492d43bc0349e3ca458765c54a03bf3eb6da85497e7865d119fde3718cdac76e73109384a997000c0b153401677"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x6a7d064bc053c0f437707df7c36b820cca4a2e9653dd1761941af4070f5273b6"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np196",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x326484b702b3c743f907227c8aad8733b1a6b7fda510512fe4fec0380bfbc0f1",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xeba72457992e05a38b43a77a78ba648857cec13beb5412b632f6623521fe248d",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xc4",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x7a8",
+ "extraData": "0x",
+ "baseFeePerGas": "0xa",
+ "blockHash": "0x6a40d1d491a8624685fa20d913a684f691f1281da37059d527241526c965874d",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x17",
+ "validatorIndex": "0x5",
+ "address": "0xd1211001882d2ce16a8553e449b6c8b7f71e6183",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x91c1e6eec8f7944fd6aafdce5477f45d4f6e29298c9ef628a59e441a5e071fae"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np197",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x6a40d1d491a8624685fa20d913a684f691f1281da37059d527241526c965874d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x8713a1c42af83625ae9515312298d02425330b20a14b7040ec38f0655cb65317",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xc5",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x7b2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x9",
+ "blockHash": "0x25702b83ea77e2ad219178c026a506fa7a9c3f625b023963bc9c13c0d5cfeb14",
+ "transactions": [
+ "0xf882819e0a830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa02ed567eed3a763f56fe05c1e44575993df5b6cf67e093e0e9b5ec069ecaf76a2a04891e566e0d136b24d62ffe17f2bfaa0736a68f97b91e298b31897c790b2ed28"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xa1c227db9bbd2e49934bef01cbb506dd1e1c0671a81aabb1f90a90025980a3c3"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np198",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x25702b83ea77e2ad219178c026a506fa7a9c3f625b023963bc9c13c0d5cfeb14",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x2250f011d079600d76d5905dca93324f2fceb110390e8a7e7177569bd8ec73fd",
+ "receiptsRoot": "0x8027ec2e573bf62c00695cb9a0f67e28e4cce8dc44dc641d7388e4864d8ff78a",
+ "logsBloom": "0x00080000100000000000100000000840000000000000000000000000000000000000000000000000000000000000000000000000080080000080000000000000000000004000000000000000000000000000000000000000000000000000000200000000000000100100000000008001000000000000000000800000000000020010000000000000000000000000001000800000200000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000012000000000000000000040800000040004000000040000800001000000000000000000000000000000010000100000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xc6",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x7bc",
+ "extraData": "0x",
+ "baseFeePerGas": "0x8",
+ "blockHash": "0xa752bd3886362e9e5e57dba077628fedbfbca6b2a657df205ad20d739b035c22",
+ "transactions": [
+ "0xf879819f0983011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0c362dc6d498fcbd0eab0518a012a348d87fe4f2e53f7843f350662c43258609ba026d83d49fd9654704da7435b3400713ed7909a7203d6c55b8d43dd1e9fe67226"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x8fcfc1af10f3e8671505afadfd459287ae98be634083b5a35a400cc9186694cf"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np199",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa752bd3886362e9e5e57dba077628fedbfbca6b2a657df205ad20d739b035c22",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa8faa1ccb44b8d8d3ad926bdcb75a9e9fd18fa77728ef12aa9c4ba7be1906d3f",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xc7",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x7c6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x8",
+ "blockHash": "0x5d80c24a7a87ae0ab200b864029fbfe7bb750ba0a01c07191b7f52330d2c79ad",
+ "transactions": [
+ "0xf86481a0098302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a08683c22fc25a5413b758a32c5a6515b1b055541ad523ae4159c4d04c3f864260a06c8f2e1e929e9df95158a161e793ae162e1e4297f8042bf9358dcc119f5545e5"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xcc1ea9c015bd3a6470669f85c5c13e42c1161fc79704143df347c4a621dff44f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np200",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x5d80c24a7a87ae0ab200b864029fbfe7bb750ba0a01c07191b7f52330d2c79ad",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe4f7f192080fd853f053608561854cdb68eb8de9eda499fd7ad840ca729487d3",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xc8",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x7d0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x8",
+ "blockHash": "0x0fd7e67081119b73ebe7ae0483ce2154a2dfb8c503545d231e2af1f8942406ae",
+ "transactions": [
+ "0xf86781a109825208947c5bd2d144fdde498406edcb9fe60ce65b0dfa5f01808718e5bb3abd109fa015f510b05236b83a9370eb084e66272f93b4b646e225bdef016b01b3ac406391a03b4a2b683af1cb3ecae367c8a8e59c76c259ce2c5c5ffd1dc81de5066879e4b8"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xb0a22c625dd0c6534e29bccc9ebf94a550736e2c68140b9afe3ddc7216f797de"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np201",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x0fd7e67081119b73ebe7ae0483ce2154a2dfb8c503545d231e2af1f8942406ae",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x5188152524460d35f0c837dab28ac48f6aac93a75ecbb0bcb4af6a9c95e18a67",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xc9",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x7da",
+ "extraData": "0x",
+ "baseFeePerGas": "0x8",
+ "blockHash": "0x3043a03ed3369ba0dfdddac07cae4ca805dbbb0b411b3f5dd5e66198928a715b",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x18",
+ "validatorIndex": "0x5",
+ "address": "0x4fb733bedb74fec8d65bedf056b935189a289e92",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x92b8e6ca20622e5fd91a8f58d0d4faaf7be48a53ea262e963bcf26a1698f9df3"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np202",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x3043a03ed3369ba0dfdddac07cae4ca805dbbb0b411b3f5dd5e66198928a715b",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x09f47830b792bc39aa6b0c12b7024fa34d561ff9e0d32c27eab5127239799bb0",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xca",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x7e4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x9178b45b38e39c3e3f4bc590a301254543eedb5b146bed0900465b194aaf94e8",
+ "transactions": [
+ "0xf88281a208830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a03b50dfd68a93199762b4b47c08ca4c9f67d99e772f3fec9843a4e1c3ae4d6963a070a7b2cc31e53de9d1fa14f55f28b212979bd83bbd9e9097e65845e05a9ee40f"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf6253b8e2f31df6ca7a97086c3b4d49d9cbbbdfc5be731b0c3040a4381161c53"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np203",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x9178b45b38e39c3e3f4bc590a301254543eedb5b146bed0900465b194aaf94e8",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6a0d6e0a749247b4271d54ddfd2732ceb5b377c1db1ac40aa1d2339d3a143aaa",
+ "receiptsRoot": "0x189141497b4062bfbe61a7fb2f96cc8a95543e38c077c9150b740f8d01a313a8",
+ "logsBloom": "0x00000000000000000000040040000000000000000000080000000000004000000000000000004000000000008000000000000000000080000002008001000000000000000010000000000080000000000000000000200000002000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000020000000000000000000000800040000000000000000400000000000000000400001000000004000001000000000020000000000010000000000000000000000000000000000000000008000000000010000100000000000000001000000010000000000000800000000000000202000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xcb",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x7ee",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x9a575aa75a5f08a27533140141ffc7ed7d6e981da97316baf296dd1f8d1007d7",
+ "transactions": [
+ "0xf87881a30883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109f9f3c7a9aedd154caa41f602593b4bc78db1101336a81095174d4487dd8338878a0458e45144a4d1a634950ae79ac251065204776baa96a3f94c6d71a00323fe9b4"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xea8d762903bd24b80037d7ffe80019a086398608ead66208c18f0a5778620e67"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np204",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x9a575aa75a5f08a27533140141ffc7ed7d6e981da97316baf296dd1f8d1007d7",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xda96365c5a33f358ed732463139254c4f186e899ad00b05d9a30ff39d4d1a27d",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xcc",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x7f8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xb35f9d9c454a03adc1eeeaa9fef20caeb8f9445663a4768d18bc0bc1790650b1",
+ "transactions": [
+ "0xf86481a4088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0a82c39f1be580d16334c133165d5ceb8d9942b184ecccea09e73ff45120ac523a04432d6958bb18882f9f07e851abe454039a5b38d61fd975c7da486a834107204"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x543382975e955588ba19809cfe126ea15dc43c0bfe6a43d861d7ad40eac2c2f4"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np205",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb35f9d9c454a03adc1eeeaa9fef20caeb8f9445663a4768d18bc0bc1790650b1",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x2258c0e37e5bedab21f7ea2f65190d1d51f781743653168d02181c8f16246c71",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xcd",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x802",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x97f4a4e64ede52b5dfd694236e783d130206d111cf6a5eb83a3bb9a230dfd952",
+ "transactions": [
+ "0x02f86a870c72dd9d5e883e81a50108825208949a7b7b3a5d50781b4f4768cd7ce223168f6b449b0180c080a04f3e818870a240e585d8990561b00ad3538cf64a189d0f5703a9431bc8fd5f25a0312f64dd9ab223877e94c71d83cb3e7fe359b96250d6a3c7253238979dd2f32a"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x095294f7fe3eb90cf23b3127d40842f61b85da2f48f71234fb94d957d865a8a2"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np206",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x97f4a4e64ede52b5dfd694236e783d130206d111cf6a5eb83a3bb9a230dfd952",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xda2ecb481078839fd39c044b3fceae6468338266d9572da0f2281e58b9596914",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xce",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x80c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xb3c2c9a5de90f0637203e60288b50ecb21d17a2437cccf553d2424321fa112d4",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x19",
+ "validatorIndex": "0x5",
+ "address": "0xc337ded6f56c07205fb7b391654d7d463c9e0c72",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x144c2dd25fd12003ccd2678d69d30245b0222ce2d2bfead687931a7f6688482f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np207",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb3c2c9a5de90f0637203e60288b50ecb21d17a2437cccf553d2424321fa112d4",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf0f20309e2cec2fb6af448c58c40e206b788241bb88e62a8e7479aadc6bfa94e",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xcf",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x816",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x9e63e1a7df1b726901e3139cfb429592ef8d2107aa566bcae5f3b8e21f99f0da",
+ "transactions": [
+ "0xf88281a608830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa079aa26a33abe2e9504cfc6552c6b39434478b081f5cbbb613269d64980edaf93a079ffe44aec63b05644681b948ea0e5a996e106f3e074a90991c963ff3e7a8aa6"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x7295f7d57a3547b191f55951f548479cbb9a60b47ba38beb8d85c4ccf0e4ae4c"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np208",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x9e63e1a7df1b726901e3139cfb429592ef8d2107aa566bcae5f3b8e21f99f0da",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x177fc88f477d3dd466f7cac43b50d4b2b77fd468ef479177ed562d2401acd6c0",
+ "receiptsRoot": "0xd1458a51a7ca8d2c87390d85d986956f392bdd634ffbe4d5a7e2b09a142ce514",
+ "logsBloom": "0x00200000000000000000000000000000000000000400000000400000000000000000100400000000000000000010108000000000000000000000200800000000000004000000000000000002000000000000000000000000000000020002000408000021000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000010000000000002000000000000000000000400000000000000000000020000000000000000000000800000000000080000000000000000000000800000810002000000000400000000000000000000000000000000000000000000020000000000000000000000010080000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xd0",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x820",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x4e8e6e31a8922b68a96992288e49ab9716dd37f1da1ae5b22391bc62d61ac75a",
+ "transactions": [
+ "0xf87981a70883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0969f6d3d90ca6b62cbda31ed28b7522b297d847e9aa41e0eae0b9f70c9de1e01a0274e038abf0b9f2fba70485f52e4566901af94c9645b22a46b19aebb53b4c25d"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x9e8e241e13f76a4e6d777a2dc64072de4737ac39272bb4987bcecbf60739ccf4"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np209",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x4e8e6e31a8922b68a96992288e49ab9716dd37f1da1ae5b22391bc62d61ac75a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x55980d8ac0e8bfd779b40795a6d125a712db70daa937ace1f22a5fcd5fd2dfa6",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xd1",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x82a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xaf3e413fc388e1a5508f683df5806fe31d29f5df4552ccf2d6c6662816fae5fd",
+ "transactions": [
+ "0xf86481a8088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa04973c2a9d2fcff13428e8a3b3f0979185222cad34366777db8dfc6438cdac357a0128ad521391c000e18211ad8ffa45b41962fca43be83a50ce299d3bd4407f44b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xfc753bcea3e720490efded4853ef1a1924665883de46c21039ec43e371e96bb9"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np210",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xaf3e413fc388e1a5508f683df5806fe31d29f5df4552ccf2d6c6662816fae5fd",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x522d0f5f8de1ef5b02ad61a3bff28c2bd0ce74abca03116e21f8af6e564d7fd2",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xd2",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x834",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xa5b31d7aaa42b7be0c35a0fa375718d25441f90296550c10325a3e0f4d63217c",
+ "transactions": [
+ "0xf86781a9088252089485f97e04d754c81dac21f0ce857adc81170d08c601808718e5bb3abd109fa0547e9550b5c687a2eb89c66ea85e7cd06aa776edd3b6e3e696676e22a90382b0a028cb3ab4ef2761a5b530f4e05ef50e5fc957cfbc0342f98b04aa2882eec906b2"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x5f5204c264b5967682836ed773aee0ea209840fe628fd1c8d61702c416b427ca"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np211",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa5b31d7aaa42b7be0c35a0fa375718d25441f90296550c10325a3e0f4d63217c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xda7dd7f5babcf1b3c407e141b4ea76932922489f13265a468fb6ab88891ff588",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xd3",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x83e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xa1ffa80abb4f7f92b3932aa0ca90de5bb4a2908866b3d6727b05d5d41139e003",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x1a",
+ "validatorIndex": "0x5",
+ "address": "0x28969cdfa74a12c82f3bad960b0b000aca2ac329",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x5ba9a0326069e000b65b759236f46e54a0e052f379a876d242740c24f6c47aed"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np212",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa1ffa80abb4f7f92b3932aa0ca90de5bb4a2908866b3d6727b05d5d41139e003",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xb6724f1d73bee909624707836e66ffbb21b568dd5bd697668ce18a4ae31818a4",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xd4",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x848",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x9a77bcf7bf0d7e6cebeb8c60b4c36538b4fab0e633b9683ba589981c293a009c",
+ "transactions": [
+ "0xf88281aa08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0e582e9d64ed6f95da074eaeb70ca1e47e8627bb7cd4e34d5aab01ff49ee6dd90a022cc32cc7c3030b0b47f1f69911311acd2ae3e95f19f766b69ebb67804676262"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xb40e9621d5634cd21f70274c345704af2e060c5befaeb2df109a78c7638167c2"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np213",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x9a77bcf7bf0d7e6cebeb8c60b4c36538b4fab0e633b9683ba589981c293a009c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6a1c08c9dfcc48c37e349407f37f9c10d9d4c4b1d6c28d30af2630679c74ea96",
+ "receiptsRoot": "0x730ab6f592da8dfc7815bcba110f6de8dd0343aa932f55b589ff99d83b9ec358",
+ "logsBloom": "0x00000000000000000000000000000000000000200000000400000000000000002008008000100100000800000000000020000000000000000000000000000000800001000000002000000000000000800000010000000000000000420008000004000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000004000000000000008000000000000000000000000000000000000000000000000000000400010000000000004000000000000008000000840000000000000000040000000000000000000000000000120000001000000100000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xd5",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x852",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xecb42acc218101eb9c6d883a333d07c7736d7ed0b233f3730f5b9c9a75314cf5",
+ "transactions": [
+ "0xf87981ab0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a08747d48d3358eb47195c17f67f22af5eca1177fba591b82b8b626058a347b2e5a0420e02657efee51f73f95017b354b1bca2850269a5de7b307a280c63830f3333"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x70e26b74456e6fea452e04f8144be099b0af0e279febdff17dd4cdf9281e12a7"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np214",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xecb42acc218101eb9c6d883a333d07c7736d7ed0b233f3730f5b9c9a75314cf5",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x67ca707e9bd81330c2fb9060e88ce0b0905c85c9be26ae4779874f3892ebab0c",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xd6",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x85c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x1191fbb4f2692461fc0ae4aa7141a1743a345c101dc9db157bc7ad3072fe1e9d",
+ "transactions": [
+ "0xf86481ac088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a03752a40997c9b7b9c5dfd48f88990ddc727517540c403dadcb7476b8a4a9d4f6a0780178975646114017be4b06fae0689a979a45166f810604f76934239b0a2b9e"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x43d7158f48fb1f124b2962dff613c5b4b8ea415967f2b528af6e7ae280d658e5"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np215",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x1191fbb4f2692461fc0ae4aa7141a1743a345c101dc9db157bc7ad3072fe1e9d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3b5ca86f1650f79fb42d74e523dc4e631989a3175023ced9a239e9bcc2c15a8e",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xd7",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x866",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x9b9e271d571b730c9e6acd133c99eba1ccd8b8174ffe080540fc3b1a5625943a",
+ "transactions": [
+ "0x02f869870c72dd9d5e883e81ad010882520894414a21e525a759e3ffeb22556be6348a92d5a13e0180c001a0047b3309af68dd86089494d30d3356a69a33aa30945e1f52a924298f3167ab669fb8b7bd6670a8bbcb89555528ff5719165363988aad1905a90a26c02633f8b9"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xb50b2b14efba477dddca9682df1eafc66a9811c9c5bd1ae796abbef27ba14eb4"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np216",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x9b9e271d571b730c9e6acd133c99eba1ccd8b8174ffe080540fc3b1a5625943a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xc1ab95016db7b79d93ee0303af69ce00bdb090d39e20a739d280beb3e301c9d5",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xd8",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x870",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x4e27c497c83c3d06d4b209e7d5068920d7e22bb3c959daa4be5485d6ab0cce54",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x1b",
+ "validatorIndex": "0x5",
+ "address": "0xaf193a8cdcd0e3fb39e71147e59efa5cad40763d",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc14936902147e9a121121f424ecd4d90313ce7fc603f3922cebb7d628ab2c8dd"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np217",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x4e27c497c83c3d06d4b209e7d5068920d7e22bb3c959daa4be5485d6ab0cce54",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf8c17319b995ce543f9ace79aab7f7c928b36facae4e6e0dd50991f95bed1542",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xd9",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x87a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xdf05b4a3aff6236d0d3c1ee058b874309c37005a2bbb41a37432b470ed49e678",
+ "transactions": [
+ "0xf88281ae08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa05a8e9e2a3556016a65d5b99849bd44cd6ab17cfb15d7850356c9b491357f0611a01f7d3c43fe1759b4ec768275e918e12dae75db56a5d2140d1403ef3df41f56df"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x86609ed192561602f181a9833573213eb7077ee69d65107fa94f657f33b144d2"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np218",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xdf05b4a3aff6236d0d3c1ee058b874309c37005a2bbb41a37432b470ed49e678",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x05bd7288ee80780a92b234fec2f8bb5bb4d0425721ddbf89d866c62b288f6bff",
+ "receiptsRoot": "0xbebbd614564d81a64e904001523ad2e17a94b946d6dfc779928ec9048cf9a3f7",
+ "logsBloom": "0x40000000000020000000000040000000000000000000001000000000000000021000000000004008000000000002000001000100000000000000002000000000000400000000000008002000000000000000100000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000100000400000000000000000000000000000000000000000000000000000020000000000010040000002000000000000000000000000000000000000000000000000020000000000200000000000200000000000000011000000000201400000000000001000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xda",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x884",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xf9a9d8409219172c2a602cfb9eadffdeb13a68c55a48e048a19c3b17d85e3b46",
+ "transactions": [
+ "0xf87981af0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0b3a49ddc2fc9f12cb1dc0a67623d5a1a6a1b5bf59a8f1736c9f0ab3b564250d3a05fc1ca6dab6b9337827afb55342af8a51fae064157e9c78b76dacd66bbea55d1"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x0a71a6dbc360e176a0f665787ed3e092541c655024d0b136a04ceedf572c57c5"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np219",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xf9a9d8409219172c2a602cfb9eadffdeb13a68c55a48e048a19c3b17d85e3b46",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x8236fb6bc66022c43d12c08612fd031d8b42852bef9a2dec04c1bc4b83cba489",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xdb",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x88e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xf69983460a4d977eceea022607df6db15b3d8103f78e58d73eeac3593053dbc6",
+ "transactions": [
+ "0xf86481b0088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa08a2bbd86fd1bb42e548fa4b4c4710f6c6ed03b4700f9e3a213bc70d17f016a3ca076d8bf736d722af615228680c31acd9815b9380a8bc5895cddb2361170274a7f"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xa4bcbab632ddd52cb85f039e48c111a521e8944b9bdbaf79dd7c80b20221e4d6"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np220",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xf69983460a4d977eceea022607df6db15b3d8103f78e58d73eeac3593053dbc6",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x1d9d412ef451097aa53e4fc8f67393acfd520382a1c4cfa6c99e2fb180a661db",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xdc",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x898",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xecea5d6aa092dc29520fcd6cd44102c571c415fd5d641e978af4933c476020a6",
+ "transactions": [
+ "0xf86781b10882520894fb95aa98d6e6c5827a57ec17b978d647fcc01d9801808718e5bb3abd10a0a0c71a69f756a2ef145f1fb1c9b009ff10af72ba0ee80ce59269708f917878bfb0a03bfe6a6c41b3fe72e8e12c2927ee5df6d3d37bd94346a2398d4fcf80e1028dde"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x2bc468eab4fad397f9136f80179729b54caa2cb47c06b0695aab85cf9813620d"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np221",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xecea5d6aa092dc29520fcd6cd44102c571c415fd5d641e978af4933c476020a6",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x830dfc2fb9acb72d3c03a6181b026becbcdca1abf4ab584b2dd00c48fd2f6a62",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xdd",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x8a2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xbc664826810922530f7e9876cd57ef0185f2f5f9bbafb8ee9f6db2d6e67be311",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x1c",
+ "validatorIndex": "0x5",
+ "address": "0x2795044ce0f83f718bc79c5f2add1e52521978df",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xfc7f9a432e6fd69aaf025f64a326ab7221311147dd99d558633579a4d8a0667b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np222",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xbc664826810922530f7e9876cd57ef0185f2f5f9bbafb8ee9f6db2d6e67be311",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x7492f26a06f6b66d802f0ac93de1640ec7001652e4f9498afa5d279c1c405ccd",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xde",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x8ac",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xb908ac3bd269a873b62219e78d5f36fdfd6fb7c9393ad50c624b4e8fd045b794",
+ "transactions": [
+ "0xf88281b208830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa09765f880d3815c484a796d3fd4c1791ab32f501ba8167bfd55cde417b868e459a0310fdd4d8d953cf38b27fa32ad6e8922ef0d5bd7ba3e61539dd18942669187f1"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x949613bd67fb0a68cf58a22e60e7b9b2ccbabb60d1d58c64c15e27a9dec2fb35"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np223",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb908ac3bd269a873b62219e78d5f36fdfd6fb7c9393ad50c624b4e8fd045b794",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x1e515c524c17bcb3f8a1e8bd65c8403ae534c5c2c2fc0bddce2e69942c57028a",
+ "receiptsRoot": "0x336f567c728ef05cbd3f71c4a9e9195b8e9cd61f8f040fdd6583daf0580a0551",
+ "logsBloom": "0x00000000000000000000000000000000000000000000400000000000002000080000080000000000000000000000000000000000000000000000000000000000008000000040000030040000000000800000000006000000000008010001000000004000000000000020000000000000000000000000000000000000040000000400080000000000000000020000000000000040000020000000000000000000000020000001000000000000000000000000100000000000010000000000000001000000000000000000000002000000000000800000000000000200000000000000000000000000000000000020000000000000000000001000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xdf",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x8b6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x2e8980e0390ae8503a42316b0e8ceb3bbe99245131ab69115f2b5555d4ac1f4e",
+ "transactions": [
+ "0xf87981b30883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0cdd0a69ca9a6c3977ae1734d40175aa0720a866ff9353ce4aadfd8a4cd762e53a0290a5ac57e2f318959aaadec811bf9f8017191594476415923ddafef9a25de7c"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x289ddb1aee772ad60043ecf17a882c36a988101af91ac177954862e62012fc0e"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np224",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x2e8980e0390ae8503a42316b0e8ceb3bbe99245131ab69115f2b5555d4ac1f4e",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa0a11d77a69e2c62b3cc952c07b650c8f13be0d6860ddf5ba26ef560cefd2000",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xe0",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x8c0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xcd2f03e81d096f1c361b6b0a1d28ae2c0ec1d42a90909026754f3759717a65db",
+ "transactions": [
+ "0xf86481b4088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0e55768f282e2db5f2e48da696a07d1bff5687ca7fa5941800d02a1c49a4781b4a00eb30d56234ac991413000037e0f7fb87c8c08b88ae75aa33cb316714b638e1b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xbfa48b05faa1a2ee14b3eaed0b75f0d265686b6ce3f2b7fa051b8dc98bc23d6a"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np225",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xcd2f03e81d096f1c361b6b0a1d28ae2c0ec1d42a90909026754f3759717a65db",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd8287e5675676595007edfbfff082b9f6f86f21bb0371e336ca22e12c6218f68",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xe1",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x8ca",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x2a2c4240cf6512959534cdaf586119243f718b4ff992ad851a61211a1ea744d8",
+ "transactions": [
+ "0x02f86a870c72dd9d5e883e81b5010882520894f031efa58744e97a34555ca98621d4e8a52ceb5f0180c001a099b1b125ecb6df9a13deec5397266d4f19f7b87e067ef95a2bc8aba7b9822348a056e2ee0d8be47d342fe36c22d4a9be2f26136dba3bd79fa6fe47900e93e40bf3"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x7bf49590a866893dc77444d89717942e09acc299eea972e8a7908e9d694a1150"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np226",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x2a2c4240cf6512959534cdaf586119243f718b4ff992ad851a61211a1ea744d8",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x1e3c75d8db0bd225181cc77b2ec19c7033a35ba033f036a97ba8b683d57d0909",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xe2",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x8d4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x1fb4e86909057635bfe8d130d4d606c1e9a32bd5e8da002df510861246633a96",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x1d",
+ "validatorIndex": "0x5",
+ "address": "0x30a5bfa58e128af9e5a4955725d8ad26d4d574a5",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x992f76aee242737eb21f14b65827f3ebc42524fb422b17f414f33c35a24092db"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np227",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x1fb4e86909057635bfe8d130d4d606c1e9a32bd5e8da002df510861246633a96",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xacca3ad17c81310c870a9cf0df50479973bd92ade4a46b61a2012fa87c7b8a0f",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xe3",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x8de",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x6f03c5c20de46ba707f29a6219e4902bc719b5f9e700c9182d76345fa8b86177",
+ "transactions": [
+ "0xf88281b608830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa05147ab82c47d0c6f6298c21b54a83bc404088dcf119f5719034a1154f2c69acaa035070fffcba987b70efcfc6efbf5a43974de5e11331879bbfbfe7556915da7b2"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xda6e4f935d966e90dffc6ac0f6d137d9e9c97d65396627e5486d0089b94076fa"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np228",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x6f03c5c20de46ba707f29a6219e4902bc719b5f9e700c9182d76345fa8b86177",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x0468ebde6657b86a2f1561ae8ef57c6cbe23b7dc08cc0ad823ea3831388e1691",
+ "receiptsRoot": "0x591e45121efd9a319ad048f68a35db27c69b829a65d0c7817224a1c5071ab327",
+ "logsBloom": "0x00000005000000000010000000080000000000000000000000000008200000004000002080000001000000000000000000010000000000080000000000000000000000000000800000000000000000000000000000000000000000000000000b00000200000000000000000000200000000000200001400000000000100000000000000000000400000000000000000000000000000000000000000000000000000002008000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000020000000010000080000000000000114000000000000000000000040000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xe4",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x8e8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x8c7ac6681ed2a5020837149f8953a2762227b7bb41f2f46bc0c33508190c3e72",
+ "transactions": [
+ "0xf87981b70883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa04ccccf5fa7c7ed5b48d30bee3e8b61c99f8ff9ddecff89747e5685b059d70fa7a042982d8d2a54f9a055fd75df65488462a0ceae67b8a80966427c5d7ea1cf563b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x65467514ed80f25b299dcf74fb74e21e9bb929832a349711cf327c2f8b60b57f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np229",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x8c7ac6681ed2a5020837149f8953a2762227b7bb41f2f46bc0c33508190c3e72",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x9f5936ddc444db8ba3787be50038f195ddb86663f39b62d556f7700334f441d1",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xe5",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x8f2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x01bb09f016e5dfda9ef7170f45fe4b648dd3761b26c83c18bb0eea828bbc8663",
+ "transactions": [
+ "0xf86481b8088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa07cc4f254afaef8c4953d8a30221c41a50b92629846448a90a62ebdc76de8b2eea073f46d5c867c718486a68dfdf1cd471d65caa8a2495faba0f0a19ca704201e1b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xcc2ac03d7a26ff16c990c5f67fa03dabda95641a988deec72ed2fe38c0f289d6"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np230",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x01bb09f016e5dfda9ef7170f45fe4b648dd3761b26c83c18bb0eea828bbc8663",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x57dc2fdfe5e59055a9effb9660cfc7af5e87d25a03c9f90ce99ee320996a1991",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xe6",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x8fc",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x15d41d78de758ec47434a48dc695897705ad5990ac584d2a51d8b7a51419abe0",
+ "transactions": [
+ "0xf86781b908825208940a3aaee7ccfb1a64f6d7bcd46657c27cb1f4569a01808718e5bb3abd109fa0d2aa10777b7c398921921258eeecaff46668278fd6f814ea4edb06f2a1076353a0542ef4ed484a1403494238e418bb8d613012871710e72dde77bb1fa877f1fae3"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x096dbe9a0190c6badf79de3747abfd4d5eda3ab95b439922cae7ec0cfcd79290"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np231",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x15d41d78de758ec47434a48dc695897705ad5990ac584d2a51d8b7a51419abe0",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xc6a8588f5fa71465604ccee5244d5c72a296994fb2bf1be478b664bc2aa77c39",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xe7",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x906",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xa3b4d9f55cfc3ed49c694fa2a634b73f397d5847b73b340d123b2111ba5adc71",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x1e",
+ "validatorIndex": "0x5",
+ "address": "0xd0752b60adb148ca0b3b4d2591874e2dabd34637",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x0c659c769744094f60332ec247799d7ed5ae311d5738daa5dcead3f47ca7a8a2"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np232",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa3b4d9f55cfc3ed49c694fa2a634b73f397d5847b73b340d123b2111ba5adc71",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x38cdb4e70eb9771bab194d9310b56dbfcba5d9912cd827406fff94bddf8549d3",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xe8",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x910",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x4ff6fbd3afcc33972501397c65fe211d7f0bf85a3bde8b31e4b6836375d09098",
+ "transactions": [
+ "0xf88281ba08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a06f8db09016d87e96d45d0835a60822fb305336ab1d792944f6f0aa909b73c9d7a01da7c6ba739bf780143672031e860f222149e1e6314171737fee23537a1e7f0c"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x9cb8a0d41ede6b951c29182422db215e22aedfa1a3549cd27b960a768f6ed522"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np233",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x4ff6fbd3afcc33972501397c65fe211d7f0bf85a3bde8b31e4b6836375d09098",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xbf1db5dc400fd491fad1abd61287f081ebd7398c76f20ecc0a6c9afb30ba5508",
+ "receiptsRoot": "0xed257fe243a1ffa922e5a62e40ffb504d403afc1d870fdcacd7f0aaf714e9ca1",
+ "logsBloom": "0x200000000000000000000000000000000000000000000000000009000000800000000000104010000000000000000000000000000000000000000100000000080008000000000000000000800000000000000000000000000008000000000000400000000000004040000000000000000000002000000000080004010000000000000000100000000000000000000040000000000000000000000080010000000000000002000000020c0000000000000000000000000000000000000000000000000000000000000000000000000000080000000080000000000000000000000000400080000000400000000000080000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xe9",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x91a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xf1364f41ffcf3f76e045b1634e4f62db38f5c053edfa7d0a13d87299896ddff9",
+ "transactions": [
+ "0xf87981bb0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0ef0e59c1798c0a7645f75f893cf81eae4aff9f49159b7365b8d4e907367f91f6a0095a58cb4d8be1816acf8b4e11f9d9b2a03d3f392eee1f19bea70b50ed151584"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x2510f8256a020f4735e2be224e3bc3e8c14e56f7588315f069630fe24ce2fa26"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np234",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xf1364f41ffcf3f76e045b1634e4f62db38f5c053edfa7d0a13d87299896ddff9",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x5b75a7bfd5eb4c649cb36b69c5ccf86fecb002188d9e0f36c0fdbc8a160e4ac6",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xea",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x924",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xa2474d57b356b865a29ccfb79623d9a34ed84db9f056da5dd4e963f816baa180",
+ "transactions": [
+ "0xf86481bc088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a078dfab2121885d4181d63c7088757f7feb65131b155ad74541de35c055c31ec3a005cccd843ec8a535a567451c3b5034e05bac10f9328c63aa0b4893ee4f910ba2"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x2d3deb2385a2d230512707ece0bc6098ea788e3d5debb3911abe9a710dd332ea"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np235",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa2474d57b356b865a29ccfb79623d9a34ed84db9f056da5dd4e963f816baa180",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3f130c3409ad205204d14e6b5be4ccf2e65559d39cc98dfc265e1436990e5964",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xeb",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x92e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x9a195498e43997a5769957e54f0fa6f56d8442e54f8a26efafbf89130446fd4d",
+ "transactions": [
+ "0x02f86a870c72dd9d5e883e81bd010882520894f8d20e598df20877e4d826246fc31ffb4615cbc00180c001a0c982933a25dd67a6d0b714f50be154f841a72970b3ed52d0d12c143e6a273350a07a9635960c75551def5d050beee4014e4fef2353c39d300e649c199eebc8fd5e"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x1cec4b230f3bccfff7ca197c4a35cb5b95ff7785d064be3628235971b7aff27c"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np236",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x9a195498e43997a5769957e54f0fa6f56d8442e54f8a26efafbf89130446fd4d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x1ad56a036d6b544ee8f96f2d3e72dfdb360fa3c81edef33dd9e9fc1779d174a4",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xec",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x938",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xca48eaf8da077241a7938435cf1576b2628c65afea7b1aa2665c74573e352205",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x1f",
+ "validatorIndex": "0x5",
+ "address": "0x45f83d17e10b34fca01eb8f4454dac34a777d940",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x18e4a4238d43929180c7a626ae6f8c87a88d723b661549f2f76ff51726833598"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np237",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xca48eaf8da077241a7938435cf1576b2628c65afea7b1aa2665c74573e352205",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf43c19d64439e20deb920de4efbb248d44d4f43d0dfecd11350501bc1a4bf240",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xed",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x942",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xd6a5ae0ebd55680da60432b756f7914f8fb8bbcead368348e3b7f07c8cfa501e",
+ "transactions": [
+ "0xf88281be08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa06ba7d56fdfaf77a1a66bfef9529419b73d68fc1aa9edef961ac3a8898f04e5caa054635ee7b91858d97e66944311c81fd4f57d328ee4fbdf8ce730633909a75f01"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x700e1755641a437c8dc888df24a5d80f80f9eaa0d17ddab17db4eb364432a1f5"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np238",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xd6a5ae0ebd55680da60432b756f7914f8fb8bbcead368348e3b7f07c8cfa501e",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x05a62e01803a967ff89e7e9febf8d50b1b3092aab5580c7f85f465e7d70fef3f",
+ "receiptsRoot": "0x294eca38bb21bd8afeb2e5f59d0d4625058d237e2109428dfb41b97138478318",
+ "logsBloom": "0x00000040000000001000000000008000000000000000200000000000000000000000008000000000000000020000000040000000000000000000000004000000000000000000800000000000000000000000000000000080000000000000001000000000400000000400000000000000000000000000000000000000000000000880000000000400002000000040000000000000000000000000000810000100000080000080000000000000080000000000000001000000000000000000000000000000080000002000000000000010000000000000000010000000000000002000000000800000000400000000000000000000080000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xee",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x94c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x06466f86e40c982578b247579fa1fa5773d6169e77a79a625950c4aa16ce88b1",
+ "transactions": [
+ "0xf87981bf0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0548377761079f73162f83bdc2cfb09dcde9e08c8db66d4d983f1856c5145fe6fa06b2bd1223fbb1b72016150f57bc7ae1f8cce5c0fd301bb9216bb804c89bf0a97"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xcad29ceb73b2f3c90d864a2c27a464b36b980458e2d8c4c7f32f70afad707312"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np239",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x06466f86e40c982578b247579fa1fa5773d6169e77a79a625950c4aa16ce88b1",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xbca1fef6bcfcbb170b7b349f92a3b92fe03296dac1fd64ccda295c496a261a16",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xef",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x956",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x74b00e695ebf3210bda9ad8b3aa1523475d922fd556e551cfd606ebcf807d681",
+ "transactions": [
+ "0xf86481c0088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa08cfe044eb5748d538f72e560c45c7a01f94f4b7c6e9b1245bade89c0d97f9932a02b21fe651e5fb05d1f8de320dcf8cc037b2c0e989793f6b445f397c77f42a4f0"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xa85e892063a7fd41d37142ae38037967eb047436c727fcf0bad813d316efe09f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np240",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x74b00e695ebf3210bda9ad8b3aa1523475d922fd556e551cfd606ebcf807d681",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x82a80ad266f2a1539a79b2dcf8827aabedcc1deeb6cfb4869a8ed2ea26923726",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xf0",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x960",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xd908ab400c351cee493619c9b0b56c6ae4d90bd6e995e59ac9302a7b20c13fc3",
+ "transactions": [
+ "0xf86781c10882520894fde502858306c235a3121e42326b53228b7ef46901808718e5bb3abd10a0a03d79397e88a64f6c2ca58b5ec7ba305012e619331946e60d6ab7c40e84bf1a34a04278773d2796a0944f6bedadea3794b7ad6a18ffd01496aabf597d4a7cf75e17"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x040100f17208bcbd9456c62d98846859f7a5efa0e45a5b3a6f0b763b9c700fec"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np241",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xd908ab400c351cee493619c9b0b56c6ae4d90bd6e995e59ac9302a7b20c13fc3",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x59b60dbf89d7c0e705c1e05f6d861bfb38bec347663df6063be9eb020e49972a",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xf1",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x96a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x13fdff4106d52399ab52ee5d1e6a03097f6db6de8066597f88be7a797a183cb7",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x20",
+ "validatorIndex": "0x5",
+ "address": "0xd4f09e5c5af99a24c7e304ca7997d26cb0090169",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x49d54a5147de1f5208c509b194af6d64b509398e4f255c20315131e921f7bd04"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np242",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x13fdff4106d52399ab52ee5d1e6a03097f6db6de8066597f88be7a797a183cb7",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x1e5d7390e70d057c7dc29e173e338e7285e276a108eaecf3164dc734ce2fd9b5",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xf2",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x974",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x9cfff0339ca5c7928180f0d37f080f2c8cc4c00bfa2b6be3754b9d228219779f",
+ "transactions": [
+ "0xf88281c208830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0057b9bf7b2b99c50cf16c0b995e2846ba833edc03f6efc1b97566022651cabeca0237b38f74a2a8c39a2c344ef2d7fe811c37cd20ed2f4d47bfc38d896f3c9db75"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x810ff6fcafb9373a4df3e91ab1ca64a2955c9e42ad8af964f829e38e0ea4ee20"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np243",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x9cfff0339ca5c7928180f0d37f080f2c8cc4c00bfa2b6be3754b9d228219779f",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x8725e2687d45a52ad320e82b90e009b1aa5effe7ebfe994116afa25daa09468f",
+ "receiptsRoot": "0x2f9d61b38064fb9da0bb0f93ff73e1021c62ba761714e96a6674cd927bde4f9c",
+ "logsBloom": "0x00000000000800000000000000000000001000000000000000000000000000010000000000000000000000000000000000000000000000040000000000000000000000000010000000008000400000000000600000000000000000000800000140000000000080000000000000000000000200000000000000000000000000000000000000000180000000000000000000000000000000000000000000001000000000000000000100020000000000000001020000000000000080000000000000080000000000000000040000000000000000000000000000024080200000000000000000040000000208000000000000010000000000000000001000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xf3",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x97e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x0c71dc4665ac65f63a44434a3d55ffc285af6ec8b90b4ddfd4b4001add0e93c0",
+ "transactions": [
+ "0xf87981c30883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa017b61104ac6d28f1262b3750475b328dfd50f8496e0772bf19047d9d1ee9e56da01aed9f9280926e68fb66065edcf80320cab6f6d7c7af4bc8d9d007e1ea6a168d"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x9b72096b8b672ac6ff5362c56f5d06446d1693c5d2daa94a30755aa636320e78"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np244",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x0c71dc4665ac65f63a44434a3d55ffc285af6ec8b90b4ddfd4b4001add0e93c0",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xc5f9b1665244a32dc0885794d5aaf3ce0b464eed1208412ca14abcfe4b908f64",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xf4",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x988",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x1f7b85304f578a197b65ce6f6f9e0c90cf680cdb3f35a95d10ea0a32238df606",
+ "transactions": [
+ "0xf86481c4088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0a93d446ef64bccf6c88d5285e78e7625fd5c9ac9c8aa11ad45db01b95b6694a5a0761620f10b11ee3cc1932adf95133349f5107aed7b8c150192fa89665ecd7552"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf68bff777db51db5f29afc4afe38bd1bf5cdec29caa0dc52535b529e6d99b742"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np245",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x1f7b85304f578a197b65ce6f6f9e0c90cf680cdb3f35a95d10ea0a32238df606",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x5bacfe50ff7f0200bc1a4ea28e3fbe1a269ea7cbdbe7fb5d83bde19774c92e7e",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xf5",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x992",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x8f3a666d3d090603513d1e31ac73c5b47a7fe8279c7359a3bad523a8fd414a96",
+ "transactions": [
+ "0x02f86a870c72dd9d5e883e81c501088252089427abdeddfe8503496adeb623466caa47da5f63ab0180c001a0deade75f98612138653ca1c81d8cc74eeda3e46ecf43c1f8fde86428a990ae25a065f40f1aaf4d29268956348b7cc7fa054133ccb1522a045873cb43a9ffa25283"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x9566690bde717eec59f828a2dba90988fa268a98ed224f8bc02b77bce10443c4"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np246",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x8f3a666d3d090603513d1e31ac73c5b47a7fe8279c7359a3bad523a8fd414a96",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x1c407d215d7fa96b64c583107e028bcf1e789783c39c37482326b4d4dd522e05",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xf6",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x99c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xf1191b23680ae545b3ad4ffb3fd05209a7adefefc71e30970d1a4c72c383b5df",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x21",
+ "validatorIndex": "0x5",
+ "address": "0xb0b2988b6bbe724bacda5e9e524736de0bc7dae4",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xd0e821fbd57a4d382edd638b5c1e6deefb81352d41aa97da52db13f330e03097"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np247",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xf1191b23680ae545b3ad4ffb3fd05209a7adefefc71e30970d1a4c72c383b5df",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x16a2c4f318277ea20b75f32c7c986673d92c14098e36dde553e451f131c21a66",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xf7",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x9a6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x2e34605bbfd5f548e1e9003c8d573e41a9286968bec837ba1f2b7780e3337288",
+ "transactions": [
+ "0xf88281c608830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa02648ce9c5825b33559225aada97c08de484ab8282549d90cfc1e086052c22be8a02054d7eeb1e8bf4ab25b2581ccb0b0a3500625cf7a0315860202eb2eaf094f9c"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x43f9aa6fa63739abec56c4604874523ac6dabfcc08bb283195072aeb29d38dfe"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np248",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x2e34605bbfd5f548e1e9003c8d573e41a9286968bec837ba1f2b7780e3337288",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x291c5ca9a114bdb7bf296b4ff4182b930dc869905eaa1219cbb5188e8feaa9ab",
+ "receiptsRoot": "0x9f35106348d01548df28e681773a27cffe40648e4d923974e4b87903f578da11",
+ "logsBloom": "0x00000001000000000000000800000000000000000000000000000000100000000000000200080000000000080001000000000000000000000000000001000000000202000000000000000000000000000002000002000000000000040000000000000000000000000200800000000000800002000000000000000000008000000000000000000000000400008000000000008000000000000000000002000000000000000000000010000000000000000000000000000000000000100000000000000000000000000000000181000000800000000000000000000000002000200000000000000000000000000280000000000000000000000000040000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xf8",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x9b0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x22d7e31bcd496b70c0256f88d985be54cd46604897969a5edde95d8d75e2fc6a",
+ "transactions": [
+ "0xf87981c70883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a09f49a6018e3736ea3599def5663a57cfe19cb3f27bfdd80657503262a5bcfc87a02a26782058025cfe1205be964cc9ac31cdf510a8a9f867bff2317275b13ed02c"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x54ebfa924e887a63d643a8277c3394317de0e02e63651b58b6eb0e90df8a20cd"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np249",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x22d7e31bcd496b70c0256f88d985be54cd46604897969a5edde95d8d75e2fc6a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x359fe6cc7b7596b4455fdc075bc490d3697d4366c39c40dd6fc935da0ceac7e7",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xf9",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x9ba",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x1767170da9f173007588517f005241a12087642444518ce31bcf3ad27de4efcf",
+ "transactions": [
+ "0xf86481c8088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa043e1ad9aa519d9a1e8a15918ee6bbc0fd98061db6058597bd984098600495f96a01d5edd1b3fc3b45ff2a17a9c7eee3ad4c75e24fc090a4a0e48f39da49e7ad263"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x9e414c994ee35162d3b718c47f8435edc2c93394a378cb41037b671366791fc8"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np250",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x1767170da9f173007588517f005241a12087642444518ce31bcf3ad27de4efcf",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xc73008737d0cfdbec09b3074d48f44e406f0598003eab9a1f4c733de38512855",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xfa",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x9c4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x163dc4f5b453d5fb626263184121f08cdb616a75e2f8ef978d38e91f5b995ee6",
+ "transactions": [
+ "0xf86781c90882520894aa7225e7d5b0a2552bbb58880b3ec00c286995b801808718e5bb3abd109fa00968ae76ffc10f7b50ca349156119aaf1d81a8772683d1c3ed005147f4682694a060f5f10a015e8685a3099140c2cc3ba0dc69026df97fb46748008c08978d162a"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4356f072bb235238abefb3330465814821097327842b6e0dc4a0ef95680c4d34"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np251",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x163dc4f5b453d5fb626263184121f08cdb616a75e2f8ef978d38e91f5b995ee6",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x693db83454936d0dacd29b34de3d2c49dc469bbe4337faec428b028e0d967642",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xfb",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x9ce",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x8f9b318e4cd81ddd537dff3fcfe099d3609b357f3a4f2aed390edc103a5aa7a6",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x22",
+ "validatorIndex": "0x5",
+ "address": "0x04b8d34e20e604cadb04b9db8f6778c35f45a2d2",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x215df775ab368f17ed3f42058861768a3fba25e8d832a00b88559ca5078b8fbc"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np252",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x8f9b318e4cd81ddd537dff3fcfe099d3609b357f3a4f2aed390edc103a5aa7a6",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd358fe0baedc04a81fdaf6cdfc71c2c874291e47d16dd51cc032f0678078a009",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xfc",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x9d8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x23a585160ac1b5428ad1dea7e732b641ace396c4135dbf899ab2559f869bb5fb",
+ "transactions": [
+ "0xf88281ca08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a0941941ac43420c855cda955414a23d3bad4d0f2bfbeda999250f2f87d228878da0357223781ec5d666a8d5e8088721e9952f00a762d5fc078133bea6bc657c947e"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xd17835a18d61605a04d2e50c4f023966a47036e5c59356a0463db90a76f06e3e"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np253",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x23a585160ac1b5428ad1dea7e732b641ace396c4135dbf899ab2559f869bb5fb",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xcb19946b2b5a905882151fff9a12cce6e4c3be46f7da6b67263b0cc781fbe80a",
+ "receiptsRoot": "0x9b15dea2f021c6c74dc60deea77fd6a1ce29c9efc2596cbaaf73ef60370a03e3",
+ "logsBloom": "0x0000000000000100800000000000000000800000000000010000000000000000000000000000000000000000000080000000000000000000000000400000000000002000000000000000000000000000000000000000000000000000100008000000000000000000000000000000000020000000000000a004200000000000800000000000000000000000000000100000000000000000000000000440000000000000001001000010000000010000004000000000000000000000200000000000000000000000000000000000000000000400000000000000000000000200000000000000000440000000000120000c00000001000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xfd",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x9e2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x706168d939a58a0dd048595d1c88fe1735dbeee42111dfbb2adee0ea9ef1d77b",
+ "transactions": [
+ "0xf87981cb0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa06fb97cf9fb9b8f7159a9dc549e412001ca969f0dafc3c9294b0e081741aa3d9aa003ed12873ddb354ccf7b0f8e511136ff335a8e4ff6bb7f93ce19e097970c9774"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x875032d74e62dbfd73d4617754d36cd88088d1e5a7c5354bf3e0906c749e6637"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np254",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x706168d939a58a0dd048595d1c88fe1735dbeee42111dfbb2adee0ea9ef1d77b",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x907ae262cf7f9a93ecd0d1522c6a093ffe39594b65ec185c5059dfa7b3394371",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xfe",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x9ec",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xffd5337b506a04e2362e4a34847711bf688591ceb3ac4b7da257072ecef36a55",
+ "transactions": [
+ "0xf86481cc088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a082f832d1212a980978d5716dca8820344200eb6967b24adb2bd112a896b4dda3a0393b965bcf272398cdd6de788c3aa929a67a42466883a472538fb1dad06c07ef"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x6f22ae25f70f4b03a2a2b17f370ace1f2b15d17fc7c2457824348a8f2a1eff9f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np255",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xffd5337b506a04e2362e4a34847711bf688591ceb3ac4b7da257072ecef36a55",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xc39a9999ffd22de07bcf6a6a16b5cf1da7675dcb135e3503111a1dd50913cf0c",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0xff",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x9f6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xcbf2f33d5616ea98f1b1cf12bdd145d35b4a928e4cb8b0fa41a6bd788ca3cbd2",
+ "transactions": [
+ "0x02f86a870c72dd9d5e883e81cd010882520894a8100ae6aa1940d0b663bb31cd466142ebbdbd510180c080a054eafef27c71a73357c888f788f1936378929e1cdb226a205644dc1e2d68f32ba059af490b8ef4a4e98a282d9046655fc8818758e2af8ace2489927aaa3890fda3"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf11fdf2cb985ce7472dc7c6b422c3a8bf2dfbbc6b86b15a1fa62cf9ebae8f6cf"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np256",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xcbf2f33d5616ea98f1b1cf12bdd145d35b4a928e4cb8b0fa41a6bd788ca3cbd2",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x979018c4d3a004db4c94102d34d495dd3a4dc9c3c4bcd27d1a001f8095384208",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x100",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xa00",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x01b45ed6ccf0908b2e4b513eeea6aa86514677cb6d6d06d936e1871fc422daca",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x23",
+ "validatorIndex": "0x5",
+ "address": "0x47dc540c94ceb704a23875c11273e16bb0b8a87a",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xbbc97696e588f80fbe0316ad430fd4146a29c19b926248febe757cd9408deddc"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np257",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x01b45ed6ccf0908b2e4b513eeea6aa86514677cb6d6d06d936e1871fc422daca",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x55e1fa04203cc0edebab3501d9552eaf0ac3bba421bf3480a50e1549cd479dc5",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x101",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xa0a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x48f84c09e8d4bd8effd3865e8b3ac4202cb0dc0fb72299f35c8bad4558b895dc",
+ "transactions": [
+ "0xf88281ce08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a08a7526f8f209ff44329b503a7d726f569b861894584401651a83668be3971cbfa040314bdfa618ead4fa21933ed3a8af7e814620e3befa914828b981b391096441"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x71dd15be02efd9f3d5d94d0ed9b5e60a205f439bb46abe6226879e857668881e"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np258",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x48f84c09e8d4bd8effd3865e8b3ac4202cb0dc0fb72299f35c8bad4558b895dc",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x8d05cad792af190bb84ad7a0bebd232c433cf16b90cffea9f4f824d562ec0eb5",
+ "receiptsRoot": "0x7b32e50058711e6aa1981f911bb5fb6bd05182c7e7850480874c3754788e5ee2",
+ "logsBloom": "0x000000000000000000000000000000000400000000000000000000000200000000000000000000000000000000002000000000000040000000000000000000800000000000000000000080080000000000040000000002002000002000008000000008000100000000000400000000000000000000000000000000000000200000000000002000000000002000000000004000000000000000000000000000020000000000000000010800000001000000000000000000000000000000000000000c0000010000000000000000000000000000000000000020000000000040000000000000000000000000300000000000000000000800008000000000400000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x102",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xa14",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xed832bf95db43a650d06fac15b9b6474b7d82d03b27bd43835eee199c95b64f1",
+ "transactions": [
+ "0xf87981cf0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0fa1c9705b3794f376d02943123846aaae435a6590ddb802e16e91f87ae13c910a0609129061ec7d065ea3c154152c452f76a7894f2459c42c33675af6a20c9ad3c"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xb90e98bd91f1f7cc5c4456bb7a8868a2bb2cd3dda4b5dd6463b88728526dceea"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np259",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xed832bf95db43a650d06fac15b9b6474b7d82d03b27bd43835eee199c95b64f1",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x06ffd1eba12cda277819f77a9a89a4f78265f7aed5158dc51332218976856e82",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x103",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xa1e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x65f5a3780beee8d82281e7fe3e82b81dae2a14ef861e9df584590dd429b8d632",
+ "transactions": [
+ "0xf86481d0088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa07de64020fd82a08d2737ded6967d6a6095c02858161988f0626bad7dd2238057a00ad64af462ef2241d4e4c0da1dc108871126cf2aa2b82afd98d7069fc79d9085"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4e80fd3123fda9b404a737c9210ccb0bacc95ef93ac40e06ce9f7511012426c4"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np260",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x65f5a3780beee8d82281e7fe3e82b81dae2a14ef861e9df584590dd429b8d632",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3d72e9a90b2dbfc909c697987538e4e9a8f2b127a783109fbb869bf3760bd7a0",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x104",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xa28",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xcab55b4abc18bcf8e1b24ae34df180dc00edeadc072fa2e52ed54f2b09c6367f",
+ "transactions": [
+ "0xf86781d10882520894a8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e01808718e5bb3abd109fa004c1d18013fb8b0554b8aaa549ee64a5a33c98edd5e51257447b4dd3b37f2adea05e3a37e5ddec2893b3fd38c4983b356c26dab5abb8b8ba6f56ac1ab9e747268b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xafb50d96b2543048dc93045b62357cc18b64d0e103756ce3ad0e04689dd88282"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np261",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xcab55b4abc18bcf8e1b24ae34df180dc00edeadc072fa2e52ed54f2b09c6367f",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x8c514217bbc30325a9d832e82e0f1816cff5d7fed0868f80269eb801957b22a0",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x105",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xa32",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x687b7f705112cf8d76b18d5ab3bc59fab146131c4b8efa05a38b42a14bcb251c",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x24",
+ "validatorIndex": "0x5",
+ "address": "0xbc5959f43bc6e47175374b6716e53c9a7d72c594",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xd73341a1c9edd04a890f949ede6cc1e942ad62b63b6a60177f0f692f141a7e95"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np262",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x687b7f705112cf8d76b18d5ab3bc59fab146131c4b8efa05a38b42a14bcb251c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x32fc9182d259ea7090be7140ec35dee534b5e755af25c3a41b2fe23452cd75ae",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x106",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xa3c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x59763420efabb84b6d4ae2b2a34f6db6108950debfe1feba4f706ad5227eca5f",
+ "transactions": [
+ "0xf88281d208830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a0010b2ab5421f3fe86f38332dd1c862ddcfc711b2255d8f2a677985d3858b643aa025f4fec49790d44c9b50ed1bea3c5700de165dc239173328e0d0c045f0dd4558"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc26601e9613493118999d9268b401707e42496944ccdbfa91d5d7b791a6d18f1"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np263",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x59763420efabb84b6d4ae2b2a34f6db6108950debfe1feba4f706ad5227eca5f",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xdbed2b577f83fcb221ae85377d9c4f41b8ca95de085a3a697098ceaa937d23f8",
+ "receiptsRoot": "0xf4e79fec628d38bdc719707be2f797b74efbc9468ba5a3ae9415877e11c21db4",
+ "logsBloom": "0x00000000000008004000000000000000000000000000000010800000000000000040000000000000020000000000800410800000008000040000000000000000000000000000000000040000040000000000000000000000000000001000000000020000000000000400200000000100002000000000000000000000000000000008000010000000000000000020004400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000008000000000000080010000000000000000000000000000000200000000000020000000000000000000000000000020000800000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x107",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xa46",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xf95bd5a6a4d1d51c8f00e6421bb1ecdb2a4b19222261aa412dcb4c371eea1af5",
+ "transactions": [
+ "0xf87981d30883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0aa1f3a14b2bee05c15deffd1fcbad6d16deb140557251b04ddb61574fa8c70d8a0614a539b7fe8c276d26cabc1ff36c88c3f6b9cf3bc8836309a1d3f46626b5153"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xfb4619fb12e1b9c4b508797833eef7df65fcf255488660d502def2a7ddceef6d"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np264",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xf95bd5a6a4d1d51c8f00e6421bb1ecdb2a4b19222261aa412dcb4c371eea1af5",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x2eb443ed50d07a6b1dbb2c154cc221cfb0475593b39ca2d3569224ea7a08030e",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x108",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xa50",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x68bd9ab4e0b622e480296f040ad58d1b7f048c712ad5b46c7a596265d5f8e9fc",
+ "transactions": [
+ "0xf86481d4088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0533560fb23c458df00902dbacef307e98096d91f179c49458d99e2eecaeaf3d3a0314508cba155f195ff77eff1a25ed4f454a07b404ac82d3ea73796bd9af3128d"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xd08b7458cd9d52905403f6f4e9dac15ad18bea1f834858bf48ecae36bf854f98"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np265",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x68bd9ab4e0b622e480296f040ad58d1b7f048c712ad5b46c7a596265d5f8e9fc",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6e68dd5ff68bf8a325446716e5bc1629a4e77167c3b5c9249ac2e440b35dea9b",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x109",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xa5a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xfd61bbebf4026ea51b90fafefc671dc4540e83436c83eb9bc51e6b2b15db5dc9",
+ "transactions": [
+ "0x02f86a870c72dd9d5e883e81d5010882520894ac9e61d54eb6967e212c06aab15408292f8558c40180c001a0898d514a1f15103335e066d0625c4ec34a69a03480d67dcb3d3fe0f4f932100aa07e130fed862c1482467d112f64fb59e005068b52c291003c908b625b4993e20e"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xdf979da2784a3bb9e07c368094dc640aafc514502a62a58b464e50e5e50a34bd"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np266",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xfd61bbebf4026ea51b90fafefc671dc4540e83436c83eb9bc51e6b2b15db5dc9",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x4783eb369238bf2856e00bbc632735adf5ea404b766a0a70c27913314e170bac",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x10a",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xa64",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xaa8b392a2333d1f8a498c60f1c9884705d0bff7dd5a524b5a119f547b0d6579c",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x25",
+ "validatorIndex": "0x5",
+ "address": "0xc04b5bb1a5b2eb3e9cd4805420dba5a9d133da5b",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x15855037d4712ce0019f0169dcd58b58493be8373d29decfa80b8df046e3d6ba"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np267",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xaa8b392a2333d1f8a498c60f1c9884705d0bff7dd5a524b5a119f547b0d6579c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd0b9db5bce164e65b476f578ff93039bad1be78c8d1f595ff8496c2f7a67fea4",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x10b",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xa6e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xa33f601ca31d93d804b269042c783f9a6f79857919289dbb935e81ba1fed86ea",
+ "transactions": [
+ "0xf88281d608830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa03329c0816ba8af740dd07a393681abfd26c3f0a121cdfa2390607d0d1832e741a051d0d0b427004563def4552ee51b81a2ca1f41bb48e8b9ae20615381c353d9b3"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xfd1462a68630956a33e4b65c8e171a08a131097bc7faf5d7f90b5503ab30b69c"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np268",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa33f601ca31d93d804b269042c783f9a6f79857919289dbb935e81ba1fed86ea",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xcb8d1404a32030e577a2628884f57433fe91b36b838f8576471bc36d87784132",
+ "receiptsRoot": "0x65c1a0ac45edc227576188f00c72612cd6c4d27cdac8d997bc6c9f499d21565c",
+ "logsBloom": "0x00000000020000000000000000000001000000000000000000000000402000000000000001000010000000000000000000000000000000000000000000000000000000000800040080000100000006000000000000000000000008000000000000000000000000000001000000000000001000040000000000000000000000000000000000000000080000100000000000000100200000000000000000000000000000000000080000000000000000000040000000000000000000000001000000000040000000000000000000000000000000000100000000000000000100002000000000200000000000000000008000000000000000008010000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x10c",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xa78",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x295de1a3c0821f092b15b4e51f02dd17ab7f1753f22f97c88a2081f9a19ffa01",
+ "transactions": [
+ "0xf87981d70883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0310faf1dfcbc5597e207ab627226d2deeea1eedec7ffd8e68740fb76545586d1a01919f4683f202d4ccb3ab524d89d11119e7115645707333703d70f6fbe3c610d"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xedad57fee633c4b696e519f84ad1765afbef5d2781b382acd9b8dfcf6cd6d572"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np269",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x295de1a3c0821f092b15b4e51f02dd17ab7f1753f22f97c88a2081f9a19ffa01",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x0199e03e7400c428fb1bba7126f4eb3a12becd96c4458bff54952e5535b4a3d0",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x10d",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xa82",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x494693083463dc335450802ab50c97022e63c21e326ff7cebd7870802411db3e",
+ "transactions": [
+ "0xf86481d8088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0ea5ad6553fb67639cec694e6697ac7b718bd7044fcdf5608fa64f6058e67db93a03953b5792d7d9ef7fc602fbe260e7a290760e8adc634f99ab1896e2c0d55afcb"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc2641ba296c2daa6edf09b63d0f1cfcefd51451fbbc283b6802cbd5392fb145c"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np270",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x494693083463dc335450802ab50c97022e63c21e326ff7cebd7870802411db3e",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xad6e3dc4bf8e680448a8a6292fc7b9f69129c16eb7d853992c13ce0c91e7d1ce",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x10e",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xa8c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xc54e865454d4ba4a092904e151d7afdc9b7b7ef9723dee0325ee075eb6a9a5c0",
+ "transactions": [
+ "0xf86781d90882520894653b3bb3e18ef84d5b1e8ff9884aecf1950c7a1c01808718e5bb3abd109fa0f1c5d5e335842170288da2c7c7af6856ea0b566d2b4ab4b00a19cb94144d466ca02043677d1c397a96a2f8a355431a59a0d5c40fc053e9c45b6872464f3c77c5dc"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x5615d64e1d3a10972cdea4e4b106b4b6e832bc261129f9ab1d10a670383ae446"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np271",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xc54e865454d4ba4a092904e151d7afdc9b7b7ef9723dee0325ee075eb6a9a5c0",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x4347088d10fe319fb00e8eee17f1b872f2e044cbe1cb797657294404bf370e30",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x10f",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xa96",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xc33055476392adfe03f3bd812f9bb09b7184dc8d58beefab62db84ee34860bed",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x26",
+ "validatorIndex": "0x5",
+ "address": "0x24255ef5d941493b9978f3aabb0ed07d084ade19",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x0757c6141fad938002092ff251a64190b060d0e31c31b08fb56b0f993cc4ef0d"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np272",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xc33055476392adfe03f3bd812f9bb09b7184dc8d58beefab62db84ee34860bed",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa9c73e0cd551b43953f3b13ee9c65436102e647a83bfefa9443ad27733d0371c",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x110",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xaa0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x39f74e3f7d2c3f4ab7e89f3b597535ffebd200abe4b1aa67f721ffaa13cbc2b4",
+ "transactions": [
+ "0xf88281da08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0972f048bcd4f8e2678a209e354570de7452fa342744fab1e44b7af67b2484d9ea0076f82074ff9697256d2661ad9f9a7321ff54fa3100ecc479166286a9a22ada5"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x14ddc31bc9f9c877ae92ca1958e6f3affca7cc3064537d0bbe8ba4d2072c0961"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np273",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x39f74e3f7d2c3f4ab7e89f3b597535ffebd200abe4b1aa67f721ffaa13cbc2b4",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf003762d896629dcd3a92a67ee13b96b080f4a3e71402a1dcbf9f444377329b5",
+ "receiptsRoot": "0x4d68fb9bfae6768b9578f5a63f455867ea5993ec2261fad2a25b45794d092f7c",
+ "logsBloom": "0x00000000000000000001000000000000000000000000000000000000000000000000000080000000000000100000008000000000000000800000000000000000000000000000000000000000000000400000000040000000240001100000000000000000000000000800000000000000000000000000000000060000000000000000000000000000040000000000002000000000000000080000000200000000000000000000000800000040000000040000000000000000000000000000100800000000000800100000000000000000000000000000002000800000000000000000000800000000014000040000000800000000000400000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x111",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xaaa",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x23408e1ac73e1dd9c3a735776a73b4c79249e5a9eb62ec9f9012f7f6c11ba7d0",
+ "transactions": [
+ "0xf87981db0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a08883be3af4b0a273883412ad320e6dcace1f505d9b20194e8f9e2e092c8d5ce4a03da92647d3d92d2868d5b9c479d98faf263e78eb67f259101a65ff56ee1eccbf"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x490b0f08777ad4364f523f94dccb3f56f4aacb2fb4db1bb042a786ecfd248c79"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np274",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x23408e1ac73e1dd9c3a735776a73b4c79249e5a9eb62ec9f9012f7f6c11ba7d0",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x741d337861f144fc811cfac1db596e3bedb837b0fb090a3d013e5492bf02b233",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x112",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xab4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xc7578d8b738ac9f5ab97605ce1c8101160faa615feeb8fc43282d8bd6ae450ac",
+ "transactions": [
+ "0xf86481dc088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0bcd2b139343048e9174e86251017c9b7c4da9fc36e4a84cf98eaf3855561f8e3a01c25a7b3ff3ebd7d9cbed5aa65515f8ba06fb8860d0764a98591da24e7d1c842"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4a37c0e55f539f2ecafa0ce71ee3d80bc9fe33fb841583073c9f524cc5a2615a"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np275",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xc7578d8b738ac9f5ab97605ce1c8101160faa615feeb8fc43282d8bd6ae450ac",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe1ce5b13d3189869321889bb12feb5da33a621bf0dbc4612b370a4b6973201f7",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x113",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xabe",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x0bd8ca5ecbf0c960433cbe52bec31810c325088860cd911a1df20174fd30243a",
+ "transactions": [
+ "0x02f86a870c72dd9d5e883e81dd010882520894d8c50d6282a1ba47f0a23430d177bbfbb72e2b840180c001a04330fe20e8b84e751616253b9bccc5ff2d896e00593bfbef92e81e72b4d98a85a07977b87c7eca1f6a8e4a535cb26860e32487c6b4b826623a7390df521b21eac7"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x133295fdf94e5e4570e27125807a77272f24622750bcf408be0360ba0dcc89f2"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np276",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x0bd8ca5ecbf0c960433cbe52bec31810c325088860cd911a1df20174fd30243a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x76aa5a1d0fc7c2f7e01a8c515f018e30afb794badc14b5d8e3651096458947a0",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x114",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xac8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x604c3b8dbc400712146239b5b6e70426361e47c118c6fff4c1761554c3ad2e47",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x27",
+ "validatorIndex": "0x5",
+ "address": "0xdbe726e81a7221a385e007ef9e834a975a4b528c",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xa73eb87c45c96b121f9ab081c095bff9a49cfe5a374f316e9a6a66096f532972"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np277",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x604c3b8dbc400712146239b5b6e70426361e47c118c6fff4c1761554c3ad2e47",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xaad6081261920a2bddee7ad943a54ceebdb32edf169b206bd185bd957c029389",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x115",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xad2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x3dbceccc7aefcec187b98fc34ab00c1be2753676f6201a1e5e1356b5ce09c309",
+ "transactions": [
+ "0xf88281de08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a092ec956d91708337ef4625bb87caed7a2bab63e40c8e65e8c9ee79a89b525b53a02bfff0c6dadfbf70dbd9fb2d75a12414d808ee6cce90826132d63f8ef2ce96b5"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x9040bc28f6e830ca50f459fc3dac39a6cd261ccc8cd1cca5429d59230c10f34c"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np278",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x3dbceccc7aefcec187b98fc34ab00c1be2753676f6201a1e5e1356b5ce09c309",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xac5c584edba5f948690abb0f1c0f9bef685dec896c8f6c5c66ef8dd65810d53e",
+ "receiptsRoot": "0xdd1d7486ff21ad1c1e17b4d06cf0af6b4a32f650ac495deff2aae6cb73338de3",
+ "logsBloom": "0x00000000000000000000002000000200400000000082000000000000020100000000000000000000000000000000000000000000000000088000000000000010000000000000000000000800000800000000000000000000000000000000000000000000100000000004001004880000000000000000000000000000000000480000000000000000002000000000801000000000000000000000000000000080000010000000800000000000000000000000000000000000000000000000000040000000000000000000000000008010000100000000000100000000000000000000000000000000000000000000000000000000000000200000000010000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x116",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xadc",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xe69bddf40ecef2219c3ce0f27015125fb42d2339c75675f8e0dc587246cf617c",
+ "transactions": [
+ "0xf87981df0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa099b6473bcd99e0f32d82c046bad2e1824a8468bae8347768d907768e2fe64a2ba051f3f8b7323eab23d5543c8e372e4e184bc3ee108eab5455b89d40d9cbc23008"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xec1d134c49cde6046ee295672a8f11663b6403fb71338181a89dc6bc92f7dea8"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np279",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe69bddf40ecef2219c3ce0f27015125fb42d2339c75675f8e0dc587246cf617c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x909007de8369b2fd9597dd7b84ab31e36b949026383fa8957befdba94703689b",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x117",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xae6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x3f0eb43bfa229f0449d1b975632be01a69ed6c63eda12fb61bf83a2f8cde3c87",
+ "transactions": [
+ "0xf86481e0088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0d8414a9d94412185c316893b53c874ae28ad6c0d67910ec66b39051f7842408ea05329ebb7080c9a6ae9372e8004706b78f7465746c3492816b6255fcba4d84979"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x3130a4c80497c65a7ee6ac20f6888a95bd5b05636d6b4bd13d616dcb01591e16"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np280",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x3f0eb43bfa229f0449d1b975632be01a69ed6c63eda12fb61bf83a2f8cde3c87",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x4dcb18dbea7ec4b9dc13b208172da29eb275e2095a6f8c6aeee59d62d5c9dd76",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x118",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xaf0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x12c3c44447da5af2e83d37224a825c26890db2483d5732e4bac08b87fe3ce5fa",
+ "transactions": [
+ "0xf86781e10882520894b519be874447e0f0a38ee8ec84ecd2198a9fac7701808718e5bb3abd109fa0cfbd9ff7eeb9aef477970dcba479f89c7573e6167d16d0882ead77b20aaee690a01e34175b1b1758a581ca13f2ca021698933b1e8269c70fcb94c5e4aa39ee9b8e"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xccdfd5b42f2cbd29ab125769380fc1b18a9d272ac5d3508a6bbe4c82360ebcca"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np281",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x12c3c44447da5af2e83d37224a825c26890db2483d5732e4bac08b87fe3ce5fa",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xcbbdc9e51f0cde277f8f0ba02544d4d2be87cb7a5853a501524d760b00ec5e57",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x119",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xafa",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x2ca033d3c29586c8a38da6008d4a446814d845565ed5955418b125fdbe4602e0",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x28",
+ "validatorIndex": "0x5",
+ "address": "0xae58b7e08e266680e93e46639a2a7e89fde78a6f",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x74342c7f25ee7dd1ae6eb9cf4e5ce5bcab56c798aea36b554ccb31a660e123af"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np282",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x2ca033d3c29586c8a38da6008d4a446814d845565ed5955418b125fdbe4602e0",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa5f40d100045883afd309122196cd37e687124adc5ec4c609e9d4ea9e8050be1",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x11a",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xb04",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x38ae7bdbc3e96e43871baeea0577a4a6e40dd3b4d2c6fea0b50d63e24dd24382",
+ "transactions": [
+ "0xf88281e208830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a02a4dd1a40886d389cecff4ca095a57e2f1e924b8d0e80e95c67961bec5af4b34a00adc6e41c4fe22eb93c7bc6ac529c405a8beb3b75d3f82a24029c560d293bee1"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf6f75f51a452481c30509e5de96edae82892a61f8c02c88d710dc782b5f01fc7"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np283",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x38ae7bdbc3e96e43871baeea0577a4a6e40dd3b4d2c6fea0b50d63e24dd24382",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x7a69e46d9beb12acb2476f649cf7fa7d31624c8b521351b533e302290b7ce166",
+ "receiptsRoot": "0x8f6545857c380d6f9aefa3a76d16cc79ce6d3e8d951a9041f19d57cbde82f55f",
+ "logsBloom": "0x00000800000000000004000000000001000000000040000000000800025000000000000000000000000000020000000000000000000080000008000000000000000000000000000000000000000041000000000008000000000000800000000000000000000000000080000000000000000080000000000000000000000000000000000000000000000000000010000000000000000000000000040000000000000040000000200000000081000400000000800000000010000000000000000000800000000000001000000000000000000000200000000000000000000008000000000000000000000000000000000000000080000004010000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x11b",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xb0e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xbf711951f526479f4c5a6a945594daacff51aacb288122fc4eea157e7f26c46b",
+ "transactions": [
+ "0xf87981e30883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0ac71118aff6dbdfd117ed52c41169a3c1eec7c7b137fed7ec058a48916198f2da05b684d53b4cc1cdafdba987f894eb9c42da47785983593ee1318f8a79f83eff7"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x7ce6539cc82db9730b8c21b12d6773925ff7d1a46c9e8f6c986ada96351f36e9"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np284",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xbf711951f526479f4c5a6a945594daacff51aacb288122fc4eea157e7f26c46b",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x2d7b3e2f3ea5d7c34423a2461c1f17a4639b72a0a2f4715757ca44018b416be0",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x11c",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xb18",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xf5882e396311b698818e2e02c699c77a0865ea6320dc69499197aaf8fd8e6daa",
+ "transactions": [
+ "0xf86481e4088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa088575e3574fdfafb5c288b553973607350d846bd81b304beddaa6ef3dd349eada03cacc2455d5296189c0fc6890380a3c405b96cecfc45dc04a7f7dafe76be64c9"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x1983684da5e48936b761c5e5882bbeb5e42c3a7efe92989281367fa5ab25e918"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np285",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xf5882e396311b698818e2e02c699c77a0865ea6320dc69499197aaf8fd8e6daa",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xdc0d40e96eaa22025544b17cc122fab8f236a1a5d0bfa1a07a6ea680fc31661c",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x11d",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xb22",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x0fabca07111b96e64ef425173cb375ed75f3e1b8ee34eed7593fe8930c9f487d",
+ "transactions": [
+ "0x02f86a870c72dd9d5e883e81e5010882520894af2c6f1512d1cabedeaf129e0643863c574197320180c001a0c23170a740ba640770aca9fb699a2799d072b2466c97f126a834d86bdb22f516a03f242217b60ab672f352ae51249a8876a034ee51b6b4ad4a41b4d300c48e79f4"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc564aa993f2b446325ee674146307601dd87eb7409266a97e695e4bb09dd8bf5"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np286",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x0fabca07111b96e64ef425173cb375ed75f3e1b8ee34eed7593fe8930c9f487d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6d0b749b8735df89c9d0bd4fff2d180d87a7ff86301fc157573ff0e774a942fc",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x11e",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xb2c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x29d8373309b28aa3b206208c60bf6be454db83f0d5c4140604ec288251b4c5aa",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x29",
+ "validatorIndex": "0x5",
+ "address": "0x5df7504bc193ee4c3deadede1459eccca172e87c",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x9ca2ff57d59decb7670d5f49bcca68fdaf494ba7dc06214d8e838bfcf7a2824e"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np287",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x29d8373309b28aa3b206208c60bf6be454db83f0d5c4140604ec288251b4c5aa",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x06f453054ff02cd966887e3e22bf509aacb23ee18ca302b612f10d2fb473cfa3",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x11f",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xb36",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x84b99bc78800f925e5ba4da02f58581a21a3ae711a6306147ff4379435e655ee",
+ "transactions": [
+ "0xf88281e608830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0bac48741d1f314ffaab63f07d4e7a0bc34c68dde478b439f4bca7dcf0b0a1493a036448a9a4150cad5f24411e8a9bbe89096d555ad08818e90d524bbad8b380b7a"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x6d7b7476cecc036d470a691755f9988409059bd104579c0a2ded58f144236045"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np288",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x84b99bc78800f925e5ba4da02f58581a21a3ae711a6306147ff4379435e655ee",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xb45e7c8ace763c55943f9c73da1319566234dad9d29651d6b08227eb88c9c4fe",
+ "receiptsRoot": "0x490106e6f82f2847cc9eb542a9836943df09d8a6b2e4a4fafba322228449195a",
+ "logsBloom": "0x40000000000000000000100000000000000000000002000000000000000000000008000000000100000000400000000000000000000040000000000000040000000000000000004000002000000000000200000000000000000204000000000000000000000100000000000000000008000000000000000002000000200000000000000000000000000000000000000000000000008000000000000000010800000000000000004200000000000040008000000100000000000000000000000000000000000010000000000000000000000000000000080000400000000000000000000000000000000000000000000000000000040000200000000004800000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x120",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xb40",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xc7104befaf82feba7ad56db858cc6743e8ac2af4b6a1a0949c9c1ba51c0fe869",
+ "transactions": [
+ "0xf87981e70883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa017d70f5a57065bf0973a62206ec4a9b7f1f329904de722faf30fff8e2dca5719a006d0438164dd0ff38d669ebaa44dd53cec0b81d8cfe855a9aedee94b3b1f724d"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x417504d79d00b85a29f58473a7ad643f88e9cdfe5da2ed25a5965411390fda4a"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np289",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xc7104befaf82feba7ad56db858cc6743e8ac2af4b6a1a0949c9c1ba51c0fe869",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x4c863fc026d042a28f4ee149361f77c9dae309e18ea2497255ae91f8c41e0055",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x121",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xb4a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x38c868f4adbaf9c38505eee26eb316eb5065c194df8aeed5c605f8c309d4b68a",
+ "transactions": [
+ "0xf86481e8088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0428b809dd6147da7fc27a9520ae39b6a361b8f646b4eae45b3b32e3e406d766ea00c794c60066a8d4e435ba368662d9a6c0ffdd57ec6c49fdb0c2d4c07a69875cf"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe910eb040bf32e56e9447d63497799419957ed7df2572e89768b9139c6fa6a23"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np290",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x38c868f4adbaf9c38505eee26eb316eb5065c194df8aeed5c605f8c309d4b68a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x4849e0698f5f4b970db7b185d122842a6f842611058a838fe4c48bf3c63b89b6",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x122",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xb54",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x962c229b0020efff007766682c8af73f38bc87fa2a83cf4a520b1e6706ced05e",
+ "transactions": [
+ "0xf86781e90882520894b70654fead634e1ede4518ef34872c9d4f083a5301808718e5bb3abd10a0a0953d5aa69077225dba6a0333ea4d69a05f652e0d2abb8df492a7e6a9d0cdbe3da004e41cb847aa131b9bb1e19cb3dd5f7a6cc2ac8b7f459ab8c3061380d41721ff"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x8e462d3d5b17f0157bc100e785e1b8d2ad3262e6f27238fa7e9c62ba29e9c692"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np291",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x962c229b0020efff007766682c8af73f38bc87fa2a83cf4a520b1e6706ced05e",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6334127515360bcab6eb39030e54b05d61d464576fb4f99fbece693ffa600610",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x123",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xb5e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xd8f175dd35dd4a5d97e51309a5fdeb6e713aef85c25c9e2d661075535cf8d8c1",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x2a",
+ "validatorIndex": "0x5",
+ "address": "0xb71de80778f2783383f5d5a3028af84eab2f18a4",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x3e6f040dc96b2e05961c4e28df076fa654761f4b0e2e30f5e36b06f65d1893c1"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np292",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xd8f175dd35dd4a5d97e51309a5fdeb6e713aef85c25c9e2d661075535cf8d8c1",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6a53dd10b53014df9fed6a4ae0fee8fc21111c58421916e9c770906b7676cbaf",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x124",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xb68",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x56a449bf5c7dba876a8f68b55d9dbbb06c0dddd3c5f586ec4a95317a0f00c79d",
+ "transactions": [
+ "0xf88281ea08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a04efd756d15757c98077f04c9f50a22f7e74b1f28f970614a6824b4a406c11d0ba01c4bc3461a415a9c4dbfd4406c3c684a5427ce1490c93d7a9f5e43891dedc709"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x07e71d03691704a4bd83c728529642884fc1b1a8cfeb1ddcbf659c9b71367637"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np293",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x56a449bf5c7dba876a8f68b55d9dbbb06c0dddd3c5f586ec4a95317a0f00c79d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x82f613ee711de05f2cc6a4a107500bdd5045f1ba99ce2738222f343f6081efe6",
+ "receiptsRoot": "0x2c3a6865afbff0ff9319c72cb9974b085dfe9a34eb9b34e0f4bc267272a883ca",
+ "logsBloom": "0x00000800000000000000004000010000000000000000000000000000000000000180000000000000800000400000000000001000000000000000100000000000000000000000000008000400008000000000000000000000001000000004000001000000000000000008000000000000000000000000000000000000000000000000000000000000090800000000000000004000000000000100000000002400000000000800000000000000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000002000000000000000000200000040000000000008008000000000000000022000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x125",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xb72",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x45a502a5a428913c585b13dbdd0857fbf4ffc3e928b942b5e96c98aced1a1736",
+ "transactions": [
+ "0xf87981eb0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a03cbaa69de647fe3ea352a6e71bab2ee53555fb8ab88c5e68efe28f2e5d687b9ea063c88d4e12b282eb4075d28f2fc6f36c7017ed0d91e36dbfd9d63a358e96abac"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf4d05f5986e4b92a845467d2ae6209ca9b7c6c63ff9cdef3df180660158163ef"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np294",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x45a502a5a428913c585b13dbdd0857fbf4ffc3e928b942b5e96c98aced1a1736",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x291d2f7ab3a39d6c34a1b1c66e69262273221f6a8b2bac448e37e64da2330694",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x126",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xb7c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x00f4447478e16a0e4dbe26e2398381d77367268754921e89d20bb152c1648910",
+ "transactions": [
+ "0xf86481ec088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0aa81d6aa3b28238a33a52a3e3b5f00fa2300402a222f10c0e7451318b3f81e25a0223f13ffcec992f0ed7592df411b58352aad6d277dd16e7d0a55e5ab5702a18a"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x5ca251408392b25af49419f1ecd9338d1f4b5afa536dc579ab54e1e3ee6914d4"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np295",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x00f4447478e16a0e4dbe26e2398381d77367268754921e89d20bb152c1648910",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe3e06a047edd89fc5a4f9ee475d8e10ace0a0bae37ad4df6613a6077870fcae4",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x127",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xb86",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x1480b67138d2eb8359bf102ee31219dea9776af6c7fed33e8f4847ce943365c4",
+ "transactions": [
+ "0x02f86a870c72dd9d5e883e81ed010882520894be3eea9a483308cb3134ce068e77b56e7c25af190180c080a0190737acd3a2a298d5a6f96a60ced561e536dd9d676c8494bc6d71e8b8a90b60a02c407a67004643eba03f80965fea491c4a6c25d90d5a9fd53c6a61b62971e7c5"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe98b64599520cf62e68ce0e2cdf03a21d3712c81fa74b5ade4885b7d8aec531b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np296",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x1480b67138d2eb8359bf102ee31219dea9776af6c7fed33e8f4847ce943365c4",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x8d04702ac0333be2a1e6ae46e4aa31fe4fe23f5458c6899a7fd8800d24162bc5",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x128",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xb90",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x5b6e5684623ac4835ad30948dca710bb10d4bf48695089a4eca9e472300f37d7",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x2b",
+ "validatorIndex": "0x5",
+ "address": "0x1c972398125398a3665f212930758ae9518a8c94",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xd62ec5a2650450e26aac71a21d45ef795e57c231d28a18d077a01f761bc648fe"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np297",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x5b6e5684623ac4835ad30948dca710bb10d4bf48695089a4eca9e472300f37d7",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xb59802d3b42a67087c2362fe27807e97ea95f8894d734e3711d61768b0779cc5",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x129",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xb9a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x5903dfb3ecee5d8bc0e0cc0208b17dfc9a0dc86de2eaaee48da23ea0877b6c87",
+ "transactions": [
+ "0xf88281ee08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a01a3bb1f736220feefc5706b013d9cd88f2e5d5c1ee3398b15ba14e84ed6a12c9a078068efcdcd82d92408e849bb10f551cc406e796ff1d2e7d20e06a273d27dfdf"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4d3fb38cf24faf44f5b37f248553713af2aa9c3d99ddad4a534e49cd06bb8098"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np298",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x5903dfb3ecee5d8bc0e0cc0208b17dfc9a0dc86de2eaaee48da23ea0877b6c87",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x18be7053419eb1d23d487c6a3df27d208a2f8973d17b6b3e78417df0d3ab1644",
+ "receiptsRoot": "0xa7318d908cd687d0e6d982ec99a33a54b0cb9d1bbe3782f31ae731231e79039f",
+ "logsBloom": "0x00000000000000000000000400000000000000000000000000000000000000000000000000000008000000000000000000000000040000000000800000000000000000000000000800000010000000110000000000000000000020000000000200000000000000000000000004000000001000000000000000000000000000040100000000000000000000000000200000000800040000080040000000004000000000000000200000000000000204000000000000000000000100000000400008008000080000000100000000000000000000000000000000000000000001000000000000000000000000000000001000000000000000000100000000800000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x12a",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xba4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x19f2a0716399f123d47e625de34fb2d6fbeadc26b2993e89504e73db85248052",
+ "transactions": [
+ "0xf87981ef0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0dc80fe6320cc01dd2ab63a42dd099e2fa5e0a640e6ccdf8ed634ca0c7382bd9fa04b356107e6a61d8852e7dc24f02691a9bd203564fed22da46bc9d9cd560c3dd4"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x36e90abacae8fbe712658e705ac28fa9d00118ef55fe56ea893633680147148a"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np299",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x19f2a0716399f123d47e625de34fb2d6fbeadc26b2993e89504e73db85248052",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf704271ace032c151b512221e777247a677847e2588ffb6fdea3de9af775b059",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x12b",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xbae",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x2d68907fbe46b2958a1e07b483359dd1e1ac8a6fa0b13e0a9c012cb5de4bf458",
+ "transactions": [
+ "0xf86481f0088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa06074cb58acfc1417684962272c546809696c6d2110b75735b19852066839a38ea03bd4f9b9b32c074215420391000ce0358e01e65745d7a6aa5513c4f857dd6579"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x164177f08412f7e294fae37457d238c4dd76775263e2c7c9f39e8a7ceca9028a"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np300",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x2d68907fbe46b2958a1e07b483359dd1e1ac8a6fa0b13e0a9c012cb5de4bf458",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x0d6f0609afeda40249aad175bb482c3560b6f0e2fb612addd06c6f3953662531",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x12c",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xbb8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xe7554d8e76e3ae2d92eceade591334e211020b97e176762c99573ba526c7fdc6",
+ "transactions": [
+ "0xf86781f1088252089408037e79bb41c0f1eda6751f0dabb5293ca2d5bf01808718e5bb3abd109fa0e3edf14f32e7cacb36fd116b5381fac6b12325a5908dcec2b8e2c6b5517f5ec5a051429c4c1e479fa018b7907e7e3b02a448e968368a5ce9e2ea807525d363f85e"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xaa5a5586bf2f68df5c206dbe45a9498de0a9b5a2ee92235b740971819838a010"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np301",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe7554d8e76e3ae2d92eceade591334e211020b97e176762c99573ba526c7fdc6",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x4ebd469b936b8d119664429fa99c55d75c007d4d12b7eb4db058248fa52b7f46",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x12d",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xbc2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x20cae70a3b0dbe466c0cb52294f4a0fcc2fdae8e8e23a070cfa0ebe6a9fabab9",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x2c",
+ "validatorIndex": "0x5",
+ "address": "0x1c123d5c0d6c5a22ef480dce944631369fc6ce28",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x99d001850f513efdc613fb7c8ede12a943ff543c578a54bebbb16daecc56cec5"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np302",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x20cae70a3b0dbe466c0cb52294f4a0fcc2fdae8e8e23a070cfa0ebe6a9fabab9",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x4e0e374db1e769d72af232e15f83b61024ab42a410b4088ad54ae31fb7ab24c2",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x12e",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xbcc",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x8088940507cc523f7c12bcec9729eed01e631ccef6faa8a6413a89d77f109c0b",
+ "transactions": [
+ "0xf88281f208830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a03f816a6f00b46ffee7ae7dc0a8472c822003d7f175c03fc883435b5303662e29a053e91a9fcfb952b9d2ee2d3017e3d02c8988bb4abcb9c343b66d90094e9b9817"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x30a4501d58b23fc7eee5310f5262783b2dd36a94922d11e5e173ec763be8accb"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np303",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x8088940507cc523f7c12bcec9729eed01e631ccef6faa8a6413a89d77f109c0b",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x5cd39242444b2f075de43272eb00a7435191e5d07d4da17022f05f91167f8a71",
+ "receiptsRoot": "0x8c5ae4043b8c3ac3c3faf57678b01a0a80043b682d0a8ae2681dc5c892d7a562",
+ "logsBloom": "0x00000000000000008000808000000040000000000008000000010000000100000000000040000000000000000000001000000000000000000000000000000000100004000000000000800000000000000008008000000008000000000000000020000000000000000000000000000000000000040000000400000000000000000002000000000000000000000000000000000060000000000000000010000000000000000000001020000000080000400000000000000000000000000000000000000400100000000000000000000000200000400000000000000000800000000000000000000000000000000000000010000000004000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x12f",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xbd6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x3cfeeb3c000dbf1a34a7d601bacf17a26ab0618b14a821b61f847d10d41dd47d",
+ "transactions": [
+ "0xf87981f30883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0cdff6973fabfb503b56e50264fa9d542805c351a2cf282d14e9a7e3f90df3bcea03fc2b2ef3d6e5c8d141f20dab6ea64a6ad2f7c5ab3da95c98cff7a73429036a1"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xa804188a0434260c0825a988483de064ae01d3e50cb111642c4cfb65bfc2dfb7"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np304",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x3cfeeb3c000dbf1a34a7d601bacf17a26ab0618b14a821b61f847d10d41dd47d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xb8480fa4b2321e09e390c660f11ec0d4466411bae4a7016975b2b4fd843260dd",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x130",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xbe0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xcb128d5be67707747d086abaf2a724879f3a54b7ca2bda6844678eb52a2d225f",
+ "transactions": [
+ "0xf86481f4088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0ceb79cfa45773ae766de6daf76c67f63fbf14c7cd3853b6cd9ba8cd7cd1608baa019c783f138465d2c59039c902cc9b90cbff0e71a09672939e2373390b1f8c4c5"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc554c79292c950bce95e9ef57136684fffb847188607705454909aa5790edc64"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np305",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xcb128d5be67707747d086abaf2a724879f3a54b7ca2bda6844678eb52a2d225f",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x022e2901949be09d1a92be5055ced3cd0770b41c850daf830834dc7da22c9af3",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x131",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xbea",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x36ddc7075c24073ea0b9b997ebf4a82596f13b41a831293600aaf876d5d1e0e0",
+ "transactions": [
+ "0x02f86a870c72dd9d5e883e81f5010882520894f16ba6fa61da3398815be2a6c0f7cb1351982dbc0180c001a08dac03d829e6f8eab08661cd070c8a58eed41467ad9e526bb3b9c939e3fd4482a02ac7208f150195c44c455ddeea0bbe104b9121fef5cba865311940f4de428eec"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc89e3673025beff5031d48a885098da23d716b743449fd5533a04f25bd2cd203"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np306",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x36ddc7075c24073ea0b9b997ebf4a82596f13b41a831293600aaf876d5d1e0e0",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xec2a36c595c95a6b095a795e22415b66f5875f243697e72c945361b4f440c3bc",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x132",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xbf4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x90eae29a9b788583ec3624dac546f4372b97d2b1b58edbcca1b9f82e62b0d3c6",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x2d",
+ "validatorIndex": "0x5",
+ "address": "0x7f774bb46e7e342a2d9d0514b27cee622012f741",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x44c310142a326a3822abeb9161413f91010858432d27c9185c800c9c2d92aea6"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np307",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x90eae29a9b788583ec3624dac546f4372b97d2b1b58edbcca1b9f82e62b0d3c6",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x427bbc009fe03135af46fb83f7cdcf27c022159be37615c8caceff14061d2f1f",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x133",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xbfe",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xdce2eeeafbf4e8ff4dbfa786434262fe7881254d7abcea2eabca03f5af5aa250",
+ "transactions": [
+ "0xf88281f608830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa07b4f78cff0cb04bb8cb3d81e0aabef7b54c34db7438322bc8c1554448a37b027a00b760535ea891c9b4af5c70ac5726b3829418f5b21632aa8dda9ed2a91a7e30f"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xae3f497ee4bd619d651097d3e04f50caac1f6af55b31b4cbde4faf1c5ddc21e8"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np308",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xdce2eeeafbf4e8ff4dbfa786434262fe7881254d7abcea2eabca03f5af5aa250",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x4b11a079f7e911f563ce2c7a0bcda57feaea847b827bfceb4b0f0a1fde490e41",
+ "receiptsRoot": "0x2cea15106bcab9c8122ea9fc8d7b5ace9f0650a79134ad9732b933221eb0c440",
+ "logsBloom": "0x000000020000080000000000000000000000000000000000800000000000040000000001000000000000000000000001010000000010000000000000800000000000000000020008000080000000000000000000000000000000000080080000000000000000000000000200000100000000000000000000000002001000000000000000000800200000000000000000000000000000002000000000020020000008000000000000000000000000000000000000000000000000000000000100000000000004c0000000000000000000000010000000000000200000000000000000000000000010000000000004000200000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x134",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xc08",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xd619d2e9c151c94d9610527d55ab721a092f2566b79a92821e4c7c8a106cce4f",
+ "transactions": [
+ "0xf87981f70883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a03d6fef2d466b342db8155272b9e676d55fdc0fedab7d1fce3b3be54459203a44a016b740412be1021d3f480fbf75fa6733d5a233489a0e1cf72bf56c8b37a0ef80"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x3287d70a7b87db98964e828d5c45a4fa4cd7907be3538a5e990d7a3573ccb9c1"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np309",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xd619d2e9c151c94d9610527d55ab721a092f2566b79a92821e4c7c8a106cce4f",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x0d7fe7c7c5e17180dd3c5d11953d20c0df05569d83f29789680311e835d44c92",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x135",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xc12",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x722090df82f4d2bf93cc1d092239e427a1ed045284bc56b5aa142b02d2cb3955",
+ "transactions": [
+ "0xf86481f8088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0b82807e311788292f679bc187111f494eb67171b03e417afdfb54e17f53b9ecfa05d9e1261b6bd95693c5e7859fa6e9ac0f380083750f46dec3f5058026c00aa54"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xb52bb578e25d833410fcca7aa6f35f79844537361a43192dce8dcbc72d15e09b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np310",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x722090df82f4d2bf93cc1d092239e427a1ed045284bc56b5aa142b02d2cb3955",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x97742ddf818bf71e18497c37e9532561f45ff6f209555d67e694ec0cec856e7e",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x136",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xc1c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x81f5ce1e85499179e132dbe7b9eb21403c7f3df276820c668ed86a018065dbfa",
+ "transactions": [
+ "0xf86781f9088252089417333b15b4a5afd16cac55a104b554fc63cc873101808718e5bb3abd109fa0f2179ec11444804bb595a6a2f569ea474b66e654ff8d6d162ec6ed565f83c1aaa0657ed11774d5d4bb0ed0eb1206d1d254735434a0c267912713099336c2dc147a"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xff8f6f17c0f6d208d27dd8b9147586037086b70baf4f70c3629e73f8f053d34f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np311",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x81f5ce1e85499179e132dbe7b9eb21403c7f3df276820c668ed86a018065dbfa",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x5feed3f1d6bc9de7faac7b8c1d3cfe80d29fbf205455bc25ac4c94ff5f514ca3",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x137",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xc26",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x685678cda85d28dbe24cd7ef896866decc88be80af44933953112194baeb70df",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x2e",
+ "validatorIndex": "0x5",
+ "address": "0x06f647b157b8557a12979ba04cf5ba222b9747cf",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x70bccc358ad584aacb115076c8aded45961f41920ffedf69ffa0483e0e91fa52"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np312",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x685678cda85d28dbe24cd7ef896866decc88be80af44933953112194baeb70df",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xde4840156998638689e0d07c0c706d3f79031636ae0d810638ecdd66c85516f4",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x138",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xc30",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xabbd38fb9a670e62ceca6b3f5cb525834dc1208cd8bc51b3a855932951e34ee3",
+ "transactions": [
+ "0xf88281fa08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa06193bab90c2a0e05f830df90babae78be711ea74e7fa7da80fb57bf1eac7b01ba007568dc41c59c9a3e9f4c46ad8bac850ecee5fdbe8add1a840db65266062453c"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe3881eba45a97335a6d450cc37e7f82b81d297c111569e38b6ba0c5fb0ae5d71"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np313",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xabbd38fb9a670e62ceca6b3f5cb525834dc1208cd8bc51b3a855932951e34ee3",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6fc93047d0ff562c8abee419aecf2b174b1c382f506dedcbb5ba04955cd985c7",
+ "receiptsRoot": "0xcd59afd93dd989872aa9f89197f533f1c6a90364b872e145f50ff782af2b758b",
+ "logsBloom": "0x00000000000000000000000001000000000000000000000010000000000000000000000800000000000000000000000004011000000000400000001000000000004000000000000000080000000080000000000000004000800000000400001000000000000000000008000000800004000000000000000000000000080008000000000040000000000000000000000000000020000001000000000000000000000400000000000000000300000000000000000000000000000000400000000000000000000000000000000000000000000400000000000000000000000000000010000000000000001000000000000000010000000000000000400000000040",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x139",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xc3a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x323e57df6d8869c18eac5a0746e2e3fa96645813704b4af06659dfea08d2473c",
+ "transactions": [
+ "0xf87981fb0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0465ab07ff3930a9a8f24c5108701be4a0475480d72147e12305f9d67017af925a07b3dd5fbeae129ce4ea30381c15b2afd9be701e4969422415e07ecea3df82db1"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x2217beb48c71769d8bf9caaac2858237552fd68cd4ddefb66d04551e7beaa176"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np314",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x323e57df6d8869c18eac5a0746e2e3fa96645813704b4af06659dfea08d2473c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xcae6ffdf3092bcb2ebdc66df86177bce69bf2f5921e5c4d482d94f2fd5f6649b",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x13a",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xc44",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x36c686b156ca6fb1280730a2f86acfd8bcee71bb9666a473d00f0c7813fe5a2c",
+ "transactions": [
+ "0xf86481fc088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0d92908e16f6965c17390bafa5649b05b9150b6db7cb63fccfa3d8ccc1f18ec7fa04082aba5936ac8d14c3f78d12f12d9437b575cebd82337c4499f2176afb74cba"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x06b56638d2545a02757e7f268b25a0cd3bce792fcb1e88da21b0cc21883b9720"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np315",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x36c686b156ca6fb1280730a2f86acfd8bcee71bb9666a473d00f0c7813fe5a2c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x1220b41d89a79f31d67f2373ea8563b54fb61661818e9aab06059361fc1412ca",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x13b",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xc4e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xe5456434219d6d602162c56859d7a24895a28aac0958bd46bef986d7d8cab2e0",
+ "transactions": [
+ "0x02f86a870c72dd9d5e883e81fd010882520894d20b702303d7d7c8afe50344d66a8a711bae14250180c001a067bed94b25c4f3ab70b3aae5cd44c648c9807cdf086299e77cf2977b9bce8244a076661b80df9b49579fce2e2201a51b08ecc4eb503d5f5517ecb20156fde7ec5a"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xebdc8c9e2a85a1fb6582ca30616a685ec8ec25e9c020a65a85671e8b9dacc6eb"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np316",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe5456434219d6d602162c56859d7a24895a28aac0958bd46bef986d7d8cab2e0",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x65c692f846c2dc380a912a71c1387fec7221a2b0fffae2451370c30ed15350d1",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x13c",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xc58",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xa0f3387ab2dd15ebc6dc9522d5d0ee33f01548722c7fde856fb0f4f00fc6a7a1",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x2f",
+ "validatorIndex": "0x5",
+ "address": "0xcccc369c5141675a9e9b1925164f30cdd60992dc",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x738f3edb9d8d273aac79f95f3877fd885e1db732e86115fa3d0da18e6c89e9cf"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np317",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa0f3387ab2dd15ebc6dc9522d5d0ee33f01548722c7fde856fb0f4f00fc6a7a1",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3dc5f82b5983ab440abc575ac26ea2f4962c8c31f7e8721b537ea53d385827d5",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x13d",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xc62",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xf0da8bf67d04b148efa37b1c72f83bad458c873c35390e45853916d2a6011efa",
+ "transactions": [
+ "0xf88281fe08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a0f5f035f73b86709cffa1134edc422e41e8ec49f3455943045c8571f4f12e8f6fa0659c80c0802ca16b9c71c90a8c1d7c32580b8dc2e33eb246d05e9c4920314a31"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xae5ccfc8201288b0c5981cdb60e16bc832ac92edc51149bfe40ff4a935a0c13a"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np318",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xf0da8bf67d04b148efa37b1c72f83bad458c873c35390e45853916d2a6011efa",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xb0a0edf94f736c11dfd920d0d386b5857441067979baff670d45380f5ce9c2b2",
+ "receiptsRoot": "0xbe0275e0c21d0b23665e6d0b34bbb1669b585dfb6ef89c0903dcf8586ec86d00",
+ "logsBloom": "0x00000020000000000000000000000000000100000000000000000000000040000000001000000000000040000000001000000000000000000000000000000000000000000000000000000000000001000000000000000400000000000002000000000000000000000000000000000000004800000000000000000000000000000000000020000000001004000000000004000000000000000100000800000401008000000000000000000800000000000100000000200000000000002000000000000000020002000000000000000000000000000000000000000200004002000004000000000000000000080200000000000000000000000000010000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x13e",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xc6c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x9b47d293dedc13b8b02e999ebaf1bf25c233229acf97e7ff9e9491ffbdbcf859",
+ "transactions": [
+ "0xf87981ff0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a03b9f00d5731e51c973193cb6169cb8024b864d02e5347f287f8de4807e343922a04763ef63ac8ddc3fab7ccc70a4890b69fc944f330f5dd92f1b0266aaa6730eb6"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x69a7a19c159c0534e50a98e460707c6c280e7e355fb97cf2b5e0fd56c45a0a97"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np319",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x9b47d293dedc13b8b02e999ebaf1bf25c233229acf97e7ff9e9491ffbdbcf859",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe7a75428fc4aadb70c1e0ac2ae59a54df93458845525804742ae02a83d4f235e",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x13f",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xc76",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xa2c25b920f18b7c73332a155d3ab99a4a88b6454f70c1bdfddfcbfe50311c702",
+ "transactions": [
+ "0xf865820100088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa08c4b5e491ee67e169155453cdfc9f7ee6f122aeda5d73caf8337d6c29be1be3ca06b9a4038e45c6b5e858787dda6d1fe8d3c502a42996b4fe1abd2de1b834cf5fe"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4d2a1e9207a1466593e5903c5481a579e38e247afe5e80bd41d629ac3342e6a4"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np320",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa2c25b920f18b7c73332a155d3ab99a4a88b6454f70c1bdfddfcbfe50311c702",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xda3147e8c80cfa63013d1700016a432d64c00213231ac510ab15f7011eea14e8",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x140",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xc80",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xde65dcf316b36cd1d205e6df4a905df46ceedb163133ebffbab07fb6225d246d",
+ "transactions": [
+ "0xf8688201010882520894dd1e2826c0124a6d4f7397a5a71f633928926c0601808718e5bb3abd109fa01f5208621cee9149c99848d808ee0fa8d57b358afbd39dc594f383b7f525f4c6a01960c6254e869f06cfa3263972aa8e7cc79aec12caa728515c420d35b1336c0e"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xd3e7d679c0d232629818cbb94251c24797ce36dd2a45dbe8c77a6a345231c3b3"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np321",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xde65dcf316b36cd1d205e6df4a905df46ceedb163133ebffbab07fb6225d246d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x05dcc2c2d7e87e4e1d836888d7158131800d123c6b2de255ba83054dfa109b02",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x141",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xc8a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xf2fb525ebc86939eeafb51c320f9793182f89f7bc58ad12900362db56d9d4322",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x30",
+ "validatorIndex": "0x5",
+ "address": "0xacfa6b0e008d0208f16026b4d17a4c070e8f9f8d",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xd1835b94166e1856dddb6eaa1cfdcc6979193f2ff4541ab274738bd48072899c"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np322",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xf2fb525ebc86939eeafb51c320f9793182f89f7bc58ad12900362db56d9d4322",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x5efe08d743bbae45240fc20d02ab6e38e923dedc1027cf7bc3caff52a138dc06",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x142",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xc94",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x815a67d4526461c4d40a205f5e8cbd11964bd0ed1079edc334250475a0efe1f2",
+ "transactions": [
+ "0xf88382010208830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a0f8cf692109b242d13af60f7def7e34fc16e4589de28a3fc445e83fece028b046a07ab0d98800bffd516adf4a56b048f67b4d5ffcf438c8463d82a0fe41509f51e6"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x1f12c89436a94d427a69bca5a080edc328bd2424896f3f37223186b440deb45e"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np323",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x815a67d4526461c4d40a205f5e8cbd11964bd0ed1079edc334250475a0efe1f2",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe6408a88797a6a4177fdb082766f6f35cd304745d96ceec7ba85908cf887ba77",
+ "receiptsRoot": "0xf0fa46b5337f820bd96b8bf1a50706c91cf6e2d8a9bb0fd9859f0f80d60009e3",
+ "logsBloom": "0x00400000000000080000000060000000000000020000000000100000100000040000040000000004000010000000000400000000000001020400000000000000000000000000000000000000000000000000000000000100000000000000400000000000020000800000100000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000014000000008000000000000000000000000800000000004000000000000000000000000000000020000000000010000800000000000000000000000000000000800000000000000000000000000000000000000000000400000000010000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x143",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xc9e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xc80438a37c405d0d3748ca7c92fb89f010ba9b06bd2136b919b563978f1ae6c1",
+ "transactions": [
+ "0xf87a8201030883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa04d42d5415cbd9d939ef53ef60dbdffb80d016dc6e0704059b94ea4c1d398a2c6a06276655ceed05dd6ed9d6adcb9bb38bf699ae5f7ad1d8e47871404cd3ca98a00"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xccb765890b7107fd98056a257381b6b1d10a83474bbf1bdf8e6b0b8eb9cef2a9"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np324",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xc80438a37c405d0d3748ca7c92fb89f010ba9b06bd2136b919b563978f1ae6c1",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x38475f9f9a763356a2e995dd7ff0e2b3376078bd3048aa3d25bfec5257e1cf3f",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x144",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xca8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x1efad9b7aa7d15c849d6055ea15823066111fed8860177b6b0be3ed187a22664",
+ "transactions": [
+ "0xf865820104088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0654811f90e5259072ba79ea3e5a6ca7bfe8659e198ded895d149d1fc2bfe0167a052842cb4b3a0b0f2d722ec25a5c948bb2b78c3cd2d750303a5869a8812f17eed"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x8bbf4e534dbf4580edc5a973194a725b7283f7b9fbb7d7d8deb386aaceebfa84"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np325",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x1efad9b7aa7d15c849d6055ea15823066111fed8860177b6b0be3ed187a22664",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xda41e628e9aa8c362284b556f48a4e3f9e3e0daec75c7950cd5d4ea75b9f8223",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x145",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xcb2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x8cfb3cab3103d0431ed161ebec0a29ffce5b82e8fa5b00520169a8be360b9054",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e8201050108825208941219c38638722b91f3a909f930d3acc16e3098040180c001a063adb9abb5014935b3dbf8c31059d6f1d9e12068a3f13bd3465db2b5a7f27f98a056f0f5bed39985d0921989b132e9638472405a2b1ba757e22df3276ca9b527fa"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x85a0516088f78d837352dcf12547ee3c598dda398e78a9f4d95acfbef19f5e19"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np326",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x8cfb3cab3103d0431ed161ebec0a29ffce5b82e8fa5b00520169a8be360b9054",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xbcdb535ac430393001427eab3b9ff8330ae1c997c2631196da62db6c3c5a5a08",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x146",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xcbc",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xacef7ee8af09f4b94fc20d862eb2426993ad2e2807e22be468143ea8cb585d0f",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x31",
+ "validatorIndex": "0x5",
+ "address": "0x6a632187a3abf9bebb66d43368fccd612f631cbc",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x0f669bc7780e2e5719f9c05872a112f6511e7f189a8649cda5d8dda88d6b8ac3"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np327",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xacef7ee8af09f4b94fc20d862eb2426993ad2e2807e22be468143ea8cb585d0f",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf54751e3cc778e70000823cc9800dbecaf86c60afe48ddd4f942c9c26f606d6f",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x147",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xcc6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x61642769719bcfbed733fd6b7c2cd51038dc1404f0e77f50c330ac8c9629b8c4",
+ "transactions": [
+ "0xf88382010608830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a0af7d5214c1fa8aff20cfd3e89d0db2ff361cf5c23dae0823c6719d9bd3c3a996a0581c85fafb49fa0753c67f65e6ad04871fab4a72a9bf5d9ab3bd7aa33b230225"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xa7816288f9712fcab6a2b6fbd0b941b8f48c2acb635580ed80c27bed7e840a57"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np328",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x61642769719bcfbed733fd6b7c2cd51038dc1404f0e77f50c330ac8c9629b8c4",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xaf3502d0a6862e2cde40bbf084cba5e582a0ba3b3bc0beec6791a712c3d171e3",
+ "receiptsRoot": "0x52236ae99e7647366a3e31ba24153828332656ea5d242e422ffca1dbf576701d",
+ "logsBloom": "0x00000000000000004000000000000000000000001010000000000000000008000040000000000000000000000000000000020000200000000080000000000000000000200000000000000021000000000000400000000020000000000000000000000000000080000200000102000000000000000000000000000002000000000000000000000000000000000000000800000000000000000000000088000000800000000000000000000000000000000000020200004000000004000000000000000000002000000000000000000000020000002000080000000000000000000000402000000000000000000000000000000000000000000000000000000008",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x148",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xcd0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x3acbeee2cb8786a166d6caf512afc82b72ed1ccbfbe39dd32dd53f842046866a",
+ "transactions": [
+ "0xf87a8201070883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a015a81314b3c04efc725ff998badcf9278fb668561e5f9cdd42336845be60ec6ea04c593cfd5526eaf42203a3e6b5020e612ddd4053fa3123f51ae02bf8dde98eb3"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xda5168c8c83ac67dfc2772af49d689f11974e960dee4c4351bac637db1a39e82"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np329",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x3acbeee2cb8786a166d6caf512afc82b72ed1ccbfbe39dd32dd53f842046866a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x2a4691469da94625b4626e0a10273a2854e342a71b0711acebc46c8553eb8f0e",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x149",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xcda",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x1c012e1db133493333b09aff51ca8a110b148221aaf1f28c3d21b41382b0d058",
+ "transactions": [
+ "0xf865820108088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0f9f0dcc20f1b62b8c567ac92dc1fbf50908f8bcd504fff3a342de336052e66bea00d38043fb1b141dc3fa2b97eaf09bc490be62e1cf7c40b670503ce0fbd8f6dce"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x3f720ecec02446f1af948de4eb0f54775562f2d615726375c377114515ac545b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np330",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x1c012e1db133493333b09aff51ca8a110b148221aaf1f28c3d21b41382b0d058",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x44248f33cb76fe58bf53afa7a07e7b3d1d1efb1dcde8379ba1719d987a4cb83e",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x14a",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xce4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x4e325a3f368a7235db02d7e604501ef2b416494a13136c23026e9dd3a3f38547",
+ "transactions": [
+ "0xf86882010908825208941f5746736c7741ae3e8fa0c6e947cade81559a8601808718e5bb3abd109fa0edd3402a6c7a96114e4c8520d7bf3f06c00d9f24ee08de4c8afdbf05b4487b7da068cd4cf2242a8df916b3594055ee05551b77021bbea9b9eb9740f9a8e6466d80"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x273830a0087f6cef0fdb42179aa1c6c8c19f7bc83c3dc7aa1a56e4e05ca473ea"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np331",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x4e325a3f368a7235db02d7e604501ef2b416494a13136c23026e9dd3a3f38547",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x30f652c6dbb2b9b0f66b7031f6fd0a8c163866de7b7f33c3e8a0d1f9b37a6d20",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x14b",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xcee",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xb1a056033a59f165c7df49320a7a67b1fdf266039f12ca8cd2ca8b904425dadf",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x32",
+ "validatorIndex": "0x5",
+ "address": "0x984c16459ded76438d98ce9b608f175c28a910a0",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x7044f700543fd542e87e7cdb94f0126b0f6ad9488d0874a8ac903a72bade34e9"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np332",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb1a056033a59f165c7df49320a7a67b1fdf266039f12ca8cd2ca8b904425dadf",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x7ef2bb0e7090f0d465ded8b1064d0aafb5da43bc603b3ae8e39b678616f22f04",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x14c",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xcf8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x961da5e8745e0e4ae8287d73382c5b0d651110a7c7f900abf5f04b3e114b4776",
+ "transactions": [
+ "0xf88382010a08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a0b67083c09c180ffba5ddc095999eaacd6d2cec077395c58d882c7a0706954896a02aaa853bfdbcdac9eefd90ff627107b5ca67b0c3969f3a770a4545a3b9d01514"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf63a7ff76bb9713bea8d47831a1510d2c8971accd22a403d5bbfaaa3dc310616"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np333",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x961da5e8745e0e4ae8287d73382c5b0d651110a7c7f900abf5f04b3e114b4776",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xff5f5d4ea4c9cb2944bea27f92a309b59ac66d45d231125258186ad3fcd58b61",
+ "receiptsRoot": "0xd5a4c662356c2fb912cf7df7798aabe0c8598dd3918c2c7e05db6619b76d855e",
+ "logsBloom": "0x00000000044004000000000000000100000000000000001000000000800000000000000000000000000000001000000000000002000101000002000000000000080000100000000000000000000000000000000000000200000000000000000010000000000000000000000100000800800000000000000000004000000800000000020000001000000002000000000000000000000000000000000000000000000000000000000000000100200000000000000000000000000200200080000000000000000000000000000002000000200000000080000000000008000000000000000000400000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x14d",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xd02",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xa966ce90648fa40427896d7206976e783f96979437cbb3aed9cc9b050675763c",
+ "transactions": [
+ "0xf87a82010b0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0e65e3fb877a256ecdcf4de6dc51df2bd755e14acad6b24c68e7168dbdfcf77b5a017ffeb5a31596ad459195610c5c5e3f348468dab79d930d49cddc0601cd5a965"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xa68dbd9898dd1589501ca3220784c44d41852ad997a270e215539d461ec090f8"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np334",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa966ce90648fa40427896d7206976e783f96979437cbb3aed9cc9b050675763c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xc8b1d4c2863741606d2cb870ed951e27495def1661f5192eef61cea97b8cd79d",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x14e",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xd0c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x266c92734d3a74137a12e4f6af6fe2cc401992b473d8af9121edbf3a78e4cf8a",
+ "transactions": [
+ "0xf86582010c088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa041e92995e25443285655d748126496dbe98874a5cee8a1f0e58ea9f6a650f862a07feb73712a079a889322fcb61999780dab187d69eef21757af3eb0c9825f64c1"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x59e501ae3ba9e0c3adafdf0f696d2e6a358e1bec43cbe9b0258c2335dd8d764f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np335",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x266c92734d3a74137a12e4f6af6fe2cc401992b473d8af9121edbf3a78e4cf8a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x53e02e88b716b3d80f9cac4ea6e30497d8a5e0f2dc4df131a20a9ffb78fe8cda",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x14f",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xd16",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xebbfb2910659e643ff415b200900100e8e116b6d84a3e8e17b87d3e93dcdf3be",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e82010d0108825208949ae62b6d840756c238b5ce936b910bb99d5650470180c080a0025cc19f12be3ff2a51342412dc152953e8e8b61c9c3858c9d476cc214be4e30a0193960b0d01b790ef99b9a39b7475d18e83499f1635fc0a3868fc67c4da5b2c3"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4f19cff0003bdc03c2fee20db950f0efb323be170f0b09c491a20abcf26ecf43"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np336",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xebbfb2910659e643ff415b200900100e8e116b6d84a3e8e17b87d3e93dcdf3be",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6be6c01d240a951a6adb298d9cb4e7c9e5e8960540de958b4b458fcfa489bf36",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x150",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xd20",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x1f86807324e8cce9f4294076c96c4b2007acb0d2aba5c9ad2695e68aad468f8c",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x33",
+ "validatorIndex": "0x5",
+ "address": "0x2847213288f0988543a76512fab09684131809d9",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x52b1b89795a8fabd3c8594bd571b44fd72279979aaa1d49ea7105c787f8f5fa6"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np337",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x1f86807324e8cce9f4294076c96c4b2007acb0d2aba5c9ad2695e68aad468f8c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd2cd6e558f19ab03db7ee9677a850741b4f1f763c3de94539a16d54c27f6cac0",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x151",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xd2a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x7cec5c4064e153c1c3adeda621a8764ebd7a693aa70891ef0bc7b6f95e64ae7b",
+ "transactions": [
+ "0xf88382010e08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a057a97e1fae6dc03c4a29ad01b4d2ebea7069f1bef844b28b92875346d4454c46a01f5821fcf724aa6b0a3b082a6462e5f191a3c5659ba1b66b82cd42cf3175ba59"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x7c1416bd4838b93bc87990c9dcca108675bafab950dd0faf111d9eddc4e54327"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np338",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x7cec5c4064e153c1c3adeda621a8764ebd7a693aa70891ef0bc7b6f95e64ae7b",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe1531cb938cfb7009f343d7ce9de03c63fe99878807b1ec8954b3a29a2d630f1",
+ "receiptsRoot": "0xa8c44170e431c7d7adf58109a7dbb58eeb38a19244c8a866311ef3a45fd13dfd",
+ "logsBloom": "0x00000000000000000000000000002000000000000000000000000000000080000000002000000000000000000000000000000000008000010000000000000000000000000000000000000000000000000800000040000420000400000000000000000000000000000000000000000000000000000000004000000000000000000200000018000000040000008400000000000000000000000000000001000000201000000010000001000400000000000000000000000000000002002000000000000400000000000000000000000000000000001000000000000000000000000000000000000080000000000004100000101000001000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x152",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xd34",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x11bd9e6153d072615b7e129ce56e720c40c048dd37afb5fdbfff09f994ae4a13",
+ "transactions": [
+ "0xf87a82010f0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0de79b818723588fa8952e0d007ef1e1db2240b355f4f0f69f2af9df6b3408407a00962c062cd7fc4b8bf627bab2c0a00349d7b1bfc6f7875ca3a18967ad30ff219"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xef87a35bb6e56e7d5a1f804c63c978bbd1c1516c4eb70edad2b8143169262c9f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np339",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x11bd9e6153d072615b7e129ce56e720c40c048dd37afb5fdbfff09f994ae4a13",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd35f874d00597dfb19f0363bbab78f3356e12ec8b4ee89f2883285139d7a3c29",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x153",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xd3e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xf7122487788d84678b120512a25b1393417a66e19db5b507d471dd17628a84ea",
+ "transactions": [
+ "0xf865820110088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa083a20e0b736688ba1f10440def989495ff253a281368f0ca21154d327c0468b8a0119312bdfeff761612ef529e4066bd28b4ed46895e5b67593fb0a3a897d3aa16"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe978f25d16f468c0a0b585994d1e912837f55e1cd8849e140f484a2702385ef2"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np340",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xf7122487788d84678b120512a25b1393417a66e19db5b507d471dd17628a84ea",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xfa5b72ef0354b0b53f973b5285234c441e1bbf86d26374dd3856b36627d5caa3",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x154",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xd48",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xb1d88e8bd186bb264de8def507f6a5876ec6f3af27be936763dfd39213ab07e8",
+ "transactions": [
+ "0xf8688201110882520894b55a3d332d267493105927b892545d2cd4c83bd601808718e5bb3abd10a0a073cc84153b8891468325ac12743faf7e373b78dbf8b9f856cb2622c7b4fd10e1a0388714fe9d2f85a88b962e213cbe1fa3c4a9823cea051cf91c607ecbd90093d8"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc3e85e9260b6fad139e3c42587cc2df7a9da07fadaacaf2381ca0d4a0c91c819"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np341",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb1d88e8bd186bb264de8def507f6a5876ec6f3af27be936763dfd39213ab07e8",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xac6b9759a537d44a1629532184219d1f658f68745491b27e81c87361e72ad602",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x155",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xd52",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x70dad5a0db225381e8f841db9d8adf9a350051128cc22c0e5a00ad990c592b0d",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x34",
+ "validatorIndex": "0x5",
+ "address": "0x1037044fabf0421617c47c74681d7cc9c59f136c",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xbd2647c989abfd1d340fd05add92800064ad742cd82be8c2ec5cc7df20eb0351"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np342",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x70dad5a0db225381e8f841db9d8adf9a350051128cc22c0e5a00ad990c592b0d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe579eb979cbfd580c19ef8583f73a0fda902ee0895903a767d544ade95c50baa",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x156",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xd5c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xb9b47ee8f7c38e7e1f69148756182d3da3a7d0c123948d2c56e5268357fced99",
+ "transactions": [
+ "0xf88382011208830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0874d69f306b86e76465f6f0ad314cadee41f0f0d1844d35408201c3b2f690de0a0698f29877cb7dec8ee91a42a74f0f5270cbb391836fdaeda1e0876d3c16177b9"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x99ac5ad7b62dd843abca85e485a6d4331e006ef9d391b0e89fb2eeccef1d29a2"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np343",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb9b47ee8f7c38e7e1f69148756182d3da3a7d0c123948d2c56e5268357fced99",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf9106c3c4fcc77588a382ba0c2f605f6e07fcc418edac1cdd7de3b0e70f81b9f",
+ "receiptsRoot": "0x07a001dcc7eec5d1e8aa3508d61fcf5d511b4f9b766801b63319aa423ef08c3f",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000010000800000000000000000000840000004000000000080000010000000000000000000000000000000000000000000000020000000000000000008000010000000000000000000000000000000100000000108000000000000210000000000100000000000000000000002000000408000000000030000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200008800008000008000000000000000400000100000000000000008000000000000000000000080000000000000000000001010000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x157",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xd66",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xde78022135caa19aa76718718d5de70d69e3f2488ff6769aee87c1d765237214",
+ "transactions": [
+ "0xf87a8201130883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa084f91b21758f4c28d386fa99e8b7e126d27a1f9e293e5df2683057e09a9c6a2fa051772044b702ac375f615dc0d6aaa8c1d38c3ac2a830539d2ab62935c5132921"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x02a4349c3ee7403fe2f23cad9cf2fb6933b1ae37e34c9d414dc4f64516ea9f97"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np344",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xde78022135caa19aa76718718d5de70d69e3f2488ff6769aee87c1d765237214",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x19268b0f7992afe0cf1f3c0ac73b371ed7d9e79dddf0435b72bc45e1682a9c74",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x158",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xd70",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x8123c0650f836341cace6e65f0826a678974333748bc91a93d569224d63f832a",
+ "transactions": [
+ "0xf865820114088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0904e2a23972254826c8f3f5efa2d39122f980811cb9dd3e5d2869618d458856aa00fd104e760443aa8abcbdfbf2263d45a32a7aec32e59548b3e73575bc21f0243"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x627b41fdbdf4a95381da5e5186123bf808c119b849dfdd3f515fa8d54c19c771"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np345",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x8123c0650f836341cace6e65f0826a678974333748bc91a93d569224d63f832a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3ef70ee0614b3ae112271af4be70033c61a89f337aa527b8657df19422d94913",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x159",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xd7a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xc74bc2976b5c5cbcfd64757534333c98d56bcac3109fc4504e3c324801f27530",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e820115010882520894b68176634dde4d9402ecb148265db047d17cb4ab0180c080a09f3175e9aa2fe2332600b71de0b0977c7c60ccbeee66ea360226326817f2d59ba06a870e0876002f789b3203f4a33d5e621ac67051704e1f2260b80d816260b3e6"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc087b16d7caa58e1361a7b158159469975f55582a4ef760465703a40123226d7"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np346",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xc74bc2976b5c5cbcfd64757534333c98d56bcac3109fc4504e3c324801f27530",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xbbec06f293095304adb3f03ba055fd08a691c89d5de1ade4c1ed31b9c6672989",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x15a",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xd84",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x60a82197fb6b3b7d9a4912ec6ac783460863e449f48c28d68a45b4d4bf0a99f4",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x35",
+ "validatorIndex": "0x5",
+ "address": "0x8cf42eb93b1426f22a30bd22539503bdf838830c",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf7a477c0c27d4890e3fb56eb2dc0386e7409d1c59cab6c7f22b84de45b4c6867"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np347",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x60a82197fb6b3b7d9a4912ec6ac783460863e449f48c28d68a45b4d4bf0a99f4",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x169c28a15311ed314bc0a4529aaddacc79d5fd6becdaaae69276079408d57eda",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x15b",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xd8e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xefbb190d45953f5e6292e14fc50b51539bca514890f94eda3e3ba2553417303a",
+ "transactions": [
+ "0xf88382011608830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a065a20271c4b6acc45c7e172465adcdc218b164c0936999de9bdd37c4a4c63fd0a003792daae8ab2be81df0df962c26697830d30af560c8a85a0fba05e5cfc82d66"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x1cb440b7d88e98ceb953bc46b003fde2150860be05e11b9a5abae2c814a71571"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np348",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xefbb190d45953f5e6292e14fc50b51539bca514890f94eda3e3ba2553417303a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x704fde0fccaf5957d60018e958bfb8cc7bb7e77eed37cee3bdcdcca280b3b1fb",
+ "receiptsRoot": "0x0016ae7d40181cb711af89f17dc40dfb53384c5ef535847ae4982b1d58bfadd1",
+ "logsBloom": "0x00000000000000000000000004800000000000000000000000000000000200000000000000000000000000008000000020000000000200000000000000000000000000000000000000000000000000000000000000004000000000000008000000000008010000000000100008000000000020000000000400000080000000080000000000040000000080000000000002000000000000000000000000001000000000200000000000800100000000000000000040000008000000000000000000000040200000000000000000000000000000000000000000000000020000000000200000020000001008000001000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x15c",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xd98",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xac7efb8f8fa8949755e520c30b52d9c292eb7e46eb8cac907f1267f72de81237",
+ "transactions": [
+ "0xf87a8201170883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0a7fe70291d9f18d3daffb9c6845116569c9be21f8b04c47235999ad35c20a079a03ad45b41a4993ea744bb28012bae4998ad6e97da464162d4ce51810e442e3ccc"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x72613e3e30445e37af38976f6bb3e3bf7debbcf70156eb37c5ac4e41834f9dd2"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np349",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xac7efb8f8fa8949755e520c30b52d9c292eb7e46eb8cac907f1267f72de81237",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x898ac18f3ec544e0908e3a1c5434515aa421b796a41501b0474375f49fba30c8",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x15d",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xda2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x498a0d50858ecbfd2fe317843b04c02a00dfa8c2ee6a0e3641947439f0eb7dba",
+ "transactions": [
+ "0xf865820118088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0027208b707b49c8686502030a1029e738d91a7c0bf9dff86bb90ccda2e5fc158a04b1d06ac6269fc336d1e6d0bac45e82b7d47ca4c271c7fed3bd1c6599b4bd0c6"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe69e7568b9e70ee7e71ebad9548fc8afad5ff4435df5d55624b39df9e8826c91"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np350",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x498a0d50858ecbfd2fe317843b04c02a00dfa8c2ee6a0e3641947439f0eb7dba",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3a29d14904f05f088f4aede9ab588a53f6a54db4f43cd77f0227445a0d7c8386",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x15e",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xdac",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xac94cbd2aa423a9fc3dd35e9918a288b31a6b6127f829ef08b3d106212d5c005",
+ "transactions": [
+ "0xf8688201190882520894dfe052578c96df94fa617102199e66110181ed2c01808718e5bb3abd109fa0020ee6a1ada31c18eac485e0281a56fc6d8c4152213d0629e6d8dd325adb60b1a00f72e01c463b98817219db62e689416c510866450efc878a6035e9346a70795f"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc3f1682f65ee45ce7019ee7059d65f8f1b0c0a8f68f94383410f7e6f46f26577"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np351",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xac94cbd2aa423a9fc3dd35e9918a288b31a6b6127f829ef08b3d106212d5c005",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x693ec0330efa3e07b25a9a758d30a43389876e03846885dda5cdb009ff0e2674",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x15f",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xdb6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x5c72e42631163c4ff7bb5a0e0051317b4b432609769052e2efe6043155ead48c",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x36",
+ "validatorIndex": "0x5",
+ "address": "0x6b2884fef44bd4288621a2cda9f88ca07b480861",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x93ee1e4480ed7935097467737e54c595a2a6424cf8eaed5eacc2bf23ce368192"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np352",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x5c72e42631163c4ff7bb5a0e0051317b4b432609769052e2efe6043155ead48c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xc25a9e84540d654be4abb3e8581cd2cc7cf97e54895e7a62d08eb78431d3f244",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x160",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xdc0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xf3760efebd2ee1fbbda6bfff5aded8bb4ac38928857a4b22edab12bda293a2d7",
+ "transactions": [
+ "0xf88382011a08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a00df7ffb1778e645f4fc3b0e2236b34c038c43aacbbc43abc8d710c3fc33901e5a00d7d3d9cbc790b2e206b30639a4b55c1d2f3c2ea18c058a5085f16d72b50455b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xb07f8855348b496166d3906437b8b76fdf7918f2e87858d8a78b1deece6e2558"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np353",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xf3760efebd2ee1fbbda6bfff5aded8bb4ac38928857a4b22edab12bda293a2d7",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x911acb703f25c08267716b25fc43b19bf4ce43a053393e6f1dce78c1cba8c485",
+ "receiptsRoot": "0x758b6a000deb6b7275c48ea96b2cbf580372445f0bc5b285eb764ed1800e8747",
+ "logsBloom": "0x00000000000005001000000000000000000000000000908000000200420000000000020000000000000000004000800010000000000000000200000000000000004000000002000000000000000080000000000000000000040000000000000000000000100400000000400000000000000000000000010000000400000000000000010000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000100000000000000000000000000000040000000000000000000000000000200000000000000000000000020000820000800000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x161",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xdca",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x9584dd2f0e20e3b4c274103aa168c495888b69ef8de7fe40cf413b6964c8393d",
+ "transactions": [
+ "0xf87a82011b0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0c6d3e03aa8b0625a3225e077addb3cf47c9d061148da25021b22a0746083cc11a06176a93c704e6c5088e9d18cbaca7eab1de348207c2ba50083934c4e215a079d"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xec60e51de32061c531b80d2c515bfa8f81600b9b50fc02beaf4dc01dd6e0c9ca"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np354",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x9584dd2f0e20e3b4c274103aa168c495888b69ef8de7fe40cf413b6964c8393d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xaca595525f5aa4f17314e44a3fdc0dae0f4037a1ee0a12bfb1bec7b9219f8d6c",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x162",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xdd4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x55a29172dc5a0a9d27b1778bec1c1591c0c8ec114d322fe60f5a39258e1783a0",
+ "transactions": [
+ "0xf86582011c088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0ad6f8d4d86d80157b67311edc959413ac3f525a5ec6334cc826125dfb1908b05a02e91a1d46e2df7c7eb4dc92224252298c66dbbf321fbb6c827a6e2d348277298"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x2fc9f34b3ed6b3cabd7b2b65b4a21381ad4419670eed745007f9efa8dd365ef1"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np355",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x55a29172dc5a0a9d27b1778bec1c1591c0c8ec114d322fe60f5a39258e1783a0",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa307681299c7c385c512cbf83195ee62d35d29487665eb57cf2698c1b3e82066",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x163",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xdde",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xb99cdd27bfb2535b0247fef5fe8097fc4e60f2a1c54a9adb3243192dafe1e657",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e82011d01088252089433fc6e8ad066231eb5527d1a39214c1eb390985d0180c001a0167190e2e0fed95ab5c7265a53f25a92d659e1d46eb9ecbac193e7151b82ec1ca0269353e9c5ef331135563e2983279669220687652e7f231725303ccf7d2a8ebd"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf4af3b701f9b088d23f93bb6d5868370ed1cdcb19532ddd164ed3f411f3e5a95"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np356",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb99cdd27bfb2535b0247fef5fe8097fc4e60f2a1c54a9adb3243192dafe1e657",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xb36926502e2ee904451fa5970a453aebe89f5bc25cd8c1dcae196810968617c1",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x164",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xde8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xbdd33f47e688a8c88c0bb8514d3eff12f6f1ca570d3ae31aab000689d8dd4af3",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x37",
+ "validatorIndex": "0x5",
+ "address": "0xf6152f2ad8a93dc0f8f825f2a8d162d6da46e81f",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x8272e509366a028b8d6bbae2a411eb3818b5be7dac69104a4e72317e55a9e697"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np357",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xbdd33f47e688a8c88c0bb8514d3eff12f6f1ca570d3ae31aab000689d8dd4af3",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x67558b87a732daed74e1b9ed7aef6326aabe984df466494d2fc59d9ea951c6c6",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x165",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xdf2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x60fbbf44b7687b97e348c42a24637f027125b00a39e5e63995405da84de95ce0",
+ "transactions": [
+ "0xf88382011e08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0b20886ab8d36222d79bf9dad933333062a51e71dbd6de720f872874edb727276a05f68ff1bcbb8019f43e4e37a481075cc5565512eb56d34ccb707e8aec00a4204"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xa194d76f417dafe27d02a6044a913c0b494fe893840b5b745386ae6078a44e9c"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np358",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x60fbbf44b7687b97e348c42a24637f027125b00a39e5e63995405da84de95ce0",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x15bdc9a6fcc0d4d133bc86adbda378e2110d51fc60304207240f24f60d4fc99d",
+ "receiptsRoot": "0xf9f06ad2e1bbf826b5cbeabfd01d508c4d7bc0781b946c5afc105a2e20d9155a",
+ "logsBloom": "0x0020000200000000000004000000000000000000010000001000000000000400000000000000008000000000000400000000a820000000000000000004000001001000000800000000000000000000000000000000000000100020000002000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000040000000000000000000002000000000000000000000000008000000000000000000000000000000000000000000004000000000000000000000000000000000140000000000000800000000000010000000000000000000000004000000000010000000000004401000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x166",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xdfc",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xb32a72eff6c1fed26a63381d9de7254e9a85e9c459fad22c037e8a11eb95d04f",
+ "transactions": [
+ "0xf87a82011f0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0c35e2924126964cdf4a8847f4cb4a870f24a4654de527a3dc9fad248d338aab6a00d9292c8e92050bebef84a83b3deacddf95a33015a3d284b578cb0f1621c5a70"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xa255e59e9a27c16430219b18984594fc1edaf88fe47dd427911020fbc0d92507"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np359",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb32a72eff6c1fed26a63381d9de7254e9a85e9c459fad22c037e8a11eb95d04f",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x21d7cc2931eed33ddb03977b7d99c97ac378c41ed2ac25331478cd1fbd583e7a",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x167",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xe06",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x31483924290768786929b9836507966e24a775f86f3724200851b2eaa262ac36",
+ "transactions": [
+ "0xf865820120088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0aab9710502eb45f06f5470674b88b22c30fdc865a22c86a7095f355629fb6d11a01d905abe10e39ed037ad29a46a81d0af6d52d9de2d7bef20e7b02db8c1cf13a0"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x7996946b8891ebd0623c7887dd09f50a939f6f29dea4ca3c3630f50ec3c575cb"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np360",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x31483924290768786929b9836507966e24a775f86f3724200851b2eaa262ac36",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x128ac2d4c23be8773c460ed383defee0e767a4fe0a55e9f600a60e0fe051735b",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x168",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xe10",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xdfabceebb90036f92ea3e859b9fcadd8642f00dcdf45278c09d93fb56d320b04",
+ "transactions": [
+ "0xf8688201210882520894662fb906c0fb671022f9914d6bba12250ea6adfb01808718e5bb3abd10a0a0d3a858be3712102b61ec73c8317d1e557043f308869f4a04e3a4578e2d9aa7e7a0202a5f044cc84da719ec69b7985345b2ef82cf6b0357976e99e46b38c77fe613"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xb04cbab069405f18839e6c6cf85cc19beeb9ee98c159510fcb67cb84652b7db9"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np361",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xdfabceebb90036f92ea3e859b9fcadd8642f00dcdf45278c09d93fb56d320b04",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa8f8fd676089911db9824cafe64222a854d4767d0cc5fded3fa1643f735afd80",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x169",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xe1a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xa7dab2cd20b59a5961ff34f49d421a579c939d6898b084ae4db8971604df1380",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x38",
+ "validatorIndex": "0x5",
+ "address": "0x8fa24283a8c1cc8a0f76ac69362139a173592567",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x6f241a5e530d1e261ef0f5800d7ff252c33ce148865926e6231d4718f0b9eded"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np362",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa7dab2cd20b59a5961ff34f49d421a579c939d6898b084ae4db8971604df1380",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xb19cdea25a29e5ba5bf0a69180560c2bcf35823b81d82d8b97499ad1cc22873b",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x16a",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xe24",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x0f9c87bb2b9d07ca411420399c22658ea7be36c5bd1fbbf1c759592959cc3a94",
+ "transactions": [
+ "0xf88382012208830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa034e8481ee12e75836d1e4cc88aef813a6bc8247b73aeb7a466a1ce95bca6e5fea07585402e69f5856a5724a9e83a9bf9cf77bc92cc619489f9903f09b8c3530f24"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xfcfa9f1759f8db6a7e452af747a972cf3b1b493a216dbd32db21f7c2ce279cce"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np363",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x0f9c87bb2b9d07ca411420399c22658ea7be36c5bd1fbbf1c759592959cc3a94",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x09f1a8d40ad941a3c47fd34c32682a0058f79387d467a7ebb5d957455aab9fb6",
+ "receiptsRoot": "0xde87ab5715c2af5f977bcf679cd4e771796d49365c3111487aba12fdb69483a2",
+ "logsBloom": "0x00800000000000000000000040000000000000000000000000000000000000000000000000080000000000000000000000000000008000000000000000000000000000002000000000000000000000000001020000000000000000000104000004000000000000000000000000000000000000000000800001000000040000000000000002000000000000000001000000000008400000000000000100000000000000000000001000000000000000040000000000000000010200000000000000000000000000080000000000000000000020002000000020000100400000000000000000000040000000000000100000010000000000000001000040000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x16b",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xe2e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xcdbbd78682fb1c3e75c9821acce03f6fd048226147e7041d84952c6aa3c18b5e",
+ "transactions": [
+ "0xf87a8201230883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0317931eb522b3488621079d412251962cc5a02794939e3a3b0c94c92df0b4da5a001348209aa47bc1a55590243d5168b2beb06c929b46104d144ba526070b2e5ea"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xdf880227742710ac4f31c0466a6da7c56ec54caccfdb8f58e5d3f72e40e800f3"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np364",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xcdbbd78682fb1c3e75c9821acce03f6fd048226147e7041d84952c6aa3c18b5e",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x96f076c6c4d61d649b8f9c4290ff81fad55bfebe6e171f2d2bedb4b941977873",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x16c",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xe38",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xab15226c228033c1118398e475d860a1ea7534e4d620ae9ceb2893fa3a73ff7a",
+ "transactions": [
+ "0xf865820124088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0886d94140ef16f0079167a92ea5577d300a4e87982588af41676d8d9a7a7f043a0388a734d4f7a8eb510a5e7aba3141505773bd329a70ff438be40d7b378fdafa6"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xadfe28a0f8afc89c371dc7b724c78c2e3677904d03580c7141d32ba32f0ed46f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np365",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xab15226c228033c1118398e475d860a1ea7534e4d620ae9ceb2893fa3a73ff7a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x208cc1a739ecf1c8aed87a70e4f580b28d06f7dba19ef679a4b809870c0e66a4",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x16d",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xe42",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xe3c3b2311857f76f1031d8384102288970bf25ab710e5e8ca3e7fee19ea3fcde",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e820125010882520894f1fc98c0060f0d12ae263986be65770e2ae42eae0180c080a06563737b6bfddfb8bc5ec084651a8e51e3b95fe6ed4361065c988acaf764f210a00a96a1747559028cd02304adb52867678419ebef0f66012733fea03ee4eae43b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xb264d19d2daf7d5fcf8d2214eba0aacf72cabbc7a2617219e535242258d43a31"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np366",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe3c3b2311857f76f1031d8384102288970bf25ab710e5e8ca3e7fee19ea3fcde",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf4a7f460684eacde84218991911d63333e89a5a8fe5293e43b2b283209bb7297",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x16e",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xe4c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xf1f80c035c0860545aeb848923615c5bb8cbd15305ddc6a87b9d9a4d509a8d5c",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x39",
+ "validatorIndex": "0x5",
+ "address": "0x19041ad672875015bc4041c24b581eafc0869aab",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf2207420648dccc4f01992831e219c717076ff3c74fb88a96676bbcfe1e63f38"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np367",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xf1f80c035c0860545aeb848923615c5bb8cbd15305ddc6a87b9d9a4d509a8d5c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x44f6e5c8fd3452b71ade752a742ca9f61626aeeaa20e89d47fe414d1df414745",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x16f",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xe56",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xaa0d0fadd5774766ac1a78447bd5ef9f5a816c9068d28097c78d02737ce7f05a",
+ "transactions": [
+ "0xf88382012608830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a00d5ce478373461565e41764365499cc4a43519643829503796c5453e1bc7ff0ea03ef00a5fe608838a9156d394317734b358ac026af08b33c2aabfea8e9d485dfa"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x41e8fae73b31870db8546eea6e11b792e0c9daf74d2fbb6471f4f6c6aaead362"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np368",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xaa0d0fadd5774766ac1a78447bd5ef9f5a816c9068d28097c78d02737ce7f05a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x7fd199408596db163d237e6d25f64b90ac2bc04158524e8baac5d55f881bb52b",
+ "receiptsRoot": "0x8d3f058248d263db5e6d6d78ddf91fd2ec0183f2bdf3e9e142af87a53388e526",
+ "logsBloom": "0x00000000000000000000000000000100000200008000000000000000000000000000400000000000000000000000000000000000010008000000000000000000000020000600000000000020000002000010000000000000000000000000000000000000080000000020200000000000000000000000000000000001000000000000000000800000002000000800000000000000010000000000000000000000000000000000000000000000004000000000008000000000000000000000000000000000040000000000000000000000200000000000000000000000401000000009800000000010000000000000000000000000000000000000808000000800",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x170",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xe60",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x4b263e57c931fa090da8bc6890c9d6fc2ad2dd5a66bb3a5563cc477735893a96",
+ "transactions": [
+ "0xf87a8201270883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a008faafda0a060040eca56f846ecbd6a399914482c31359f1ec04c98cc476ce82a04d2b02adc2c947898fa00cbedb4532f471cb5eb92ee19a30697ddd0c713132e3"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4e7a5876c1ee2f1833267b5bd85ac35744a258cc3d7171a8a8cd5c87811078a2"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np369",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x4b263e57c931fa090da8bc6890c9d6fc2ad2dd5a66bb3a5563cc477735893a96",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x2a2360860a67f9187f50f56201c50d2309c961a2b408072e7c3d069c8c1216cd",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x171",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xe6a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x0adc9e078ab6f0799b5cbc8e46e53a0d96d4fe4ba0b6ff75088445c304000226",
+ "transactions": [
+ "0xf865820128088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0da49c9575be5d906d247a5f4f0574e76d1edb1368dbdda1b4a5b58fba3fca82da00fa1c561fc766acefeeabf085384962f2599b3ca6b02996962095eed297df611"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x8d4a424d1a0ee910ccdfc38c7e7f421780c337232d061e3528e025d74b362315"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np370",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x0adc9e078ab6f0799b5cbc8e46e53a0d96d4fe4ba0b6ff75088445c304000226",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x971bbdee0e408ff826563636c5eccce30540c1cba590880849a72ac21f74a4e4",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x172",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xe74",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x1636ca42281a5e77303d2d1095d71b2c59f0b175c98a3adb9630cd6463d2be04",
+ "transactions": [
+ "0xf8688201290882520894a92bb60b61e305ddd888015189d6591b0eab023301808718e5bb3abd109fa0626bd8978288bcf1d7719926fba91597d6aa8ead945c89044693d780523a05dda0074494ccf5362aa73db798940296b77b80a7ec6037f5ed2c946094b9df8a2347"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xfa65829d54aba84896370599f041413d50f1acdc8a178211b2960827c1f85cbf"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np371",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x1636ca42281a5e77303d2d1095d71b2c59f0b175c98a3adb9630cd6463d2be04",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x2a239ffb7957e73c3eebeb33b01444599ddcd5861f1dfb4bbe31584061f11389",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x173",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xe7e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xbf62c63fdcd8b0648bfec616e9270243233b47c513a9519932cb82d70ed5c2be",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x3a",
+ "validatorIndex": "0x5",
+ "address": "0x2bb3295506aa5a21b58f1fd40f3b0f16d6d06bbc",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xda5dfc12da14eafad2ac2a1456c241c4683c6e7e40a7c3569bc618cfc9d6dca3"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np372",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xbf62c63fdcd8b0648bfec616e9270243233b47c513a9519932cb82d70ed5c2be",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xadbba859a71886f49ccd216fbc6c51a42a7a6eff927970b298d4e0f6e2a9597d",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x174",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xe88",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x349a0919fb81864d824dd7345c583a9fb5c99ef0bd9c549be68b10e72e7c8c2a",
+ "transactions": [
+ "0xf88382012a08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa085c885407da43158c33afe4c9d10a846d4cf5bb820c70f019ff8b6ee9dfb027ba077c0e90a4a029bea55eadf3b0d39261b6204a5c1b8e5e80838ebeef5c9fd456c"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x16243e7995312ffa3983c5858c6560b2abc637c481746003b6c2b58c62e9a547"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np373",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x349a0919fb81864d824dd7345c583a9fb5c99ef0bd9c549be68b10e72e7c8c2a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe5a5661f0d0f149de13c6a68eadbb59e31cb30cf6e18629346fe80789b1f3fbc",
+ "receiptsRoot": "0x97965a7b5cca18575c284022cd83e7efb8af6fcf19595c26001b159771ffb0ce",
+ "logsBloom": "0x80000000000000000000000100000000000000000000000000000010000008100180000000000000200040000000000002000000000000000000000040000000000000000000000000000000000100000000000000000000000000400000020020000000000000000000000000000000000008000000000000000000000000000000000000002000000000000000000000000000000000048200000000000000000000000000000000000000000000000000000000000000000000000100000800000000000000000000000000000000000000000000000000000000440000000000000000121400000000000000000000040001000020000000000040000200",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x175",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xe92",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x90c6119a5ecf366ff337473422f9872fddac4e2b193a2e0a065cf7de60644992",
+ "transactions": [
+ "0xf87a82012b0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa03e8b18cd5d8c796e69f450a4c00e75d7e2d38cf9d25dd19e2033fbd56fbf4b84a0175ca19057500b32a52b668251a0aec6c8f3e1e92dec9c6741a13ffe3fb214cc"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xb75f0189b31abbbd88cd32c47ed311c93ec429f1253ee715a1b00d1ca6a1e094"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np374",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x90c6119a5ecf366ff337473422f9872fddac4e2b193a2e0a065cf7de60644992",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x0a82334be200ef303c1c3b95b92b6f397df138b7e6eb23d830fb306996f1c79b",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x176",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xe9c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xb023fb820fb7f3cc5b8c8ffec71401eae32858e7f5e69ffbdbdd71751bf1c23d",
+ "transactions": [
+ "0xf86582012c088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0519fcc6ae02e4901d4ccfcd2b0560f06bf13478b459310ddaae39f44b7ed1394a03b529b53be6c0451a4b644f5031746cb1db62cfbe43b962da26aff507d4293ef"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xd087eb94d6347da9322e3904add7ff7dd0fd72b924b917a8e10dae208251b49d"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np375",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb023fb820fb7f3cc5b8c8ffec71401eae32858e7f5e69ffbdbdd71751bf1c23d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x8e7778cdef2ec78802c7431cdd44768e4a4f6d9c6cc494ae02dc20c10bc6eead",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x177",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xea6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xafe3e6ffafc8cd84d8aa5f81d7b622b3e18df979dbffb44601eb239bc22132bf",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e82012d010882520894469542b3ece7ae501372a11c673d7627294a85ca0180c080a09add65921c40226ee4a686b9fa70c7582eba8c033ccc9c27775c6bc33c9232fba021a6e73ccb2f16e540594b4acbba2c852a3e853742359fcbc772880879fe1197"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xbc17244b8519292d8fbb455f6253e57ecc16b5803bd58f62b0d94da7f8b2a1d6"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np376",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xafe3e6ffafc8cd84d8aa5f81d7b622b3e18df979dbffb44601eb239bc22132bf",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x0b7ff239a80d7ca996fe534cf3d36898e55e3b4dbd6c130cc433dfb10d83c2dd",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x178",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xeb0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x2b7573e48bca65c866e82401d2160b5bcaec5f8cd92fba6354d2fa8c50128e2c",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x3b",
+ "validatorIndex": "0x5",
+ "address": "0x23c86a8aded0ad81f8111bb07e6ec0ffb00ce5bf",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x3ff8b39a3c6de6646124497b27e8d4e657d103c72f2001bdd4c554208a0566e3"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np377",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x2b7573e48bca65c866e82401d2160b5bcaec5f8cd92fba6354d2fa8c50128e2c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x5cac010e2605b327b97a4ef6f78d4c65554588283336081d8ef497a3860fdbde",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x179",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xeba",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x77b6c58098c59ec84605e8f12c7fbe8a358d52adf77948577ce7396ae18aaac3",
+ "transactions": [
+ "0xf88382012e08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a015118995d271e570428c3c349d49390af0fd81d3217f90159fc25b9d0791d6efa018c1a844d5d3523ce37308f0cd2e46e8d6ef99a9eb750e7325ca2c67d59aaf85"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4d0f765d2b6a01f0c787bbb13b1360c1624704883e2fd420ea36037fa7e3a563"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np378",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x77b6c58098c59ec84605e8f12c7fbe8a358d52adf77948577ce7396ae18aaac3",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe908771dea594628e0f4d2b5d3354bbc6f9cfa04a97249657a74b792c3254b77",
+ "receiptsRoot": "0x8dc461a171023c5f8e3f5d78e0842291fbe7b0a502495a334a1bc98337a8a1b4",
+ "logsBloom": "0x00000004000000000000000000002000000000000000000000000100080000000000000020000000000020000000000000200100000000000000000010000000000000000000000008001000000000000000040200000000000000000000020000000000080000000000000000000000000000000000000100000000000000000000000000010000000000000000200000000400000000010000120000000010000008000000000000000000100000000000000000080000000200000000000000000800000000000400010000000000000000000000000000000000000000000004000000000000004000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x17a",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xec4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x891853e3e9dd73b513556fa241d000aa63fecc5452cf39b3cc756619e9cea7b4",
+ "transactions": [
+ "0xf87a82012f0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0d0666f18210bb986b7239269bfbd56336376ed77bb97b56e15df7647c1f06fe3a0718dc6abdefe863e76f0c3c356364d456d34d399b20ed93b61ed93a77bccbe80"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf6f1dc891258163196785ce9516a14056cbe823b17eb9b90eeee7a299c1ce0e0"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np379",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x891853e3e9dd73b513556fa241d000aa63fecc5452cf39b3cc756619e9cea7b4",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x197f321622808ee71925004345aaf99ac87a833c97ee852265b6d8be5c0656fe",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x17b",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xece",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x8d3b2038418a6d5e44a3f5aef149d7d76a20f3ebd5aa3c9d4565ddaa94d00c07",
+ "transactions": [
+ "0xf865820130088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa02f7e9b19c96e60b8bd18eaadf71b049e0f204d42e826667e5b741041663c1963a01ff9a63ae688fc0c05047b819d1b8326c55f60b62f84658814bf35c63b3e5c65"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x1dbf19b70c0298507d20fb338cc167d9b07b8747351785047e1a736b42d999d1"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np380",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x8d3b2038418a6d5e44a3f5aef149d7d76a20f3ebd5aa3c9d4565ddaa94d00c07",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x19c0d6f1bcdcb2c419bb69ed7f176bd58c4833c057faede354566c4e6d6e9f20",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x17c",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xed8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xa63604362866798edab2056c5ddadc63dc1490c6f13bf5dd54008e1e0f64ecd1",
+ "transactions": [
+ "0xf86882013108825208947f2dce06acdeea2633ff324e5cb502ee2a42d97901808718e5bb3abd109fa0fd195ea41804b21ffffdbca38fd49a9874371e51e81642917d001d201a943e24a0542bca46a2dc92fddb9abffcf2b3e78dc491d6e95040692e6d1446a6b487a42a"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc3b71007b20abbe908fdb7ea11e3a3f0abff3b7c1ced865f82b07f100167de57"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np381",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa63604362866798edab2056c5ddadc63dc1490c6f13bf5dd54008e1e0f64ecd1",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6c634927494436f7c4daaee4ea5c99813ec3066af379315b031f40fdf12c74d8",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x17d",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xee2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x2187bb0b54e92e3bc6f0da1665631a818ac120ad68aa9674277d542f1e542f44",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x3c",
+ "validatorIndex": "0x5",
+ "address": "0x96a1cabb97e1434a6e23e684dd4572e044c243ea",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x3f45edc424499d0d4bbc0fd5837d1790cb41c08f0269273fdf66d682429c25cc"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np382",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x2187bb0b54e92e3bc6f0da1665631a818ac120ad68aa9674277d542f1e542f44",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x04f641173e82bbe7455a3acd37242315859a80d9b4a19a56997645e31a1d1097",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x17e",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xeec",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xdd46cd98c3f0f31bf7b060263fa47e9b0aa1c4e4c7206af16ad3a01dac3bff5f",
+ "transactions": [
+ "0xf88382013208830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a08bc9a47ee84ed9389b94c57e8c7014515fefd3e891eff0e1deac8cb1266cfb05a06612fac81c3e0a0b905873bb3f9137f9f8ae952344a174e4d425564b31851350"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xcb8f5db9446c485eaae7edbc03e3afed72892fa7f11ad8eb7fa9dffbe3c220eb"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np383",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xdd46cd98c3f0f31bf7b060263fa47e9b0aa1c4e4c7206af16ad3a01dac3bff5f",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x2cc62d5cb6ca1b74dd31ced44a51655d15f0c67d9e8b4560584124ea91649145",
+ "receiptsRoot": "0x7288150e98b9056465e864af6976d5ec6de80da74cee77596b9a67de235177ac",
+ "logsBloom": "0x000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000040000000000008200000000000000000000000000000000000000000000000041000000000000000000000010000000800c0000000000000000400001000000000000001610000000080000200080000000000008000000001000000800000000000200000000008000000000000000000000000040000000002000000000080000000000000000000000000000000000000000000000000000000000000000000000000008000000000200000000040000800080",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x17f",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xef6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x808dd663054b022868554929395cf380b27661a0ae7333a92d69160769afbbbe",
+ "transactions": [
+ "0xf87a8201330883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0f1dbbd841499d2a51db61a05cf4a7a5650fd83eafe8516d0ad49e99db40c0d13a0542104414214add483f5e7397e9b98e95d336d60ff2b661eabfc8125548df848"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x3d151527b5ba165352a450bee69f0afc78cf2ea9645bb5d8f36fb04435f0b67c"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np384",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x808dd663054b022868554929395cf380b27661a0ae7333a92d69160769afbbbe",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf88d2d5d961b54872a1475e17a9107724ba2cd0ca28cb7320aad2f903dc74deb",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x180",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xf00",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x86bca890ff8f5be8c986745f38ef4a87ce167fcaacc0de928f4c8db469bba94a",
+ "transactions": [
+ "0xf865820134088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0922834adc69ced79913745b4a53a63ff0b0d73552c658f63c35b74fe831f1990a072af738962b2108e1e3e534c88145aa55764f2908bdbce0a4433ef88e3fbfb0c"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xdd96b35b4ffabce80d377420a0b00b7fbf0eff6a910210155d22d9bd981be5d3"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np385",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x86bca890ff8f5be8c986745f38ef4a87ce167fcaacc0de928f4c8db469bba94a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x248cbc35df3f48575474369a9105962a22bff30f3e973711545bb9cae1e06dff",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x181",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xf0a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x83132e862eb410579a38d85bbec7fdd5b890647bc9ccc2ad881361a9389cd3fa",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e8201350108825208943bcc2d6d48ffeade5ac5af3ee7acd7875082e50a0180c080a03931e5e7d02ed045834da39a409083c260fbc96dc256c1d927f1704147eeaeb6a0215269010bb3e7dd8f03d71db3e617985b447c2e0dd6fc0939c125db43039d0f"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xace0c30b543d3f92f37eaac45d6f8730fb15fcaaaad4097ea42218abe57cb9f4"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np386",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x83132e862eb410579a38d85bbec7fdd5b890647bc9ccc2ad881361a9389cd3fa",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x899d1787e12b4ee7d5e497ac1b07d460146316edd86d589dd357e4e39e6e50a5",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x182",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xf14",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xb2b948b9139c380319a045813000f17a02153426ae3db02065a7bc6fb1b3d41e",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x3d",
+ "validatorIndex": "0x5",
+ "address": "0xfd5e6e8c850fafa2ba2293c851479308c0f0c9e7",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf6342dd31867c9bef6ffa06b6cf192db23d0891ed8fe610eb8d1aaa79726da01"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np387",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb2b948b9139c380319a045813000f17a02153426ae3db02065a7bc6fb1b3d41e",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6fd59459f6805b1c3f35cd672f058d3f4215b8ba06217056195a249529106097",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x183",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xf1e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xec59612429465042cb5bfe00c2720e2b06608cc0befdf12185f61213dede36a3",
+ "transactions": [
+ "0xf88382013608830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa02f68ef0be353bceb12bd978567947ea2ade48f275f8488d4d9089a6a5df54ecaa01ea605cad7ded16c6744be5446342cef46c0f802938d30db72ee4e35eb0ee726"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xa6589e823979c2c2ac55e034d547b0c63aa02109133575d9f159e8a7677f03cb"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np388",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xec59612429465042cb5bfe00c2720e2b06608cc0befdf12185f61213dede36a3",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x87aa8da72c4f54683d4ddfe7592b17518075332583bf40a0af34b072e1b8d5ca",
+ "receiptsRoot": "0x6b2a7f9df51def8b942a27f69021bd8954a4d01182bc78fe20171ec738d6a1cd",
+ "logsBloom": "0x00010000004000000000000000000000000000040000000020000000000000000000000100208000000000000004000000000000000000000000000000000000000000000000000020000000000002000000000000000000020000000000000048000000000000000000004810000000201000000000000000000000000000000000000000000008000000000000010000000000000000000000000080004000000000000000040000000000020000000000000010000000000000000000040000000080001000000400000000000000000000000000000000000000000000000000000000000000000000080000000000000020000200004000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x184",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xf28",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x18a50573c6144ce2d2c185b146827fbde1568f647d6bcc2c2556df64a00d3462",
+ "transactions": [
+ "0xf87a8201370883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a036602b451fdd27281014a28c261ac59feabe8c6730619162c51ccd6452e0efcfa01dbbc3cb987dd50dbb59072a156ce01b7825d252e5855249afbda11fd763436e"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x9ce48bc641cc1d54ffdb409aab7da1304d5ee08042596b3542ca9737bb2b79a8"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np389",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x18a50573c6144ce2d2c185b146827fbde1568f647d6bcc2c2556df64a00d3462",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x4970ca728c597509e3afb689227e843d5da3be74aea9719a756d65db2694b152",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x185",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xf32",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x3ad7ba10baedb1b98556cd20670c57f2f3a4aa0ddfbf76c9a2cbbcec188dada5",
+ "transactions": [
+ "0xf865820138088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a09a9bf09cafb07d6a97b972a3b405a1dd30dcd6945d9adda6cf921c211bc046e1a03c97b3b08d67e3ccfcb8408e39d2e0971761c1905fbd7028fb52a1f163fb92f3"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xa44be801bd978629775c00d70df6d70b76d0ba918595e81415a27d1e3d6fdee9"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np390",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x3ad7ba10baedb1b98556cd20670c57f2f3a4aa0ddfbf76c9a2cbbcec188dada5",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xc5da7efe2ca6d0468002914ea2c334be08121fb5450b4a1b74baf08e65115192",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x186",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xf3c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xa2deafade520007dd7d127c439290f2bac7a2027b80ff616ccf8ce62eeba6506",
+ "transactions": [
+ "0xf8688201390882520894f83af0ceb5f72a5725ffb7e5a6963647be7d884701808718e5bb3abd109fa0a38cf9766454bd02d4f06f5bd214f5fe9e53b7a299eda5c7523060704fcdb751a067c33351f6f7bbd9de5b5435f6cadc10ba5e94f3cbcc40ee53496c782f99d71f"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xce17f1e7af9f7ea8a99b2780d87b15d8b80a68fb29ea52f962b00fecfc6634e0"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np391",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa2deafade520007dd7d127c439290f2bac7a2027b80ff616ccf8ce62eeba6506",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x7f1f4d793182771fbacb9ef07a0736edbe4aa2417bf775c7b499b35ad791575a",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x187",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xf46",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xfce102ce6fa4701cfa7ca7c4aae937b79190e29b55a453e67f31adece99c4f92",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x3e",
+ "validatorIndex": "0x5",
+ "address": "0xf997ed224012b1323eb2a6a0c0044a956c6b8070",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4bd91febab8df3770c957560e6185e8af59d2a42078756c525cd7769eb943894"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np392",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xfce102ce6fa4701cfa7ca7c4aae937b79190e29b55a453e67f31adece99c4f92",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x58f87e8c7ffa26035df5258225c492a17f353b2d33420e0ac5b5413f0c29be1a",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x188",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xf50",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x5aff5c82ef6756d97e6caaf6bc6084f4091ed2503b88083a0c4b0484f6e9525d",
+ "transactions": [
+ "0xf88382013a08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0e60cd99574bb50b626cf0b20d73ece21858aba52609136e6e2dc420a9fdc00eea00aeff0a4419c24268d9784a1ae211927004d8dbbbda3c47c0d0e2d32178ce8f4"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x414c2a52de31de93a3c69531247b016ac578435243073acc516d4ea673c8dd80"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np393",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x5aff5c82ef6756d97e6caaf6bc6084f4091ed2503b88083a0c4b0484f6e9525d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x14a7327b3cff203afe17f16aca0470fbe12cfac971c79ef9bd5b3ef71bce5591",
+ "receiptsRoot": "0x3b0559fd9e27f69f8a378d27e3b5a82f18881f307f49ec63f89ad4bae18a1ee6",
+ "logsBloom": "0x00001000800000000000400040000000000010002000000000004000000000000000000000000000000000000000000000000000000000040000000020000000000000000000000000000000000001800000000200000000000000000000000021000000000000000000000000000000000000000000000000002000000000020000000008000002000000000000000000000000000000000000000000080100000000000000000000000000000020000000000040000000000000000000000000000000000000000020000000000000000001000000000000000200000000000000000000004000000000000000000004000080000000020000001000a00008",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x189",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xf5a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xb22e30af8a7f23e2b73275e505b5c6f482357576c82e3d718b0c4c33914d97e6",
+ "transactions": [
+ "0xf87a82013b0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa061705b5163977bf95976fb0d2f44c1c581d19de8f68084001ed516813a7f5785a07daeb176a18749f11e1cec56a72e988c8362c2e15b86a9c5ae3e2cb2ddde0ce2"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x647fb60bdf2683bd46b63d6884745782364a5522282ed1dc67d9e17c4aaab17d"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np394",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb22e30af8a7f23e2b73275e505b5c6f482357576c82e3d718b0c4c33914d97e6",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x02eb8f611a78bed4123c7b1ec6ca3148dee547538828183756744882a58b6993",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x18a",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xf64",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x9a348ddcb5d7c63d344358308acfd52c1be4432de1bdd02a4c1483521b95d7e0",
+ "transactions": [
+ "0xf86582013c088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0463d74275ffee97deea0603bdab389823c88c03997f176d4c349514d78d4dbc4a06b9796eed221b40094ded3ec3fa9bdbf097561ac3f8a142fef5e2c894a8296de"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xfa681ffd0b0dd6f6775e99a681241b86a3a24446bc8a69cdae915701243e3855"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np395",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x9a348ddcb5d7c63d344358308acfd52c1be4432de1bdd02a4c1483521b95d7e0",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe5d836ff1dc0a199a799bdb1aa945580acf9e06c96bd6b88cbc60903e5904b9c",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x18b",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xf6e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x584b00c97139674af12f17a4a4828e59951c7f7d0c4fae83d5711ce5e582fdca",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e82013d010882520894469dacecdef1d68cb354c4a5c015df7cb6d655bf0180c001a06faf4090490862eba3c27dfe0a030a442ccc89d4478eca3ed09039386554f07ba0656f741b64c54808ac5a6956540d3f7aaec811bf4efa7239a0ca0c7fb410b4d6"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x106ca692777b30cb2aa23ca59f5591514b28196ee8e9b06aa2b4deaea30d9ef6"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np396",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x584b00c97139674af12f17a4a4828e59951c7f7d0c4fae83d5711ce5e582fdca",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x8fc7b0893f25c43c0dd53f57c7f98653e86d2570923f1831840c09c7c728efab",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x18c",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xf78",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x8e2b4e77e4fd7ab14ffaca65bc3a0868f14ce792ffe5f26cc0cc4abf8ebc5cd4",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x3f",
+ "validatorIndex": "0x5",
+ "address": "0x6d09a879576c0d941bea7833fb2285051b10d511",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x494ac6d09377eb6a07ff759df61c2508e65e5671373d756c82e648bd9086d91a"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np397",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x8e2b4e77e4fd7ab14ffaca65bc3a0868f14ce792ffe5f26cc0cc4abf8ebc5cd4",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xb87cec8c84db91856e9ae32af116b449b8cb1d61cae190a182aebfb85d691e8f",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x18d",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xf82",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x657f16f62e12433129b4b3f80e92eee4a65d1cb6e8b847ce632d32cb79ba5abe",
+ "transactions": [
+ "0xf88382013e08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0065cd2e05815fd9bf6e9aced9947d0c43feed03d4bd010ce93828c5e45a9b483a019449b8fc18e639f9c1d7b0adbd3941622d1f2e8127b82993e0f8bb9cdc2999f"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x0ae4ccd2bffa603714cc453bfd92f769dce6c9731c03ac3e2083f35388e6c795"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np398",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x657f16f62e12433129b4b3f80e92eee4a65d1cb6e8b847ce632d32cb79ba5abe",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe154fbe6ca3c192310dea977b202b7e57523be45dfb36cf46816f7b1b86c910b",
+ "receiptsRoot": "0x09e88b070a05aab53918792ba761837b32e299692e1ee33a27d3b654a45ea25f",
+ "logsBloom": "0x00000001000000000400000000001000000008120000000220000000000400000000008000000000000000002000000000000000000000000000000000000000020000008000000000000000000004000000000000000000000000000000000080000000000000000000000000010000000000000200000000000000004004000000000010000000000001000008000000000000000000000000000000000008000000100000000000000000000000000010000000000000000000000000001000000000000000000000000000000010200000000004000010040000100000000000000000000000000000000000000000000000000000000000020000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x18e",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xf8c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x677cd475087726e83d09edba4d2e6cdcaa5f1b9f5e7c26260ff6ebf4dd86a6aa",
+ "transactions": [
+ "0xf87a82013f0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a017bd3457b4b843b788bd719c6e49a5efad177ca349fa23ee93130c68a6c123a6a0595becbedbd04d964a7e8ca826f50061e1b1f16bea32c966670f7dbcc63dbbff"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xd860c999490d9836cc00326207393c78445b7fb90b12aa1d3607e3662b3d32cd"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np399",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x677cd475087726e83d09edba4d2e6cdcaa5f1b9f5e7c26260ff6ebf4dd86a6aa",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x771db9f41d228f8d3e1a33889cc04468bb9691860cbdbf28203d90713eed1fb1",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x18f",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xf96",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xf60f85724891ffc25eb8c5c596e55846df4032b2edb35d0fc6ac64870db6b42f",
+ "transactions": [
+ "0xf865820140088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0db06597d4b08ca3fef9b08c69896cef6505785b448bfd0e051ebc7616a2f5a1aa07ca5051c69a0dcb5fae23ba89cb806d860072426d2e450eda056e9e9d8ee360c"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x9587384f876dfec24da857c0bcdb3ded17f3328f28a4d59aa35ca7c25c8102cf"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np400",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xf60f85724891ffc25eb8c5c596e55846df4032b2edb35d0fc6ac64870db6b42f",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd210aa806d0d5c95200a88fcc329357fb03782cc236bdc5f184c80246391162f",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x190",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xfa0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xe7a757335322c1008ee83083154c9a787ea3d93efce41c1b32882c8a6ea3a14f",
+ "transactions": [
+ "0xf8688201410882520894f14d90dc2815f1fc7536fc66ca8f73562feeedd101808718e5bb3abd109fa04a18131d30b0344910cae7c41ee5c1c23171c40292d34e9a82c9c7cef3d3836aa0598a3835ad1903c3d7ad158c57ff0db10e12d8acbef318ddd0514f671a08ce94"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4df8093d29bc0ec4e2a82be427771e77a206566194734a73c23477e1a9e451f8"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np401",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe7a757335322c1008ee83083154c9a787ea3d93efce41c1b32882c8a6ea3a14f",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf77d84bb9077b7805492805f09aaeac8fdd72dadaba54464256d1b9633d7313d",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x191",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xfaa",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x32976c704b12fd1ec0e6a409b89c8d3d5d0802f676bfd1848ae07cbb612f0289",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x40",
+ "validatorIndex": "0x5",
+ "address": "0x13dd437fc2ed1cd5d943ac1dd163524c815d305c",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc56640f78acbd1da07701c365369766f09a19800ba70276f1f1d3cd1cf6e0686"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np402",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x32976c704b12fd1ec0e6a409b89c8d3d5d0802f676bfd1848ae07cbb612f0289",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x8c45d111367d1e2766e18c8ef100cb4cbdd1db4171d269d0dee91b7789bf302e",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x192",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xfb4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x4cbab31c513775bdd5b7f91a153fff77cf1602430cedcebec80bedf0b6533658",
+ "transactions": [
+ "0xf88382014208830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a0bab2abc49f4f65119331667d5bd95daefb8eec437cb7950b46f1b9a890efd4b7a065396085f5f690d669006b05bab15614816e44cf88bf49fcdf0a5857f364e6a1"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x7173d4210aa525eece6b4b19b16bab23686ff9ac71bb9d16008bb114365e79f2"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np403",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x4cbab31c513775bdd5b7f91a153fff77cf1602430cedcebec80bedf0b6533658",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xade6dd841f231dcce74ab564f55972731c7eb4a0b5c3ec1a64bb979f754b786c",
+ "receiptsRoot": "0x424252c901f76c684b72e2637c97666a35b4020fe9fd8add1bd00fc83cf57512",
+ "logsBloom": "0x08000000000000000010000000000010002000000000000000000000040000200000000000000000001000000000020000000000000000000000000000000400010000000000000000000000000000000000000000000000000000000000000020400000000008100000040000000000000014000000028000000000000001000008000000000000000000000000000100000000001000000000000000000000000000020000000000000000000000000000000000000000000000000000800000000000080000000000000000000000000000000000000080000000000000001000000200800002000000000000000040000000000000000000000400000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x193",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xfbe",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x64bfcedbb6b431f370027c5e2414fa70536e4cadaedca69d960d815570b1a514",
+ "transactions": [
+ "0xf87a8201430883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0097f470d08b374cc1ea0e0ecfb841f22e6f105c4989a6a41f23619320011f4dba06c843174399416f4a98ee5b5170a4330fbc487cc1bdc4e67f8eb3ca279fa8415"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x89698b41d7ac70e767976a9f72ae6a46701456bc5ad8d146c248548409c90015"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np404",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x64bfcedbb6b431f370027c5e2414fa70536e4cadaedca69d960d815570b1a514",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x96e966680b69cd6f8f3c95b0bfcaa337959db055f2b4329813dd02f9e5350742",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x194",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xfc8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x4a13ab52191afd567f4587bee39174c54ca458576730a03854abfad2aca2e0da",
+ "transactions": [
+ "0xf865820144088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a09fd0702bca1c10269dcf83862a9f07981858a8a1579f3ed68642fdc8b77478cda027b1f49755229583c844b747c040251c2671dcfe83fa26df37d4bbfb54635864"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x5b605ab5048d9e4a51ca181ac3fa7001ef5d415cb20335b095c54a40c621dbff"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np405",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x4a13ab52191afd567f4587bee39174c54ca458576730a03854abfad2aca2e0da",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x7fa007461e28a3bd63c35eb625b4c122197ed1d63a00b0a0959652cb745c034d",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x195",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0xfd2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x3c7adb6035b88d99e1113b076cd7ee852294e0f651e87e779f93b9625f50f173",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e820145010882520894360671abc40afd33ae0091e87e589fc320bf9e3d0180c080a09b0a44741dc7e6cb0f88199ca38f15034fab4164d9055788834e8123b7264c87a02c38a3ecda52aebc3725c65ee1cd0461a8d706ddfc9ed27d156cf50b61ef5069"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x9129a84b729e7f69a5522a7020db57e27bf8cbb6042e030106c0cbd185bf0ab8"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np406",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x3c7adb6035b88d99e1113b076cd7ee852294e0f651e87e779f93b9625f50f173",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3d03d9ffcd17834d8b99988eb8c1c9f36b8e627f50e2d850a6538d7610ba8457",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x196",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0xfdc",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xda2511fe0f2d0c7384fdfaa42ba9d93127690645ed7f3bb5b48ab3bf31550561",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x41",
+ "validatorIndex": "0x5",
+ "address": "0x6510225e743d73828aa4f73a3133818490bd8820",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x31a63d6d54153ab35fc57068db205a3e68908be238658ca82d8bee9873f82159"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np407",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xda2511fe0f2d0c7384fdfaa42ba9d93127690645ed7f3bb5b48ab3bf31550561",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xeb5feebaa9bd10619704d66efc97f95338c3e02dcebc2710be462faa47ddfc63",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x197",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0xfe6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x32704763870e0504f0386bb2e87511ccb2d033c83e9ef57a72327f5d23fd3996",
+ "transactions": [
+ "0xf88382014608830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0e767d5dbf82d8857bccd947a04354b0023b0e283098f75e4d7d79348c24dca95a00a4d04094359f0817637570cf1ed12dcd2614da2e845751734d67175839a3903"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x828641bcea1bc6ee1329bc39dca0afddc11e6867f3da13d4bb5170c54158860d"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np408",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x32704763870e0504f0386bb2e87511ccb2d033c83e9ef57a72327f5d23fd3996",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xaadc011ce89c8dd628f56494b7f19d8cf66c1555b3cb6b38fd6e31c908e83804",
+ "receiptsRoot": "0x0c78f3779ab455eed4ce5e60071fff80a3d289a33fd656e17017d53978fada5d",
+ "logsBloom": "0x00000000000000020000000040000000000080010000000000000000000000010000000000000000000000000000000000000000000000000000000004000000000000000000000000000001000000000000008001000000000000000000000000000000000000001000000000002000000000000000000000000000002000000000000000000000000000000810001000000004000000000000000000000000000000000040008000200000000000400000000000000000000800000000001000000000000000000000040100000000000000001000000000000000108000000000000000020000800000002000000100000000000000002000000000004000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x198",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0xff0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x16f96f705d6378a460f67690c9df7ba0b0130dfb7bda8d79ac2ffe9fdee84606",
+ "transactions": [
+ "0xf87a8201470883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a00eab4059563c228f12cd79cdc77c5594af5bb5f9778dab439aead79a99c7da9aa010476536728e9bf977ad4c2cc25fb7d5587869148789e9fd6bf40d65b9e94bbb"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x7e0752ddd86339f512ec1b647d3bf4b9b50c45e309ab9e70911da7716454b053"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np409",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x16f96f705d6378a460f67690c9df7ba0b0130dfb7bda8d79ac2ffe9fdee84606",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x0ed00985c27ccb9453093f70f7cae8594259e64c8962ee22121019210fe01824",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x199",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0xffa",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x70c71163387d8226f299ed02fd7f266f79d708f11ea9133d28a6b13ee751e259",
+ "transactions": [
+ "0xf865820148088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0310416be8b0e49ec34116f9c8eb4dd4d4dc6e39e5c97ccb94ac96e8cd21a7333a029b7a950def860ab8bfd4e49e5f34bc731344ab60770ea27f656e64e6b2f90de"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x31d973051189456d5998e05b500da6552138644f8cdbe4ec63f96f21173cb6a1"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np410",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x70c71163387d8226f299ed02fd7f266f79d708f11ea9133d28a6b13ee751e259",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x7ff6b18a2c62836e16cad9956e08422a430c268cda51f219422b628491066c6e",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x19a",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x1004",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x67c274a189945d313dccd5b9cb4b7fd47614b59c716a4ed0944d8a1429781e78",
+ "transactions": [
+ "0xf8688201490882520894579ab019e6b461188300c7fb202448d34669e5ff01808718e5bb3abd10a0a0de600e017080351550412ac87f184ec2c3f672e08f1c362ab58b94631e8864dca047d41b8691a1f7f8818e59ad473451a0edfc88826a6b808f84f56baed90d5634"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe33e65b3d29c3b55b2d7b584c5d0540eb5c00c9f157287863b0b619339c302f0"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np411",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x67c274a189945d313dccd5b9cb4b7fd47614b59c716a4ed0944d8a1429781e78",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x95d1e2783fcf975ce0a79a05166ad33628065812d76f1f92f88d8f77f5a49e88",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x19b",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x100e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x7ae0486d0457d3261e308c1074c7a206e11f3a41a8b3b49ff379d0998a62278c",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x42",
+ "validatorIndex": "0x5",
+ "address": "0xd282cf9c585bb4f6ce71e16b6453b26aa8d34a53",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x78d55514bcef24b40c7eb0fbe55f922d4468c194f313898f28ba85d8534df82c"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np412",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x7ae0486d0457d3261e308c1074c7a206e11f3a41a8b3b49ff379d0998a62278c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa1e185a2970fcd9903cadff06453ace3bff731a5295334d332c3fafd1d50033a",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x19c",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x1018",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xb075a9e715b341d481dfad3f02ff0a123aa8043d4ae24d5f0574a7249cc00bcf",
+ "transactions": [
+ "0xf88382014a08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa06222a14090e09278dc92b9002ee33b54e5bbbecd9afe56fa18d00dfe761ce8a1a06e8ec220dc8219ae16f46f3a4696fc8b4046fd33fa41efb473222fc058d65ed4"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x2e0f4be4d8adf8690fd64deddbc543f35c5b4f3c3a27b10a77b1fdb8d590f1ee"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np413",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb075a9e715b341d481dfad3f02ff0a123aa8043d4ae24d5f0574a7249cc00bcf",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x19a70ab3d8102a74b87887d95a29fe82ce4d4ab36fe3f57f336ded8bd0a7b3d6",
+ "receiptsRoot": "0x2ac314ac40ad6f04e3ec1fc2b315d4ce6eb64537ae9bf3fad670a0a1df1e5e3a",
+ "logsBloom": "0x00000001008000000040000000000000000000000000000000000000000002000000000000000000000000200000000000001000000000002000000000000000001008000000002000000000000000000000000000000000000000000000000000000080000000000000008000080000002100000000000000000200000000000100000000000002040000000000000000000000000000000000200003000000000000004000000000000000000000020000000000000000000000000000000000040000000002000000002200000000000000000000000000000001000000004000000000000000000000000000000200000000100000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x19d",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x1022",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x936ce32cab37d0a985a937a8d3c7191ec7f48a10d524d04289d59efa4ca4e581",
+ "transactions": [
+ "0xf87a82014b0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a07af33005afb5f1b38c17ed2bb2b83a0c1d0d6ecd30ab4e32091582d5a3eceb28a008bfc076226d8ebf0a2c86c5ea5f65ea1f1d0cb7b7036b2049444c2fcfb55031"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe1b83ea8c4329f421296387826c89100d82bdc2263ffd8eb9368806a55d9b83b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np414",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x936ce32cab37d0a985a937a8d3c7191ec7f48a10d524d04289d59efa4ca4e581",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x0e4a2aebaaa31e943227335fd579582b6ed68abaa2706294b038ccb00ceae64f",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x19e",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x102c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xd352dfead0be49f8a1f2f7954f90df4b3e4383f8adb54062abd8041b0a0878fd",
+ "transactions": [
+ "0xf86582014c088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa05e26cfc612b47c55ae5a521eca26d4adbeaefe893bf1b0226cd121cbd7cdb45aa00be4c1040e89e1db4b10b4f36b38ef682de4f3308fd65d4f39346ffcf016cfdb"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4ddad36d7262dd9201c5bdd58523f4724e3b740fddbed2185e32687fecacdf6b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np415",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xd352dfead0be49f8a1f2f7954f90df4b3e4383f8adb54062abd8041b0a0878fd",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xc149cc44783e5dc5c6be9d4facfc2e9d3d31dff27f8495ea3fc2acfc22310516",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x19f",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x1036",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xddf15ae692657c7be84b2e663acd7d669dc84a83622c9bbca07aba3a8461d8a6",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e82014d01088252089488654f0e7be1751967bba901ed70257a3cb799400180c001a0a79b0ff9846673061d1b90a17cd8bd9e7c7f62b99b39fbe4749777d3ed4544e0a0750ecfe9895402861ebea87e9b483b2c116bc2d4920329aa1c29efb9dcdf47e6"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x156c0674e46cdec70505443c5269d42c7bb14ee6c00f86a23962f08906cbb846"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np416",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xddf15ae692657c7be84b2e663acd7d669dc84a83622c9bbca07aba3a8461d8a6",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x39d41e6a842119b876ef50fcce4e677b2760950f191f0b17ac11bb61f5d271b0",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1a0",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x1040",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x5647e4a4349ab2ed23ddc1f61244c94f194735701ad4041ea62bc578654fecdb",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x43",
+ "validatorIndex": "0x5",
+ "address": "0xa179dbdd51c56d0988551f92535797bcf47ca0e7",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xdfc56ec6c218a08b471d757e0e7de8dddec9e82f401cb7d77df1f2a9ca54c607"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np417",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x5647e4a4349ab2ed23ddc1f61244c94f194735701ad4041ea62bc578654fecdb",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6f8f7979fade5692d7fd5e0f6253e0e3082614421af4bcfbd63c12f2df06876f",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1a1",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x104a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xb50098d59b2351e10448f5560aff3f933bb24fed7101cda025bcdd5308fb4631",
+ "transactions": [
+ "0xf88382014e08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a0fea6631902fceb5662ca53076387bbbb0e0fd9bcac1df121172fd29bd6700434a0632755563256841b198d853ee1861224df35abe91c6d15ca60cb3f660ce05e2d"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x395d660f77c4360705cdc0be895907ec183097f749fac18b6eaa0245c1009074"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np418",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb50098d59b2351e10448f5560aff3f933bb24fed7101cda025bcdd5308fb4631",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x26b3aa514e4bfed98a760b1cc6d5c7c855232ecac4f00826049369385376458b",
+ "receiptsRoot": "0xa3ea729352d4252acd6b48dcc940d3acfe0d657ca5d3091eda1ae882c7c14776",
+ "logsBloom": "0x00000080200000000000000000030000000000000000000008000000000000002000000400000400000000000080802000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000800000000000002000000080000000000000000000000000010000000800000000000000000000000000000200000000000000000080000000000000001000000000000000000000004000080000100100000000000000000200000000000040040000000000000000000040000000000100010080000000000000000000000000010000000000000000000000000000000000000000000000000040000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1a2",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x1054",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xd87426372101b44c6fb40defa47f5e64ced815cf6bcbe830367d328e52fa3bd5",
+ "transactions": [
+ "0xf87a82014f0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa08ded8700920cf761c49ef0831076f10597be8fe624b891585941b1a1d145a18fa05640b1e1c59257bc6b6352be6bb6a7862a541b3fca52da28912b08b8072b57e5"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x84c0060087da2c95dbd517d0f2dd4dfba70691a5952fe4048c310e88e9c06e4f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np419",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xd87426372101b44c6fb40defa47f5e64ced815cf6bcbe830367d328e52fa3bd5",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x730477c9b8be2e32598ff45ddf03837963e5d2fcd5c8c07d23b47b385c22d4b7",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1a3",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x105e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xac9d6592b309e9e3ec0d899eda9ccd7d508e846553ac4a87da8b420c99173211",
+ "transactions": [
+ "0xf865820150088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0bb5b1c9e4a9e86b6381ce83f476e3efb45b847315ec3e27e1536539ba2290f42a07eee4b7b9b0d0dc1b873baf519a668f4605ccbb82ad619acb74598535a35bdd1"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf4df943c52b1d5fb9c1f73294ca743577d83914ec26d6e339b272cdeb62de586"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np420",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xac9d6592b309e9e3ec0d899eda9ccd7d508e846553ac4a87da8b420c99173211",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xef5088187720800d3dec63e4e25560c839cad852b7a795fd9e9876ee2a02b16a",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1a4",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x1068",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x834b28c2883caaa276a3a0f2603da1bb8171001967787b96071588f296b7671b",
+ "transactions": [
+ "0xf868820151088252089447e642c9a2f80499964cfda089e0b1f52ed0f57d01808718e5bb3abd109fa0c37c23a91d6abced211855a2d6d5e383f54aa6ff40c26abc5f27a22cdafa5618a0190f82ff101eabad8b9c7041006dcb3e3a9a85c814938bef8ec7d1aa63fa5892"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x0bb47661741695863ef89d5c2b56666772f871be1cc1dccf695bd357e4bb26d6"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np421",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x834b28c2883caaa276a3a0f2603da1bb8171001967787b96071588f296b7671b",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x8fa327b5c3e6a5036585a3b751910d613c3d2b6b56b0a5c1da7727ce50d4cb57",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1a5",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x1072",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x1232a401598e285a5e94aaa0644787458ac9e410b4b50cbc103523f2d2d4c198",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x44",
+ "validatorIndex": "0x5",
+ "address": "0x494d799e953876ac6022c3f7da5e0f3c04b549be",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4a1f7691f29900287c6931545884881143ecae44cb26fdd644892844fde65dac"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np422",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x1232a401598e285a5e94aaa0644787458ac9e410b4b50cbc103523f2d2d4c198",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa5eef4d5746f0409111e198bb292fd06bf9ac9a14dc734ca636005246e713e5c",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1a6",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x107c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x271fd072d8e81da656b1f06548d486ce23f9fd399e070d3a01a3bd28c2d4eb7c",
+ "transactions": [
+ "0xf88382015208830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0435a46c3720f21ff83b01b3d6e88f602e45dee024e69f7df083e47ee400fa063a020b2e545bea301a0322157c61d6f8bdee62066305c627c1c10fb9eb1fbdf0fed"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x9b133cc50cbc46d55ce2910eebaf8a09ab6d4e606062c94aac906da1646bc33f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np423",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x271fd072d8e81da656b1f06548d486ce23f9fd399e070d3a01a3bd28c2d4eb7c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x5486d8d4c4159eb6389774b47a76d5e347e3b31ecf92c08eda9e261e3106f0cc",
+ "receiptsRoot": "0xc0c07d0984b850e6ccc2e081d26ec135c42d526e9bb51a6c1987784d659c07d5",
+ "logsBloom": "0x00000000000000000000000000000200000000000020000000400000000000000000000000000000000000100000000000000000000400000000000000200010000000000a00000008000000000200000000000000000200000000000000000000000000000000000000000000000001000000000000000000000000000000000000000806000000000000000048000000000000002000000040000500001000000002000000000000000000000000000000000000000000000000000000000000000000000000000000800000000800002008000000000000000000000000000000020000100010000000000000000000000000000000000000000010000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1a7",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x1086",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x966f75efe4cd3d4171d4dd7dbe65453d3fae561f5af4d67142cc15ad53dae212",
+ "transactions": [
+ "0xf87a8201530883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a015ae0fac40a467ff5ad10fe01c838c564f0d30707c8b02be656345842959fedda07a3d9842f721d8cb4494a2df6ff689c4c19e44c8c81f013d1f969624d49850b2"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x473b076b542da72798f9de31c282cb1dcd76cba2a22adc7391670ffdbc910766"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np424",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x966f75efe4cd3d4171d4dd7dbe65453d3fae561f5af4d67142cc15ad53dae212",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa9339a9c149937412b8c9d01a85c7af270578af9eebb80ad2cf208764c40e608",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1a8",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x1090",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x92a740edd1bceefb2f497e906a5f53bc10928c909069ba76b34663dabfc01f91",
+ "transactions": [
+ "0xf865820154088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0c14791fa1c6907f6279226a31c5f287c93702ba72f19fb9999b93b8ad612b36fa0371a0819796295976ab02fcafbe818a711cf6485a21d038dcb72b5000f04d63d"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x225dd472ef6b36a51de5c322a31a9f71c80f0f350432884526d9844bb2e676d3"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np425",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x92a740edd1bceefb2f497e906a5f53bc10928c909069ba76b34663dabfc01f91",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xac3cc175fd0ba02252342155b4d9dd7fb790eb49b667058912b43f5bd6e939d5",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1a9",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x109a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x5a7a3b8f0d389c13d810588336964f1a94b29184e3d9bc751eb64ef4635ad0f5",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e820155010882520894d854d6dd2b74dc45c9b883677584c3ac7854e01a0180c080a07a17de801de3309b57dd86df30b61553d5c04071581d243f33f43c4d64930e09a075f7e820212e8f96d7583c66548719db621537fe20f7568d5ee62176881b70e8"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x31df97b2c9fc65b5520b89540a42050212e487f46fac67685868f1c3e652a9aa"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np426",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x5a7a3b8f0d389c13d810588336964f1a94b29184e3d9bc751eb64ef4635ad0f5",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe677d652ba3a8822155791a1d1491ee57497ebfa49e3e38c909752dd8067a9e8",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1aa",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x10a4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xf963480776054d809830c23d97833cfbf2971fc0fa04a6fe4974ea25a761f8c9",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x45",
+ "validatorIndex": "0x5",
+ "address": "0xb4bc136e1fb4ea0b3340d06b158277c4a8537a13",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4416d885f34ad479409bb9e05e8846456a9be7e74655b9a4d7568a8d710aa06a"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np427",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xf963480776054d809830c23d97833cfbf2971fc0fa04a6fe4974ea25a761f8c9",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x08414161950ff53f6f053f2886c473a22eb595a0052de01fd24c7af1bc27a5ac",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1ab",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x10ae",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xe8c8baed11565acb9d54e46ed79327292e07686ada5cd14fb02558ac39c518ec",
+ "transactions": [
+ "0xf88382015608830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa02f6b9a47dcc55d9130085e0dfd615fee0acea46517280eea07dff8ee6afd40e3a01fc33c02a467db6d30ccf56ad8b5bb32fd49ad9a7866db580e7a581987518921"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xae627f8802a46c1357fa42a8290fd1366ea21b8ccec1cc624e42022647c53802"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np428",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe8c8baed11565acb9d54e46ed79327292e07686ada5cd14fb02558ac39c518ec",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x5afe7e66edc543cc377a33069ba58d5788801f1ef0f370d69ff71db5f63b6b88",
+ "receiptsRoot": "0xb278e6670351b21cd1c267f24972d7868327ae82ef7a3b377af968b4c6659925",
+ "logsBloom": "0xc0000000000000000020000000000000000000001000000001000000000020000000000000000004000008000000000000000000000000000000000000000000000000001000000000000000800010000000000000000001000000000000000000000000008000000000000000000201000001800000000000000000000000000000000001000840080000000000040000100000000000000000000000000000000000000000000000000000000800000000000000000000000000020000000000002000000000000000000000000040000000000000001000000400000000010000000000000000008000000000000000000000000000100000020000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1ac",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x10b8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xedf9debf0ac1be313a1f9e6f0121d36c284e2c7962acac1fa5c8aae207c07b34",
+ "transactions": [
+ "0xf87a8201570883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa06cbb3f84663bf7369864941fe566b1beb8d5db0095cbd49ebfdee89c164031e6a0461b62f4b01d15206e95e6c7bfe9364456d8b7edd446d1b488a2688c47b83775"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x8961e8b83d91487fc32b3d6af26b1d5e7b4010dd8d028fe165187cdfb04e151c"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np429",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xedf9debf0ac1be313a1f9e6f0121d36c284e2c7962acac1fa5c8aae207c07b34",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf1c25b007a4c84577aa49389214e8b8b63f81cb20b61095db784cd8e781fbdcc",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1ad",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x10c2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x94a14e5fafedb96bffc4624affb9a20762f447e5abb90865c4418a539743932e",
+ "transactions": [
+ "0xf865820158088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0a285aa615fe480c778997ca57059b8ddec5cee0e5a94ec05cd028a03d04aadaba07549f0c6ded9fe03eb40b413803b8f02d9dc51591e29977d12a204518648008e"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc22e39f021605c6f3d967aef37f0bf40b09d776bac3edb4264d0dc07389b9845"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np430",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x94a14e5fafedb96bffc4624affb9a20762f447e5abb90865c4418a539743932e",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x401f1feec84dc7c894bb9f03dd52b5af121262ab2f6bd29e6de4e96c1ed67870",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1ae",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x10cc",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x855b2ccb1c00d717f49ec7074cee1f781edfc072eeef44012e18613a9172fc9d",
+ "transactions": [
+ "0xf8688201590882520894c305dd6cfc073cfe5e194fc817536c419410a27d01808718e5bb3abd109fa0163f29bc7be2e8fe3c6347fe4de06fa7330e3a3049c0e9dcded1795ff1c1e810a04ea7492a5e457fd21252166f5a5d5d9d5e5c7a19da2c7fd4a822bf60156b91a9"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x7cfa4c7066c690c12b9e8727551bef5fe05b750ac6637a5af632fce4ceb4e2ce"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np431",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x855b2ccb1c00d717f49ec7074cee1f781edfc072eeef44012e18613a9172fc9d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xc97f5e63e102992e2a849afad97481ea818d213707de515acd9c2bc246cdf65f",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1af",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x10d6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x4155e12dee1bb9ed17527871568425b8eb672004a2e2c19cb1947004fc5f0b0e",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x46",
+ "validatorIndex": "0x5",
+ "address": "0x368b766f1e4d7bf437d2a709577a5210a99002b6",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x943d79e4329b86f8e53e8058961955f2b0a205fc3edeea2aae54ba0c22b40c31"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np432",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x4155e12dee1bb9ed17527871568425b8eb672004a2e2c19cb1947004fc5f0b0e",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x9c177f669a297c904a6a6ad51765a5916a0e0a3d9858b289e70bf054b370d685",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1b0",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x10e0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xd660a48f06384f7ee4402d24193c76d2f4a00b85ca53ae9883b4ee3c07260586",
+ "transactions": [
+ "0xf88382015a08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa078d6fdbc4224106e1f59483aff597485ed0eebf922317913522a0693727b5ee8a035876b3170b9a88dc391f83dcac8088aeb65233613c74d8f50f1d1d3b1ce842f"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x66598070dab784e48a153bf9c6c3e57d8ca92bed6592f0b9e9abe308a17aedf0"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np433",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xd660a48f06384f7ee4402d24193c76d2f4a00b85ca53ae9883b4ee3c07260586",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x98d101f68f7aa5bb170cfdd60281d7a5c3ae335ab03c0f87bdb5e72cc022d55f",
+ "receiptsRoot": "0x1919995eb19582a49f7b79b55e7ec75fae399916006f29e4177543d99cc2a5e3",
+ "logsBloom": "0x00000000000040000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000080000040004000001000000008000000000000000000000000000000000000000000000000000000000800000000000000080000001000000000000080000000000400020000400000000000000000000000000000000000000000000001000000000000000000000000000000000000000000012000400000000000002000000000000000200000000100000000000000000000000000000000000000000000000000000000004004000000000000002000000000000002010000004000014000000000000080810000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1b1",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x10ea",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x73404b62b42dbc6a6604152b87426e852cc3b34847f45f27c0fca1f3a619f84a",
+ "transactions": [
+ "0xf87a82015b0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a09fb0d3ddf1fce9562d227b3cd6c35ac2e89f39141823d94cda0e6efb4519c715a06925af0950104623efa7954872196fe6d539eb269263a17db3740652382d100f"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xac8fe4eb91577288510a9bdae0d5a8c40b8225172379cd70988465d8b98cfa70"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np434",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x73404b62b42dbc6a6604152b87426e852cc3b34847f45f27c0fca1f3a619f84a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x7d06044c1009a2320b83bdfe22ffe7b8ffa6fa1f65d5e42f7c1588417a8ff421",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1b2",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x10f4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x9832bc48443f86a5809f75ad91caa04101363a43b300cef39918deaae8594e08",
+ "transactions": [
+ "0xf86582015c088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0aa24c6fb2c99f1ce21f7ffd84e87fb6f81ff76cebe06fb5c0871294a353210dfa0350602877ed48896e8b4124b35c0c47da66c17fc0d553d9248ca1de942114306"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x2b0018a8548e5ce2a6b6b879f56e3236cc69d2efff80f48add54efd53681dfce"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np435",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x9832bc48443f86a5809f75ad91caa04101363a43b300cef39918deaae8594e08",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x03d23380eb6a02b52fcfeb82c0fefd180c014e72a7f48f2627237e7bda6d5610",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1b3",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x10fe",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xe5e23a0fd4a2515c0e1292823b094a1aeec3ed64db400675b591fc077bf34c3f",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e82015d0108825208942143e52a9d8ad4c55c8fdda755f4889e3e3e77210180c001a0673c5473955d0d26d49b25b82af905ee33ba365178f44dc4ac39221efec23c88a017f46fc9b15ba0c1ea78d4d9f773582d94f61f6471f2918cb0598f33eb9bc89b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x823445936237e14452e253a6692290c1be2e1be529ddbeecc35c9f54f7ea9887"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np436",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe5e23a0fd4a2515c0e1292823b094a1aeec3ed64db400675b591fc077bf34c3f",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf8829f712e0ea692e266ae3c78400816c5f5bc1d75a3bff3816f7fef71b2044c",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1b4",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x1108",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x6e26197c94723ba471d049f6082abd0a6e684225b2ee9d8fa675b18ef11492c1",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x47",
+ "validatorIndex": "0x5",
+ "address": "0x5123198d8a827fe0c788c409e7d2068afde64339",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x3051a0d0701d233836b2c802060d6ee629816c856a25a62dc73bb2f2fc93b918"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np437",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x6e26197c94723ba471d049f6082abd0a6e684225b2ee9d8fa675b18ef11492c1",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xc66ecc1bdb4fa4b85c0b383d4db20fdaa2cba32973260dc444abb43e8536e93a",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1b5",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x1112",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xb5f0ca3b4503c50b8eab9c63a95b209426af616a5b0d8468e63246c3f590caac",
+ "transactions": [
+ "0xf88382015e08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0179370023b242bccf25d4899c2f29936353b5f1c37a8f7c665e55b75f80bf297a018a66d1d2ef7072f7fc54af07d15edc14ecf5a71f510be740c090f0815178ff2"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x44a50fda08d2f7ca96034186475a285a8a570f42891f72d256a52849cb188c85"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np438",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb5f0ca3b4503c50b8eab9c63a95b209426af616a5b0d8468e63246c3f590caac",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa9b50e298c6a4bbd23a659ab24a3a7426b1087497561c39de2f1bf27da019b83",
+ "receiptsRoot": "0x8f45041560ebf83ec428723c6d69db271346e4c5a1b234b56efe318d549187cb",
+ "logsBloom": "0x00000000000400400000000000041000000000000004000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000202000000000000000000000000000080000000000000000000000010000000040000000004000004800000000000000400000000020000400000000000000000008000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000800002000000001000000000000800002000000100000000000000000000000000000000004000009000000000008000000080000000000000000000000000000000900",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1b6",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x111c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xfe8e1ceca43818cb8f2e4fc94ead6cea53a8fd515af2bc67a39a15584ec3cd86",
+ "transactions": [
+ "0xf87a82015f0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0354b9d4a470abdae9da30183321b96b5fd09bc96c1ebd3137b3c6350c21e8de2a026877262b14edc851e17cba052b022dd1038fd51ef65ecbaff09dd07186f035a"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x6e60069a12990ef960c0ac825fd0d9eb44aec9eb419d0df0c25d7a1d16c282e7"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np439",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xfe8e1ceca43818cb8f2e4fc94ead6cea53a8fd515af2bc67a39a15584ec3cd86",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xad6a72de336a98aec47ed431bf7d39d537741125313255629633cba91b0097bd",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1b7",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x1126",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xfd02d6b4d954d36af8829bf98464c0cc410de1e28216e45ac5e90fc1fc5780d3",
+ "transactions": [
+ "0xf865820160088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa09c6b3542e181028aad33517584cd16e92836f975955abdcbf1205b6250c921d4a040816d88e011c2d3073502523867b94987fa0781793a7857ff2453ec2d121444"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x581ddf7753c91af00c894f8d5ab22b4733cfeb4e75c763725ebf46fb889fa76a"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np440",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xfd02d6b4d954d36af8829bf98464c0cc410de1e28216e45ac5e90fc1fc5780d3",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x863de67ea016127a436ee6670f8642bd5ab997ce75361c3cce667abbe90b7283",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1b8",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x1130",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xe0c31051877e8d3f6f625498659eff12247ded622d4155f6fd4a498852e46192",
+ "transactions": [
+ "0xf86882016108825208940fe037febcc3adf9185b4e2ad4ea43c125f0504901808718e5bb3abd10a0a0654dc39f93a879b9aec58ace2fdbd5c47e383cae2d14f1a49f6ec93d539be892a070505a0ef2e83f057e9844dbd56eda0949197f0c4a2b6d0f2979db1710fca4ed"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x9a1dfba8b68440fcc9e89b86e2e290367c5e5fb0833b34612d1f4cfc53189526"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np441",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe0c31051877e8d3f6f625498659eff12247ded622d4155f6fd4a498852e46192",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x66989995258d8db8bd3b8eac83c7762c50323b8f21f1aaddf3ad0208afc6318d",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1b9",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x113a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xe9da2b3df6fbc520bf3a80b36bd3437210880763ea7acbf422076049724a14ac",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x48",
+ "validatorIndex": "0x5",
+ "address": "0xd39b94587711196640659ec81855bcf397e419ff",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x54a623060b74d56f3c0d6793e40a9269c56f90bcd19898855113e5f9e42abc2d"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np442",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe9da2b3df6fbc520bf3a80b36bd3437210880763ea7acbf422076049724a14ac",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf37b2d059d8764938039410fc2581f4793fb4f9c66abf4f8a32276dd60334f4d",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1ba",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x1144",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xeafce24dfb100daa2a1ee55da0030d8e057fc943b96b6e7f321af98b47e8107e",
+ "transactions": [
+ "0xf88382016208830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0bf7859d7e53ab582f4189f50f06832f2fa9763498350b739d7a677b34df97861a03ab21050f73bda7c737cef08e6a77edc9766aa0ef14dfdfc22fbcfdb6771825e"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x1cfeb8cd5d56e1d202b4ec2851f22e99d6ad89af8a4e001eb014b724d2d64924"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np443",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xeafce24dfb100daa2a1ee55da0030d8e057fc943b96b6e7f321af98b47e8107e",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x23eacf2b963df64726e41314251669bf12f3925de3933e0b713863d1a7a6fc6b",
+ "receiptsRoot": "0xc97de406788b669a824183dab763b8caa8988371aea1f18b96e6b1f9abdee729",
+ "logsBloom": "0x04000000200100000000002000000204000000000000000000000000000008000800000000000000000000000000000001000080000000400000000000000000000000000000000000000000000000000000400000100000000000004000040000000000000000001000000000000000080000000000000000200000000000000000000000000000000000008000000000000000000000000000040000000000000000040100000000000000000000000000000000010000080000000000000000001000002000000000000400000100000000000004000040020000000000000000000000000000000000000000000010000010000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1bb",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x114e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xa53dc7dc3ac37fdd69bedd119e5113397594ab4171b7c010913864890dbd7f96",
+ "transactions": [
+ "0xf87a8201630883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0332397d6a00a7d2a3453bf053c8d158774d82d6ea252c2d564bbd48f9e882418a01187aef824b2759cba8c1574666919b77889353a9905720170518b03b38cc71d"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xad223cbf591f71ffd29e2f1c676428643313e3a8e8a7d0b0e623181b3047be92"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np444",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa53dc7dc3ac37fdd69bedd119e5113397594ab4171b7c010913864890dbd7f96",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x71e7debe9374beede2414966d6eb2c2eadf548c293ba65821869bc274709badb",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1bc",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x1158",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x48640726ce7b39f951f82d46cfd4f8d71c93534109a0f93810c41289f6c97d2e",
+ "transactions": [
+ "0xf865820164088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0b7296876d0713a392d440d71244cda1a3ecb09009a2f4d0ae5d26a398a8bee92a04dd844c3b7cbf88f10b080a3a0fd8a0e21e8d3041450c69786efe9ee7af18dcc"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe13f31f026d42cad54958ad2941f133d8bd85ee159f364a633a79472f7843b67"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np445",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x48640726ce7b39f951f82d46cfd4f8d71c93534109a0f93810c41289f6c97d2e",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x58a574089cbd9986bf63c3ee8e0e8d400e9b97b8d1280166f7505de051f4c661",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1bd",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x1162",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x40fa37188938bd349b17c8738f79a071533e0c0f6eaf4b1d6d6614fcae9925d6",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e820165010882520894046dc70a4eba21473beb6d9460d880b8cfd666130180c080a09a954eff1b0e590a3a78b724b687c6ab944181990998780d56cc3593c704996ea0418db96b5dc1057f6acb018244f82ed6ece03d88c07f6ae767eaebe3b7ac9387"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xb45099ae3bbe17f4417d7d42951bd4425bce65f1db69a354a64fead61b56306d"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np446",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x40fa37188938bd349b17c8738f79a071533e0c0f6eaf4b1d6d6614fcae9925d6",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xbd0820c57ebb5be91343940d7197af10c1d95a23a1b99bc5fa1a77997849273c",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1be",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x116c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xeebf24886684542e08624e438bfad2c52eded1a4924aef3fd58d60ed6eaa1d19",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x49",
+ "validatorIndex": "0x5",
+ "address": "0x6ca60a92cbf88c7f527978dc183a22e774755551",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x9d2b65379c5561a607df4dae8b36eca78818acec4455eb47cfa437a0b1941707"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np447",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xeebf24886684542e08624e438bfad2c52eded1a4924aef3fd58d60ed6eaa1d19",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xbc2acbe23d81c5bec8c73c20cfbb12be681cc92fa399ed4a44e7a91fb433c577",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1bf",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x1176",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x837fc89a9611fa0b6a0d2f5a7dec3e06eda2ea3ee84bc6ce214c432b243c256f",
+ "transactions": [
+ "0xf88382016608830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a0daffe9dd6ca6d33e1a44ce5725c7e795639c4bd4a36cfb18d520c9fc892b7ca5a01286dcff57cb583238854ca89346c969387d982ca7e14cbd82413855fdda282a"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x5855b3546d3becda6d5dd78c6440f879340a5734a18b06340576a3ce6a48d9a0"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np448",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x837fc89a9611fa0b6a0d2f5a7dec3e06eda2ea3ee84bc6ce214c432b243c256f",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x95fea999be7fc8cfa0e1c8a9a10dc33d073417bf87ff698edab332c6e18ecc60",
+ "receiptsRoot": "0xcf29f818a1be0922fc0576d2500603f4e9ab8a9e251986d891170f993f0c8f0a",
+ "logsBloom": "0x00000000000000000000000004010001000020000000000000040000000000000000000000000000000000000001000000000080001000000000000000000400000000000800000000000000000000000000400004000000000000008000000000000000000000000000000000000000000010000000000000000040000008000000000000000000000000000000000020000004020000000000000000000002000208200000000000080000000000000000000000000000000080000020000000000001200000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000010018000100000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1c0",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x1180",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x05505959a8095b30ab40f55294926448248b48b0430ce33332c7b748e956aafa",
+ "transactions": [
+ "0xf87a8201670883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0745918999757459ef7ab7145b734444d0437fa7b3939a6ca2a07652a727d1ef9a0074b0898accddb3ac54941b1fce130c31edd3d838dfefd506668cd989f4c5389"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xd6a61c76ae029bb5bca86d68422c55e8241d9fd9b616556b375c91fb7224b79e"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np449",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x05505959a8095b30ab40f55294926448248b48b0430ce33332c7b748e956aafa",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa4269875f0bd6dc1360830e3e07eae0956700e8c3aa69cd61b423abf51bfce54",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1c1",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x118a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x57095cf08428bbd1fff32a14f1a811750ff2de206ee3ea1d6f6f18f7a2606d30",
+ "transactions": [
+ "0xf865820168088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa01f0e57c3b6f3908a7afb46717ef32caf9b73c4a4b2f48b09e0fcbea02ae716e1a017c79cab83300efab682d0c0438b23b49136a17e22560e75d32014c5951b4fd4"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x96ac5006561083735919ae3cc8d0762a9cba2bdefd4a73b8e69f447f689fba31"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np450",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x57095cf08428bbd1fff32a14f1a811750ff2de206ee3ea1d6f6f18f7a2606d30",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd315f1048882fde9bc00a0bae351ab3229cec00efa7ef4b61fd5c1be40619f81",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1c2",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x1194",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xe6d3cb3da9e188604d0e8bc2f03a0df4fefa836f9bf4b679e54e97138f72dd08",
+ "transactions": [
+ "0xf8688201690882520894104eb07eb9517a895828ab01a3595d3b94c766d501808718e5bb3abd10a0a0597dbb3f69603be721ae0f2a63eeee9f008829ff273b54243673f9ea192ddc0aa01f7dd04defb45af840d46a950b8bede0b3ce8a718004c1ca2f3bbd4efcbd7563"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4ced18f55676b924d39aa7bcd7170bac6ff4fbf00f6a800d1489924c2a091412"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np451",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe6d3cb3da9e188604d0e8bc2f03a0df4fefa836f9bf4b679e54e97138f72dd08",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3222feed7d40d321811eb16ac78aaa0561580b176e0605bfecc30427a7702996",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1c3",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x119e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x465bd8f010df142744fc22da07b631a4e2d11ae75bca1608f7592548c420178b",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x4a",
+ "validatorIndex": "0x5",
+ "address": "0x102efa1f2e0ad16ada57759b815245b8f8d27ce4",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc95a6a7efdbefa710a525085bcb57ea2bf2d4ae9ebfcee4be3777cfcc3e534ea"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np452",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x465bd8f010df142744fc22da07b631a4e2d11ae75bca1608f7592548c420178b",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x96bcc6f26c5f94c33c57d1614edd2b385e36d9972250c79758eeaeb09927c0a8",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1c4",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x11a8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xc7131bb27a6e1395d028d543cfd6f9e71ec4f2d2ecbc44cef53b5b626e01cad9",
+ "transactions": [
+ "0xf88382016a08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a03fc929c6e9476221ddd5f2f5093981cc13f4b8206ee3454720f06c0bd5c95caba038f23a2c21ba59155127a15502ddd731f30d6f94c6aafde8e73fbe39237766a2"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x2b2917b5b755eb6af226e16781382bd22a907c9c7411c34a248af2b5a0439079"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np453",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xc7131bb27a6e1395d028d543cfd6f9e71ec4f2d2ecbc44cef53b5b626e01cad9",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x168c847144cfea8b88e6ec4f673ebddbf18331bde8002e044b1d1df7408edf04",
+ "receiptsRoot": "0x4ff26b781abcaf6d8a14f4f5283feeee87038dbcb46b9987d6042a01b1b07f9a",
+ "logsBloom": "0x00000000000400000000000000800000000000002000008000200000020000000000000000000000000040000000000000000000000000000000000000800000000000000020000000000000000000000000000000000000400000000000000000000000000000000000000000800400000000000000000000000400020000000000000000800000000010000000000000004000000000000000800000000000000000001000000000000000800000000000000004010000000000000004000000000000000000000000008000000000000000000000000004000020010000000008000000000000000000000000000000100100000010000020000004000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1c5",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x11b2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x6d6eba2abd0851251651f038c9bcd8b21c56e6cefc95adb259a2b0c3ae4f158d",
+ "transactions": [
+ "0xf87a82016b0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa07061a8a3f917f765ec8aef5e4ad237d377c0131f63f31da7bdc6af9942a1bc4aa051bf3e7c6676f2fbde507834995f4e269113adf35b98bc71cd22d9c168692f5c"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x18d5804f2e9ad3f891ecf05e0bfc2142c2a9f7b4de03aebd1cf18067a1ec6490"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np454",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x6d6eba2abd0851251651f038c9bcd8b21c56e6cefc95adb259a2b0c3ae4f158d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x7e75fe29c17414bea5febf41c577c117b57c1a731aa7a18b6c5d2ba9e3bc27dd",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1c6",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x11bc",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x5cfbc66c760f871b8cf6d87140887788db0622a0f54274737f9cd043b156f50c",
+ "transactions": [
+ "0xf86582016c088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0ec3fe55b96a9d14e22fc0a8aa5991138ba954245754c0e0dda2b5b7dbb6711caa0296a6b87da18224fac7c922e2a7f0ec41330a6f510934a1e0e3c6a65dd72dfcb"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xb47682f0ce3783700cbe5ffbb95d22c943cc74af12b9c79908c5a43f10677478"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np455",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x5cfbc66c760f871b8cf6d87140887788db0622a0f54274737f9cd043b156f50c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xdf26695268f674fc809ad21c323bcab53727af440302b923eec2d46ee3cd7aa3",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1c7",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x11c6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x8f4a24fc6a150744744d03371d34758cf69d4216538804395397ed081692c7fb",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e82016d01088252089446b61db0aac95a332cecadad86e52531e578cf1f0180c080a0774ced5c8674413b351ae8ac3b96705d1d3db10deae39134572be985f16c008ba06f3e4b250f84fcf95ae85946da8a1c79f922a211dbe516fcfcff0180911429b8"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe4b60e5cfb31d238ec412b0d0e3ad9e1eb00e029c2ded4fea89288f900f7db0e"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np456",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x8f4a24fc6a150744744d03371d34758cf69d4216538804395397ed081692c7fb",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x358b2d72362d209f8c7131a484e49caff1dda8f550fe6103be80ac369cfe49fc",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1c8",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x11d0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xafcf58746fc811dd74a0e4a66d91efbb00b2ab2c96680e132234a947798abf7a",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x4b",
+ "validatorIndex": "0x5",
+ "address": "0xfcc8d4cd5a42cca8ac9f9437a6d0ac09f1d08785",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xfc0ea3604298899c10287bba84c02b9ec5d6289c1493e9fc8d58920e4eaef659"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np457",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xafcf58746fc811dd74a0e4a66d91efbb00b2ab2c96680e132234a947798abf7a",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x2dd7146f049ba679aae26c42d1da7f6660ea964a7b227509e5296a9d0170e93e",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1c9",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x11da",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x5346eb38677572982317e96be00144f1600800e5a738c875522183ad74f408d4",
+ "transactions": [
+ "0xf88382016e08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa038214a2cc756a0ffe043200d5e12183223f81912c0156df732c3b1d85bc2a237a0744a52bf9fca64223bc279e589d21b9fda190325bf3b576f41a792ccbec5bc08"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4c3301a70611b34e423cf713bda7f6f75bd2070f909681d3e54e3a9a6d202e5a"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np458",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x5346eb38677572982317e96be00144f1600800e5a738c875522183ad74f408d4",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x62b1bdf3b4a63f480b24af9f3b55dc6ad6e52bb81caa13b286960694b3b600b0",
+ "receiptsRoot": "0x25a0fc424c07569fb4229958de04f1d6497b3d8b6a78757f42963f95c354e2b1",
+ "logsBloom": "0x10001020000000000000000000000000000000000000000100000100000000000000000000000000000000800000000000000000000000000000000040000000000000000000000000000000020000080000000000000000400000000000000000001400000000010006000000000000000000800200800000000000000000000000000000002000000000000000000080000000000000000000000001000000000000000000000000800000000000000000000000000000000000000000000000080000000008004000000080000000000000000000000000000000000000000200000000020000000000000000400080000008004000000400000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1ca",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x11e4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x83f464b150683ab5ce359179f4f9d6e960049959d2ec46a4ae7a07af2de41a6c",
+ "transactions": [
+ "0xf87a82016f0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa05e304ec406ec4c83644417e1e58b49757d3ac78da5c5280fbda19b1f149137daa035b73caa8da3b6ce0e5f1b014c127f93f7be595f104cd933b5ff07549fd1812b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x84a5b4e32a62bf3298d846e64b3896dffbbcc1fafb236df3a047b5223577d07b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np459",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x83f464b150683ab5ce359179f4f9d6e960049959d2ec46a4ae7a07af2de41a6c",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x5614ae860626ff1e044740a53f3cb5126f72002928c034aecbdfe4291ce73b91",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1cb",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x11ee",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x3c1ccfa2b5f88830245f76a22fa29ce22fb5b284de5937ff66adc67a445bf5c5",
+ "transactions": [
+ "0xf865820170088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a05d0d172a5fb9787aa2ee5205e5986de935984adf6030d5668be0e31332f7b145a022c4c7a89391e8f4508095fc5c1ed16aa0c08da6790be108240dc64763d42dae"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xff70b97d34af8e2ae984ada7bc6f21ed294d9b392a903ad8bbb1be8b44083612"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np460",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x3c1ccfa2b5f88830245f76a22fa29ce22fb5b284de5937ff66adc67a445bf5c5",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x715b0d1e4306032fa54c79f84599828d98bc84ed9cdb52a407e58730b4c112db",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1cc",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x11f8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xfc7412d30ba5b6f5b319b07e51296906a42fdae50a88c1f90016d487b1df41f6",
+ "transactions": [
+ "0xf86882017108825208948a817bc42b2e2146dc4ca4dc686db0a4051d294401808718e5bb3abd10a0a0a755d1c641b8965ea140ad348135496fc412ffa43a72bbd2c7c0e26b814a75f1a067d81cca370b6ea40ccd2ad3662d16fa36bd380845bee04c55c6531455d0687d"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x73e186de72ef30e4be4aeebe3eaec84222f8a325d2d07cd0bd1a49f3939915ce"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np461",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xfc7412d30ba5b6f5b319b07e51296906a42fdae50a88c1f90016d487b1df41f6",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x8c6710fa12f6392a52eaa92d776fe1c24245dd52883ff2276547e65c34952eeb",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1cd",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x1202",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xdad167dfa9bb65a470a36a3996f0587d645b3fbfe9e3522a1436f1dd6a3a37f3",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x4c",
+ "validatorIndex": "0x5",
+ "address": "0x48701721ec0115f04bc7404058f6c0f386946e09",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xed185ec518c0459392b274a3d10554e452577d33ecb72910f613941873e61215"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np462",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xdad167dfa9bb65a470a36a3996f0587d645b3fbfe9e3522a1436f1dd6a3a37f3",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x8c73a23f75ee594dacc63d24a5d5655a1ccbeead972dba58ad86787c44442c6c",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1ce",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x120c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xc50795e72a34041bdabf74a87f77d78f3a07f2005396dcf9925b08a8a686bd61",
+ "transactions": [
+ "0xf88382017208830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0567311948632a5f4d53e0491aa8e7f939a3e0da38be1db4b6c757422de3f8bf6a01134e092948e423c7f8867c02822c95f3ce21b6d4e8d3666e2cf47ca88ad7499"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x5cfbad3e509733bce64e0f6492b3886300758c47a38e9edec4b279074c7966d4"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np463",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xc50795e72a34041bdabf74a87f77d78f3a07f2005396dcf9925b08a8a686bd61",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xb6a995ce6f848e4f2f2ad8ced5491859a5d0a3b6767108f3ce5cfcb33303349f",
+ "receiptsRoot": "0x5bb341cd099f8898164b032e64db73752f528a10e8d9c60c9b4fff08af32dcf5",
+ "logsBloom": "0x000002040000000000000000000000000000000000000000200000000000000000000000000000000000000000000300000000000000000000010020000000080000000000000000000000000000000000000000000200000000000000201000000000000000080000000000000000000000000000000040100000000010000080100000002000000000000000004000000008a0000000100000000000400000000000000000200000000000200400000000000000000000000000000000000000000000000000200000000000000002000000000000000000000000000000000000000000000000030000000000000200000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1cf",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x1216",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x69a26219f28581c8898c2790cf785e3f2b0081a416d51722d85b5ac313d5f36d",
+ "transactions": [
+ "0xf87a8201730883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a06092eab6a3d9e41841ad4b9c97154ac35269c852606da6dd04940a1a055fa979a052a6e3e769e27310acdef840cb1182f4a2b6b08583b01cb8325c98253feaf7aa"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x867a7ab4c504e836dd175bd6a00e8489f36edaeda95db9ce4acbf9fb8df28926"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np464",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x69a26219f28581c8898c2790cf785e3f2b0081a416d51722d85b5ac313d5f36d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf54cc52e78b0ea88b082230970d262fc78070bff347c000f60c53400d111a59c",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1d0",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x1220",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x3ed11b20d6eced6314897749d304a677d345ce9343fe964143548980ea71615e",
+ "transactions": [
+ "0xf865820174088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0342c58642563f78afdb5cf7b9fbc935268a8fd81a5bd7997c33f61cdff8fb9c2a07466870d997603b5dd7755f151b76f056d4948ae82372b05babc01b9addaad19"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x0d01993fd605f101c950c68b4cc2b8096ef7d0009395dec6129f86f195eb2217"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np465",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x3ed11b20d6eced6314897749d304a677d345ce9343fe964143548980ea71615e",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x5b583ecaeffb409a488709df2c592c932e93a9b954bb5b62c36739324ae7d89c",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1d1",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x122a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x20ca98d23c09a37aa1805c3989ca7a7bfff9ade344de4575f5063a10c60510ca",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e82017501088252089423e6931c964e77b02506b08ebf115bad0e1eca660180c080a06263b1d5b9028231af73bfa386be8fc770e11f60137428378137c34f12c2c242a02b340f5b45217d9b914921a191ce5f7ba67af038e3b3c2c72aaca471412b02f7"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x8e14fd675e72f78bca934e1ffad52b46fd26913063e7e937bce3fa11aed29075"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np466",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x20ca98d23c09a37aa1805c3989ca7a7bfff9ade344de4575f5063a10c60510ca",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xdaf72de0a7092d2a2a6d31336c138ab45852ca65398578fbc435b3c591fa7c3a",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1d2",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x1234",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xd1c6165f74a48fb1da29dde0ec4588f1b5708d1b810696ab128a6db9ce08a1eb",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x4d",
+ "validatorIndex": "0x5",
+ "address": "0x706be462488699e89b722822dcec9822ad7d05a7",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4ec1847e4361c22cdecc67633e244b9e6d04ec103f4019137f9ba1ecc90198f4"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np467",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xd1c6165f74a48fb1da29dde0ec4588f1b5708d1b810696ab128a6db9ce08a1eb",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xb9f6529424870d0fbfe7d70438762f3ccf9d2f212d3e42c837f6e9218d72451a",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1d3",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x123e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xee2b973ebc00c239bf4fd6c382cc78890065370286476ae02a9b1bd76788f810",
+ "transactions": [
+ "0xf88382017608830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0e42b1ec38a455f867d421d170e634c86f8a84a2cb00ec5024f343667042f303ea067797c75de08e6eafd819d4c408324fba318e16b378b7dedbc0708056aebb696"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xec69e9bbb0184bf0889df50ec7579fa4029651658d639af456a1f6a7543930ef"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np468",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xee2b973ebc00c239bf4fd6c382cc78890065370286476ae02a9b1bd76788f810",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3017b68d781fb29ccbca4c6ff597a9e18d6cee4f02974dbb32f04b5a7f519271",
+ "receiptsRoot": "0x00fbb0bcdb236cd79dbbefe84d42f31ee3274cc5e9116ffb0d70301b983dbd52",
+ "logsBloom": "0x00000000010008200000000000000000200400000000000000000000022000000000000000000000000000000000000000000000000800000000000000000000000000200080000002000000000000000000000000008000000000000000000000000800080000000004004000000000000000001000000000000000000000000010000000000200000002000000000000010000000000000004000000000000000000000400000000000000000000000040000000000000000000000080000000000200000000000000000000000108000000000000000000000020010000000000000000000000000000000000000000000000000000000040000040000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1d4",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x1248",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x66a71dd383d4ead0e00787a06fcfb3c75c36fa72b5d98f39dc37ca129315b8d9",
+ "transactions": [
+ "0xf87a8201770883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa01975b5adb5e05e7dbaf63d31d34e5dfb802c4ca28127176811ada2b0a9411be6a02b9cd65ba817631163e95275ec2bd5319edeef4f74eb6efb32150a523282db16"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xefdd626048ad0aa6fcf806c7c2ad7b9ae138136f10a3c2001dc5b6c920db1554"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np469",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x66a71dd383d4ead0e00787a06fcfb3c75c36fa72b5d98f39dc37ca129315b8d9",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x7da79133a491b6c2566dc329ed006ee0010fe59b515fbce5589eda0f31dd091b",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1d5",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x1252",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x7f166dd54e16fcd0e302579768e0bb090b06f4e35cba5b48b0b5c42e367c0832",
+ "transactions": [
+ "0xf865820178088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa02a73665ddc16b8e231ef04b5f0ad8afa56248db6f43222848032c72e97a807b8a00a17dda1a1d0ba616354fda9e86c836bcb002c7e54153be4cc95776446c6b2a5"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x551de1e4cafd706535d77625558f8d3898173273b4353143e5e1c7e859848d6b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np470",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x7f166dd54e16fcd0e302579768e0bb090b06f4e35cba5b48b0b5c42e367c0832",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xcbeab9491879fdd48e387106f31e983546cff3f4795ff5190722d2ac1f3792b6",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1d6",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x125c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xeedbf487ab11603d1a8e08d672886d16cd318bc421a358d199df281a473ac7b0",
+ "transactions": [
+ "0xf8688201790882520894878dedd9474cfa24d91bccc8b771e180cf01ac4001808718e5bb3abd109fa0515a62775619f55c366d080a7c397ea42dcfd2fdcce1862ef98dab875077f367a023756d4f3bd644dde1c25f8cde45fbea557dacf0492bbecb409f6b2cdacbb9b8"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x137efe559a31d9c5468259102cd8634bba72b0d7a0c7d5bcfc449c5f4bdb997a"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np471",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xeedbf487ab11603d1a8e08d672886d16cd318bc421a358d199df281a473ac7b0",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x60452d4fa157207a12986fb9c810855fe19a2492ad046335ec9b4fe41e48de19",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1d7",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x1266",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xe2cefda7c9752d4706e180cf9228524bd767f36f6380f0c6255498abedc66ce7",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x4e",
+ "validatorIndex": "0x5",
+ "address": "0xe5ec19296e6d1518a6a38c1dbc7ad024b8a1a248",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xfb0a1b66acf5f6bc2393564580d74637945891687e61535aae345dca0b0f5e78"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np472",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe2cefda7c9752d4706e180cf9228524bd767f36f6380f0c6255498abedc66ce7",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x0b580cdca4b5a562a85801f2e45bd99e764124b9715915fd4bfc6f6eb483ef96",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1d8",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x1270",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x35f103c6c3cfc385bf9f512f7b4d7903e314b60cb715df196cf574391b8506df",
+ "transactions": [
+ "0xf88382017a08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa05c8cad8eec0edc7394b3bace08088ee19b7eacb754b0a5695fc52a0cd17c19f6a0033d27e9eeb87fa5ae4868a14d0b66d941f0ffa3a3781e60cbb751bab7b507da"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x96eea2615f9111ee8386319943898f15c50c0120b8f3263fab029123c5fff80c"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np473",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x35f103c6c3cfc385bf9f512f7b4d7903e314b60cb715df196cf574391b8506df",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd08b438590148463c602be8f8899fd6c2cb42972fe2df0e71cb42ebefea3f404",
+ "receiptsRoot": "0x307ca5ba4dfd34e9f362cea8e1f54ff58f9318a35cf7e1ae24823d41572d7742",
+ "logsBloom": "0x00000000000000000000000000000000800000000000000000008000000000000000000000040000000000000000100000000000000000000000000000000001000000000000000000000400000000000000000000000000300000000001000000002040000000000000008000000000000000000000000000000000000100000010000000000000000401000000000000000000000000000000000000000080000000000058400000000400000800000000000000000000000000000000000001000000000000000000000000004000000000000100100000000000000000000000000000000200400000000000100000000000002000040000000000100000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1d9",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x127a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x1f50e2662ba03c36242e9717f767077fd0d1659ed1a5e2e5024bf1a9de6303f1",
+ "transactions": [
+ "0xf87a82017b0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa06cfb2ecb740895c1bdd352c502898651d83d35cb17ec4a0b30b04fe190a05758a02606cabbaa5b1d57ff9da73837cff8cbd03f242b83880f8cf3ba6f0ee907d538"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x68725bebed18cd052386fd6af9b398438c01356223c5cc15f49093b92b673eff"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np474",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x1f50e2662ba03c36242e9717f767077fd0d1659ed1a5e2e5024bf1a9de6303f1",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6d86e3351111e6c2d4eafc36553273c03636a22fae54a9e076be2e7cb0cdf9d7",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1da",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x1284",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xa3baf412ffd440d9baceb4d19fc213652de91fee569633fb5f8f77b737dd23f3",
+ "transactions": [
+ "0xf86582017c088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a044380da66c7033fceaa15191e7549bd08fed4c16f96cf1282b2f39bccaad1ff0a00d036ed4649f8300b82a534b03a19b4547784997b61328ba41dd7fa5380de99b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe2f1e4557ed105cf3bd8bc51ebaa4446f554dcb38c005619bd9f203f4494f5dd"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np475",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa3baf412ffd440d9baceb4d19fc213652de91fee569633fb5f8f77b737dd23f3",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x4e2eff0a0a0cfaa9726ffd557089d4a85855fabe4b81334326bd400289f5ed12",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1db",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x128e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xa63c5dedb28356376c60a58b8b766be086203e9b8d9c016e0863fd4e8cf42a06",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e82017d01088252089445dcb3e20af2d8ba583d774404ee8fedcd97672b0180c001a0d3b69c226bf73db84babb6185a83b0dd491467adfc01d279df4c09d5d2d3fba4a0368ddb772caa32963df97961cf8ef0db33e0df5945000f0e39d9a288bd73ee30"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x48ef06d84d5ad34fe56ce62e095a34ea4a903bf597a8640868706af7b4de7288"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np476",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa63c5dedb28356376c60a58b8b766be086203e9b8d9c016e0863fd4e8cf42a06",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x3de8e5ff6961615b029591cbe9ea51723c809d965421da4f3f8ae26ffe59d69d",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1dc",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x1298",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xbcf5e09e90541f9a8e36eca4ce43a64e1e05e93f4aba193be8e2da860b5ba0bc",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x4f",
+ "validatorIndex": "0x5",
+ "address": "0x2e350f8e7f890a9301f33edbf55f38e67e02d72b",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x5c57714b2a85d0d9331ce1ee539a231b33406ec19adcf1d8f4c88ab8c1f4fbae"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np477",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xbcf5e09e90541f9a8e36eca4ce43a64e1e05e93f4aba193be8e2da860b5ba0bc",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x6eb0d2ff3e3dd2cdaad61b121b06afcf7863f34152ecbdf8b8773604630a56b3",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1dd",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x12a2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xd5c167589a4663ae0585e5fff8fe256f35baaa26843df17dedcf6040709d6257",
+ "transactions": [
+ "0xf88382017e08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a0939d9f6f260f24b45073aeabe00660f617f1dbfcf522cd6c90ef189dfc9dbfa0a02dfd90c6f1a6822039b8fbd5bff435e939882da970ed1b58a4639eddcb79b23b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x204299e7aa8dfe5328a0b863b20b6b4cea53a469d6dc8d4b31c7873848a93f33"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np478",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xd5c167589a4663ae0585e5fff8fe256f35baaa26843df17dedcf6040709d6257",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xfadd61dbce8d90cae8144c1b2297209079517cb13f3a4e60a6c8f2ea7b4d3770",
+ "receiptsRoot": "0x3ec27c047700a74288e3ee48062fed9fbba71b1704febedea9f4e9e3a92faabf",
+ "logsBloom": "0x00100000000000000000000040004000000000000800008080000000000000100000000000000001000000000000000000000000000004000008000008200000002000004000000400000000000000000000000008000000000000000000004000000000000000000000000040000000800004000000000000400000000000000000001000000000000000000410010000000000000000000400000000020000000000000000000100000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010080000000000000000100000000000800000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1de",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x12ac",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xb061affdd716a0d4c5d081a1c3659d0201dce5c698ae942440565ca789e55b00",
+ "transactions": [
+ "0xf87a82017f0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a0dffee1543462b1d024b5d54728f2e3284d90d8fd24b94fd96bd027b4ca51e768a02ed5ddd2050f1b7bcbc123e31fb0536fbf1661a8f7541c7a10729e8a505cc080"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xb74eea6df3ce54ee9f069bebb188f4023673f8230081811ab78ce1c9719879e5"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np479",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xb061affdd716a0d4c5d081a1c3659d0201dce5c698ae942440565ca789e55b00",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x931dde8f1566d5b88162261e5f8c8fede3f14bfab1c11934aae8f2a38aca7b36",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1df",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x12b6",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xd8fd694b37ff2f40373350baa6cbf326e675330a7d070dedf57065b72304aece",
+ "transactions": [
+ "0xf865820180088302088a808090435b8080556001015a6161a8106001578718e5bb3abd109fa0c2e07d6867be2220a74a18404d2b9b9adb2f6b1764907aaec954f46e0b9fd18aa01504fbbb49a910d6469e64741d99ea5031c14d4721e488998ef2f594022f34e2"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xaf5624a3927117b6f1055893330bdf07a64e96041241d3731b9315b5cd6d14d7"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np480",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xd8fd694b37ff2f40373350baa6cbf326e675330a7d070dedf57065b72304aece",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x452e515470ad9f96543d5a469c85e77c4f675f70a56662537491b01528898b99",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1e0",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x12c0",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xee3a60bb251ec04e27e020f297aa6f159dad08673e76b280e67114583478aec9",
+ "transactions": [
+ "0xf868820181088252089450996999ff63a9a1a07da880af8f8c745a7fe72c01808718e5bb3abd109fa0f06ad492cdd04b44f321abe9cb98e5977f03909173e4b6361f50d44c080f9d6aa07fdc23c04fab8e0a576e6896b13a661b2dcb256cf8ca42fa21f0f370097a53a4"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc657b0e79c166b6fdb87c67c7fe2b085f52d12c6843b7d6090e8f230d8306cda"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np481",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xee3a60bb251ec04e27e020f297aa6f159dad08673e76b280e67114583478aec9",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa424a562451b0728dc1451b83451fb65f9cad240a6e12ae45314a3c0fc49c4bd",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1e1",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x12ca",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xe261b4fbd07d32f5f19564c572258acbe4be1a6b2ea03a57ccbb94e254f37cd5",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x50",
+ "validatorIndex": "0x5",
+ "address": "0xc57aa6a4279377063b17c554d3e33a3490e67a9a",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xa0e08ceff3f3c426ab2c30881eff2c2fc1edf04b28e1fb38e622648224ffbc6b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np482",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe261b4fbd07d32f5f19564c572258acbe4be1a6b2ea03a57ccbb94e254f37cd5",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x5a1ad989a90bb48e30208fafcd5131d4dec171928eb27a8ab446df6086df0f94",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1e2",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x12d4",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xe8f039d9e217e95c5622ac64609dcaaa54abbf24376fe6c65a29d2b50060cff1",
+ "transactions": [
+ "0xf88382018208830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd10a0a085873eb64b12c743e5652beb56056bd656368a87247a72b159667d4755d7a714a0134397c5062d25029e41def2275efe8c56e466e3a1547d3525533e29641d203f"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc9792da588df98731dfcbf54a6264082e791540265acc2b3ccca5cbd5c0c16de"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np483",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe8f039d9e217e95c5622ac64609dcaaa54abbf24376fe6c65a29d2b50060cff1",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x54928b5673094b4ce9833ecf8c1490381f0317ac2e9d51f47673e386b82ae93d",
+ "receiptsRoot": "0xeda5fd4b20fab5a0732205bfe235b5b212cfa5eb525752ae8b9bb0ca224262ec",
+ "logsBloom": "0x04000000000420002000000000000000020000000000000000000000000000000000000000000000000000100000000040000102000000000000000080000000008000000000000000000000900000000000000000000000040000000000000000000000000000000000100000100000000000001000010000000000000000010000000000000001000040000000000000000000000000000100000000000000000000000020010000000008000000000002000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000080000000400000000000010000000000000000000000000000000002020000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1e3",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x12de",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x4b31828b7c27c371fdbc62a7b0b6807d1050d15ad53736f73c4063b391aa8b91",
+ "transactions": [
+ "0xf87a8201830883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a05c87beb281558e43744b39a1d0b62e75dfb5ea245fd2d66c657ff053fa5c45e1a077a1c629133272d7fef83436c8f67f327fc77bedea95009b3d569a5f03485b50"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc74f4bb0f324f42c06e7aeacb9446cd5ea500c3b014d5888d467610eafb69297"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np484",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x4b31828b7c27c371fdbc62a7b0b6807d1050d15ad53736f73c4063b391aa8b91",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf92302c8ac6987ab39ddc9a7413f552337da61d611a086900a5e47b9b3c1422f",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1e4",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x12e8",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x56c5997ee01e4a2bad320a6af0120843f01908c525450d04458eca33799e7958",
+ "transactions": [
+ "0xf865820184088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a0ef66b5859d5e5be7e02ce0b7d103b957ceba18d69047aec94746e87945b7230ba071c5785cce709e44dd94db5684b4e552e343a44862fba233c49a3fa99b0d63f9"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x1acd960a8e1dc68da5b1db467e80301438300e720a450ab371483252529a409b"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np485",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x56c5997ee01e4a2bad320a6af0120843f01908c525450d04458eca33799e7958",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x89822c6bc267d77690ae905ebc8dbe9426f9a83764224d4bc9624104881db28e",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1e5",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x12f2",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xa5d5571bc983cefbe29844e1914f948256b70833f1e99d8dcb0282e1f9dbbfef",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e820185010882520894913f841dfc8703ae76a4e1b8b84cd67aab15f17a0180c080a0d4b8d15fc05f29b58f0459b336dc48b142e8d14572edad06e346aa7728491ce8a064c8078691ba1c4bb110f6dff74e26d3c0df2505940558746a1c617091ddc61a"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x6cef279ba63cbac953676e889e4fe1b040994f044078196a6ec4e6d868b79aa1"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np486",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xa5d5571bc983cefbe29844e1914f948256b70833f1e99d8dcb0282e1f9dbbfef",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xe88ebfc2a7990356801a2e5a308418fa8fe4445548fafe8227f4382f64ad8597",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1e6",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x12fc",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x686566b93e0b0c5d08d2de9e0547a5639e6878d15c59baab066c48365ce7e350",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x51",
+ "validatorIndex": "0x5",
+ "address": "0x311df588ca5f412f970891e4cc3ac23648968ca2",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x60eb986cb497a0642b684852f009a1da143adb3128764b772daf51f6efaae90a"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np487",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x686566b93e0b0c5d08d2de9e0547a5639e6878d15c59baab066c48365ce7e350",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xb852ee14e385a383f894d49c4dabd2d0704216e924283102b9b281ae5306a291",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1e7",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x1306",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xc005c46cb9de70c37edd02e3ae623bb8b6e4160674fafbbd34a802f85d2725b6",
+ "transactions": [
+ "0xf88382018608830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0ddc578e5c190613c2dc0ce34585e98c512fc9b4ae877b0b3f9b85e01a36b90b5a044c7152f99374ce61bb3b9ebb9ec9e5c4f623faa9b8972cf80f891fd45be9bbf"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xc50024557485d98123c9d0e728db4fc392091f366e1639e752dd677901681acc"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np488",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xc005c46cb9de70c37edd02e3ae623bb8b6e4160674fafbbd34a802f85d2725b6",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa3f2cdabc9ec81196b1930e223115ab39e3aa82a3267c2eab58dfcd4ac28879d",
+ "receiptsRoot": "0xa98965822a3cbebe261b9e53038a23e30a7a9ea1878b91ee19c2b9ae55907433",
+ "logsBloom": "0x0000000000000000000000000000000c000000000000000000000000000000000000000000002000000000800000000008000000000000000000000000000000000000000000200200000000002004000000000000000000000000000000000000000000000000000000020000040000000000080000000000004000000000000000000000000000000000000000100000000200000000000000200000000800040000000000000000000000441000000000000000000000000000000000004020400000000000000000000800000000000000002000000000040000000000000000000000000000000000000000000100000000000000400100000200000010",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1e8",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x1310",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xabe558d433bc22296ae2fc7412d05672f2ec66c7940ef6a76f9bb22aa09b219d",
+ "transactions": [
+ "0xf87a8201870883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd10a0a09d84bd49c461dee138a01ba1116ba5a0866c4d398db99b3b6e8ec5119ddaf31da046d87610c10b340e616174c09a5addfb8ef7f1b64dcadf4edd14af37ec74a55c"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xb860632e22f3e4feb0fdf969b4241442eae0ccf08f345a1cc4bb62076a92d93f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np489",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xabe558d433bc22296ae2fc7412d05672f2ec66c7940ef6a76f9bb22aa09b219d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x39ebb75595ae4b664d792fdf4b702a8a4cec3fb1fa62debd297075d3543e05af",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1e9",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x131a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x5591e9a74a56e9765790e3088a82c8e6e39ef0d75071afe13fa51c9b130413db",
+ "transactions": [
+ "0xf865820188088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a06ffd1874ec840566ae82b8a15038ee44b5241705bdb421b459c17100d1300d1aa0121f314d9f41658c831f52b82d4a13b333413d68809cea260e790de9283a434b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x21085bf2d264529bd68f206abc87ac741a2b796919eeee6292ed043e36d23edb"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np490",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x5591e9a74a56e9765790e3088a82c8e6e39ef0d75071afe13fa51c9b130413db",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xa3d5920be7fa102b7b35c191800c65c8b8806bd7c8c04cdc0342a3d28aeafa3c",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1ea",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x1324",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x38cee342db6a91998dd73c4d25bca6d8730977aaa19f0a092d47c00ff10c4edb",
+ "transactions": [
+ "0xf8688201890882520894b47f70b774d780c3ec5ac411f2f9198293b9df7a01808718e5bb3abd10a0a0d33c0cd7f521603ea8deaa363ab591627f5af193759f0aeb8cd9fe4f22a4dd5ca0667bb0ee041403cba2e562882bb9afc43bd560af3c95136c7bf4f1e361355316"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x80052afb1f39f11c67be59aef7fe6551a74f6b7d155a73e3d91b3a18392120a7"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np491",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x38cee342db6a91998dd73c4d25bca6d8730977aaa19f0a092d47c00ff10c4edb",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xf1034fb8a7585c73d7df19cae6b0581d6836278bd57d05fa19f18c6501eace46",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1eb",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x132e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x669efe3cceb25caf14b93a424eaa152070686561e028d50b8adbf87d45f4d18f",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x52",
+ "validatorIndex": "0x5",
+ "address": "0x3f31becc97226d3c17bf574dd86f39735fe0f0c1",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xa3b0793132ed37459f24d6376ecfa8827c4b1d42afcd0a8c60f9066f230d7675"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np492",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x669efe3cceb25caf14b93a424eaa152070686561e028d50b8adbf87d45f4d18f",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x9b830dad01831671e183f743996cc400135e0b324f1270468af08b37e83b8b17",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1ec",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x1338",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x92932a0312ff65482174399e2cd29656c7051fa3747e47a906b54207c4fd1a92",
+ "transactions": [
+ "0xf88382018a08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0e94663b4e19d1c2f86adde879e4cb965b7eda513a542ba26136b7010aae11681a03e7d58f3bef3bba01e70b75c70bc0d070f95bba8994c9f12705f2a5281160f47"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xe69d353f4bc38681b4be8cd5bbce5eb4e819399688b0b6225b95384b08dcc8b0"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np493",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x92932a0312ff65482174399e2cd29656c7051fa3747e47a906b54207c4fd1a92",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xc616c572be45daa3d7eae2481876e5d8f753631f976d4da110a6ad29bdfad30f",
+ "receiptsRoot": "0x78902fbbd0a8ab65f6b731f1145a5f6f467f9fdae375707236cff65e050bbfeb",
+ "logsBloom": "0x00000000002000000000080000000000800000000000000000800000000100000000000000000000000000000000000000000000000004000000000010000000000040000000000010000000000400000000000000000000000000080000000000020000000000000000000000000000000000000000000010000000000000000000000000008000000000000000000000000000000000400000000001000040000000000000000000000000000000000000000040000000040000000880000000008020000000800000008000000000000040020180000000000000000000400800000000000000000000000080000200000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1ed",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x1342",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x52b55abe0e252ea389cc21f01782fd70ca4e4ef6031883f6b79c097de33964d4",
+ "transactions": [
+ "0xf87a82018b0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0fbd0141af6d135ce0949d33ba4beba57e9b7f388c37e9725b762cb61e8db17dea05ecd43ff335efc34b06551202c4223fc39e1c842d4edfad8e46f19bc7a93f57f"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x221e784d42a121cd1d13d111128fcae99330408511609ca8b987cc6eecafefc4"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np494",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x52b55abe0e252ea389cc21f01782fd70ca4e4ef6031883f6b79c097de33964d4",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x7e626fcfe3b1ca7a31dc26a08fbc503c7a85876a64a22a270ec99ef534566c45",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1ee",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x134c",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x5370ce9fa467f03411f240030b4a0b9fcbb05c5b97b09356d071ade6548767e8",
+ "transactions": [
+ "0xf86582018c088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a05a02d5d03439ebbdf2c3b2d98305dda7adbed1ce5549c474b4b9e4f7200d4beaa016d123a1de79c4a654c1d1ab2169ee672c66922fa036e951c60fec9fe4643ee9"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xdcd669ebef3fb5bebc952ce1c87ae4033b13f37d99cf887022428d024f3a3d2e"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np495",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x5370ce9fa467f03411f240030b4a0b9fcbb05c5b97b09356d071ade6548767e8",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x9d90c0fd0677204966d6fdbcafcfacc7fe93a465748d2ce8afbc76b6d9b9bbe1",
+ "receiptsRoot": "0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1ef",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x1356",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x58488c77f4726356a586e999547ffa283a73f17058064f3f56eeb02a5f67b4b4",
+ "transactions": [
+ "0x02f86b870c72dd9d5e883e82018d0108825208946e3d512a9328fa42c7ca1e20064071f88958ed930180c080a0990aa3c805c666109799583317176d55a73d96137ff886be719a36537d577e3da05d1244d8c33e85b49e2061112549e616b166a1860b07f00ff963a0b37c29bcaa"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4dd1eb9319d86a31fd56007317e059808f7a76eead67aecc1f80597344975f46"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np496",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x58488c77f4726356a586e999547ffa283a73f17058064f3f56eeb02a5f67b4b4",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x32f6d8bc2270e39de3a25c3d8d7b31595eef7d3eb5122eece96edf18a7b8290f",
+ "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1f0",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x0",
+ "timestamp": "0x1360",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xe521dace14e46c9d8491f262d38c1741f6fa385466a68c7ceadd08c1515600d3",
+ "transactions": [],
+ "withdrawals": [
+ {
+ "index": "0x53",
+ "validatorIndex": "0x5",
+ "address": "0x6cc0ab95752bf25ec58c91b1d603c5eb41b8fbd7",
+ "amount": "0x64"
+ }
+ ],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x5e1834c653d853d146db4ab6d17509579497c5f4c2f9004598bcd83172f07a5f"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np497",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xe521dace14e46c9d8491f262d38c1741f6fa385466a68c7ceadd08c1515600d3",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0x4e1202b318372f0cacbc989e0aa420c4280dcb8ecd7c3bb05c645bf9fb27d54e",
+ "receiptsRoot": "0x18ff29662320d2c1d830d59b45b908cc2e4b65c1df400d3b8492ba583a1e3342",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1f1",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x146ec",
+ "timestamp": "0x136a",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x3464afae6c8c9839a124b8dba3d363e646b61c9160a61b1c231c67a6a72daff5",
+ "transactions": [
+ "0xf88382018e08830146ec8080ae43600052600060205260405b604060002060208051600101905281526020016102408110600b57506102006040f38718e5bb3abd109fa0d9866a4e71a4efbccc717617f5c712557608513ce8b49f6e24fc06e0d717b7b6a056d3c051f6dbe09a1c94e23499ba8014f74e123caa3252068ee67e8f25e1e323"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x9f78a30e124d21168645b9196d752a63166a1cf7bbbb9342d0b8fee3363ca8de"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np498",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x3464afae6c8c9839a124b8dba3d363e646b61c9160a61b1c231c67a6a72daff5",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xd04a20f359c38d0cb7a31e5e7b002251c15e0242b864964ddbe9642d1c8f7e30",
+ "receiptsRoot": "0xe40714733f96bc282c17b688a91dfb6d070114fc7bc3f095887afa3567af588c",
+ "logsBloom": "0x00400000000001400400000000000000020000000000000000000000400000000000000000400000000000000000000000040100000000800000000000000000000000000000010000000000000000080000000000000000008100000000000000000000000000000000000000200000300000008000000000000010002000000000000000008000000000000000000000000000000000000000100000000000000000000000000000000004000000000000100001000000480000000000000000000000000000000000000000000000000000440000000000000000000010000000000100000000000000000000000000000000000000000000000000800000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1f2",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0xfc65",
+ "timestamp": "0x1374",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0xf7ad3df877f1a7ac6d94087db3f3e01a80264b0909e681bf9c7d21879df0df5d",
+ "transactions": [
+ "0xf87a82018f0883011f588080a54360005260006020525b604060002060208051600101905260206020a15a612710106009578718e5bb3abd109fa0dd12539d461aa41247581166cecdf2eb60a75ac780929c9e6b982d9625aadc1fa06b813ce4e36c5147759f90672f6e239fab2851a63ac3b998ead89c0ead85589b"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x1f7c1081e4c48cef7d3cb5fd64b05135775f533ae4dabb934ed198c7e97e7dd8"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np499",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0xf7ad3df877f1a7ac6d94087db3f3e01a80264b0909e681bf9c7d21879df0df5d",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xbd38c27a1fad5fb839aad98a9c6719652d1714351f24d786b23bf23076b31ba6",
+ "receiptsRoot": "0x8e47c51ae3cc2e7f29232aac553163472046f2668ba19aa17733e156999a8234",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1f3",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x1d36e",
+ "timestamp": "0x137e",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x96a73007443980c5e0985dfbb45279aa496dadea16918ad42c65c0bf8122ec39",
+ "transactions": [
+ "0xf865820190088302088a808090435b8080556001015a6161a8106001578718e5bb3abd10a0a012969b1c46cb1b69a3fdf15b8bbccc1574572b79b38bf81803c91b0384309545a06d1c09143ad2bfeccbb04d63441058c83b60a5cbfdad87db36421dfcf008cd16"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0x4d40a7ec354a68cf405cc57404d76de768ad71446e8951da553c91b06c7c2d51"
+ ]
+ },
+ {
+ "jsonrpc": "2.0",
+ "id": "np500",
+ "method": "engine_newPayloadV3",
+ "params": [
+ {
+ "parentHash": "0x96a73007443980c5e0985dfbb45279aa496dadea16918ad42c65c0bf8122ec39",
+ "feeRecipient": "0x0000000000000000000000000000000000000000",
+ "stateRoot": "0xea4c1f4d9fa8664c22574c5b2f948a78c4b1a753cebc1861e7fb5b1aa21c5a94",
+ "receiptsRoot": "0x056b23fbba480696b65fe5a59b8f2148a1299103c4f57df839233af2cf4ca2d2",
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "blockNumber": "0x1f4",
+ "gasLimit": "0x47e7c40",
+ "gasUsed": "0x5208",
+ "timestamp": "0x1388",
+ "extraData": "0x",
+ "baseFeePerGas": "0x7",
+ "blockHash": "0x36a166f0dcd160fc5e5c61c9a7c2d7f236d9175bf27f43aaa2150e291f092ef7",
+ "transactions": [
+ "0xf868820191088252089415af6900147a8730b5ce3e1db6333f33f64ebb2c01808718e5bb3abd109fa085b3c275e830c2034a4666e3a57c8640a8e5e7b7c8d0687467e205c037b4c5d7a052e2aa8b60be142eee26f197b1e0a983f8df844c770881d820dfc4d1bb3d9adc"
+ ],
+ "withdrawals": [],
+ "blobGasUsed": "0x0",
+ "excessBlobGas": "0x0"
+ },
+ [],
+ "0xf653da50cdff4733f13f7a5e338290e883bdf04adf3f112709728063ea965d6c"
+ ]
+ }
+]
\ No newline at end of file
diff --git a/cmd/devp2p/internal/ethtest/testdata/txinfo.json b/cmd/devp2p/internal/ethtest/testdata/txinfo.json
new file mode 100644
index 0000000000..8e1d917fb7
--- /dev/null
+++ b/cmd/devp2p/internal/ethtest/testdata/txinfo.json
@@ -0,0 +1,3018 @@
+{
+ "deploy-callenv": {
+ "contract": "0x9344b07175800259691961298ca11c824e65032d",
+ "block": "0x1"
+ },
+ "deploy-callme": {
+ "contract": "0x17e7eedce4ac02ef114a7ed9fe6e2f33feba1667",
+ "block": "0x2"
+ },
+ "randomcode": null,
+ "randomlogs": null,
+ "randomstorage": null,
+ "uncles": {
+ "11": {
+ "hashes": [
+ "0x900edfd7e6de8a4a4ae18d2e7df829de69427e06eb9a381c3fe1e3002a750d75"
+ ]
+ },
+ "16": {
+ "hashes": [
+ "0x750eda0129037fbbcfcbfd6362a60ffbbc53a3f14ba9259cf2ac7f02da2a827c"
+ ]
+ },
+ "21": {
+ "hashes": [
+ "0x763d1a545e23079b4796461f2146cd3b24cc45ceab6e932db010bd2736e45403"
+ ]
+ },
+ "26": {
+ "hashes": [
+ "0x98180f6103a7e303444de4e152e81539ad614d0cd755e0e655715ab676d11e32"
+ ]
+ },
+ "31": {
+ "hashes": [
+ "0x04a8c9b6d23b2ada25bff618036c08bf6428fb35b89bce694607fac697f470e3"
+ ]
+ },
+ "36": {
+ "hashes": [
+ "0x9225da0395e14243f1e626b330ea8fe6afde356e50e8448936a29e1c203d661d"
+ ]
+ },
+ "41": {
+ "hashes": [
+ "0x74a80b9b13a264aff16e9156de67474c916de966327e9e1666fc2027e1bf63ad"
+ ]
+ },
+ "46": {
+ "hashes": [
+ "0xcf2bddf3649c7af6e9c8592aa5fad693f39f46369749e1c7127848d4ae9ff1ec"
+ ]
+ },
+ "51": {
+ "hashes": [
+ "0xeb31c29a94de8cf2fc3d0b80023b716fb5d31cc24d695d606eef2389705ade45"
+ ]
+ },
+ "56": {
+ "hashes": [
+ "0xb3a6af7632306e2dbd56b3bbf0e77d7b5c199053f348c74ce938afae615cd4fe"
+ ]
+ },
+ "6": {
+ "hashes": [
+ "0x97186bc5df663e72934212ab5a7b4449f07f12f44b267e119817791fe0ed66c5"
+ ]
+ },
+ "61": {
+ "hashes": [
+ "0x3a2cf075f456fcf264293a32d41f72506ad8cf9697d6b6d8ab3d8258cdaa90bd"
+ ]
+ },
+ "66": {
+ "hashes": [
+ "0x94d338db2e75740d17df19b0d8a111d5d68b2dfa38819b88929190b4b08b5993"
+ ]
+ },
+ "71": {
+ "hashes": [
+ "0xe9938f6ac90bc4dfdea315ed630b03ad9392b264d362ee1e1b2703fb3db5047a"
+ ]
+ }
+ },
+ "valuetransfer": [
+ {
+ "block": "0x7",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "nonce": "0x5",
+ "to": "0xca358758f6d27e6cf45272937977a748fd88391d",
+ "gas": "0x5208",
+ "gasPrice": "0x1",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x1c",
+ "r": "0x7252efaed5a8dbefd451c8e39a3940dc5c6a1e81899e0252e892af3060fd90ed",
+ "s": "0x30b6bd9550c9685a1175cece7f680732ac7d3d5445160f8d9309ec1ddba414be",
+ "hash": "0xd04f2bb15db6c40aaf1dcb5babc47914b5f6033b2925cb9daa3c0e0dab493fcb"
+ }
+ },
+ {
+ "block": "0xc",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x9",
+ "to": "0xef6cbd2161eaea7943ce8693b9824d23d1793ffb",
+ "gas": "0x5208",
+ "gasPrice": "0x1",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x1160803ff1253dead1d84d68a06cb92fcbb265ddb0edb9a5200b28b8c834ce6b",
+ "s": "0x4f1f42c91a7b177f696fc1890de6936097c205f9dcd1d17a4a83ac4d93d84d9c",
+ "hash": "0x778450f223b07f789e343c18207a3388c01070c2f6a89506f2db4c656bc1a37f"
+ }
+ },
+ {
+ "block": "0x11",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xd",
+ "to": "0x4a64a107f0cb32536e5bce6c98c393db21cca7f4",
+ "gas": "0x5208",
+ "gasPrice": "0x1",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0xea20f9d952a58697ffb40cefcab9627f552c9658b3181498fd706418f89a3360",
+ "s": "0x4988596c88fe69f7d032df8e6f515a618a2c2e30f330febb3b548eb4fc1e8ca2",
+ "hash": "0xc2cffc70d847fbe50a53d618de21a24629b97e8dd4c1bcbf73979b2a48ee16df"
+ }
+ },
+ {
+ "block": "0x16",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x11",
+ "to": "0x7cb7c4547cf2653590d7a9ace60cc623d25148ad",
+ "gas": "0x5208",
+ "gasPrice": "0x1",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0x5f315b1989161bf29054e9e030a05b05b3d7efb4c60e39531b96af1690913f91",
+ "s": "0x6f1d8de5adad6f76ed0d2b4c6885d3a5502c12dae1d124b310e8c8856bd22099",
+ "hash": "0xfa9cd1e12446cd8c23fc76b0ae9beba0ebdc021aa87726b6febcd5ba4a504f01"
+ }
+ },
+ {
+ "block": "0x1b",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x15",
+ "to": "0x77adfc95029e73b173f60e556f915b0cd8850848",
+ "gas": "0x5208",
+ "gasPrice": "0x1",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x148500c79a2f0d59158458da4e3b2a5ace441bf314942243c9e05da3457d394e",
+ "s": "0x2a83c5f921ffddd3c0b2a05999f820d1d03bce9ac9810941bb286c4db4ce9939",
+ "hash": "0xbfeeb9406545ede112801fe48aeaf30c8e2384739e8e585f1c0e726689abc4b8"
+ }
+ },
+ {
+ "block": "0x20",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x19",
+ "to": "0x36a9e7f1c95b82ffb99743e0c5c4ce95d83c9a43",
+ "gas": "0x5208",
+ "gasPrice": "0x1",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x14346079d6d3690f923625efde8933b2ad99c2bfda9310983a21b60e3c261d3c",
+ "s": "0x501ae278f370f3c0283fb04f966b6c501cbee0ad4c784f4187e38fcc38a9ccbb",
+ "hash": "0x792614188c26e2f348ac3223813794c60de97b83a298e84f4bae51dda6de140c"
+ }
+ },
+ {
+ "block": "0x25",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x1d",
+ "to": "0xbbf3f11cb5b43e700273a78d12de55e4a7eab741",
+ "gas": "0x5208",
+ "gasPrice": "0x1",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x86bc86521cc6091198253d75caf394a8e23fd4fb82b48236d29f81a95aeebec5",
+ "s": "0xae9de4ac4265e3f415514905d8f8c747c959771080fa031dc5fd9b7333ffc28",
+ "hash": "0xc44716fcd212d538b2d143ddec3003b209667bfc977e209e7da1e8bf3c5223b8"
+ }
+ },
+ {
+ "block": "0x2a",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x21",
+ "to": "0x684888c0ebb17f374298b65ee2807526c066094c",
+ "gas": "0x5208",
+ "gasPrice": "0x1",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0x88fa9d9bbc92e44b8edcda67ee23aca611deac4cec336b215fb72547a1d0e07e",
+ "s": "0x297c4d7054cb545bee5221a70454b6270e098f39f91bf25c0526aa8c0a0a441c",
+ "hash": "0xc97ceb5b227ade5363592a68c39dcf1788abbf67b2440934b1ae11cf4b19417c"
+ }
+ },
+ {
+ "block": "0x2f",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x25",
+ "to": "0x8a5edab282632443219e051e4ade2d1d5bbc671c",
+ "gas": "0x5208",
+ "gasPrice": "0x1",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0x649b4ad4dcf07bcfba3dd7afd2ce220d0ae463c1bcc891ab1fcae84eca6fcc69",
+ "s": "0x5c69b0ad46c90eee811e4b71ce0aed22f479c207bee813dac8cce07e5a65adae",
+ "hash": "0xaf340a1b347c756a11e331e771d37d9205eada520f4f0d8d27f725d7c196aed1"
+ }
+ },
+ {
+ "block": "0x34",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x29",
+ "to": "0x4b227777d4dd1fc61c6f884f48641d02b4d121d3",
+ "gas": "0x5208",
+ "gasPrice": "0x1",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0x7d015036540013eb6aa141a2475fa1dd88d3bee57a67beaf6ef5de8f40969601",
+ "s": "0x4dc750a08f793ff3105479e7919508d14abe56748698375046b995d86267b18c",
+ "hash": "0x07a2a98ac904bcf4c17a773426b34d2b3120af65b12f9bfd437d48c175f364eb"
+ }
+ },
+ {
+ "block": "0x39",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x2d",
+ "to": "0x19581e27de7ced00ff1ce50b2047e7a567c76b1c",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x27f555e9",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0xde8b08caa214d0087ffd11206d485cb5cde6a6b6a76b390f53d94a8c16691593",
+ "s": "0x14dfe16ec3e37b8c6d3257deaf987b70b0776b97e4213c1f912c367e7d558370",
+ "yParity": "0x1",
+ "hash": "0xa883c918fb6e392a2448ef21051482bfcbeb5d26b7ebfad2a010a40e188cb43b"
+ }
+ },
+ {
+ "block": "0x3e",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x31",
+ "to": "0x62b67e1f685b7fef51102005dddd27774be3fee3",
+ "gas": "0x5208",
+ "gasPrice": "0x14847701",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x6797c616a0fe0fad65b6020fc658541fd25577a3f0e7de47a65690ab81c7a34b",
+ "s": "0x115e6d138f23c97d35422f53aa98d666877d513dbe5d4d8c4654500ead1f4f8f",
+ "hash": "0xb2203865a1a1eace5b82c5154f369d86de851d8c5cd6a19e187f437a1ae28e94"
+ }
+ },
+ {
+ "block": "0x43",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x35",
+ "to": "0x6b23c0d5f35d1b11f9b683f0b0a617355deb1127",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0xa88fcba",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0xdc3f3d86de44ee4dd795ff8ab480f4f5273c8ca61edb4c7561a369c80fbbb983",
+ "s": "0x43a90e087a6f5ba014e17316ec63b97a5a9ada19ab78177c87cb39ded9b37b0d",
+ "yParity": "0x0",
+ "hash": "0x647d637e54f1de1216cdfd83477a067308365c837c6c317febc9d3593907c7cc"
+ }
+ },
+ {
+ "block": "0x48",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x39",
+ "to": "0x44bd7ae60f478fae1061e11a7739f4b94d1daf91",
+ "gas": "0x5208",
+ "gasPrice": "0x568d2fa",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0x50fc2310f542cf90b3376f54d296158f5be7ad852db200f9956e3210c0f8125c",
+ "s": "0x4f880fe872915a7843c37147a69758eff0a93cfaf8ce54f36502190e54b6e5c7",
+ "hash": "0x77050c3fb6b1212cf2f739f781b024b210177b3bcbd5b62e2b3c00f1d41764d1"
+ }
+ },
+ {
+ "block": "0x4c",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x3d",
+ "to": "0x72dfcfb0c470ac255cde83fb8fe38de8a128188e",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x32ca5d0",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x116da1fc19daf120ddc2cc3fa0a834f9c176028e65d5f5d4c86834a0b4fe2a36",
+ "s": "0x17001c3ad456650dd1b28c12f41c94f50b4571da5b62e9f2a95dff4c8c3f61fd",
+ "yParity": "0x0",
+ "hash": "0x3e4639389b6a41ff157523860ffc77eb3e66a31aee867eb4148dcc5ee8b3c66f"
+ }
+ },
+ {
+ "block": "0x50",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x41",
+ "to": "0x5c62e091b8c0565f1bafad0dad5934276143ae2c",
+ "gas": "0x5208",
+ "gasPrice": "0x1dce189",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0xb82a5be85322581d1e611c5871123983563adb99e97980574d63257ab98807d5",
+ "s": "0xdd49901bf0b0077d71c9922c4bd8449a78e2918c6d183a6653be9aaa334148",
+ "hash": "0x9c9de14ea0ce069a4df1c658e70e48aa7baaf64fddd4ab31bf4cb6d5550a4691"
+ }
+ },
+ {
+ "block": "0x55",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x45",
+ "to": "0xa25513c7e0f6eaa80a3337ee18081b9e2ed09e00",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0xf4dd50",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0xe8ac7cb5028b3e20e8fc1ec90520dab2be89c8f50f4a14e315f6aa2229d33ce8",
+ "s": "0x7c2504ac2e5b2fe4d430db81a923f6cc2d73b8fd71281d9f4e75ee9fc18759b9",
+ "yParity": "0x0",
+ "hash": "0xff5e3c25f68d57ee002b3b39229ffba0879390475a00fa67a679b707997df530"
+ }
+ },
+ {
+ "block": "0x5a",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x49",
+ "to": "0xbbeebd879e1dff6918546dc0c179fdde505f2a21",
+ "gas": "0x5208",
+ "gasPrice": "0x7dbb16",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0x2f0119acaae03520f87748a1a855d0ef7ac4d5d1961d8f72f42734b5316a849",
+ "s": "0x182ad3a9efddba6be75007e91afe800869a18a36a11feee4743dde2ab6cc54d9",
+ "hash": "0xd696adb31daca7c3121e65d11dc00e5d5fdb72c227c701a2925dc19a46fbd43e"
+ }
+ },
+ {
+ "block": "0x5f",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x4d",
+ "to": "0xd2e2adf7177b7a8afddbc12d1634cf23ea1a7102",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x408f23",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0x8556dcfea479b34675db3fe08e29486fe719c2b22f6b0c1741ecbbdce4575cc6",
+ "s": "0x1cd48009ccafd6b9f1290bbe2ceea268f94101d1d322c787018423ebcbc87ab4",
+ "yParity": "0x1",
+ "hash": "0x385b9f1ba5dbbe419dcbbbbf0840b76b941f3c216d383ec9deb9b1a323ee0cea"
+ }
+ },
+ {
+ "block": "0x64",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x51",
+ "to": "0x18ac3e7343f016890c510e93f935261169d9e3f5",
+ "gas": "0x5208",
+ "gasPrice": "0x212636",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0x99aba91f70df4d53679a578ed17e955f944dc96c7c449506b577ac1288dac6d4",
+ "s": "0x582c7577f2343dd5a7c7892e723e98122227fca8486debd9a43cd86f65d4448a",
+ "hash": "0xd622bf64af8b9bd305e0c86152721b0711b6d24abe3748e2a8cd3a3245f6f878"
+ }
+ },
+ {
+ "block": "0x69",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x55",
+ "to": "0xde7d1b721a1e0632b7cf04edf5032c8ecffa9f9a",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x11056e",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x2a6c70afb68bff0d4e452f17042700e1ea43c10fc75e55d842344c1eb55e2e97",
+ "s": "0x27c64f6f48cfa60dc47bfb2063f9f742a0a4f284d6b65cb394871caca2928cde",
+ "yParity": "0x0",
+ "hash": "0x47efc21f94ef1ef4e9a7d76d9370713acdf8c2b822ad35409566b9251fb0bf5c"
+ }
+ },
+ {
+ "block": "0x6e",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x59",
+ "to": "0x1b16b1df538ba12dc3f97edbb85caa7050d46c14",
+ "gas": "0x5208",
+ "gasPrice": "0x8bd6d",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0xabbde17fddcc6495e854f86ae50052db04671ae3b6f502d45ba1363ae68ee62c",
+ "s": "0x3aa20e294b56797a930e48eda73a4b036b0d9389893806f65af26b05f303100f",
+ "hash": "0xcf4a0a2b8229fa2f772a90fdef00d073c821c8f56d93bce703007fc5eb528e71"
+ }
+ },
+ {
+ "block": "0x73",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x5d",
+ "to": "0x043a718774c572bd8a25adbeb1bfcd5c0256ae11",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x47cdd",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0x2ae4b3f6fa0e08145814f9e8da8305b9ca422e0da5508a7ae82e21f17d8c1196",
+ "s": "0x77a6ea7a39bbfe93f6b43a48be83fa6f9363775a5bdb956c8d36d567216ea648",
+ "yParity": "0x1",
+ "hash": "0xded7c87461fb84ffd49426b474741c2eace8982edf07af918bf8794415742384"
+ }
+ },
+ {
+ "block": "0x78",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x61",
+ "to": "0x2d711642b726b04401627ca9fbac32f5c8530fb1",
+ "gas": "0x5208",
+ "gasPrice": "0x24deb",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0xb4d70622cd8182ff705beb3dfa5ffa4b8c9e4b6ad5ad00a14613e28b076443f6",
+ "s": "0x676eb97410d3d70cfa78513f5ac156b9797abbecc7a8c69df814135947dc7d42",
+ "hash": "0x9e2b47fc494a2285f98c89949878e11f7c6d47d24ae95bdab2801333ea8d11a7"
+ }
+ },
+ {
+ "block": "0x7d",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x65",
+ "to": "0xd10b36aa74a59bcf4a88185837f658afaf3646ef",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x12eea",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x882e961b849dc71672ce1014a55792da7aa8a43b07175d2b7452302c5b3cac2a",
+ "s": "0x41356d00a158aa670c1a280b28b3bc8bb9d194a159c05812fa0a545f5b4bc57b",
+ "yParity": "0x0",
+ "hash": "0x240efcc882536fad14fcd34be50b508cb4c39b39f1493b8d64682760505b6cf7"
+ }
+ },
+ {
+ "block": "0x82",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x69",
+ "to": "0xa5ab782c805e8bfbe34cb65742a0471cf5a53a97",
+ "gas": "0x5208",
+ "gasPrice": "0x9b8c",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0x78e180a6afd88ae67d063c032ffa7e1ee629ec053306ce2c0eb305b2fb98245e",
+ "s": "0x7563e1d27126c9294391a71da19044cb964fd6c093e8bc2a606b6cb5a0a604ac",
+ "hash": "0xa28d808cbc5ef9e82cd5023ea542fab4052895618b8627c000bb8cc8ccc2e693"
+ }
+ },
+ {
+ "block": "0x87",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x6d",
+ "to": "0x4bfa260a661d68110a7a0a45264d2d43af9727de",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x4fe1",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0xbb105cab879992d2769014717857e3c9f036abf31aa59aed2c2da524d938ff8",
+ "s": "0x3b5386a238de98973ff1a9cafa80c90cdcbdfdb4ca0e59ff2f48c925f0ea872e",
+ "yParity": "0x1",
+ "hash": "0x83adc66f82e98155384ae9ef0e5be253eba9be959a50bcb48a7a3e6df97d6996"
+ }
+ },
+ {
+ "block": "0x8c",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x71",
+ "to": "0x9defb0a9e163278be0e05aa01b312ec78cfa3726",
+ "gas": "0x5208",
+ "gasPrice": "0x2907",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x4adf7509b10551a97f2cb6262c331096d354c6c8742aca384e63986006b8ac93",
+ "s": "0x581250d189e9e1557ccc88190cff66de404c99754b4eb3c94bb3c6ce89157281",
+ "hash": "0x8e285b12f0ec16977055c8bc17008411883af1b5b33883a8128e50ed3e585685"
+ }
+ },
+ {
+ "block": "0x91",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x75",
+ "to": "0x7da59d0dfbe21f43e842e8afb43e12a6445bbac0",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x1513",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x6ca026ba6084e875f3ae5220bc6beb1cdb34e8415b4082a23dd2a0f7c13f81ec",
+ "s": "0x568da83b9f5855b786ac46fb241eee56b6165c3cc350d604e155aca72b0e0eb1",
+ "yParity": "0x0",
+ "hash": "0x41ca48c0312c6d3fc433f9fd363281dae924885f73ab7466f9e8c97d6ea3b993"
+ }
+ },
+ {
+ "block": "0x96",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x79",
+ "to": "0x84873854dba02cf6a765a6277a311301b2656a7f",
+ "gas": "0x5208",
+ "gasPrice": "0xad4",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0xab3202c9ba5532322b9d4eb7f4bdf19369f04c97f008cf407a2668f5353e8a1f",
+ "s": "0x5affa251c8d29f1741d26b42a8720c416f7832593cd3b64dff1311a337799e8f",
+ "hash": "0x7527f1a2c9cad727c70ca0d2117fc52dbfff87962411d0b821e7418a42abd273"
+ }
+ },
+ {
+ "block": "0x9b",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x7d",
+ "to": "0x8d36bbb3d6fbf24f38ba020d9ceeef5d4562f5f2",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x592",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0xf9075613b9069dab277505c54e8381b0bb91032f688a6fe036ef83f016771897",
+ "s": "0x4cb4fc2e695439af564635863f0855e1f40865997663d900bc2ab572e78a70a2",
+ "yParity": "0x1",
+ "hash": "0xab2e87692b96ba3083b497227a9a17671bc5eee7ff12d50b850f442a4cdcd8b5"
+ }
+ },
+ {
+ "block": "0xa0",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x81",
+ "to": "0xc19a797fa1fd590cd2e5b42d1cf5f246e29b9168",
+ "gas": "0x5208",
+ "gasPrice": "0x2de",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x857754afc3330f54a3e6400f502ad4a850a968671b641e271dcb9f68aacea291",
+ "s": "0x7d8f3fb2f3062c39d4271535a7d02960be9cb5a0a8de0baef2211604576369bf",
+ "hash": "0x64f8f0ad9c6526cb33e626626a25b8660a546aefa002692e46cd4d0331cd26ed"
+ }
+ },
+ {
+ "block": "0xa5",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x85",
+ "to": "0x6922e93e3827642ce4b883c756b31abf80036649",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x17b",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x89e6d36baf81743f164397205ded9e5b3c807e943610d5b9adb9cfeb71b90299",
+ "s": "0x3d56c57f842a92a5eb71c8f9f394fe106d993960421c711498013806957fdcaf",
+ "yParity": "0x0",
+ "hash": "0x33b886e4c1c43507a08f0da97d083aa507cf905a90c17ffe20a2a24296f2db31"
+ }
+ },
+ {
+ "block": "0xaa",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x89",
+ "to": "0xbceef655b5a034911f1c3718ce056531b45ef03b",
+ "gas": "0x5208",
+ "gasPrice": "0xc5",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x626dfd18ca500eedb8b439667d9b8d965da2f2d8ffcd36a5c5b60b9a05a52d9f",
+ "s": "0x7271175e4b74032edeb9b678ffb5e460edb2986652e45ff9123aece5f6c66838",
+ "hash": "0xe92638806137815555a0ffe5cc4c2b63b29171fd6f2473736201d8c3c3dbb748"
+ }
+ },
+ {
+ "block": "0xaf",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x8d",
+ "to": "0x5a6e7a4754af8e7f47fc9493040d853e7b01e39d",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x68",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0x8c62285d8318f84e669d3a135f99bbfe054422c48e44c5b9ce95891f87a37122",
+ "s": "0x28e75a73707ee665c58ff54791b62bd43a79de1522918f4f13f00ed4bd82b71b",
+ "yParity": "0x1",
+ "hash": "0x3f9133ad0b7430b124cc4b1213bc3fa72be41a58584ca05e8d863ec728890873"
+ }
+ },
+ {
+ "block": "0xb4",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x91",
+ "to": "0x27952171c7fcdf0ddc765ab4f4e1c537cb29e5e5",
+ "gas": "0x5208",
+ "gasPrice": "0x39",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x76a045602a7de6b1414bdc881a321db0ce5255e878a65513bad6ac3b7f473aa7",
+ "s": "0x1a33017b5bcf6e059de612293db8e62b4c4a3414a7ba057c08dd6172fb78a86c",
+ "hash": "0x201f5041569d4dd9e5cc533867f1864daf1a7ee1a424d703d7aa8a43b07b491d"
+ }
+ },
+ {
+ "block": "0xb9",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x95",
+ "to": "0x04d6c0c946716aac894fc1653383543a91faab60",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x20",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x39c18634a9f085ba0cd63685a54ef8f5c5b648856382896c7b0812ee603cd8a",
+ "s": "0x5ecfde61ea3757f59f0d8f0c77df00c0e68392eea1d8b76e726cb94fb5052b8a",
+ "yParity": "0x0",
+ "hash": "0xf83394fd19018fd54a5004121bc780995f99cb47832ddb11f7c50bf507606202"
+ }
+ },
+ {
+ "block": "0xbe",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x99",
+ "to": "0x478508483cbb05defd7dcdac355dadf06282a6f2",
+ "gas": "0x5208",
+ "gasPrice": "0x13",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x910304dbb7d545a9c528785d26bf9e4c06d4c84fdb1b8d38bc6ee28f3db06178",
+ "s": "0x2ffc39c46a66af7b3af96e1e016a62ca92fc5e7e6b9dbe631acbdc325b7230a1",
+ "hash": "0x586f6726554ffef84726c93123de9fb1f0194dfd55ed7ca3ceae67e27b1f4fef"
+ }
+ },
+ {
+ "block": "0xc3",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x9d",
+ "to": "0xae3f4619b0413d70d3004b9131c3752153074e45",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0xc",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0x7cb73f8bf18eacc2c753098683a80208ac92089492d43bc0349e3ca458765c54",
+ "s": "0x3bf3eb6da85497e7865d119fde3718cdac76e73109384a997000c0b153401677",
+ "yParity": "0x1",
+ "hash": "0xadfacbcb99b52f33c74cbd7c45d1f0d31efc4a3f025f9832cf28e666c79c8e4c"
+ }
+ },
+ {
+ "block": "0xc8",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xa1",
+ "to": "0x7c5bd2d144fdde498406edcb9fe60ce65b0dfa5f",
+ "gas": "0x5208",
+ "gasPrice": "0x9",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x15f510b05236b83a9370eb084e66272f93b4b646e225bdef016b01b3ac406391",
+ "s": "0x3b4a2b683af1cb3ecae367c8a8e59c76c259ce2c5c5ffd1dc81de5066879e4b8",
+ "hash": "0xed00ce6bd533009ddfb39d7735f1e2c468a231cf4c5badb59d1e1234c5fe3794"
+ }
+ },
+ {
+ "block": "0xcd",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xa5",
+ "to": "0x9a7b7b3a5d50781b4f4768cd7ce223168f6b449b",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x4f3e818870a240e585d8990561b00ad3538cf64a189d0f5703a9431bc8fd5f25",
+ "s": "0x312f64dd9ab223877e94c71d83cb3e7fe359b96250d6a3c7253238979dd2f32a",
+ "yParity": "0x0",
+ "hash": "0x883c915c1ef312df1e499ef78d09767a374706d8ec89af9c65c46acd675bf817"
+ }
+ },
+ {
+ "block": "0xd2",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xa9",
+ "to": "0x85f97e04d754c81dac21f0ce857adc81170d08c6",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x547e9550b5c687a2eb89c66ea85e7cd06aa776edd3b6e3e696676e22a90382b0",
+ "s": "0x28cb3ab4ef2761a5b530f4e05ef50e5fc957cfbc0342f98b04aa2882eec906b2",
+ "hash": "0x27d83955c23134e42c9beaa88332f770d09e589354c1047870328b7a2f8612c9"
+ }
+ },
+ {
+ "block": "0xd7",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xad",
+ "to": "0x414a21e525a759e3ffeb22556be6348a92d5a13e",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0x47b3309af68dd86089494d30d3356a69a33aa30945e1f52a924298f3167ab66",
+ "s": "0xb8b7bd6670a8bbcb89555528ff5719165363988aad1905a90a26c02633f8b9",
+ "yParity": "0x1",
+ "hash": "0xb75adb0bd26a8060f67c947b699471d71a66c61f2b8c6903a776c3eca7ad731e"
+ }
+ },
+ {
+ "block": "0xdc",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xb1",
+ "to": "0xfb95aa98d6e6c5827a57ec17b978d647fcc01d98",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0xc71a69f756a2ef145f1fb1c9b009ff10af72ba0ee80ce59269708f917878bfb0",
+ "s": "0x3bfe6a6c41b3fe72e8e12c2927ee5df6d3d37bd94346a2398d4fcf80e1028dde",
+ "hash": "0x0301d78cc4bc0330c468026de4671377a07560c2356293c2af44334e6424361a"
+ }
+ },
+ {
+ "block": "0xe1",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xb5",
+ "to": "0xf031efa58744e97a34555ca98621d4e8a52ceb5f",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0x99b1b125ecb6df9a13deec5397266d4f19f7b87e067ef95a2bc8aba7b9822348",
+ "s": "0x56e2ee0d8be47d342fe36c22d4a9be2f26136dba3bd79fa6fe47900e93e40bf3",
+ "yParity": "0x1",
+ "hash": "0x6e07cf26de1881f062629d9efa026c55b9e8084082086e974ddeb66654cd9530"
+ }
+ },
+ {
+ "block": "0xe6",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xb9",
+ "to": "0x0a3aaee7ccfb1a64f6d7bcd46657c27cb1f4569a",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0xd2aa10777b7c398921921258eeecaff46668278fd6f814ea4edb06f2a1076353",
+ "s": "0x542ef4ed484a1403494238e418bb8d613012871710e72dde77bb1fa877f1fae3",
+ "hash": "0xd77aeb22fbd8f99b75c970995d226b6985f2dcac6f22d65aa5d492d66e90f53f"
+ }
+ },
+ {
+ "block": "0xeb",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xbd",
+ "to": "0xf8d20e598df20877e4d826246fc31ffb4615cbc0",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0xc982933a25dd67a6d0b714f50be154f841a72970b3ed52d0d12c143e6a273350",
+ "s": "0x7a9635960c75551def5d050beee4014e4fef2353c39d300e649c199eebc8fd5e",
+ "yParity": "0x1",
+ "hash": "0x597bc815e8b0c315e692257aabe4ecfce7055fa3659f02dd8444c7d58c9055f3"
+ }
+ },
+ {
+ "block": "0xf0",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xc1",
+ "to": "0xfde502858306c235a3121e42326b53228b7ef469",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0x3d79397e88a64f6c2ca58b5ec7ba305012e619331946e60d6ab7c40e84bf1a34",
+ "s": "0x4278773d2796a0944f6bedadea3794b7ad6a18ffd01496aabf597d4a7cf75e17",
+ "hash": "0xe9c1c01813ee52f2a9b8aa63e200714c7527315caf55d054890c10acc73c6cec"
+ }
+ },
+ {
+ "block": "0xf5",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xc5",
+ "to": "0x27abdeddfe8503496adeb623466caa47da5f63ab",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0xdeade75f98612138653ca1c81d8cc74eeda3e46ecf43c1f8fde86428a990ae25",
+ "s": "0x65f40f1aaf4d29268956348b7cc7fa054133ccb1522a045873cb43a9ffa25283",
+ "yParity": "0x1",
+ "hash": "0x2beff883cd58f8d155069d608dfc47f730a07f1ed361987b008c17a4b8b84a4b"
+ }
+ },
+ {
+ "block": "0xfa",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xc9",
+ "to": "0xaa7225e7d5b0a2552bbb58880b3ec00c286995b8",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x968ae76ffc10f7b50ca349156119aaf1d81a8772683d1c3ed005147f4682694",
+ "s": "0x60f5f10a015e8685a3099140c2cc3ba0dc69026df97fb46748008c08978d162a",
+ "hash": "0x084d5438c574a2332976d95cfae552edb797001b5af69eacf4486538ab4bdbd2"
+ }
+ },
+ {
+ "block": "0xff",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xcd",
+ "to": "0xa8100ae6aa1940d0b663bb31cd466142ebbdbd51",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x54eafef27c71a73357c888f788f1936378929e1cdb226a205644dc1e2d68f32b",
+ "s": "0x59af490b8ef4a4e98a282d9046655fc8818758e2af8ace2489927aaa3890fda3",
+ "yParity": "0x0",
+ "hash": "0xecce661913425dbe38e2d30e7ec20ead32185d76f516525148d2647ee94aac8e"
+ }
+ },
+ {
+ "block": "0x104",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xd1",
+ "to": "0xa8d5dd63fba471ebcb1f3e8f7c1e1879b7152a6e",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x4c1d18013fb8b0554b8aaa549ee64a5a33c98edd5e51257447b4dd3b37f2ade",
+ "s": "0x5e3a37e5ddec2893b3fd38c4983b356c26dab5abb8b8ba6f56ac1ab9e747268b",
+ "hash": "0x0d903532e3740a8fb644943befee0187e6180eb31a327afc73e042ec314c02cc"
+ }
+ },
+ {
+ "block": "0x109",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xd5",
+ "to": "0xac9e61d54eb6967e212c06aab15408292f8558c4",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0x898d514a1f15103335e066d0625c4ec34a69a03480d67dcb3d3fe0f4f932100a",
+ "s": "0x7e130fed862c1482467d112f64fb59e005068b52c291003c908b625b4993e20e",
+ "yParity": "0x1",
+ "hash": "0xdd62d8c48dd14b156b3ea74d123fe3ddd7bc7700d0f189df3761ec7a8d65d1e9"
+ }
+ },
+ {
+ "block": "0x10e",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xd9",
+ "to": "0x653b3bb3e18ef84d5b1e8ff9884aecf1950c7a1c",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0xf1c5d5e335842170288da2c7c7af6856ea0b566d2b4ab4b00a19cb94144d466c",
+ "s": "0x2043677d1c397a96a2f8a355431a59a0d5c40fc053e9c45b6872464f3c77c5dc",
+ "hash": "0x284452da997f42dbe0e511078f5005514fdeda8d0905439fe2f3a5ecc3aec1ac"
+ }
+ },
+ {
+ "block": "0x113",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xdd",
+ "to": "0xd8c50d6282a1ba47f0a23430d177bbfbb72e2b84",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0x4330fe20e8b84e751616253b9bccc5ff2d896e00593bfbef92e81e72b4d98a85",
+ "s": "0x7977b87c7eca1f6a8e4a535cb26860e32487c6b4b826623a7390df521b21eac7",
+ "yParity": "0x1",
+ "hash": "0xd667f29e2cccf282a82791cb46f9181ad04c8179bc11af957c499b3627907a6f"
+ }
+ },
+ {
+ "block": "0x118",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xe1",
+ "to": "0xb519be874447e0f0a38ee8ec84ecd2198a9fac77",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0xcfbd9ff7eeb9aef477970dcba479f89c7573e6167d16d0882ead77b20aaee690",
+ "s": "0x1e34175b1b1758a581ca13f2ca021698933b1e8269c70fcb94c5e4aa39ee9b8e",
+ "hash": "0x935596bc447ea87dca90e3bac15f679129af2c813abe1657811f70dcafe660c2"
+ }
+ },
+ {
+ "block": "0x11d",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xe5",
+ "to": "0xaf2c6f1512d1cabedeaf129e0643863c57419732",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0xc23170a740ba640770aca9fb699a2799d072b2466c97f126a834d86bdb22f516",
+ "s": "0x3f242217b60ab672f352ae51249a8876a034ee51b6b4ad4a41b4d300c48e79f4",
+ "yParity": "0x1",
+ "hash": "0xc659a1be386492afe2ca97cbbe9d1645763b502030c17e3acf9d539e22b74093"
+ }
+ },
+ {
+ "block": "0x122",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xe9",
+ "to": "0xb70654fead634e1ede4518ef34872c9d4f083a53",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0x953d5aa69077225dba6a0333ea4d69a05f652e0d2abb8df492a7e6a9d0cdbe3d",
+ "s": "0x4e41cb847aa131b9bb1e19cb3dd5f7a6cc2ac8b7f459ab8c3061380d41721ff",
+ "hash": "0x6f7f93620049c80ba6429e3c2f7563f7048f725f245c22bcc6de438fd394bb7e"
+ }
+ },
+ {
+ "block": "0x127",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xed",
+ "to": "0xbe3eea9a483308cb3134ce068e77b56e7c25af19",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x190737acd3a2a298d5a6f96a60ced561e536dd9d676c8494bc6d71e8b8a90b60",
+ "s": "0x2c407a67004643eba03f80965fea491c4a6c25d90d5a9fd53c6a61b62971e7c5",
+ "yParity": "0x0",
+ "hash": "0xe48311c620199dfc77bc280caa0a1bcbbd00457b079a7154a6f8bc229beb41f1"
+ }
+ },
+ {
+ "block": "0x12c",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xf1",
+ "to": "0x08037e79bb41c0f1eda6751f0dabb5293ca2d5bf",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0xe3edf14f32e7cacb36fd116b5381fac6b12325a5908dcec2b8e2c6b5517f5ec5",
+ "s": "0x51429c4c1e479fa018b7907e7e3b02a448e968368a5ce9e2ea807525d363f85e",
+ "hash": "0xa960e3583c41a164dc743eac939626f891f20f7dfdf71f204c2f84ca1087ae90"
+ }
+ },
+ {
+ "block": "0x131",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xf5",
+ "to": "0xf16ba6fa61da3398815be2a6c0f7cb1351982dbc",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0x8dac03d829e6f8eab08661cd070c8a58eed41467ad9e526bb3b9c939e3fd4482",
+ "s": "0x2ac7208f150195c44c455ddeea0bbe104b9121fef5cba865311940f4de428eec",
+ "yParity": "0x1",
+ "hash": "0xc7ccef252840e9fc1821f2c2eb0ca8c9508ff3f4c23f85322e09dd9313849694"
+ }
+ },
+ {
+ "block": "0x136",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xf9",
+ "to": "0x17333b15b4a5afd16cac55a104b554fc63cc8731",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0xf2179ec11444804bb595a6a2f569ea474b66e654ff8d6d162ec6ed565f83c1aa",
+ "s": "0x657ed11774d5d4bb0ed0eb1206d1d254735434a0c267912713099336c2dc147a",
+ "hash": "0x45ed5258df6ecd5ba8b99db384e39d22c193662830e79f972547d81e3857cc70"
+ }
+ },
+ {
+ "block": "0x13b",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0xfd",
+ "to": "0xd20b702303d7d7c8afe50344d66a8a711bae1425",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0x67bed94b25c4f3ab70b3aae5cd44c648c9807cdf086299e77cf2977b9bce8244",
+ "s": "0x76661b80df9b49579fce2e2201a51b08ecc4eb503d5f5517ecb20156fde7ec5a",
+ "yParity": "0x1",
+ "hash": "0xa3b085cc524be64d822be105f3bb92c05c773cb93bffc774ba9aac21f9603ce6"
+ }
+ },
+ {
+ "block": "0x140",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x101",
+ "to": "0xdd1e2826c0124a6d4f7397a5a71f633928926c06",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x1f5208621cee9149c99848d808ee0fa8d57b358afbd39dc594f383b7f525f4c6",
+ "s": "0x1960c6254e869f06cfa3263972aa8e7cc79aec12caa728515c420d35b1336c0e",
+ "hash": "0x34671329e36adeee3261ea7313388804f481e6a0e2f77cce6961aed112498803"
+ }
+ },
+ {
+ "block": "0x145",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x105",
+ "to": "0x1219c38638722b91f3a909f930d3acc16e309804",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0x63adb9abb5014935b3dbf8c31059d6f1d9e12068a3f13bd3465db2b5a7f27f98",
+ "s": "0x56f0f5bed39985d0921989b132e9638472405a2b1ba757e22df3276ca9b527fa",
+ "yParity": "0x1",
+ "hash": "0x7bfa3e961b16291e9ee2f4dc0b6489bb0b12ff7a6ed6491c100dd1041472ff9e"
+ }
+ },
+ {
+ "block": "0x14a",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x109",
+ "to": "0x1f5746736c7741ae3e8fa0c6e947cade81559a86",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0xedd3402a6c7a96114e4c8520d7bf3f06c00d9f24ee08de4c8afdbf05b4487b7d",
+ "s": "0x68cd4cf2242a8df916b3594055ee05551b77021bbea9b9eb9740f9a8e6466d80",
+ "hash": "0x90ea391ff615d345ad4e35e53af26e283fc2fd9ecb3221a9610fb2a376c38caf"
+ }
+ },
+ {
+ "block": "0x14f",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x10d",
+ "to": "0x9ae62b6d840756c238b5ce936b910bb99d565047",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x25cc19f12be3ff2a51342412dc152953e8e8b61c9c3858c9d476cc214be4e30",
+ "s": "0x193960b0d01b790ef99b9a39b7475d18e83499f1635fc0a3868fc67c4da5b2c3",
+ "yParity": "0x0",
+ "hash": "0xa1ea0831d6727a0e7316822d3cc3815f1e2ba71e124fcd8b886610d5d42fd5ff"
+ }
+ },
+ {
+ "block": "0x154",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x111",
+ "to": "0xb55a3d332d267493105927b892545d2cd4c83bd6",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0x73cc84153b8891468325ac12743faf7e373b78dbf8b9f856cb2622c7b4fd10e1",
+ "s": "0x388714fe9d2f85a88b962e213cbe1fa3c4a9823cea051cf91c607ecbd90093d8",
+ "hash": "0xd30ff6e59e0e1278dab8083cb01e1e66900adc72cc4263cbdffc98e08a728b89"
+ }
+ },
+ {
+ "block": "0x159",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x115",
+ "to": "0xb68176634dde4d9402ecb148265db047d17cb4ab",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x9f3175e9aa2fe2332600b71de0b0977c7c60ccbeee66ea360226326817f2d59b",
+ "s": "0x6a870e0876002f789b3203f4a33d5e621ac67051704e1f2260b80d816260b3e6",
+ "yParity": "0x0",
+ "hash": "0x5565d4f07ad007f4bfe27837904f2ce365cff6c036aa5169df651f217944b1f4"
+ }
+ },
+ {
+ "block": "0x15e",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x119",
+ "to": "0xdfe052578c96df94fa617102199e66110181ed2c",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x20ee6a1ada31c18eac485e0281a56fc6d8c4152213d0629e6d8dd325adb60b1",
+ "s": "0xf72e01c463b98817219db62e689416c510866450efc878a6035e9346a70795f",
+ "hash": "0x9055a34f1c764ce297f1bce6c94680a0e8d532debeb6af642c956122f4c7d079"
+ }
+ },
+ {
+ "block": "0x163",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x11d",
+ "to": "0x33fc6e8ad066231eb5527d1a39214c1eb390985d",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0x167190e2e0fed95ab5c7265a53f25a92d659e1d46eb9ecbac193e7151b82ec1c",
+ "s": "0x269353e9c5ef331135563e2983279669220687652e7f231725303ccf7d2a8ebd",
+ "yParity": "0x1",
+ "hash": "0x0aa77f1fa0e9ab541616fb3104788109f84010d4b410508e5779f052ee49c5b9"
+ }
+ },
+ {
+ "block": "0x168",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x121",
+ "to": "0x662fb906c0fb671022f9914d6bba12250ea6adfb",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0xd3a858be3712102b61ec73c8317d1e557043f308869f4a04e3a4578e2d9aa7e7",
+ "s": "0x202a5f044cc84da719ec69b7985345b2ef82cf6b0357976e99e46b38c77fe613",
+ "hash": "0x01bdc2fb7f53293c98e430dc42b1ef18773493f0f1bd03460eb45e438168048d"
+ }
+ },
+ {
+ "block": "0x16d",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x125",
+ "to": "0xf1fc98c0060f0d12ae263986be65770e2ae42eae",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x6563737b6bfddfb8bc5ec084651a8e51e3b95fe6ed4361065c988acaf764f210",
+ "s": "0xa96a1747559028cd02304adb52867678419ebef0f66012733fea03ee4eae43b",
+ "yParity": "0x0",
+ "hash": "0x36cf0f21e046b484333889a22e4880ad05807f2922340e6e822591cfa5138815"
+ }
+ },
+ {
+ "block": "0x172",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x129",
+ "to": "0xa92bb60b61e305ddd888015189d6591b0eab0233",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x626bd8978288bcf1d7719926fba91597d6aa8ead945c89044693d780523a05dd",
+ "s": "0x74494ccf5362aa73db798940296b77b80a7ec6037f5ed2c946094b9df8a2347",
+ "hash": "0x8cb5e311a3e79a31c06afaecbbf9c814759f039f55b06ead4e8a1c2933766c8c"
+ }
+ },
+ {
+ "block": "0x177",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x12d",
+ "to": "0x469542b3ece7ae501372a11c673d7627294a85ca",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x9add65921c40226ee4a686b9fa70c7582eba8c033ccc9c27775c6bc33c9232fb",
+ "s": "0x21a6e73ccb2f16e540594b4acbba2c852a3e853742359fcbc772880879fe1197",
+ "yParity": "0x0",
+ "hash": "0x55c8ee8da8d54305ca22c9d7b4226539a60741ed599327d33013f8d0385c61bd"
+ }
+ },
+ {
+ "block": "0x17c",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x131",
+ "to": "0x7f2dce06acdeea2633ff324e5cb502ee2a42d979",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0xfd195ea41804b21ffffdbca38fd49a9874371e51e81642917d001d201a943e24",
+ "s": "0x542bca46a2dc92fddb9abffcf2b3e78dc491d6e95040692e6d1446a6b487a42a",
+ "hash": "0x3964c50008f0dce6974ef2c088a84207191eb56ab4ac86cbf5d149a661ecb479"
+ }
+ },
+ {
+ "block": "0x181",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x135",
+ "to": "0x3bcc2d6d48ffeade5ac5af3ee7acd7875082e50a",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x3931e5e7d02ed045834da39a409083c260fbc96dc256c1d927f1704147eeaeb6",
+ "s": "0x215269010bb3e7dd8f03d71db3e617985b447c2e0dd6fc0939c125db43039d0f",
+ "yParity": "0x0",
+ "hash": "0x23583194a4443b0144115327770bf71f645283515ca26fc775dd23244a876e83"
+ }
+ },
+ {
+ "block": "0x186",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x139",
+ "to": "0xf83af0ceb5f72a5725ffb7e5a6963647be7d8847",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0xa38cf9766454bd02d4f06f5bd214f5fe9e53b7a299eda5c7523060704fcdb751",
+ "s": "0x67c33351f6f7bbd9de5b5435f6cadc10ba5e94f3cbcc40ee53496c782f99d71f",
+ "hash": "0x41019c72018f2f499368e96aed89293b24873f611018c3787eeb81a0a01b667b"
+ }
+ },
+ {
+ "block": "0x18b",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x13d",
+ "to": "0x469dacecdef1d68cb354c4a5c015df7cb6d655bf",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0x6faf4090490862eba3c27dfe0a030a442ccc89d4478eca3ed09039386554f07b",
+ "s": "0x656f741b64c54808ac5a6956540d3f7aaec811bf4efa7239a0ca0c7fb410b4d6",
+ "yParity": "0x1",
+ "hash": "0x054500013715ec41cb39492f2856925c7f22f80fd22365f19de8124b14e77e90"
+ }
+ },
+ {
+ "block": "0x190",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x141",
+ "to": "0xf14d90dc2815f1fc7536fc66ca8f73562feeedd1",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x4a18131d30b0344910cae7c41ee5c1c23171c40292d34e9a82c9c7cef3d3836a",
+ "s": "0x598a3835ad1903c3d7ad158c57ff0db10e12d8acbef318ddd0514f671a08ce94",
+ "hash": "0x1b562d975247f54df92dc775c61ef8fb004714fd57d0c804dd64e44be2f10cb5"
+ }
+ },
+ {
+ "block": "0x195",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x145",
+ "to": "0x360671abc40afd33ae0091e87e589fc320bf9e3d",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x9b0a44741dc7e6cb0f88199ca38f15034fab4164d9055788834e8123b7264c87",
+ "s": "0x2c38a3ecda52aebc3725c65ee1cd0461a8d706ddfc9ed27d156cf50b61ef5069",
+ "yParity": "0x0",
+ "hash": "0x3e3bec1253082bf314cb1155ef241912bc842b8ced86b70e5e3b24585a130d66"
+ }
+ },
+ {
+ "block": "0x19a",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x149",
+ "to": "0x579ab019e6b461188300c7fb202448d34669e5ff",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0xde600e017080351550412ac87f184ec2c3f672e08f1c362ab58b94631e8864dc",
+ "s": "0x47d41b8691a1f7f8818e59ad473451a0edfc88826a6b808f84f56baed90d5634",
+ "hash": "0x519fbf530d16289510ebb27b099ad16ad03e72227497db7a62e6c0e89d3a708a"
+ }
+ },
+ {
+ "block": "0x19f",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x14d",
+ "to": "0x88654f0e7be1751967bba901ed70257a3cb79940",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0xa79b0ff9846673061d1b90a17cd8bd9e7c7f62b99b39fbe4749777d3ed4544e0",
+ "s": "0x750ecfe9895402861ebea87e9b483b2c116bc2d4920329aa1c29efb9dcdf47e6",
+ "yParity": "0x1",
+ "hash": "0x6364bf260fee1aea143ec4a4c596d64e15252f8fa4c7ab7ae69d51ff4cbd343b"
+ }
+ },
+ {
+ "block": "0x1a4",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x151",
+ "to": "0x47e642c9a2f80499964cfda089e0b1f52ed0f57d",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0xc37c23a91d6abced211855a2d6d5e383f54aa6ff40c26abc5f27a22cdafa5618",
+ "s": "0x190f82ff101eabad8b9c7041006dcb3e3a9a85c814938bef8ec7d1aa63fa5892",
+ "hash": "0x2ee70986d957daba62588ac40c9bf75f6707a34dc5ef5897ae7cd3998f2e05bc"
+ }
+ },
+ {
+ "block": "0x1a9",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x155",
+ "to": "0xd854d6dd2b74dc45c9b883677584c3ac7854e01a",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x7a17de801de3309b57dd86df30b61553d5c04071581d243f33f43c4d64930e09",
+ "s": "0x75f7e820212e8f96d7583c66548719db621537fe20f7568d5ee62176881b70e8",
+ "yParity": "0x0",
+ "hash": "0xbaf8e87ba94a0d70e37443c4475b2525806827b3ae964b30eb4dad7936b2eb6e"
+ }
+ },
+ {
+ "block": "0x1ae",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x159",
+ "to": "0xc305dd6cfc073cfe5e194fc817536c419410a27d",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x163f29bc7be2e8fe3c6347fe4de06fa7330e3a3049c0e9dcded1795ff1c1e810",
+ "s": "0x4ea7492a5e457fd21252166f5a5d5d9d5e5c7a19da2c7fd4a822bf60156b91a9",
+ "hash": "0x4a84eeb0addd194ae92631aa43ed4f4fece16258bcbbc91de6324e20bde0f914"
+ }
+ },
+ {
+ "block": "0x1b3",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x15d",
+ "to": "0x2143e52a9d8ad4c55c8fdda755f4889e3e3e7721",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0x673c5473955d0d26d49b25b82af905ee33ba365178f44dc4ac39221efec23c88",
+ "s": "0x17f46fc9b15ba0c1ea78d4d9f773582d94f61f6471f2918cb0598f33eb9bc89b",
+ "yParity": "0x1",
+ "hash": "0x01b1e85401ca88bc02c33956d0bfeea9ec0b6c916f1478d4eae39818e999cb74"
+ }
+ },
+ {
+ "block": "0x1b8",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x161",
+ "to": "0x0fe037febcc3adf9185b4e2ad4ea43c125f05049",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0x654dc39f93a879b9aec58ace2fdbd5c47e383cae2d14f1a49f6ec93d539be892",
+ "s": "0x70505a0ef2e83f057e9844dbd56eda0949197f0c4a2b6d0f2979db1710fca4ed",
+ "hash": "0xf8c7948d4418ad9948d7352c6c21dcb5b7f72664dfcfe553dfc444df7afc9c0b"
+ }
+ },
+ {
+ "block": "0x1bd",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x165",
+ "to": "0x046dc70a4eba21473beb6d9460d880b8cfd66613",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x9a954eff1b0e590a3a78b724b687c6ab944181990998780d56cc3593c704996e",
+ "s": "0x418db96b5dc1057f6acb018244f82ed6ece03d88c07f6ae767eaebe3b7ac9387",
+ "yParity": "0x0",
+ "hash": "0xf09a7e0da3b14049923d019fb5d457531ddaa4456cf84124a17479b0bfd6261b"
+ }
+ },
+ {
+ "block": "0x1c2",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x169",
+ "to": "0x104eb07eb9517a895828ab01a3595d3b94c766d5",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0x597dbb3f69603be721ae0f2a63eeee9f008829ff273b54243673f9ea192ddc0a",
+ "s": "0x1f7dd04defb45af840d46a950b8bede0b3ce8a718004c1ca2f3bbd4efcbd7563",
+ "hash": "0x00c458459a2d2f501907a6a4122fba7ae70fb3ef632676e492912231022f80c8"
+ }
+ },
+ {
+ "block": "0x1c7",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x16d",
+ "to": "0x46b61db0aac95a332cecadad86e52531e578cf1f",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x774ced5c8674413b351ae8ac3b96705d1d3db10deae39134572be985f16c008b",
+ "s": "0x6f3e4b250f84fcf95ae85946da8a1c79f922a211dbe516fcfcff0180911429b8",
+ "yParity": "0x0",
+ "hash": "0x6603c100a34224ddb8aaeb9e234f0c611d40a5df807de68803b71e0ff0f3aea8"
+ }
+ },
+ {
+ "block": "0x1cc",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x171",
+ "to": "0x8a817bc42b2e2146dc4ca4dc686db0a4051d2944",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0xa755d1c641b8965ea140ad348135496fc412ffa43a72bbd2c7c0e26b814a75f1",
+ "s": "0x67d81cca370b6ea40ccd2ad3662d16fa36bd380845bee04c55c6531455d0687d",
+ "hash": "0x46e00cb4ede9be515c8910a31881df229ebb2804722ad9d6723e1101a87f1889"
+ }
+ },
+ {
+ "block": "0x1d1",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x175",
+ "to": "0x23e6931c964e77b02506b08ebf115bad0e1eca66",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x6263b1d5b9028231af73bfa386be8fc770e11f60137428378137c34f12c2c242",
+ "s": "0x2b340f5b45217d9b914921a191ce5f7ba67af038e3b3c2c72aaca471412b02f7",
+ "yParity": "0x0",
+ "hash": "0xa5b751caaaff89a472fb427c17ac7637b4a9de7cda34beaaf891516278655479"
+ }
+ },
+ {
+ "block": "0x1d6",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x179",
+ "to": "0x878dedd9474cfa24d91bccc8b771e180cf01ac40",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x515a62775619f55c366d080a7c397ea42dcfd2fdcce1862ef98dab875077f367",
+ "s": "0x23756d4f3bd644dde1c25f8cde45fbea557dacf0492bbecb409f6b2cdacbb9b8",
+ "hash": "0x2e232fb6d73423c9dcaff38257d36fcad74a2c627a70030b43a0bed36d136625"
+ }
+ },
+ {
+ "block": "0x1db",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x17d",
+ "to": "0x45dcb3e20af2d8ba583d774404ee8fedcd97672b",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x1",
+ "r": "0xd3b69c226bf73db84babb6185a83b0dd491467adfc01d279df4c09d5d2d3fba4",
+ "s": "0x368ddb772caa32963df97961cf8ef0db33e0df5945000f0e39d9a288bd73ee30",
+ "yParity": "0x1",
+ "hash": "0xc80615944f9bfeb945b7416052667eec0a78b2f3beb7c2811ebb9e9210e45c4c"
+ }
+ },
+ {
+ "block": "0x1e0",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x181",
+ "to": "0x50996999ff63a9a1a07da880af8f8c745a7fe72c",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0xf06ad492cdd04b44f321abe9cb98e5977f03909173e4b6361f50d44c080f9d6a",
+ "s": "0x7fdc23c04fab8e0a576e6896b13a661b2dcb256cf8ca42fa21f0f370097a53a4",
+ "hash": "0x8c1f1466ce25a97e88ab37bc9b5362eaf95fb523fb80d176429fa41c2fa2d629"
+ }
+ },
+ {
+ "block": "0x1e5",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x185",
+ "to": "0x913f841dfc8703ae76a4e1b8b84cd67aab15f17a",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0xd4b8d15fc05f29b58f0459b336dc48b142e8d14572edad06e346aa7728491ce8",
+ "s": "0x64c8078691ba1c4bb110f6dff74e26d3c0df2505940558746a1c617091ddc61a",
+ "yParity": "0x0",
+ "hash": "0x969e178ea1a76626b96bf06e207edb6299c36c6a14e46462960832feb93f6d42"
+ }
+ },
+ {
+ "block": "0x1ea",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x189",
+ "to": "0xb47f70b774d780c3ec5ac411f2f9198293b9df7a",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd10a0",
+ "r": "0xd33c0cd7f521603ea8deaa363ab591627f5af193759f0aeb8cd9fe4f22a4dd5c",
+ "s": "0x667bb0ee041403cba2e562882bb9afc43bd560af3c95136c7bf4f1e361355316",
+ "hash": "0xa35c19e4e8154c35656544b92e88fb62c4210e38f09608248e2a99841ac99964"
+ }
+ },
+ {
+ "block": "0x1ef",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x2",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x18d",
+ "to": "0x6e3d512a9328fa42c7ca1e20064071f88958ed93",
+ "gas": "0x5208",
+ "gasPrice": null,
+ "maxPriorityFeePerGas": "0x1",
+ "maxFeePerGas": "0x8",
+ "value": "0x1",
+ "input": "0x",
+ "accessList": [],
+ "v": "0x0",
+ "r": "0x990aa3c805c666109799583317176d55a73d96137ff886be719a36537d577e3d",
+ "s": "0x5d1244d8c33e85b49e2061112549e616b166a1860b07f00ff963a0b37c29bcaa",
+ "yParity": "0x0",
+ "hash": "0xeb282a48d309db881eead661ee7c64696b2699fa7c431d39a573ecaa0bc31052"
+ }
+ },
+ {
+ "block": "0x1f4",
+ "sender": "0x7435ed30a8b4aeb0877cef0c6e8cffe834eb865f",
+ "tx": {
+ "type": "0x0",
+ "chainId": "0xc72dd9d5e883e",
+ "nonce": "0x191",
+ "to": "0x15af6900147a8730b5ce3e1db6333f33f64ebb2c",
+ "gas": "0x5208",
+ "gasPrice": "0x8",
+ "maxPriorityFeePerGas": null,
+ "maxFeePerGas": null,
+ "value": "0x1",
+ "input": "0x",
+ "v": "0x18e5bb3abd109f",
+ "r": "0x85b3c275e830c2034a4666e3a57c8640a8e5e7b7c8d0687467e205c037b4c5d7",
+ "s": "0x52e2aa8b60be142eee26f197b1e0a983f8df844c770881d820dfc4d1bb3d9adc",
+ "hash": "0x22e616c85493bcd23147d1c9f5dd081b32daf5c7b3e824f61b5fc1bd34a47e67"
+ }
+ }
+ ],
+ "withdrawals": {
+ "101": {
+ "withdrawals": [
+ {
+ "index": "0x4",
+ "validatorIndex": "0x5",
+ "address": "0x3f79bb7b435b05321651daefd374cdc681dc06fa",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "106": {
+ "withdrawals": [
+ {
+ "index": "0x5",
+ "validatorIndex": "0x5",
+ "address": "0x189f40034be7a199f1fa9891668ee3ab6049f82d",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "111": {
+ "withdrawals": [
+ {
+ "index": "0x6",
+ "validatorIndex": "0x5",
+ "address": "0x65c74c15a686187bb6bbf9958f494fc6b8006803",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "116": {
+ "withdrawals": [
+ {
+ "index": "0x7",
+ "validatorIndex": "0x5",
+ "address": "0xe3b98a4da31a127d4bde6e43033f66ba274cab0e",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "121": {
+ "withdrawals": [
+ {
+ "index": "0x8",
+ "validatorIndex": "0x5",
+ "address": "0xa1fce4363854ff888cff4b8e7875d600c2682390",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "126": {
+ "withdrawals": [
+ {
+ "index": "0x9",
+ "validatorIndex": "0x5",
+ "address": "0x7ace431cb61584cb9b8dc7ec08cf38ac0a2d6496",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "131": {
+ "withdrawals": [
+ {
+ "index": "0xa",
+ "validatorIndex": "0x5",
+ "address": "0x5ee0dd4d4840229fab4a86438efbcaf1b9571af9",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "136": {
+ "withdrawals": [
+ {
+ "index": "0xb",
+ "validatorIndex": "0x5",
+ "address": "0x4f362f9093bb8e7012f466224ff1237c0746d8c8",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "141": {
+ "withdrawals": [
+ {
+ "index": "0xc",
+ "validatorIndex": "0x5",
+ "address": "0x075198bfe61765d35f990debe90959d438a943ce",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "146": {
+ "withdrawals": [
+ {
+ "index": "0xd",
+ "validatorIndex": "0x5",
+ "address": "0x956062137518b270d730d4753000896de17c100a",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "151": {
+ "withdrawals": [
+ {
+ "index": "0xe",
+ "validatorIndex": "0x5",
+ "address": "0x2a0ab732b4e9d85ef7dc25303b64ab527c25a4d7",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "156": {
+ "withdrawals": [
+ {
+ "index": "0xf",
+ "validatorIndex": "0x5",
+ "address": "0x6e3faf1e27d45fca70234ae8f6f0a734622cff8a",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "161": {
+ "withdrawals": [
+ {
+ "index": "0x10",
+ "validatorIndex": "0x5",
+ "address": "0x8a8950f7623663222542c9469c73be3c4c81bbdf",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "166": {
+ "withdrawals": [
+ {
+ "index": "0x11",
+ "validatorIndex": "0x5",
+ "address": "0xfe1dcd3abfcd6b1655a026e60a05d03a7f71e4b6",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "171": {
+ "withdrawals": [
+ {
+ "index": "0x12",
+ "validatorIndex": "0x5",
+ "address": "0x087d80f7f182dd44f184aa86ca34488853ebcc04",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "176": {
+ "withdrawals": [
+ {
+ "index": "0x13",
+ "validatorIndex": "0x5",
+ "address": "0xf4f97c88c409dcf3789b5b518da3f7d266c48806",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "181": {
+ "withdrawals": [
+ {
+ "index": "0x14",
+ "validatorIndex": "0x5",
+ "address": "0x892f60b39450a0e770f00a836761c8e964fd7467",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "186": {
+ "withdrawals": [
+ {
+ "index": "0x15",
+ "validatorIndex": "0x5",
+ "address": "0x281c93990bac2c69cf372c9a3b66c406c86cca82",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "191": {
+ "withdrawals": [
+ {
+ "index": "0x16",
+ "validatorIndex": "0x5",
+ "address": "0xb12dc850a3b0a3b79fc2255e175241ce20489fe4",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "196": {
+ "withdrawals": [
+ {
+ "index": "0x17",
+ "validatorIndex": "0x5",
+ "address": "0xd1211001882d2ce16a8553e449b6c8b7f71e6183",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "201": {
+ "withdrawals": [
+ {
+ "index": "0x18",
+ "validatorIndex": "0x5",
+ "address": "0x4fb733bedb74fec8d65bedf056b935189a289e92",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "206": {
+ "withdrawals": [
+ {
+ "index": "0x19",
+ "validatorIndex": "0x5",
+ "address": "0xc337ded6f56c07205fb7b391654d7d463c9e0c72",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "211": {
+ "withdrawals": [
+ {
+ "index": "0x1a",
+ "validatorIndex": "0x5",
+ "address": "0x28969cdfa74a12c82f3bad960b0b000aca2ac329",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "216": {
+ "withdrawals": [
+ {
+ "index": "0x1b",
+ "validatorIndex": "0x5",
+ "address": "0xaf193a8cdcd0e3fb39e71147e59efa5cad40763d",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "221": {
+ "withdrawals": [
+ {
+ "index": "0x1c",
+ "validatorIndex": "0x5",
+ "address": "0x2795044ce0f83f718bc79c5f2add1e52521978df",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "226": {
+ "withdrawals": [
+ {
+ "index": "0x1d",
+ "validatorIndex": "0x5",
+ "address": "0x30a5bfa58e128af9e5a4955725d8ad26d4d574a5",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "231": {
+ "withdrawals": [
+ {
+ "index": "0x1e",
+ "validatorIndex": "0x5",
+ "address": "0xd0752b60adb148ca0b3b4d2591874e2dabd34637",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "236": {
+ "withdrawals": [
+ {
+ "index": "0x1f",
+ "validatorIndex": "0x5",
+ "address": "0x45f83d17e10b34fca01eb8f4454dac34a777d940",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "241": {
+ "withdrawals": [
+ {
+ "index": "0x20",
+ "validatorIndex": "0x5",
+ "address": "0xd4f09e5c5af99a24c7e304ca7997d26cb0090169",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "246": {
+ "withdrawals": [
+ {
+ "index": "0x21",
+ "validatorIndex": "0x5",
+ "address": "0xb0b2988b6bbe724bacda5e9e524736de0bc7dae4",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "251": {
+ "withdrawals": [
+ {
+ "index": "0x22",
+ "validatorIndex": "0x5",
+ "address": "0x04b8d34e20e604cadb04b9db8f6778c35f45a2d2",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "256": {
+ "withdrawals": [
+ {
+ "index": "0x23",
+ "validatorIndex": "0x5",
+ "address": "0x47dc540c94ceb704a23875c11273e16bb0b8a87a",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "261": {
+ "withdrawals": [
+ {
+ "index": "0x24",
+ "validatorIndex": "0x5",
+ "address": "0xbc5959f43bc6e47175374b6716e53c9a7d72c594",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "266": {
+ "withdrawals": [
+ {
+ "index": "0x25",
+ "validatorIndex": "0x5",
+ "address": "0xc04b5bb1a5b2eb3e9cd4805420dba5a9d133da5b",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "271": {
+ "withdrawals": [
+ {
+ "index": "0x26",
+ "validatorIndex": "0x5",
+ "address": "0x24255ef5d941493b9978f3aabb0ed07d084ade19",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "276": {
+ "withdrawals": [
+ {
+ "index": "0x27",
+ "validatorIndex": "0x5",
+ "address": "0xdbe726e81a7221a385e007ef9e834a975a4b528c",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "281": {
+ "withdrawals": [
+ {
+ "index": "0x28",
+ "validatorIndex": "0x5",
+ "address": "0xae58b7e08e266680e93e46639a2a7e89fde78a6f",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "286": {
+ "withdrawals": [
+ {
+ "index": "0x29",
+ "validatorIndex": "0x5",
+ "address": "0x5df7504bc193ee4c3deadede1459eccca172e87c",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "291": {
+ "withdrawals": [
+ {
+ "index": "0x2a",
+ "validatorIndex": "0x5",
+ "address": "0xb71de80778f2783383f5d5a3028af84eab2f18a4",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "296": {
+ "withdrawals": [
+ {
+ "index": "0x2b",
+ "validatorIndex": "0x5",
+ "address": "0x1c972398125398a3665f212930758ae9518a8c94",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "301": {
+ "withdrawals": [
+ {
+ "index": "0x2c",
+ "validatorIndex": "0x5",
+ "address": "0x1c123d5c0d6c5a22ef480dce944631369fc6ce28",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "306": {
+ "withdrawals": [
+ {
+ "index": "0x2d",
+ "validatorIndex": "0x5",
+ "address": "0x7f774bb46e7e342a2d9d0514b27cee622012f741",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "311": {
+ "withdrawals": [
+ {
+ "index": "0x2e",
+ "validatorIndex": "0x5",
+ "address": "0x06f647b157b8557a12979ba04cf5ba222b9747cf",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "316": {
+ "withdrawals": [
+ {
+ "index": "0x2f",
+ "validatorIndex": "0x5",
+ "address": "0xcccc369c5141675a9e9b1925164f30cdd60992dc",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "321": {
+ "withdrawals": [
+ {
+ "index": "0x30",
+ "validatorIndex": "0x5",
+ "address": "0xacfa6b0e008d0208f16026b4d17a4c070e8f9f8d",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "326": {
+ "withdrawals": [
+ {
+ "index": "0x31",
+ "validatorIndex": "0x5",
+ "address": "0x6a632187a3abf9bebb66d43368fccd612f631cbc",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "331": {
+ "withdrawals": [
+ {
+ "index": "0x32",
+ "validatorIndex": "0x5",
+ "address": "0x984c16459ded76438d98ce9b608f175c28a910a0",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "336": {
+ "withdrawals": [
+ {
+ "index": "0x33",
+ "validatorIndex": "0x5",
+ "address": "0x2847213288f0988543a76512fab09684131809d9",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "341": {
+ "withdrawals": [
+ {
+ "index": "0x34",
+ "validatorIndex": "0x5",
+ "address": "0x1037044fabf0421617c47c74681d7cc9c59f136c",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "346": {
+ "withdrawals": [
+ {
+ "index": "0x35",
+ "validatorIndex": "0x5",
+ "address": "0x8cf42eb93b1426f22a30bd22539503bdf838830c",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "351": {
+ "withdrawals": [
+ {
+ "index": "0x36",
+ "validatorIndex": "0x5",
+ "address": "0x6b2884fef44bd4288621a2cda9f88ca07b480861",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "356": {
+ "withdrawals": [
+ {
+ "index": "0x37",
+ "validatorIndex": "0x5",
+ "address": "0xf6152f2ad8a93dc0f8f825f2a8d162d6da46e81f",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "361": {
+ "withdrawals": [
+ {
+ "index": "0x38",
+ "validatorIndex": "0x5",
+ "address": "0x8fa24283a8c1cc8a0f76ac69362139a173592567",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "366": {
+ "withdrawals": [
+ {
+ "index": "0x39",
+ "validatorIndex": "0x5",
+ "address": "0x19041ad672875015bc4041c24b581eafc0869aab",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "371": {
+ "withdrawals": [
+ {
+ "index": "0x3a",
+ "validatorIndex": "0x5",
+ "address": "0x2bb3295506aa5a21b58f1fd40f3b0f16d6d06bbc",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "376": {
+ "withdrawals": [
+ {
+ "index": "0x3b",
+ "validatorIndex": "0x5",
+ "address": "0x23c86a8aded0ad81f8111bb07e6ec0ffb00ce5bf",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "381": {
+ "withdrawals": [
+ {
+ "index": "0x3c",
+ "validatorIndex": "0x5",
+ "address": "0x96a1cabb97e1434a6e23e684dd4572e044c243ea",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "386": {
+ "withdrawals": [
+ {
+ "index": "0x3d",
+ "validatorIndex": "0x5",
+ "address": "0xfd5e6e8c850fafa2ba2293c851479308c0f0c9e7",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "391": {
+ "withdrawals": [
+ {
+ "index": "0x3e",
+ "validatorIndex": "0x5",
+ "address": "0xf997ed224012b1323eb2a6a0c0044a956c6b8070",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "396": {
+ "withdrawals": [
+ {
+ "index": "0x3f",
+ "validatorIndex": "0x5",
+ "address": "0x6d09a879576c0d941bea7833fb2285051b10d511",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "401": {
+ "withdrawals": [
+ {
+ "index": "0x40",
+ "validatorIndex": "0x5",
+ "address": "0x13dd437fc2ed1cd5d943ac1dd163524c815d305c",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "406": {
+ "withdrawals": [
+ {
+ "index": "0x41",
+ "validatorIndex": "0x5",
+ "address": "0x6510225e743d73828aa4f73a3133818490bd8820",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "411": {
+ "withdrawals": [
+ {
+ "index": "0x42",
+ "validatorIndex": "0x5",
+ "address": "0xd282cf9c585bb4f6ce71e16b6453b26aa8d34a53",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "416": {
+ "withdrawals": [
+ {
+ "index": "0x43",
+ "validatorIndex": "0x5",
+ "address": "0xa179dbdd51c56d0988551f92535797bcf47ca0e7",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "421": {
+ "withdrawals": [
+ {
+ "index": "0x44",
+ "validatorIndex": "0x5",
+ "address": "0x494d799e953876ac6022c3f7da5e0f3c04b549be",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "426": {
+ "withdrawals": [
+ {
+ "index": "0x45",
+ "validatorIndex": "0x5",
+ "address": "0xb4bc136e1fb4ea0b3340d06b158277c4a8537a13",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "431": {
+ "withdrawals": [
+ {
+ "index": "0x46",
+ "validatorIndex": "0x5",
+ "address": "0x368b766f1e4d7bf437d2a709577a5210a99002b6",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "436": {
+ "withdrawals": [
+ {
+ "index": "0x47",
+ "validatorIndex": "0x5",
+ "address": "0x5123198d8a827fe0c788c409e7d2068afde64339",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "441": {
+ "withdrawals": [
+ {
+ "index": "0x48",
+ "validatorIndex": "0x5",
+ "address": "0xd39b94587711196640659ec81855bcf397e419ff",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "446": {
+ "withdrawals": [
+ {
+ "index": "0x49",
+ "validatorIndex": "0x5",
+ "address": "0x6ca60a92cbf88c7f527978dc183a22e774755551",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "451": {
+ "withdrawals": [
+ {
+ "index": "0x4a",
+ "validatorIndex": "0x5",
+ "address": "0x102efa1f2e0ad16ada57759b815245b8f8d27ce4",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "456": {
+ "withdrawals": [
+ {
+ "index": "0x4b",
+ "validatorIndex": "0x5",
+ "address": "0xfcc8d4cd5a42cca8ac9f9437a6d0ac09f1d08785",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "461": {
+ "withdrawals": [
+ {
+ "index": "0x4c",
+ "validatorIndex": "0x5",
+ "address": "0x48701721ec0115f04bc7404058f6c0f386946e09",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "466": {
+ "withdrawals": [
+ {
+ "index": "0x4d",
+ "validatorIndex": "0x5",
+ "address": "0x706be462488699e89b722822dcec9822ad7d05a7",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "471": {
+ "withdrawals": [
+ {
+ "index": "0x4e",
+ "validatorIndex": "0x5",
+ "address": "0xe5ec19296e6d1518a6a38c1dbc7ad024b8a1a248",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "476": {
+ "withdrawals": [
+ {
+ "index": "0x4f",
+ "validatorIndex": "0x5",
+ "address": "0x2e350f8e7f890a9301f33edbf55f38e67e02d72b",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "481": {
+ "withdrawals": [
+ {
+ "index": "0x50",
+ "validatorIndex": "0x5",
+ "address": "0xc57aa6a4279377063b17c554d3e33a3490e67a9a",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "486": {
+ "withdrawals": [
+ {
+ "index": "0x51",
+ "validatorIndex": "0x5",
+ "address": "0x311df588ca5f412f970891e4cc3ac23648968ca2",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "491": {
+ "withdrawals": [
+ {
+ "index": "0x52",
+ "validatorIndex": "0x5",
+ "address": "0x3f31becc97226d3c17bf574dd86f39735fe0f0c1",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "496": {
+ "withdrawals": [
+ {
+ "index": "0x53",
+ "validatorIndex": "0x5",
+ "address": "0x6cc0ab95752bf25ec58c91b1d603c5eb41b8fbd7",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "81": {
+ "withdrawals": [
+ {
+ "index": "0x0",
+ "validatorIndex": "0x5",
+ "address": "0x4ae81572f06e1b88fd5ced7a1a000945432e83e1",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "86": {
+ "withdrawals": [
+ {
+ "index": "0x1",
+ "validatorIndex": "0x5",
+ "address": "0xde5a6f78116eca62d7fc5ce159d23ae6b889b365",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "91": {
+ "withdrawals": [
+ {
+ "index": "0x2",
+ "validatorIndex": "0x5",
+ "address": "0x245843abef9e72e7efac30138a994bf6301e7e1d",
+ "amount": "0x64"
+ }
+ ]
+ },
+ "96": {
+ "withdrawals": [
+ {
+ "index": "0x3",
+ "validatorIndex": "0x5",
+ "address": "0x8d33f520a3c4cef80d2453aef81b612bfe1cb44c",
+ "amount": "0x64"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/cmd/devp2p/internal/ethtest/transaction.go b/cmd/devp2p/internal/ethtest/transaction.go
index db5199d334..0ea7c32752 100644
--- a/cmd/devp2p/internal/ethtest/transaction.go
+++ b/cmd/devp2p/internal/ethtest/transaction.go
@@ -19,429 +19,141 @@ package ethtest
import (
"errors"
"fmt"
- "math/big"
- "strings"
+ "os"
"time"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/crypto"
- "github.com/ethereum/go-ethereum/internal/utesting"
- "github.com/ethereum/go-ethereum/params"
+ "github.com/ethereum/go-ethereum/eth/protocols/eth"
)
-// var faucetAddr = common.HexToAddress("0x71562b71999873DB5b286dF957af199Ec94617F7")
-var faucetKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
-
-func (s *Suite) sendSuccessfulTxs(t *utesting.T) error {
- tests := []*types.Transaction{
- getNextTxFromChain(s),
- unknownTx(s),
- }
- for i, tx := range tests {
- if tx == nil {
- return errors.New("could not find tx to send")
- }
- t.Logf("Testing tx propagation %d: sending tx %v %v %v\n", i, tx.Hash().String(), tx.GasPrice(), tx.Gas())
- // get previous tx if exists for reference in case of old tx propagation
- var prevTx *types.Transaction
- if i != 0 {
- prevTx = tests[i-1]
- }
- // write tx to connection
- if err := sendSuccessfulTx(s, tx, prevTx); err != nil {
- return fmt.Errorf("send successful tx test failed: %v", err)
- }
- }
- return nil
-}
-
-func sendSuccessfulTx(s *Suite, tx *types.Transaction, prevTx *types.Transaction) error {
- sendConn, recvConn, err := s.createSendAndRecvConns()
+// sendTxs sends the given transactions to the node and
+// expects the node to accept and propagate them.
+func (s *Suite) sendTxs(txs []*types.Transaction) error {
+ // Open sending conn.
+ sendConn, err := s.dial()
if err != nil {
return err
}
defer sendConn.Close()
- defer recvConn.Close()
if err = sendConn.peer(s.chain, nil); err != nil {
return fmt.Errorf("peering failed: %v", err)
}
- // Send the transaction
- if err = sendConn.Write(&Transactions{tx}); err != nil {
- return fmt.Errorf("failed to write to connection: %v", err)
- }
- // peer receiving connection to node
- if err = recvConn.peer(s.chain, nil); err != nil {
- return fmt.Errorf("peering failed: %v", err)
- }
- // update last nonce seen
- nonce = tx.Nonce()
-
- // Wait for the transaction announcement
- for {
- switch msg := recvConn.readAndServe(s.chain, timeout).(type) {
- case *Transactions:
- recTxs := *msg
- // if you receive an old tx propagation, read from connection again
- if len(recTxs) == 1 && prevTx != nil {
- if recTxs[0] == prevTx {
- continue
- }
- }
- for _, gotTx := range recTxs {
- if gotTx.Hash() == tx.Hash() {
- // Ok
- return nil
- }
- }
- return fmt.Errorf("missing transaction: got %v missing %v", recTxs, tx.Hash())
- case *NewPooledTransactionHashes66:
- txHashes := *msg
- // if you receive an old tx propagation, read from connection again
- if len(txHashes) == 1 && prevTx != nil {
- if txHashes[0] == prevTx.Hash() {
- continue
- }
- }
- for _, gotHash := range txHashes {
- if gotHash == tx.Hash() {
- // Ok
- return nil
- }
- }
- return fmt.Errorf("missing transaction announcement: got %v missing %v", txHashes, tx.Hash())
- case *NewPooledTransactionHashes:
- txHashes := msg.Hashes
- if len(txHashes) != len(msg.Sizes) {
- return fmt.Errorf("invalid msg size lengths: hashes: %v sizes: %v", len(txHashes), len(msg.Sizes))
- }
- if len(txHashes) != len(msg.Types) {
- return fmt.Errorf("invalid msg type lengths: hashes: %v types: %v", len(txHashes), len(msg.Types))
- }
- // if you receive an old tx propagation, read from connection again
- if len(txHashes) == 1 && prevTx != nil {
- if txHashes[0] == prevTx.Hash() {
- continue
- }
- }
- for index, gotHash := range txHashes {
- if gotHash == tx.Hash() {
- if msg.Sizes[index] != uint32(tx.Size()) {
- return fmt.Errorf("invalid tx size: got %v want %v", msg.Sizes[index], tx.Size())
- }
- if msg.Types[index] != tx.Type() {
- return fmt.Errorf("invalid tx type: got %v want %v", msg.Types[index], tx.Type())
- }
- // Ok
- return nil
- }
- }
- return fmt.Errorf("missing transaction announcement: got %v missing %v", txHashes, tx.Hash())
-
- default:
- return fmt.Errorf("unexpected message in sendSuccessfulTx: %s", pretty.Sdump(msg))
- }
- }
-}
-
-func (s *Suite) sendMaliciousTxs(t *utesting.T) error {
- badTxs := []*types.Transaction{
- getOldTxFromChain(s),
- invalidNonceTx(s),
- hugeAmount(s),
- hugeGasPrice(s),
- hugeData(s),
- }
-
- // setup receiving connection before sending malicious txs
+ // Open receiving conn.
recvConn, err := s.dial()
- if err != nil {
- return fmt.Errorf("dial failed: %v", err)
- }
- defer recvConn.Close()
- if err = recvConn.peer(s.chain, nil); err != nil {
- return fmt.Errorf("peering failed: %v", err)
- }
-
- for i, tx := range badTxs {
- t.Logf("Testing malicious tx propagation: %v\n", i)
- if err = sendMaliciousTx(s, tx); err != nil {
- return fmt.Errorf("malicious tx test failed:\ntx: %v\nerror: %v", tx, err)
- }
- }
- // check to make sure bad txs aren't propagated
- return checkMaliciousTxPropagation(s, badTxs, recvConn)
-}
-
-func sendMaliciousTx(s *Suite, tx *types.Transaction) error {
- conn, err := s.dial()
- if err != nil {
- return fmt.Errorf("dial failed: %v", err)
- }
- defer conn.Close()
- if err = conn.peer(s.chain, nil); err != nil {
- return fmt.Errorf("peering failed: %v", err)
- }
-
- // write malicious tx
- if err = conn.Write(&Transactions{tx}); err != nil {
- return fmt.Errorf("failed to write to connection: %v", err)
- }
- return nil
-}
-
-var nonce = uint64(99)
-
-// sendMultipleSuccessfulTxs sends the given transactions to the node and
-// expects the node to accept and propagate them.
-func sendMultipleSuccessfulTxs(t *utesting.T, s *Suite, txs []*types.Transaction) error {
- txMsg := Transactions(txs)
- t.Logf("sending %d txs\n", len(txs))
-
- sendConn, recvConn, err := s.createSendAndRecvConns()
if err != nil {
return err
}
- defer sendConn.Close()
defer recvConn.Close()
- if err = sendConn.peer(s.chain, nil); err != nil {
- return fmt.Errorf("peering failed: %v", err)
- }
if err = recvConn.peer(s.chain, nil); err != nil {
return fmt.Errorf("peering failed: %v", err)
}
- // Send the transactions
- if err = sendConn.Write(&txMsg); err != nil {
+ if err = sendConn.Write(ethProto, eth.TransactionsMsg, eth.TransactionsPacket(txs)); err != nil {
return fmt.Errorf("failed to write message to connection: %v", err)
}
- // update nonce
- nonce = txs[len(txs)-1].Nonce()
+ var (
+ got = make(map[common.Hash]bool)
+ end = time.Now().Add(timeout)
+ )
- // Wait for the transaction announcement(s) and make sure all sent txs are being propagated.
- // all txs should be announced within a couple announcements.
- recvHashes := make([]common.Hash, 0)
-
- for i := 0; i < 20; i++ {
- switch msg := recvConn.readAndServe(s.chain, timeout).(type) {
- case *Transactions:
+ // Wait for the transaction announcements, make sure all txs ar propagated.
+ for time.Now().Before(end) {
+ msg, err := recvConn.ReadEth()
+ if err != nil {
+ return fmt.Errorf("failed to read from connection: %w", err)
+ }
+ switch msg := msg.(type) {
+ case *eth.TransactionsPacket:
for _, tx := range *msg {
- recvHashes = append(recvHashes, tx.Hash())
+ got[tx.Hash()] = true
+ }
+ case *eth.NewPooledTransactionHashesPacket68:
+ for _, hash := range msg.Hashes {
+ got[hash] = true
}
- case *NewPooledTransactionHashes66:
- recvHashes = append(recvHashes, *msg...)
- case *NewPooledTransactionHashes:
- recvHashes = append(recvHashes, msg.Hashes...)
default:
- if !strings.Contains(pretty.Sdump(msg), "i/o timeout") {
- return fmt.Errorf("unexpected message while waiting to receive txs: %s", pretty.Sdump(msg))
+ return fmt.Errorf("unexpected eth wire msg: %s", pretty.Sdump(msg))
+ }
+
+ // Check if all txs received.
+ allReceived := func() bool {
+ for _, tx := range txs {
+ if !got[tx.Hash()] {
+ return false
+ }
}
+ return true
}
- // break once all 2000 txs have been received
- if len(recvHashes) == 2000 {
- break
- }
- if len(recvHashes) > 0 {
- _, missingTxs := compareReceivedTxs(recvHashes, txs)
- if len(missingTxs) > 0 {
- continue
- } else {
- t.Logf("successfully received all %d txs", len(txs))
- return nil
- }
+ if allReceived() {
+ return nil
}
}
- _, missingTxs := compareReceivedTxs(recvHashes, txs)
- if len(missingTxs) > 0 {
- for _, missing := range missingTxs {
- t.Logf("missing tx: %v", missing.Hash())
- }
- return fmt.Errorf("missing %d txs", len(missingTxs))
- }
- return nil
+
+ return fmt.Errorf("timed out waiting for txs")
}
-// checkMaliciousTxPropagation checks whether the given malicious transactions were
-// propagated by the node.
-func checkMaliciousTxPropagation(s *Suite, txs []*types.Transaction, conn *Conn) error {
- switch msg := conn.readAndServe(s.chain, time.Second*8).(type) {
- case *Transactions:
- // check to see if any of the failing txs were in the announcement
- recvTxs := make([]common.Hash, len(*msg))
- for i, recvTx := range *msg {
- recvTxs[i] = recvTx.Hash()
- }
- badTxs, _ := compareReceivedTxs(recvTxs, txs)
- if len(badTxs) > 0 {
- return fmt.Errorf("received %d bad txs: \n%v", len(badTxs), badTxs)
- }
- case *NewPooledTransactionHashes66:
- badTxs, _ := compareReceivedTxs(*msg, txs)
- if len(badTxs) > 0 {
- return fmt.Errorf("received %d bad txs: \n%v", len(badTxs), badTxs)
- }
- case *NewPooledTransactionHashes:
- badTxs, _ := compareReceivedTxs(msg.Hashes, txs)
- if len(badTxs) > 0 {
- return fmt.Errorf("received %d bad txs: \n%v", len(badTxs), badTxs)
- }
- case *Error:
- // Transaction should not be announced -> wait for timeout
- return nil
- default:
- return fmt.Errorf("unexpected message in sendFailingTx: %s", pretty.Sdump(msg))
- }
- return nil
-}
-
-// compareReceivedTxs compares the received set of txs against the given set of txs,
-// returning both the set received txs that were present within the given txs, and
-// the set of txs that were missing from the set of received txs
-func compareReceivedTxs(recvTxs []common.Hash, txs []*types.Transaction) (present []*types.Transaction, missing []*types.Transaction) {
- // create a map of the hashes received from node
- recvHashes := make(map[common.Hash]common.Hash)
- for _, hash := range recvTxs {
- recvHashes[hash] = hash
- }
-
- // collect present txs and missing txs separately
- present = make([]*types.Transaction, 0)
- missing = make([]*types.Transaction, 0)
- for _, tx := range txs {
- if _, exists := recvHashes[tx.Hash()]; exists {
- present = append(present, tx)
- } else {
- missing = append(missing, tx)
- }
- }
- return present, missing
-}
-
-func unknownTx(s *Suite) *types.Transaction {
- tx := getNextTxFromChain(s)
- if tx == nil {
- return nil
- }
- var to common.Address
- if tx.To() != nil {
- to = *tx.To()
- }
- txNew := types.NewTransaction(tx.Nonce()+1, to, tx.Value(), tx.Gas(), tx.GasPrice(), tx.Data())
- return signWithFaucet(s.chain.chainConfig, txNew)
-}
-
-func getNextTxFromChain(s *Suite) *types.Transaction {
- // Get a new transaction
- for _, blocks := range s.fullChain.blocks[s.chain.Len():] {
- txs := blocks.Transactions()
- if txs.Len() != 0 {
- return txs[0]
- }
- }
- return nil
-}
-
-func generateTxs(s *Suite, numTxs int) (map[common.Hash]common.Hash, []*types.Transaction, error) {
- txHashMap := make(map[common.Hash]common.Hash, numTxs)
- txs := make([]*types.Transaction, numTxs)
-
- nextTx := getNextTxFromChain(s)
- if nextTx == nil {
- return nil, nil, errors.New("failed to get the next transaction")
- }
- gas := nextTx.Gas()
-
- nonce = nonce + 1
- // generate txs
- for i := 0; i < numTxs; i++ {
- tx := generateTx(s.chain.chainConfig, nonce, gas)
- if tx == nil {
- return nil, nil, errors.New("failed to get the next transaction")
- }
- txHashMap[tx.Hash()] = tx.Hash()
- txs[i] = tx
- nonce = nonce + 1
- }
- return txHashMap, txs, nil
-}
-
-func generateTx(chainConfig *params.ChainConfig, nonce uint64, gas uint64) *types.Transaction {
- var to common.Address
- tx := types.NewTransaction(nonce, to, big.NewInt(1), gas, big.NewInt(1), []byte{})
- return signWithFaucet(chainConfig, tx)
-}
-
-func getOldTxFromChain(s *Suite) *types.Transaction {
- for _, blocks := range s.fullChain.blocks[:s.chain.Len()-1] {
- txs := blocks.Transactions()
- if txs.Len() != 0 {
- return txs[0]
- }
- }
- return nil
-}
-
-func invalidNonceTx(s *Suite) *types.Transaction {
- tx := getNextTxFromChain(s)
- if tx == nil {
- return nil
- }
- var to common.Address
- if tx.To() != nil {
- to = *tx.To()
- }
- txNew := types.NewTransaction(tx.Nonce()-2, to, tx.Value(), tx.Gas(), tx.GasPrice(), tx.Data())
- return signWithFaucet(s.chain.chainConfig, txNew)
-}
-
-func hugeAmount(s *Suite) *types.Transaction {
- tx := getNextTxFromChain(s)
- if tx == nil {
- return nil
- }
- amount := largeNumber(2)
- var to common.Address
- if tx.To() != nil {
- to = *tx.To()
- }
- txNew := types.NewTransaction(tx.Nonce(), to, amount, tx.Gas(), tx.GasPrice(), tx.Data())
- return signWithFaucet(s.chain.chainConfig, txNew)
-}
-
-func hugeGasPrice(s *Suite) *types.Transaction {
- tx := getNextTxFromChain(s)
- if tx == nil {
- return nil
- }
- gasPrice := largeNumber(2)
- var to common.Address
- if tx.To() != nil {
- to = *tx.To()
- }
- txNew := types.NewTransaction(tx.Nonce(), to, tx.Value(), tx.Gas(), gasPrice, tx.Data())
- return signWithFaucet(s.chain.chainConfig, txNew)
-}
-
-func hugeData(s *Suite) *types.Transaction {
- tx := getNextTxFromChain(s)
- if tx == nil {
- return nil
- }
- var to common.Address
- if tx.To() != nil {
- to = *tx.To()
- }
- txNew := types.NewTransaction(tx.Nonce(), to, tx.Value(), tx.Gas(), tx.GasPrice(), largeBuffer(2))
- return signWithFaucet(s.chain.chainConfig, txNew)
-}
-
-func signWithFaucet(chainConfig *params.ChainConfig, tx *types.Transaction) *types.Transaction {
- signer := types.LatestSigner(chainConfig)
- signedTx, err := types.SignTx(tx, signer, faucetKey)
+func (s *Suite) sendInvalidTxs(txs []*types.Transaction) error {
+ // Open sending conn.
+ sendConn, err := s.dial()
if err != nil {
- return nil
+ return err
+ }
+ defer sendConn.Close()
+ if err = sendConn.peer(s.chain, nil); err != nil {
+ return fmt.Errorf("peering failed: %v", err)
+ }
+ sendConn.SetDeadline(time.Now().Add(timeout))
+
+ // Open receiving conn.
+ recvConn, err := s.dial()
+ if err != nil {
+ return err
+ }
+ defer recvConn.Close()
+ if err = recvConn.peer(s.chain, nil); err != nil {
+ return fmt.Errorf("peering failed: %v", err)
+ }
+ recvConn.SetDeadline(time.Now().Add(timeout))
+
+ if err = sendConn.Write(ethProto, eth.TransactionsMsg, txs); err != nil {
+ return fmt.Errorf("failed to write message to connection: %w", err)
+ }
+
+ // Make map of invalid txs.
+ invalids := make(map[common.Hash]struct{})
+ for _, tx := range txs {
+ invalids[tx.Hash()] = struct{}{}
+ }
+
+ // Get responses.
+ recvConn.SetReadDeadline(time.Now().Add(timeout))
+ for {
+ msg, err := recvConn.ReadEth()
+ if errors.Is(err, os.ErrDeadlineExceeded) {
+ // Successful if no invalid txs are propagated before timeout.
+ return nil
+ } else if err != nil {
+ return fmt.Errorf("failed to read from connection: %w", err)
+ }
+
+ switch msg := msg.(type) {
+ case *eth.TransactionsPacket:
+ for _, tx := range txs {
+ if _, ok := invalids[tx.Hash()]; ok {
+ return fmt.Errorf("received bad tx: %s", tx.Hash())
+ }
+ }
+ case *eth.NewPooledTransactionHashesPacket68:
+ for _, hash := range msg.Hashes {
+ if _, ok := invalids[hash]; ok {
+ return fmt.Errorf("received bad tx: %s", hash)
+ }
+ }
+ default:
+ return fmt.Errorf("unexpected eth message: %v", pretty.Sdump(msg))
+ }
}
- return signedTx
}
diff --git a/cmd/devp2p/internal/ethtest/types.go b/cmd/devp2p/internal/ethtest/types.go
deleted file mode 100644
index 805d7a81b9..0000000000
--- a/cmd/devp2p/internal/ethtest/types.go
+++ /dev/null
@@ -1,291 +0,0 @@
-// Copyright 2020 The go-ethereum Authors
-// This file is part of go-ethereum.
-//
-// go-ethereum is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// go-ethereum is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with go-ethereum. If not, see .
-
-package ethtest
-
-import (
- "crypto/ecdsa"
- "errors"
- "fmt"
- "time"
-
- "github.com/ethereum/go-ethereum/eth/protocols/eth"
- "github.com/ethereum/go-ethereum/p2p"
- "github.com/ethereum/go-ethereum/p2p/rlpx"
- "github.com/ethereum/go-ethereum/rlp"
-)
-
-type Message interface {
- Code() int
- ReqID() uint64
-}
-
-type Error struct {
- err error
-}
-
-func (e *Error) Unwrap() error { return e.err }
-func (e *Error) Error() string { return e.err.Error() }
-func (e *Error) String() string { return e.Error() }
-
-func (e *Error) Code() int { return -1 }
-func (e *Error) ReqID() uint64 { return 0 }
-
-func errorf(format string, args ...interface{}) *Error {
- return &Error{fmt.Errorf(format, args...)}
-}
-
-// Hello is the RLP structure of the protocol handshake.
-type Hello struct {
- Version uint64
- Name string
- Caps []p2p.Cap
- ListenPort uint64
- ID []byte // secp256k1 public key
-
- // Ignore additional fields (for forward compatibility).
- Rest []rlp.RawValue `rlp:"tail"`
-}
-
-func (msg Hello) Code() int { return 0x00 }
-func (msg Hello) ReqID() uint64 { return 0 }
-
-// Disconnect is the RLP structure for a disconnect message.
-type Disconnect struct {
- Reason p2p.DiscReason
-}
-
-func (msg Disconnect) Code() int { return 0x01 }
-func (msg Disconnect) ReqID() uint64 { return 0 }
-
-type Ping struct{}
-
-func (msg Ping) Code() int { return 0x02 }
-func (msg Ping) ReqID() uint64 { return 0 }
-
-type Pong struct{}
-
-func (msg Pong) Code() int { return 0x03 }
-func (msg Pong) ReqID() uint64 { return 0 }
-
-// Status is the network packet for the status message for eth/64 and later.
-type Status eth.StatusPacket
-
-func (msg Status) Code() int { return 16 }
-func (msg Status) ReqID() uint64 { return 0 }
-
-// NewBlockHashes is the network packet for the block announcements.
-type NewBlockHashes eth.NewBlockHashesPacket
-
-func (msg NewBlockHashes) Code() int { return 17 }
-func (msg NewBlockHashes) ReqID() uint64 { return 0 }
-
-type Transactions eth.TransactionsPacket
-
-func (msg Transactions) Code() int { return 18 }
-func (msg Transactions) ReqID() uint64 { return 18 }
-
-// GetBlockHeaders represents a block header query.
-type GetBlockHeaders eth.GetBlockHeadersPacket
-
-func (msg GetBlockHeaders) Code() int { return 19 }
-func (msg GetBlockHeaders) ReqID() uint64 { return msg.RequestId }
-
-type BlockHeaders eth.BlockHeadersPacket
-
-func (msg BlockHeaders) Code() int { return 20 }
-func (msg BlockHeaders) ReqID() uint64 { return msg.RequestId }
-
-// GetBlockBodies represents a GetBlockBodies request
-type GetBlockBodies eth.GetBlockBodiesPacket
-
-func (msg GetBlockBodies) Code() int { return 21 }
-func (msg GetBlockBodies) ReqID() uint64 { return msg.RequestId }
-
-// BlockBodies is the network packet for block content distribution.
-type BlockBodies eth.BlockBodiesPacket
-
-func (msg BlockBodies) Code() int { return 22 }
-func (msg BlockBodies) ReqID() uint64 { return msg.RequestId }
-
-// NewBlock is the network packet for the block propagation message.
-type NewBlock eth.NewBlockPacket
-
-func (msg NewBlock) Code() int { return 23 }
-func (msg NewBlock) ReqID() uint64 { return 0 }
-
-// NewPooledTransactionHashes66 is the network packet for the tx hash propagation message.
-type NewPooledTransactionHashes66 eth.NewPooledTransactionHashesPacket67
-
-func (msg NewPooledTransactionHashes66) Code() int { return 24 }
-func (msg NewPooledTransactionHashes66) ReqID() uint64 { return 0 }
-
-// NewPooledTransactionHashes is the network packet for the tx hash propagation message.
-type NewPooledTransactionHashes eth.NewPooledTransactionHashesPacket68
-
-func (msg NewPooledTransactionHashes) Code() int { return 24 }
-func (msg NewPooledTransactionHashes) ReqID() uint64 { return 0 }
-
-type GetPooledTransactions eth.GetPooledTransactionsPacket
-
-func (msg GetPooledTransactions) Code() int { return 25 }
-func (msg GetPooledTransactions) ReqID() uint64 { return msg.RequestId }
-
-type PooledTransactions eth.PooledTransactionsPacket
-
-func (msg PooledTransactions) Code() int { return 26 }
-func (msg PooledTransactions) ReqID() uint64 { return msg.RequestId }
-
-// Conn represents an individual connection with a peer
-type Conn struct {
- *rlpx.Conn
- ourKey *ecdsa.PrivateKey
- negotiatedProtoVersion uint
- negotiatedSnapProtoVersion uint
- ourHighestProtoVersion uint
- ourHighestSnapProtoVersion uint
- caps []p2p.Cap
-}
-
-// Read reads an eth66 packet from the connection.
-func (c *Conn) Read() Message {
- code, rawData, _, err := c.Conn.Read()
- if err != nil {
- return errorf("could not read from connection: %v", err)
- }
-
- var msg Message
- switch int(code) {
- case (Hello{}).Code():
- msg = new(Hello)
- case (Ping{}).Code():
- msg = new(Ping)
- case (Pong{}).Code():
- msg = new(Pong)
- case (Disconnect{}).Code():
- msg = new(Disconnect)
- case (Status{}).Code():
- msg = new(Status)
- case (GetBlockHeaders{}).Code():
- ethMsg := new(eth.GetBlockHeadersPacket)
- if err := rlp.DecodeBytes(rawData, ethMsg); err != nil {
- return errorf("could not rlp decode message: %v", err)
- }
- return (*GetBlockHeaders)(ethMsg)
- case (BlockHeaders{}).Code():
- ethMsg := new(eth.BlockHeadersPacket)
- if err := rlp.DecodeBytes(rawData, ethMsg); err != nil {
- return errorf("could not rlp decode message: %v", err)
- }
- return (*BlockHeaders)(ethMsg)
- case (GetBlockBodies{}).Code():
- ethMsg := new(eth.GetBlockBodiesPacket)
- if err := rlp.DecodeBytes(rawData, ethMsg); err != nil {
- return errorf("could not rlp decode message: %v", err)
- }
- return (*GetBlockBodies)(ethMsg)
- case (BlockBodies{}).Code():
- ethMsg := new(eth.BlockBodiesPacket)
- if err := rlp.DecodeBytes(rawData, ethMsg); err != nil {
- return errorf("could not rlp decode message: %v", err)
- }
- return (*BlockBodies)(ethMsg)
- case (NewBlock{}).Code():
- msg = new(NewBlock)
- case (NewBlockHashes{}).Code():
- msg = new(NewBlockHashes)
- case (Transactions{}).Code():
- msg = new(Transactions)
- case (NewPooledTransactionHashes66{}).Code():
- // Try decoding to eth68
- ethMsg := new(NewPooledTransactionHashes)
- if err := rlp.DecodeBytes(rawData, ethMsg); err == nil {
- return ethMsg
- }
- msg = new(NewPooledTransactionHashes66)
- case (GetPooledTransactions{}.Code()):
- ethMsg := new(eth.GetPooledTransactionsPacket)
- if err := rlp.DecodeBytes(rawData, ethMsg); err != nil {
- return errorf("could not rlp decode message: %v", err)
- }
- return (*GetPooledTransactions)(ethMsg)
- case (PooledTransactions{}.Code()):
- ethMsg := new(eth.PooledTransactionsPacket)
- if err := rlp.DecodeBytes(rawData, ethMsg); err != nil {
- return errorf("could not rlp decode message: %v", err)
- }
- return (*PooledTransactions)(ethMsg)
- default:
- msg = errorf("invalid message code: %d", code)
- }
-
- if msg != nil {
- if err := rlp.DecodeBytes(rawData, msg); err != nil {
- return errorf("could not rlp decode message: %v", err)
- }
- return msg
- }
- return errorf("invalid message: %s", string(rawData))
-}
-
-// Write writes a eth packet to the connection.
-func (c *Conn) Write(msg Message) error {
- payload, err := rlp.EncodeToBytes(msg)
- if err != nil {
- return err
- }
- _, err = c.Conn.Write(uint64(msg.Code()), payload)
- return err
-}
-
-// ReadSnap reads a snap/1 response with the given id from the connection.
-func (c *Conn) ReadSnap(id uint64) (Message, error) {
- respId := id + 1
- start := time.Now()
- for respId != id && time.Since(start) < timeout {
- code, rawData, _, err := c.Conn.Read()
- if err != nil {
- return nil, fmt.Errorf("could not read from connection: %v", err)
- }
- var snpMsg interface{}
- switch int(code) {
- case (GetAccountRange{}).Code():
- snpMsg = new(GetAccountRange)
- case (AccountRange{}).Code():
- snpMsg = new(AccountRange)
- case (GetStorageRanges{}).Code():
- snpMsg = new(GetStorageRanges)
- case (StorageRanges{}).Code():
- snpMsg = new(StorageRanges)
- case (GetByteCodes{}).Code():
- snpMsg = new(GetByteCodes)
- case (ByteCodes{}).Code():
- snpMsg = new(ByteCodes)
- case (GetTrieNodes{}).Code():
- snpMsg = new(GetTrieNodes)
- case (TrieNodes{}).Code():
- snpMsg = new(TrieNodes)
- default:
- //return nil, fmt.Errorf("invalid message code: %d", code)
- continue
- }
- if err := rlp.DecodeBytes(rawData, snpMsg); err != nil {
- return nil, fmt.Errorf("could not rlp decode message: %v", err)
- }
- return snpMsg.(Message), nil
- }
- return nil, errors.New("request timed out")
-}
diff --git a/cmd/devp2p/internal/v4test/discv4tests.go b/cmd/devp2p/internal/v4test/discv4tests.go
index 3afcfd0698..ca556851b4 100644
--- a/cmd/devp2p/internal/v4test/discv4tests.go
+++ b/cmd/devp2p/internal/v4test/discv4tests.go
@@ -497,7 +497,7 @@ func FindnodeAmplificationWrongIP(t *utesting.T) {
// If we receive a NEIGHBORS response, the attack worked and the test fails.
reply, _, _ := te.read(te.l2)
if reply != nil {
- t.Error("Got NEIGHORS response for FINDNODE from wrong IP")
+ t.Error("Got NEIGHBORS response for FINDNODE from wrong IP")
}
}
diff --git a/cmd/devp2p/rlpxcmd.go b/cmd/devp2p/rlpxcmd.go
index dccecf3c37..aa7d065818 100644
--- a/cmd/devp2p/rlpxcmd.go
+++ b/cmd/devp2p/rlpxcmd.go
@@ -24,6 +24,7 @@ import (
"github.com/ethereum/go-ethereum/cmd/devp2p/internal/ethtest"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/p2p"
+ "github.com/ethereum/go-ethereum/p2p/enode"
"github.com/ethereum/go-ethereum/p2p/rlpx"
"github.com/ethereum/go-ethereum/rlp"
"github.com/urfave/cli/v2"
@@ -46,22 +47,30 @@ var (
}
rlpxEthTestCommand = &cli.Command{
Name: "eth-test",
- Usage: "Runs tests against a node",
- ArgsUsage: " ",
+ Usage: "Runs eth protocol tests against a node",
+ ArgsUsage: "",
Action: rlpxEthTest,
Flags: []cli.Flag{
testPatternFlag,
testTAPFlag,
+ testChainDirFlag,
+ testNodeFlag,
+ testNodeJWTFlag,
+ testNodeEngineFlag,
},
}
rlpxSnapTestCommand = &cli.Command{
Name: "snap-test",
- Usage: "Runs tests against a node",
- ArgsUsage: " ",
+ Usage: "Runs snap protocol tests against a node",
+ ArgsUsage: "",
Action: rlpxSnapTest,
Flags: []cli.Flag{
testPatternFlag,
testTAPFlag,
+ testChainDirFlag,
+ testNodeFlag,
+ testNodeJWTFlag,
+ testNodeEngineFlag,
},
}
)
@@ -103,10 +112,8 @@ func rlpxPing(ctx *cli.Context) error {
// rlpxEthTest runs the eth protocol test suite.
func rlpxEthTest(ctx *cli.Context) error {
- if ctx.NArg() < 3 {
- exit("missing path to chain.rlp as command-line argument")
- }
- suite, err := ethtest.NewSuite(getNodeArg(ctx), ctx.Args().Get(1), ctx.Args().Get(2))
+ p := cliTestParams(ctx)
+ suite, err := ethtest.NewSuite(p.node, p.chainDir, p.engineAPI, p.jwt)
if err != nil {
exit(err)
}
@@ -115,12 +122,44 @@ func rlpxEthTest(ctx *cli.Context) error {
// rlpxSnapTest runs the snap protocol test suite.
func rlpxSnapTest(ctx *cli.Context) error {
- if ctx.NArg() < 3 {
- exit("missing path to chain.rlp as command-line argument")
- }
- suite, err := ethtest.NewSuite(getNodeArg(ctx), ctx.Args().Get(1), ctx.Args().Get(2))
+ p := cliTestParams(ctx)
+ suite, err := ethtest.NewSuite(p.node, p.chainDir, p.engineAPI, p.jwt)
if err != nil {
exit(err)
}
return runTests(ctx, suite.SnapTests())
}
+
+type testParams struct {
+ node *enode.Node
+ engineAPI string
+ jwt string
+ chainDir string
+}
+
+func cliTestParams(ctx *cli.Context) *testParams {
+ nodeStr := ctx.String(testNodeFlag.Name)
+ if nodeStr == "" {
+ exit(fmt.Errorf("missing -%s", testNodeFlag.Name))
+ }
+ node, err := parseNode(nodeStr)
+ if err != nil {
+ exit(err)
+ }
+ p := testParams{
+ node: node,
+ engineAPI: ctx.String(testNodeEngineFlag.Name),
+ jwt: ctx.String(testNodeJWTFlag.Name),
+ chainDir: ctx.String(testChainDirFlag.Name),
+ }
+ if p.engineAPI == "" {
+ exit(fmt.Errorf("missing -%s", testNodeEngineFlag.Name))
+ }
+ if p.jwt == "" {
+ exit(fmt.Errorf("missing -%s", testNodeJWTFlag.Name))
+ }
+ if p.chainDir == "" {
+ exit(fmt.Errorf("missing -%s", testChainDirFlag.Name))
+ }
+ return &p
+}
diff --git a/cmd/devp2p/runtest.go b/cmd/devp2p/runtest.go
index 76af53ee4d..7e3723c641 100644
--- a/cmd/devp2p/runtest.go
+++ b/cmd/devp2p/runtest.go
@@ -20,6 +20,7 @@ import (
"os"
"github.com/ethereum/go-ethereum/cmd/devp2p/internal/v4test"
+ "github.com/ethereum/go-ethereum/internal/flags"
"github.com/ethereum/go-ethereum/internal/utesting"
"github.com/ethereum/go-ethereum/log"
"github.com/urfave/cli/v2"
@@ -27,23 +28,51 @@ import (
var (
testPatternFlag = &cli.StringFlag{
- Name: "run",
- Usage: "Pattern of test suite(s) to run",
+ Name: "run",
+ Usage: "Pattern of test suite(s) to run",
+ Category: flags.TestingCategory,
}
testTAPFlag = &cli.BoolFlag{
- Name: "tap",
- Usage: "Output TAP",
+ Name: "tap",
+ Usage: "Output test results in TAP format",
+ Category: flags.TestingCategory,
}
+
+ // for eth/snap tests
+ testChainDirFlag = &cli.StringFlag{
+ Name: "chain",
+ Usage: "Test chain directory (required)",
+ Category: flags.TestingCategory,
+ }
+ testNodeFlag = &cli.StringFlag{
+ Name: "node",
+ Usage: "Peer-to-Peer endpoint (ENR) of the test node (required)",
+ Category: flags.TestingCategory,
+ }
+ testNodeJWTFlag = &cli.StringFlag{
+ Name: "jwtsecret",
+ Usage: "JWT secret for the engine API of the test node (required)",
+ Category: flags.TestingCategory,
+ Value: "0x7365637265747365637265747365637265747365637265747365637265747365",
+ }
+ testNodeEngineFlag = &cli.StringFlag{
+ Name: "engineapi",
+ Usage: "Engine API endpoint of the test node (required)",
+ Category: flags.TestingCategory,
+ }
+
// These two are specific to the discovery tests.
testListen1Flag = &cli.StringFlag{
- Name: "listen1",
- Usage: "IP address of the first tester",
- Value: v4test.Listen1,
+ Name: "listen1",
+ Usage: "IP address of the first tester",
+ Value: v4test.Listen1,
+ Category: flags.TestingCategory,
}
testListen2Flag = &cli.StringFlag{
- Name: "listen2",
- Usage: "IP address of the second tester",
- Value: v4test.Listen2,
+ Name: "listen2",
+ Usage: "IP address of the second tester",
+ Value: v4test.Listen2,
+ Category: flags.TestingCategory,
}
)
diff --git a/cmd/evm/README.md b/cmd/evm/README.md
index e6c6fe06ad..25647c18a9 100644
--- a/cmd/evm/README.md
+++ b/cmd/evm/README.md
@@ -88,7 +88,7 @@ type Env struct {
CurrentTimestamp uint64 `json:"currentTimestamp"`
Withdrawals []*Withdrawal `json:"withdrawals"`
// optional
- CurrentDifficulty *big.Int `json:"currentDifficuly"`
+ CurrentDifficulty *big.Int `json:"currentDifficulty"`
CurrentRandom *big.Int `json:"currentRandom"`
CurrentBaseFee *big.Int `json:"currentBaseFee"`
ParentDifficulty *big.Int `json:"parentDifficulty"`
@@ -214,7 +214,7 @@ exitcode:3 OK
The chain configuration to be used for a transition is specified via the
`--state.fork` CLI flag. A list of possible values and configurations can be
-found in [`tests/init.go`](tests/init.go).
+found in [`tests/init.go`](../../tests/init.go).
#### Examples
##### Basic usage
diff --git a/cmd/evm/internal/t8ntool/block.go b/cmd/evm/internal/t8ntool/block.go
index 429ae12c54..a2dc473437 100644
--- a/cmd/evm/internal/t8ntool/block.go
+++ b/cmd/evm/internal/t8ntool/block.go
@@ -30,10 +30,8 @@ import (
"github.com/ethereum/go-ethereum/consensus/clique"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
- "github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/rlp"
"github.com/urfave/cli/v2"
- "golang.org/x/exp/slog"
)
//go:generate go run github.com/fjl/gencodec -type header -field-override headerMarshaling -out gen_header.go
@@ -216,11 +214,6 @@ func (i *bbInput) sealClique(block *types.Block) (*types.Block, error) {
// BuildBlock constructs a block from the given inputs.
func BuildBlock(ctx *cli.Context) error {
- // Configure the go-ethereum logger
- glogger := log.NewGlogHandler(log.NewTerminalHandler(os.Stderr, false))
- glogger.Verbosity(slog.Level(ctx.Int(VerbosityFlag.Name)))
- log.SetDefault(log.NewLogger(glogger))
-
baseDir, err := createBasedir(ctx)
if err != nil {
return NewError(ErrorIO, fmt.Errorf("failed creating output basedir: %v", err))
diff --git a/cmd/evm/internal/t8ntool/execution.go b/cmd/evm/internal/t8ntool/execution.go
index 5cac5f07f8..b654cb2196 100644
--- a/cmd/evm/internal/t8ntool/execution.go
+++ b/cmd/evm/internal/t8ntool/execution.go
@@ -117,7 +117,7 @@ type rejectedTx struct {
// Apply applies a set of transactions to a pre-state
func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
txIt txIterator, miningReward int64,
- getTracerFn func(txIndex int, txHash common.Hash) (tracer vm.EVMLogger, err error)) (*state.StateDB, *ExecutionResult, []byte, error) {
+ getTracerFn func(txIndex int, txHash common.Hash) (vm.EVMLogger, error)) (*state.StateDB, *ExecutionResult, []byte, error) {
// Capture errors for BLOCKHASH operation, if we haven't been supplied the
// required blockhashes
var hashError error
@@ -140,6 +140,7 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
rejectedTxs []*rejectedTx
includedTxs types.Transactions
gasUsed = uint64(0)
+ blobGasUsed = uint64(0)
receipts = make(types.Receipts, 0)
txIndex = 0
)
@@ -189,7 +190,6 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
evm := vm.NewEVM(vmContext, vm.TxContext{}, statedb, chainConfig, vmConfig)
core.ProcessBeaconBlockRoot(*beaconRoot, evm, statedb)
}
- var blobGasUsed uint64
for i := 0; txIt.Next(); i++ {
tx, err := txIt.Tx()
@@ -210,15 +210,15 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
rejectedTxs = append(rejectedTxs, &rejectedTx{i, err.Error()})
continue
}
+ txBlobGas := uint64(0)
if tx.Type() == types.BlobTxType {
- txBlobGas := uint64(params.BlobTxBlobGasPerBlob * len(tx.BlobHashes()))
+ txBlobGas = uint64(params.BlobTxBlobGasPerBlob * len(tx.BlobHashes()))
if used, max := blobGasUsed+txBlobGas, uint64(params.MaxBlobGasPerBlock); used > max {
err := fmt.Errorf("blob gas (%d) would exceed maximum allowance %d", used, max)
log.Warn("rejected tx", "index", i, "err", err)
rejectedTxs = append(rejectedTxs, &rejectedTx{i, err.Error()})
continue
}
- blobGasUsed += txBlobGas
}
tracer, err := getTracerFn(txIndex, tx.Hash())
if err != nil {
@@ -247,6 +247,7 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig,
if hashError != nil {
return nil, nil, nil, NewError(ErrorMissingBlockhash, hashError)
}
+ blobGasUsed += txBlobGas
gasUsed += msgResult.UsedGas
// Receipt:
diff --git a/cmd/evm/internal/t8ntool/flags.go b/cmd/evm/internal/t8ntool/flags.go
index de19dbc851..c2eca8cc21 100644
--- a/cmd/evm/internal/t8ntool/flags.go
+++ b/cmd/evm/internal/t8ntool/flags.go
@@ -28,12 +28,15 @@ import (
var (
TraceFlag = &cli.BoolFlag{
Name: "trace",
- Usage: "Output full trace logs to files .jsonl",
+ Usage: "Configures the use of the JSON opcode tracer. This tracer emits traces to files as trace--.jsonl",
}
- TraceDisableMemoryFlag = &cli.BoolFlag{
- Name: "trace.nomemory",
- Value: true,
- Usage: "Disable full memory dump in traces (deprecated)",
+ TraceTracerFlag = &cli.StringFlag{
+ Name: "trace.tracer",
+ Usage: "Configures the use of a custom tracer, e.g native or js tracers. Examples are callTracer and 4byteTracer. These tracers emit results into files as trace--.json",
+ }
+ TraceTracerConfigFlag = &cli.StringFlag{
+ Name: "trace.jsonconfig",
+ Usage: "The configurations for the custom tracer specified by --trace.tracer. If provided, must be in JSON format",
}
TraceEnableMemoryFlag = &cli.BoolFlag{
Name: "trace.memory",
@@ -43,11 +46,6 @@ var (
Name: "trace.nostack",
Usage: "Disable stack output in traces",
}
- TraceDisableReturnDataFlag = &cli.BoolFlag{
- Name: "trace.noreturndata",
- Value: true,
- Usage: "Disable return data output in traces (deprecated)",
- }
TraceEnableReturnDataFlag = &cli.BoolFlag{
Name: "trace.returndata",
Usage: "Enable return data output in traces",
diff --git a/cmd/evm/internal/t8ntool/tracewriter.go b/cmd/evm/internal/t8ntool/tracewriter.go
new file mode 100644
index 0000000000..e4efad112f
--- /dev/null
+++ b/cmd/evm/internal/t8ntool/tracewriter.go
@@ -0,0 +1,81 @@
+// Copyright 2020 The go-ethereum Authors
+// This file is part of go-ethereum.
+//
+// go-ethereum is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// go-ethereum is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with go-ethereum. If not, see .
+
+package t8ntool
+
+import (
+ "encoding/json"
+ "io"
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core/vm"
+ "github.com/ethereum/go-ethereum/eth/tracers"
+ "github.com/ethereum/go-ethereum/log"
+)
+
+// traceWriter is an vm.EVMLogger which also holds an inner logger/tracer.
+// When the TxEnd event happens, the inner tracer result is written to the file, and
+// the file is closed.
+type traceWriter struct {
+ inner vm.EVMLogger
+ f io.WriteCloser
+}
+
+// Compile-time interface check
+var _ = vm.EVMLogger((*traceWriter)(nil))
+
+func (t *traceWriter) CaptureTxEnd(restGas uint64) {
+ t.inner.CaptureTxEnd(restGas)
+ defer t.f.Close()
+
+ if tracer, ok := t.inner.(tracers.Tracer); ok {
+ result, err := tracer.GetResult()
+ if err != nil {
+ log.Warn("Error in tracer", "err", err)
+ return
+ }
+ err = json.NewEncoder(t.f).Encode(result)
+ if err != nil {
+ log.Warn("Error writing tracer output", "err", err)
+ return
+ }
+ }
+}
+
+func (t *traceWriter) CaptureTxStart(gasLimit uint64) { t.inner.CaptureTxStart(gasLimit) }
+func (t *traceWriter) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) {
+ t.inner.CaptureStart(env, from, to, create, input, gas, value)
+}
+
+func (t *traceWriter) CaptureEnd(output []byte, gasUsed uint64, err error) {
+ t.inner.CaptureEnd(output, gasUsed, err)
+}
+
+func (t *traceWriter) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) {
+ t.inner.CaptureEnter(typ, from, to, input, gas, value)
+}
+
+func (t *traceWriter) CaptureExit(output []byte, gasUsed uint64, err error) {
+ t.inner.CaptureExit(output, gasUsed, err)
+}
+
+func (t *traceWriter) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) {
+ t.inner.CaptureState(pc, op, gas, cost, scope, rData, depth, err)
+}
+func (t *traceWriter) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) {
+ t.inner.CaptureFault(pc, op, gas, cost, scope, depth, err)
+}
diff --git a/cmd/evm/internal/t8ntool/transaction.go b/cmd/evm/internal/t8ntool/transaction.go
index e1c98c7fe2..8533b78637 100644
--- a/cmd/evm/internal/t8ntool/transaction.go
+++ b/cmd/evm/internal/t8ntool/transaction.go
@@ -28,12 +28,10 @@ import (
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rlp"
"github.com/ethereum/go-ethereum/tests"
"github.com/urfave/cli/v2"
- "golang.org/x/exp/slog"
)
type result struct {
@@ -66,11 +64,6 @@ func (r *result) MarshalJSON() ([]byte, error) {
}
func Transaction(ctx *cli.Context) error {
- // Configure the go-ethereum logger
- glogger := log.NewGlogHandler(log.NewTerminalHandler(os.Stderr, false))
- glogger.Verbosity(slog.Level(ctx.Int(VerbosityFlag.Name)))
- log.SetDefault(log.NewLogger(glogger))
-
var (
err error
)
diff --git a/cmd/evm/internal/t8ntool/transition.go b/cmd/evm/internal/t8ntool/transition.go
index a01dfedab9..4dc50e577f 100644
--- a/cmd/evm/internal/t8ntool/transition.go
+++ b/cmd/evm/internal/t8ntool/transition.go
@@ -24,8 +24,6 @@ import (
"os"
"path"
- "golang.org/x/exp/slog"
-
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/consensus/misc/eip1559"
@@ -33,6 +31,7 @@ import (
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/vm"
+ "github.com/ethereum/go-ethereum/eth/tracers"
"github.com/ethereum/go-ethereum/eth/tracers/logger"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/params"
@@ -82,62 +81,43 @@ type input struct {
}
func Transition(ctx *cli.Context) error {
- // Configure the go-ethereum logger
- glogger := log.NewGlogHandler(log.NewTerminalHandler(os.Stderr, false))
- glogger.Verbosity(slog.Level(ctx.Int(VerbosityFlag.Name)))
- log.SetDefault(log.NewLogger(glogger))
-
- var (
- err error
- tracer vm.EVMLogger
- )
- var getTracer func(txIndex int, txHash common.Hash) (vm.EVMLogger, error)
+ var getTracer = func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) { return nil, nil }
baseDir, err := createBasedir(ctx)
if err != nil {
return NewError(ErrorIO, fmt.Errorf("failed creating output basedir: %v", err))
}
- if ctx.Bool(TraceFlag.Name) {
- if ctx.IsSet(TraceDisableMemoryFlag.Name) && ctx.IsSet(TraceEnableMemoryFlag.Name) {
- return NewError(ErrorConfig, fmt.Errorf("can't use both flags --%s and --%s", TraceDisableMemoryFlag.Name, TraceEnableMemoryFlag.Name))
- }
- if ctx.IsSet(TraceDisableReturnDataFlag.Name) && ctx.IsSet(TraceEnableReturnDataFlag.Name) {
- return NewError(ErrorConfig, fmt.Errorf("can't use both flags --%s and --%s", TraceDisableReturnDataFlag.Name, TraceEnableReturnDataFlag.Name))
- }
- if ctx.IsSet(TraceDisableMemoryFlag.Name) {
- log.Warn(fmt.Sprintf("--%s has been deprecated in favour of --%s", TraceDisableMemoryFlag.Name, TraceEnableMemoryFlag.Name))
- }
- if ctx.IsSet(TraceDisableReturnDataFlag.Name) {
- log.Warn(fmt.Sprintf("--%s has been deprecated in favour of --%s", TraceDisableReturnDataFlag.Name, TraceEnableReturnDataFlag.Name))
- }
+
+ if ctx.Bool(TraceFlag.Name) { // JSON opcode tracing
// Configure the EVM logger
logConfig := &logger.Config{
DisableStack: ctx.Bool(TraceDisableStackFlag.Name),
- EnableMemory: !ctx.Bool(TraceDisableMemoryFlag.Name) || ctx.Bool(TraceEnableMemoryFlag.Name),
- EnableReturnData: !ctx.Bool(TraceDisableReturnDataFlag.Name) || ctx.Bool(TraceEnableReturnDataFlag.Name),
+ EnableMemory: ctx.Bool(TraceEnableMemoryFlag.Name),
+ EnableReturnData: ctx.Bool(TraceEnableReturnDataFlag.Name),
Debug: true,
}
- var prevFile *os.File
- // This one closes the last file
- defer func() {
- if prevFile != nil {
- prevFile.Close()
- }
- }()
getTracer = func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) {
- if prevFile != nil {
- prevFile.Close()
- }
traceFile, err := os.Create(path.Join(baseDir, fmt.Sprintf("trace-%d-%v.jsonl", txIndex, txHash.String())))
if err != nil {
return nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err))
}
- prevFile = traceFile
- return logger.NewJSONLogger(logConfig, traceFile), nil
+ return &traceWriter{logger.NewJSONLogger(logConfig, traceFile), traceFile}, nil
}
- } else {
- getTracer = func(txIndex int, txHash common.Hash) (tracer vm.EVMLogger, err error) {
- return nil, nil
+ } else if ctx.IsSet(TraceTracerFlag.Name) {
+ var config json.RawMessage
+ if ctx.IsSet(TraceTracerConfigFlag.Name) {
+ config = []byte(ctx.String(TraceTracerConfigFlag.Name))
+ }
+ getTracer = func(txIndex int, txHash common.Hash) (vm.EVMLogger, error) {
+ traceFile, err := os.Create(path.Join(baseDir, fmt.Sprintf("trace-%d-%v.json", txIndex, txHash.String())))
+ if err != nil {
+ return nil, NewError(ErrorIO, fmt.Errorf("failed creating trace-file: %v", err))
+ }
+ tracer, err := tracers.DefaultDirectory.New(ctx.String(TraceTracerFlag.Name), nil, config)
+ if err != nil {
+ return nil, NewError(ErrorConfig, fmt.Errorf("failed instantiating tracer: %w", err))
+ }
+ return &traceWriter{tracer, traceFile}, nil
}
}
// We need to load three things: alloc, env and transactions. May be either in
@@ -176,9 +156,7 @@ func Transition(ctx *cli.Context) error {
}
prestate.Env = *inputData.Env
- vmConfig := vm.Config{
- Tracer: tracer,
- }
+ vmConfig := vm.Config{}
// Construct the chainconfig
var chainConfig *params.ChainConfig
if cConf, extraEips, err := tests.GetChainConfig(ctx.String(ForknameFlag.Name)); err != nil {
@@ -210,7 +188,7 @@ func Transition(ctx *cli.Context) error {
if err != nil {
return err
}
- // Dump the excution result
+ // Dump the execution result
collector := make(Alloc)
s.DumpToCollector(collector, nil)
return dispatchOutput(ctx, baseDir, result, collector, body)
diff --git a/cmd/evm/main.go b/cmd/evm/main.go
index ef5d25418d..c3e6a4af91 100644
--- a/cmd/evm/main.go
+++ b/cmd/evm/main.go
@@ -26,6 +26,10 @@ import (
"github.com/ethereum/go-ethereum/internal/debug"
"github.com/ethereum/go-ethereum/internal/flags"
"github.com/urfave/cli/v2"
+
+ // Force-load the tracer engines to trigger registration
+ _ "github.com/ethereum/go-ethereum/eth/tracers/js"
+ _ "github.com/ethereum/go-ethereum/eth/tracers/native"
)
var (
@@ -143,10 +147,10 @@ var stateTransitionCommand = &cli.Command{
Action: t8ntool.Transition,
Flags: []cli.Flag{
t8ntool.TraceFlag,
- t8ntool.TraceDisableMemoryFlag,
+ t8ntool.TraceTracerFlag,
+ t8ntool.TraceTracerConfigFlag,
t8ntool.TraceEnableMemoryFlag,
t8ntool.TraceDisableStackFlag,
- t8ntool.TraceDisableReturnDataFlag,
t8ntool.TraceEnableReturnDataFlag,
t8ntool.OutputBasedir,
t8ntool.OutputAllocFlag,
@@ -158,7 +162,6 @@ var stateTransitionCommand = &cli.Command{
t8ntool.ForknameFlag,
t8ntool.ChainIDFlag,
t8ntool.RewardFlag,
- t8ntool.VerbosityFlag,
},
}
@@ -171,7 +174,6 @@ var transactionCommand = &cli.Command{
t8ntool.InputTxsFlag,
t8ntool.ChainIDFlag,
t8ntool.ForknameFlag,
- t8ntool.VerbosityFlag,
},
}
@@ -188,7 +190,6 @@ var blockBuilderCommand = &cli.Command{
t8ntool.InputWithdrawalsFlag,
t8ntool.InputTxsRlpFlag,
t8ntool.SealCliqueFlag,
- t8ntool.VerbosityFlag,
},
}
diff --git a/cmd/evm/runner.go b/cmd/evm/runner.go
index c9a870022a..f3ffb3ed9f 100644
--- a/cmd/evm/runner.go
+++ b/cmd/evm/runner.go
@@ -144,7 +144,7 @@ func runCmd(ctx *cli.Context) error {
initialGas = genesisConfig.GasLimit
}
} else {
- genesisConfig.Config = params.AllEthashProtocolChanges
+ genesisConfig.Config = params.AllDevChainProtocolChanges
}
db := rawdb.NewMemoryDatabase()
diff --git a/cmd/evm/staterunner.go b/cmd/evm/staterunner.go
index 618ddf2ede..6e751b630f 100644
--- a/cmd/evm/staterunner.go
+++ b/cmd/evm/staterunner.go
@@ -100,18 +100,19 @@ func runStateTest(fname string, cfg vm.Config, jsonOut, dump bool) error {
for _, st := range test.Subtests() {
// Run the test and aggregate the result
result := &StatetestResult{Name: key, Fork: st.Fork, Pass: true}
- test.Run(st, cfg, false, rawdb.HashScheme, func(err error, snaps *snapshot.Tree, state *state.StateDB) {
- if state != nil {
- root := state.IntermediateRoot(false)
+ test.Run(st, cfg, false, rawdb.HashScheme, func(err error, snaps *snapshot.Tree, statedb *state.StateDB) {
+ var root common.Hash
+ if statedb != nil {
+ root = statedb.IntermediateRoot(false)
result.Root = &root
if jsonOut {
fmt.Fprintf(os.Stderr, "{\"stateRoot\": \"%#x\"}\n", root)
}
- }
- // Dump any state to aid debugging
- if dump {
- dump := state.RawDump(nil)
- result.State = &dump
+ if dump { // Dump any state to aid debugging
+ cpy, _ := state.New(root, statedb.Database(), nil)
+ dump := cpy.RawDump(nil)
+ result.State = &dump
+ }
}
if err != nil {
// Test failed, mark as so
diff --git a/cmd/geth/dbcmd.go b/cmd/geth/dbcmd.go
index c60147b862..1d885bd58d 100644
--- a/cmd/geth/dbcmd.go
+++ b/cmd/geth/dbcmd.go
@@ -43,12 +43,22 @@ import (
)
var (
+ removeStateDataFlag = &cli.BoolFlag{
+ Name: "remove.state",
+ Usage: "If set, selects the state data for removal",
+ }
+ removeChainDataFlag = &cli.BoolFlag{
+ Name: "remove.chain",
+ Usage: "If set, selects the state data for removal",
+ }
+
removedbCommand = &cli.Command{
Action: removeDB,
Name: "removedb",
Usage: "Remove blockchain and state databases",
ArgsUsage: "",
- Flags: utils.DatabaseFlags,
+ Flags: flags.Merge(utils.DatabaseFlags,
+ []cli.Flag{removeStateDataFlag, removeChainDataFlag}),
Description: `
Remove blockchain and state databases`,
}
@@ -198,60 +208,85 @@ WARNING: This is a low-level operation which may cause database corruption!`,
func removeDB(ctx *cli.Context) error {
stack, config := makeConfigNode(ctx)
- // Remove the full node state database
- path := stack.ResolvePath("chaindata")
- if common.FileExist(path) {
- confirmAndRemoveDB(path, "full node state database")
- } else {
- log.Info("Full node state database missing", "path", path)
- }
- // Remove the full node ancient database
- path = config.Eth.DatabaseFreezer
+ // Resolve folder paths.
+ var (
+ rootDir = stack.ResolvePath("chaindata")
+ ancientDir = config.Eth.DatabaseFreezer
+ )
switch {
- case path == "":
- path = filepath.Join(stack.ResolvePath("chaindata"), "ancient")
- case !filepath.IsAbs(path):
- path = config.Node.ResolvePath(path)
- }
- if common.FileExist(path) {
- confirmAndRemoveDB(path, "full node ancient database")
- } else {
- log.Info("Full node ancient database missing", "path", path)
- }
- // Remove the light node database
- path = stack.ResolvePath("lightchaindata")
- if common.FileExist(path) {
- confirmAndRemoveDB(path, "light node database")
- } else {
- log.Info("Light node database missing", "path", path)
+ case ancientDir == "":
+ ancientDir = filepath.Join(stack.ResolvePath("chaindata"), "ancient")
+ case !filepath.IsAbs(ancientDir):
+ ancientDir = config.Node.ResolvePath(ancientDir)
}
+ // Delete state data
+ statePaths := []string{rootDir, filepath.Join(ancientDir, rawdb.StateFreezerName)}
+ confirmAndRemoveDB(statePaths, "state data", ctx, removeStateDataFlag.Name)
+
+ // Delete ancient chain
+ chainPaths := []string{filepath.Join(ancientDir, rawdb.ChainFreezerName)}
+ confirmAndRemoveDB(chainPaths, "ancient chain", ctx, removeChainDataFlag.Name)
return nil
}
+// removeFolder deletes all files (not folders) inside the directory 'dir' (but
+// not files in subfolders).
+func removeFolder(dir string) {
+ filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
+ // If we're at the top level folder, recurse into
+ if path == dir {
+ return nil
+ }
+ // Delete all the files, but not subfolders
+ if !info.IsDir() {
+ os.Remove(path)
+ return nil
+ }
+ return filepath.SkipDir
+ })
+}
+
// confirmAndRemoveDB prompts the user for a last confirmation and removes the
-// folder if accepted.
-func confirmAndRemoveDB(database string, kind string) {
- confirm, err := prompt.Stdin.PromptConfirm(fmt.Sprintf("Remove %s (%s)?", kind, database))
+// list of folders if accepted.
+func confirmAndRemoveDB(paths []string, kind string, ctx *cli.Context, removeFlagName string) {
+ var (
+ confirm bool
+ err error
+ )
+ msg := fmt.Sprintf("Location(s) of '%s': \n", kind)
+ for _, path := range paths {
+ msg += fmt.Sprintf("\t- %s\n", path)
+ }
+ fmt.Println(msg)
+ if ctx.IsSet(removeFlagName) {
+ confirm = ctx.Bool(removeFlagName)
+ if confirm {
+ fmt.Printf("Remove '%s'? [y/n] y\n", kind)
+ } else {
+ fmt.Printf("Remove '%s'? [y/n] n\n", kind)
+ }
+ } else {
+ confirm, err = prompt.Stdin.PromptConfirm(fmt.Sprintf("Remove '%s'?", kind))
+ }
switch {
case err != nil:
utils.Fatalf("%v", err)
case !confirm:
- log.Info("Database deletion skipped", "path", database)
+ log.Info("Database deletion skipped", "kind", kind, "paths", paths)
default:
- start := time.Now()
- filepath.Walk(database, func(path string, info os.FileInfo, err error) error {
- // If we're at the top level folder, recurse into
- if path == database {
- return nil
+ var (
+ deleted []string
+ start = time.Now()
+ )
+ for _, path := range paths {
+ if common.FileExist(path) {
+ removeFolder(path)
+ deleted = append(deleted, path)
+ } else {
+ log.Info("Folder is not existent", "path", path)
}
- // Delete all the files, but not subfolders
- if !info.IsDir() {
- os.Remove(path)
- return nil
- }
- return filepath.SkipDir
- })
- log.Info("Database successfully deleted", "path", database, "elapsed", common.PrettyDuration(time.Since(start)))
+ }
+ log.Info("Database successfully deleted", "kind", kind, "paths", deleted, "elapsed", common.PrettyDuration(time.Since(start)))
}
}
diff --git a/cmd/geth/logging_test.go b/cmd/geth/logging_test.go
index 50991554b4..b5ce03f4b8 100644
--- a/cmd/geth/logging_test.go
+++ b/cmd/geth/logging_test.go
@@ -21,6 +21,7 @@ package main
import (
"bufio"
"bytes"
+ "encoding/json"
"fmt"
"io"
"math/rand"
@@ -28,7 +29,6 @@ import (
"os/exec"
"strings"
"testing"
- "encoding/json"
"github.com/ethereum/go-ethereum/internal/reexec"
)
diff --git a/cmd/geth/logtestcmd_active.go b/cmd/geth/logtestcmd_active.go
index 0ca4cc621d..f2a2c5ded5 100644
--- a/cmd/geth/logtestcmd_active.go
+++ b/cmd/geth/logtestcmd_active.go
@@ -26,7 +26,6 @@ import (
"time"
"github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/internal/debug"
"github.com/ethereum/go-ethereum/log"
"github.com/holiman/uint256"
"github.com/urfave/cli/v2"
@@ -43,6 +42,7 @@ This command is only meant for testing.
type customQuotedStringer struct {
}
+
func (c customQuotedStringer) String() string {
return "output with 'quotes'"
}
@@ -50,9 +50,6 @@ func (c customQuotedStringer) String() string {
// logTest is an entry point which spits out some logs. This is used by testing
// to verify expected outputs
func logTest(ctx *cli.Context) error {
- // clear field padding map
- debug.ResetLogging()
-
{ // big.Int
ba, _ := new(big.Int).SetString("111222333444555678999", 10) // "111,222,333,444,555,678,999"
bb, _ := new(big.Int).SetString("-111222333444555678999", 10) // "-111,222,333,444,555,678,999"
@@ -80,8 +77,6 @@ func logTest(ctx *cli.Context) error {
log.Info("uint64", "18,446,744,073,709,551,615", uint64(math.MaxUint64))
}
{ // Special characters
-
-
log.Info("Special chars in value", "key", "special \r\n\t chars")
log.Info("Special chars in key", "special \n\t chars", "value")
@@ -103,9 +98,6 @@ func logTest(ctx *cli.Context) error {
var c customQuotedStringer
log.Info("a custom stringer that emits quoted text", "output", c)
}
- { // Lazy eval
- log.Info("Lazy evaluation of value", "key", log.Lazy{Fn: func() interface{} { return "lazy value" }})
- }
{ // Multi-line message
log.Info("A message with wonky \U0001F4A9 characters")
log.Info("A multiline message \nINFO [10-18|14:11:31.106] with wonky characters \U0001F4A9")
@@ -166,6 +158,10 @@ func logTest(ctx *cli.Context) error {
{ // Logging with 'reserved' keys
log.Info("Using keys 't', 'lvl', 'time', 'level' and 'msg'", "t", "t", "time", "time", "lvl", "lvl", "level", "level", "msg", "msg")
}
+ { // Logging with wrong attr-value pairs
+ log.Info("Odd pair (1 attr)", "key")
+ log.Info("Odd pair (3 attr)", "key", "value", "key2")
+ }
return nil
}
diff --git a/cmd/geth/main.go b/cmd/geth/main.go
index 0d5939bd20..4438cef560 100644
--- a/cmd/geth/main.go
+++ b/cmd/geth/main.go
@@ -203,7 +203,6 @@ var app = flags.NewApp("the go-ethereum command line interface")
func init() {
// Initialize the CLI app and start Geth
app.Action = geth
- app.Copyright = "Copyright 2013-2023 The go-ethereum Authors"
app.Commands = []*cli.Command{
// See chaincmd.go:
initCommand,
diff --git a/cmd/geth/testdata/logging/logtest-json.txt b/cmd/geth/testdata/logging/logtest-json.txt
index bdc1ae4de6..d2bd0ad91a 100644
--- a/cmd/geth/testdata/logging/logtest-json.txt
+++ b/cmd/geth/testdata/logging/logtest-json.txt
@@ -21,7 +21,6 @@
{"t":"2023-11-22T15:42:00.408197+08:00","lvl":"info","msg":"an error message with quotes","error":"this is an 'error'"}
{"t":"2023-11-22T15:42:00.408202+08:00","lvl":"info","msg":"Custom Stringer value","2562047h47m16.854s":"2562047h47m16.854s"}
{"t":"2023-11-22T15:42:00.408208+08:00","lvl":"info","msg":"a custom stringer that emits quoted text","output":"output with 'quotes'"}
-{"t":"2023-11-22T15:42:00.408215+08:00","lvl":"info","msg":"Lazy evaluation of value","key":"lazy value"}
{"t":"2023-11-22T15:42:00.408219+08:00","lvl":"info","msg":"A message with wonky 💩 characters"}
{"t":"2023-11-22T15:42:00.408222+08:00","lvl":"info","msg":"A multiline message \nINFO [10-18|14:11:31.106] with wonky characters 💩"}
{"t":"2023-11-22T15:42:00.408226+08:00","lvl":"info","msg":"A multiline message \nLALA [ZZZZZZZZZZZZZZZZZZ] Actually part of message above"}
@@ -30,7 +29,7 @@
{"t":"2023-11-22T15:42:00.408237+08:00","lvl":"info","msg":"repeated-key 2","xx":"short","xx":"longer"}
{"t":"2023-11-22T15:42:00.408241+08:00","lvl":"info","msg":"log at level info"}
{"t":"2023-11-22T15:42:00.408244+08:00","lvl":"warn","msg":"log at level warn"}
-{"t":"2023-11-22T15:42:00.408247+08:00","lvl":"eror","msg":"log at level error"}
+{"t":"2023-11-22T15:42:00.408247+08:00","lvl":"error","msg":"log at level error"}
{"t":"2023-11-22T15:42:00.408251+08:00","lvl":"info","msg":"test","bar":"short","a":"aligned left"}
{"t":"2023-11-22T15:42:00.408254+08:00","lvl":"info","msg":"test","bar":"a long message","a":1}
{"t":"2023-11-22T15:42:00.408258+08:00","lvl":"info","msg":"test","bar":"short","a":"aligned right"}
@@ -49,3 +48,5 @@
{"t":"2023-11-22T15:42:00.40835+08:00","lvl":"info","msg":"raw nil","res":null}
{"t":"2023-11-22T15:42:00.408354+08:00","lvl":"info","msg":"(*uint64)(nil)","res":null}
{"t":"2023-11-22T15:42:00.408361+08:00","lvl":"info","msg":"Using keys 't', 'lvl', 'time', 'level' and 'msg'","t":"t","time":"time","lvl":"lvl","level":"level","msg":"msg"}
+{"t":"2023-11-29T15:13:00.195655931+01:00","lvl":"info","msg":"Odd pair (1 attr)","key":null,"LOG_ERROR":"Normalized odd number of arguments by adding nil"}
+{"t":"2023-11-29T15:13:00.195681832+01:00","lvl":"info","msg":"Odd pair (3 attr)","key":"value","key2":null,"LOG_ERROR":"Normalized odd number of arguments by adding nil"}
diff --git a/cmd/geth/testdata/logging/logtest-logfmt.txt b/cmd/geth/testdata/logging/logtest-logfmt.txt
index 114569e467..5c5316b7d9 100644
--- a/cmd/geth/testdata/logging/logtest-logfmt.txt
+++ b/cmd/geth/testdata/logging/logtest-logfmt.txt
@@ -21,7 +21,6 @@ t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg="\x1b[35mColored\x1b[0m[" "\x1b[35mColor
t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg="an error message with quotes" error="this is an 'error'"
t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg="Custom Stringer value" 2562047h47m16.854s=2562047h47m16.854s
t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg="a custom stringer that emits quoted text" output="output with 'quotes'"
-t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg="Lazy evaluation of value" key="lazy value"
t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg="A message with wonky 💩 characters"
t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg="A multiline message \nINFO [10-18|14:11:31.106] with wonky characters 💩"
t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg="A multiline message \nLALA [ZZZZZZZZZZZZZZZZZZ] Actually part of message above"
@@ -30,7 +29,7 @@ t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg="repeated-key 1" foo=alpha foo=beta
t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg="repeated-key 2" xx=short xx=longer
t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg="log at level info"
t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=warn msg="log at level warn"
-t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=eror msg="log at level error"
+t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=error msg="log at level error"
t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg=test bar=short a="aligned left"
t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg=test bar="a long message" a=1
t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg=test bar=short a="aligned right"
@@ -49,3 +48,5 @@ t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg=nil-custom-struct res=
t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg="raw nil" res=
t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg=(*uint64)(nil) res=
t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg="Using keys 't', 'lvl', 'time', 'level' and 'msg'" t=t time=time lvl=lvl level=level msg=msg
+t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg="Odd pair (1 attr)" key= LOG_ERROR="Normalized odd number of arguments by adding nil"
+t=xxxx-xx-xxTxx:xx:xx+xxxx lvl=info msg="Odd pair (3 attr)" key=value key2= LOG_ERROR="Normalized odd number of arguments by adding nil"
diff --git a/cmd/geth/testdata/logging/logtest-terminal.txt b/cmd/geth/testdata/logging/logtest-terminal.txt
index 4da3f49d46..e3b562117c 100644
--- a/cmd/geth/testdata/logging/logtest-terminal.txt
+++ b/cmd/geth/testdata/logging/logtest-terminal.txt
@@ -21,8 +21,7 @@ INFO [xx-xx|xx:xx:xx.xxx] "\x1b[35mColored\x1b[0m[" "\x1b[35mColo
INFO [xx-xx|xx:xx:xx.xxx] an error message with quotes error="this is an 'error'"
INFO [xx-xx|xx:xx:xx.xxx] Custom Stringer value 2562047h47m16.854s=2562047h47m16.854s
INFO [xx-xx|xx:xx:xx.xxx] a custom stringer that emits quoted text output="output with 'quotes'"
-INFO [xx-xx|xx:xx:xx.xxx] Lazy evaluation of value key="lazy value"
-INFO [xx-xx|xx:xx:xx.xxx] "A message with wonky 💩 characters"
+INFO [xx-xx|xx:xx:xx.xxx] "A message with wonky 💩 characters"
INFO [xx-xx|xx:xx:xx.xxx] "A multiline message \nINFO [10-18|14:11:31.106] with wonky characters 💩"
INFO [xx-xx|xx:xx:xx.xxx] A multiline message
LALA [ZZZZZZZZZZZZZZZZZZ] Actually part of message above
@@ -50,3 +49,5 @@ INFO [xx-xx|xx:xx:xx.xxx] nil-custom-struct res=
INFO [xx-xx|xx:xx:xx.xxx] raw nil res=
INFO [xx-xx|xx:xx:xx.xxx] (*uint64)(nil) res=
INFO [xx-xx|xx:xx:xx.xxx] Using keys 't', 'lvl', 'time', 'level' and 'msg' t=t time=time lvl=lvl level=level msg=msg
+INFO [xx-xx|xx:xx:xx.xxx] Odd pair (1 attr) key= LOG_ERROR="Normalized odd number of arguments by adding nil"
+INFO [xx-xx|xx:xx:xx.xxx] Odd pair (3 attr) key=value key2= LOG_ERROR="Normalized odd number of arguments by adding nil"
diff --git a/cmd/rlpdump/main.go b/cmd/rlpdump/main.go
index 70337749ae..7e1d314d49 100644
--- a/cmd/rlpdump/main.go
+++ b/cmd/rlpdump/main.go
@@ -25,7 +25,9 @@ import (
"flag"
"fmt"
"io"
+ "math"
"os"
+ "strconv"
"strings"
"github.com/ethereum/go-ethereum/common"
@@ -37,6 +39,7 @@ var (
reverseMode = flag.Bool("reverse", false, "convert ASCII to rlp")
noASCII = flag.Bool("noascii", false, "don't print ASCII strings readably")
single = flag.Bool("single", false, "print only the first element, discard the rest")
+ showpos = flag.Bool("pos", false, "display element byte posititions")
)
func init() {
@@ -52,17 +55,17 @@ If the filename is omitted, data is read from stdin.`)
func main() {
flag.Parse()
- var r io.Reader
+ var r *inStream
switch {
case *hexMode != "":
data, err := hex.DecodeString(strings.TrimPrefix(*hexMode, "0x"))
if err != nil {
die(err)
}
- r = bytes.NewReader(data)
+ r = newInStream(bytes.NewReader(data), int64(len(data)))
case flag.NArg() == 0:
- r = os.Stdin
+ r = newInStream(bufio.NewReader(os.Stdin), 0)
case flag.NArg() == 1:
fd, err := os.Open(flag.Arg(0))
@@ -70,13 +73,19 @@ func main() {
die(err)
}
defer fd.Close()
- r = fd
+ var size int64
+ finfo, err := fd.Stat()
+ if err == nil {
+ size = finfo.Size()
+ }
+ r = newInStream(bufio.NewReader(fd), size)
default:
fmt.Fprintln(os.Stderr, "Error: too many arguments")
flag.Usage()
os.Exit(2)
}
+
out := os.Stdout
if *reverseMode {
data, err := textToRlp(r)
@@ -93,10 +102,10 @@ func main() {
}
}
-func rlpToText(r io.Reader, out io.Writer) error {
- s := rlp.NewStream(r, 0)
+func rlpToText(in *inStream, out io.Writer) error {
+ stream := rlp.NewStream(in, 0)
for {
- if err := dump(s, 0, out); err != nil {
+ if err := dump(in, stream, 0, out); err != nil {
if err != io.EOF {
return err
}
@@ -110,7 +119,10 @@ func rlpToText(r io.Reader, out io.Writer) error {
return nil
}
-func dump(s *rlp.Stream, depth int, out io.Writer) error {
+func dump(in *inStream, s *rlp.Stream, depth int, out io.Writer) error {
+ if *showpos {
+ fmt.Fprintf(out, "%s: ", in.posLabel())
+ }
kind, size, err := s.Kind()
if err != nil {
return err
@@ -137,7 +149,7 @@ func dump(s *rlp.Stream, depth int, out io.Writer) error {
if i > 0 {
fmt.Fprint(out, ",\n")
}
- if err := dump(s, depth+1, out); err == rlp.EOL {
+ if err := dump(in, s, depth+1, out); err == rlp.EOL {
break
} else if err != nil {
return err
@@ -208,3 +220,36 @@ func textToRlp(r io.Reader) ([]byte, error) {
data, err := rlp.EncodeToBytes(obj[0])
return data, err
}
+
+type inStream struct {
+ br rlp.ByteReader
+ pos int
+ columns int
+}
+
+func newInStream(br rlp.ByteReader, totalSize int64) *inStream {
+ col := int(math.Ceil(math.Log10(float64(totalSize))))
+ return &inStream{br: br, columns: col}
+}
+
+func (rc *inStream) Read(b []byte) (n int, err error) {
+ n, err = rc.br.Read(b)
+ rc.pos += n
+ return n, err
+}
+
+func (rc *inStream) ReadByte() (byte, error) {
+ b, err := rc.br.ReadByte()
+ if err == nil {
+ rc.pos++
+ }
+ return b, err
+}
+
+func (rc *inStream) posLabel() string {
+ l := strconv.FormatInt(int64(rc.pos), 10)
+ if len(l) < rc.columns {
+ l = strings.Repeat(" ", rc.columns-len(l)) + l
+ }
+ return l
+}
diff --git a/cmd/rlpdump/rlpdump_test.go b/cmd/rlpdump/rlpdump_test.go
index 8d55f4200a..4b0ae680ac 100644
--- a/cmd/rlpdump/rlpdump_test.go
+++ b/cmd/rlpdump/rlpdump_test.go
@@ -34,7 +34,8 @@ func TestRoundtrip(t *testing.T) {
"0xc780c0c1c0825208",
} {
var out strings.Builder
- err := rlpToText(bytes.NewReader(common.FromHex(want)), &out)
+ in := newInStream(bytes.NewReader(common.FromHex(want)), 0)
+ err := rlpToText(in, &out)
if err != nil {
t.Fatal(err)
}
diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go
index 27e1b3f623..159c47ca01 100644
--- a/cmd/utils/flags.go
+++ b/cmd/utils/flags.go
@@ -1088,8 +1088,10 @@ func SplitAndTrim(input string) (ret []string) {
// setHTTP creates the HTTP RPC listener interface string from the set
// command line flags, returning empty if the HTTP endpoint is disabled.
func setHTTP(ctx *cli.Context, cfg *node.Config) {
- if ctx.Bool(HTTPEnabledFlag.Name) && cfg.HTTPHost == "" {
- cfg.HTTPHost = "127.0.0.1"
+ if ctx.Bool(HTTPEnabledFlag.Name) {
+ if cfg.HTTPHost == "" {
+ cfg.HTTPHost = "127.0.0.1"
+ }
if ctx.IsSet(HTTPListenAddrFlag.Name) {
cfg.HTTPHost = ctx.String(HTTPListenAddrFlag.Name)
}
@@ -1153,8 +1155,10 @@ func setGraphQL(ctx *cli.Context, cfg *node.Config) {
// setWS creates the WebSocket RPC listener interface string from the set
// command line flags, returning empty if the HTTP endpoint is disabled.
func setWS(ctx *cli.Context, cfg *node.Config) {
- if ctx.Bool(WSEnabledFlag.Name) && cfg.WSHost == "" {
- cfg.WSHost = "127.0.0.1"
+ if ctx.Bool(WSEnabledFlag.Name) {
+ if cfg.WSHost == "" {
+ cfg.WSHost = "127.0.0.1"
+ }
if ctx.IsSet(WSListenAddrFlag.Name) {
cfg.WSHost = ctx.String(WSListenAddrFlag.Name)
}
@@ -1677,10 +1681,16 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *ethconfig.Config) {
if ctx.IsSet(CacheLogSizeFlag.Name) {
cfg.FilterLogCacheSize = ctx.Int(CacheLogSizeFlag.Name)
}
- if !ctx.Bool(SnapshotFlag.Name) {
+ if !ctx.Bool(SnapshotFlag.Name) || cfg.SnapshotCache == 0 {
// If snap-sync is requested, this flag is also required
if cfg.SyncMode == downloader.SnapSync {
- log.Info("Snap sync requested, enabling --snapshot")
+ if !ctx.Bool(SnapshotFlag.Name) {
+ log.Warn("Snap sync requested, enabling --snapshot")
+ }
+ if cfg.SnapshotCache == 0 {
+ log.Warn("Snap sync requested, resetting --cache.snapshot")
+ cfg.SnapshotCache = ctx.Int(CacheFlag.Name) * CacheSnapshotFlag.Value / 100
+ }
} else {
cfg.TrieCleanCache += cfg.SnapshotCache
cfg.SnapshotCache = 0 // Disabled
diff --git a/common/hexutil/json.go b/common/hexutil/json.go
index 50db208118..e0ac98f52d 100644
--- a/common/hexutil/json.go
+++ b/common/hexutil/json.go
@@ -23,6 +23,8 @@ import (
"math/big"
"reflect"
"strconv"
+
+ "github.com/holiman/uint256"
)
var (
@@ -30,6 +32,7 @@ var (
bigT = reflect.TypeOf((*Big)(nil))
uintT = reflect.TypeOf(Uint(0))
uint64T = reflect.TypeOf(Uint64(0))
+ u256T = reflect.TypeOf((*uint256.Int)(nil))
)
// Bytes marshals/unmarshals as a JSON string with 0x prefix.
@@ -225,6 +228,48 @@ func (b *Big) UnmarshalGraphQL(input interface{}) error {
return err
}
+// U256 marshals/unmarshals as a JSON string with 0x prefix.
+// The zero value marshals as "0x0".
+type U256 uint256.Int
+
+// MarshalText implements encoding.TextMarshaler
+func (b U256) MarshalText() ([]byte, error) {
+ u256 := (*uint256.Int)(&b)
+ return []byte(u256.Hex()), nil
+}
+
+// UnmarshalJSON implements json.Unmarshaler.
+func (b *U256) UnmarshalJSON(input []byte) error {
+ // The uint256.Int.UnmarshalJSON method accepts "dec", "0xhex"; we must be
+ // more strict, hence we check string and invoke SetFromHex directly.
+ if !isString(input) {
+ return errNonString(u256T)
+ }
+ // The hex decoder needs to accept empty string ("") as '0', which uint256.Int
+ // would reject.
+ if len(input) == 2 {
+ (*uint256.Int)(b).Clear()
+ return nil
+ }
+ err := (*uint256.Int)(b).SetFromHex(string(input[1 : len(input)-1]))
+ if err != nil {
+ return &json.UnmarshalTypeError{Value: err.Error(), Type: u256T}
+ }
+ return nil
+}
+
+// UnmarshalText implements encoding.TextUnmarshaler
+func (b *U256) UnmarshalText(input []byte) error {
+ // The uint256.Int.UnmarshalText method accepts "dec", "0xhex"; we must be
+ // more strict, hence we check string and invoke SetFromHex directly.
+ return (*uint256.Int)(b).SetFromHex(string(input))
+}
+
+// String returns the hex encoding of b.
+func (b *U256) String() string {
+ return (*uint256.Int)(b).Hex()
+}
+
// Uint64 marshals/unmarshals as a JSON string with 0x prefix.
// The zero value marshals as "0x0".
type Uint64 uint64
diff --git a/common/hexutil/json_test.go b/common/hexutil/json_test.go
index ed7d6fad1a..7cca300951 100644
--- a/common/hexutil/json_test.go
+++ b/common/hexutil/json_test.go
@@ -23,6 +23,8 @@ import (
"errors"
"math/big"
"testing"
+
+ "github.com/holiman/uint256"
)
func checkError(t *testing.T, input string, got, want error) bool {
@@ -176,6 +178,64 @@ func TestUnmarshalBig(t *testing.T) {
}
}
+var unmarshalU256Tests = []unmarshalTest{
+ // invalid encoding
+ {input: "", wantErr: errJSONEOF},
+ {input: "null", wantErr: errNonString(u256T)},
+ {input: "10", wantErr: errNonString(u256T)},
+ {input: `"0"`, wantErr: wrapTypeError(ErrMissingPrefix, u256T)},
+ {input: `"0x"`, wantErr: wrapTypeError(ErrEmptyNumber, u256T)},
+ {input: `"0x01"`, wantErr: wrapTypeError(ErrLeadingZero, u256T)},
+ {input: `"0xx"`, wantErr: wrapTypeError(ErrSyntax, u256T)},
+ {input: `"0x1zz01"`, wantErr: wrapTypeError(ErrSyntax, u256T)},
+ {
+ input: `"0x10000000000000000000000000000000000000000000000000000000000000000"`,
+ wantErr: wrapTypeError(ErrBig256Range, u256T),
+ },
+
+ // valid encoding
+ {input: `""`, want: big.NewInt(0)},
+ {input: `"0x0"`, want: big.NewInt(0)},
+ {input: `"0x2"`, want: big.NewInt(0x2)},
+ {input: `"0x2F2"`, want: big.NewInt(0x2f2)},
+ {input: `"0X2F2"`, want: big.NewInt(0x2f2)},
+ {input: `"0x1122aaff"`, want: big.NewInt(0x1122aaff)},
+ {input: `"0xbBb"`, want: big.NewInt(0xbbb)},
+ {input: `"0xfffffffff"`, want: big.NewInt(0xfffffffff)},
+ {
+ input: `"0x112233445566778899aabbccddeeff"`,
+ want: referenceBig("112233445566778899aabbccddeeff"),
+ },
+ {
+ input: `"0xffffffffffffffffffffffffffffffffffff"`,
+ want: referenceBig("ffffffffffffffffffffffffffffffffffff"),
+ },
+ {
+ input: `"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"`,
+ want: referenceBig("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),
+ },
+}
+
+func TestUnmarshalU256(t *testing.T) {
+ for _, test := range unmarshalU256Tests {
+ var v U256
+ err := json.Unmarshal([]byte(test.input), &v)
+ if !checkError(t, test.input, err, test.wantErr) {
+ continue
+ }
+ if test.want == nil {
+ continue
+ }
+ want := new(uint256.Int)
+ want.SetFromBig(test.want.(*big.Int))
+ have := (*uint256.Int)(&v)
+ if want.Cmp(have) != 0 {
+ t.Errorf("input %s: value mismatch: have %x, want %x", test.input, have, want)
+ continue
+ }
+ }
+}
+
func BenchmarkUnmarshalBig(b *testing.B) {
input := []byte(`"0x123456789abcdef123456789abcdef"`)
for i := 0; i < b.N; i++ {
diff --git a/core/forkid/forkid_test.go b/core/forkid/forkid_test.go
index e311c0b43f..753a32b7ef 100644
--- a/core/forkid/forkid_test.go
+++ b/core/forkid/forkid_test.go
@@ -91,8 +91,10 @@ func TestCreation(t *testing.T) {
{5000000, 0, ID{Hash: checksumToBytes(0x757a1c47), Next: 5062605}}, // Last Berlin block
{5062605, 0, ID{Hash: checksumToBytes(0xB8C6299D), Next: 1678832736}}, // First London block
{6000000, 1678832735, ID{Hash: checksumToBytes(0xB8C6299D), Next: 1678832736}}, // Last London block
- {6000001, 1678832736, ID{Hash: checksumToBytes(0xf9843abf), Next: 0}}, // First Shanghai block
- {6500000, 2678832736, ID{Hash: checksumToBytes(0xf9843abf), Next: 0}}, // Future Shanghai block
+ {6000001, 1678832736, ID{Hash: checksumToBytes(0xf9843abf), Next: 1705473120}}, // First Shanghai block
+ {6500002, 1705473119, ID{Hash: checksumToBytes(0xf9843abf), Next: 1705473120}}, // Last Shanghai block
+ {6500003, 1705473120, ID{Hash: checksumToBytes(0x70cc14e2), Next: 0}}, // First Cancun block
+ {6500003, 2705473120, ID{Hash: checksumToBytes(0x70cc14e2), Next: 0}}, // Future Cancun block
},
},
// Sepolia test cases
diff --git a/core/rawdb/accessors_trie.go b/core/rawdb/accessors_trie.go
index 78f1a70b1c..ea3367db36 100644
--- a/core/rawdb/accessors_trie.go
+++ b/core/rawdb/accessors_trie.go
@@ -292,6 +292,11 @@ func ReadStateScheme(db ethdb.Reader) string {
if len(blob) != 0 {
return PathScheme
}
+ // The root node might be deleted during the initial snap sync, check
+ // the persistent state id then.
+ if id := ReadPersistentStateID(db); id != 0 {
+ return PathScheme
+ }
// In a hash-based scheme, the genesis state is consistently stored
// on the disk. To assess the scheme of the persistent state, it
// suffices to inspect the scheme of the genesis state.
diff --git a/core/rawdb/ancient_scheme.go b/core/rawdb/ancient_scheme.go
index 6f409fff1d..e88867af0e 100644
--- a/core/rawdb/ancient_scheme.go
+++ b/core/rawdb/ancient_scheme.go
@@ -68,14 +68,14 @@ var stateFreezerNoSnappy = map[string]bool{
// The list of identifiers of ancient stores.
var (
- chainFreezerName = "chain" // the folder name of chain segment ancient store.
- stateFreezerName = "state" // the folder name of reverse diff ancient store.
+ ChainFreezerName = "chain" // the folder name of chain segment ancient store.
+ StateFreezerName = "state" // the folder name of reverse diff ancient store.
)
// freezers the collections of all builtin freezers.
-var freezers = []string{chainFreezerName, stateFreezerName}
+var freezers = []string{ChainFreezerName, StateFreezerName}
// NewStateFreezer initializes the freezer for state history.
func NewStateFreezer(ancientDir string, readOnly bool) (*ResettableFreezer, error) {
- return NewResettableFreezer(filepath.Join(ancientDir, stateFreezerName), "eth/db/state", readOnly, stateHistoryTableSize, stateFreezerNoSnappy)
+ return NewResettableFreezer(filepath.Join(ancientDir, StateFreezerName), "eth/db/state", readOnly, stateHistoryTableSize, stateFreezerNoSnappy)
}
diff --git a/core/rawdb/ancient_utils.go b/core/rawdb/ancient_utils.go
index 1b93a9aa5a..428cda544b 100644
--- a/core/rawdb/ancient_utils.go
+++ b/core/rawdb/ancient_utils.go
@@ -81,14 +81,14 @@ func inspectFreezers(db ethdb.Database) ([]freezerInfo, error) {
var infos []freezerInfo
for _, freezer := range freezers {
switch freezer {
- case chainFreezerName:
- info, err := inspect(chainFreezerName, chainFreezerNoSnappy, db)
+ case ChainFreezerName:
+ info, err := inspect(ChainFreezerName, chainFreezerNoSnappy, db)
if err != nil {
return nil, err
}
infos = append(infos, info)
- case stateFreezerName:
+ case StateFreezerName:
if ReadStateScheme(db) != PathScheme {
continue
}
@@ -102,7 +102,7 @@ func inspectFreezers(db ethdb.Database) ([]freezerInfo, error) {
}
defer f.Close()
- info, err := inspect(stateFreezerName, stateFreezerNoSnappy, f)
+ info, err := inspect(StateFreezerName, stateFreezerNoSnappy, f)
if err != nil {
return nil, err
}
@@ -125,9 +125,9 @@ func InspectFreezerTable(ancient string, freezerName string, tableName string, s
tables map[string]bool
)
switch freezerName {
- case chainFreezerName:
+ case ChainFreezerName:
path, tables = resolveChainFreezerDir(ancient), chainFreezerNoSnappy
- case stateFreezerName:
+ case StateFreezerName:
path, tables = filepath.Join(ancient, freezerName), stateFreezerNoSnappy
default:
return fmt.Errorf("unknown freezer, supported ones: %v", freezers)
diff --git a/core/rawdb/chain_freezer.go b/core/rawdb/chain_freezer.go
index cbfaf5b9e4..bb2c409dbb 100644
--- a/core/rawdb/chain_freezer.go
+++ b/core/rawdb/chain_freezer.go
@@ -131,7 +131,7 @@ func (f *chainFreezer) freeze(db ethdb.KeyValueStore) {
continue
case *number < threshold:
- log.Debug("Current full block not old enough", "number", *number, "hash", hash, "delay", threshold)
+ log.Debug("Current full block not old enough to freeze", "number", *number, "hash", hash, "delay", threshold)
backoff = true
continue
diff --git a/core/rawdb/database.go b/core/rawdb/database.go
index 1d7b7d1ca8..18b5bccb51 100644
--- a/core/rawdb/database.go
+++ b/core/rawdb/database.go
@@ -178,7 +178,7 @@ func resolveChainFreezerDir(ancient string) string {
// sub folder, if not then two possibilities:
// - chain freezer is not initialized
// - chain freezer exists in legacy location (root ancient folder)
- freezer := path.Join(ancient, chainFreezerName)
+ freezer := path.Join(ancient, ChainFreezerName)
if !common.FileExist(freezer) {
if !common.FileExist(ancient) {
// The entire ancient store is not initialized, still use the sub
diff --git a/core/rawdb/freezer_table.go b/core/rawdb/freezer_table.go
index 61436bf932..4b9d510e82 100644
--- a/core/rawdb/freezer_table.go
+++ b/core/rawdb/freezer_table.go
@@ -467,6 +467,20 @@ func (t *freezerTable) truncateHead(items uint64) error {
return nil
}
+// sizeHidden returns the total data size of hidden items in the freezer table.
+// This function assumes the lock is already held.
+func (t *freezerTable) sizeHidden() (uint64, error) {
+ hidden, offset := t.itemHidden.Load(), t.itemOffset.Load()
+ if hidden <= offset {
+ return 0, nil
+ }
+ indices, err := t.getIndices(hidden-1, 1)
+ if err != nil {
+ return 0, err
+ }
+ return uint64(indices[1].offset), nil
+}
+
// truncateTail discards any recent data before the provided threshold number.
func (t *freezerTable) truncateTail(items uint64) error {
t.lock.Lock()
@@ -495,6 +509,12 @@ func (t *freezerTable) truncateTail(items uint64) error {
newTail.unmarshalBinary(buffer)
newTailId = newTail.filenum
}
+ // Save the old size for metrics tracking. This needs to be done
+ // before any updates to either itemHidden or itemOffset.
+ oldSize, err := t.sizeNolock()
+ if err != nil {
+ return err
+ }
// Update the virtual tail marker and hidden these entries in table.
t.itemHidden.Store(items)
if err := writeMetadata(t.meta, newMetadata(items)); err != nil {
@@ -509,18 +529,12 @@ func (t *freezerTable) truncateTail(items uint64) error {
if t.tailId > newTailId {
return fmt.Errorf("invalid index, tail-file %d, item-file %d", t.tailId, newTailId)
}
- // Hidden items exceed the current tail file, drop the relevant
- // data files. We need to truncate, save the old size for metrics
- // tracking.
- oldSize, err := t.sizeNolock()
- if err != nil {
- return err
- }
// Count how many items can be deleted from the file.
var (
newDeleted = items
deleted = t.itemOffset.Load()
)
+ // Hidden items exceed the current tail file, drop the relevant data files.
for current := items - 1; current >= deleted; current -= 1 {
if _, err := t.index.ReadAt(buffer, int64((current-deleted+1)*indexEntrySize)); err != nil {
return err
@@ -680,6 +694,7 @@ func (t *freezerTable) releaseFilesBefore(num uint32, remove bool) {
func (t *freezerTable) getIndices(from, count uint64) ([]*indexEntry, error) {
// Apply the table-offset
from = from - t.itemOffset.Load()
+
// For reading N items, we need N+1 indices.
buffer := make([]byte, (count+1)*indexEntrySize)
if _, err := t.index.ReadAt(buffer, int64(from*indexEntrySize)); err != nil {
@@ -870,14 +885,18 @@ func (t *freezerTable) size() (uint64, error) {
return t.sizeNolock()
}
-// sizeNolock returns the total data size in the freezer table without obtaining
-// the mutex first.
+// sizeNolock returns the total data size in the freezer table. This function
+// assumes the lock is already held.
func (t *freezerTable) sizeNolock() (uint64, error) {
stat, err := t.index.Stat()
if err != nil {
return 0, err
}
- total := uint64(t.maxFileSize)*uint64(t.headId-t.tailId) + uint64(t.headBytes) + uint64(stat.Size())
+ hidden, err := t.sizeHidden()
+ if err != nil {
+ return 0, err
+ }
+ total := uint64(t.maxFileSize)*uint64(t.headId-t.tailId) + uint64(t.headBytes) + uint64(stat.Size()) - hidden
return total, nil
}
diff --git a/core/rawdb/freezer_table_test.go b/core/rawdb/freezer_table_test.go
index 939d093946..4471463932 100644
--- a/core/rawdb/freezer_table_test.go
+++ b/core/rawdb/freezer_table_test.go
@@ -658,6 +658,13 @@ func TestFreezerOffset(t *testing.T) {
}
}
+func assertTableSize(t *testing.T, f *freezerTable, size int) {
+ t.Helper()
+ if got, err := f.size(); got != uint64(size) {
+ t.Fatalf("expected size of %d bytes, got %d, err: %v", size, got, err)
+ }
+}
+
func TestTruncateTail(t *testing.T) {
t.Parallel()
rm, wm, sg := metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge()
@@ -692,6 +699,9 @@ func TestTruncateTail(t *testing.T) {
5: getChunk(20, 0xaa),
6: getChunk(20, 0x11),
})
+ // maxFileSize*fileCount + headBytes + indexFileSize - hiddenBytes
+ expected := 20*7 + 48 - 0
+ assertTableSize(t, f, expected)
// truncate single element( item 0 ), deletion is only supported at file level
f.truncateTail(1)
@@ -707,6 +717,8 @@ func TestTruncateTail(t *testing.T) {
5: getChunk(20, 0xaa),
6: getChunk(20, 0x11),
})
+ expected = 20*7 + 48 - 20
+ assertTableSize(t, f, expected)
// Reopen the table, the deletion information should be persisted as well
f.Close()
@@ -739,6 +751,8 @@ func TestTruncateTail(t *testing.T) {
5: getChunk(20, 0xaa),
6: getChunk(20, 0x11),
})
+ expected = 20*5 + 36 - 0
+ assertTableSize(t, f, expected)
// Reopen the table, the above testing should still pass
f.Close()
@@ -760,6 +774,23 @@ func TestTruncateTail(t *testing.T) {
6: getChunk(20, 0x11),
})
+ // truncate 3 more elements( item 2, 3, 4), the file 1 should be deleted
+ // file 2 should only contain item 5
+ f.truncateTail(5)
+ checkRetrieveError(t, f, map[uint64]error{
+ 0: errOutOfBounds,
+ 1: errOutOfBounds,
+ 2: errOutOfBounds,
+ 3: errOutOfBounds,
+ 4: errOutOfBounds,
+ })
+ checkRetrieve(t, f, map[uint64][]byte{
+ 5: getChunk(20, 0xaa),
+ 6: getChunk(20, 0x11),
+ })
+ expected = 20*3 + 24 - 20
+ assertTableSize(t, f, expected)
+
// truncate all, the entire freezer should be deleted
f.truncateTail(7)
checkRetrieveError(t, f, map[uint64]error{
@@ -771,6 +802,8 @@ func TestTruncateTail(t *testing.T) {
5: errOutOfBounds,
6: errOutOfBounds,
})
+ expected = 12
+ assertTableSize(t, f, expected)
}
func TestTruncateHead(t *testing.T) {
diff --git a/core/rawdb/schema.go b/core/rawdb/schema.go
index 8e82459e82..be03723553 100644
--- a/core/rawdb/schema.go
+++ b/core/rawdb/schema.go
@@ -132,6 +132,10 @@ var (
CliqueSnapshotPrefix = []byte("clique-")
+ BestUpdateKey = []byte("update-") // bigEndian64(syncPeriod) -> RLP(types.LightClientUpdate) (nextCommittee only referenced by root hash)
+ FixedCommitteeRootKey = []byte("fixedRoot-") // bigEndian64(syncPeriod) -> committee root hash
+ SyncCommitteeKey = []byte("committee-") // bigEndian64(syncPeriod) -> serialized committee
+
preimageCounter = metrics.NewRegisteredCounter("db/preimage/total", nil)
preimageHitCounter = metrics.NewRegisteredCounter("db/preimage/hits", nil)
)
diff --git a/core/state/dump.go b/core/state/dump.go
index cf46621144..55abb50f1c 100644
--- a/core/state/dump.go
+++ b/core/state/dump.go
@@ -129,6 +129,7 @@ func (s *StateDB) DumpToCollector(c DumpCollector, conf *DumpConfig) (nextKey []
trieIt, err := s.trie.NodeIterator(conf.Start)
if err != nil {
+ log.Error("Trie dumping error", "err", err)
return nil
}
it := trie.NewIterator(trieIt)
diff --git a/core/state/state_test.go b/core/state/state_test.go
index 2f45ba44b4..029d03c22b 100644
--- a/core/state/state_test.go
+++ b/core/state/state_test.go
@@ -48,11 +48,11 @@ func TestDump(t *testing.T) {
s := &stateEnv{db: db, state: sdb}
// generate a few entries
- obj1 := s.state.GetOrNewStateObject(common.BytesToAddress([]byte{0x01}))
+ obj1 := s.state.getOrNewStateObject(common.BytesToAddress([]byte{0x01}))
obj1.AddBalance(big.NewInt(22))
- obj2 := s.state.GetOrNewStateObject(common.BytesToAddress([]byte{0x01, 0x02}))
+ obj2 := s.state.getOrNewStateObject(common.BytesToAddress([]byte{0x01, 0x02}))
obj2.SetCode(crypto.Keccak256Hash([]byte{3, 3, 3, 3, 3, 3, 3}), []byte{3, 3, 3, 3, 3, 3, 3})
- obj3 := s.state.GetOrNewStateObject(common.BytesToAddress([]byte{0x02}))
+ obj3 := s.state.getOrNewStateObject(common.BytesToAddress([]byte{0x02}))
obj3.SetBalance(big.NewInt(44))
// write some of them to the trie
@@ -105,13 +105,13 @@ func TestIterativeDump(t *testing.T) {
s := &stateEnv{db: db, state: sdb}
// generate a few entries
- obj1 := s.state.GetOrNewStateObject(common.BytesToAddress([]byte{0x01}))
+ obj1 := s.state.getOrNewStateObject(common.BytesToAddress([]byte{0x01}))
obj1.AddBalance(big.NewInt(22))
- obj2 := s.state.GetOrNewStateObject(common.BytesToAddress([]byte{0x01, 0x02}))
+ obj2 := s.state.getOrNewStateObject(common.BytesToAddress([]byte{0x01, 0x02}))
obj2.SetCode(crypto.Keccak256Hash([]byte{3, 3, 3, 3, 3, 3, 3}), []byte{3, 3, 3, 3, 3, 3, 3})
- obj3 := s.state.GetOrNewStateObject(common.BytesToAddress([]byte{0x02}))
+ obj3 := s.state.getOrNewStateObject(common.BytesToAddress([]byte{0x02}))
obj3.SetBalance(big.NewInt(44))
- obj4 := s.state.GetOrNewStateObject(common.BytesToAddress([]byte{0x00}))
+ obj4 := s.state.getOrNewStateObject(common.BytesToAddress([]byte{0x00}))
obj4.AddBalance(big.NewInt(1337))
// write some of them to the trie
diff --git a/core/state/statedb.go b/core/state/statedb.go
index 905944cbb5..3804c6603b 100644
--- a/core/state/statedb.go
+++ b/core/state/statedb.go
@@ -331,10 +331,10 @@ func (s *StateDB) GetCodeSize(addr common.Address) int {
func (s *StateDB) GetCodeHash(addr common.Address) common.Hash {
stateObject := s.getStateObject(addr)
- if stateObject == nil {
- return common.Hash{}
+ if stateObject != nil {
+ return common.BytesToHash(stateObject.CodeHash())
}
- return common.BytesToHash(stateObject.CodeHash())
+ return common.Hash{}
}
// GetState retrieves a value from the given account's storage trie.
@@ -374,7 +374,7 @@ func (s *StateDB) HasSelfDestructed(addr common.Address) bool {
// AddBalance adds amount to the account associated with addr.
func (s *StateDB) AddBalance(addr common.Address, amount *big.Int) {
- stateObject := s.GetOrNewStateObject(addr)
+ stateObject := s.getOrNewStateObject(addr)
if stateObject != nil {
stateObject.AddBalance(amount)
}
@@ -382,35 +382,35 @@ func (s *StateDB) AddBalance(addr common.Address, amount *big.Int) {
// SubBalance subtracts amount from the account associated with addr.
func (s *StateDB) SubBalance(addr common.Address, amount *big.Int) {
- stateObject := s.GetOrNewStateObject(addr)
+ stateObject := s.getOrNewStateObject(addr)
if stateObject != nil {
stateObject.SubBalance(amount)
}
}
func (s *StateDB) SetBalance(addr common.Address, amount *big.Int) {
- stateObject := s.GetOrNewStateObject(addr)
+ stateObject := s.getOrNewStateObject(addr)
if stateObject != nil {
stateObject.SetBalance(amount)
}
}
func (s *StateDB) SetNonce(addr common.Address, nonce uint64) {
- stateObject := s.GetOrNewStateObject(addr)
+ stateObject := s.getOrNewStateObject(addr)
if stateObject != nil {
stateObject.SetNonce(nonce)
}
}
func (s *StateDB) SetCode(addr common.Address, code []byte) {
- stateObject := s.GetOrNewStateObject(addr)
+ stateObject := s.getOrNewStateObject(addr)
if stateObject != nil {
stateObject.SetCode(crypto.Keccak256Hash(code), code)
}
}
func (s *StateDB) SetState(addr common.Address, key, value common.Hash) {
- stateObject := s.GetOrNewStateObject(addr)
+ stateObject := s.getOrNewStateObject(addr)
if stateObject != nil {
stateObject.SetState(key, value)
}
@@ -431,7 +431,7 @@ func (s *StateDB) SetStorage(addr common.Address, storage map[common.Hash]common
if _, ok := s.stateObjectsDestruct[addr]; !ok {
s.stateObjectsDestruct[addr] = nil
}
- stateObject := s.GetOrNewStateObject(addr)
+ stateObject := s.getOrNewStateObject(addr)
for k, v := range storage {
stateObject.SetState(k, v)
}
@@ -614,8 +614,8 @@ func (s *StateDB) setStateObject(object *stateObject) {
s.stateObjects[object.Address()] = object
}
-// GetOrNewStateObject retrieves a state object or create a new state object if nil.
-func (s *StateDB) GetOrNewStateObject(addr common.Address) *stateObject {
+// getOrNewStateObject retrieves a state object or create a new state object if nil.
+func (s *StateDB) getOrNewStateObject(addr common.Address) *stateObject {
stateObject := s.getStateObject(addr)
if stateObject == nil {
stateObject, _ = s.createObject(addr)
diff --git a/core/state/statedb_test.go b/core/state/statedb_test.go
index df1cd5547d..322299a468 100644
--- a/core/state/statedb_test.go
+++ b/core/state/statedb_test.go
@@ -166,7 +166,7 @@ func TestCopy(t *testing.T) {
orig, _ := New(types.EmptyRootHash, NewDatabase(rawdb.NewMemoryDatabase()), nil)
for i := byte(0); i < 255; i++ {
- obj := orig.GetOrNewStateObject(common.BytesToAddress([]byte{i}))
+ obj := orig.getOrNewStateObject(common.BytesToAddress([]byte{i}))
obj.AddBalance(big.NewInt(int64(i)))
orig.updateStateObject(obj)
}
@@ -180,9 +180,9 @@ func TestCopy(t *testing.T) {
// modify all in memory
for i := byte(0); i < 255; i++ {
- origObj := orig.GetOrNewStateObject(common.BytesToAddress([]byte{i}))
- copyObj := copy.GetOrNewStateObject(common.BytesToAddress([]byte{i}))
- ccopyObj := ccopy.GetOrNewStateObject(common.BytesToAddress([]byte{i}))
+ origObj := orig.getOrNewStateObject(common.BytesToAddress([]byte{i}))
+ copyObj := copy.getOrNewStateObject(common.BytesToAddress([]byte{i}))
+ ccopyObj := ccopy.getOrNewStateObject(common.BytesToAddress([]byte{i}))
origObj.AddBalance(big.NewInt(2 * int64(i)))
copyObj.AddBalance(big.NewInt(3 * int64(i)))
@@ -208,9 +208,9 @@ func TestCopy(t *testing.T) {
// Verify that the three states have been updated independently
for i := byte(0); i < 255; i++ {
- origObj := orig.GetOrNewStateObject(common.BytesToAddress([]byte{i}))
- copyObj := copy.GetOrNewStateObject(common.BytesToAddress([]byte{i}))
- ccopyObj := ccopy.GetOrNewStateObject(common.BytesToAddress([]byte{i}))
+ origObj := orig.getOrNewStateObject(common.BytesToAddress([]byte{i}))
+ copyObj := copy.getOrNewStateObject(common.BytesToAddress([]byte{i}))
+ ccopyObj := ccopy.getOrNewStateObject(common.BytesToAddress([]byte{i}))
if want := big.NewInt(3 * int64(i)); origObj.Balance().Cmp(want) != 0 {
t.Errorf("orig obj %d: balance mismatch: have %v, want %v", i, origObj.Balance(), want)
@@ -531,7 +531,7 @@ func (test *snapshotTest) checkEqual(state, checkstate *StateDB) error {
func TestTouchDelete(t *testing.T) {
s := newStateEnv()
- s.state.GetOrNewStateObject(common.Address{})
+ s.state.getOrNewStateObject(common.Address{})
root, _ := s.state.Commit(0, false)
s.state, _ = New(root, s.state.db, s.state.snaps)
@@ -1158,7 +1158,7 @@ func TestDeleteStorage(t *testing.T) {
fastState, _ := New(root, db, snaps)
slowState, _ := New(root, db, nil)
- obj := fastState.GetOrNewStateObject(addr)
+ obj := fastState.getOrNewStateObject(addr)
storageRoot := obj.data.Root
_, _, fastNodes, err := fastState.deleteStorage(addr, crypto.Keccak256Hash(addr[:]), storageRoot)
diff --git a/core/state/sync_test.go b/core/state/sync_test.go
index 6196e77817..21c65b9104 100644
--- a/core/state/sync_test.go
+++ b/core/state/sync_test.go
@@ -57,7 +57,7 @@ func makeTestState(scheme string) (ethdb.Database, Database, *trie.Database, com
// Fill it with some arbitrary data
var accounts []*testAccount
for i := byte(0); i < 96; i++ {
- obj := state.GetOrNewStateObject(common.BytesToAddress([]byte{i}))
+ obj := state.getOrNewStateObject(common.BytesToAddress([]byte{i}))
acc := &testAccount{address: common.BytesToAddress([]byte{i})}
obj.AddBalance(big.NewInt(int64(11 * i)))
diff --git a/core/txpool/blobpool/blobpool.go b/core/txpool/blobpool/blobpool.go
index 32c6c0e8fe..92be8cef43 100644
--- a/core/txpool/blobpool/blobpool.go
+++ b/core/txpool/blobpool/blobpool.go
@@ -583,7 +583,7 @@ func (p *BlobPool) recheck(addr common.Address, inclusions map[common.Hash]uint6
txs[0].evictionBlobFeeJumps = txs[0].blobfeeJumps
for i := 1; i < len(txs); i++ {
- // If there's no nonce gap, initialize the evicion thresholds as the
+ // If there's no nonce gap, initialize the eviction thresholds as the
// minimum between the cumulative thresholds and the current tx fees
if txs[i].nonce == txs[i-1].nonce+1 {
txs[i].evictionExecTip = txs[i-1].evictionExecTip
@@ -738,7 +738,7 @@ func (p *BlobPool) offload(addr common.Address, nonce uint64, id uint64, inclusi
}
// Reset implements txpool.SubPool, allowing the blob pool's internal state to be
-// kept in sync with the main transacion pool's internal state.
+// kept in sync with the main transaction pool's internal state.
func (p *BlobPool) Reset(oldHead, newHead *types.Header) {
waitStart := time.Now()
p.lock.Lock()
@@ -972,7 +972,7 @@ func (p *BlobPool) reinject(addr common.Address, txhash common.Hash) error {
}
// SetGasTip implements txpool.SubPool, allowing the blob pool's gas requirements
-// to be kept in sync with the main transacion pool's gas requirements.
+// to be kept in sync with the main transaction pool's gas requirements.
func (p *BlobPool) SetGasTip(tip *big.Int) {
p.lock.Lock()
defer p.lock.Unlock()
@@ -1355,7 +1355,7 @@ func (p *BlobPool) drop() {
p.stored -= uint64(drop.size)
delete(p.lookup, drop.hash)
- // Remove the transaction from the pool's evicion heap:
+ // Remove the transaction from the pool's eviction heap:
// - If the entire account was dropped, pop off the address
// - Otherwise, if the new tail has better eviction caps, fix the heap
if last {
diff --git a/core/txpool/blobpool/blobpool_test.go b/core/txpool/blobpool/blobpool_test.go
index fa3e8edc90..b709ad0e58 100644
--- a/core/txpool/blobpool/blobpool_test.go
+++ b/core/txpool/blobpool/blobpool_test.go
@@ -594,7 +594,7 @@ func TestOpenDrops(t *testing.T) {
verifyPoolInternals(t, pool)
}
-// Tests that transactions loaded from disk are indexed corrently.
+// Tests that transactions loaded from disk are indexed correctly.
//
// - 1. Transactions must be groupped by sender, sorted by nonce
// - 2. Eviction thresholds are calculated correctly for the sequences
diff --git a/core/txpool/blobpool/metrics.go b/core/txpool/blobpool/metrics.go
index 070cc5ca47..587804cc61 100644
--- a/core/txpool/blobpool/metrics.go
+++ b/core/txpool/blobpool/metrics.go
@@ -65,7 +65,7 @@ var (
pooltipGauge = metrics.NewRegisteredGauge("blobpool/pooltip", nil)
// addwait/time, resetwait/time and getwait/time track the rough health of
- // the pool and wether or not it's capable of keeping up with the load from
+ // the pool and whether or not it's capable of keeping up with the load from
// the network.
addwaitHist = metrics.NewRegisteredHistogram("blobpool/addwait", nil, metrics.NewExpDecaySample(1028, 0.015))
addtimeHist = metrics.NewRegisteredHistogram("blobpool/addtime", nil, metrics.NewExpDecaySample(1028, 0.015))
diff --git a/core/txpool/legacypool/legacypool.go b/core/txpool/legacypool/legacypool.go
index 8450d89a2c..959e328b9c 100644
--- a/core/txpool/legacypool/legacypool.go
+++ b/core/txpool/legacypool/legacypool.go
@@ -923,8 +923,7 @@ func (pool *LegacyPool) addLocals(txs []*types.Transaction) []error {
// addLocal enqueues a single local transaction into the pool if it is valid. This is
// a convenience wrapper around addLocals.
func (pool *LegacyPool) addLocal(tx *types.Transaction) error {
- errs := pool.addLocals([]*types.Transaction{tx})
- return errs[0]
+ return pool.addLocals([]*types.Transaction{tx})[0]
}
// addRemotes enqueues a batch of transactions into the pool if they are valid. If the
@@ -939,8 +938,7 @@ func (pool *LegacyPool) addRemotes(txs []*types.Transaction) []error {
// addRemote enqueues a single transaction into the pool if it is valid. This is a convenience
// wrapper around addRemotes.
func (pool *LegacyPool) addRemote(tx *types.Transaction) error {
- errs := pool.addRemotes([]*types.Transaction{tx})
- return errs[0]
+ return pool.addRemotes([]*types.Transaction{tx})[0]
}
// addRemotesSync is like addRemotes, but waits for pool reorganization. Tests use this method.
@@ -979,6 +977,7 @@ func (pool *LegacyPool) Add(txs []*types.Transaction, local, sync bool) []error
// in transactions before obtaining lock
if err := pool.validateTxBasics(tx, local); err != nil {
errs[i] = err
+ log.Trace("Discarding invalid transaction", "hash", tx.Hash(), "err", err)
invalidTxMeter.Mark(1)
continue
}
diff --git a/core/vm/operations_acl.go b/core/vm/operations_acl.go
index 04c6409ebd..bca6d1e83b 100644
--- a/core/vm/operations_acl.go
+++ b/core/vm/operations_acl.go
@@ -197,7 +197,7 @@ var (
gasStaticCallEIP2929 = makeCallVariantGasCallEIP2929(gasStaticCall)
gasCallCodeEIP2929 = makeCallVariantGasCallEIP2929(gasCallCode)
gasSelfdestructEIP2929 = makeSelfdestructGasFn(true)
- // gasSelfdestructEIP3529 implements the changes in EIP-2539 (no refunds)
+ // gasSelfdestructEIP3529 implements the changes in EIP-3529 (no refunds)
gasSelfdestructEIP3529 = makeSelfdestructGasFn(false)
// gasSStoreEIP2929 implements gas cost for SSTORE according to EIP-2929
@@ -214,12 +214,12 @@ var (
// see gasSStoreEIP2200(...) in core/vm/gas_table.go for more info about how EIP 2200 is specified
gasSStoreEIP2929 = makeGasSStoreFunc(params.SstoreClearsScheduleRefundEIP2200)
- // gasSStoreEIP2539 implements gas cost for SSTORE according to EIP-2539
+ // gasSStoreEIP3529 implements gas cost for SSTORE according to EIP-3529
// Replace `SSTORE_CLEARS_SCHEDULE` with `SSTORE_RESET_GAS + ACCESS_LIST_STORAGE_KEY_COST` (4,800)
gasSStoreEIP3529 = makeGasSStoreFunc(params.SstoreClearsScheduleRefundEIP3529)
)
-// makeSelfdestructGasFn can create the selfdestruct dynamic gas function for EIP-2929 and EIP-2539
+// makeSelfdestructGasFn can create the selfdestruct dynamic gas function for EIP-2929 and EIP-3529
func makeSelfdestructGasFn(refundsEnabled bool) gasFunc {
gasFunc := func(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {
var (
diff --git a/core/vm/runtime/runtime.go b/core/vm/runtime/runtime.go
index d10457e7fa..abb0a20e24 100644
--- a/core/vm/runtime/runtime.go
+++ b/core/vm/runtime/runtime.go
@@ -179,7 +179,7 @@ func Call(address common.Address, input []byte, cfg *Config) ([]byte, uint64, er
var (
vmenv = NewEnv(cfg)
- sender = cfg.State.GetOrNewStateObject(cfg.Origin)
+ sender = vm.AccountRef(cfg.Origin)
statedb = cfg.State
rules = cfg.ChainConfig.Rules(vmenv.Context.BlockNumber, vmenv.Context.Random != nil, vmenv.Context.Time)
)
diff --git a/core/vm/runtime/runtime_test.go b/core/vm/runtime/runtime_test.go
index 796d3b4434..e71760bb23 100644
--- a/core/vm/runtime/runtime_test.go
+++ b/core/vm/runtime/runtime_test.go
@@ -671,7 +671,7 @@ func TestColdAccountAccessCost(t *testing.T) {
for ii, op := range tracer.StructLogs() {
t.Logf("%d: %v %d", ii, op.OpName(), op.GasCost)
}
- t.Fatalf("tescase %d, gas report wrong, step %d, have %d want %d", i, tc.step, have, want)
+ t.Fatalf("testcase %d, gas report wrong, step %d, have %d want %d", i, tc.step, have, want)
}
}
}
diff --git a/eth/api_backend.go b/eth/api_backend.go
index 84eb200095..bc8398d217 100644
--- a/eth/api_backend.go
+++ b/eth/api_backend.go
@@ -260,7 +260,7 @@ func (b *EthAPIBackend) GetEVM(ctx context.Context, msg *core.Message, state *st
} else {
context = core.NewEVMBlockContext(header, b.eth.BlockChain(), nil)
}
- return vm.NewEVM(context, txContext, state, b.eth.blockchain.Config(), *vmConfig)
+ return vm.NewEVM(context, txContext, state, b.ChainConfig(), *vmConfig)
}
func (b *EthAPIBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription {
diff --git a/eth/catalyst/simulated_beacon.go b/eth/catalyst/simulated_beacon.go
index d8b8641e6a..3c081074cc 100644
--- a/eth/catalyst/simulated_beacon.go
+++ b/eth/catalyst/simulated_beacon.go
@@ -19,16 +19,17 @@ package catalyst
import (
"crypto/rand"
"errors"
+ "math/big"
"sync"
"time"
"github.com/ethereum/go-ethereum/beacon/engine"
"github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/eth"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/node"
+ "github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rpc"
)
@@ -81,6 +82,11 @@ type SimulatedBeacon struct {
lastBlockTime uint64
}
+// NewSimulatedBeacon constructs a new simulated beacon chain.
+// Period sets the period in which blocks should be produced.
+//
+// - If period is set to 0, a block is produced on every transaction.
+// via Commit, Fork and AdjustTime.
func NewSimulatedBeacon(period uint64, eth *eth.Ethereum) (*SimulatedBeacon, error) {
block := eth.BlockChain().CurrentBlock()
current := engine.ForkchoiceStateV1{
@@ -116,7 +122,9 @@ func (c *SimulatedBeacon) setFeeRecipient(feeRecipient common.Address) {
// Start invokes the SimulatedBeacon life-cycle function in a goroutine.
func (c *SimulatedBeacon) Start() error {
if c.period == 0 {
- go c.loopOnDemand()
+ // if period is set to 0, do not mine at all
+ // this is used in the simulated backend where blocks
+ // are explicitly mined via Commit, AdjustTime and Fork
} else {
go c.loop()
}
@@ -131,10 +139,9 @@ func (c *SimulatedBeacon) Stop() error {
// sealBlock initiates payload building for a new block and creates a new block
// with the completed payload.
-func (c *SimulatedBeacon) sealBlock(withdrawals []*types.Withdrawal) error {
- tstamp := uint64(time.Now().Unix())
- if tstamp <= c.lastBlockTime {
- tstamp = c.lastBlockTime + 1
+func (c *SimulatedBeacon) sealBlock(withdrawals []*types.Withdrawal, timestamp uint64) error {
+ if timestamp <= c.lastBlockTime {
+ timestamp = c.lastBlockTime + 1
}
c.feeRecipientLock.Lock()
feeRecipient := c.feeRecipient
@@ -149,7 +156,7 @@ func (c *SimulatedBeacon) sealBlock(withdrawals []*types.Withdrawal) error {
var random [32]byte
rand.Read(random[:])
fcResponse, err := c.engineAPI.ForkchoiceUpdatedV2(c.curForkchoiceState, &engine.PayloadAttributes{
- Timestamp: tstamp,
+ Timestamp: timestamp,
SuggestedFeeRecipient: feeRecipient,
Withdrawals: withdrawals,
Random: random,
@@ -183,6 +190,7 @@ func (c *SimulatedBeacon) sealBlock(withdrawals []*types.Withdrawal) error {
return err
}
c.setCurrentState(payload.BlockHash, finalizedHash)
+
// Mark the block containing the payload as canonical
if _, err = c.engineAPI.ForkchoiceUpdatedV2(c.curForkchoiceState, nil); err != nil {
return err
@@ -191,32 +199,6 @@ func (c *SimulatedBeacon) sealBlock(withdrawals []*types.Withdrawal) error {
return nil
}
-// loopOnDemand runs the block production loop for "on-demand" configuration (period = 0)
-func (c *SimulatedBeacon) loopOnDemand() {
- var (
- newTxs = make(chan core.NewTxsEvent)
- sub = c.eth.TxPool().SubscribeTransactions(newTxs, true)
- )
- defer sub.Unsubscribe()
-
- for {
- select {
- case <-c.shutdownCh:
- return
- case w := <-c.withdrawals.pending:
- withdrawals := append(c.withdrawals.gatherPending(9), w)
- if err := c.sealBlock(withdrawals); err != nil {
- log.Warn("Error performing sealing work", "err", err)
- }
- case <-newTxs:
- withdrawals := c.withdrawals.gatherPending(10)
- if err := c.sealBlock(withdrawals); err != nil {
- log.Warn("Error performing sealing work", "err", err)
- }
- }
- }
-}
-
// loop runs the block production loop for non-zero period configuration
func (c *SimulatedBeacon) loop() {
timer := time.NewTimer(0)
@@ -226,7 +208,7 @@ func (c *SimulatedBeacon) loop() {
return
case <-timer.C:
withdrawals := c.withdrawals.gatherPending(10)
- if err := c.sealBlock(withdrawals); err != nil {
+ if err := c.sealBlock(withdrawals, uint64(time.Now().Unix())); err != nil {
log.Warn("Error performing sealing work", "err", err)
} else {
timer.Reset(time.Second * time.Duration(c.period))
@@ -235,8 +217,8 @@ func (c *SimulatedBeacon) loop() {
}
}
-// finalizedBlockHash returns the block hash of the finalized block corresponding to the given number
-// or nil if doesn't exist in the chain.
+// finalizedBlockHash returns the block hash of the finalized block corresponding
+// to the given number or nil if doesn't exist in the chain.
func (c *SimulatedBeacon) finalizedBlockHash(number uint64) *common.Hash {
var finalizedNumber uint64
if number%devEpochLength == 0 {
@@ -244,7 +226,6 @@ func (c *SimulatedBeacon) finalizedBlockHash(number uint64) *common.Hash {
} else {
finalizedNumber = (number - 1) / devEpochLength * devEpochLength
}
-
if finalizedBlock := c.eth.BlockChain().GetBlockByNumber(finalizedNumber); finalizedBlock != nil {
fh := finalizedBlock.Hash()
return &fh
@@ -261,11 +242,60 @@ func (c *SimulatedBeacon) setCurrentState(headHash, finalizedHash common.Hash) {
}
}
+// Commit seals a block on demand.
+func (c *SimulatedBeacon) Commit() common.Hash {
+ withdrawals := c.withdrawals.gatherPending(10)
+ if err := c.sealBlock(withdrawals, uint64(time.Now().Unix())); err != nil {
+ log.Warn("Error performing sealing work", "err", err)
+ }
+ return c.eth.BlockChain().CurrentBlock().Hash()
+}
+
+// Rollback un-sends previously added transactions.
+func (c *SimulatedBeacon) Rollback() {
+ // Flush all transactions from the transaction pools
+ maxUint256 := new(big.Int).Sub(new(big.Int).Lsh(common.Big1, 256), common.Big1)
+ c.eth.TxPool().SetGasTip(maxUint256)
+ // Set the gas tip back to accept new transactions
+ // TODO (Marius van der Wijden): set gas tip to parameter passed by config
+ c.eth.TxPool().SetGasTip(big.NewInt(params.GWei))
+}
+
+// Fork sets the head to the provided hash.
+func (c *SimulatedBeacon) Fork(parentHash common.Hash) error {
+ if len(c.eth.TxPool().Pending(false)) != 0 {
+ return errors.New("pending block dirty")
+ }
+ parent := c.eth.BlockChain().GetBlockByHash(parentHash)
+ if parent == nil {
+ return errors.New("parent not found")
+ }
+ return c.eth.BlockChain().SetHead(parent.NumberU64())
+}
+
+// AdjustTime creates a new block with an adjusted timestamp.
+func (c *SimulatedBeacon) AdjustTime(adjustment time.Duration) error {
+ if len(c.eth.TxPool().Pending(false)) != 0 {
+ return errors.New("could not adjust time on non-empty block")
+ }
+ parent := c.eth.BlockChain().CurrentBlock()
+ if parent == nil {
+ return errors.New("parent not found")
+ }
+ withdrawals := c.withdrawals.gatherPending(10)
+ return c.sealBlock(withdrawals, parent.Time+uint64(adjustment))
+}
+
func RegisterSimulatedBeaconAPIs(stack *node.Node, sim *SimulatedBeacon) {
+ api := &api{sim}
+ if sim.period == 0 {
+ // mine on demand if period is set to 0
+ go api.loop()
+ }
stack.RegisterAPIs([]rpc.API{
{
Namespace: "dev",
- Service: &api{sim},
+ Service: api,
Version: "1.0",
},
})
diff --git a/eth/catalyst/simulated_beacon_api.go b/eth/catalyst/simulated_beacon_api.go
index 93670257f6..73d0a5921d 100644
--- a/eth/catalyst/simulated_beacon_api.go
+++ b/eth/catalyst/simulated_beacon_api.go
@@ -18,19 +18,44 @@ package catalyst
import (
"context"
+ "time"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/log"
)
type api struct {
- simBeacon *SimulatedBeacon
+ sim *SimulatedBeacon
+}
+
+func (a *api) loop() {
+ var (
+ newTxs = make(chan core.NewTxsEvent)
+ sub = a.sim.eth.TxPool().SubscribeTransactions(newTxs, true)
+ )
+ defer sub.Unsubscribe()
+
+ for {
+ select {
+ case <-a.sim.shutdownCh:
+ return
+ case w := <-a.sim.withdrawals.pending:
+ withdrawals := append(a.sim.withdrawals.gatherPending(9), w)
+ if err := a.sim.sealBlock(withdrawals, uint64(time.Now().Unix())); err != nil {
+ log.Warn("Error performing sealing work", "err", err)
+ }
+ case <-newTxs:
+ a.sim.Commit()
+ }
+ }
}
func (a *api) AddWithdrawal(ctx context.Context, withdrawal *types.Withdrawal) error {
- return a.simBeacon.withdrawals.add(withdrawal)
+ return a.sim.withdrawals.add(withdrawal)
}
func (a *api) SetFeeRecipient(ctx context.Context, feeRecipient common.Address) {
- a.simBeacon.setFeeRecipient(feeRecipient)
+ a.sim.setFeeRecipient(feeRecipient)
}
diff --git a/eth/downloader/api.go b/eth/downloader/api.go
index b3f7113bcd..606c6d4e7e 100644
--- a/eth/downloader/api.go
+++ b/eth/downloader/api.go
@@ -101,16 +101,15 @@ func (api *DownloaderAPI) Syncing(ctx context.Context) (*rpc.Subscription, error
go func() {
statuses := make(chan interface{})
sub := api.SubscribeSyncStatus(statuses)
+ defer sub.Unsubscribe()
for {
select {
case status := <-statuses:
notifier.Notify(rpcSub.ID, status)
case <-rpcSub.Err():
- sub.Unsubscribe()
return
case <-notifier.Closed():
- sub.Unsubscribe()
return
}
}
diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go
index 2ca7e328c6..f1cfa92d5d 100644
--- a/eth/downloader/downloader.go
+++ b/eth/downloader/downloader.go
@@ -576,7 +576,7 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td, ttd *
// For non-merged networks, if there is a checkpoint available, then calculate
// the ancientLimit through that. Otherwise calculate the ancient limit through
// the advertised height of the remote peer. This most is mostly a fallback for
- // legacy networks, but should eventually be droppped. TODO(karalabe).
+ // legacy networks, but should eventually be dropped. TODO(karalabe).
if beaconMode {
// Beacon sync, use the latest finalized block as the ancient limit
// or a reasonable height if no finalized block is yet announced.
diff --git a/eth/downloader/resultstore.go b/eth/downloader/resultstore.go
index 7f7f5a89e2..e4323c04eb 100644
--- a/eth/downloader/resultstore.go
+++ b/eth/downloader/resultstore.go
@@ -142,7 +142,7 @@ func (r *resultStore) HasCompletedItems() bool {
// countCompleted returns the number of items ready for delivery, stopping at
// the first non-complete item.
//
-// The mthod assumes (at least) rlock is held.
+// The method assumes (at least) rlock is held.
func (r *resultStore) countCompleted() int {
// We iterate from the already known complete point, and see
// if any more has completed since last count
diff --git a/eth/fetcher/block_fetcher.go b/eth/fetcher/block_fetcher.go
index 8751c4e3ea..126eaaea7f 100644
--- a/eth/fetcher/block_fetcher.go
+++ b/eth/fetcher/block_fetcher.go
@@ -483,7 +483,7 @@ func (f *BlockFetcher) loop() {
select {
case res := <-resCh:
res.Done <- nil
- f.FilterHeaders(peer, *res.Res.(*eth.BlockHeadersRequest), time.Now().Add(res.Time))
+ f.FilterHeaders(peer, *res.Res.(*eth.BlockHeadersRequest), time.Now())
case <-timeout.C:
// The peer didn't respond in time. The request
diff --git a/eth/fetcher/tx_fetcher_test.go b/eth/fetcher/tx_fetcher_test.go
index 77b89085d3..4a62e579b6 100644
--- a/eth/fetcher/tx_fetcher_test.go
+++ b/eth/fetcher/tx_fetcher_test.go
@@ -186,7 +186,7 @@ func TestTransactionFetcherWaiting(t *testing.T) {
// waitlist, and none of them are scheduled for retrieval until the wait expires.
//
// This test is an extended version of TestTransactionFetcherWaiting. It's mostly
-// to cover the metadata checkes without bloating up the basic behavioral tests
+// to cover the metadata checks without bloating up the basic behavioral tests
// with all the useless extra fields.
func TestTransactionFetcherWaitingWithMeta(t *testing.T) {
testTransactionFetcherParallel(t, txFetcherTest{
@@ -1030,7 +1030,7 @@ func TestTransactionFetcherRateLimiting(t *testing.T) {
}
// Tests that if huge transactions are announced, only a small number of them will
-// be requested at a time, to keep the responses below a resonable level.
+// be requested at a time, to keep the responses below a reasonable level.
func TestTransactionFetcherBandwidthLimiting(t *testing.T) {
testTransactionFetcherParallel(t, txFetcherTest{
init: func() *TxFetcher {
diff --git a/eth/filters/api.go b/eth/filters/api.go
index a4eaa9cec8..8cf701ec57 100644
--- a/eth/filters/api.go
+++ b/eth/filters/api.go
@@ -159,6 +159,8 @@ func (api *FilterAPI) NewPendingTransactions(ctx context.Context, fullTx *bool)
go func() {
txs := make(chan []*types.Transaction, 128)
pendingTxSub := api.events.SubscribePendingTxs(txs)
+ defer pendingTxSub.Unsubscribe()
+
chainConfig := api.sys.backend.ChainConfig()
for {
@@ -176,10 +178,8 @@ func (api *FilterAPI) NewPendingTransactions(ctx context.Context, fullTx *bool)
}
}
case <-rpcSub.Err():
- pendingTxSub.Unsubscribe()
return
case <-notifier.Closed():
- pendingTxSub.Unsubscribe()
return
}
}
@@ -233,16 +233,15 @@ func (api *FilterAPI) NewHeads(ctx context.Context) (*rpc.Subscription, error) {
go func() {
headers := make(chan *types.Header)
headersSub := api.events.SubscribeNewHeads(headers)
+ defer headersSub.Unsubscribe()
for {
select {
case h := <-headers:
notifier.Notify(rpcSub.ID, h)
case <-rpcSub.Err():
- headersSub.Unsubscribe()
return
case <-notifier.Closed():
- headersSub.Unsubscribe()
return
}
}
@@ -269,6 +268,7 @@ func (api *FilterAPI) Logs(ctx context.Context, crit FilterCriteria) (*rpc.Subsc
}
go func() {
+ defer logsSub.Unsubscribe()
for {
select {
case logs := <-matchedLogs:
@@ -277,10 +277,8 @@ func (api *FilterAPI) Logs(ctx context.Context, crit FilterCriteria) (*rpc.Subsc
notifier.Notify(rpcSub.ID, &log)
}
case <-rpcSub.Err(): // client send an unsubscribe request
- logsSub.Unsubscribe()
return
case <-notifier.Closed(): // connection dropped
- logsSub.Unsubscribe()
return
}
}
diff --git a/eth/gasestimator/gasestimator.go b/eth/gasestimator/gasestimator.go
index 4a8e20dfed..a36c670747 100644
--- a/eth/gasestimator/gasestimator.go
+++ b/eth/gasestimator/gasestimator.go
@@ -47,7 +47,7 @@ type Options struct {
}
// Estimate returns the lowest possible gas limit that allows the transaction to
-// run successfully with the provided context optons. It returns an error if the
+// run successfully with the provided context options. It returns an error if the
// transaction would always revert, or if there are unexpected failures.
func Estimate(ctx context.Context, call *core.Message, opts *Options, gasCap uint64) (uint64, []byte, error) {
// Binary search the gas limit, as it may need to be higher than the amount used
diff --git a/eth/handler.go b/eth/handler.go
index f0021e5644..a327af6113 100644
--- a/eth/handler.go
+++ b/eth/handler.go
@@ -178,6 +178,10 @@ func newHandler(config *handlerConfig) (*handler, error) {
log.Info("Enabled snap sync", "head", head.Number, "hash", head.Hash())
}
}
+ // If snap sync is requested but snapshots are disabled, fail loudly
+ if h.snapSync.Load() && config.Chain.Snapshots() == nil {
+ return nil, errors.New("snap sync not supported with snapshots disabled")
+ }
// Construct the downloader (long sync)
h.downloader = downloader.New(config.Database, h.eventMux, h.chain, nil, h.removePeer, h.enableSyncedFeatures)
if ttd := h.chain.Config().TerminalTotalDifficulty; ttd != nil {
diff --git a/eth/peerset.go b/eth/peerset.go
index b27d3964a1..c0c11e3e85 100644
--- a/eth/peerset.go
+++ b/eth/peerset.go
@@ -57,6 +57,7 @@ type peerSet struct {
lock sync.RWMutex
closed bool
+ quitCh chan struct{} // Quit channel to signal termination
}
// newPeerSet creates a new peer set to track the active participants.
@@ -65,6 +66,7 @@ func newPeerSet() *peerSet {
peers: make(map[string]*ethPeer),
snapWait: make(map[string]chan *snap.Peer),
snapPend: make(map[string]*snap.Peer),
+ quitCh: make(chan struct{}),
}
}
@@ -129,7 +131,15 @@ func (ps *peerSet) waitSnapExtension(peer *eth.Peer) (*snap.Peer, error) {
ps.snapWait[id] = wait
ps.lock.Unlock()
- return <-wait, nil
+ select {
+ case p := <-wait:
+ return p, nil
+ case <-ps.quitCh:
+ ps.lock.Lock()
+ delete(ps.snapWait, id)
+ ps.lock.Unlock()
+ return nil, errPeerSetClosed
+ }
}
// registerPeer injects a new `eth` peer into the working set, or returns an error
@@ -256,5 +266,8 @@ func (ps *peerSet) close() {
for _, p := range ps.peers {
p.Disconnect(p2p.DiscQuitting)
}
+ if !ps.closed {
+ close(ps.quitCh)
+ }
ps.closed = true
}
diff --git a/eth/protocols/eth/dispatcher.go b/eth/protocols/eth/dispatcher.go
index 3f81e045ba..ae98820cd6 100644
--- a/eth/protocols/eth/dispatcher.go
+++ b/eth/protocols/eth/dispatcher.go
@@ -41,7 +41,7 @@ var (
// Request is a pending request to allow tracking it and delivering a response
// back to the requester on their chosen channel.
type Request struct {
- peer *Peer // Peer to which this request belogs for untracking
+ peer *Peer // Peer to which this request belongs for untracking
id uint64 // Request ID to match up replies to
sink chan *Response // Channel to deliver the response on
@@ -224,7 +224,7 @@ func (p *Peer) dispatcher() {
switch {
case res.Req == nil:
// Response arrived with an untracked ID. Since even cancelled
- // requests are tracked until fulfilment, a dangling response
+ // requests are tracked until fulfillment, a dangling response
// means the remote peer implements the protocol badly.
resOp.fail <- errDanglingResponse
diff --git a/eth/protocols/eth/peer.go b/eth/protocols/eth/peer.go
index 938af0cab0..98ad22a8cf 100644
--- a/eth/protocols/eth/peer.go
+++ b/eth/protocols/eth/peer.go
@@ -84,7 +84,7 @@ type Peer struct {
txBroadcast chan []common.Hash // Channel used to queue transaction propagation requests
txAnnounce chan []common.Hash // Channel used to queue transaction announcement requests
- reqDispatch chan *request // Dispatch channel to send requests and track then until fulfilment
+ reqDispatch chan *request // Dispatch channel to send requests and track then until fulfillment
reqCancel chan *cancel // Dispatch channel to cancel pending requests and untrack them
resDispatch chan *response // Dispatch channel to fulfil pending requests and untrack them
diff --git a/eth/tracers/api.go b/eth/tracers/api.go
index 300d904a99..7c0028601d 100644
--- a/eth/tracers/api.go
+++ b/eth/tracers/api.go
@@ -164,6 +164,7 @@ type TraceCallConfig struct {
TraceConfig
StateOverrides *ethapi.StateOverride
BlockOverrides *ethapi.BlockOverrides
+ TxIndex *hexutil.Uint
}
// StdTraceConfig holds extra parameters to standard-json trace functions.
@@ -863,11 +864,17 @@ func (api *API) TraceTransaction(ctx context.Context, hash common.Hash, config *
// TraceCall lets you trace a given eth_call. It collects the structured logs
// created during the execution of EVM if the given transaction was added on
// top of the provided block and returns them as a JSON object.
+// If no transaction index is specified, the trace will be conducted on the state
+// after executing the specified block. However, if a transaction index is provided,
+// the trace will be conducted on the state after executing the specified transaction
+// within the specified block.
func (api *API) TraceCall(ctx context.Context, args ethapi.TransactionArgs, blockNrOrHash rpc.BlockNumberOrHash, config *TraceCallConfig) (interface{}, error) {
// Try to retrieve the specified block
var (
- err error
- block *types.Block
+ err error
+ block *types.Block
+ statedb *state.StateDB
+ release StateReleaseFunc
)
if hash, ok := blockNrOrHash.Hash(); ok {
block, err = api.blockByHash(ctx, hash)
@@ -892,7 +899,12 @@ func (api *API) TraceCall(ctx context.Context, args ethapi.TransactionArgs, bloc
if config != nil && config.Reexec != nil {
reexec = *config.Reexec
}
- statedb, release, err := api.backend.StateAtBlock(ctx, block, reexec, nil, true, false)
+
+ if config != nil && config.TxIndex != nil {
+ _, _, statedb, release, err = api.backend.StateAtTransaction(ctx, block, int(*config.TxIndex), reexec)
+ } else {
+ statedb, release, err = api.backend.StateAtBlock(ctx, block, reexec, nil, true, false)
+ }
if err != nil {
return nil, err
}
diff --git a/eth/tracers/api_test.go b/eth/tracers/api_test.go
index 0f78af9a01..49c3ebb67d 100644
--- a/eth/tracers/api_test.go
+++ b/eth/tracers/api_test.go
@@ -200,13 +200,51 @@ func TestTraceCall(t *testing.T) {
}
genBlocks := 10
signer := types.HomesteadSigner{}
+ nonce := uint64(0)
backend := newTestBackend(t, genBlocks, genesis, func(i int, b *core.BlockGen) {
// Transfer from account[0] to account[1]
// value: 1000 wei
// fee: 0 wei
- tx, _ := types.SignTx(types.NewTransaction(uint64(i), accounts[1].addr, big.NewInt(1000), params.TxGas, b.BaseFee(), nil), signer, accounts[0].key)
+ tx, _ := types.SignTx(types.NewTx(&types.LegacyTx{
+ Nonce: nonce,
+ To: &accounts[1].addr,
+ Value: big.NewInt(1000),
+ Gas: params.TxGas,
+ GasPrice: b.BaseFee(),
+ Data: nil}),
+ signer, accounts[0].key)
b.AddTx(tx)
+ nonce++
+
+ if i == genBlocks-2 {
+ // Transfer from account[0] to account[2]
+ tx, _ = types.SignTx(types.NewTx(&types.LegacyTx{
+ Nonce: nonce,
+ To: &accounts[2].addr,
+ Value: big.NewInt(1000),
+ Gas: params.TxGas,
+ GasPrice: b.BaseFee(),
+ Data: nil}),
+ signer, accounts[0].key)
+ b.AddTx(tx)
+ nonce++
+
+ // Transfer from account[0] to account[1] again
+ tx, _ = types.SignTx(types.NewTx(&types.LegacyTx{
+ Nonce: nonce,
+ To: &accounts[1].addr,
+ Value: big.NewInt(1000),
+ Gas: params.TxGas,
+ GasPrice: b.BaseFee(),
+ Data: nil}),
+ signer, accounts[0].key)
+ b.AddTx(tx)
+ nonce++
+ }
})
+
+ uintPtr := func(i int) *hexutil.Uint { x := hexutil.Uint(i); return &x }
+
defer backend.teardown()
api := NewAPI(backend)
var testSuite = []struct {
@@ -240,6 +278,51 @@ func TestTraceCall(t *testing.T) {
expectErr: nil,
expect: `{"gas":21000,"failed":false,"returnValue":"","structLogs":[]}`,
},
+ // Upon the last state, default to the post block's state
+ {
+ blockNumber: rpc.BlockNumber(genBlocks - 1),
+ call: ethapi.TransactionArgs{
+ From: &accounts[2].addr,
+ To: &accounts[0].addr,
+ Value: (*hexutil.Big)(new(big.Int).Add(big.NewInt(params.Ether), big.NewInt(100))),
+ },
+ config: nil,
+ expect: `{"gas":21000,"failed":false,"returnValue":"","structLogs":[]}`,
+ },
+ // Before the first transaction, should be failed
+ {
+ blockNumber: rpc.BlockNumber(genBlocks - 1),
+ call: ethapi.TransactionArgs{
+ From: &accounts[2].addr,
+ To: &accounts[0].addr,
+ Value: (*hexutil.Big)(new(big.Int).Add(big.NewInt(params.Ether), big.NewInt(100))),
+ },
+ config: &TraceCallConfig{TxIndex: uintPtr(0)},
+ expectErr: fmt.Errorf("tracing failed: insufficient funds for gas * price + value: address %s have 1000000000000000000 want 1000000000000000100", accounts[2].addr),
+ },
+ // Before the target transaction, should be failed
+ {
+ blockNumber: rpc.BlockNumber(genBlocks - 1),
+ call: ethapi.TransactionArgs{
+ From: &accounts[2].addr,
+ To: &accounts[0].addr,
+ Value: (*hexutil.Big)(new(big.Int).Add(big.NewInt(params.Ether), big.NewInt(100))),
+ },
+ config: &TraceCallConfig{TxIndex: uintPtr(1)},
+ expectErr: fmt.Errorf("tracing failed: insufficient funds for gas * price + value: address %s have 1000000000000000000 want 1000000000000000100", accounts[2].addr),
+ },
+ // After the target transaction, should be succeed
+ {
+ blockNumber: rpc.BlockNumber(genBlocks - 1),
+ call: ethapi.TransactionArgs{
+ From: &accounts[2].addr,
+ To: &accounts[0].addr,
+ Value: (*hexutil.Big)(new(big.Int).Add(big.NewInt(params.Ether), big.NewInt(100))),
+ },
+ config: &TraceCallConfig{TxIndex: uintPtr(2)},
+ expectErr: nil,
+ expect: `{"gas":21000,"failed":false,"returnValue":"","structLogs":[]}`,
+ },
// Standard JSON trace upon the non-existent block, error expects
{
blockNumber: rpc.BlockNumber(genBlocks + 1),
@@ -297,8 +380,8 @@ func TestTraceCall(t *testing.T) {
t.Errorf("test %d: expect error %v, got nothing", i, testspec.expectErr)
continue
}
- if !reflect.DeepEqual(err, testspec.expectErr) {
- t.Errorf("test %d: error mismatch, want %v, git %v", i, testspec.expectErr, err)
+ if !reflect.DeepEqual(err.Error(), testspec.expectErr.Error()) {
+ t.Errorf("test %d: error mismatch, want '%v', got '%v'", i, testspec.expectErr, err)
}
} else {
if err != nil {
@@ -338,7 +421,14 @@ func TestTraceTransaction(t *testing.T) {
// Transfer from account[0] to account[1]
// value: 1000 wei
// fee: 0 wei
- tx, _ := types.SignTx(types.NewTransaction(uint64(i), accounts[1].addr, big.NewInt(1000), params.TxGas, b.BaseFee(), nil), signer, accounts[0].key)
+ tx, _ := types.SignTx(types.NewTx(&types.LegacyTx{
+ Nonce: uint64(i),
+ To: &accounts[1].addr,
+ Value: big.NewInt(1000),
+ Gas: params.TxGas,
+ GasPrice: b.BaseFee(),
+ Data: nil}),
+ signer, accounts[0].key)
b.AddTx(tx)
target = tx.Hash()
})
@@ -388,7 +478,14 @@ func TestTraceBlock(t *testing.T) {
// Transfer from account[0] to account[1]
// value: 1000 wei
// fee: 0 wei
- tx, _ := types.SignTx(types.NewTransaction(uint64(i), accounts[1].addr, big.NewInt(1000), params.TxGas, b.BaseFee(), nil), signer, accounts[0].key)
+ tx, _ := types.SignTx(types.NewTx(&types.LegacyTx{
+ Nonce: uint64(i),
+ To: &accounts[1].addr,
+ Value: big.NewInt(1000),
+ Gas: params.TxGas,
+ GasPrice: b.BaseFee(),
+ Data: nil}),
+ signer, accounts[0].key)
b.AddTx(tx)
txHash = tx.Hash()
})
@@ -478,7 +575,14 @@ func TestTracingWithOverrides(t *testing.T) {
// Transfer from account[0] to account[1]
// value: 1000 wei
// fee: 0 wei
- tx, _ := types.SignTx(types.NewTransaction(uint64(i), accounts[1].addr, big.NewInt(1000), params.TxGas, b.BaseFee(), nil), signer, accounts[0].key)
+ tx, _ := types.SignTx(types.NewTx(&types.LegacyTx{
+ Nonce: uint64(i),
+ To: &accounts[1].addr,
+ Value: big.NewInt(1000),
+ Gas: params.TxGas,
+ GasPrice: b.BaseFee(),
+ Data: nil}),
+ signer, accounts[0].key)
b.AddTx(tx)
})
defer backend.chain.Stop()
diff --git a/eth/tracers/internal/tracetest/calltrace_test.go b/eth/tracers/internal/tracetest/calltrace_test.go
index 5c74baacd1..0b43a021ea 100644
--- a/eth/tracers/internal/tracetest/calltrace_test.go
+++ b/eth/tracers/internal/tracetest/calltrace_test.go
@@ -122,12 +122,7 @@ func testCallTracer(tracerName string, dirPath string, t *testing.T) {
}
// Configure a blockchain with the given prestate
var (
- signer = types.MakeSigner(test.Genesis.Config, new(big.Int).SetUint64(uint64(test.Context.Number)), uint64(test.Context.Time))
- origin, _ = signer.Sender(tx)
- txContext = vm.TxContext{
- Origin: origin,
- GasPrice: tx.GasPrice(),
- }
+ signer = types.MakeSigner(test.Genesis.Config, new(big.Int).SetUint64(uint64(test.Context.Number)), uint64(test.Context.Time))
context = vm.BlockContext{
CanTransfer: core.CanTransfer,
Transfer: core.Transfer,
@@ -146,11 +141,11 @@ func testCallTracer(tracerName string, dirPath string, t *testing.T) {
if err != nil {
t.Fatalf("failed to create call tracer: %v", err)
}
- evm := vm.NewEVM(context, txContext, statedb, test.Genesis.Config, vm.Config{Tracer: tracer})
- msg, err := core.TransactionToMessage(tx, signer, nil)
+ msg, err := core.TransactionToMessage(tx, signer, context.BaseFee)
if err != nil {
t.Fatalf("failed to prepare transaction for tracing: %v", err)
}
+ evm := vm.NewEVM(context, core.NewEVMTxContext(msg), statedb, test.Genesis.Config, vm.Config{Tracer: tracer})
vmRet, err := core.ApplyMessage(evm, msg, new(core.GasPool).AddGas(tx.Gas()))
if err != nil {
t.Fatalf("failed to execute transaction: %v", err)
@@ -222,10 +217,6 @@ func benchTracer(tracerName string, test *callTracerTest, b *testing.B) {
b.Fatalf("failed to parse testcase input: %v", err)
}
signer := types.MakeSigner(test.Genesis.Config, new(big.Int).SetUint64(uint64(test.Context.Number)), uint64(test.Context.Time))
- msg, err := core.TransactionToMessage(tx, signer, nil)
- if err != nil {
- b.Fatalf("failed to prepare transaction for tracing: %v", err)
- }
origin, _ := signer.Sender(tx)
txContext := vm.TxContext{
Origin: origin,
@@ -240,6 +231,10 @@ func benchTracer(tracerName string, test *callTracerTest, b *testing.B) {
Difficulty: (*big.Int)(test.Context.Difficulty),
GasLimit: uint64(test.Context.GasLimit),
}
+ msg, err := core.TransactionToMessage(tx, signer, context.BaseFee)
+ if err != nil {
+ b.Fatalf("failed to prepare transaction for tracing: %v", err)
+ }
triedb, _, statedb := tests.MakePreState(rawdb.NewMemoryDatabase(), test.Genesis.Alloc, false, rawdb.HashScheme)
defer triedb.Close()
diff --git a/eth/tracers/internal/tracetest/flat_calltrace_test.go b/eth/tracers/internal/tracetest/flat_calltrace_test.go
index 423167b13c..b318548bc1 100644
--- a/eth/tracers/internal/tracetest/flat_calltrace_test.go
+++ b/eth/tracers/internal/tracetest/flat_calltrace_test.go
@@ -86,11 +86,6 @@ func flatCallTracerTestRunner(tracerName string, filename string, dirPath string
return fmt.Errorf("failed to parse testcase input: %v", err)
}
signer := types.MakeSigner(test.Genesis.Config, new(big.Int).SetUint64(uint64(test.Context.Number)), uint64(test.Context.Time))
- origin, _ := signer.Sender(tx)
- txContext := vm.TxContext{
- Origin: origin,
- GasPrice: tx.GasPrice(),
- }
context := vm.BlockContext{
CanTransfer: core.CanTransfer,
Transfer: core.Transfer,
@@ -108,12 +103,11 @@ func flatCallTracerTestRunner(tracerName string, filename string, dirPath string
if err != nil {
return fmt.Errorf("failed to create call tracer: %v", err)
}
- evm := vm.NewEVM(context, txContext, statedb, test.Genesis.Config, vm.Config{Tracer: tracer})
-
- msg, err := core.TransactionToMessage(tx, signer, nil)
+ msg, err := core.TransactionToMessage(tx, signer, context.BaseFee)
if err != nil {
return fmt.Errorf("failed to prepare transaction for tracing: %v", err)
}
+ evm := vm.NewEVM(context, core.NewEVMTxContext(msg), statedb, test.Genesis.Config, vm.Config{Tracer: tracer})
st := core.NewStateTransition(evm, msg, new(core.GasPool).AddGas(tx.Gas()))
if _, err = st.TransitionDb(); err != nil {
diff --git a/eth/tracers/internal/tracetest/prestate_test.go b/eth/tracers/internal/tracetest/prestate_test.go
index b4fa5b6272..666a5fda78 100644
--- a/eth/tracers/internal/tracetest/prestate_test.go
+++ b/eth/tracers/internal/tracetest/prestate_test.go
@@ -92,12 +92,7 @@ func testPrestateDiffTracer(tracerName string, dirPath string, t *testing.T) {
}
// Configure a blockchain with the given prestate
var (
- signer = types.MakeSigner(test.Genesis.Config, new(big.Int).SetUint64(uint64(test.Context.Number)), uint64(test.Context.Time))
- origin, _ = signer.Sender(tx)
- txContext = vm.TxContext{
- Origin: origin,
- GasPrice: tx.GasPrice(),
- }
+ signer = types.MakeSigner(test.Genesis.Config, new(big.Int).SetUint64(uint64(test.Context.Number)), uint64(test.Context.Time))
context = vm.BlockContext{
CanTransfer: core.CanTransfer,
Transfer: core.Transfer,
@@ -116,11 +111,11 @@ func testPrestateDiffTracer(tracerName string, dirPath string, t *testing.T) {
if err != nil {
t.Fatalf("failed to create call tracer: %v", err)
}
- evm := vm.NewEVM(context, txContext, statedb, test.Genesis.Config, vm.Config{Tracer: tracer})
- msg, err := core.TransactionToMessage(tx, signer, nil)
+ msg, err := core.TransactionToMessage(tx, signer, context.BaseFee)
if err != nil {
t.Fatalf("failed to prepare transaction for tracing: %v", err)
}
+ evm := vm.NewEVM(context, core.NewEVMTxContext(msg), statedb, test.Genesis.Config, vm.Config{Tracer: tracer})
st := core.NewStateTransition(evm, msg, new(core.GasPool).AddGas(tx.Gas()))
if _, err = st.TransitionDb(); err != nil {
t.Fatalf("failed to execute transaction: %v", err)
diff --git a/eth/tracers/internal/tracetest/testdata/prestate_tracer_with_diff_mode/create_failed.json b/eth/tracers/internal/tracetest/testdata/prestate_tracer_with_diff_mode/create_failed.json
index e80dad5667..561ead05b6 100644
--- a/eth/tracers/internal/tracetest/testdata/prestate_tracer_with_diff_mode/create_failed.json
+++ b/eth/tracers/internal/tracetest/testdata/prestate_tracer_with_diff_mode/create_failed.json
@@ -83,7 +83,7 @@
},
"post": {
"0x808b4da0be6c9512e948521452227efc619bea52": {
- "balance": "0x2cd72a36dd031f089",
+ "balance": "0x2cd987071ba2346b6",
"nonce": 1223933
},
"0x8f03f1a3f10c05e7cccf75c1fd10168e06659be7": {
diff --git a/eth/tracers/logger/gen_structlog.go b/eth/tracers/logger/gen_structlog.go
index df06a9ee6b..b406cb3445 100644
--- a/eth/tracers/logger/gen_structlog.go
+++ b/eth/tracers/logger/gen_structlog.go
@@ -23,7 +23,7 @@ func (s StructLog) MarshalJSON() ([]byte, error) {
GasCost math.HexOrDecimal64 `json:"gasCost"`
Memory hexutil.Bytes `json:"memory,omitempty"`
MemorySize int `json:"memSize"`
- Stack []uint256.Int `json:"stack"`
+ Stack []hexutil.U256 `json:"stack"`
ReturnData hexutil.Bytes `json:"returnData,omitempty"`
Storage map[common.Hash]common.Hash `json:"-"`
Depth int `json:"depth"`
@@ -39,7 +39,12 @@ func (s StructLog) MarshalJSON() ([]byte, error) {
enc.GasCost = math.HexOrDecimal64(s.GasCost)
enc.Memory = s.Memory
enc.MemorySize = s.MemorySize
- enc.Stack = s.Stack
+ if s.Stack != nil {
+ enc.Stack = make([]hexutil.U256, len(s.Stack))
+ for k, v := range s.Stack {
+ enc.Stack[k] = hexutil.U256(v)
+ }
+ }
enc.ReturnData = s.ReturnData
enc.Storage = s.Storage
enc.Depth = s.Depth
@@ -59,7 +64,7 @@ func (s *StructLog) UnmarshalJSON(input []byte) error {
GasCost *math.HexOrDecimal64 `json:"gasCost"`
Memory *hexutil.Bytes `json:"memory,omitempty"`
MemorySize *int `json:"memSize"`
- Stack []uint256.Int `json:"stack"`
+ Stack []hexutil.U256 `json:"stack"`
ReturnData *hexutil.Bytes `json:"returnData,omitempty"`
Storage map[common.Hash]common.Hash `json:"-"`
Depth *int `json:"depth"`
@@ -89,7 +94,10 @@ func (s *StructLog) UnmarshalJSON(input []byte) error {
s.MemorySize = *dec.MemorySize
}
if dec.Stack != nil {
- s.Stack = dec.Stack
+ s.Stack = make([]uint256.Int, len(dec.Stack))
+ for k, v := range dec.Stack {
+ s.Stack[k] = uint256.Int(v)
+ }
}
if dec.ReturnData != nil {
s.ReturnData = *dec.ReturnData
diff --git a/eth/tracers/logger/logger.go b/eth/tracers/logger/logger.go
index 4c9b910a27..2b36f9f492 100644
--- a/eth/tracers/logger/logger.go
+++ b/eth/tracers/logger/logger.go
@@ -83,6 +83,7 @@ type structLogMarshaling struct {
GasCost math.HexOrDecimal64
Memory hexutil.Bytes
ReturnData hexutil.Bytes
+ Stack []hexutil.U256
OpName string `json:"opName"` // adds call to OpName() in MarshalJSON
ErrorString string `json:"error,omitempty"` // adds call to ErrorString() in MarshalJSON
}
diff --git a/eth/tracers/tracers_test.go b/eth/tracers/tracers_test.go
index b4989ec984..54d34ec5d1 100644
--- a/eth/tracers/tracers_test.go
+++ b/eth/tracers/tracers_test.go
@@ -90,7 +90,7 @@ func BenchmarkTransactionTrace(b *testing.B) {
//EnableReturnData: false,
})
evm := vm.NewEVM(context, txContext, statedb, params.AllEthashProtocolChanges, vm.Config{Tracer: tracer})
- msg, err := core.TransactionToMessage(tx, signer, nil)
+ msg, err := core.TransactionToMessage(tx, signer, context.BaseFee)
if err != nil {
b.Fatalf("failed to prepare transaction for tracing: %v", err)
}
diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go
index e8a201f71b..900335988b 100644
--- a/ethclient/ethclient.go
+++ b/ethclient/ethclient.go
@@ -307,10 +307,8 @@ func (ec *Client) TransactionInBlock(ctx context.Context, blockHash common.Hash,
func (ec *Client) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) {
var r *types.Receipt
err := ec.c.CallContext(ctx, &r, "eth_getTransactionReceipt", txHash)
- if err == nil {
- if r == nil {
- return nil, ethereum.NotFound
- }
+ if err == nil && r == nil {
+ return nil, ethereum.NotFound
}
return r, err
}
diff --git a/ethclient/ethclient_test.go b/ethclient/ethclient_test.go
index 0f87ad5f5c..2ef68337c6 100644
--- a/ethclient/ethclient_test.go
+++ b/ethclient/ethclient_test.go
@@ -264,7 +264,7 @@ func TestEthClient(t *testing.T) {
func(t *testing.T) { testBalanceAt(t, client) },
},
"TxInBlockInterrupted": {
- func(t *testing.T) { testTransactionInBlockInterrupted(t, client) },
+ func(t *testing.T) { testTransactionInBlock(t, client) },
},
"ChainID": {
func(t *testing.T) { testChainID(t, client) },
@@ -329,7 +329,7 @@ func testHeader(t *testing.T, chain []*types.Block, client *rpc.Client) {
got.Number = big.NewInt(0) // hack to make DeepEqual work
}
if !reflect.DeepEqual(got, tt.want) {
- t.Fatalf("HeaderByNumber(%v)\n = %v\nwant %v", tt.block, got, tt.want)
+ t.Fatalf("HeaderByNumber(%v) got = %v, want %v", tt.block, got, tt.want)
}
})
}
@@ -381,7 +381,7 @@ func testBalanceAt(t *testing.T, client *rpc.Client) {
}
}
-func testTransactionInBlockInterrupted(t *testing.T, client *rpc.Client) {
+func testTransactionInBlock(t *testing.T, client *rpc.Client) {
ec := NewClient(client)
// Get current block by number.
@@ -390,22 +390,27 @@ func testTransactionInBlockInterrupted(t *testing.T, client *rpc.Client) {
t.Fatalf("unexpected error: %v", err)
}
- // Test tx in block interrupted.
- ctx, cancel := context.WithCancel(context.Background())
- cancel()
- <-ctx.Done() // Ensure the close of the Done channel
- tx, err := ec.TransactionInBlock(ctx, block.Hash(), 0)
- if tx != nil {
- t.Fatal("transaction should be nil")
- }
- if err == nil || err == ethereum.NotFound {
- t.Fatal("error should not be nil/notfound")
- }
-
// Test tx in block not found.
if _, err := ec.TransactionInBlock(context.Background(), block.Hash(), 20); err != ethereum.NotFound {
t.Fatal("error should be ethereum.NotFound")
}
+
+ // Test tx in block found.
+ tx, err := ec.TransactionInBlock(context.Background(), block.Hash(), 0)
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ if tx.Hash() != testTx1.Hash() {
+ t.Fatalf("unexpected transaction: %v", tx)
+ }
+
+ tx, err = ec.TransactionInBlock(context.Background(), block.Hash(), 1)
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ if tx.Hash() != testTx2.Hash() {
+ t.Fatalf("unexpected transaction: %v", tx)
+ }
}
func testChainID(t *testing.T, client *rpc.Client) {
diff --git a/ethclient/gethclient/gethclient_test.go b/ethclient/gethclient/gethclient_test.go
index a718246bd0..dbe2310a62 100644
--- a/ethclient/gethclient/gethclient_test.go
+++ b/ethclient/gethclient/gethclient_test.go
@@ -169,7 +169,7 @@ func testAccessList(t *testing.T, client *rpc.Client) {
From: testAddr,
To: &common.Address{},
Gas: 21000,
- GasPrice: big.NewInt(765625000),
+ GasPrice: big.NewInt(875000000),
Value: big.NewInt(1),
}
al, gas, vmErr, err := ec.CreateAccessList(context.Background(), msg)
@@ -450,7 +450,7 @@ func testCallContract(t *testing.T, client *rpc.Client) {
func TestOverrideAccountMarshal(t *testing.T) {
om := map[common.Address]OverrideAccount{
{0x11}: {
- // Zero-valued nonce is not overriddden, but simply dropped by the encoder.
+ // Zero-valued nonce is not overridden, but simply dropped by the encoder.
Nonce: 0,
},
{0xaa}: {
diff --git a/ethclient/simulated/backend.go b/ethclient/simulated/backend.go
new file mode 100644
index 0000000000..6169dde61b
--- /dev/null
+++ b/ethclient/simulated/backend.go
@@ -0,0 +1,187 @@
+// Copyright 2023 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see .
+
+package simulated
+
+import (
+ "time"
+
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/eth"
+ "github.com/ethereum/go-ethereum/eth/catalyst"
+ "github.com/ethereum/go-ethereum/eth/downloader"
+ "github.com/ethereum/go-ethereum/eth/ethconfig"
+ "github.com/ethereum/go-ethereum/eth/filters"
+ "github.com/ethereum/go-ethereum/ethclient"
+ "github.com/ethereum/go-ethereum/node"
+ "github.com/ethereum/go-ethereum/p2p"
+ "github.com/ethereum/go-ethereum/params"
+ "github.com/ethereum/go-ethereum/rpc"
+)
+
+// Client exposes the methods provided by the Ethereum RPC client.
+type Client interface {
+ ethereum.BlockNumberReader
+ ethereum.ChainReader
+ ethereum.ChainStateReader
+ ethereum.ContractCaller
+ ethereum.GasEstimator
+ ethereum.GasPricer
+ ethereum.GasPricer1559
+ ethereum.FeeHistoryReader
+ ethereum.LogFilterer
+ ethereum.PendingStateReader
+ ethereum.PendingContractCaller
+ ethereum.TransactionReader
+ ethereum.TransactionSender
+ ethereum.ChainIDReader
+}
+
+// simClient wraps ethclient. This exists to prevent extracting ethclient.Client
+// from the Client interface returned by Backend.
+type simClient struct {
+ *ethclient.Client
+}
+
+// Backend is a simulated blockchain. You can use it to test your contracts or
+// other code that interacts with the Ethereum chain.
+type Backend struct {
+ eth *eth.Ethereum
+ beacon *catalyst.SimulatedBeacon
+ client simClient
+}
+
+// NewBackend creates a new simulated blockchain that can be used as a backend for
+// contract bindings in unit tests.
+//
+// A simulated backend always uses chainID 1337.
+func NewBackend(alloc core.GenesisAlloc, options ...func(nodeConf *node.Config, ethConf *ethconfig.Config)) *Backend {
+ // Create the default configurations for the outer node shell and the Ethereum
+ // service to mutate with the options afterwards
+ nodeConf := node.DefaultConfig
+ nodeConf.DataDir = ""
+ nodeConf.P2P = p2p.Config{NoDiscovery: true}
+
+ ethConf := ethconfig.Defaults
+ ethConf.Genesis = &core.Genesis{
+ Config: params.AllDevChainProtocolChanges,
+ GasLimit: ethconfig.Defaults.Miner.GasCeil,
+ Alloc: alloc,
+ }
+ ethConf.SyncMode = downloader.FullSync
+ ethConf.TxPool.NoLocals = true
+
+ for _, option := range options {
+ option(&nodeConf, ðConf)
+ }
+ // Assemble the Ethereum stack to run the chain with
+ stack, err := node.New(&nodeConf)
+ if err != nil {
+ panic(err) // this should never happen
+ }
+ sim, err := newWithNode(stack, ðConf, 0)
+ if err != nil {
+ panic(err) // this should never happen
+ }
+ return sim
+}
+
+// newWithNode sets up a simulated backend on an existing node. The provided node
+// must not be started and will be started by this method.
+func newWithNode(stack *node.Node, conf *eth.Config, blockPeriod uint64) (*Backend, error) {
+ backend, err := eth.New(stack, conf)
+ if err != nil {
+ return nil, err
+ }
+ // Register the filter system
+ filterSystem := filters.NewFilterSystem(backend.APIBackend, filters.Config{})
+ stack.RegisterAPIs([]rpc.API{{
+ Namespace: "eth",
+ Service: filters.NewFilterAPI(filterSystem, false),
+ }})
+ // Start the node
+ if err := stack.Start(); err != nil {
+ return nil, err
+ }
+ // Set up the simulated beacon
+ beacon, err := catalyst.NewSimulatedBeacon(blockPeriod, backend)
+ if err != nil {
+ return nil, err
+ }
+ // Reorg our chain back to genesis
+ if err := beacon.Fork(backend.BlockChain().GetCanonicalHash(0)); err != nil {
+ return nil, err
+ }
+ return &Backend{
+ eth: backend,
+ beacon: beacon,
+ client: simClient{ethclient.NewClient(stack.Attach())},
+ }, nil
+}
+
+// Close shuts down the simBackend.
+// The simulated backend can't be used afterwards.
+func (n *Backend) Close() error {
+ if n.client.Client != nil {
+ n.client.Close()
+ n.client = simClient{}
+ }
+ if n.beacon != nil {
+ err := n.beacon.Stop()
+ n.beacon = nil
+ return err
+ }
+ return nil
+}
+
+// Commit seals a block and moves the chain forward to a new empty block.
+func (n *Backend) Commit() common.Hash {
+ return n.beacon.Commit()
+}
+
+// Rollback removes all pending transactions, reverting to the last committed state.
+func (n *Backend) Rollback() {
+ n.beacon.Rollback()
+}
+
+// Fork creates a side-chain that can be used to simulate reorgs.
+//
+// This function should be called with the ancestor block where the new side
+// chain should be started. Transactions (old and new) can then be applied on
+// top and Commit-ed.
+//
+// Note, the side-chain will only become canonical (and trigger the events) when
+// it becomes longer. Until then CallContract will still operate on the current
+// canonical chain.
+//
+// There is a % chance that the side chain becomes canonical at the same length
+// to simulate live network behavior.
+func (n *Backend) Fork(parentHash common.Hash) error {
+ return n.beacon.Fork(parentHash)
+}
+
+// AdjustTime changes the block timestamp and creates a new block.
+// It can only be called on empty blocks.
+func (n *Backend) AdjustTime(adjustment time.Duration) error {
+ return n.beacon.AdjustTime(adjustment)
+}
+
+// Client returns a client that accesses the simulated chain.
+func (n *Backend) Client() Client {
+ return n.client
+}
diff --git a/ethclient/simulated/backend_test.go b/ethclient/simulated/backend_test.go
new file mode 100644
index 0000000000..a9a8accfea
--- /dev/null
+++ b/ethclient/simulated/backend_test.go
@@ -0,0 +1,309 @@
+// Copyright 2019 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see .
+
+package simulated
+
+import (
+ "context"
+ "crypto/ecdsa"
+ "math/big"
+ "math/rand"
+ "testing"
+ "time"
+
+ "github.com/ethereum/go-ethereum/accounts/abi/bind"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/core/types"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/ethereum/go-ethereum/params"
+)
+
+var _ bind.ContractBackend = (Client)(nil)
+
+var (
+ testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
+ testAddr = crypto.PubkeyToAddress(testKey.PublicKey)
+)
+
+func simTestBackend(testAddr common.Address) *Backend {
+ return NewBackend(
+ core.GenesisAlloc{
+ testAddr: {Balance: big.NewInt(10000000000000000)},
+ },
+ )
+}
+
+func newTx(sim *Backend, key *ecdsa.PrivateKey) (*types.Transaction, error) {
+ client := sim.Client()
+
+ // create a signed transaction to send
+ head, _ := client.HeaderByNumber(context.Background(), nil) // Should be child's, good enough
+ gasPrice := new(big.Int).Add(head.BaseFee, big.NewInt(1))
+ addr := crypto.PubkeyToAddress(key.PublicKey)
+ chainid, _ := client.ChainID(context.Background())
+ nonce, err := client.PendingNonceAt(context.Background(), addr)
+ if err != nil {
+ return nil, err
+ }
+ tx := types.NewTx(&types.DynamicFeeTx{
+ ChainID: chainid,
+ Nonce: nonce,
+ GasTipCap: big.NewInt(1),
+ GasFeeCap: gasPrice,
+ Gas: 21000,
+ To: &addr,
+ })
+ return types.SignTx(tx, types.LatestSignerForChainID(chainid), key)
+}
+
+func TestNewBackend(t *testing.T) {
+ sim := NewBackend(core.GenesisAlloc{})
+ defer sim.Close()
+
+ client := sim.Client()
+ num, err := client.BlockNumber(context.Background())
+ if err != nil {
+ t.Fatal(err)
+ }
+ if num != 0 {
+ t.Fatalf("expected 0 got %v", num)
+ }
+ // Create a block
+ sim.Commit()
+ num, err = client.BlockNumber(context.Background())
+ if err != nil {
+ t.Fatal(err)
+ }
+ if num != 1 {
+ t.Fatalf("expected 1 got %v", num)
+ }
+}
+
+func TestAdjustTime(t *testing.T) {
+ sim := NewBackend(core.GenesisAlloc{})
+ defer sim.Close()
+
+ client := sim.Client()
+ block1, _ := client.BlockByNumber(context.Background(), nil)
+
+ // Create a block
+ if err := sim.AdjustTime(time.Minute); err != nil {
+ t.Fatal(err)
+ }
+ block2, _ := client.BlockByNumber(context.Background(), nil)
+ prevTime := block1.Time()
+ newTime := block2.Time()
+ if newTime-prevTime != uint64(time.Minute) {
+ t.Errorf("adjusted time not equal to 60 seconds. prev: %v, new: %v", prevTime, newTime)
+ }
+}
+
+func TestSendTransaction(t *testing.T) {
+ sim := simTestBackend(testAddr)
+ defer sim.Close()
+
+ client := sim.Client()
+ ctx := context.Background()
+
+ signedTx, err := newTx(sim, testKey)
+ if err != nil {
+ t.Errorf("could not create transaction: %v", err)
+ }
+ // send tx to simulated backend
+ err = client.SendTransaction(ctx, signedTx)
+ if err != nil {
+ t.Errorf("could not add tx to pending block: %v", err)
+ }
+ sim.Commit()
+ block, err := client.BlockByNumber(ctx, big.NewInt(1))
+ if err != nil {
+ t.Errorf("could not get block at height 1: %v", err)
+ }
+
+ if signedTx.Hash() != block.Transactions()[0].Hash() {
+ t.Errorf("did not commit sent transaction. expected hash %v got hash %v", block.Transactions()[0].Hash(), signedTx.Hash())
+ }
+}
+
+// TestFork check that the chain length after a reorg is correct.
+// Steps:
+// 1. Save the current block which will serve as parent for the fork.
+// 2. Mine n blocks with n ∈ [0, 20].
+// 3. Assert that the chain length is n.
+// 4. Fork by using the parent block as ancestor.
+// 5. Mine n+1 blocks which should trigger a reorg.
+// 6. Assert that the chain length is n+1.
+// Since Commit() was called 2n+1 times in total,
+// having a chain length of just n+1 means that a reorg occurred.
+func TestFork(t *testing.T) {
+ t.Parallel()
+ testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
+ sim := simTestBackend(testAddr)
+ defer sim.Close()
+
+ client := sim.Client()
+ ctx := context.Background()
+
+ // 1.
+ parent, _ := client.HeaderByNumber(ctx, nil)
+
+ // 2.
+ n := int(rand.Int31n(21))
+ for i := 0; i < n; i++ {
+ sim.Commit()
+ }
+
+ // 3.
+ b, _ := client.BlockNumber(ctx)
+ if b != uint64(n) {
+ t.Error("wrong chain length")
+ }
+
+ // 4.
+ sim.Fork(parent.Hash())
+
+ // 5.
+ for i := 0; i < n+1; i++ {
+ sim.Commit()
+ }
+
+ // 6.
+ b, _ = client.BlockNumber(ctx)
+ if b != uint64(n+1) {
+ t.Error("wrong chain length")
+ }
+}
+
+// TestForkResendTx checks that re-sending a TX after a fork
+// is possible and does not cause a "nonce mismatch" panic.
+// Steps:
+// 1. Save the current block which will serve as parent for the fork.
+// 2. Send a transaction.
+// 3. Check that the TX is included in block 1.
+// 4. Fork by using the parent block as ancestor.
+// 5. Mine a block, Re-send the transaction and mine another one.
+// 6. Check that the TX is now included in block 2.
+func TestForkResendTx(t *testing.T) {
+ t.Parallel()
+ testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
+ sim := simTestBackend(testAddr)
+ defer sim.Close()
+
+ client := sim.Client()
+ ctx := context.Background()
+
+ // 1.
+ parent, _ := client.HeaderByNumber(ctx, nil)
+
+ // 2.
+ tx, err := newTx(sim, testKey)
+ if err != nil {
+ t.Fatalf("could not create transaction: %v", err)
+ }
+ client.SendTransaction(ctx, tx)
+ sim.Commit()
+
+ // 3.
+ receipt, _ := client.TransactionReceipt(ctx, tx.Hash())
+ if h := receipt.BlockNumber.Uint64(); h != 1 {
+ t.Errorf("TX included in wrong block: %d", h)
+ }
+
+ // 4.
+ if err := sim.Fork(parent.Hash()); err != nil {
+ t.Errorf("forking: %v", err)
+ }
+
+ // 5.
+ sim.Commit()
+ if err := client.SendTransaction(ctx, tx); err != nil {
+ t.Fatalf("sending transaction: %v", err)
+ }
+ sim.Commit()
+ receipt, _ = client.TransactionReceipt(ctx, tx.Hash())
+ if h := receipt.BlockNumber.Uint64(); h != 2 {
+ t.Errorf("TX included in wrong block: %d", h)
+ }
+}
+
+func TestCommitReturnValue(t *testing.T) {
+ t.Parallel()
+ testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
+ sim := simTestBackend(testAddr)
+ defer sim.Close()
+
+ client := sim.Client()
+ ctx := context.Background()
+
+ // Test if Commit returns the correct block hash
+ h1 := sim.Commit()
+ cur, _ := client.HeaderByNumber(ctx, nil)
+ if h1 != cur.Hash() {
+ t.Error("Commit did not return the hash of the last block.")
+ }
+
+ // Create a block in the original chain (containing a transaction to force different block hashes)
+ head, _ := client.HeaderByNumber(ctx, nil) // Should be child's, good enough
+ gasPrice := new(big.Int).Add(head.BaseFee, big.NewInt(1))
+ _tx := types.NewTransaction(0, testAddr, big.NewInt(1000), params.TxGas, gasPrice, nil)
+ tx, _ := types.SignTx(_tx, types.HomesteadSigner{}, testKey)
+ client.SendTransaction(ctx, tx)
+
+ h2 := sim.Commit()
+
+ // Create another block in the original chain
+ sim.Commit()
+
+ // Fork at the first bock
+ if err := sim.Fork(h1); err != nil {
+ t.Errorf("forking: %v", err)
+ }
+
+ // Test if Commit returns the correct block hash after the reorg
+ h2fork := sim.Commit()
+ if h2 == h2fork {
+ t.Error("The block in the fork and the original block are the same block!")
+ }
+ if header, err := client.HeaderByHash(ctx, h2fork); err != nil || header == nil {
+ t.Error("Could not retrieve the just created block (side-chain)")
+ }
+}
+
+// TestAdjustTimeAfterFork ensures that after a fork, AdjustTime uses the pending fork
+// block's parent rather than the canonical head's parent.
+func TestAdjustTimeAfterFork(t *testing.T) {
+ t.Parallel()
+ testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
+ sim := simTestBackend(testAddr)
+ defer sim.Close()
+
+ client := sim.Client()
+ ctx := context.Background()
+
+ sim.Commit() // h1
+ h1, _ := client.HeaderByNumber(ctx, nil)
+
+ sim.Commit() // h2
+ sim.Fork(h1.Hash())
+ sim.AdjustTime(1 * time.Second)
+ sim.Commit()
+
+ head, _ := client.HeaderByNumber(ctx, nil)
+ if head.Number.Uint64() == 2 && head.ParentHash != h1.Hash() {
+ t.Errorf("failed to build block on fork")
+ }
+}
diff --git a/ethclient/simulated/options.go b/ethclient/simulated/options.go
new file mode 100644
index 0000000000..1b2f4c090d
--- /dev/null
+++ b/ethclient/simulated/options.go
@@ -0,0 +1,39 @@
+// Copyright 2024 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see .
+
+package simulated
+
+import (
+ "github.com/ethereum/go-ethereum/eth/ethconfig"
+ "github.com/ethereum/go-ethereum/node"
+)
+
+// WithBlockGasLimit configures the simulated backend to target a specific gas limit
+// when producing blocks.
+func WithBlockGasLimit(gaslimit uint64) func(nodeConf *node.Config, ethConf *ethconfig.Config) {
+ return func(nodeConf *node.Config, ethConf *ethconfig.Config) {
+ ethConf.Genesis.GasLimit = gaslimit
+ ethConf.Miner.GasCeil = gaslimit
+ }
+}
+
+// WithCallGasLimit configures the simulated backend to cap eth_calls to a specific
+// gas limit when running client operations.
+func WithCallGasLimit(gaslimit uint64) func(nodeConf *node.Config, ethConf *ethconfig.Config) {
+ return func(nodeConf *node.Config, ethConf *ethconfig.Config) {
+ ethConf.RPCGasCap = gaslimit
+ }
+}
diff --git a/ethclient/simulated/options_test.go b/ethclient/simulated/options_test.go
new file mode 100644
index 0000000000..d9ff3b428a
--- /dev/null
+++ b/ethclient/simulated/options_test.go
@@ -0,0 +1,73 @@
+// Copyright 2024 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see .
+
+package simulated
+
+import (
+ "context"
+ "math/big"
+ "strings"
+ "testing"
+
+ "github.com/ethereum/go-ethereum"
+ "github.com/ethereum/go-ethereum/core"
+ "github.com/ethereum/go-ethereum/params"
+)
+
+// Tests that the simulator starts with the initial gas limit in the genesis block,
+// and that it keeps the same target value.
+func TestWithBlockGasLimitOption(t *testing.T) {
+ // Construct a simulator, targeting a different gas limit
+ sim := NewBackend(core.GenesisAlloc{}, WithBlockGasLimit(12_345_678))
+ defer sim.Close()
+
+ client := sim.Client()
+ genesis, err := client.BlockByNumber(context.Background(), big.NewInt(0))
+ if err != nil {
+ t.Fatalf("failed to retrieve genesis block: %v", err)
+ }
+ if genesis.GasLimit() != 12_345_678 {
+ t.Errorf("genesis gas limit mismatch: have %v, want %v", genesis.GasLimit(), 12_345_678)
+ }
+ // Produce a number of blocks and verify the locked in gas target
+ sim.Commit()
+ head, err := client.BlockByNumber(context.Background(), big.NewInt(1))
+ if err != nil {
+ t.Fatalf("failed to retrieve head block: %v", err)
+ }
+ if head.GasLimit() != 12_345_678 {
+ t.Errorf("head gas limit mismatch: have %v, want %v", head.GasLimit(), 12_345_678)
+ }
+}
+
+// Tests that the simulator honors the RPC call caps set by the options.
+func TestWithCallGasLimitOption(t *testing.T) {
+ // Construct a simulator, targeting a different gas limit
+ sim := NewBackend(core.GenesisAlloc{
+ testAddr: {Balance: big.NewInt(10000000000000000)},
+ }, WithCallGasLimit(params.TxGas-1))
+ defer sim.Close()
+
+ client := sim.Client()
+ _, err := client.CallContract(context.Background(), ethereum.CallMsg{
+ From: testAddr,
+ To: &testAddr,
+ Gas: 21000,
+ }, nil)
+ if !strings.Contains(err.Error(), core.ErrIntrinsicGas.Error()) {
+ t.Fatalf("error mismatch: have %v, want %v", err, core.ErrIntrinsicGas)
+ }
+}
diff --git a/ethdb/dbtest/testsuite.go b/ethdb/dbtest/testsuite.go
index 0d3d5f5aa6..29bd24364e 100644
--- a/ethdb/dbtest/testsuite.go
+++ b/ethdb/dbtest/testsuite.go
@@ -273,9 +273,13 @@ func TestDatabaseSuite(t *testing.T, New func() ethdb.KeyValueStore) {
b.Put([]byte("5"), nil)
b.Delete([]byte("1"))
b.Put([]byte("6"), nil)
- b.Delete([]byte("3"))
+
+ b.Delete([]byte("3")) // delete then put
b.Put([]byte("3"), nil)
+ b.Put([]byte("7"), nil) // put then delete
+ b.Delete([]byte("7"))
+
if err := b.Write(); err != nil {
t.Fatal(err)
}
diff --git a/ethdb/pebble/pebble.go b/ethdb/pebble/pebble.go
index d58329c6d6..af4686cf5b 100644
--- a/ethdb/pebble/pebble.go
+++ b/ethdb/pebble/pebble.go
@@ -25,7 +25,6 @@ import (
"sync/atomic"
"time"
- "github.com/cockroachdb/errors"
"github.com/cockroachdb/pebble"
"github.com/cockroachdb/pebble/bloom"
"github.com/ethereum/go-ethereum/common"
@@ -131,7 +130,7 @@ func (l panicLogger) Errorf(format string, args ...interface{}) {
}
func (l panicLogger) Fatalf(format string, args ...interface{}) {
- panic(errors.Errorf("fatal: "+format, args...))
+ panic(fmt.Errorf("fatal: "+format, args...))
}
// New returns a wrapped pebble DB object. The namespace is the prefix that the
diff --git a/go.mod b/go.mod
index 75c2b899d6..b4d077fc47 100644
--- a/go.mod
+++ b/go.mod
@@ -13,7 +13,6 @@ require (
github.com/btcsuite/btcd/btcec/v2 v2.2.0
github.com/cespare/cp v0.1.0
github.com/cloudflare/cloudflare-go v0.79.0
- github.com/cockroachdb/errors v1.8.1
github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593
github.com/consensys/gnark-crypto v0.12.1
github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233
@@ -63,10 +62,10 @@ require (
github.com/tyler-smith/go-bip39 v1.1.0
github.com/urfave/cli/v2 v2.25.7
go.uber.org/automaxprocs v1.5.2
- golang.org/x/crypto v0.15.0
+ golang.org/x/crypto v0.17.0
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa
golang.org/x/sync v0.5.0
- golang.org/x/sys v0.14.0
+ golang.org/x/sys v0.15.0
golang.org/x/text v0.14.0
golang.org/x/time v0.3.0
golang.org/x/tools v0.15.0
@@ -91,6 +90,7 @@ require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/bits-and-blooms/bitset v1.10.0 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
+ github.com/cockroachdb/errors v1.8.1 // indirect
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f // indirect
github.com/cockroachdb/redact v1.0.8 // indirect
github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 // indirect
diff --git a/go.sum b/go.sum
index f89adbe571..bab51b1345 100644
--- a/go.sum
+++ b/go.sum
@@ -614,8 +614,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA=
-golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g=
+golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
+golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -774,8 +774,8 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
-golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
+golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
diff --git a/interfaces.go b/interfaces.go
index c4948191d1..1892309ed3 100644
--- a/interfaces.go
+++ b/interfaces.go
@@ -199,6 +199,16 @@ type GasPricer interface {
SuggestGasPrice(ctx context.Context) (*big.Int, error)
}
+// GasPricer1559 provides access to the EIP-1559 gas price oracle.
+type GasPricer1559 interface {
+ SuggestGasTipCap(ctx context.Context) (*big.Int, error)
+}
+
+// FeeHistoryReader provides access to the fee history oracle.
+type FeeHistoryReader interface {
+ FeeHistory(ctx context.Context, blockCount uint64, lastBlock *big.Int, rewardPercentiles []float64) (*FeeHistory, error)
+}
+
// FeeHistory provides recent fee market data that consumers can use to determine
// a reasonable maxPriorityFeePerGas value.
type FeeHistory struct {
@@ -239,3 +249,13 @@ type GasEstimator interface {
type PendingStateEventer interface {
SubscribePendingTransactions(ctx context.Context, ch chan<- *types.Transaction) (Subscription, error)
}
+
+// BlockNumberReader provides access to the current block number.
+type BlockNumberReader interface {
+ BlockNumber(ctx context.Context) (uint64, error)
+}
+
+// ChainIDReader provides access to the chain ID.
+type ChainIDReader interface {
+ ChainID(ctx context.Context) (*big.Int, error)
+}
diff --git a/internal/build/gotool.go b/internal/build/gotool.go
index 32ca20e869..2a47460418 100644
--- a/internal/build/gotool.go
+++ b/internal/build/gotool.go
@@ -144,7 +144,6 @@ func Version(csdb *ChecksumDB, version string) (string, error) {
continue
}
if parts[0] == version {
- log.Printf("Found version %q", parts[1])
return parts[1], nil
}
}
diff --git a/internal/build/util.go b/internal/build/util.go
index 5c77b236dc..b41014a16f 100644
--- a/internal/build/util.go
+++ b/internal/build/util.go
@@ -68,6 +68,27 @@ func MustRunCommand(cmd string, args ...string) {
MustRun(exec.Command(cmd, args...))
}
+// MustRunCommandWithOutput runs the given command, and ensures that some output will be
+// printed while it runs. This is useful for CI builds where the process will be stopped
+// when there is no output.
+func MustRunCommandWithOutput(cmd string, args ...string) {
+ interval := time.NewTicker(time.Minute)
+ done := make(chan struct{})
+ defer interval.Stop()
+ defer close(done)
+ go func() {
+ for {
+ select {
+ case <-interval.C:
+ fmt.Printf("Waiting for command %q\n", cmd)
+ case <-done:
+ return
+ }
+ }
+ }()
+ MustRun(exec.Command(cmd, args...))
+}
+
var warnedAboutGit bool
// RunGit runs a git subcommand and returns its output.
diff --git a/internal/debug/flags.go b/internal/debug/flags.go
index 23e4745e8c..dac878a7b1 100644
--- a/internal/debug/flags.go
+++ b/internal/debug/flags.go
@@ -168,22 +168,12 @@ var Flags = []cli.Flag{
}
var (
- glogger *log.GlogHandler
- logOutputFile io.WriteCloser
- defaultTerminalHandler *log.TerminalHandler
+ glogger *log.GlogHandler
+ logOutputFile io.WriteCloser
)
func init() {
- defaultTerminalHandler = log.NewTerminalHandler(os.Stderr, false)
- glogger = log.NewGlogHandler(defaultTerminalHandler)
- glogger.Verbosity(log.LvlInfo)
- log.SetDefault(log.NewLogger(glogger))
-}
-
-func ResetLogging() {
- if defaultTerminalHandler != nil {
- defaultTerminalHandler.ResetFieldPadding()
- }
+ glogger = log.NewGlogHandler(log.NewTerminalHandler(os.Stderr, false))
}
// Setup initializes profiling and logging based on the CLI flags.
diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go
index c0b28e4b69..03f7a31231 100644
--- a/internal/ethapi/api.go
+++ b/internal/ethapi/api.go
@@ -1478,7 +1478,7 @@ type accessListResult struct {
// CreateAccessList creates an EIP-2930 type AccessList for the given transaction.
// Reexec and BlockNrOrHash can be specified to create the accessList on top of a certain state.
func (s *BlockChainAPI) CreateAccessList(ctx context.Context, args TransactionArgs, blockNrOrHash *rpc.BlockNumberOrHash) (*accessListResult, error) {
- bNrOrHash := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber)
+ bNrOrHash := rpc.BlockNumberOrHashWithNumber(rpc.LatestBlockNumber)
if blockNrOrHash != nil {
bNrOrHash = *blockNrOrHash
}
diff --git a/internal/ethapi/transaction_args.go b/internal/ethapi/transaction_args.go
index e4cf81a3f4..84f1dfe77a 100644
--- a/internal/ethapi/transaction_args.go
+++ b/internal/ethapi/transaction_args.go
@@ -110,8 +110,8 @@ func (args *TransactionArgs) setDefaults(ctx context.Context, b Backend) error {
Data: (*hexutil.Bytes)(&data),
AccessList: args.AccessList,
}
- pendingBlockNr := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber)
- estimated, err := DoEstimateGas(ctx, b, callArgs, pendingBlockNr, nil, b.RPCGasCap())
+ latestBlockNr := rpc.BlockNumberOrHashWithNumber(rpc.LatestBlockNumber)
+ estimated, err := DoEstimateGas(ctx, b, callArgs, latestBlockNr, nil, b.RPCGasCap())
if err != nil {
return err
}
@@ -137,20 +137,35 @@ func (args *TransactionArgs) setFeeDefaults(ctx context.Context, b Backend) erro
if args.GasPrice != nil && (args.MaxFeePerGas != nil || args.MaxPriorityFeePerGas != nil) {
return errors.New("both gasPrice and (maxFeePerGas or maxPriorityFeePerGas) specified")
}
- // If the tx has completely specified a fee mechanism, no default is needed. This allows users
- // who are not yet synced past London to get defaults for other tx values. See
- // https://github.com/ethereum/go-ethereum/pull/23274 for more information.
+ // If the tx has completely specified a fee mechanism, no default is needed.
+ // This allows users who are not yet synced past London to get defaults for
+ // other tx values. See https://github.com/ethereum/go-ethereum/pull/23274
+ // for more information.
eip1559ParamsSet := args.MaxFeePerGas != nil && args.MaxPriorityFeePerGas != nil
- if (args.GasPrice != nil && !eip1559ParamsSet) || (args.GasPrice == nil && eip1559ParamsSet) {
- // Sanity check the EIP-1559 fee parameters if present.
- if args.GasPrice == nil && args.MaxFeePerGas.ToInt().Cmp(args.MaxPriorityFeePerGas.ToInt()) < 0 {
+
+ // Sanity check the EIP-1559 fee parameters if present.
+ if args.GasPrice == nil && eip1559ParamsSet {
+ if args.MaxFeePerGas.ToInt().Sign() == 0 {
+ return errors.New("maxFeePerGas must be non-zero")
+ }
+ if args.MaxFeePerGas.ToInt().Cmp(args.MaxPriorityFeePerGas.ToInt()) < 0 {
return fmt.Errorf("maxFeePerGas (%v) < maxPriorityFeePerGas (%v)", args.MaxFeePerGas, args.MaxPriorityFeePerGas)
}
- return nil
+ return nil // No need to set anything, user already set MaxFeePerGas and MaxPriorityFeePerGas
}
- // Now attempt to fill in default value depending on whether London is active or not.
+ // Sanity check the non-EIP-1559 fee parameters.
head := b.CurrentHeader()
- if b.ChainConfig().IsLondon(head.Number) {
+ isLondon := b.ChainConfig().IsLondon(head.Number)
+ if args.GasPrice != nil && !eip1559ParamsSet {
+ // Zero gas-price is not allowed after London fork
+ if args.GasPrice.ToInt().Sign() == 0 && isLondon {
+ return errors.New("gasPrice must be non-zero after london fork")
+ }
+ return nil // No need to set anything, user already set GasPrice
+ }
+
+ // Now attempt to fill in default value depending on whether London is active or not.
+ if isLondon {
// London is active, set maxPriorityFeePerGas and maxFeePerGas.
if err := args.setLondonFeeDefaults(ctx, head, b); err != nil {
return err
diff --git a/internal/ethapi/transaction_args_test.go b/internal/ethapi/transaction_args_test.go
index 9dc58bdeb5..ab7c2f70ed 100644
--- a/internal/ethapi/transaction_args_test.go
+++ b/internal/ethapi/transaction_args_test.go
@@ -52,6 +52,7 @@ func TestSetFeeDefaults(t *testing.T) {
var (
b = newBackendMock()
+ zero = (*hexutil.Big)(big.NewInt(0))
fortytwo = (*hexutil.Big)(big.NewInt(42))
maxFee = (*hexutil.Big)(new(big.Int).Add(new(big.Int).Mul(b.current.BaseFee, big.NewInt(2)), fortytwo.ToInt()))
al = &types.AccessList{types.AccessTuple{Address: common.Address{0xaa}, StorageKeys: []common.Hash{{0x01}}}}
@@ -66,6 +67,13 @@ func TestSetFeeDefaults(t *testing.T) {
&TransactionArgs{GasPrice: fortytwo},
nil,
},
+ {
+ "legacy tx pre-London with zero price",
+ false,
+ &TransactionArgs{GasPrice: zero},
+ &TransactionArgs{GasPrice: zero},
+ nil,
+ },
{
"legacy tx post-London, explicit gas price",
true,
@@ -73,6 +81,13 @@ func TestSetFeeDefaults(t *testing.T) {
&TransactionArgs{GasPrice: fortytwo},
nil,
},
+ {
+ "legacy tx post-London with zero price",
+ true,
+ &TransactionArgs{GasPrice: zero},
+ nil,
+ errors.New("gasPrice must be non-zero after london fork"),
+ },
// Access list txs
{
@@ -161,6 +176,13 @@ func TestSetFeeDefaults(t *testing.T) {
nil,
errors.New("maxFeePerGas (0x7) < maxPriorityFeePerGas (0x2a)"),
},
+ {
+ "dynamic fee tx post-London, explicit gas price",
+ true,
+ &TransactionArgs{MaxFeePerGas: zero, MaxPriorityFeePerGas: zero},
+ nil,
+ errors.New("maxFeePerGas must be non-zero"),
+ },
// Misc
{
diff --git a/internal/flags/categories.go b/internal/flags/categories.go
index 487684d98b..3ff0767921 100644
--- a/internal/flags/categories.go
+++ b/internal/flags/categories.go
@@ -35,6 +35,7 @@ const (
LoggingCategory = "LOGGING AND DEBUGGING"
MetricsCategory = "METRICS AND STATS"
MiscCategory = "MISC"
+ TestingCategory = "TESTING"
DeprecatedCategory = "ALIASED (deprecated)"
)
diff --git a/internal/flags/helpers.go b/internal/flags/helpers.go
index d4b8e373cc..369a931e8a 100644
--- a/internal/flags/helpers.go
+++ b/internal/flags/helpers.go
@@ -41,7 +41,7 @@ func NewApp(usage string) *cli.App {
app.EnableBashCompletion = true
app.Version = params.VersionWithCommit(git.Commit, git.Date)
app.Usage = usage
- app.Copyright = "Copyright 2013-2023 The go-ethereum Authors"
+ app.Copyright = "Copyright 2013-2024 The go-ethereum Authors"
app.Before = func(ctx *cli.Context) error {
MigrateGlobalFlags(ctx)
return nil
@@ -105,7 +105,7 @@ func MigrateGlobalFlags(ctx *cli.Context) {
func doMigrateFlags(ctx *cli.Context) {
// Figure out if there are any aliases of commands. If there are, we want
// to ignore them when iterating over the flags.
- var aliases = make(map[string]bool)
+ aliases := make(map[string]bool)
for _, fl := range ctx.Command.Flags {
for _, alias := range fl.Names()[1:] {
aliases[alias] = true
@@ -239,15 +239,24 @@ func AutoEnvVars(flags []cli.Flag, prefix string) {
case *cli.StringFlag:
flag.EnvVars = append(flag.EnvVars, envvar)
+ case *cli.StringSliceFlag:
+ flag.EnvVars = append(flag.EnvVars, envvar)
+
case *cli.BoolFlag:
flag.EnvVars = append(flag.EnvVars, envvar)
case *cli.IntFlag:
flag.EnvVars = append(flag.EnvVars, envvar)
+ case *cli.Int64Flag:
+ flag.EnvVars = append(flag.EnvVars, envvar)
+
case *cli.Uint64Flag:
flag.EnvVars = append(flag.EnvVars, envvar)
+ case *cli.Float64Flag:
+ flag.EnvVars = append(flag.EnvVars, envvar)
+
case *cli.DurationFlag:
flag.EnvVars = append(flag.EnvVars, envvar)
diff --git a/internal/testlog/testlog.go b/internal/testlog/testlog.go
index 68b9fb19f8..037b7ee9c1 100644
--- a/internal/testlog/testlog.go
+++ b/internal/testlog/testlog.go
@@ -100,6 +100,10 @@ func LoggerWithHandler(t *testing.T, handler slog.Handler) log.Logger {
func (l *logger) Write(level slog.Level, msg string, ctx ...interface{}) {}
+func (l *logger) Enabled(ctx context.Context, level slog.Level) bool {
+ return l.l.Enabled(ctx, level)
+}
+
func (l *logger) Trace(msg string, ctx ...interface{}) {
l.t.Helper()
l.mu.Lock()
@@ -183,8 +187,7 @@ func (h *bufHandler) terminalFormat(r slog.Record) string {
}
for _, attr := range attrs {
- rawVal := attr.Value.Any()
- fmt.Fprintf(buf, " %s=%s", attr.Key, log.FormatLogfmtValue(rawVal, true))
+ fmt.Fprintf(buf, " %s=%s", attr.Key, string(log.FormatSlogValue(attr.Value, nil)))
}
buf.WriteByte('\n')
return buf.String()
diff --git a/internal/utesting/utesting.go b/internal/utesting/utesting.go
index ee99794c64..8260de1d76 100644
--- a/internal/utesting/utesting.go
+++ b/internal/utesting/utesting.go
@@ -35,6 +35,7 @@ import (
type Test struct {
Name string
Fn func(*T)
+ Slow bool
}
// Result is the result of a test execution.
diff --git a/log/format.go b/log/format.go
index 5cbbe3341e..6447f3c1f1 100644
--- a/log/format.go
+++ b/log/format.go
@@ -15,27 +15,13 @@ import (
const (
timeFormat = "2006-01-02T15:04:05-0700"
- termTimeFormat = "01-02|15:04:05.000"
floatFormat = 'f'
termMsgJust = 40
termCtxMaxPadding = 40
)
-type Format interface {
- Format(r slog.Record) []byte
-}
-
-// FormatFunc returns a new Format object which uses
-// the given function to perform record formatting.
-func FormatFunc(f func(slog.Record) []byte) Format {
- return formatFunc(f)
-}
-
-type formatFunc func(slog.Record) []byte
-
-func (f formatFunc) Format(r slog.Record) []byte {
- return f(r)
-}
+// 40 spaces
+var spaces = []byte(" ")
// TerminalStringer is an analogous interface to the stdlib stringer, allowing
// own types to have custom shortened serialization formats when printed to the
@@ -44,188 +30,172 @@ type TerminalStringer interface {
TerminalString() string
}
-func (h *TerminalHandler) TerminalFormat(r slog.Record, usecolor bool) []byte {
+func (h *TerminalHandler) format(buf []byte, r slog.Record, usecolor bool) []byte {
msg := escapeMessage(r.Message)
- var color = 0
+ var color = ""
if usecolor {
switch r.Level {
case LevelCrit:
- color = 35
+ color = "\x1b[35m"
case slog.LevelError:
- color = 31
+ color = "\x1b[31m"
case slog.LevelWarn:
- color = 33
+ color = "\x1b[33m"
case slog.LevelInfo:
- color = 32
+ color = "\x1b[32m"
case slog.LevelDebug:
- color = 36
+ color = "\x1b[36m"
case LevelTrace:
- color = 34
+ color = "\x1b[34m"
}
}
+ if buf == nil {
+ buf = make([]byte, 0, 30+termMsgJust)
+ }
+ b := bytes.NewBuffer(buf)
- b := &bytes.Buffer{}
- lvl := LevelAlignedString(r.Level)
- if color > 0 {
- fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s] %s ", color, lvl, r.Time.Format(termTimeFormat), msg)
+ if color != "" { // Start color
+ b.WriteString(color)
+ b.WriteString(LevelAlignedString(r.Level))
+ b.WriteString("\x1b[0m")
} else {
- fmt.Fprintf(b, "%s[%s] %s ", lvl, r.Time.Format(termTimeFormat), msg)
+ b.WriteString(LevelAlignedString(r.Level))
}
+ b.WriteString("[")
+ writeTimeTermFormat(b, r.Time)
+ b.WriteString("] ")
+ b.WriteString(msg)
+
// try to justify the log output for short messages
- length := utf8.RuneCountInString(msg)
- if r.NumAttrs() > 0 && length < termMsgJust {
- b.Write(bytes.Repeat([]byte{' '}, termMsgJust-length))
+ //length := utf8.RuneCountInString(msg)
+ length := len(msg)
+ if (r.NumAttrs()+len(h.attrs)) > 0 && length < termMsgJust {
+ b.Write(spaces[:termMsgJust-length])
}
- // print the keys logfmt style
- h.logfmt(b, r, color)
+ // print the attributes
+ h.formatAttributes(b, r, color)
return b.Bytes()
}
-func (h *TerminalHandler) logfmt(buf *bytes.Buffer, r slog.Record, color int) {
- attrs := []slog.Attr{}
- r.Attrs(func(attr slog.Attr) bool {
- attrs = append(attrs, attr)
- return true
- })
+func (h *TerminalHandler) formatAttributes(buf *bytes.Buffer, r slog.Record, color string) {
+ // tmp is a temporary buffer we use, until bytes.Buffer.AvailableBuffer() (1.21)
+ // can be used.
+ var tmp = make([]byte, 40)
+ writeAttr := func(attr slog.Attr, first, last bool) {
+ buf.WriteByte(' ')
- attrs = append(h.attrs, attrs...)
-
- for i, attr := range attrs {
- if i != 0 {
- buf.WriteByte(' ')
- }
-
- key := escapeString(attr.Key)
- rawVal := attr.Value.Any()
- val := FormatLogfmtValue(rawVal, true)
-
- // XXX: we should probably check that all of your key bytes aren't invalid
- // TODO (jwasinger) above comment was from log15 code. what does it mean? check that key bytes are ascii characters?
- padding := h.fieldPadding[key]
-
- length := utf8.RuneCountInString(val)
- if padding < length && length <= termCtxMaxPadding {
- padding = length
- h.fieldPadding[key] = padding
- }
- if color > 0 {
- fmt.Fprintf(buf, "\x1b[%dm%s\x1b[0m=", color, key)
+ if color != "" {
+ buf.WriteString(color)
+ //buf.Write(appendEscapeString(buf.AvailableBuffer(), attr.Key))
+ buf.Write(appendEscapeString(tmp[:0], attr.Key))
+ buf.WriteString("\x1b[0m=")
} else {
- buf.WriteString(key)
+ //buf.Write(appendEscapeString(buf.AvailableBuffer(), attr.Key))
+ buf.Write(appendEscapeString(tmp[:0], attr.Key))
buf.WriteByte('=')
}
- buf.WriteString(val)
- if i < r.NumAttrs()-1 && padding > length {
- buf.Write(bytes.Repeat([]byte{' '}, padding-length))
+ //val := FormatSlogValue(attr.Value, true, buf.AvailableBuffer())
+ val := FormatSlogValue(attr.Value, tmp[:0])
+
+ padding := h.fieldPadding[attr.Key]
+
+ length := utf8.RuneCount(val)
+ if padding < length && length <= termCtxMaxPadding {
+ padding = length
+ h.fieldPadding[attr.Key] = padding
+ }
+ buf.Write(val)
+ if !last && padding > length {
+ buf.Write(spaces[:padding-length])
}
}
+ var n = 0
+ var nAttrs = len(h.attrs) + r.NumAttrs()
+ for _, attr := range h.attrs {
+ writeAttr(attr, n == 0, n == nAttrs-1)
+ n++
+ }
+ r.Attrs(func(attr slog.Attr) bool {
+ writeAttr(attr, n == 0, n == nAttrs-1)
+ n++
+ return true
+ })
buf.WriteByte('\n')
}
-// formatValue formats a value for serialization
-func FormatLogfmtValue(value interface{}, term bool) (result string) {
- if value == nil {
- return ""
- }
+// FormatSlogValue formats a slog.Value for serialization to terminal.
+func FormatSlogValue(v slog.Value, tmp []byte) (result []byte) {
+ var value any
defer func() {
if err := recover(); err != nil {
if v := reflect.ValueOf(value); v.Kind() == reflect.Ptr && v.IsNil() {
- result = ""
+ result = []byte("")
} else {
panic(err)
}
}
}()
- switch v := value.(type) {
- case time.Time:
+ switch v.Kind() {
+ case slog.KindString:
+ return appendEscapeString(tmp, v.String())
+ case slog.KindInt64: // All int-types (int8, int16 etc) wind up here
+ return appendInt64(tmp, v.Int64())
+ case slog.KindUint64: // All uint-types (uint8, uint16 etc) wind up here
+ return appendUint64(tmp, v.Uint64(), false)
+ case slog.KindFloat64:
+ return strconv.AppendFloat(tmp, v.Float64(), floatFormat, 3, 64)
+ case slog.KindBool:
+ return strconv.AppendBool(tmp, v.Bool())
+ case slog.KindDuration:
+ value = v.Duration()
+ case slog.KindTime:
// Performance optimization: No need for escaping since the provided
// timeFormat doesn't have any escape characters, and escaping is
// expensive.
- return v.Format(timeFormat)
-
- case *big.Int:
- // Big ints get consumed by the Stringer clause, so we need to handle
- // them earlier on.
- if v == nil {
- return ""
- }
- return formatLogfmtBigInt(v)
-
- case *uint256.Int:
- // Uint256s get consumed by the Stringer clause, so we need to handle
- // them earlier on.
- if v == nil {
- return ""
- }
- return formatLogfmtUint256(v)
+ return v.Time().AppendFormat(tmp, timeFormat)
+ default:
+ value = v.Any()
}
- if term {
- if s, ok := value.(TerminalStringer); ok {
- // Custom terminal stringer provided, use that
- return escapeString(s.TerminalString())
- }
+ if value == nil {
+ return []byte("")
}
switch v := value.(type) {
+ case *big.Int: // Need to be before fmt.Stringer-clause
+ return appendBigInt(tmp, v)
+ case *uint256.Int: // Need to be before fmt.Stringer-clause
+ return appendU256(tmp, v)
case error:
- return escapeString(v.Error())
+ return appendEscapeString(tmp, v.Error())
+ case TerminalStringer:
+ return appendEscapeString(tmp, v.TerminalString())
case fmt.Stringer:
- return escapeString(v.String())
- case bool:
- return strconv.FormatBool(v)
- case float32:
- return strconv.FormatFloat(float64(v), floatFormat, 3, 64)
- case float64:
- return strconv.FormatFloat(v, floatFormat, 3, 64)
- case int8:
- return strconv.FormatInt(int64(v), 10)
- case uint8:
- return strconv.FormatInt(int64(v), 10)
- case int16:
- return strconv.FormatInt(int64(v), 10)
- case uint16:
- return strconv.FormatInt(int64(v), 10)
- // Larger integers get thousands separators.
- case int:
- return FormatLogfmtInt64(int64(v))
- case int32:
- return FormatLogfmtInt64(int64(v))
- case int64:
- return FormatLogfmtInt64(v)
- case uint:
- return FormatLogfmtUint64(uint64(v))
- case uint32:
- return FormatLogfmtUint64(uint64(v))
- case uint64:
- return FormatLogfmtUint64(v)
- case string:
- return escapeString(v)
- default:
- return escapeString(fmt.Sprintf("%+v", value))
+ return appendEscapeString(tmp, v.String())
}
+
+ // We can use the 'tmp' as a scratch-buffer, to first format the
+ // value, and in a second step do escaping.
+ internal := fmt.Appendf(tmp, "%+v", value)
+ return appendEscapeString(tmp, string(internal))
}
-// FormatLogfmtInt64 formats n with thousand separators.
-func FormatLogfmtInt64(n int64) string {
+// appendInt64 formats n with thousand separators and writes into buffer dst.
+func appendInt64(dst []byte, n int64) []byte {
if n < 0 {
- return formatLogfmtUint64(uint64(-n), true)
+ return appendUint64(dst, uint64(-n), true)
}
- return formatLogfmtUint64(uint64(n), false)
+ return appendUint64(dst, uint64(n), false)
}
-// FormatLogfmtUint64 formats n with thousand separators.
-func FormatLogfmtUint64(n uint64) string {
- return formatLogfmtUint64(n, false)
-}
-
-func formatLogfmtUint64(n uint64, neg bool) string {
+// appendUint64 formats n with thousand separators and writes into buffer dst.
+func appendUint64(dst []byte, n uint64, neg bool) []byte {
// Small numbers are fine as is
if n < 100000 {
if neg {
- return strconv.Itoa(-int(n))
+ return strconv.AppendInt(dst, -int64(n), 10)
} else {
- return strconv.Itoa(int(n))
+ return strconv.AppendInt(dst, int64(n), 10)
}
}
// Large numbers should be split
@@ -250,16 +220,21 @@ func formatLogfmtUint64(n uint64, neg bool) string {
out[i] = '-'
i--
}
- return string(out[i+1:])
+ return append(dst, out[i+1:]...)
}
-// formatLogfmtBigInt formats n with thousand separators.
-func formatLogfmtBigInt(n *big.Int) string {
+// FormatLogfmtUint64 formats n with thousand separators.
+func FormatLogfmtUint64(n uint64) string {
+ return string(appendUint64(nil, n, false))
+}
+
+// appendBigInt formats n with thousand separators and writes to dst.
+func appendBigInt(dst []byte, n *big.Int) []byte {
if n.IsUint64() {
- return FormatLogfmtUint64(n.Uint64())
+ return appendUint64(dst, n.Uint64(), false)
}
if n.IsInt64() {
- return FormatLogfmtInt64(n.Int64())
+ return appendInt64(dst, n.Int64())
}
var (
@@ -284,54 +259,48 @@ func formatLogfmtBigInt(n *big.Int) string {
comma++
}
}
- return string(buf[i+1:])
+ return append(dst, buf[i+1:]...)
}
-// formatLogfmtUint256 formats n with thousand separators.
-func formatLogfmtUint256(n *uint256.Int) string {
+// appendU256 formats n with thousand separators.
+func appendU256(dst []byte, n *uint256.Int) []byte {
if n.IsUint64() {
- return FormatLogfmtUint64(n.Uint64())
+ return appendUint64(dst, n.Uint64(), false)
}
- var (
- text = n.Dec()
- buf = make([]byte, len(text)+len(text)/3)
- comma = 0
- i = len(buf) - 1
- )
- for j := len(text) - 1; j >= 0; j, i = j-1, i-1 {
- c := text[j]
-
- switch {
- case c == '-':
- buf[i] = c
- case comma == 3:
- buf[i] = ','
- i--
- comma = 0
- fallthrough
- default:
- buf[i] = c
- comma++
- }
- }
- return string(buf[i+1:])
+ res := []byte(n.PrettyDec(','))
+ return append(dst, res...)
}
-// escapeString checks if the provided string needs escaping/quoting, and
-// calls strconv.Quote if needed
-func escapeString(s string) string {
+// appendEscapeString writes the string s to the given writer, with
+// escaping/quoting if needed.
+func appendEscapeString(dst []byte, s string) []byte {
needsQuoting := false
+ needsEscaping := false
for _, r := range s {
- // We quote everything below " (0x22) and above~ (0x7E), plus equal-sign
- if r <= '"' || r > '~' || r == '=' {
+ // If it contains spaces or equal-sign, we need to quote it.
+ if r == ' ' || r == '=' {
needsQuoting = true
+ continue
+ }
+ // We need to escape it, if it contains
+ // - character " (0x22) and lower (except space)
+ // - characters above ~ (0x7E), plus equal-sign
+ if r <= '"' || r > '~' {
+ needsEscaping = true
break
}
}
- if !needsQuoting {
- return s
+ if needsEscaping {
+ return strconv.AppendQuote(dst, s)
}
- return strconv.Quote(s)
+ // No escaping needed, but we might have to place within quote-marks, in case
+ // it contained a space
+ if needsQuoting {
+ dst = append(dst, '"')
+ dst = append(dst, []byte(s)...)
+ return append(dst, '"')
+ }
+ return append(dst, []byte(s)...)
}
// escapeMessage checks if the provided string needs escaping/quoting, similarly
@@ -356,3 +325,45 @@ func escapeMessage(s string) string {
}
return strconv.Quote(s)
}
+
+// writeTimeTermFormat writes on the format "01-02|15:04:05.000"
+func writeTimeTermFormat(buf *bytes.Buffer, t time.Time) {
+ _, month, day := t.Date()
+ writePosIntWidth(buf, int(month), 2)
+ buf.WriteByte('-')
+ writePosIntWidth(buf, day, 2)
+ buf.WriteByte('|')
+ hour, min, sec := t.Clock()
+ writePosIntWidth(buf, hour, 2)
+ buf.WriteByte(':')
+ writePosIntWidth(buf, min, 2)
+ buf.WriteByte(':')
+ writePosIntWidth(buf, sec, 2)
+ ns := t.Nanosecond()
+ buf.WriteByte('.')
+ writePosIntWidth(buf, ns/1e6, 3)
+}
+
+// writePosIntWidth writes non-negative integer i to the buffer, padded on the left
+// by zeroes to the given width. Use a width of 0 to omit padding.
+// Adapted from golang.org/x/exp/slog/internal/buffer/buffer.go
+func writePosIntWidth(b *bytes.Buffer, i, width int) {
+ // Cheap integer to fixed-width decimal ASCII.
+ // Copied from log/log.go.
+ if i < 0 {
+ panic("negative int")
+ }
+ // Assemble decimal in reverse order.
+ var bb [20]byte
+ bp := len(bb) - 1
+ for i >= 10 || width > 1 {
+ width--
+ q := i / 10
+ bb[bp] = byte('0' + i - q*10)
+ bp--
+ i = q
+ }
+ // i < 10
+ bb[bp] = byte('0' + i)
+ b.Write(bb[bp:])
+}
diff --git a/log/format_test.go b/log/format_test.go
index 41e1809c38..d4c1df4abc 100644
--- a/log/format_test.go
+++ b/log/format_test.go
@@ -5,18 +5,20 @@ import (
"testing"
)
-var sink string
+var sink []byte
func BenchmarkPrettyInt64Logfmt(b *testing.B) {
+ buf := make([]byte, 100)
b.ReportAllocs()
for i := 0; i < b.N; i++ {
- sink = FormatLogfmtInt64(rand.Int63())
+ sink = appendInt64(buf, rand.Int63())
}
}
func BenchmarkPrettyUint64Logfmt(b *testing.B) {
+ buf := make([]byte, 100)
b.ReportAllocs()
for i := 0; i < b.N; i++ {
- sink = FormatLogfmtUint64(rand.Uint64())
+ sink = appendUint64(buf, rand.Uint64(), false)
}
}
diff --git a/log/handler.go b/log/handler.go
index ef1bcc1992..7459aad891 100644
--- a/log/handler.go
+++ b/log/handler.go
@@ -13,42 +13,6 @@ import (
"golang.org/x/exp/slog"
)
-// Lazy allows you to defer calculation of a logged value that is expensive
-// to compute until it is certain that it must be evaluated with the given filters.
-//
-// You may wrap any function which takes no arguments to Lazy. It may return any
-// number of values of any type.
-type Lazy struct {
- Fn interface{}
-}
-
-func evaluateLazy(lz Lazy) (interface{}, error) {
- t := reflect.TypeOf(lz.Fn)
-
- if t.Kind() != reflect.Func {
- return nil, fmt.Errorf("INVALID_LAZY, not func: %+v", lz.Fn)
- }
-
- if t.NumIn() > 0 {
- return nil, fmt.Errorf("INVALID_LAZY, func takes args: %+v", lz.Fn)
- }
-
- if t.NumOut() == 0 {
- return nil, fmt.Errorf("INVALID_LAZY, no func return val: %+v", lz.Fn)
- }
-
- value := reflect.ValueOf(lz.Fn)
- results := value.Call([]reflect.Value{})
- if len(results) == 1 {
- return results[0].Interface(), nil
- }
- values := make([]interface{}, len(results))
- for i, v := range results {
- values[i] = v.Interface()
- }
- return values, nil
-}
-
type discardHandler struct{}
// DiscardHandler returns a no-op handler
@@ -81,6 +45,8 @@ type TerminalHandler struct {
// fieldPadding is a map with maximum field value lengths seen until now
// to allow padding log contexts in a bit smarter way.
fieldPadding map[string]int
+
+ buf []byte
}
// NewTerminalHandler returns a handler which formats log records at all levels optimized for human readability on
@@ -110,7 +76,9 @@ func NewTerminalHandlerWithLevel(wr io.Writer, lvl slog.Level, useColor bool) *T
func (h *TerminalHandler) Handle(_ context.Context, r slog.Record) error {
h.mu.Lock()
defer h.mu.Unlock()
- h.wr.Write(h.TerminalFormat(r, h.useColor))
+ buf := h.format(h.buf, r, h.useColor)
+ h.wr.Write(buf)
+ h.buf = buf[:0]
return nil
}
@@ -145,6 +113,7 @@ func (l *leveler) Level() slog.Level {
return l.minLevel
}
+// JSONHandler returns a handler which prints records in JSON format.
func JSONHandler(wr io.Writer) slog.Handler {
return slog.NewJSONHandler(wr, &slog.HandlerOptions{
ReplaceAttr: builtinReplaceJSON,
diff --git a/log/logger.go b/log/logger.go
index 3e227745ad..75e3643044 100644
--- a/log/logger.go
+++ b/log/logger.go
@@ -83,7 +83,7 @@ func LevelAlignedString(l slog.Level) string {
}
}
-// LevelString returns a 5-character string containing the name of a Lvl.
+// LevelString returns a string containing the name of a Lvl.
func LevelString(l slog.Level) string {
switch l {
case LevelTrace:
@@ -95,7 +95,7 @@ func LevelString(l slog.Level) string {
case slog.LevelWarn:
return "warn"
case slog.LevelError:
- return "eror"
+ return "error"
case LevelCrit:
return "crit"
default:
@@ -134,6 +134,9 @@ type Logger interface {
// Write logs a message at the specified level
Write(level slog.Level, msg string, attrs ...any)
+
+ // Enabled reports whether l emits log records at the given context and level.
+ Enabled(ctx context.Context, level slog.Level) bool
}
type logger struct {
@@ -159,26 +162,6 @@ func (l *logger) Write(level slog.Level, msg string, attrs ...any) {
if len(attrs)%2 != 0 {
attrs = append(attrs, nil, errorKey, "Normalized odd number of arguments by adding nil")
}
-
- // evaluate lazy values
- var hadErr bool
- for i := 1; i < len(attrs); i += 2 {
- lz, ok := attrs[i].(Lazy)
- if ok {
- v, err := evaluateLazy(lz)
- if err != nil {
- hadErr = true
- attrs[i] = err
- } else {
- attrs[i] = v
- }
- }
- }
-
- if hadErr {
- attrs = append(attrs, errorKey, "bad lazy")
- }
-
r := slog.NewRecord(time.Now(), level, msg, pcs[0])
r.Add(attrs...)
l.inner.Handler().Handle(context.Background(), r)
@@ -196,6 +179,11 @@ func (l *logger) New(ctx ...interface{}) Logger {
return l.With(ctx...)
}
+// Enabled reports whether l emits log records at the given context and level.
+func (l *logger) Enabled(ctx context.Context, level slog.Level) bool {
+ return l.inner.Enabled(ctx, level)
+}
+
func (l *logger) Trace(msg string, ctx ...interface{}) {
l.Write(LevelTrace, msg, ctx...)
}
diff --git a/log/logger_test.go b/log/logger_test.go
index fca1f1680f..a633f5ad7a 100644
--- a/log/logger_test.go
+++ b/log/logger_test.go
@@ -2,10 +2,15 @@ package log
import (
"bytes"
+ "fmt"
+ "io"
+ "math/big"
"os"
"strings"
"testing"
+ "time"
+ "github.com/holiman/uint256"
"golang.org/x/exp/slog"
)
@@ -51,3 +56,117 @@ func BenchmarkTraceLogging(b *testing.B) {
Trace("a message", "v", i)
}
}
+
+func BenchmarkTerminalHandler(b *testing.B) {
+ l := NewLogger(NewTerminalHandler(io.Discard, false))
+ benchmarkLogger(b, l)
+}
+func BenchmarkLogfmtHandler(b *testing.B) {
+ l := NewLogger(LogfmtHandler(io.Discard))
+ benchmarkLogger(b, l)
+}
+
+func BenchmarkJSONHandler(b *testing.B) {
+ l := NewLogger(JSONHandler(io.Discard))
+ benchmarkLogger(b, l)
+}
+
+func benchmarkLogger(b *testing.B, l Logger) {
+ var (
+ bb = make([]byte, 10)
+ tt = time.Now()
+ bigint = big.NewInt(100)
+ nilbig *big.Int
+ err = fmt.Errorf("Oh nooes it's crap")
+ )
+ b.ReportAllocs()
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ l.Info("This is a message",
+ "foo", int16(i),
+ "bytes", bb,
+ "bonk", "a string with text",
+ "time", tt,
+ "bigint", bigint,
+ "nilbig", nilbig,
+ "err", err)
+ }
+ b.StopTimer()
+}
+
+func TestLoggerOutput(t *testing.T) {
+ type custom struct {
+ A string
+ B int8
+ }
+ var (
+ customA = custom{"Foo", 12}
+ customB = custom{"Foo\nLinebreak", 122}
+ bb = make([]byte, 10)
+ tt = time.Time{}
+ bigint = big.NewInt(100)
+ nilbig *big.Int
+ err = fmt.Errorf("Oh nooes it's crap")
+ smallUint = uint256.NewInt(500_000)
+ bigUint = &uint256.Int{0xff, 0xff, 0xff, 0xff}
+ )
+
+ out := new(bytes.Buffer)
+ glogHandler := NewGlogHandler(NewTerminalHandler(out, false))
+ glogHandler.Verbosity(LevelInfo)
+ NewLogger(glogHandler).Info("This is a message",
+ "foo", int16(123),
+ "bytes", bb,
+ "bonk", "a string with text",
+ "time", tt,
+ "bigint", bigint,
+ "nilbig", nilbig,
+ "err", err,
+ "struct", customA,
+ "struct", customB,
+ "ptrstruct", &customA,
+ "smalluint", smallUint,
+ "bigUint", bigUint)
+
+ have := out.String()
+ t.Logf("output %v", out.String())
+ want := `INFO [11-07|19:14:33.821] This is a message foo=123 bytes="[0 0 0 0 0 0 0 0 0 0]" bonk="a string with text" time=0001-01-01T00:00:00+0000 bigint=100 nilbig= err="Oh nooes it's crap" struct="{A:Foo B:12}" struct="{A:Foo\nLinebreak B:122}" ptrstruct="&{A:Foo B:12}" smalluint=500,000 bigUint=1,600,660,942,523,603,594,864,898,306,482,794,244,293,965,082,972,225,630,372,095
+`
+ if !bytes.Equal([]byte(have)[25:], []byte(want)[25:]) {
+ t.Errorf("Error\nhave: %q\nwant: %q", have, want)
+ }
+}
+
+const termTimeFormat = "01-02|15:04:05.000"
+
+func BenchmarkAppendFormat(b *testing.B) {
+ var now = time.Now()
+ b.Run("fmt time.Format", func(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ fmt.Fprintf(io.Discard, "%s", now.Format(termTimeFormat))
+ }
+ })
+ b.Run("time.AppendFormat", func(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ now.AppendFormat(nil, termTimeFormat)
+ }
+ })
+ var buf = new(bytes.Buffer)
+ b.Run("time.Custom", func(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ writeTimeTermFormat(buf, now)
+ buf.Reset()
+ }
+ })
+}
+
+func TestTermTimeFormat(t *testing.T) {
+ var now = time.Now()
+ want := now.AppendFormat(nil, termTimeFormat)
+ var b = new(bytes.Buffer)
+ writeTimeTermFormat(b, now)
+ have := b.Bytes()
+ if !bytes.Equal(have, want) {
+ t.Errorf("have != want\nhave: %q\nwant: %q\n", have, want)
+ }
+}
diff --git a/log/root.go b/log/root.go
index 71040fff47..8662d87063 100644
--- a/log/root.go
+++ b/log/root.go
@@ -10,8 +10,7 @@ import (
var root atomic.Value
func init() {
- defaultLogger := &logger{slog.New(DiscardHandler())}
- SetDefault(defaultLogger)
+ root.Store(&logger{slog.New(DiscardHandler())})
}
// SetDefault sets the default global logger
diff --git a/metrics/timer.go b/metrics/timer.go
index 576ad8aa3e..bb8def82fb 100644
--- a/metrics/timer.go
+++ b/metrics/timer.go
@@ -106,20 +106,18 @@ func (t *StandardTimer) Time(f func()) {
t.Update(time.Since(ts))
}
-// Record the duration of an event.
+// Record the duration of an event, in nanoseconds.
func (t *StandardTimer) Update(d time.Duration) {
t.mutex.Lock()
defer t.mutex.Unlock()
- t.histogram.Update(int64(d))
+ t.histogram.Update(d.Nanoseconds())
t.meter.Mark(1)
}
// Record the duration of an event that started at a time and ends now.
+// The record uses nanoseconds.
func (t *StandardTimer) UpdateSince(ts time.Time) {
- t.mutex.Lock()
- defer t.mutex.Unlock()
- t.histogram.Update(int64(time.Since(ts)))
- t.meter.Mark(1)
+ t.Update(time.Since(ts))
}
// timerSnapshot is a read-only copy of another Timer.
diff --git a/miner/worker.go b/miner/worker.go
index f680702814..2ed91cc187 100644
--- a/miner/worker.go
+++ b/miner/worker.go
@@ -1074,7 +1074,7 @@ func (w *worker) commitWork(interrupt *atomic.Int32, timestamp int64) {
case err == nil:
// The entire block is filled, decrease resubmit interval in case
// of current interval is larger than the user-specified one.
- w.resubmitAdjustCh <- &intervalAdjust{inc: false}
+ w.adjustResubmitInterval(&intervalAdjust{inc: false})
case errors.Is(err, errBlockInterruptedByRecommit):
// Notify resubmit loop to increase resubmitting interval if the
@@ -1084,10 +1084,10 @@ func (w *worker) commitWork(interrupt *atomic.Int32, timestamp int64) {
if ratio < 0.1 {
ratio = 0.1
}
- w.resubmitAdjustCh <- &intervalAdjust{
+ w.adjustResubmitInterval(&intervalAdjust{
ratio: ratio,
inc: true,
- }
+ })
case errors.Is(err, errBlockInterruptedByNewHead):
// If the block building is interrupted by newhead event, discard it
@@ -1169,6 +1169,15 @@ func (w *worker) isTTDReached(header *types.Header) bool {
return td != nil && ttd != nil && td.Cmp(ttd) >= 0
}
+// adjustResubmitInterval adjusts the resubmit interval.
+func (w *worker) adjustResubmitInterval(message *intervalAdjust) {
+ select {
+ case w.resubmitAdjustCh <- message:
+ default:
+ log.Warn("the resubmitAdjustCh is full, discard the message")
+ }
+}
+
// copyReceipts makes a deep copy of the given receipts.
func copyReceipts(receipts []*types.Receipt) []*types.Receipt {
result := make([]*types.Receipt, len(receipts))
diff --git a/p2p/discover/table.go b/p2p/discover/table.go
index f476d2079f..2b7a28708b 100644
--- a/p2p/discover/table.go
+++ b/p2p/discover/table.go
@@ -23,6 +23,7 @@
package discover
import (
+ "context"
crand "crypto/rand"
"encoding/binary"
"fmt"
@@ -330,8 +331,10 @@ func (tab *Table) loadSeedNodes() {
seeds = append(seeds, tab.nursery...)
for i := range seeds {
seed := seeds[i]
- age := log.Lazy{Fn: func() interface{} { return time.Since(tab.db.LastPongReceived(seed.ID(), seed.IP())) }}
- tab.log.Trace("Found seed node in database", "id", seed.ID(), "addr", seed.addr(), "age", age)
+ if tab.log.Enabled(context.Background(), log.LevelTrace) {
+ age := time.Since(tab.db.LastPongReceived(seed.ID(), seed.IP()))
+ tab.log.Trace("Found seed node in database", "id", seed.ID(), "addr", seed.addr(), "age", age)
+ }
tab.addSeenNode(seed)
}
}
@@ -456,6 +459,26 @@ func (tab *Table) findnodeByID(target enode.ID, nresults int, preferLive bool) *
return nodes
}
+// appendLiveNodes adds nodes at the given distance to the result slice.
+func (tab *Table) appendLiveNodes(dist uint, result []*enode.Node) []*enode.Node {
+ if dist > 256 {
+ return result
+ }
+ if dist == 0 {
+ return append(result, tab.self())
+ }
+
+ tab.mutex.Lock()
+ defer tab.mutex.Unlock()
+ for _, n := range tab.bucketAtDistance(int(dist)).entries {
+ if n.livenessChecks >= 1 {
+ node := n.Node // avoid handing out pointer to struct field
+ result = append(result, &node)
+ }
+ }
+ return result
+}
+
// len returns the number of nodes in the table.
func (tab *Table) len() (n int) {
tab.mutex.Lock()
diff --git a/p2p/discover/table_test.go b/p2p/discover/table_test.go
index 2781dd4225..3ba3422251 100644
--- a/p2p/discover/table_test.go
+++ b/p2p/discover/table_test.go
@@ -199,7 +199,7 @@ func TestTable_findnodeByID(t *testing.T) {
tab, db := newTestTable(transport)
defer db.Close()
defer tab.close()
- fillTable(tab, test.All)
+ fillTable(tab, test.All, true)
// check that closest(Target, N) returns nodes
result := tab.findnodeByID(test.Target, test.N, false).entries
diff --git a/p2p/discover/table_util_test.go b/p2p/discover/table_util_test.go
index 8f3813bdcf..d6309dfd6c 100644
--- a/p2p/discover/table_util_test.go
+++ b/p2p/discover/table_util_test.go
@@ -109,8 +109,11 @@ func fillBucket(tab *Table, n *node) (last *node) {
// fillTable adds nodes the table to the end of their corresponding bucket
// if the bucket is not full. The caller must not hold tab.mutex.
-func fillTable(tab *Table, nodes []*node) {
+func fillTable(tab *Table, nodes []*node, setLive bool) {
for _, n := range nodes {
+ if setLive {
+ n.livenessChecks = 1
+ }
tab.addSeenNode(n)
}
}
diff --git a/p2p/discover/v4_lookup_test.go b/p2p/discover/v4_lookup_test.go
index 1f9ad69d0a..8867a5a8ac 100644
--- a/p2p/discover/v4_lookup_test.go
+++ b/p2p/discover/v4_lookup_test.go
@@ -40,7 +40,7 @@ func TestUDPv4_Lookup(t *testing.T) {
}
// Seed table with initial node.
- fillTable(test.table, []*node{wrapNode(lookupTestnet.node(256, 0))})
+ fillTable(test.table, []*node{wrapNode(lookupTestnet.node(256, 0))}, true)
// Start the lookup.
resultC := make(chan []*enode.Node, 1)
@@ -74,7 +74,7 @@ func TestUDPv4_LookupIterator(t *testing.T) {
for i := range lookupTestnet.dists[256] {
bootnodes[i] = wrapNode(lookupTestnet.node(256, i))
}
- fillTable(test.table, bootnodes)
+ fillTable(test.table, bootnodes, true)
go serveTestnet(test, lookupTestnet)
// Create the iterator and collect the nodes it yields.
@@ -109,7 +109,7 @@ func TestUDPv4_LookupIteratorClose(t *testing.T) {
for i := range lookupTestnet.dists[256] {
bootnodes[i] = wrapNode(lookupTestnet.node(256, i))
}
- fillTable(test.table, bootnodes)
+ fillTable(test.table, bootnodes, true)
go serveTestnet(test, lookupTestnet)
it := test.udp.RandomNodes()
diff --git a/p2p/discover/v4_udp_test.go b/p2p/discover/v4_udp_test.go
index 53ecb1bc6e..361e379626 100644
--- a/p2p/discover/v4_udp_test.go
+++ b/p2p/discover/v4_udp_test.go
@@ -269,7 +269,7 @@ func TestUDPv4_findnode(t *testing.T) {
}
nodes.push(n, numCandidates)
}
- fillTable(test.table, nodes.entries)
+ fillTable(test.table, nodes.entries, false)
// ensure there's a bond with the test node,
// findnode won't be accepted otherwise.
diff --git a/p2p/discover/v5_udp.go b/p2p/discover/v5_udp.go
index 6ba7a90618..8b3e33d37c 100644
--- a/p2p/discover/v5_udp.go
+++ b/p2p/discover/v5_udp.go
@@ -851,6 +851,7 @@ func (t *UDPv5) handleFindnode(p *v5wire.Findnode, fromID enode.ID, fromAddr *ne
// collectTableNodes creates a FINDNODE result set for the given distances.
func (t *UDPv5) collectTableNodes(rip net.IP, distances []uint, limit int) []*enode.Node {
+ var bn []*enode.Node
var nodes []*enode.Node
var processed = make(map[uint]struct{})
for _, dist := range distances {
@@ -859,21 +860,11 @@ func (t *UDPv5) collectTableNodes(rip net.IP, distances []uint, limit int) []*en
if seen || dist > 256 {
continue
}
-
- // Get the nodes.
- var bn []*enode.Node
- if dist == 0 {
- bn = []*enode.Node{t.Self()}
- } else if dist <= 256 {
- t.tab.mutex.Lock()
- bn = unwrapNodes(t.tab.bucketAtDistance(int(dist)).entries)
- t.tab.mutex.Unlock()
- }
processed[dist] = struct{}{}
- // Apply some pre-checks to avoid sending invalid nodes.
- for _, n := range bn {
- // TODO livenessChecks > 1
+ for _, n := range t.tab.appendLiveNodes(dist, bn[:0]) {
+ // Apply some pre-checks to avoid sending invalid nodes.
+ // Note liveness is checked by appendLiveNodes.
if netutil.CheckRelayIP(rip, n.IP()) != nil {
continue
}
diff --git a/p2p/discover/v5_udp_test.go b/p2p/discover/v5_udp_test.go
index 18d8aeac6d..eaa969ea8b 100644
--- a/p2p/discover/v5_udp_test.go
+++ b/p2p/discover/v5_udp_test.go
@@ -159,9 +159,9 @@ func TestUDPv5_findnodeHandling(t *testing.T) {
nodes253 := nodesAtDistance(test.table.self().ID(), 253, 16)
nodes249 := nodesAtDistance(test.table.self().ID(), 249, 4)
nodes248 := nodesAtDistance(test.table.self().ID(), 248, 10)
- fillTable(test.table, wrapNodes(nodes253))
- fillTable(test.table, wrapNodes(nodes249))
- fillTable(test.table, wrapNodes(nodes248))
+ fillTable(test.table, wrapNodes(nodes253), true)
+ fillTable(test.table, wrapNodes(nodes249), true)
+ fillTable(test.table, wrapNodes(nodes248), true)
// Requesting with distance zero should return the node's own record.
test.packetIn(&v5wire.Findnode{ReqID: []byte{0}, Distances: []uint{0}})
@@ -589,7 +589,7 @@ func TestUDPv5_lookup(t *testing.T) {
// Seed table with initial node.
initialNode := lookupTestnet.node(256, 0)
- fillTable(test.table, []*node{wrapNode(initialNode)})
+ fillTable(test.table, []*node{wrapNode(initialNode)}, true)
// Start the lookup.
resultC := make(chan []*enode.Node, 1)
diff --git a/p2p/dnsdisc/tree.go b/p2p/dnsdisc/tree.go
index 06b7681f18..7d9703a345 100644
--- a/p2p/dnsdisc/tree.go
+++ b/p2p/dnsdisc/tree.go
@@ -344,11 +344,11 @@ func parseLink(e string) (*linkEntry, error) {
return nil, fmt.Errorf("wrong/missing scheme 'enrtree' in URL")
}
e = e[len(linkPrefix):]
- pos := strings.IndexByte(e, '@')
- if pos == -1 {
+
+ keystring, domain, found := strings.Cut(e, "@")
+ if !found {
return nil, entryError{"link", errNoPubkey}
}
- keystring, domain := e[:pos], e[pos+1:]
keybytes, err := b32format.DecodeString(keystring)
if err != nil {
return nil, entryError{"link", errBadPubkey}
diff --git a/p2p/msgrate/msgrate.go b/p2p/msgrate/msgrate.go
index 4f08792242..de1a3177db 100644
--- a/p2p/msgrate/msgrate.go
+++ b/p2p/msgrate/msgrate.go
@@ -18,6 +18,7 @@
package msgrate
import (
+ "context"
"errors"
"math"
"sort"
@@ -410,7 +411,9 @@ func (t *Trackers) tune() {
t.tuned = time.Now()
t.log.Debug("Recalculated msgrate QoS values", "rtt", t.roundtrip, "confidence", t.confidence, "ttl", t.targetTimeout(), "next", t.tuned.Add(t.roundtrip))
- t.log.Trace("Debug dump of mean capacities", "caps", log.Lazy{Fn: t.meanCapacities})
+ if t.log.Enabled(context.Background(), log.LevelTrace) {
+ t.log.Trace("Debug dump of mean capacities", "caps", t.meanCapacities())
+ }
}
// detune reduces the tracker's confidence in order to make fresh measurements
diff --git a/p2p/rlpx/rlpx_test.go b/p2p/rlpx/rlpx_test.go
index 28759f2b49..136cb1b5bf 100644
--- a/p2p/rlpx/rlpx_test.go
+++ b/p2p/rlpx/rlpx_test.go
@@ -421,7 +421,7 @@ func BenchmarkThroughput(b *testing.B) {
}
conn2.SetSnappy(true)
if err := <-handshakeDone; err != nil {
- b.Fatal("server hanshake error:", err)
+ b.Fatal("server handshake error:", err)
}
// Read N messages.
diff --git a/p2p/simulations/network_test.go b/p2p/simulations/network_test.go
index ab8cf19462..4ed1e4e6c3 100644
--- a/p2p/simulations/network_test.go
+++ b/p2p/simulations/network_test.go
@@ -683,7 +683,7 @@ func triggerChecks(ctx context.Context, ids []enode.ID, trigger chan enode.ID, i
}
}
-// \todo: refactor to implement shapshots
+// \todo: refactor to implement snapshots
// and connect configuration methods once these are moved from
// swarm/network/simulations/connect.go
func BenchmarkMinimalService(b *testing.B) {
diff --git a/params/config.go b/params/config.go
index 463041bd01..7e8dfc8124 100644
--- a/params/config.go
+++ b/params/config.go
@@ -127,6 +127,7 @@ var (
TerminalTotalDifficulty: big.NewInt(10_790_000),
TerminalTotalDifficultyPassed: true,
ShanghaiTime: newUint64(1678832736),
+ CancunTime: newUint64(1705473120),
Clique: &CliqueConfig{
Period: 15,
Epoch: 30000,
diff --git a/params/version.go b/params/version.go
index bcab461a43..ba8a0f50d5 100644
--- a/params/version.go
+++ b/params/version.go
@@ -23,7 +23,7 @@ import (
const (
VersionMajor = 1 // Major version component of the current release
VersionMinor = 13 // Minor version component of the current release
- VersionPatch = 5 // Patch version component of the current release
+ VersionPatch = 11 // Patch version component of the current release
VersionMeta = "unstable" // Version metadata to append to the version string
)
diff --git a/rpc/metrics.go b/rpc/metrics.go
index b1f1284535..ef7449ce05 100644
--- a/rpc/metrics.go
+++ b/rpc/metrics.go
@@ -46,5 +46,5 @@ func updateServeTimeHistogram(method string, success bool, elapsed time.Duration
metrics.NewExpDecaySample(1028, 0.015),
)
}
- metrics.GetOrRegisterHistogramLazy(h, nil, sampler).Update(elapsed.Microseconds())
+ metrics.GetOrRegisterHistogramLazy(h, nil, sampler).Update(elapsed.Nanoseconds())
}
diff --git a/signer/core/api.go b/signer/core/api.go
index 43eb89ee00..ef8c136625 100644
--- a/signer/core/api.go
+++ b/signer/core/api.go
@@ -65,7 +65,7 @@ type ExternalAPI interface {
EcRecover(ctx context.Context, data hexutil.Bytes, sig hexutil.Bytes) (common.Address, error)
// Version info about the APIs
Version(ctx context.Context) (string, error)
- // SignGnosisSafeTransaction signs/confirms a gnosis-safe multisig transaction
+ // SignGnosisSafeTx signs/confirms a gnosis-safe multisig transaction
SignGnosisSafeTx(ctx context.Context, signerAddress common.MixedcaseAddress, gnosisTx GnosisSafeTx, methodSelector *string) (*GnosisSafeTx, error)
}
diff --git a/signer/core/apitypes/types.go b/signer/core/apitypes/types.go
index 8218e754d3..6bfcd2a727 100644
--- a/signer/core/apitypes/types.go
+++ b/signer/core/apitypes/types.go
@@ -62,7 +62,7 @@ func (vs *ValidationMessages) Info(msg string) {
vs.Messages = append(vs.Messages, ValidationInfo{INFO, msg})
}
-// getWarnings returns an error with all messages of type WARN of above, or nil if no warnings were present
+// GetWarnings returns an error with all messages of type WARN of above, or nil if no warnings were present
func (v *ValidationMessages) GetWarnings() error {
var messages []string
for _, msg := range v.Messages {
diff --git a/signer/core/uiapi.go b/signer/core/uiapi.go
index 4a060147a6..b8c3acfb4d 100644
--- a/signer/core/uiapi.go
+++ b/signer/core/uiapi.go
@@ -31,7 +31,7 @@ import (
"github.com/ethereum/go-ethereum/crypto"
)
-// SignerUIAPI implements methods Clef provides for a UI to query, in the bidirectional communication
+// UIServerAPI implements methods Clef provides for a UI to query, in the bidirectional communication
// channel.
// This API is considered secure, since a request can only
// ever arrive from the UI -- and the UI is capable of approving any action, thus we can consider these
diff --git a/tests/block_test_util.go b/tests/block_test_util.go
index e0130be48a..ff487255f4 100644
--- a/tests/block_test_util.go
+++ b/tests/block_test_util.go
@@ -36,6 +36,7 @@ import (
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/vm"
+ "github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rlp"
"github.com/ethereum/go-ethereum/trie"
@@ -224,6 +225,7 @@ func (t *BlockTest) insertBlocks(blockchain *core.BlockChain) ([]btBlock, error)
cb, err := b.decode()
if err != nil {
if b.BlockHeader == nil {
+ log.Info("Block decoding failed", "index", bi, "err", err)
continue // OK - block is supposed to be invalid, continue with next block
} else {
return nil, fmt.Errorf("block RLP decoding failed when expected to succeed: %v", err)
diff --git a/tests/fuzzers/bls12381/bls12381_fuzz.go b/tests/fuzzers/bls12381/bls12381_fuzz.go
index f04524f76a..9a5c566540 100644
--- a/tests/fuzzers/bls12381/bls12381_fuzz.go
+++ b/tests/fuzzers/bls12381/bls12381_fuzz.go
@@ -14,6 +14,9 @@
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see .
+//go:build cgo
+// +build cgo
+
package bls
import (
diff --git a/tests/fuzzers/bls12381/bls12381_test.go b/tests/fuzzers/bls12381/bls12381_test.go
index 59e4db31d5..3e88979d16 100644
--- a/tests/fuzzers/bls12381/bls12381_test.go
+++ b/tests/fuzzers/bls12381/bls12381_test.go
@@ -14,6 +14,9 @@
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see .
+//go:build cgo
+// +build cgo
+
package bls
import "testing"
diff --git a/tests/gen_stenv.go b/tests/gen_stenv.go
index 71f0063178..a5bd0d5fcb 100644
--- a/tests/gen_stenv.go
+++ b/tests/gen_stenv.go
@@ -16,13 +16,14 @@ var _ = (*stEnvMarshaling)(nil)
// MarshalJSON marshals as JSON.
func (s stEnv) MarshalJSON() ([]byte, error) {
type stEnv struct {
- Coinbase common.UnprefixedAddress `json:"currentCoinbase" gencodec:"required"`
- Difficulty *math.HexOrDecimal256 `json:"currentDifficulty" gencodec:"optional"`
- Random *math.HexOrDecimal256 `json:"currentRandom" gencodec:"optional"`
- GasLimit math.HexOrDecimal64 `json:"currentGasLimit" gencodec:"required"`
- Number math.HexOrDecimal64 `json:"currentNumber" gencodec:"required"`
- Timestamp math.HexOrDecimal64 `json:"currentTimestamp" gencodec:"required"`
- BaseFee *math.HexOrDecimal256 `json:"currentBaseFee" gencodec:"optional"`
+ Coinbase common.UnprefixedAddress `json:"currentCoinbase" gencodec:"required"`
+ Difficulty *math.HexOrDecimal256 `json:"currentDifficulty" gencodec:"optional"`
+ Random *math.HexOrDecimal256 `json:"currentRandom" gencodec:"optional"`
+ GasLimit math.HexOrDecimal64 `json:"currentGasLimit" gencodec:"required"`
+ Number math.HexOrDecimal64 `json:"currentNumber" gencodec:"required"`
+ Timestamp math.HexOrDecimal64 `json:"currentTimestamp" gencodec:"required"`
+ BaseFee *math.HexOrDecimal256 `json:"currentBaseFee" gencodec:"optional"`
+ ExcessBlobGas *math.HexOrDecimal64 `json:"currentExcessBlobGas" gencodec:"optional"`
}
var enc stEnv
enc.Coinbase = common.UnprefixedAddress(s.Coinbase)
@@ -32,19 +33,21 @@ func (s stEnv) MarshalJSON() ([]byte, error) {
enc.Number = math.HexOrDecimal64(s.Number)
enc.Timestamp = math.HexOrDecimal64(s.Timestamp)
enc.BaseFee = (*math.HexOrDecimal256)(s.BaseFee)
+ enc.ExcessBlobGas = (*math.HexOrDecimal64)(s.ExcessBlobGas)
return json.Marshal(&enc)
}
// UnmarshalJSON unmarshals from JSON.
func (s *stEnv) UnmarshalJSON(input []byte) error {
type stEnv struct {
- Coinbase *common.UnprefixedAddress `json:"currentCoinbase" gencodec:"required"`
- Difficulty *math.HexOrDecimal256 `json:"currentDifficulty" gencodec:"optional"`
- Random *math.HexOrDecimal256 `json:"currentRandom" gencodec:"optional"`
- GasLimit *math.HexOrDecimal64 `json:"currentGasLimit" gencodec:"required"`
- Number *math.HexOrDecimal64 `json:"currentNumber" gencodec:"required"`
- Timestamp *math.HexOrDecimal64 `json:"currentTimestamp" gencodec:"required"`
- BaseFee *math.HexOrDecimal256 `json:"currentBaseFee" gencodec:"optional"`
+ Coinbase *common.UnprefixedAddress `json:"currentCoinbase" gencodec:"required"`
+ Difficulty *math.HexOrDecimal256 `json:"currentDifficulty" gencodec:"optional"`
+ Random *math.HexOrDecimal256 `json:"currentRandom" gencodec:"optional"`
+ GasLimit *math.HexOrDecimal64 `json:"currentGasLimit" gencodec:"required"`
+ Number *math.HexOrDecimal64 `json:"currentNumber" gencodec:"required"`
+ Timestamp *math.HexOrDecimal64 `json:"currentTimestamp" gencodec:"required"`
+ BaseFee *math.HexOrDecimal256 `json:"currentBaseFee" gencodec:"optional"`
+ ExcessBlobGas *math.HexOrDecimal64 `json:"currentExcessBlobGas" gencodec:"optional"`
}
var dec stEnv
if err := json.Unmarshal(input, &dec); err != nil {
@@ -75,5 +78,8 @@ func (s *stEnv) UnmarshalJSON(input []byte) error {
if dec.BaseFee != nil {
s.BaseFee = (*big.Int)(dec.BaseFee)
}
+ if dec.ExcessBlobGas != nil {
+ s.ExcessBlobGas = (*uint64)(dec.ExcessBlobGas)
+ }
return nil
}
diff --git a/tests/state_test.go b/tests/state_test.go
index ae78a53a7e..cc228ea3c6 100644
--- a/tests/state_test.go
+++ b/tests/state_test.go
@@ -62,14 +62,6 @@ func TestState(t *testing.T) {
// EOF is not part of cancun
st.skipLoad(`^stEOF/`)
- // EIP-4844 tests need to be regenerated due to the data-to-blob rename
- st.skipLoad(`^stEIP4844-blobtransactions/`)
-
- // Expected failures:
- // These EIP-4844 tests need to be regenerated.
- st.fails(`stEIP4844-blobtransactions/opcodeBlobhashOutOfRange.json`, "test has incorrect state root")
- st.fails(`stEIP4844-blobtransactions/opcodeBlobhBounds.json`, "test has incorrect state root")
-
// For Istanbul, older tests were moved into LegacyTests
for _, dir := range []string{
filepath.Join(baseDir, "EIPTests", "StateTests"),
diff --git a/tests/state_test_util.go b/tests/state_test_util.go
index 745a3c6b28..919730089a 100644
--- a/tests/state_test_util.go
+++ b/tests/state_test_util.go
@@ -28,6 +28,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/common/math"
+ "github.com/ethereum/go-ethereum/consensus/misc/eip4844"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/rawdb"
"github.com/ethereum/go-ethereum/core/state"
@@ -83,23 +84,25 @@ type stPostState struct {
//go:generate go run github.com/fjl/gencodec -type stEnv -field-override stEnvMarshaling -out gen_stenv.go
type stEnv struct {
- Coinbase common.Address `json:"currentCoinbase" gencodec:"required"`
- Difficulty *big.Int `json:"currentDifficulty" gencodec:"optional"`
- Random *big.Int `json:"currentRandom" gencodec:"optional"`
- GasLimit uint64 `json:"currentGasLimit" gencodec:"required"`
- Number uint64 `json:"currentNumber" gencodec:"required"`
- Timestamp uint64 `json:"currentTimestamp" gencodec:"required"`
- BaseFee *big.Int `json:"currentBaseFee" gencodec:"optional"`
+ Coinbase common.Address `json:"currentCoinbase" gencodec:"required"`
+ Difficulty *big.Int `json:"currentDifficulty" gencodec:"optional"`
+ Random *big.Int `json:"currentRandom" gencodec:"optional"`
+ GasLimit uint64 `json:"currentGasLimit" gencodec:"required"`
+ Number uint64 `json:"currentNumber" gencodec:"required"`
+ Timestamp uint64 `json:"currentTimestamp" gencodec:"required"`
+ BaseFee *big.Int `json:"currentBaseFee" gencodec:"optional"`
+ ExcessBlobGas *uint64 `json:"currentExcessBlobGas" gencodec:"optional"`
}
type stEnvMarshaling struct {
- Coinbase common.UnprefixedAddress
- Difficulty *math.HexOrDecimal256
- Random *math.HexOrDecimal256
- GasLimit math.HexOrDecimal64
- Number math.HexOrDecimal64
- Timestamp math.HexOrDecimal64
- BaseFee *math.HexOrDecimal256
+ Coinbase common.UnprefixedAddress
+ Difficulty *math.HexOrDecimal256
+ Random *math.HexOrDecimal256
+ GasLimit math.HexOrDecimal64
+ Number math.HexOrDecimal64
+ Timestamp math.HexOrDecimal64
+ BaseFee *math.HexOrDecimal256
+ ExcessBlobGas *math.HexOrDecimal64
}
//go:generate go run github.com/fjl/gencodec -type stTransaction -field-override stTransactionMarshaling -out gen_sttransaction.go
@@ -283,8 +286,22 @@ func (t *StateTest) RunNoVerify(subtest StateSubtest, vmconfig vm.Config, snapsh
context.Random = &rnd
context.Difficulty = big.NewInt(0)
}
+ if config.IsCancun(new(big.Int), block.Time()) && t.json.Env.ExcessBlobGas != nil {
+ context.BlobBaseFee = eip4844.CalcBlobFee(*t.json.Env.ExcessBlobGas)
+ }
evm := vm.NewEVM(context, txContext, statedb, config, vmconfig)
+ { // Blob transactions may be present after the Cancun fork.
+ // In production,
+ // - the header is verified against the max in eip4844.go:VerifyEIP4844Header
+ // - the block body is verified against the header in block_validator.go:ValidateBody
+ // Here, we just do this shortcut smaller fix, since state tests do not
+ // utilize those codepaths
+ if len(msg.BlobHashes)*params.BlobTxBlobGasPerBlob > params.MaxBlobGasPerBlock {
+ return nil, nil, nil, common.Hash{}, errors.New("blob gas exceeds maximum")
+ }
+ }
+
// Execute the message.
snapshot := statedb.Snapshot()
gaspool := new(core.GasPool)
diff --git a/tests/testdata b/tests/testdata
index ee3fa4c86d..fa51c5c164 160000
--- a/tests/testdata
+++ b/tests/testdata
@@ -1 +1 @@
-Subproject commit ee3fa4c86d05f99f2717f83a6ad08008490ddf07
+Subproject commit fa51c5c164f79140730ccb8fe26a46c3d3994338
diff --git a/trie/sync.go b/trie/sync.go
index 8eaed9f21a..589d28364b 100644
--- a/trie/sync.go
+++ b/trie/sync.go
@@ -116,10 +116,9 @@ type LeafCallback func(keys [][]byte, path []byte, leaf []byte, parent common.Ha
// nodeRequest represents a scheduled or already in-flight trie node retrieval request.
type nodeRequest struct {
- hash common.Hash // Hash of the trie node to retrieve
- path []byte // Merkle path leading to this node for prioritization
- data []byte // Data content of the node, cached until all subtrees complete
- deletes [][]byte // List of internal path segments for trie nodes to delete
+ hash common.Hash // Hash of the trie node to retrieve
+ path []byte // Merkle path leading to this node for prioritization
+ data []byte // Data content of the node, cached until all subtrees complete
parent *nodeRequest // Parent state node referencing this entry
deps int // Number of dependencies before allowed to commit this node
@@ -146,38 +145,85 @@ type CodeSyncResult struct {
Data []byte // Data content of the retrieved bytecode
}
+// nodeOp represents an operation upon the trie node. It can either represent a
+// deletion to the specific node or a node write for persisting retrieved node.
+type nodeOp struct {
+ owner common.Hash // identifier of the trie (empty for account trie)
+ path []byte // path from the root to the specified node.
+ blob []byte // the content of the node (nil for deletion)
+ hash common.Hash // hash of the node content (empty for node deletion)
+}
+
+// isDelete indicates if the operation is a database deletion.
+func (op *nodeOp) isDelete() bool {
+ return len(op.blob) == 0
+}
+
// syncMemBatch is an in-memory buffer of successfully downloaded but not yet
// persisted data items.
type syncMemBatch struct {
- nodes map[string][]byte // In-memory membatch of recently completed nodes
- hashes map[string]common.Hash // Hashes of recently completed nodes
- deletes map[string]struct{} // List of paths for trie node to delete
- codes map[common.Hash][]byte // In-memory membatch of recently completed codes
- size uint64 // Estimated batch-size of in-memory data.
+ scheme string // State scheme identifier
+ codes map[common.Hash][]byte // In-memory batch of recently completed codes
+ nodes []nodeOp // In-memory batch of recently completed/deleted nodes
+ size uint64 // Estimated batch-size of in-memory data.
}
// newSyncMemBatch allocates a new memory-buffer for not-yet persisted trie nodes.
-func newSyncMemBatch() *syncMemBatch {
+func newSyncMemBatch(scheme string) *syncMemBatch {
return &syncMemBatch{
- nodes: make(map[string][]byte),
- hashes: make(map[string]common.Hash),
- deletes: make(map[string]struct{}),
- codes: make(map[common.Hash][]byte),
+ scheme: scheme,
+ codes: make(map[common.Hash][]byte),
}
}
-// hasNode reports the trie node with specific path is already cached.
-func (batch *syncMemBatch) hasNode(path []byte) bool {
- _, ok := batch.nodes[string(path)]
- return ok
-}
-
// hasCode reports the contract code with specific hash is already cached.
func (batch *syncMemBatch) hasCode(hash common.Hash) bool {
_, ok := batch.codes[hash]
return ok
}
+// addCode caches a contract code database write operation.
+func (batch *syncMemBatch) addCode(hash common.Hash, code []byte) {
+ batch.codes[hash] = code
+ batch.size += common.HashLength + uint64(len(code))
+}
+
+// addNode caches a node database write operation.
+func (batch *syncMemBatch) addNode(owner common.Hash, path []byte, blob []byte, hash common.Hash) {
+ if batch.scheme == rawdb.PathScheme {
+ if owner == (common.Hash{}) {
+ batch.size += uint64(len(path) + len(blob))
+ } else {
+ batch.size += common.HashLength + uint64(len(path)+len(blob))
+ }
+ } else {
+ batch.size += common.HashLength + uint64(len(blob))
+ }
+ batch.nodes = append(batch.nodes, nodeOp{
+ owner: owner,
+ path: path,
+ blob: blob,
+ hash: hash,
+ })
+}
+
+// delNode caches a node database delete operation.
+func (batch *syncMemBatch) delNode(owner common.Hash, path []byte) {
+ if batch.scheme != rawdb.PathScheme {
+ log.Error("Unexpected node deletion", "owner", owner, "path", path, "scheme", batch.scheme)
+ return // deletion is not supported in hash mode.
+ }
+ if owner == (common.Hash{}) {
+ batch.size += uint64(len(path))
+ } else {
+ batch.size += common.HashLength + uint64(len(path))
+ }
+ batch.nodes = append(batch.nodes, nodeOp{
+ owner: owner,
+ path: path,
+ })
+}
+
// Sync is the main state trie synchronisation scheduler, which provides yet
// unknown trie hashes to retrieve, accepts node data associated with said hashes
// and reconstructs the trie step by step until all is done.
@@ -196,7 +242,7 @@ func NewSync(root common.Hash, database ethdb.KeyValueReader, callback LeafCallb
ts := &Sync{
scheme: scheme,
database: database,
- membatch: newSyncMemBatch(),
+ membatch: newSyncMemBatch(scheme),
nodeReqs: make(map[string]*nodeRequest),
codeReqs: make(map[common.Hash]*codeRequest),
queue: prque.New[int64, any](nil), // Ugh, can contain both string and hash, whyyy
@@ -210,16 +256,17 @@ func NewSync(root common.Hash, database ethdb.KeyValueReader, callback LeafCallb
// parent for completion tracking. The given path is a unique node path in
// hex format and contain all the parent path if it's layered trie node.
func (s *Sync) AddSubTrie(root common.Hash, path []byte, parent common.Hash, parentPath []byte, callback LeafCallback) {
- // Short circuit if the trie is empty or already known
if root == types.EmptyRootHash {
return
}
- if s.membatch.hasNode(path) {
- return
- }
owner, inner := ResolvePath(path)
- if rawdb.HasTrieNode(s.database, owner, inner, root, s.scheme) {
+ exist, inconsistent := s.hasNode(owner, inner, root)
+ if exist {
+ // The entire subtrie is already present in the database.
return
+ } else if inconsistent {
+ // There is a pre-existing node with the wrong hash in DB, remove it.
+ s.membatch.delNode(owner, inner)
}
// Assemble the new sub-trie sync request
req := &nodeRequest{
@@ -371,39 +418,42 @@ func (s *Sync) ProcessNode(result NodeSyncResult) error {
}
// Commit flushes the data stored in the internal membatch out to persistent
-// storage, returning any occurred error.
+// storage, returning any occurred error. The whole data set will be flushed
+// in an atomic database batch.
func (s *Sync) Commit(dbw ethdb.Batch) error {
// Flush the pending node writes into database batch.
var (
account int
storage int
)
- for path, value := range s.membatch.nodes {
- owner, inner := ResolvePath([]byte(path))
- if owner == (common.Hash{}) {
- account += 1
+ for _, op := range s.membatch.nodes {
+ if op.isDelete() {
+ // node deletion is only supported in path mode.
+ if op.owner == (common.Hash{}) {
+ rawdb.DeleteAccountTrieNode(dbw, op.path)
+ } else {
+ rawdb.DeleteStorageTrieNode(dbw, op.owner, op.path)
+ }
+ deletionGauge.Inc(1)
} else {
- storage += 1
+ if op.owner == (common.Hash{}) {
+ account += 1
+ } else {
+ storage += 1
+ }
+ rawdb.WriteTrieNode(dbw, op.owner, op.path, op.hash, op.blob, s.scheme)
}
- rawdb.WriteTrieNode(dbw, owner, inner, s.membatch.hashes[path], value, s.scheme)
}
accountNodeSyncedGauge.Inc(int64(account))
storageNodeSyncedGauge.Inc(int64(storage))
- // Flush the pending node deletes into the database batch.
- // Please note that each written and deleted node has a
- // unique path, ensuring no duplication occurs.
- for path := range s.membatch.deletes {
- owner, inner := ResolvePath([]byte(path))
- rawdb.DeleteTrieNode(dbw, owner, inner, common.Hash{} /* unused */, s.scheme)
- }
// Flush the pending code writes into database batch.
for hash, value := range s.membatch.codes {
rawdb.WriteCode(dbw, hash, value)
}
codeSyncedGauge.Inc(int64(len(s.membatch.codes)))
- s.membatch = newSyncMemBatch() // reset the batch
+ s.membatch = newSyncMemBatch(s.scheme) // reset the batch
return nil
}
@@ -476,12 +526,15 @@ func (s *Sync) children(req *nodeRequest, object node) ([]*nodeRequest, error) {
// child as invalid. This is essential in the case of path mode
// scheme; otherwise, state healing might overwrite existing child
// nodes silently while leaving a dangling parent node within the
- // range of this internal path on disk. This would break the
- // guarantee for state healing.
+ // range of this internal path on disk and the persistent state
+ // ends up with a very weird situation that nodes on the same path
+ // are not inconsistent while they all present in disk. This property
+ // would break the guarantee for state healing.
//
// While it's possible for this shortNode to overwrite a previously
// existing full node, the other branches of the fullNode can be
- // retained as they remain untouched and complete.
+ // retained as they are not accessible with the new shortNode, and
+ // also the whole sub-trie is still untouched and complete.
//
// This step is only necessary for path mode, as there is no deletion
// in hash mode at all.
@@ -498,8 +551,7 @@ func (s *Sync) children(req *nodeRequest, object node) ([]*nodeRequest, error) {
exists = rawdb.ExistsStorageTrieNode(s.database, owner, append(inner, key[:i]...))
}
if exists {
- req.deletes = append(req.deletes, key[:i])
- deletionGauge.Inc(1)
+ s.membatch.delNode(owner, append(inner, key[:i]...))
log.Debug("Detected dangling node", "owner", owner, "path", append(inner, key[:i]...))
}
}
@@ -521,6 +573,7 @@ func (s *Sync) children(req *nodeRequest, object node) ([]*nodeRequest, error) {
var (
missing = make(chan *nodeRequest, len(children))
pending sync.WaitGroup
+ batchMu sync.Mutex
)
for _, child := range children {
// Notify any external watcher of a new key/value node
@@ -538,34 +591,32 @@ func (s *Sync) children(req *nodeRequest, object node) ([]*nodeRequest, error) {
}
}
}
- // If the child references another node, resolve or schedule
+ // If the child references another node, resolve or schedule.
+ // We check all children concurrently.
if node, ok := (child.node).(hashNode); ok {
- // Try to resolve the node from the local database
- if s.membatch.hasNode(child.path) {
- continue
- }
- // Check the presence of children concurrently
+ path := child.path
+ hash := common.BytesToHash(node)
pending.Add(1)
- go func(child childNode) {
+ go func() {
defer pending.Done()
-
- // If database says duplicate, then at least the trie node is present
- // and we hold the assumption that it's NOT legacy contract code.
- var (
- chash = common.BytesToHash(node)
- owner, inner = ResolvePath(child.path)
- )
- if rawdb.HasTrieNode(s.database, owner, inner, chash, s.scheme) {
+ owner, inner := ResolvePath(path)
+ exist, inconsistent := s.hasNode(owner, inner, hash)
+ if exist {
return
+ } else if inconsistent {
+ // There is a pre-existing node with the wrong hash in DB, remove it.
+ batchMu.Lock()
+ s.membatch.delNode(owner, inner)
+ batchMu.Unlock()
}
// Locally unknown node, schedule for retrieval
missing <- &nodeRequest{
- path: child.path,
- hash: chash,
+ path: path,
+ hash: hash,
parent: req,
callback: req.callback,
}
- }(child)
+ }()
}
}
pending.Wait()
@@ -587,21 +638,10 @@ func (s *Sync) children(req *nodeRequest, object node) ([]*nodeRequest, error) {
// committed themselves.
func (s *Sync) commitNodeRequest(req *nodeRequest) error {
// Write the node content to the membatch
- s.membatch.nodes[string(req.path)] = req.data
- s.membatch.hashes[string(req.path)] = req.hash
+ owner, path := ResolvePath(req.path)
+ s.membatch.addNode(owner, path, req.data, req.hash)
- // The size tracking refers to the db-batch, not the in-memory data.
- if s.scheme == rawdb.PathScheme {
- s.membatch.size += uint64(len(req.path) + len(req.data))
- } else {
- s.membatch.size += common.HashLength + uint64(len(req.data))
- }
- // Delete the internal nodes which are marked as invalid
- for _, segment := range req.deletes {
- path := append(req.path, segment...)
- s.membatch.deletes[string(path)] = struct{}{}
- s.membatch.size += uint64(len(path))
- }
+ // Removed the completed node request
delete(s.nodeReqs, string(req.path))
s.fetches[len(req.path)]--
@@ -622,8 +662,9 @@ func (s *Sync) commitNodeRequest(req *nodeRequest) error {
// committed themselves.
func (s *Sync) commitCodeRequest(req *codeRequest) error {
// Write the node content to the membatch
- s.membatch.codes[req.hash] = req.data
- s.membatch.size += common.HashLength + uint64(len(req.data))
+ s.membatch.addCode(req.hash, req.data)
+
+ // Removed the completed code request
delete(s.codeReqs, req.hash)
s.fetches[len(req.path)]--
@@ -639,6 +680,28 @@ func (s *Sync) commitCodeRequest(req *codeRequest) error {
return nil
}
+// hasNode reports whether the specified trie node is present in the database.
+// 'exists' is true when the node exists in the database and matches the given root
+// hash. The 'inconsistent' return value is true when the node exists but does not
+// match the expected hash.
+func (s *Sync) hasNode(owner common.Hash, path []byte, hash common.Hash) (exists bool, inconsistent bool) {
+ // If node is running with hash scheme, check the presence with node hash.
+ if s.scheme == rawdb.HashScheme {
+ return rawdb.HasLegacyTrieNode(s.database, hash), false
+ }
+ // If node is running with path scheme, check the presence with node path.
+ var blob []byte
+ var dbHash common.Hash
+ if owner == (common.Hash{}) {
+ blob, dbHash = rawdb.ReadAccountTrieNode(s.database, path)
+ } else {
+ blob, dbHash = rawdb.ReadStorageTrieNode(s.database, owner, path)
+ }
+ exists = hash == dbHash
+ inconsistent = !exists && len(blob) != 0
+ return exists, inconsistent
+}
+
// ResolvePath resolves the provided composite node path by separating the
// path in account trie if it's existent.
func ResolvePath(path []byte) (common.Hash, []byte) {
diff --git a/trie/sync_test.go b/trie/sync_test.go
index 5edfb32a37..585181b48c 100644
--- a/trie/sync_test.go
+++ b/trie/sync_test.go
@@ -684,8 +684,11 @@ func testSyncOrdering(t *testing.T, scheme string) {
}
}
}
-
func syncWith(t *testing.T, root common.Hash, db ethdb.Database, srcDb *Database) {
+ syncWithHookWriter(t, root, db, srcDb, nil)
+}
+
+func syncWithHookWriter(t *testing.T, root common.Hash, db ethdb.Database, srcDb *Database, hookWriter ethdb.KeyValueWriter) {
// Create a destination trie and sync with the scheduler
sched := NewSync(root, db, nil, srcDb.Scheme())
@@ -723,8 +726,11 @@ func syncWith(t *testing.T, root common.Hash, db ethdb.Database, srcDb *Database
if err := sched.Commit(batch); err != nil {
t.Fatalf("failed to commit data: %v", err)
}
- batch.Write()
-
+ if hookWriter != nil {
+ batch.Replay(hookWriter)
+ } else {
+ batch.Write()
+ }
paths, nodes, _ = sched.Missing(0)
elements = elements[:0]
for i := 0; i < len(paths); i++ {
@@ -894,3 +900,116 @@ func testPivotMove(t *testing.T, scheme string, tiny bool) {
syncWith(t, rootC, destDisk, srcTrieDB)
checkTrieContents(t, destDisk, scheme, srcTrie.Hash().Bytes(), stateC, true)
}
+
+func TestSyncAbort(t *testing.T) {
+ testSyncAbort(t, rawdb.PathScheme)
+ testSyncAbort(t, rawdb.HashScheme)
+}
+
+type hookWriter struct {
+ db ethdb.KeyValueStore
+ filter func(key []byte, value []byte) bool
+}
+
+// Put inserts the given value into the key-value data store.
+func (w *hookWriter) Put(key []byte, value []byte) error {
+ if w.filter != nil && w.filter(key, value) {
+ return nil
+ }
+ return w.db.Put(key, value)
+}
+
+// Delete removes the key from the key-value data store.
+func (w *hookWriter) Delete(key []byte) error {
+ return w.db.Delete(key)
+}
+
+func testSyncAbort(t *testing.T, scheme string) {
+ var (
+ srcDisk = rawdb.NewMemoryDatabase()
+ srcTrieDB = newTestDatabase(srcDisk, scheme)
+ srcTrie, _ = New(TrieID(types.EmptyRootHash), srcTrieDB)
+
+ deleteFn = func(key []byte, tr *Trie, states map[string][]byte) {
+ tr.Delete(key)
+ delete(states, string(key))
+ }
+ writeFn = func(key []byte, val []byte, tr *Trie, states map[string][]byte) {
+ if val == nil {
+ val = randBytes(32)
+ }
+ tr.Update(key, val)
+ states[string(key)] = common.CopyBytes(val)
+ }
+ copyStates = func(states map[string][]byte) map[string][]byte {
+ cpy := make(map[string][]byte)
+ for k, v := range states {
+ cpy[k] = v
+ }
+ return cpy
+ }
+ )
+ var (
+ stateA = make(map[string][]byte)
+ key = randBytes(32)
+ val = randBytes(32)
+ )
+ for i := 0; i < 256; i++ {
+ writeFn(randBytes(32), nil, srcTrie, stateA)
+ }
+ writeFn(key, val, srcTrie, stateA)
+
+ rootA, nodesA, _ := srcTrie.Commit(false)
+ if err := srcTrieDB.Update(rootA, types.EmptyRootHash, 0, trienode.NewWithNodeSet(nodesA), nil); err != nil {
+ panic(err)
+ }
+ if err := srcTrieDB.Commit(rootA, false); err != nil {
+ panic(err)
+ }
+ // Create a destination trie and sync with the scheduler
+ destDisk := rawdb.NewMemoryDatabase()
+ syncWith(t, rootA, destDisk, srcTrieDB)
+ checkTrieContents(t, destDisk, scheme, srcTrie.Hash().Bytes(), stateA, true)
+
+ // Delete the element from the trie
+ stateB := copyStates(stateA)
+ srcTrie, _ = New(TrieID(rootA), srcTrieDB)
+ deleteFn(key, srcTrie, stateB)
+
+ rootB, nodesB, _ := srcTrie.Commit(false)
+ if err := srcTrieDB.Update(rootB, rootA, 0, trienode.NewWithNodeSet(nodesB), nil); err != nil {
+ panic(err)
+ }
+ if err := srcTrieDB.Commit(rootB, false); err != nil {
+ panic(err)
+ }
+
+ // Sync the new state, but never persist the new root node. Before the
+ // fix #28595, the original old root node will still be left in database
+ // which breaks the next healing cycle.
+ syncWithHookWriter(t, rootB, destDisk, srcTrieDB, &hookWriter{db: destDisk, filter: func(key []byte, value []byte) bool {
+ if scheme == rawdb.HashScheme {
+ return false
+ }
+ if len(value) == 0 {
+ return false
+ }
+ ok, path := rawdb.ResolveAccountTrieNodeKey(key)
+ return ok && len(path) == 0
+ }})
+
+ // Add elements to expand trie
+ stateC := copyStates(stateB)
+ srcTrie, _ = New(TrieID(rootB), srcTrieDB)
+
+ writeFn(key, val, srcTrie, stateC)
+ rootC, nodesC, _ := srcTrie.Commit(false)
+ if err := srcTrieDB.Update(rootC, rootB, 0, trienode.NewWithNodeSet(nodesC), nil); err != nil {
+ panic(err)
+ }
+ if err := srcTrieDB.Commit(rootC, false); err != nil {
+ panic(err)
+ }
+ syncWith(t, rootC, destDisk, srcTrieDB)
+ checkTrieContents(t, destDisk, scheme, srcTrie.Hash().Bytes(), stateC, true)
+}
diff --git a/trie/triedb/pathdb/database.go b/trie/triedb/pathdb/database.go
index dc64414e9b..f2d6cea635 100644
--- a/trie/triedb/pathdb/database.go
+++ b/trie/triedb/pathdb/database.go
@@ -170,14 +170,31 @@ func New(diskdb ethdb.Database, config *Config) *Database {
}
db.freezer = freezer
- // Truncate the extra state histories above in freezer in case
- // it's not aligned with the disk layer.
- pruned, err := truncateFromHead(db.diskdb, freezer, db.tree.bottom().stateID())
- if err != nil {
- log.Crit("Failed to truncate extra state histories", "err", err)
- }
- if pruned != 0 {
- log.Warn("Truncated extra state histories", "number", pruned)
+ diskLayerID := db.tree.bottom().stateID()
+ if diskLayerID == 0 {
+ // Reset the entire state histories in case the trie database is
+ // not initialized yet, as these state histories are not expected.
+ frozen, err := db.freezer.Ancients()
+ if err != nil {
+ log.Crit("Failed to retrieve head of state history", "err", err)
+ }
+ if frozen != 0 {
+ err := db.freezer.Reset()
+ if err != nil {
+ log.Crit("Failed to reset state histories", "err", err)
+ }
+ log.Info("Truncated extraneous state history")
+ }
+ } else {
+ // Truncate the extra state histories above in freezer in case
+ // it's not aligned with the disk layer.
+ pruned, err := truncateFromHead(db.diskdb, freezer, diskLayerID)
+ if err != nil {
+ log.Crit("Failed to truncate extra state histories", "err", err)
+ }
+ if pruned != 0 {
+ log.Warn("Truncated extra state histories", "number", pruned)
+ }
}
}
// Disable database in case node is still in the initial state sync stage.
@@ -431,6 +448,9 @@ func (db *Database) Initialized(genesisRoot common.Hash) bool {
inited = true
}
})
+ if !inited {
+ inited = rawdb.ReadSnapSyncStatusFlag(db.diskdb) != rawdb.StateSyncUnknown
+ }
return inited
}