Commit 25f10683 authored by Adrian Sutton's avatar Adrian Sutton

Merge remote-tracking branch 'origin/develop' into aj/geth-1.13.4

parents 40d15216 a029c870
......@@ -1254,6 +1254,22 @@ jobs:
event: fail
template: basic_fail_1
op-program-compat:
docker:
- image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest
steps:
- checkout
- restore_cache:
name: Restore Go modules cache
key: gomod-{{ checksum "go.sum" }}
- restore_cache:
key: golang-build-cache
- run:
name: compat-goerli
command: |
make run-goerli-verify
working_directory: op-program
check-generated-mocks-op-node:
docker:
- image: us-docker.pkg.dev/oplabs-tools-artifacts/images/ci-builder:latest
......@@ -1432,6 +1448,9 @@ workflows:
- op-stack-go-lint
- devnet-allocs
- l1-geth-version-check
- op-program-compat:
requires:
- op-program-tests
- bedrock-go-tests:
requires:
- go-mod-download
......@@ -1449,6 +1468,7 @@ workflows:
- op-proposer-tests
- op-challenger-tests
- op-program-tests
- op-program-compat
- op-service-tests
- op-e2e-WS-tests
- op-e2e-HTTP-tests
......
......@@ -181,9 +181,9 @@ You must have Python 3.x installed to run `slither`.
To run `slither` locally, do:
```bash
cd packages/contracts
cd packages/contracts-bedrock
pip3 install slither-analyzer
pnpm test:slither
pnpm slither
```
## Labels
......
......@@ -94,8 +94,13 @@ def main():
devnet_l1_genesis(paths)
return
log.info('Building docker images')
run_command(['docker', 'compose', 'build', '--progress', 'plain'], cwd=paths.ops_bedrock_dir, env={
git_commit = subprocess.run(['git', 'rev-parse', 'HEAD'], capture_output=True, text=True).stdout.strip()
git_date = subprocess.run(['git', 'show', '-s', "--format=%ct"], capture_output=True, text=True).stdout.strip()
log.info(f'Building docker images for git commit {git_commit} ({git_date})')
run_command(['docker', 'compose', 'build', '--progress', 'plain',
'--build-arg', f'GIT_COMMIT={git_commit}', '--build-arg', f'GIT_DATE={git_date}'],
cwd=paths.ops_bedrock_dir, env={
'PWD': paths.ops_bedrock_dir,
'DOCKER_BUILDKIT': '1', # (should be available by default in later versions, but explicitly enable it anyway)
'COMPOSE_DOCKER_CLI_BUILD': '1' # use the docker cache
......
package main
import (
"fmt"
"os"
opservice "github.com/ethereum-optimism/optimism/op-service"
oplog "github.com/ethereum-optimism/optimism/op-service/log"
"github.com/ethereum/go-ethereum/log"
"github.com/urfave/cli/v2"
......@@ -22,7 +22,7 @@ func main() {
app := cli.NewApp()
app.Flags = endpointMonitor.CLIFlags("ENDPOINT_MONITOR")
app.Version = fmt.Sprintf("%s-%s-%s", Version, GitCommit, GitDate)
app.Version = opservice.FormatVersion(Version, GitCommit, GitDate, "")
app.Name = "endpoint-monitor"
app.Usage = "Endpoint Monitoring Service"
app.Description = ""
......
......@@ -9,8 +9,8 @@ require (
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0
github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3
github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20231018202221-fdba3d104171
github.com/ethereum/go-ethereum v1.13.4
github.com/fsnotify/fsnotify v1.6.0
github.com/ethereum/go-ethereum v1.13.1
github.com/fsnotify/fsnotify v1.7.0
github.com/go-chi/chi/v5 v5.0.10
github.com/go-chi/docgen v1.2.0
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb
......@@ -33,7 +33,7 @@ require (
github.com/multiformats/go-multiaddr v0.12.0
github.com/multiformats/go-multiaddr-dns v0.3.1
github.com/olekukonko/tablewriter v0.0.5
github.com/onsi/gomega v1.28.0
github.com/onsi/gomega v1.28.1
github.com/pkg/errors v0.9.1
github.com/pkg/profile v1.7.0
github.com/prometheus/client_golang v1.17.0
......@@ -62,7 +62,6 @@ require (
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/cockroachdb/errors v1.11.1 // indirect
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
// Upgraded to include https://github.com/cockroachdb/pebble/pull/3005
github.com/cockroachdb/pebble v0.0.0-20231018212520-f6cde3fc2fa4 // indirect
github.com/cockroachdb/redact v1.1.5 // indirect
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
......@@ -163,7 +162,7 @@ require (
github.com/multiformats/go-varint v0.0.7 // indirect
github.com/naoina/go-stringutil v0.1.0 // indirect
github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 // indirect
github.com/onsi/ginkgo/v2 v2.12.0 // indirect
github.com/onsi/ginkgo/v2 v2.13.0 // indirect
github.com/opencontainers/runtime-spec v1.1.0 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
......@@ -210,7 +209,7 @@ require (
rsc.io/tmplfunc v0.0.3 // indirect
)
replace github.com/ethereum/go-ethereum v1.13.4 => github.com/ethereum-optimism/op-geth v1.101303.0-rc.2.0.20231023000909-ceb5f3201eb7
replace github.com/ethereum/go-ethereum v1.13.1 => github.com/ethereum-optimism/op-geth v1.101303.0-rc.2.0.20231024175019-29cd9a353f83
//replace github.com/ethereum-optimism/superchain-registry/superchain => ../superchain-registry/superchain
//replace github.com/ethereum/go-ethereum v1.13.4 => ../go-ethereum
//replace github.com/ethereum/go-ethereum v1.13.1 => ../go-ethereum
......@@ -151,8 +151,8 @@ github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/
github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 h1:RWHKLhCrQThMfch+QJ1Z8veEq5ZO3DfIhZ7xgRP9WTc=
github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3/go.mod h1:QziizLAiF0KqyLdNJYD7O5cpDlaFMNZzlxYNcWsJUxs=
github.com/ethereum-optimism/op-geth v1.101303.0-rc.2.0.20231023000909-ceb5f3201eb7 h1:4T6bQlhdoPpQDSGUO4wstmyipeX8ATMKGVISSwe4fbY=
github.com/ethereum-optimism/op-geth v1.101303.0-rc.2.0.20231023000909-ceb5f3201eb7/go.mod h1:hl28ffXoV4maInP7dvhvNgDO79Q5M3MEYrPZZO6u3W8=
github.com/ethereum-optimism/op-geth v1.101303.0-rc.2.0.20231024175019-29cd9a353f83 h1:RFKnTUJqbYM8+dueFcGPdOY0ycrOhxp0HQJyy2OYzvc=
github.com/ethereum-optimism/op-geth v1.101303.0-rc.2.0.20231024175019-29cd9a353f83/go.mod h1:hl28ffXoV4maInP7dvhvNgDO79Q5M3MEYrPZZO6u3W8=
github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20231018202221-fdba3d104171 h1:MjCUj16JSLZRDnQQ6OOUy6Chfb4dKo7ahFceNi0RKZ8=
github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20231018202221-fdba3d104171/go.mod h1:/70H/KqrtKcvWvNGVj6S3rAcLC+kUPr3t2aDmYIS+Xk=
github.com/ethereum/c-kzg-4844 v0.3.1 h1:sR65+68+WdnMKxseNWxSJuAv2tsUrihTpVBTfM/U5Zg=
......@@ -171,8 +171,8 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays=
github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b h1:vMT47RYsrftsHSTQhqXwC3BYflo38OLC3Y4LtXtLyU0=
......@@ -561,16 +561,16 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI=
github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ=
github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4=
github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o=
github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
github.com/onsi/gomega v1.28.0 h1:i2rg/p9n/UqIDAMFUJ6qIUUMcsqOuUHgbpbu235Vr1c=
github.com/onsi/gomega v1.28.0/go.mod h1:A1H2JE76sI14WIP57LMKj7FVfCHx3g3BcZVjJG8bjX8=
github.com/onsi/gomega v1.28.1 h1:MijcGUbfYuznzK/5R4CPNoUP/9Xvuo20sXfEm6XxoTA=
github.com/onsi/gomega v1.28.1/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg=
github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
......@@ -873,7 +873,6 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
......
......@@ -186,7 +186,6 @@ func (db *blocksDB) LatestObservedEpoch(fromL1Height *big.Int, maxL1Range uint64
var header L1BlockHeader
if fromL1Height != nil {
result := db.gorm.Where("number = ?", fromL1Height).Take(&header)
// TODO - Embed logging to db
if result.Error != nil {
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
return nil, nil
......@@ -196,7 +195,8 @@ func (db *blocksDB) LatestObservedEpoch(fromL1Height *big.Int, maxL1Range uint64
fromTimestamp = header.Timestamp
} else {
result := db.gorm.Order("number desc").Take(&header)
// Take the lowest indexed L1 block to compute the lower bound
result := db.gorm.Order("number ASC").Take(&header)
if result.Error != nil {
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
return nil, nil
......@@ -205,6 +205,7 @@ func (db *blocksDB) LatestObservedEpoch(fromL1Height *big.Int, maxL1Range uint64
}
fromL1Height = header.Number
fromTimestamp = header.Timestamp
}
// Upper Bound (lowest timestamp indexed between L1/L2 bounded by `maxL1Range`)
......
......@@ -58,7 +58,6 @@ services:
depends_on:
postgres:
condition: service_healthy
depends_on:
migrations:
condition: service_started
......
......@@ -177,26 +177,6 @@ CREATE INDEX IF NOT EXISTS l2_bridge_messages_transaction_withdrawal_hash ON l2_
CREATE INDEX IF NOT EXISTS l2_bridge_messages_from_address ON l2_bridge_messages(from_address);
-- StandardBridge
CREATE TABLE IF NOT EXISTS l1_bridged_tokens (
address VARCHAR PRIMARY KEY,
bridge_address VARCHAR NOT NULL,
name VARCHAR NOT NULL,
symbol VARCHAR NOT NULL,
decimals INTEGER NOT NULL CHECK (decimals >= 0 AND decimals <= 18)
);
CREATE TABLE IF NOT EXISTS l2_bridged_tokens (
address VARCHAR PRIMARY KEY,
bridge_address VARCHAR NOT NULL,
-- L1-L2 relationship is 1 to many so this is not necessarily unique
l1_token_address VARCHAR REFERENCES l1_bridged_tokens(address) ON DELETE CASCADE,
name VARCHAR NOT NULL,
symbol VARCHAR NOT NULL,
decimals INTEGER NOT NULL CHECK (decimals >= 0 AND decimals <= 18)
);
CREATE TABLE IF NOT EXISTS l1_bridge_deposits (
transaction_source_hash VARCHAR PRIMARY KEY REFERENCES l1_transaction_deposits(source_hash) ON DELETE CASCADE,
cross_domain_message_hash VARCHAR NOT NULL UNIQUE REFERENCES l1_bridge_messages(message_hash) ON DELETE CASCADE,
......@@ -204,8 +184,8 @@ CREATE TABLE IF NOT EXISTS l1_bridge_deposits (
-- Deposit information
from_address VARCHAR NOT NULL,
to_address VARCHAR NOT NULL,
local_token_address VARCHAR NOT NULL, -- REFERENCES l1_bridged_tokens(address), uncomment me in future pr
remote_token_address VARCHAR NOT NULL, -- REFERENCES l2_bridged_tokens(address), uncomment me in future pr
local_token_address VARCHAR NOT NULL,
remote_token_address VARCHAR NOT NULL,
amount UINT256 NOT NULL,
data VARCHAR NOT NULL,
timestamp INTEGER NOT NULL CHECK (timestamp > 0)
......@@ -221,8 +201,8 @@ CREATE TABLE IF NOT EXISTS l2_bridge_withdrawals (
-- Withdrawal information
from_address VARCHAR NOT NULL,
to_address VARCHAR NOT NULL,
local_token_address VARCHAR NOT NULL, -- REFERENCES l2_bridged_tokens(address), uncomment me in future pr
remote_token_address VARCHAR NOT NULL, -- REFERENCES l1_bridged_tokens(address), uncomment me in future pr
local_token_address VARCHAR NOT NULL,
remote_token_address VARCHAR NOT NULL,
amount UINT256 NOT NULL,
data VARCHAR NOT NULL,
timestamp INTEGER NOT NULL CHECK (timestamp > 0)
......
......@@ -29,7 +29,7 @@ func L1ProcessInitiatedBridgeEvents(log log.Logger, db *database.DB, metrics L1M
log.Info("detected transaction deposits", "size", len(optimismPortalTxDeposits))
}
var mintedGWEI = bigint.Zero
mintedGWEI := bigint.Zero
portalDeposits := make(map[logKey]*contracts.OptimismPortalTransactionDepositEvent, len(optimismPortalTxDeposits))
transactionDeposits := make([]database.L1TransactionDeposit, len(optimismPortalTxDeposits))
for i := range optimismPortalTxDeposits {
......@@ -44,7 +44,6 @@ func L1ProcessInitiatedBridgeEvents(log log.Logger, db *database.DB, metrics L1M
GasLimit: depositTx.GasLimit,
Tx: depositTx.Tx,
}
}
if len(transactionDeposits) > 0 {
......@@ -125,6 +124,7 @@ func L1ProcessInitiatedBridgeEvents(log log.Logger, db *database.DB, metrics L1M
}
bridgedTokens[initiatedBridge.BridgeTransfer.TokenPair.LocalTokenAddress]++
initiatedBridge.BridgeTransfer.CrossDomainMessageHash = &sentMessage.BridgeMessage.MessageHash
bridgeDeposits[i] = database.L1BridgeDeposit{
TransactionSourceHash: portalDeposit.DepositTx.SourceHash,
......@@ -214,10 +214,8 @@ func L1ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, metrics L1M
log.Info("detected relayed messages", "size", len(crossDomainRelayedMessages))
}
relayedMessages := make(map[logKey]*contracts.CrossDomainMessengerRelayedMessageEvent, len(crossDomainRelayedMessages))
for i := range crossDomainRelayedMessages {
relayed := crossDomainRelayedMessages[i]
relayedMessages[logKey{BlockHash: relayed.Event.BlockHash, LogIndex: relayed.Event.LogIndex}] = &relayed
message, err := db.BridgeMessages.L2BridgeMessage(relayed.MessageHash)
if err != nil {
return err
......@@ -236,40 +234,21 @@ func L1ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, metrics L1M
}
// (4) L1StandardBridge
// - Nothing actionable on the database. Since the StandardBridge is layered ontop of the
// CrossDomainMessenger, there's no need for any sanity or invariant checks as the previous step
// ensures a relayed message (finalized bridge) can be linked with a sent message (initiated bridge).
finalizedBridges, err := contracts.StandardBridgeFinalizedEvents("l1", l1Contracts.L1StandardBridgeProxy, db, fromHeight, toHeight)
if err != nil {
return err
}
if len(finalizedBridges) > 0 {
log.Info("detected finalized bridge withdrawals", "size", len(finalizedBridges))
}
finalizedTokens := make(map[common.Address]int)
for i := range finalizedBridges {
// Nothing actionable on the database. However, we can treat the relayed message
// as an invariant by ensuring we can query for a deposit by the same hash
finalizedBridge := finalizedBridges[i]
relayedMessage, ok := relayedMessages[logKey{finalizedBridge.Event.BlockHash, finalizedBridge.Event.LogIndex + 1}]
if !ok {
log.Error("expected RelayedMessage following BridgeFinalized event", "tx_hash", finalizedBridge.Event.TransactionHash.String())
return fmt.Errorf("expected RelayedMessage following BridgeFinalized event. tx_hash = %s", finalizedBridge.Event.TransactionHash.String())
} else if relayedMessage.Event.TransactionHash != finalizedBridge.Event.TransactionHash {
log.Error("correlated events tx hash mismatch", "message_tx_hash", relayedMessage.Event.TransactionHash.String(), "bridge_tx_hash", finalizedBridge.Event.TransactionHash.String())
return fmt.Errorf("correlated events tx hash mismatch")
}
// Since the message hash is computed from the relayed message, this ensures the deposit fields must match
withdrawal, err := db.BridgeTransfers.L2BridgeWithdrawalWithFilter(database.BridgeTransfer{CrossDomainMessageHash: &relayedMessage.MessageHash})
if err != nil {
return err
} else if withdrawal == nil {
log.Error("missing L2StandardBridge withdrawal on L1 finalization", "tx_hash", finalizedBridge.Event.TransactionHash.String())
return fmt.Errorf("missing L2StandardBridge withdrawal on L1 finalization. tx_hash: %s", finalizedBridge.Event.TransactionHash.String())
}
finalizedTokens[finalizedBridge.BridgeTransfer.TokenPair.LocalTokenAddress]++
}
if len(finalizedBridges) > 0 {
log.Info("detected finalized bridge withdrawals", "size", len(finalizedBridges))
for tokenAddr, size := range finalizedTokens {
metrics.RecordL1FinalizedBridgeTransfers(tokenAddr, size)
}
......
package bridge
import (
"errors"
"fmt"
"math/big"
......@@ -29,7 +28,7 @@ func L2ProcessInitiatedBridgeEvents(log log.Logger, db *database.DB, metrics L2M
log.Info("detected transaction withdrawals", "size", len(l2ToL1MPMessagesPassed))
}
var withdrawnWEI = bigint.Zero
withdrawnWEI := bigint.Zero
messagesPassed := make(map[logKey]*contracts.L2ToL1MessagePasserMessagePassed, len(l2ToL1MPMessagesPassed))
transactionWithdrawals := make([]database.L2TransactionWithdrawal, len(l2ToL1MPMessagesPassed))
for i := range l2ToL1MPMessagesPassed {
......@@ -122,8 +121,9 @@ func L2ProcessInitiatedBridgeEvents(log log.Logger, db *database.DB, metrics L2M
return fmt.Errorf("correlated events tx hash mismatch")
}
initiatedBridge.BridgeTransfer.CrossDomainMessageHash = &sentMessage.BridgeMessage.MessageHash
bridgedTokens[initiatedBridge.BridgeTransfer.TokenPair.LocalTokenAddress]++
initiatedBridge.BridgeTransfer.CrossDomainMessageHash = &sentMessage.BridgeMessage.MessageHash
bridgeWithdrawals[i] = database.L2BridgeWithdrawal{
TransactionWithdrawalHash: messagePassed.WithdrawalHash,
BridgeTransfer: initiatedBridge.BridgeTransfer,
......@@ -158,10 +158,8 @@ func L2ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, metrics L2M
log.Info("detected relayed messages", "size", len(crossDomainRelayedMessages))
}
relayedMessages := make(map[logKey]*contracts.CrossDomainMessengerRelayedMessageEvent, len(crossDomainRelayedMessages))
for i := range crossDomainRelayedMessages {
relayed := crossDomainRelayedMessages[i]
relayedMessages[logKey{BlockHash: relayed.Event.BlockHash, LogIndex: relayed.Event.LogIndex}] = &relayed
message, err := db.BridgeMessages.L1BridgeMessage(relayed.MessageHash)
if err != nil {
return err
......@@ -175,45 +173,26 @@ func L2ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, metrics L2M
return err
}
}
if len(relayedMessages) > 0 {
metrics.RecordL2CrossDomainRelayedMessages(len(relayedMessages))
if len(crossDomainRelayedMessages) > 0 {
metrics.RecordL2CrossDomainRelayedMessages(len(crossDomainRelayedMessages))
}
// (2) L2StandardBridge
// - Nothing actionable on the database. Since the StandardBridge is layered ontop of the
// CrossDomainMessenger, there's no need for any sanity or invariant checks as the previous step
// ensures a relayed message (finalized bridge) can be linked with a sent message (initiated bridge).
finalizedBridges, err := contracts.StandardBridgeFinalizedEvents("l2", l2Contracts.L2StandardBridge, db, fromHeight, toHeight)
if err != nil {
return err
}
if len(finalizedBridges) > 0 {
log.Info("detected finalized bridge deposits", "size", len(finalizedBridges))
}
finalizedTokens := make(map[common.Address]int)
for i := range finalizedBridges {
// Nothing actionable on the database. However, we can treat the relayed message
// as an invariant by ensuring we can query for a deposit by the same hash
finalizedBridge := finalizedBridges[i]
relayedMessage, ok := relayedMessages[logKey{finalizedBridge.Event.BlockHash, finalizedBridge.Event.LogIndex + 1}]
if !ok {
log.Error("expected RelayedMessage following BridgeFinalized event", "tx_hash", finalizedBridge.Event.TransactionHash.String())
return fmt.Errorf("expected RelayedMessage following BridgeFinalized event. tx_hash = %s", finalizedBridge.Event.TransactionHash.String())
} else if relayedMessage.Event.TransactionHash != finalizedBridge.Event.TransactionHash {
log.Error("correlated events tx hash mismatch", "message_tx_hash", relayedMessage.Event.TransactionHash.String(), "bridge_tx_hash", finalizedBridge.Event.TransactionHash.String())
return fmt.Errorf("correlated events tx hash mismatch")
}
// Since the message hash is computed from the relayed message, this ensures the withdrawal fields must match
deposit, err := db.BridgeTransfers.L1BridgeDepositWithFilter(database.BridgeTransfer{CrossDomainMessageHash: &relayedMessage.MessageHash})
if err != nil {
return err
} else if deposit == nil {
log.Error("missing L1StandardBridge deposit on L2 finalization", "tx_hash", finalizedBridge.Event.TransactionHash.String())
return errors.New("missing L1StandardBridge deposit on L2 finalization")
}
finalizedTokens[finalizedBridge.BridgeTransfer.TokenPair.LocalTokenAddress]++
}
if len(finalizedBridges) > 0 {
log.Info("detected finalized bridge deposits", "size", len(finalizedBridges))
for tokenAddr, size := range finalizedTokens {
metrics.RecordL2FinalizedBridgeTransfers(tokenAddr, size)
}
......
......@@ -162,13 +162,17 @@ func LegacyL2ProcessInitiatedBridgeEvents(log log.Logger, db *database.DB, metri
log.Info("detected legacy transaction withdrawals (via L2CrossDomainMessenger)", "size", len(crossDomainSentMessages))
}
type sentMessageEvent struct {
*contracts.CrossDomainMessengerSentMessageEvent
WithdrawalHash common.Hash
}
withdrawnWEI := bigint.Zero
sentMessages := make(map[logKey]*contracts.CrossDomainMessengerSentMessageEvent, len(crossDomainSentMessages))
sentMessages := make(map[logKey]sentMessageEvent, len(crossDomainSentMessages))
bridgeMessages := make([]database.L2BridgeMessage, len(crossDomainSentMessages))
transactionWithdrawals := make([]database.L2TransactionWithdrawal, len(crossDomainSentMessages))
for i := range crossDomainSentMessages {
sentMessage := crossDomainSentMessages[i]
sentMessages[logKey{sentMessage.Event.BlockHash, sentMessage.Event.LogIndex}] = &sentMessage
withdrawnWEI = new(big.Int).Add(withdrawnWEI, sentMessage.BridgeMessage.Tx.Amount)
// To ensure consistency in the schema, we duplicate this as the "root" transaction withdrawal. The storage key in the message
......@@ -188,6 +192,7 @@ func LegacyL2ProcessInitiatedBridgeEvents(log log.Logger, db *database.DB, metri
},
}
sentMessages[logKey{sentMessage.Event.BlockHash, sentMessage.Event.LogIndex}] = sentMessageEvent{&sentMessage, withdrawalHash}
bridgeMessages[i] = database.L2BridgeMessage{
TransactionWithdrawalHash: withdrawalHash,
BridgeMessage: sentMessage.BridgeMessage,
......@@ -235,7 +240,7 @@ func LegacyL2ProcessInitiatedBridgeEvents(log log.Logger, db *database.DB, metri
bridgedTokens[initiatedBridge.BridgeTransfer.TokenPair.LocalTokenAddress]++
initiatedBridge.BridgeTransfer.CrossDomainMessageHash = &sentMessage.BridgeMessage.MessageHash
l2BridgeWithdrawals[i] = database.L2BridgeWithdrawal{
TransactionWithdrawalHash: sentMessage.BridgeMessage.MessageHash,
TransactionWithdrawalHash: sentMessage.WithdrawalHash,
BridgeTransfer: initiatedBridge.BridgeTransfer,
}
}
......@@ -330,10 +335,12 @@ func LegacyL1ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, metri
log.Warn("skipped pre-regensis relayed L2CrossDomainMessenger withdrawals", "size", skippedPreRegenesisMessages)
}
// (2) L2StandardBridge -- no-op for now as there's nothing actionable to do here besides
// santiy checks which is not important for legacy code. Not worth extra code pre-bedrock.
// The message status is already tracked via the relayed bridge messed through the cross domain messenger.
// - NOTE: This means we dont increment metrics for finalized bridge transfers
// (2) L1StandardBridge
// - Nothing actionable on the database. Since the StandardBridge is layered ontop of the
// CrossDomainMessenger, there's no need for any sanity or invariant checks as the previous step
// ensures a relayed message (finalized bridge) can be linked with a sent message (initiated bridge).
// - NOTE: Ignoring metrics for pre-bedrock transfers
// a-ok!
return nil
......@@ -372,10 +379,12 @@ func LegacyL2ProcessFinalizedBridgeEvents(log log.Logger, db *database.DB, metri
metrics.RecordL2CrossDomainRelayedMessages(len(crossDomainRelayedMessages))
}
// (2) L2StandardBridge -- no-op for now as there's nothing actionable to do here besides
// santiy checks which is not important for legacy code. Not worth the extra code pre-bedorck.
// The message status is already tracked via the relayed bridge messed through the cross domain messenger.
// - NOTE: This means we dont increment metrics for finalized bridge transfers
// (2) L2StandardBridge
// - Nothing actionable on the database. Since the StandardBridge is layered ontop of the
// CrossDomainMessenger, there's no need for any sanity or invariant checks as the previous step
// ensures a relayed message (finalized bridge) can be linked with a sent message (initiated bridge).
// - NOTE: Ignoring metrics for pre-bedrock transfers
// a-ok!
return nil
......
......@@ -3,110 +3,32 @@ package batcher
import (
"context"
"fmt"
_ "net/http/pprof"
"github.com/urfave/cli/v2"
"github.com/ethereum-optimism/optimism/op-batcher/flags"
"github.com/ethereum-optimism/optimism/op-batcher/metrics"
"github.com/ethereum-optimism/optimism/op-batcher/rpc"
opservice "github.com/ethereum-optimism/optimism/op-service"
"github.com/ethereum-optimism/optimism/op-service/cliapp"
oplog "github.com/ethereum-optimism/optimism/op-service/log"
"github.com/ethereum-optimism/optimism/op-service/opio"
oppprof "github.com/ethereum-optimism/optimism/op-service/pprof"
oprpc "github.com/ethereum-optimism/optimism/op-service/rpc"
)
// Main is the entrypoint into the Batch Submitter. This method returns a
// closure that executes the service and blocks until the service exits. The use
// of a closure allows the parameters bound to the top-level main package, e.g.
// GitVersion, to be captured and used once the function is executed.
func Main(version string, cliCtx *cli.Context) error {
if err := flags.CheckRequired(cliCtx); err != nil {
return err
}
cfg := NewConfig(cliCtx)
if err := cfg.Check(); err != nil {
return fmt.Errorf("invalid CLI flags: %w", err)
}
l := oplog.NewLogger(oplog.AppOut(cliCtx), cfg.LogConfig)
oplog.SetGlobalLogHandler(l.GetHandler())
opservice.ValidateEnvVars(flags.EnvVarPrefix, flags.Flags, l)
procName := "default"
m := metrics.NewMetrics(procName)
l.Info("Initializing Batch Submitter")
batchSubmitter, err := NewBatchSubmitterFromCLIConfig(cfg, l, m)
if err != nil {
l.Error("Unable to create Batch Submitter", "error", err)
return err
}
if !cfg.Stopped {
if err := batchSubmitter.Start(); err != nil {
l.Error("Unable to start Batch Submitter", "error", err)
return err
}
}
defer batchSubmitter.StopIfRunning(context.Background())
pprofConfig := cfg.PprofConfig
if pprofConfig.Enabled {
l.Debug("starting pprof", "addr", pprofConfig.ListenAddr, "port", pprofConfig.ListenPort)
pprofSrv, err := oppprof.StartServer(pprofConfig.ListenAddr, pprofConfig.ListenPort)
if err != nil {
l.Error("failed to start pprof server", "err", err)
return err
// Main is the entrypoint into the Batch Submitter.
// This method returns a cliapp.LifecycleAction, to create an op-service CLI-lifecycle-managed batch-submitter with.
func Main(version string) cliapp.LifecycleAction {
return func(cliCtx *cli.Context, closeApp context.CancelCauseFunc) (cliapp.Lifecycle, error) {
if err := flags.CheckRequired(cliCtx); err != nil {
return nil, err
}
l.Info("started pprof server", "addr", pprofSrv.Addr())
defer func() {
if err := pprofSrv.Stop(context.Background()); err != nil {
l.Error("failed to stop pprof server", "err", err)
}
}()
}
metricsCfg := cfg.MetricsConfig
if metricsCfg.Enabled {
l.Debug("starting metrics server", "addr", metricsCfg.ListenAddr, "port", metricsCfg.ListenPort)
metricsSrv, err := m.Start(metricsCfg.ListenAddr, metricsCfg.ListenPort)
if err != nil {
return fmt.Errorf("failed to start metrics server: %w", err)
cfg := NewConfig(cliCtx)
if err := cfg.Check(); err != nil {
return nil, fmt.Errorf("invalid CLI flags: %w", err)
}
l.Info("started metrics server", "addr", metricsSrv.Addr())
defer func() {
if err := metricsSrv.Stop(context.Background()); err != nil {
l.Error("failed to stop pprof server", "err", err)
}
}()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
m.StartBalanceMetrics(ctx, l, batchSubmitter.L1Client, batchSubmitter.TxManager.From())
}
server := oprpc.NewServer(
cfg.RPCFlag.ListenAddr,
cfg.RPCFlag.ListenPort,
version,
oprpc.WithLogger(l),
)
if cfg.RPCFlag.EnableAdmin {
adminAPI := rpc.NewAdminAPI(batchSubmitter, &m.RPCMetrics, l)
server.AddAPI(rpc.GetAdminAPI(adminAPI))
l.Info("Admin RPC enabled")
}
if err := server.Start(); err != nil {
return fmt.Errorf("error starting RPC server: %w", err)
}
m.RecordInfo(version)
m.RecordUp()
l := oplog.NewLogger(oplog.AppOut(cliCtx), cfg.LogConfig)
oplog.SetGlobalLogHandler(l.GetHandler())
opservice.ValidateEnvVars(flags.EnvVarPrefix, flags.Flags, l)
opio.BlockOnInterrupts()
if err := server.Stop(); err != nil {
l.Error("Error shutting down http server: %w", err)
l.Info("Initializing Batch Submitter")
return BatcherServiceFromCLIConfig(cliCtx.Context, version, cfg, l)
}
return nil
}
......@@ -3,52 +3,17 @@ package batcher
import (
"time"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/log"
"github.com/urfave/cli/v2"
"github.com/ethereum-optimism/optimism/op-batcher/compressor"
"github.com/ethereum-optimism/optimism/op-batcher/flags"
"github.com/ethereum-optimism/optimism/op-batcher/metrics"
"github.com/ethereum-optimism/optimism/op-node/rollup"
oplog "github.com/ethereum-optimism/optimism/op-service/log"
opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics"
oppprof "github.com/ethereum-optimism/optimism/op-service/pprof"
oprpc "github.com/ethereum-optimism/optimism/op-service/rpc"
"github.com/ethereum-optimism/optimism/op-service/sources"
"github.com/ethereum-optimism/optimism/op-service/txmgr"
)
type Config struct {
log log.Logger
metr metrics.Metricer
L1Client *ethclient.Client
L2Client *ethclient.Client
RollupNode *sources.RollupClient
TxManager txmgr.TxManager
NetworkTimeout time.Duration
PollInterval time.Duration
MaxPendingTransactions uint64
// RollupConfig is queried at startup
Rollup *rollup.Config
// Channel builder parameters
Channel ChannelConfig
}
// Check ensures that the [Config] is valid.
func (c *Config) Check() error {
if err := c.Rollup.Check(); err != nil {
return err
}
if err := c.Channel.Check(); err != nil {
return err
}
return nil
}
type CLIConfig struct {
// L1EthRpc is the HTTP provider URL for L1.
L1EthRpc string
......@@ -92,11 +57,11 @@ type CLIConfig struct {
MetricsConfig opmetrics.CLIConfig
PprofConfig oppprof.CLIConfig
CompressorConfig compressor.CLIConfig
RPCFlag oprpc.CLIConfig
RPC oprpc.CLIConfig
}
func (c CLIConfig) Check() error {
// TODO: check the sanity of flags loaded directly https://github.com/ethereum-optimism/optimism/issues/7512
func (c *CLIConfig) Check() error {
// TODO(7512): check the sanity of flags loaded directly https://github.com/ethereum-optimism/optimism/issues/7512
if err := c.MetricsConfig.Check(); err != nil {
return err
......@@ -107,15 +72,15 @@ func (c CLIConfig) Check() error {
if err := c.TxMgrConfig.Check(); err != nil {
return err
}
if err := c.RPCFlag.Check(); err != nil {
if err := c.RPC.Check(); err != nil {
return err
}
return nil
}
// NewConfig parses the Config from the provided flags or environment variables.
func NewConfig(ctx *cli.Context) CLIConfig {
return CLIConfig{
func NewConfig(ctx *cli.Context) *CLIConfig {
return &CLIConfig{
/* Required Flags */
L1EthRpc: ctx.String(flags.L1EthRpcFlag.Name),
L2EthRpc: ctx.String(flags.L2EthRpcFlag.Name),
......@@ -133,6 +98,6 @@ func NewConfig(ctx *cli.Context) CLIConfig {
MetricsConfig: opmetrics.ReadCLIConfig(ctx),
PprofConfig: oppprof.ReadCLIConfig(ctx),
CompressorConfig: compressor.ReadCLIConfig(ctx),
RPCFlag: oprpc.ReadCLIConfig(ctx),
RPC: oprpc.ReadCLIConfig(ctx),
}
}
......@@ -10,23 +10,50 @@ import (
"sync"
"time"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum-optimism/optimism/op-batcher/metrics"
"github.com/ethereum-optimism/optimism/op-node/rollup"
"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
"github.com/ethereum-optimism/optimism/op-service/dial"
"github.com/ethereum-optimism/optimism/op-service/eth"
"github.com/ethereum-optimism/optimism/op-service/txmgr"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/log"
)
var ErrBatcherNotRunning = errors.New("batcher is not running")
type L1Client interface {
HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error)
}
type L2Client interface {
BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error)
}
type RollupClient interface {
SyncStatus(ctx context.Context) (*eth.SyncStatus, error)
}
// DriverSetup is the collection of input/output interfaces and configuration that the driver operates on.
type DriverSetup struct {
Log log.Logger
Metr metrics.Metricer
RollupCfg *rollup.Config
Cfg BatcherConfig
Txmgr txmgr.TxManager
L1Client L1Client
L2Client L2Client
RollupClient RollupClient
Channel ChannelConfig
}
// BatchSubmitter encapsulates a service responsible for submitting L2 tx
// batches to L1 for availability.
type BatchSubmitter struct {
Config // directly embed the config + sources
DriverSetup
txMgr txmgr.TxManager
wg sync.WaitGroup
wg sync.WaitGroup
shutdownCtx context.Context
cancelShutdownCtx context.CancelFunc
......@@ -43,88 +70,16 @@ type BatchSubmitter struct {
state *channelManager
}
// NewBatchSubmitterFromCLIConfig initializes the BatchSubmitter, gathering any resources
// that will be needed during operation.
func NewBatchSubmitterFromCLIConfig(cfg CLIConfig, l log.Logger, m metrics.Metricer) (*BatchSubmitter, error) {
ctx := context.Background()
// Connect to L1 and L2 providers. Perform these last since they are the
// most expensive.
l1Client, err := dial.DialEthClientWithTimeout(dial.DefaultDialTimeout, l, cfg.L1EthRpc)
if err != nil {
return nil, err
}
l2Client, err := dial.DialEthClientWithTimeout(dial.DefaultDialTimeout, l, cfg.L2EthRpc)
if err != nil {
return nil, err
}
rollupClient, err := dial.DialRollupClientWithTimeout(dial.DefaultDialTimeout, l, cfg.RollupRpc)
if err != nil {
return nil, err
}
rcfg, err := rollupClient.RollupConfig(ctx)
if err != nil {
return nil, fmt.Errorf("querying rollup config: %w", err)
}
txManager, err := txmgr.NewSimpleTxManager("batcher", l, m, cfg.TxMgrConfig)
if err != nil {
return nil, err
}
batcherCfg := Config{
L1Client: l1Client,
L2Client: l2Client,
RollupNode: rollupClient,
PollInterval: cfg.PollInterval,
MaxPendingTransactions: cfg.MaxPendingTransactions,
NetworkTimeout: cfg.TxMgrConfig.NetworkTimeout,
TxManager: txManager,
Rollup: rcfg,
Channel: ChannelConfig{
SeqWindowSize: rcfg.SeqWindowSize,
ChannelTimeout: rcfg.ChannelTimeout,
MaxChannelDuration: cfg.MaxChannelDuration,
SubSafetyMargin: cfg.SubSafetyMargin,
MaxFrameSize: cfg.MaxL1TxSize - 1, // subtract 1 byte for version
CompressorConfig: cfg.CompressorConfig.Config(),
},
}
// Validate the batcher config
if err := batcherCfg.Check(); err != nil {
return nil, err
}
return NewBatchSubmitter(ctx, batcherCfg, l, m)
}
// NewBatchSubmitter initializes the BatchSubmitter, gathering any resources
// that will be needed during operation.
func NewBatchSubmitter(ctx context.Context, cfg Config, l log.Logger, m metrics.Metricer) (*BatchSubmitter, error) {
balance, err := cfg.L1Client.BalanceAt(ctx, cfg.TxManager.From(), nil)
if err != nil {
return nil, err
}
cfg.log = l
cfg.log.Info("creating batch submitter", "submitter_addr", cfg.TxManager.From(), "submitter_bal", balance)
cfg.metr = m
// NewBatchSubmitter initializes the BatchSubmitter driver from a preconfigured DriverSetup
func NewBatchSubmitter(setup DriverSetup) *BatchSubmitter {
return &BatchSubmitter{
Config: cfg,
txMgr: cfg.TxManager,
state: NewChannelManager(l, m, cfg.Channel),
}, nil
DriverSetup: setup,
state: NewChannelManager(setup.Log, setup.Metr, setup.Channel),
}
}
func (l *BatchSubmitter) Start() error {
l.log.Info("Starting Batch Submitter")
func (l *BatchSubmitter) StartBatchSubmitting() error {
l.Log.Info("Starting Batch Submitter")
l.mutex.Lock()
defer l.mutex.Unlock()
......@@ -142,23 +97,27 @@ func (l *BatchSubmitter) Start() error {
l.wg.Add(1)
go l.loop()
l.log.Info("Batch Submitter started")
l.Log.Info("Batch Submitter started")
return nil
}
func (l *BatchSubmitter) StopIfRunning(ctx context.Context) {
_ = l.Stop(ctx)
func (l *BatchSubmitter) StopBatchSubmittingIfRunning(ctx context.Context) error {
err := l.StopBatchSubmitting(ctx)
if errors.Is(err, ErrBatcherNotRunning) {
return nil
}
return err
}
func (l *BatchSubmitter) Stop(ctx context.Context) error {
l.log.Info("Stopping Batch Submitter")
// StopBatchSubmitting stops the batch-submitter loop, and force-kills if the provided ctx is done.
func (l *BatchSubmitter) StopBatchSubmitting(ctx context.Context) error {
l.Log.Info("Stopping Batch Submitter")
l.mutex.Lock()
defer l.mutex.Unlock()
if !l.running {
return errors.New("batcher is not running")
return ErrBatcherNotRunning
}
l.running = false
......@@ -175,8 +134,7 @@ func (l *BatchSubmitter) Stop(ctx context.Context) error {
l.wg.Wait()
l.cancelKillCtx()
l.log.Info("Batch Submitter stopped")
l.Log.Info("Batch Submitter stopped")
return nil
}
......@@ -191,7 +149,7 @@ func (l *BatchSubmitter) Stop(ctx context.Context) error {
func (l *BatchSubmitter) loadBlocksIntoState(ctx context.Context) error {
start, end, err := l.calculateL2BlockRangeToStore(ctx)
if err != nil {
l.log.Warn("Error calculating L2 block range", "err", err)
l.Log.Warn("Error calculating L2 block range", "err", err)
return err
} else if start.Number >= end.Number {
return errors.New("start number is >= end number")
......@@ -202,30 +160,30 @@ func (l *BatchSubmitter) loadBlocksIntoState(ctx context.Context) error {
for i := start.Number + 1; i < end.Number+1; i++ {
block, err := l.loadBlockIntoState(ctx, i)
if errors.Is(err, ErrReorg) {
l.log.Warn("Found L2 reorg", "block_number", i)
l.Log.Warn("Found L2 reorg", "block_number", i)
l.lastStoredBlock = eth.BlockID{}
return err
} else if err != nil {
l.log.Warn("failed to load block into state", "err", err)
l.Log.Warn("failed to load block into state", "err", err)
return err
}
l.lastStoredBlock = eth.ToBlockID(block)
latestBlock = block
}
l2ref, err := derive.L2BlockToBlockRef(latestBlock, &l.Rollup.Genesis)
l2ref, err := derive.L2BlockToBlockRef(latestBlock, &l.RollupCfg.Genesis)
if err != nil {
l.log.Warn("Invalid L2 block loaded into state", "err", err)
l.Log.Warn("Invalid L2 block loaded into state", "err", err)
return err
}
l.metr.RecordL2BlocksLoaded(l2ref)
l.Metr.RecordL2BlocksLoaded(l2ref)
return nil
}
// loadBlockIntoState fetches & stores a single block into `state`. It returns the block it loaded.
func (l *BatchSubmitter) loadBlockIntoState(ctx context.Context, blockNumber uint64) (*types.Block, error) {
ctx, cancel := context.WithTimeout(ctx, l.NetworkTimeout)
ctx, cancel := context.WithTimeout(ctx, l.Cfg.NetworkTimeout)
defer cancel()
block, err := l.L2Client.BlockByNumber(ctx, new(big.Int).SetUint64(blockNumber))
if err != nil {
......@@ -236,16 +194,16 @@ func (l *BatchSubmitter) loadBlockIntoState(ctx context.Context, blockNumber uin
return nil, fmt.Errorf("adding L2 block to state: %w", err)
}
l.log.Info("added L2 block to local state", "block", eth.ToBlockID(block), "tx_count", len(block.Transactions()), "time", block.Time())
l.Log.Info("added L2 block to local state", "block", eth.ToBlockID(block), "tx_count", len(block.Transactions()), "time", block.Time())
return block, nil
}
// calculateL2BlockRangeToStore determines the range (start,end] that should be loaded into the local state.
// It also takes care of initializing some local state (i.e. will modify l.lastStoredBlock in certain conditions)
func (l *BatchSubmitter) calculateL2BlockRangeToStore(ctx context.Context) (eth.BlockID, eth.BlockID, error) {
ctx, cancel := context.WithTimeout(ctx, l.NetworkTimeout)
ctx, cancel := context.WithTimeout(ctx, l.Cfg.NetworkTimeout)
defer cancel()
syncStatus, err := l.RollupNode.SyncStatus(ctx)
syncStatus, err := l.RollupClient.SyncStatus(ctx)
// Ensure that we have the sync status
if err != nil {
return eth.BlockID{}, eth.BlockID{}, fmt.Errorf("failed to get sync status: %w", err)
......@@ -257,10 +215,10 @@ func (l *BatchSubmitter) calculateL2BlockRangeToStore(ctx context.Context) (eth.
// Check last stored to see if it needs to be set on startup OR set if is lagged behind.
// It lagging implies that the op-node processed some batches that were submitted prior to the current instance of the batcher being alive.
if l.lastStoredBlock == (eth.BlockID{}) {
l.log.Info("Starting batch-submitter work at safe-head", "safe", syncStatus.SafeL2)
l.Log.Info("Starting batch-submitter work at safe-head", "safe", syncStatus.SafeL2)
l.lastStoredBlock = syncStatus.SafeL2.ID()
} else if l.lastStoredBlock.Number < syncStatus.SafeL2.Number {
l.log.Warn("last submitted block lagged behind L2 safe head: batch submission will continue from the safe head now", "last", l.lastStoredBlock, "safe", syncStatus.SafeL2)
l.Log.Warn("last submitted block lagged behind L2 safe head: batch submission will continue from the safe head now", "last", l.lastStoredBlock, "safe", syncStatus.SafeL2)
l.lastStoredBlock = syncStatus.SafeL2.ID()
}
......@@ -286,11 +244,11 @@ func (l *BatchSubmitter) calculateL2BlockRangeToStore(ctx context.Context) (eth.
func (l *BatchSubmitter) loop() {
defer l.wg.Done()
ticker := time.NewTicker(l.PollInterval)
ticker := time.NewTicker(l.Cfg.PollInterval)
defer ticker.Stop()
receiptsCh := make(chan txmgr.TxReceipt[txData])
queue := txmgr.NewQueue[txData](l.killCtx, l.txMgr, l.MaxPendingTransactions)
queue := txmgr.NewQueue[txData](l.killCtx, l.Txmgr, l.Cfg.MaxPendingTransactions)
for {
select {
......@@ -298,7 +256,7 @@ func (l *BatchSubmitter) loop() {
if err := l.loadBlocksIntoState(l.shutdownCtx); errors.Is(err, ErrReorg) {
err := l.state.Close()
if err != nil {
l.log.Error("error closing the channel manager to handle a L2 reorg", "err", err)
l.Log.Error("error closing the channel manager to handle a L2 reorg", "err", err)
}
l.publishStateToL1(queue, receiptsCh, true)
l.state.Clear()
......@@ -310,7 +268,7 @@ func (l *BatchSubmitter) loop() {
case <-l.shutdownCtx.Done():
err := l.state.Close()
if err != nil {
l.log.Error("error closing the channel manager", "err", err)
l.Log.Error("error closing the channel manager", "err", err)
}
l.publishStateToL1(queue, receiptsCh, true)
return
......@@ -335,7 +293,7 @@ func (l *BatchSubmitter) publishStateToL1(queue *txmgr.Queue[txData], receiptsCh
err := l.publishTxToL1(l.killCtx, queue, receiptsCh)
if err != nil {
if drain && err != io.EOF {
l.log.Error("error sending tx while draining state", "err", err)
l.Log.Error("error sending tx while draining state", "err", err)
}
return
}
......@@ -357,7 +315,7 @@ func (l *BatchSubmitter) publishTxToL1(ctx context.Context, queue *txmgr.Queue[t
// send all available transactions
l1tip, err := l.l1Tip(ctx)
if err != nil {
l.log.Error("Failed to query L1 tip", "error", err)
l.Log.Error("Failed to query L1 tip", "error", err)
return err
}
l.recordL1Tip(l1tip)
......@@ -365,10 +323,10 @@ func (l *BatchSubmitter) publishTxToL1(ctx context.Context, queue *txmgr.Queue[t
// Collect next transaction data
txdata, err := l.state.TxData(l1tip.ID())
if err == io.EOF {
l.log.Trace("no transaction data available")
l.Log.Trace("no transaction data available")
return err
} else if err != nil {
l.log.Error("unable to get tx data", "err", err)
l.Log.Error("unable to get tx data", "err", err)
return err
}
......@@ -384,12 +342,12 @@ func (l *BatchSubmitter) sendTransaction(txdata txData, queue *txmgr.Queue[txDat
data := txdata.Bytes()
intrinsicGas, err := core.IntrinsicGas(data, nil, false, true, true, false)
if err != nil {
l.log.Error("Failed to calculate intrinsic gas", "error", err)
l.Log.Error("Failed to calculate intrinsic gas", "error", err)
return
}
candidate := txmgr.TxCandidate{
To: &l.Rollup.BatchInboxAddress,
To: &l.RollupCfg.BatchInboxAddress,
TxData: data,
GasLimit: intrinsicGas,
}
......@@ -399,10 +357,10 @@ func (l *BatchSubmitter) sendTransaction(txdata txData, queue *txmgr.Queue[txDat
func (l *BatchSubmitter) handleReceipt(r txmgr.TxReceipt[txData]) {
// Record TX Status
if r.Err != nil {
l.log.Warn("unable to publish tx", "err", r.Err, "data_size", r.ID.Len())
l.Log.Warn("unable to publish tx", "err", r.Err, "data_size", r.ID.Len())
l.recordFailedTx(r.ID.ID(), r.Err)
} else {
l.log.Info("tx successfully published", "tx_hash", r.Receipt.TxHash, "data_size", r.ID.Len())
l.Log.Info("tx successfully published", "tx_hash", r.Receipt.TxHash, "data_size", r.ID.Len())
l.recordConfirmedTx(r.ID.ID(), r.Receipt)
}
}
......@@ -412,16 +370,16 @@ func (l *BatchSubmitter) recordL1Tip(l1tip eth.L1BlockRef) {
return
}
l.lastL1Tip = l1tip
l.metr.RecordLatestL1Block(l1tip)
l.Metr.RecordLatestL1Block(l1tip)
}
func (l *BatchSubmitter) recordFailedTx(id txID, err error) {
l.log.Warn("Failed to send transaction", "err", err)
l.Log.Warn("Failed to send transaction", "err", err)
l.state.TxFailed(id)
}
func (l *BatchSubmitter) recordConfirmedTx(id txID, receipt *types.Receipt) {
l.log.Info("Transaction confirmed", "tx_hash", receipt.TxHash, "status", receipt.Status, "block_hash", receipt.BlockHash, "block_number", receipt.BlockNumber)
l.Log.Info("Transaction confirmed", "tx_hash", receipt.TxHash, "status", receipt.Status, "block_hash", receipt.BlockHash, "block_number", receipt.BlockNumber)
l1block := eth.BlockID{Number: receipt.BlockNumber.Uint64(), Hash: receipt.BlockHash}
l.state.TxConfirmed(id, l1block)
}
......@@ -429,7 +387,7 @@ func (l *BatchSubmitter) recordConfirmedTx(id txID, receipt *types.Receipt) {
// l1Tip gets the current L1 tip as a L1BlockRef. The passed context is assumed
// to be a lifetime context, so it is internally wrapped with a network timeout.
func (l *BatchSubmitter) l1Tip(ctx context.Context) (eth.L1BlockRef, error) {
tctx, cancel := context.WithTimeout(ctx, l.NetworkTimeout)
tctx, cancel := context.WithTimeout(ctx, l.Cfg.NetworkTimeout)
defer cancel()
head, err := l.L1Client.HeaderByNumber(tctx, nil)
if err != nil {
......
package batcher
import (
"context"
"errors"
"fmt"
"io"
"net"
_ "net/http/pprof"
"strconv"
"sync/atomic"
"time"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum-optimism/optimism/op-batcher/metrics"
"github.com/ethereum-optimism/optimism/op-batcher/rpc"
"github.com/ethereum-optimism/optimism/op-node/rollup"
"github.com/ethereum-optimism/optimism/op-service/cliapp"
"github.com/ethereum-optimism/optimism/op-service/dial"
"github.com/ethereum-optimism/optimism/op-service/httputil"
opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics"
oppprof "github.com/ethereum-optimism/optimism/op-service/pprof"
oprpc "github.com/ethereum-optimism/optimism/op-service/rpc"
"github.com/ethereum-optimism/optimism/op-service/sources"
"github.com/ethereum-optimism/optimism/op-service/txmgr"
)
type BatcherConfig struct {
NetworkTimeout time.Duration
PollInterval time.Duration
MaxPendingTransactions uint64
}
// BatcherService represents a full batch-submitter instance and its resources,
// and conforms to the op-service CLI Lifecycle interface.
type BatcherService struct {
Log log.Logger
Metrics metrics.Metricer
L1Client *ethclient.Client
L2Client *ethclient.Client
RollupNode *sources.RollupClient
TxManager txmgr.TxManager
BatcherConfig
RollupConfig *rollup.Config
// Channel builder parameters
Channel ChannelConfig
driver *BatchSubmitter
Version string
pprofSrv *httputil.HTTPServer
metricsSrv *httputil.HTTPServer
rpcServer *oprpc.Server
balanceMetricer io.Closer
stopped atomic.Bool
NotSubmittingOnStart bool
}
// BatcherServiceFromCLIConfig creates a new BatcherService from a CLIConfig.
// The service components are fully started, except for the driver,
// which will not be submitting batches (if it was configured to) until the Start part of the lifecycle.
func BatcherServiceFromCLIConfig(ctx context.Context, version string, cfg *CLIConfig, log log.Logger) (*BatcherService, error) {
var bs BatcherService
if err := bs.initFromCLIConfig(ctx, version, cfg, log); err != nil {
return nil, errors.Join(err, bs.Stop(ctx)) // try to clean up our failed initialization attempt
}
return &bs, nil
}
func (bs *BatcherService) initFromCLIConfig(ctx context.Context, version string, cfg *CLIConfig, log log.Logger) error {
bs.Version = version
bs.Log = log
bs.NotSubmittingOnStart = cfg.Stopped
bs.initMetrics(cfg)
bs.PollInterval = cfg.PollInterval
bs.MaxPendingTransactions = cfg.MaxPendingTransactions
bs.NetworkTimeout = cfg.TxMgrConfig.NetworkTimeout
if err := bs.initRPCClients(ctx, cfg); err != nil {
return err
}
if err := bs.initRollupCfg(ctx); err != nil {
return fmt.Errorf("failed to load rollup config: %w", err)
}
if err := bs.initChannelConfig(cfg); err != nil {
return fmt.Errorf("failed to init channel config: %w", err)
}
if err := bs.initTxManager(cfg); err != nil {
return fmt.Errorf("failed to init Tx manager: %w", err)
}
bs.initBalanceMonitor(cfg)
if err := bs.initMetricsServer(cfg); err != nil {
return fmt.Errorf("failed to start metrics server: %w", err)
}
if err := bs.initPProf(cfg); err != nil {
return fmt.Errorf("failed to start pprof server: %w", err)
}
bs.initDriver()
if err := bs.initRPCServer(cfg); err != nil {
return fmt.Errorf("failed to start RPC server: %w", err)
}
bs.Metrics.RecordInfo(bs.Version)
bs.Metrics.RecordUp()
return nil
}
func (bs *BatcherService) initRPCClients(ctx context.Context, cfg *CLIConfig) error {
l1Client, err := dial.DialEthClientWithTimeout(ctx, dial.DefaultDialTimeout, bs.Log, cfg.L1EthRpc)
if err != nil {
return fmt.Errorf("failed to dial L1 RPC: %w", err)
}
bs.L1Client = l1Client
l2Client, err := dial.DialEthClientWithTimeout(ctx, dial.DefaultDialTimeout, bs.Log, cfg.L2EthRpc)
if err != nil {
return fmt.Errorf("failed to dial L2 engine RPC: %w", err)
}
bs.L2Client = l2Client
rollupClient, err := dial.DialRollupClientWithTimeout(ctx, dial.DefaultDialTimeout, bs.Log, cfg.RollupRpc)
if err != nil {
return fmt.Errorf("failed to dial L2 rollup-client RPC: %w", err)
}
bs.RollupNode = rollupClient
return nil
}
func (bs *BatcherService) initMetrics(cfg *CLIConfig) {
if cfg.MetricsConfig.Enabled {
procName := "default"
bs.Metrics = metrics.NewMetrics(procName)
} else {
bs.Metrics = metrics.NoopMetrics
}
}
// initBalanceMonitor depends on Metrics, L1Client and TxManager to start background-monitoring of the batcher balance.
func (bs *BatcherService) initBalanceMonitor(cfg *CLIConfig) {
if cfg.MetricsConfig.Enabled {
bs.balanceMetricer = bs.Metrics.StartBalanceMetrics(bs.Log, bs.L1Client, bs.TxManager.From())
}
}
func (bs *BatcherService) initRollupCfg(ctx context.Context) error {
rollupCfg, err := bs.RollupNode.RollupConfig(ctx)
if err != nil {
return fmt.Errorf("failed to retrieve rollup config: %w", err)
}
bs.RollupConfig = rollupCfg
if err := bs.RollupConfig.Check(); err != nil {
return fmt.Errorf("invalid rollup config: %w", err)
}
return nil
}
func (bs *BatcherService) initChannelConfig(cfg *CLIConfig) error {
bs.Channel = ChannelConfig{
SeqWindowSize: bs.RollupConfig.SeqWindowSize,
ChannelTimeout: bs.RollupConfig.ChannelTimeout,
MaxChannelDuration: cfg.MaxChannelDuration,
SubSafetyMargin: cfg.SubSafetyMargin,
MaxFrameSize: cfg.MaxL1TxSize - 1, // subtract 1 byte for version
CompressorConfig: cfg.CompressorConfig.Config(),
}
if err := bs.Channel.Check(); err != nil {
return fmt.Errorf("invalid channel configuration: %w", err)
}
return nil
}
func (bs *BatcherService) initTxManager(cfg *CLIConfig) error {
txManager, err := txmgr.NewSimpleTxManager("batcher", bs.Log, bs.Metrics, cfg.TxMgrConfig)
if err != nil {
return err
}
bs.TxManager = txManager
return nil
}
func (bs *BatcherService) initPProf(cfg *CLIConfig) error {
if !cfg.PprofConfig.Enabled {
return nil
}
log.Debug("starting pprof server", "addr", net.JoinHostPort(cfg.PprofConfig.ListenAddr, strconv.Itoa(cfg.PprofConfig.ListenPort)))
srv, err := oppprof.StartServer(cfg.PprofConfig.ListenAddr, cfg.PprofConfig.ListenPort)
if err != nil {
return err
}
bs.pprofSrv = srv
log.Info("started pprof server", "addr", srv.Addr())
return nil
}
func (bs *BatcherService) initMetricsServer(cfg *CLIConfig) error {
if !cfg.MetricsConfig.Enabled {
bs.Log.Info("metrics disabled")
return nil
}
m, ok := bs.Metrics.(opmetrics.RegistryMetricer)
if !ok {
return fmt.Errorf("metrics were enabled, but metricer %T does not expose registry for metrics-server", bs.Metrics)
}
bs.Log.Debug("starting metrics server", "addr", cfg.MetricsConfig.ListenAddr, "port", cfg.MetricsConfig.ListenPort)
metricsSrv, err := opmetrics.StartServer(m.Registry(), cfg.MetricsConfig.ListenAddr, cfg.MetricsConfig.ListenPort)
if err != nil {
return fmt.Errorf("failed to start metrics server: %w", err)
}
bs.Log.Info("started metrics server", "addr", metricsSrv.Addr())
bs.metricsSrv = metricsSrv
return nil
}
func (bs *BatcherService) initDriver() {
bs.driver = NewBatchSubmitter(DriverSetup{
Log: bs.Log,
Metr: bs.Metrics,
RollupCfg: bs.RollupConfig,
Cfg: bs.BatcherConfig,
Txmgr: bs.TxManager,
L1Client: bs.L1Client,
L2Client: bs.L2Client,
RollupClient: bs.RollupNode,
Channel: bs.Channel,
})
}
func (bs *BatcherService) initRPCServer(cfg *CLIConfig) error {
server := oprpc.NewServer(
cfg.RPC.ListenAddr,
cfg.RPC.ListenPort,
bs.Version,
oprpc.WithLogger(bs.Log),
)
if cfg.RPC.EnableAdmin {
adminAPI := rpc.NewAdminAPI(bs.driver, bs.Metrics, bs.Log)
server.AddAPI(rpc.GetAdminAPI(adminAPI))
bs.Log.Info("Admin RPC enabled")
}
bs.Log.Info("Starting JSON-RPC server")
if err := server.Start(); err != nil {
return fmt.Errorf("unable to start RPC server: %w", err)
}
bs.rpcServer = server
return nil
}
// Start runs once upon start of the batcher lifecycle,
// and starts batch-submission work if the batcher is configured to start submit data on startup.
func (bs *BatcherService) Start(_ context.Context) error {
bs.driver.Log.Info("Starting batcher", "notSubmittingOnStart", bs.NotSubmittingOnStart)
if !bs.NotSubmittingOnStart {
return bs.driver.StartBatchSubmitting()
}
return nil
}
// Stopped returns if the service as a whole is stopped.
func (bs *BatcherService) Stopped() bool {
return bs.stopped.Load()
}
// Kill is a convenience method to forcefully, non-gracefully, stop the BatcherService.
func (bs *BatcherService) Kill() error {
ctx, cancel := context.WithCancel(context.Background())
cancel()
return bs.Stop(ctx)
}
// Stop fully stops the batch-submitter and all its resources gracefully. After stopping, it cannot be restarted.
// See driver.StopBatchSubmitting to temporarily stop the batch submitter.
// If the provided ctx is cancelled, the stopping is forced, i.e. the batching work is killed non-gracefully.
func (bs *BatcherService) Stop(ctx context.Context) error {
if bs.stopped.Load() {
return errors.New("already stopped")
}
bs.Log.Info("Stopping batcher")
var result error
if err := bs.driver.StopBatchSubmittingIfRunning(ctx); err != nil {
result = errors.Join(result, fmt.Errorf("failed to stop batch submitting: %w", err))
}
if bs.rpcServer != nil {
// TODO(7685): the op-service RPC server is not built on top of op-service httputil Server, and has poor shutdown
if err := bs.rpcServer.Stop(); err != nil {
result = errors.Join(result, fmt.Errorf("failed to stop RPC server: %w", err))
}
}
if bs.pprofSrv != nil {
if err := bs.pprofSrv.Stop(ctx); err != nil {
result = errors.Join(result, fmt.Errorf("failed to stop PProf server: %w", err))
}
}
if bs.balanceMetricer != nil {
if err := bs.balanceMetricer.Close(); err != nil {
result = errors.Join(result, fmt.Errorf("failed to close balance metricer: %w", err))
}
}
if bs.metricsSrv != nil {
if err := bs.metricsSrv.Stop(ctx); err != nil {
result = errors.Join(result, fmt.Errorf("failed to stop metrics server: %w", err))
}
}
if bs.L1Client != nil {
bs.L1Client.Close()
}
if bs.L2Client != nil {
bs.L2Client.Close()
}
if bs.RollupNode != nil {
bs.RollupNode.Close()
}
if result == nil {
bs.stopped.Store(true)
bs.driver.Log.Info("Batch Submitter stopped")
}
return result
}
var _ cliapp.Lifecycle = (*BatcherService)(nil)
// Driver returns the handler on the batch-submitter driver element,
// to start/stop/restart the batch-submission work, for use in testing.
func (bs *BatcherService) Driver() rpc.BatcherDriver {
return bs.driver
}
package main
import (
"fmt"
"os"
opservice "github.com/ethereum-optimism/optimism/op-service"
"github.com/urfave/cli/v2"
"github.com/ethereum-optimism/optimism/op-batcher/batcher"
......@@ -26,11 +26,11 @@ func main() {
app := cli.NewApp()
app.Flags = cliapp.ProtectFlags(flags.Flags)
app.Version = fmt.Sprintf("%s-%s-%s", Version, GitCommit, GitDate)
app.Version = opservice.FormatVersion(Version, GitCommit, GitDate, "")
app.Name = "op-batcher"
app.Usage = "Batch Submitter Service"
app.Description = "Service for generating and submitting L2 tx batches to L1"
app.Action = curryMain(Version)
app.Action = cliapp.LifecycleCmd(batcher.Main(Version))
app.Commands = []*cli.Command{
{
Name: "doc",
......@@ -43,11 +43,3 @@ func main() {
log.Crit("Application failed", "message", err)
}
}
// curryMain transforms the batcher.Main function into an app.Action
// This is done to capture the Version of the batcher.
func curryMain(version string) func(ctx *cli.Context) error {
return func(ctx *cli.Context) error {
return batcher.Main(version, ctx)
}
}
package metrics
import (
"context"
"io"
"github.com/prometheus/client_golang/prometheus"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/log"
"github.com/prometheus/client_golang/prometheus"
"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
"github.com/ethereum-optimism/optimism/op-service/eth"
"github.com/ethereum-optimism/optimism/op-service/httputil"
opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics"
txmetrics "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics"
)
......@@ -28,6 +28,10 @@ type Metricer interface {
// Record Tx metrics
txmetrics.TxMetricer
opmetrics.RPCMetricer
StartBalanceMetrics(l log.Logger, client *ethclient.Client, account common.Address) io.Closer
RecordLatestL1Block(l1ref eth.L1BlockRef)
RecordL2BlocksLoaded(l2ref eth.L2BlockRef)
RecordChannelOpened(id derive.ChannelID, numPendingBlocks int)
......@@ -79,6 +83,9 @@ type Metrics struct {
var _ Metricer = (*Metrics)(nil)
// implements the Registry getter, for metrics HTTP server to hook into
var _ opmetrics.RegistryMetricer = (*Metrics)(nil)
func NewMetrics(procName string) *Metrics {
if procName == "" {
procName = "default"
......@@ -179,17 +186,16 @@ func NewMetrics(procName string) *Metrics {
}
}
func (m *Metrics) Start(host string, port int) (*httputil.HTTPServer, error) {
return opmetrics.StartServer(m.registry, host, port)
func (m *Metrics) Registry() *prometheus.Registry {
return m.registry
}
func (m *Metrics) Document() []opmetrics.DocumentedMetric {
return m.factory.Document()
}
func (m *Metrics) StartBalanceMetrics(ctx context.Context,
l log.Logger, client *ethclient.Client, account common.Address) {
opmetrics.LaunchBalanceMetrics(ctx, l, m.registry, m.ns, client, account)
func (m *Metrics) StartBalanceMetrics(l log.Logger, client *ethclient.Client, account common.Address) io.Closer {
return opmetrics.LaunchBalanceMetrics(l, m.registry, m.ns, client, account)
}
// RecordInfo sets a pseudo-metric that contains versioning and
......
package metrics
import (
"io"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
"github.com/ethereum-optimism/optimism/op-service/eth"
opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics"
txmetrics "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics"
"github.com/ethereum/go-ethereum/core/types"
)
type noopMetrics struct {
opmetrics.NoopRefMetrics
txmetrics.NoopTxMetrics
opmetrics.NoopRPCMetrics
}
var NoopMetrics Metricer = new(noopMetrics)
......@@ -35,3 +42,6 @@ func (*noopMetrics) RecordChannelTimedOut(derive.ChannelID) {}
func (*noopMetrics) RecordBatchTxSubmitted() {}
func (*noopMetrics) RecordBatchTxSuccess() {}
func (*noopMetrics) RecordBatchTxFailed() {}
func (*noopMetrics) StartBalanceMetrics(log.Logger, *ethclient.Client, common.Address) io.Closer {
return nil
}
......@@ -10,17 +10,17 @@ import (
"github.com/ethereum-optimism/optimism/op-service/rpc"
)
type batcherClient interface {
Start() error
Stop(ctx context.Context) error
type BatcherDriver interface {
StartBatchSubmitting() error
StopBatchSubmitting(ctx context.Context) error
}
type adminAPI struct {
*rpc.CommonAdminAPI
b batcherClient
b BatcherDriver
}
func NewAdminAPI(dr batcherClient, m metrics.RPCMetricer, log log.Logger) *adminAPI {
func NewAdminAPI(dr BatcherDriver, m metrics.RPCMetricer, log log.Logger) *adminAPI {
return &adminAPI{
CommonAdminAPI: rpc.NewCommonAdminAPI(m, log),
b: dr,
......@@ -35,9 +35,9 @@ func GetAdminAPI(api *adminAPI) gethrpc.API {
}
func (a *adminAPI) StartBatcher(_ context.Context) error {
return a.b.Start()
return a.b.StartBatchSubmitting()
}
func (a *adminAPI) StopBatcher(ctx context.Context) error {
return a.b.Stop(ctx)
return a.b.StopBatchSubmitting(ctx)
}
......@@ -5,6 +5,7 @@ import (
"os"
op_challenger "github.com/ethereum-optimism/optimism/op-challenger"
opservice "github.com/ethereum-optimism/optimism/op-service"
"github.com/ethereum/go-ethereum/log"
"github.com/urfave/cli/v2"
......@@ -21,19 +22,7 @@ var (
)
// VersionWithMeta holds the textual version string including the metadata.
var VersionWithMeta = func() string {
v := version.Version
if GitCommit != "" {
v += "-" + GitCommit[:8]
}
if GitDate != "" {
v += "-" + GitDate
}
if version.Meta != "" {
v += "-" + version.Meta
}
return v
}()
var VersionWithMeta = opservice.FormatVersion(version.Version, GitCommit, GitDate, version.Meta)
func main() {
args := os.Args
......
......@@ -34,7 +34,7 @@ type OutputTraceProvider struct {
}
func NewTraceProvider(ctx context.Context, logger log.Logger, rollupRpc string, gameDepth, prestateBlock, poststateBlock uint64) (*OutputTraceProvider, error) {
rollupClient, err := dial.DialRollupClientWithTimeout(dial.DefaultDialTimeout, logger, rollupRpc)
rollupClient, err := dial.DialRollupClientWithTimeout(ctx, dial.DefaultDialTimeout, logger, rollupRpc)
if err != nil {
return nil, err
}
......
......@@ -55,7 +55,7 @@ func NewService(ctx context.Context, logger log.Logger, cfg *config.Config) (*Se
return nil, fmt.Errorf("failed to create the transaction manager: %w", err)
}
l1Client, err := dial.DialEthClientWithTimeout(dial.DefaultDialTimeout, logger, cfg.L1EthRpc)
l1Client, err := dial.DialEthClientWithTimeout(ctx, dial.DefaultDialTimeout, logger, cfg.L1EthRpc)
if err != nil {
return nil, fmt.Errorf("failed to dial L1: %w", err)
}
......
......@@ -133,7 +133,12 @@ func (m *Metrics) StartBalanceMetrics(
client *ethclient.Client,
account common.Address,
) {
opmetrics.LaunchBalanceMetrics(ctx, l, m.registry, m.ns, client, account)
// TODO(7684): util was refactored to close, but ctx is still being used by caller for shutdown
balanceMetric := opmetrics.LaunchBalanceMetrics(l, m.registry, m.ns, client, account)
go func() {
<-ctx.Done()
_ = balanceMetric.Close()
}()
}
// RecordInfo sets a pseudo-metric that contains versioning and
......
......@@ -127,9 +127,9 @@ func TestL2EngineAPIBlockBuilding(gt *testing.T) {
nextBlockTime := eth.Uint64Quantity(parent.Time) + 2
var w *eth.Withdrawals
var w *types.Withdrawals
if sd.RollupCfg.IsCanyon(uint64(nextBlockTime)) {
w = &eth.Withdrawals{}
w = &types.Withdrawals{}
}
// Now let's ask the engine to build a block
......
package geth
import (
"math/rand"
"time"
"github.com/ethereum-optimism/optimism/op-service/clock"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/beacon/engine"
"github.com/ethereum/go-ethereum/common"
......@@ -12,6 +12,9 @@ import (
"github.com/ethereum/go-ethereum/eth/catalyst"
"github.com/ethereum/go-ethereum/event"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum-optimism/optimism/op-service/clock"
"github.com/ethereum-optimism/optimism/op-service/testutils"
)
// fakePoS is a testing-only utility to attach to Geth,
......@@ -22,6 +25,8 @@ type fakePoS struct {
log log.Logger
blockTime uint64
withdrawalsIndex uint64
finalizedDistance uint64
safeDistance uint64
......@@ -33,6 +38,7 @@ func (f *fakePoS) Start() error {
if advancing, ok := f.clock.(*clock.AdvancingClock); ok {
advancing.Start()
}
withdrawalsRNG := rand.New(rand.NewSource(450368975843)) // avoid generating the same address as any test
f.sub = event.NewSubscription(func(quit <-chan struct{}) error {
// poll every half a second: enough to catch up with any block time when ticks are missed
t := f.clock.NewTicker(time.Second / 2)
......@@ -64,6 +70,17 @@ func (f *fakePoS) Start() error {
// We're a long way behind, let's skip some blocks...
newBlockTime = uint64(f.clock.Now().Unix())
}
// create some random withdrawals
withdrawals := make([]*types.Withdrawal, withdrawalsRNG.Intn(4))
for i := 0; i < len(withdrawals); i++ {
withdrawals[i] = &types.Withdrawal{
Index: f.withdrawalsIndex + uint64(i),
Validator: withdrawalsRNG.Uint64() % 100_000_000, // 100 million fake validators
Address: testutils.RandomAddress(withdrawalsRNG),
// in gwei, consensus-layer quirk. withdraw non-zero value up to 50 ETH
Amount: uint64(withdrawalsRNG.Intn(50_000_000_000) + 1),
}
}
res, err := f.engineAPI.ForkchoiceUpdatedV2(engine.ForkchoiceStateV1{
HeadBlockHash: head.Hash(),
SafeBlockHash: safe.Hash(),
......@@ -72,7 +89,7 @@ func (f *fakePoS) Start() error {
Timestamp: newBlockTime,
Random: common.Hash{},
SuggestedFeeRecipient: head.Coinbase,
Withdrawals: make([]*types.Withdrawal, 0),
Withdrawals: withdrawals,
})
if err != nil {
f.log.Error("failed to start building L1 block", "err", err)
......@@ -109,6 +126,10 @@ func (f *fakePoS) Start() error {
f.log.Error("failed to make built L1 block canonical", "err", err)
continue
}
// Increment global withdrawals index in the CL.
// The EL doesn't really care about the value,
// but it's nice to mock something consistent with the CL specs.
f.withdrawalsIndex += uint64(len(withdrawals))
case <-quit:
return nil
}
......
......@@ -210,9 +210,9 @@ func (d *OpGeth) CreatePayloadAttributes(txs ...*types.Transaction) (*eth.Payloa
txBytes = append(txBytes, bin)
}
var withdrawals *eth.Withdrawals
var withdrawals *types.Withdrawals
if d.L2ChainConfig.IsCanyon(uint64(timestamp)) {
withdrawals = &eth.Withdrawals{}
withdrawals = &types.Withdrawals{}
}
attrs := eth.PayloadAttributes{
......
......@@ -823,7 +823,7 @@ func TestCanyon(t *testing.T) {
b, err := opGeth.AddL2Block(ctx)
require.NoError(t, err)
assert.Equal(t, *b.Withdrawals, eth.Withdrawals{})
assert.Equal(t, *b.Withdrawals, types.Withdrawals{})
l1Block, err := opGeth.L2Client.BlockByNumber(ctx, nil)
require.Nil(t, err)
......
......@@ -4,6 +4,7 @@ import (
"context"
"crypto/ecdsa"
"crypto/rand"
"errors"
"fmt"
"math/big"
"net"
......@@ -37,7 +38,6 @@ import (
bss "github.com/ethereum-optimism/optimism/op-batcher/batcher"
"github.com/ethereum-optimism/optimism/op-batcher/compressor"
batchermetrics "github.com/ethereum-optimism/optimism/op-batcher/metrics"
"github.com/ethereum-optimism/optimism/op-bindings/predeploys"
"github.com/ethereum-optimism/optimism/op-chain-ops/genesis"
"github.com/ethereum-optimism/optimism/op-e2e/config"
......@@ -254,7 +254,7 @@ type System struct {
RawClients map[string]*rpc.Client
RollupNodes map[string]*rollupNode.OpNode
L2OutputSubmitter *l2os.L2OutputSubmitter
BatchSubmitter *bss.BatchSubmitter
BatchSubmitter *bss.BatcherService
Mocknet mocknet.Mocknet
// TimeTravelClock is nil unless SystemConfig.SupportL1TimeTravel was set to true
......@@ -270,18 +270,16 @@ func (sys *System) NodeEndpoint(name string) string {
}
func (sys *System) Close() {
postCtx, postCancel := context.WithCancel(context.Background())
postCancel() // immediate shutdown, no allowance for idling
if sys.L2OutputSubmitter != nil {
sys.L2OutputSubmitter.Stop()
}
if sys.BatchSubmitter != nil {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
sys.BatchSubmitter.StopIfRunning(ctx)
_ = sys.BatchSubmitter.Kill()
}
postCtx, postCancel := context.WithCancel(context.Background())
postCancel() // immediate shutdown, no allowance for idling
for _, node := range sys.RollupNodes {
_ = node.Stop(postCtx)
}
......@@ -681,8 +679,7 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste
return nil, fmt.Errorf("unable to start l2 output submitter: %w", err)
}
// Batch Submitter
sys.BatchSubmitter, err = bss.NewBatchSubmitterFromCLIConfig(bss.CLIConfig{
batcherCLIConfig := &bss.CLIConfig{
L1EthRpc: sys.EthInstances["l1"].WSEndpoint(),
L2EthRpc: sys.EthInstances["sequencer"].WSEndpoint(),
RollupRpc: sys.RollupNodes["sequencer"].HTTPEndpoint(),
......@@ -701,17 +698,17 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste
Level: log.LvlInfo,
Format: oplog.FormatText,
},
}, sys.cfg.Loggers["batcher"], batchermetrics.NoopMetrics)
Stopped: sys.cfg.DisableBatcher, // Batch submitter may be enabled later
}
// Batch Submitter
batcher, err := bss.BatcherServiceFromCLIConfig(context.Background(), "0.0.1", batcherCLIConfig, sys.cfg.Loggers["batcher"])
if err != nil {
return nil, fmt.Errorf("failed to setup batch submitter: %w", err)
}
// Batcher may be enabled later
if !sys.cfg.DisableBatcher {
if err := sys.BatchSubmitter.Start(); err != nil {
return nil, fmt.Errorf("unable to start batch submitter: %w", err)
}
if err := batcher.Start(context.Background()); err != nil {
return nil, errors.Join(fmt.Errorf("failed to start batch submitter: %w", err), batcher.Stop(context.Background()))
}
sys.BatchSubmitter = batcher
return sys, nil
}
......
......@@ -93,7 +93,7 @@ func testVerifyL2OutputRootEmptyBlock(t *testing.T, detached bool) {
l2OutputRoot := agreedL2Output.OutputRoot
t.Log("=====Stopping batch submitter=====")
err = sys.BatchSubmitter.Stop(ctx)
err = sys.BatchSubmitter.Driver().StopBatchSubmitting(ctx)
require.NoError(t, err, "could not stop batch submitter")
// Wait for the sequencer to catch up with the current L1 head so we know all submitted batches are processed
......@@ -121,7 +121,7 @@ func testVerifyL2OutputRootEmptyBlock(t *testing.T, detached bool) {
l2Claim := l2Output.OutputRoot
t.Log("=====Restarting batch submitter=====")
err = sys.BatchSubmitter.Start()
err = sys.BatchSubmitter.Driver().StartBatchSubmitting()
require.NoError(t, err, "could not start batch submitter")
t.Log("Add a transaction to the next batch after sequence of empty blocks")
......@@ -258,7 +258,7 @@ func testFaultProofProgramScenario(t *testing.T, ctx context.Context, sys *Syste
t.Log("Shutting down network")
// Shutdown the nodes from the actual chain. Should now be able to run using only the pre-fetched data.
sys.BatchSubmitter.StopIfRunning(context.Background())
require.NoError(t, sys.BatchSubmitter.Kill())
sys.L2OutputSubmitter.Stop()
sys.L2OutputSubmitter = nil
for _, node := range sys.EthInstances {
......
......@@ -1266,7 +1266,7 @@ func TestStopStartBatcher(t *testing.T) {
require.Greater(t, newSeqStatus.SafeL2.Number, seqStatus.SafeL2.Number, "Safe chain did not advance")
// stop the batch submission
err = sys.BatchSubmitter.Stop(context.Background())
err = sys.BatchSubmitter.Driver().StopBatchSubmitting(context.Background())
require.Nil(t, err)
// wait for any old safe blocks being submitted / derived
......@@ -1286,7 +1286,7 @@ func TestStopStartBatcher(t *testing.T) {
require.Equal(t, newSeqStatus.SafeL2.Number, seqStatus.SafeL2.Number, "Safe chain advanced while batcher was stopped")
// start the batch submission
err = sys.BatchSubmitter.Start()
err = sys.BatchSubmitter.Driver().StartBatchSubmitting()
require.Nil(t, err)
time.Sleep(safeBlockInclusionDuration)
......@@ -1325,7 +1325,7 @@ func TestBatcherMultiTx(t *testing.T) {
require.Nil(t, err)
// start batch submission
err = sys.BatchSubmitter.Start()
err = sys.BatchSubmitter.Driver().StartBatchSubmitting()
require.Nil(t, err)
totalTxCount := 0
......
package main
import (
"fmt"
"os"
heartbeat "github.com/ethereum-optimism/optimism/op-heartbeat"
"github.com/ethereum-optimism/optimism/op-heartbeat/flags"
opservice "github.com/ethereum-optimism/optimism/op-service"
oplog "github.com/ethereum-optimism/optimism/op-service/log"
"github.com/ethereum/go-ethereum/log"
"github.com/urfave/cli/v2"
......@@ -22,7 +22,7 @@ func main() {
app := cli.NewApp()
app.Flags = flags.Flags
app.Version = fmt.Sprintf("%s-%s-%s", Version, GitCommit, GitDate)
app.Version = opservice.FormatVersion(Version, GitCommit, GitDate, "")
app.Name = "op-heartbeat"
app.Usage = "Heartbeat recorder"
app.Description = "Service that records opt-in heartbeats from op nodes"
......
......@@ -29,19 +29,7 @@ var (
)
// VersionWithMeta holds the textual version string including the metadata.
var VersionWithMeta = func() string {
v := version.Version
if GitCommit != "" {
v += "-" + GitCommit[:8]
}
if GitDate != "" {
v += "-" + GitDate
}
if version.Meta != "" {
v += "-" + version.Meta
}
return v
}()
var VersionWithMeta = opservice.FormatVersion(version.Version, GitCommit, GitDate, version.Meta)
func main() {
// Set up logger with a default INFO level in case we fail to parse flags,
......
......@@ -604,7 +604,9 @@ func (m *Metrics) ReportProtocolVersions(local, engine, recommended, required pa
m.ProtocolVersions.WithLabelValues(local.String(), engine.String(), recommended.String(), required.String()).Set(1)
}
type noopMetricer struct{}
type noopMetricer struct {
metrics.NoopRPCMetrics
}
var NoopMetrics Metricer = new(noopMetricer)
......@@ -614,17 +616,6 @@ func (n *noopMetricer) RecordInfo(version string) {
func (n *noopMetricer) RecordUp() {
}
func (n *noopMetricer) RecordRPCServerRequest(method string) func() {
return func() {}
}
func (n *noopMetricer) RecordRPCClientRequest(method string) func(err error) {
return func(err error) {}
}
func (n *noopMetricer) RecordRPCClientResponse(method string, err error) {
}
func (n *noopMetricer) SetDerivationIdle(status bool) {
}
......
......@@ -109,9 +109,9 @@ func (ba *FetchingAttributesBuilder) PreparePayloadAttributes(ctx context.Contex
txs = append(txs, l1InfoTx)
txs = append(txs, depositTxs...)
var withdrawals *eth.Withdrawals
var withdrawals *types.Withdrawals
if ba.cfg.IsCanyon(nextL2Time) {
withdrawals = &eth.Withdrawals{}
withdrawals = &types.Withdrawals{}
}
return &eth.PayloadAttributes{
......
......@@ -47,7 +47,7 @@ func AttributesMatchBlock(attrs *eth.PayloadAttributes, parentHash common.Hash,
return nil
}
func checkWithdrawalsMatch(attrWithdrawals *eth.Withdrawals, blockWithdrawals *eth.Withdrawals) error {
func checkWithdrawalsMatch(attrWithdrawals *types.Withdrawals, blockWithdrawals *types.Withdrawals) error {
if attrWithdrawals == nil && blockWithdrawals == nil {
return nil
}
......@@ -67,7 +67,7 @@ func checkWithdrawalsMatch(attrWithdrawals *eth.Withdrawals, blockWithdrawals *e
for idx, expected := range *attrWithdrawals {
actual := (*blockWithdrawals)[idx]
if expected != actual {
if *expected != *actual {
return fmt.Errorf("expected withdrawal %d to be %v, actual %v", idx, expected, actual)
}
}
......
......@@ -3,14 +3,15 @@ package derive
import (
"testing"
"github.com/ethereum-optimism/optimism/op-service/eth"
"github.com/stretchr/testify/require"
"github.com/ethereum/go-ethereum/core/types"
)
func TestWithdrawalsMatch(t *testing.T) {
tests := []struct {
attrs *eth.Withdrawals
block *eth.Withdrawals
attrs *types.Withdrawals
block *types.Withdrawals
shouldMatch bool
}{
{
......@@ -19,36 +20,36 @@ func TestWithdrawalsMatch(t *testing.T) {
shouldMatch: true,
},
{
attrs: &eth.Withdrawals{},
attrs: &types.Withdrawals{},
block: nil,
shouldMatch: false,
},
{
attrs: nil,
block: &eth.Withdrawals{},
block: &types.Withdrawals{},
shouldMatch: false,
},
{
attrs: &eth.Withdrawals{},
block: &eth.Withdrawals{},
attrs: &types.Withdrawals{},
block: &types.Withdrawals{},
shouldMatch: true,
},
{
attrs: &eth.Withdrawals{
attrs: &types.Withdrawals{
{
Index: 1,
},
},
block: &eth.Withdrawals{},
block: &types.Withdrawals{},
shouldMatch: false,
},
{
attrs: &eth.Withdrawals{
attrs: &types.Withdrawals{
{
Index: 1,
},
},
block: &eth.Withdrawals{
block: &types.Withdrawals{
{
Index: 2,
},
......
......@@ -8,6 +8,8 @@ LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-program/version.Vers
LDFLAGSSTRING +=-X github.com/ethereum-optimism/optimism/op-program/version.Meta=$(VERSION_META)
LDFLAGS := -ldflags "$(LDFLAGSSTRING)"
COMPAT_DIR := temp/compat
op-program: \
op-program-host \
op-program-client \
......@@ -25,13 +27,26 @@ op-program-client-mips:
# result is mips32, big endian, R3000
clean:
rm -rf bin
rm -rf bin "$(COMPAT_DIR)"
test:
go test -v ./...
verify-goerli: op-program-host op-program-client
env GO111MODULE=on go run ./verify/cmd/goerli.go $$L1URL $$L2URL
env GO111MODULE=on go run ./verify/cmd/goerli.go --l1 $$L1URL --l2 $$L2URL
capture-goerli-verify: op-program-host op-program-client
rm -rf "$(COMPAT_DIR)/goerli" "$(COMPAT_DIR)/goerli.tar.bz"
env GO111MODULE=on go run ./verify/cmd/goerli.go --l1 $$L1URL --l2 $$L2URL --datadir "$(COMPAT_DIR)/goerli"
tar jcf "$(COMPAT_DIR)/goerli.tar.bz" -C "$(COMPAT_DIR)" goerli
capture-chain-test-data: capture-goerli-verify
run-goerli-verify: op-program-host op-program-client
mkdir -p "$(COMPAT_DIR)"
curl -L -o "$(COMPAT_DIR)/goerli.tar.bz" https://github.com/ethereum-optimism/chain-test-data/releases/download/2023-10-11/goerli.tar.bz
tar jxf "$(COMPAT_DIR)/goerli.tar.bz" -C "$(COMPAT_DIR)"
./bin/op-program `cat "$(COMPAT_DIR)/goerli/args.txt"`
.PHONY: \
op-program \
......
......@@ -57,9 +57,9 @@ func RunEngineAPITests(t *testing.T, createBackend func(t *testing.T) engineapi.
nextBlockTime := eth.Uint64Quantity(genesis.Time + 1)
var w *eth.Withdrawals
var w *types.Withdrawals
if api.backend.Config().IsCanyon(uint64(nextBlockTime)) {
w = &eth.Withdrawals{}
w = &types.Withdrawals{}
}
result, err := api.engine.ForkchoiceUpdatedV2(api.ctx, &eth.ForkchoiceState{
......@@ -111,9 +111,9 @@ func RunEngineAPITests(t *testing.T, createBackend func(t *testing.T) engineapi.
t.Run("RejectInvalidBlockHash", func(t *testing.T) {
api := newTestHelper(t, createBackend)
var w *eth.Withdrawals
var w *types.Withdrawals
if api.backend.Config().IsCanyon(uint64(0)) {
w = &eth.Withdrawals{}
w = &types.Withdrawals{}
}
// Invalid because BlockHash won't be correct (among many other reasons)
......@@ -385,9 +385,9 @@ func (h *testHelper) startBlockBuilding(head *types.Header, newBlockTimestamp et
}
canyonTime := h.backend.Config().CanyonTime
var w *eth.Withdrawals
var w *types.Withdrawals
if canyonTime != nil && *canyonTime <= uint64(newBlockTimestamp) {
w = &eth.Withdrawals{}
w = &types.Withdrawals{}
}
result, err := h.engine.ForkchoiceUpdatedV2(h.ctx, &eth.ForkchoiceState{
......
......@@ -7,6 +7,7 @@ import (
"github.com/ethereum-optimism/optimism/op-program/host/config"
"github.com/ethereum-optimism/optimism/op-program/host/flags"
"github.com/ethereum-optimism/optimism/op-program/host/version"
opservice "github.com/ethereum-optimism/optimism/op-service"
oplog "github.com/ethereum-optimism/optimism/op-service/log"
"github.com/ethereum/go-ethereum/log"
"github.com/urfave/cli/v2"
......@@ -18,19 +19,7 @@ var (
)
// VersionWithMeta holds the textual version string including the metadata.
var VersionWithMeta = func() string {
v := version.Version
if GitCommit != "" {
v += "-" + GitCommit[:8]
}
if GitDate != "" {
v += "-" + GitDate
}
if version.Meta != "" {
v += "-" + version.Meta
}
return v
}()
var VersionWithMeta = opservice.FormatVersion(version.Version, GitCommit, GitDate, version.Meta)
func main() {
args := os.Args
......
......@@ -2,10 +2,13 @@ package main
import (
"context"
"flag"
"fmt"
"math/big"
"os"
"os/exec"
"path/filepath"
"strings"
"time"
"github.com/ethereum-optimism/optimism/op-bindings/bindings"
......@@ -15,28 +18,32 @@ import (
"github.com/ethereum/go-ethereum/rpc"
)
const agreedBlockTrailingDistance = 100
func main() {
if len(os.Args) < 3 {
_, _ = fmt.Fprintln(os.Stderr, "Must specify L1 RPC URL and L2 RPC URL as arguments")
var l1RpcUrl string
var l1RpcKind string
var l2RpcUrl string
var dataDir string
flag.StringVar(&l1RpcUrl, "l1", "", "L1 RPC URL to use")
flag.StringVar(&l1RpcKind, "l1-rpckind", "alchemy", "L1 RPC kind")
flag.StringVar(&l2RpcUrl, "l2", "", "L2 RPC URL to use")
flag.StringVar(&dataDir, "datadir", "",
"Directory to use for storing pre-images. If not set a temporary directory will be used.")
flag.Parse()
if l1RpcUrl == "" || l2RpcUrl == "" {
_, _ = fmt.Fprintln(os.Stderr, "Must specify --l1 and --l2 RPC URLs")
os.Exit(2)
}
l1RpcUrl := os.Args[1]
l2RpcUrl := os.Args[2]
l1RpcKind := "alchemy"
if len(os.Args) > 3 {
l1RpcKind = os.Args[3]
}
goerliOutputAddress := common.HexToAddress("0xE6Dfba0953616Bacab0c9A8ecb3a9BBa77FC15c0")
err := Run(l1RpcUrl, l1RpcKind, l2RpcUrl, goerliOutputAddress)
err := Run(l1RpcUrl, l1RpcKind, l2RpcUrl, goerliOutputAddress, dataDir)
if err != nil {
_, _ = fmt.Fprintf(os.Stderr, "Failed: %v\n", err.Error())
os.Exit(1)
}
}
func Run(l1RpcUrl string, l1RpcKind string, l2RpcUrl string, l2OracleAddr common.Address) error {
func Run(l1RpcUrl string, l1RpcKind string, l2RpcUrl string, l2OracleAddr common.Address, dataDir string) error {
ctx := context.Background()
l1RpcClient, err := rpc.Dial(l1RpcUrl)
if err != nil {
......@@ -55,14 +62,7 @@ func Run(l1RpcUrl string, l1RpcKind string, l2RpcUrl string, l2OracleAddr common
return fmt.Errorf("create output oracle bindings: %w", err)
}
// Find L2 finalized head. This is far enough back that we know it's submitted to L1 and won't be re-orged
l2FinalizedHead, err := l2Client.BlockByNumber(ctx, big.NewInt(int64(rpc.FinalizedBlockNumber)))
if err != nil {
return fmt.Errorf("get l2 safe head: %w", err)
}
fmt.Printf("Found L2 finalized head number: %v hash: %v\n", l2FinalizedHead.NumberU64(), l2FinalizedHead.Hash())
// Find L1 finalized block. Can't be re-orged and must contain all batches for the L2 finalized block
// Find L1 finalized block. Can't be re-orged.
l1BlockNum := big.NewInt(int64(rpc.FinalizedBlockNumber))
l1HeadBlock, err := l1Client.BlockByNumber(ctx, l1BlockNum)
if err != nil {
......@@ -70,89 +70,68 @@ func Run(l1RpcUrl string, l1RpcKind string, l2RpcUrl string, l2OracleAddr common
}
fmt.Printf("Found l1 head block number: %v hash: %v\n", l1HeadBlock.NumberU64(), l1HeadBlock.Hash())
// Get the most published L2 output from before the finalized block
callOpts := &bind.CallOpts{Context: ctx}
outputIndex, err := outputOracle.GetL2OutputIndexAfter(callOpts, l2FinalizedHead.Number())
l1CallOpts := &bind.CallOpts{Context: ctx, BlockNumber: l1BlockNum}
// Find the latest output root published in this finalized block
latestOutputIndex, err := outputOracle.LatestOutputIndex(l1CallOpts)
if err != nil {
fmt.Println("Failed to get output index after finalized block. Checking latest output", "finalized", l2FinalizedHead.Number(), "err", err)
outputIndex, err = outputOracle.LatestOutputIndex(callOpts)
if err != nil {
return fmt.Errorf("get latest output index: %w", err)
}
} else {
outputIndex = outputIndex.Sub(outputIndex, big.NewInt(1))
return fmt.Errorf("fetch latest output index: %w", err)
}
output, err := outputOracle.GetL2Output(callOpts, outputIndex)
output, err := outputOracle.GetL2Output(l1CallOpts, latestOutputIndex)
if err != nil {
return fmt.Errorf("retrieve latest output: %w", err)
}
// Check we wound up with an output prior to the finalized block
if output.L2BlockNumber.Uint64() > l2FinalizedHead.NumberU64() {
return fmt.Errorf("selected output is after finalized head output block: %v, finalized block: %v", output.L2BlockNumber.Uint64(), l2FinalizedHead.NumberU64())
return fmt.Errorf("fetch l2 output %v: %w", latestOutputIndex, err)
}
l1Head := l1HeadBlock.Hash()
l2Claim := common.Hash(output.OutputRoot)
l2BlockNumber := output.L2BlockNumber
// Use an agreed starting L2 block some distance before the block the output claim is from
agreedBlockNumber := uint64(0)
if l2BlockNumber.Uint64() > agreedBlockTrailingDistance {
agreedBlockNumber = l2BlockNumber.Uint64() - agreedBlockTrailingDistance
}
l2AgreedBlock, err := l2Client.BlockByNumber(ctx, big.NewInt(int64(agreedBlockNumber)))
// Use the previous output as the agreed starting point
agreedOutput, err := outputOracle.GetL2Output(l1CallOpts, new(big.Int).Sub(latestOutputIndex, common.Big1))
if err != nil {
return fmt.Errorf("retrieve agreed l2 block: %w", err)
}
agreedOutputIndex, err := outputOracle.GetL2OutputIndexAfter(callOpts, l2AgreedBlock.Number())
if err != nil {
return fmt.Errorf("failed to output index after agreed block")
}
// Find an output that differs from what is being claimed
var agreedOutput bindings.TypesOutputProposal
for {
agreedOutput, err = outputOracle.GetL2Output(callOpts, agreedOutputIndex)
if err != nil {
return fmt.Errorf("retrieve agreed output: %w", err)
}
if agreedOutput.OutputRoot != output.OutputRoot {
break
}
fmt.Printf("Output at %v equals output at finalized block. Continuing search...\n", agreedOutput.L2BlockNumber)
agreedOutputIndex.Sub(agreedOutputIndex, big.NewInt(1))
if agreedOutputIndex.Int64() < 0 {
return fmt.Errorf("failed to find an output different from finalized block output")
}
return fmt.Errorf("fetch l2 output before %v: %w", latestOutputIndex, err)
}
l2BlockAtOutput, err := l2Client.BlockByNumber(ctx, agreedOutput.L2BlockNumber)
if err != nil {
return fmt.Errorf("retrieve agreed block: %w", err)
}
l2Head := l2BlockAtOutput.Hash()
l2BlockNumber := output.L2BlockNumber
l2Claim := common.Hash(output.OutputRoot)
l1Head := l1HeadBlock.Hash()
temp, err := os.MkdirTemp("", "oracledata")
if err != nil {
return fmt.Errorf("create temp dir: %w", err)
}
defer func() {
err := os.RemoveAll(temp)
if dataDir == "" {
dataDir, err = os.MkdirTemp("", "oracledata")
if err != nil {
fmt.Println("Failed to remove temp dir:" + err.Error())
return fmt.Errorf("create temp dir: %w", err)
}
defer func() {
err := os.RemoveAll(dataDir)
if err != nil {
fmt.Println("Failed to remove temp dir:" + err.Error())
}
}()
} else {
if err := os.MkdirAll(dataDir, 0755); err != nil {
fmt.Printf("Could not create data directory %v: %v", dataDir, err)
os.Exit(1)
}
}()
fmt.Printf("Using temp dir: %s\n", temp)
}
fmt.Printf("Using dir: %s\n", dataDir)
args := []string{
"--log.level", "DEBUG",
"--network", "goerli",
"--exec", "./bin/op-program-client",
"--datadir", temp,
"--datadir", dataDir,
"--l1.head", l1Head.Hex(),
"--l2.head", l2Head.Hex(),
"--l2.outputroot", common.Bytes2Hex(agreedOutput.OutputRoot[:]),
"--l2.claim", l2Claim.Hex(),
"--l2.blocknumber", l2BlockNumber.String(),
}
fmt.Printf("Configuration: %s\n", args)
argsStr := strings.Join(args, " ")
if err := os.WriteFile(filepath.Join(dataDir, "args.txt"), []byte(argsStr), 0644); err != nil {
fmt.Printf("Could not write args: %v", err)
os.Exit(1)
}
fmt.Printf("Configuration: %s\n", argsStr)
fmt.Println("Running in online mode")
err = runFaultProofProgram(ctx, append(args, "--l1", l1RpcUrl, "--l2", l2RpcUrl, "--l1.rpckind", l1RpcKind))
if err != nil {
......
package main
import (
"fmt"
"os"
opservice "github.com/ethereum-optimism/optimism/op-service"
"github.com/urfave/cli/v2"
"github.com/ethereum-optimism/optimism/op-proposer/flags"
......@@ -26,7 +26,7 @@ func main() {
app := cli.NewApp()
app.Flags = cliapp.ProtectFlags(flags.Flags)
app.Version = fmt.Sprintf("%s-%s-%s", Version, GitCommit, GitDate)
app.Version = opservice.FormatVersion(Version, GitCommit, GitDate, "")
app.Name = "op-proposer"
app.Usage = "L2Output Submitter"
app.Description = "Service for generating and submitting L2 Output checkpoints to the L2OutputOracle contract"
......
......@@ -84,7 +84,12 @@ func (m *Metrics) Start(host string, port int) (*httputil.HTTPServer, error) {
func (m *Metrics) StartBalanceMetrics(ctx context.Context,
l log.Logger, client *ethclient.Client, account common.Address) {
opmetrics.LaunchBalanceMetrics(ctx, l, m.registry, m.ns, client, account)
// TODO(7684): util was refactored to close, but ctx is still being used by caller for shutdown
balanceMetric := opmetrics.LaunchBalanceMetrics(l, m.registry, m.ns, client, account)
go func() {
<-ctx.Done()
_ = balanceMetric.Close()
}()
}
// RecordInfo sets a pseudo-metric that contains versioning and
......
......@@ -172,12 +172,12 @@ func NewL2OutputSubmitterConfigFromCLIConfig(cfg CLIConfig, l log.Logger, m metr
}
// Connect to L1 and L2 providers. Perform these last since they are the most expensive.
l1Client, err := dial.DialEthClientWithTimeout(dial.DefaultDialTimeout, l, cfg.L1EthRpc)
l1Client, err := dial.DialEthClientWithTimeout(context.Background(), dial.DefaultDialTimeout, l, cfg.L1EthRpc)
if err != nil {
return nil, err
}
rollupClient, err := dial.DialRollupClientWithTimeout(dial.DefaultDialTimeout, l, cfg.RollupRpc)
rollupClient, err := dial.DialRollupClientWithTimeout(context.Background(), dial.DefaultDialTimeout, l, cfg.RollupRpc)
if err != nil {
return nil, err
}
......
package clock
import (
"context"
"sync"
"time"
)
// LoopFn is a simple ticker-loop with io.Closer support.
// Note that ticks adapt; slow function calls may result in lost ticks.
type LoopFn struct {
ctx context.Context
cancel context.CancelFunc
ticker Ticker
fn func(ctx context.Context)
onClose func() error
wg sync.WaitGroup
}
// Close cancels the context of the ongoing function call, waits for the call to complete, and cancels further calls.
// Close is safe to call again or concurrently. The onClose callback will be called for each Close call.
func (lf *LoopFn) Close() error {
lf.cancel() // stop any ongoing function call, and close the main loop
lf.wg.Wait() // wait for completion
if lf.onClose != nil {
return lf.onClose() // optional: user can specify function to close resources with
}
return nil
}
func (lf *LoopFn) work() {
defer lf.wg.Done()
defer lf.ticker.Stop() // clean up the timer
for {
select {
case <-lf.ctx.Done():
return
case <-lf.ticker.Ch():
ctx, cancel := context.WithCancel(lf.ctx)
func() {
defer cancel()
lf.fn(ctx)
}()
}
}
}
// NewLoopFn creates a periodic function call, which can be closed,
// with an optional onClose callback to clean up resources.
func NewLoopFn(clock Clock, fn func(ctx context.Context), onClose func() error, interval time.Duration) *LoopFn {
ctx, cancel := context.WithCancel(context.Background())
lf := &LoopFn{
ctx: ctx,
cancel: cancel,
fn: fn,
ticker: clock.NewTicker(interval),
onClose: onClose,
}
lf.wg.Add(1)
go lf.work()
return lf
}
package clock
import (
"context"
"errors"
"testing"
"time"
"github.com/stretchr/testify/require"
)
func TestLoopFn(t *testing.T) {
cl := NewDeterministicClock(time.Now())
calls := make(chan struct{}, 10)
testErr := errors.New("test close error")
loopFn := NewLoopFn(cl, func(ctx context.Context) {
calls <- struct{}{}
}, func() error {
close(calls)
return testErr
}, time.Second*10)
cl.AdvanceTime(time.Second * 15)
<-calls
cl.AdvanceTime(time.Second * 10)
<-calls
select {
case <-calls:
t.Fatal("more calls than expected")
default:
}
require.ErrorIs(t, loopFn.Close(), testErr)
}
......@@ -21,8 +21,8 @@ const defaultRetryTime = 2 * time.Second
// DialEthClientWithTimeout attempts to dial the L1 provider using the provided
// URL. If the dial doesn't complete within defaultDialTimeout seconds, this
// method will return an error.
func DialEthClientWithTimeout(timeout time.Duration, log log.Logger, url string) (*ethclient.Client, error) {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
func DialEthClientWithTimeout(ctx context.Context, timeout time.Duration, log log.Logger, url string) (*ethclient.Client, error) {
ctx, cancel := context.WithTimeout(ctx, timeout)
defer cancel()
c, err := dialRPCClientWithBackoff(ctx, log, url)
......@@ -35,8 +35,8 @@ func DialEthClientWithTimeout(timeout time.Duration, log log.Logger, url string)
// DialRollupClientWithTimeout attempts to dial the RPC provider using the provided URL.
// If the dial doesn't complete within timeout seconds, this method will return an error.
func DialRollupClientWithTimeout(timeout time.Duration, log log.Logger, url string) (*sources.RollupClient, error) {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
func DialRollupClientWithTimeout(ctx context.Context, timeout time.Duration, log log.Logger, url string) (*sources.RollupClient, error) {
ctx, cancel := context.WithTimeout(ctx, timeout)
defer cancel()
rpcCl, err := dialRPCClientWithBackoff(ctx, log, url)
......
......@@ -7,6 +7,8 @@ import (
"io"
"math"
"sync"
"github.com/ethereum/go-ethereum/core/types"
)
type BlockVersion int
......@@ -180,16 +182,16 @@ func (payload *ExecutionPayload) MarshalSSZ(w io.Writer) (n int, err error) {
offset += transactionSize
// dyanmic value 3: Withdrawals
if payload.Withdrawals != nil {
marshalWithdrawals(buf[offset:], payload.Withdrawals)
marshalWithdrawals(buf[offset:], *payload.Withdrawals)
}
return w.Write(buf)
}
func marshalWithdrawals(out []byte, withdrawals *Withdrawals) {
func marshalWithdrawals(out []byte, withdrawals types.Withdrawals) {
offset := uint32(0)
for _, withdrawal := range *withdrawals {
for _, withdrawal := range withdrawals {
binary.LittleEndian.PutUint64(out[offset:offset+8], withdrawal.Index)
offset += 8
binary.LittleEndian.PutUint64(out[offset:offset+8], withdrawal.Validator)
......@@ -305,14 +307,14 @@ func (payload *ExecutionPayload) UnmarshalSSZ(version BlockVersion, scope uint32
if err != nil {
return fmt.Errorf("failed to unmarshal withdrawals list: %w", err)
}
payload.Withdrawals = withdrawals
payload.Withdrawals = &withdrawals
}
return nil
}
func unmarshalWithdrawals(in []byte) (*Withdrawals, error) {
result := &Withdrawals{}
func unmarshalWithdrawals(in []byte) (types.Withdrawals, error) {
result := types.Withdrawals{} // empty list by default, intentionally non-nil
if len(in)%withdrawalSize != 0 {
return nil, errors.New("invalid withdrawals data")
......@@ -327,7 +329,7 @@ func unmarshalWithdrawals(in []byte) (*Withdrawals, error) {
offset := 0
for i := 0; i < withdrawalCount; i++ {
withdrawal := Withdrawal{}
withdrawal := &types.Withdrawal{}
withdrawal.Index = binary.LittleEndian.Uint64(in[offset : offset+8])
offset += 8
......@@ -341,7 +343,7 @@ func unmarshalWithdrawals(in []byte) (*Withdrawals, error) {
withdrawal.Amount = binary.LittleEndian.Uint64(in[offset : offset+8])
offset += 8
*result = append(*result, withdrawal)
result = append(result, withdrawal)
}
return result, nil
......
......@@ -7,10 +7,12 @@ import (
"math"
"testing"
"github.com/ethereum/go-ethereum/common"
"github.com/google/go-cmp/cmp"
"github.com/holiman/uint256"
"github.com/stretchr/testify/require"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
)
// FuzzExecutionPayloadUnmarshal checks that our SSZ decoding never panics
......@@ -138,9 +140,9 @@ func FuzzExecutionPayloadMarshalUnmarshalV2(f *testing.F) {
}
wCount = wCount % maxWithdrawalsPerPayload
withdrawals := make(Withdrawals, wCount)
withdrawals := make(types.Withdrawals, wCount)
for i := 0; i < int(wCount); i++ {
withdrawals[i] = Withdrawal{
withdrawals[i] = &types.Withdrawal{
Index: a,
Validator: b,
Address: common.BytesToAddress(data[:20]),
......@@ -228,10 +230,10 @@ func TestOPB04(t *testing.T) {
tests := []struct {
version BlockVersion
withdrawals *Withdrawals
withdrawals *types.Withdrawals
}{
{BlockV1, nil},
{BlockV2, &Withdrawals{}},
{BlockV2, &types.Withdrawals{}},
}
for _, test := range tests {
......@@ -246,7 +248,7 @@ func TestOPB04(t *testing.T) {
}
func createPayloadWithWithdrawals(w *Withdrawals) *ExecutionPayload {
func createPayloadWithWithdrawals(w *types.Withdrawals) *ExecutionPayload {
return &ExecutionPayload{
ParentHash: common.HexToHash("0x123"),
FeeRecipient: common.HexToAddress("0x456"),
......@@ -267,8 +269,8 @@ func createPayloadWithWithdrawals(w *Withdrawals) *ExecutionPayload {
}
func TestMarshalUnmarshalWithdrawals(t *testing.T) {
emptyWithdrawal := &Withdrawals{}
withdrawals := &Withdrawals{
emptyWithdrawal := &types.Withdrawals{}
withdrawals := &types.Withdrawals{
{
Index: 987,
Validator: 654,
......@@ -276,18 +278,18 @@ func TestMarshalUnmarshalWithdrawals(t *testing.T) {
Amount: 321,
},
}
maxWithdrawals := make(Withdrawals, maxWithdrawalsPerPayload)
maxWithdrawals := make(types.Withdrawals, maxWithdrawalsPerPayload)
for i := 0; i < maxWithdrawalsPerPayload; i++ {
maxWithdrawals[i] = Withdrawal{
maxWithdrawals[i] = &types.Withdrawal{
Index: 987,
Validator: 654,
Address: common.HexToAddress("0x898"),
Amount: 321,
}
}
tooManyWithdrawals := make(Withdrawals, maxWithdrawalsPerPayload+1)
tooManyWithdrawals := make(types.Withdrawals, maxWithdrawalsPerPayload+1)
for i := 0; i < maxWithdrawalsPerPayload+1; i++ {
tooManyWithdrawals[i] = Withdrawal{
tooManyWithdrawals[i] = &types.Withdrawal{
Index: 987,
Validator: 654,
Address: common.HexToAddress("0x898"),
......@@ -299,7 +301,7 @@ func TestMarshalUnmarshalWithdrawals(t *testing.T) {
name string
version BlockVersion
hasError bool
withdrawals *Withdrawals
withdrawals *types.Withdrawals
}{
{"ZeroWithdrawalsSucceeds", BlockV2, false, emptyWithdrawal},
{"ZeroWithdrawalsFailsToDeserialize", BlockV1, true, emptyWithdrawal},
......
......@@ -10,7 +10,6 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/rlp"
"github.com/ethereum/go-ethereum/trie"
"github.com/holiman/uint256"
)
......@@ -143,7 +142,8 @@ type ExecutionPayload struct {
ExtraData BytesMax32 `json:"extraData"`
BaseFeePerGas Uint256Quantity `json:"baseFeePerGas"`
BlockHash common.Hash `json:"blockHash"`
Withdrawals *Withdrawals `json:"withdrawals,omitempty"`
// nil if not present, pre-shanghai
Withdrawals *types.Withdrawals `json:"withdrawals,omitempty"`
// Array of transaction objects, each object is a byte list (DATA) representing
// TransactionType || TransactionPayload or LegacyTransaction as defined in EIP-2718
Transactions []Data `json:"transactions"`
......@@ -237,7 +237,7 @@ func BlockAsPayload(bl *types.Block, canyonForkTime *uint64) (*ExecutionPayload,
}
if canyonForkTime != nil && uint64(payload.Timestamp) >= *canyonForkTime {
payload.Withdrawals = &Withdrawals{}
payload.Withdrawals = &types.Withdrawals{}
}
return payload, nil
......@@ -251,7 +251,7 @@ type PayloadAttributes struct {
// suggested value for the coinbase field of the new payload
SuggestedFeeRecipient common.Address `json:"suggestedFeeRecipient"`
// Withdrawals to include into the block -- should be nil or empty depending on Shanghai enablement
Withdrawals *Withdrawals `json:"withdrawals,omitempty"`
Withdrawals *types.Withdrawals `json:"withdrawals,omitempty"`
// Transactions to force into the block (always at the start of the transactions list).
Transactions []Data `json:"transactions,omitempty"`
// NoTxPool to disable adding any transactions from the transaction-pool.
......@@ -317,25 +317,3 @@ type SystemConfig struct {
GasLimit uint64 `json:"gasLimit"`
// More fields can be added for future SystemConfig versions.
}
// Withdrawal represents a validator withdrawal from the consensus layer.
// https://github.com/ethereum/consensus-specs/blob/dev/specs/capella/beacon-chain.md#withdrawal
type Withdrawal struct {
Index uint64 `json:"index"` // monotonically increasing identifier issued by consensus layer
Validator uint64 `json:"validatorIndex"` // index of validator associated with withdrawal
Address common.Address `json:"address"` // target address for withdrawn ether
Amount uint64 `json:"amount"` // value of withdrawal in Gwei
}
// Withdrawals implements DerivableList for withdrawals.
type Withdrawals []Withdrawal
// Len returns the length of s.
func (s Withdrawals) Len() int { return len(s) }
// EncodeIndex encodes the i'th withdrawal to w. Note that this does not check for errors
// because we assume that *Withdrawal will only ever contain valid withdrawals that were either
// constructed by decoding or via public API in this package.
func (s Withdrawals) EncodeIndex(i int, w *bytes.Buffer) {
_ = rlp.Encode(w, s[i])
}
......@@ -5,12 +5,15 @@ import (
"math/big"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/params"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/ethereum-optimism/optimism/op-service/clock"
)
// weiToEther divides the wei value by 10^18 to get a number in ether as a float64
......@@ -22,38 +25,27 @@ func weiToEther(wei *big.Int) float64 {
return f
}
// LaunchBalanceMetrics fires off a go rountine that queries the balance of the supplied account & periodically records it
// to the balance metric of the namespace. The balance of the account is recorded in Ether (not Wei).
// LaunchBalanceMetrics starts a periodic query of the balance of the supplied account and records it
// to the "balance" metric of the namespace. The balance of the account is recorded in Ether (not Wei).
// Cancel the supplied context to shut down the go routine
func LaunchBalanceMetrics(ctx context.Context, log log.Logger, r *prometheus.Registry, ns string, client *ethclient.Client, account common.Address) {
go func() {
balanceGuage := promauto.With(r).NewGauge(prometheus.GaugeOpts{
Namespace: ns,
Name: "balance",
Help: "balance (in ether) of account " + account.String(),
})
ticker := time.NewTicker(10 * time.Second)
defer ticker.Stop()
for {
select {
case <-ticker.C:
ctx, cancel := context.WithTimeout(ctx, 1*time.Minute)
bigBal, err := client.BalanceAt(ctx, account, nil)
if err != nil {
log.Warn("failed to get balance of account", "err", err, "address", account)
cancel()
continue
}
bal := weiToEther(bigBal)
balanceGuage.Set(bal)
cancel()
case <-ctx.Done():
log.Info("balance metrics shutting down")
return
}
func LaunchBalanceMetrics(log log.Logger, r *prometheus.Registry, ns string, client *ethclient.Client, account common.Address) *clock.LoopFn {
balanceGuage := promauto.With(r).NewGauge(prometheus.GaugeOpts{
Namespace: ns,
Name: "balance",
Help: "balance (in ether) of account " + account.String(),
})
return clock.NewLoopFn(clock.SystemClock, func(ctx context.Context) {
ctx, cancel := context.WithTimeout(ctx, 1*time.Minute)
defer cancel()
bigBal, err := client.BalanceAt(ctx, account, nil)
if err != nil {
log.Warn("failed to get balance of account", "err", err, "address", account)
return
}
}()
bal := weiToEther(bigBal)
balanceGuage.Set(bal)
}, func() error {
log.Info("balance metrics shutting down")
return nil
}, 10*time.Second)
}
......@@ -11,3 +11,7 @@ func NewRegistry() *prometheus.Registry {
registry.MustRegister(collectors.NewGoCollector())
return registry
}
type RegistryMetricer interface {
Registry() *prometheus.Registry
}
......@@ -125,3 +125,17 @@ func (m *RPCMetrics) RecordRPCClientResponse(method string, err error) {
}
m.RPCClientResponsesTotal.WithLabelValues(method, errStr).Inc()
}
type NoopRPCMetrics struct{}
func (n *NoopRPCMetrics) RecordRPCServerRequest(method string) func() {
return func() {}
}
func (n *NoopRPCMetrics) RecordRPCClientRequest(method string) func(err error) {
return func(err error) {}
}
func (n *NoopRPCMetrics) RecordRPCClientResponse(method string, err error) {
}
var _ RPCMetricer = (*NoopRPCMetrics)(nil)
......@@ -63,3 +63,7 @@ func (r *RollupClient) SequencerActive(ctx context.Context) (bool, error) {
func (r *RollupClient) SetLogLevel(ctx context.Context, lvl log.Lvl) error {
return r.rpc.CallContext(ctx, nil, "admin_setLogLevel", lvl.String())
}
func (r *RollupClient) Close() {
r.rpc.Close()
}
{"baseFeePerGas":"0x3fb7c357","difficulty":"0x0","extraData":"0x","gasLimit":"0x1c9c380","gasUsed":"0x18f759","hash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","logsBloom":"0x020010404000001a0000021000000080001100410000100001000010040200980220400000008806200200000100000000000000000000008000000400042000000050000040000112080808800002044000040004042008800480002000000000000002020020000042002400000820000080040000000010200010020010100101212050000008000000008000001010200c80000112010000438040020400000000202400000000002002a0210402000622010000000001700144000040000000002204000000c000410105024010000808000000002004002000000261000000822200200800881000000012500400400000000000000040010000800000","miner":"0x000095e79eac4d76aab57cb2c1f091d553b36ca0","mixHash":"0x5b53dc49cbab268ef9950b1d81b5e36a1b2f1b97aee1b7ff6e4db0e06c29a8b0","nonce":"0x0000000000000000","number":"0x84161e","parentHash":"0x72d92c1498e05952988d4e79a695928a6bcbd37239f8a1734051263b4d3504b8","receiptsRoot":"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2a51","stateRoot":"0xc56738518b2c7854a640ae25996d2211c9ef0dd2e4dd9e59e9d9cacef39622da","timestamp":"0x64110a5c","totalDifficulty":"0xa4a470","transactions":[{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x1b7aa44088a0ea95bdc65fef6e5071e946bf7d8f","gas":"0x5208","gasPrice":"0x4159f01735","hash":"0x1e8f148a9aea7d8d16ea6e9446723b8f262e8bcd89c7c961d52046ebd43b4598","input":"0x","nonce":"0x279ad","to":"0xa21765a03dd41e2783696d314f235f4d520f6cac","transactionIndex":"0x0","value":"0x3782dace9d90000","type":"0x0","chainId":"0x5","v":"0x2e","r":"0xf9eca8b74ccaec5f4a83e981baeb8602f38d0271179c592b4a18f3866316a367","s":"0x350a9d26718d1fa9dc4f268f9c0e18fb96dbc037816ca8fc20f33f1a76f9f501"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x4d9a852e6aecd3a6e87fece2ca109780e45e6f2d","gas":"0x160ab","gasPrice":"0xd4babc57","maxFeePerGas":"0x11407d03e","maxPriorityFeePerGas":"0x9502f900","hash":"0xab5c870f4c367012bd763172afbfbe68fbf35336a66ae41aff3f2c9dbf4ea3f8","input":"0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212200c479c99d58d7fbee5ee3aef5001431073a3d465bdfa46cf747a7c0b9289607864736f6c634300080d0033","nonce":"0xafd","to":null,"transactionIndex":"0x1","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x48f6acf4ac4371eb96ffca8cdef5b7704ea8c68a631d1c02927036d4ce92567e","s":"0x1f12261ddde63fd3da2ed9ea1bcbb4b0f25af898248c805a9d4b0a6e42caf9c8","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xce297b30e56bf2f6142c4048fbae1cb8a756fefd","gas":"0x557300","gasPrice":"0xd4babc57","maxFeePerGas":"0xfabdd183","maxPriorityFeePerGas":"0x9502f900","hash":"0xa81fd92b2d0f0bbd3cc355f869cca3243c98c5e2641db9ecf3eeabb3b13bff6a","input":"0x7bbaf1ea0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000","nonce":"0xad92","to":"0x4c0ce02c1219ce5d2afffba97e484272a4637b49","transactionIndex":"0x2","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xd11b842a5f7b0e020470e764b443fafc4044327bca8dbb37131425359abace2","s":"0x1009867573946fb0a4a35339a6eaaece4d0a168b2346539076e6319e9a466b1","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x47a916d0b694c95bc0c09953c1a6e22c8867be32","gas":"0x5208","gasPrice":"0x991ff257","maxFeePerGas":"0xb2fea055","maxPriorityFeePerGas":"0x59682f00","hash":"0xa92c7b720c08c83f1a0ed7e4c163200e30a3a8c03fcc5a51e685ea20cd0cb577","input":"0x","nonce":"0x2","to":"0xf955dfe99bbfd06a8be208274cd654ecfb66a45e","transactionIndex":"0x3","value":"0x11c37937e08000","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xeecd431225215c3ddc2e13cf16fa29f9a2ab1afbaa02988f3ceac27416edf0f5","s":"0x6494062330a9d509f7c778cb45cbcc9932e5f9b4ec94a1ec315f579f8d973b7b","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x672d214fe4db218defae698085a3ccefc773dfa9","gas":"0xf4f6","gasPrice":"0x991ff257","maxFeePerGas":"0xb2fea055","maxPriorityFeePerGas":"0x59682f00","hash":"0x6921b429ad2ec1e97d3457049ad2e893b5a0349beba47ca1c74a9540af75347a","input":"0xa1ddc546000000000000000000000000000000000000000000000000000000000000118f","nonce":"0x8e","to":"0xdef65f8e2f62bde60cd86ad3b4ad7fa6741cf175","transactionIndex":"0x4","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x4732ad21401b509bebb947a8566127fba1e245eb5a262ddc522d6867ab80567e","s":"0x2153013617fefdb06db0a7316d8883056441d33c2abf5ed6291fa0e3cc5c3a2f","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x0b12f7f996579fe7d9302d2574910121c214ee15","gas":"0x56a8","gasPrice":"0x991ff257","maxFeePerGas":"0xb2fea055","maxPriorityFeePerGas":"0x59682f00","hash":"0xf776b2da0b835dde05d0d8b76fd19385d61e7055036cf637f804b36dc94f2384","input":"0x71ec5c05aa669c4922569c1d33f7a81aaa21813800000000000000000000000013a0c5930c028511dc02665e7285134b6d11a5f40000000000000000000000000b12f7f996579fe7d9302d2574910121c214ee150000000000000000000000000000000000000000000000000000000000000000","nonce":"0xe","to":"0x7c125c1d515b8945841b3d5144a060115c58725f","transactionIndex":"0x5","value":"0x2386f26fc10000","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xc4505d4c46ef9a0103178e5ef4fbc857114ae5c4686b68b74d07c3ee3a86e575","s":"0x74db34fd675bea7d2ee74f14fd8709cb88c7d22c2267d12f2c671b5ebc180bd5","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xd36aac0c9676e984d72823fb662ce94d3ab5e551","gas":"0xff212","gasPrice":"0x991ff257","maxFeePerGas":"0xd86d063e","maxPriorityFeePerGas":"0x59682f00","hash":"0x9a08d899cd14ebb930ed59fa774afdb88a22615b3a931e930931ea54d26dc0bc","input":"0x49160658babdf216946a22b96c966ceeba750f14807726306ebeed500a2621a7481df010000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000084d6f6f6e6265616d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a3078434133633746363939643335333137316438434643364236334431433764333841333233373238300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0b616f73c8d00641109f0000054f967b8a135e44e233da070ea88c5e4a53bacac0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c6a3a17399d88e5dfd2de4fa41dcccade6a2d2170000000000000000000000008676147503f761e44b85df01811edd52be01b56c000000000000000000000000000000000000000000000000d02ab486cedc00000000000000000000000000000000000000000000000000000de0b6b3a7640000","nonce":"0x7121","to":"0x2d276bd64fe8643a1d76b2e9530c753423e972c1","transactionIndex":"0x6","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xce452361d331baf2ac86947a1b3b454b3e842923e1f39139b33a572845dd5d7c","s":"0x388126881782af5a146ce8409f1e3a2c9a4cadcfe9a2c1d27258af6e4eb5cec1","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xb83a48ee322989a0a4f838cb207abc28ec021b73","gas":"0x326ff","gasPrice":"0x991ff257","maxFeePerGas":"0x5c3362b9c","maxPriorityFeePerGas":"0x59682f00","hash":"0x0fe0d97e25d5eb11a33a3e8278584c3780941fc2675bdf8fc547cee3d1fd3b17","input":"0xa4110dbe190e65a7fe0ad5acd305c6446a02cb39de30f382000fe67927434063bf4c4b2ca86b3ee6d039dc7a0268f9e1c39266c3f12a752a7eb72f0895dedf62291fd292","nonce":"0x12e","to":"0x96e6192eeaf7bb308f79fb5017a9085754b9e12a","transactionIndex":"0x7","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x46819bb540fa459a5a0cbf041a0286507d597fc8958a6af8b9ce193f00005238","s":"0x31495c58bf4b74925f870c59635912681bee947b1cb4b08cc19f22421b1a10ab","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xb83a48ee322989a0a4f838cb207abc28ec021b73","gas":"0x3270b","gasPrice":"0x991ff257","maxFeePerGas":"0x5c3362b9c","maxPriorityFeePerGas":"0x59682f00","hash":"0xef47a60f57f177a683c723c658137efab66d311e1c5abbc4d74f653535144d03","input":"0xa4110dbe18eba3e815ec7fcb03a8eea0487209c3253024d1dc4f36f775a43fdd3e409b74c0a5c88e54f39b88db6f185a41431b204120d3e66c9b08b86f5e8382623327e5","nonce":"0x12f","to":"0x96e6192eeaf7bb308f79fb5017a9085754b9e12a","transactionIndex":"0x8","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x4d7e11fe3914763a2735493a62b71ae0028e75a750a8b06407996cf478e273c8","s":"0x60c18fdf948721f96fdc2efbf694910122e82191c7a40a5caab247c06ab7f3cf","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x7712a1f96b3f37c3dd88a22d4f7a7977b937fe62","gas":"0x1ff06","gasPrice":"0x991ff257","maxFeePerGas":"0xcf662006","maxPriorityFeePerGas":"0x59682f00","hash":"0xe23a5b35faae5335adc5aca38c5d633b00438b798c2053104b8df48406c9b141","input":"0x3ff9751b0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000002e516d566e75374a51566f445271536748427a72615970374879373848774a744c4669366e5546436f775447647a70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e516d5439716b3343525962464457704446596541763854384831676e6f6e67774b6868354a36384e4c6b4c6972360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c9f31b989aaa745aecc563139f89c8ab3ab492e725d1e0305b7d602fcbf9293c463f0d2e4f5fb0c9efb54eb2cde9af10ebc9c3676f2334007291ffa8efb40adb1c00000000000000000000000000000000000000000000000000000000000000","nonce":"0x16","to":"0xc3b87ea584cb9cb5a4523e2bed16a34bf7746317","transactionIndex":"0x9","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xcc693a9544394653e1f393f02635e2c1f78b5e6c26c4d00a867bcf4adc2bc09e","s":"0x23f4b71b773c19f77cf251b2aeea03f2696bddd847d1f6d75acd2fbea6a543e4","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x12bbafcfa06423d87bed591a64c1a1f34791e90a","gas":"0x1b2e020","gasPrice":"0x8f0d3617","maxFeePerGas":"0x1cb3abd5a","maxPriorityFeePerGas":"0x4f5572c0","hash":"0xd8cea4ba619b317bc05d58534af73beec6c2548b31b24d4dc61c9bbd29cfa17a","input":"0x","nonce":"0x4d","to":"0x12bbafcfa06423d87bed591a64c1a1f34791e90a","transactionIndex":"0xa","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x8dae28608985d6ab47cbe122ee88972e38664cede30978f41944f347bad86e5c","s":"0x17c2898b39b7e3b874dc78e7df3fcff68f4d715385c632aad4bdf6e62505651c","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x6999c36394dd5d3d3295af63a4736ad6bd279448","gas":"0x14d94","gasPrice":"0x7b528d57","maxFeePerGas":"0x7df743e0","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x79a4b9d90b02c768baaad305f266281213cc75062cbe99a13222cc0c4b509498","input":"0x6a7612020000000000000000000000009008d19f58aabd9ed0d60971565aa8510560ab4100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000a4ec6cb13f00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003826d8d7371becafc0afedc3fe85b699b87f4357d55ec39ce83c510ed7d70ff514dce8236351f4627ccec6a7d9a67bc6fc2ec17ca76411113c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000006999c36394dd5d3d3295af63a4736ad6bd27944800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000","nonce":"0x13","to":"0xdce8236351f4627ccec6a7d9a67bc6fc2ec17ca7","transactionIndex":"0xb","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x669487011643510f7512ec15b07d74efb853ba4ad9fe9c7e9850ccf24e3d4c53","s":"0x2191f9ee81087e1df833e69d6129ec330ed4c99be2031060834e22c589fcf79b","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x08ebc052e6353b4d8392113f0f2c5decd691ddcd","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0xf6e4d9c4","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x6790a3bbddbeb21fcb736a59b3775755051c3a6344d8390cf8ca27f2e8a814f0","input":"0x6871ee40","nonce":"0x4","to":"0xb21b333c40354393f18de57f2d0a0fc21f270482","transactionIndex":"0xc","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xa7a58ab858e5dd87b9a74d550e5716ac40ddefd1c21d5baa51e542f4f941d73e","s":"0x1fd0cb1563df0368bd332717d7c8210187cd1ac2ff44f61f5242fc02eaa0c2fe","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x08ebc052e6353b4d8392113f0f2c5decd691ddcd","gas":"0x12c36","gasPrice":"0x7b528d57","maxFeePerGas":"0xe596c292","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x87ec7ace5442db252b5751ffddd38dcb04b088d36b6b0e526ff25607a4293c81","input":"0xcb40cbfd","nonce":"0x5","to":"0xb21b333c40354393f18de57f2d0a0fc21f270482","transactionIndex":"0xd","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x8e4bd40195bdfaa868af97dbf22e0b74295d95564a8381bc9bcfe1af3cde2cdb","s":"0x62057dc87c8b2b197d12c648233aab4134b7c2a2f65db89a49728564f3d0864d","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x08ebc052e6353b4d8392113f0f2c5decd691ddcd","gas":"0x12c36","gasPrice":"0x7b528d57","maxFeePerGas":"0xe596c292","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x40cb487ecffda94f97ce7fc0f7163f2f024235df2c8291169edc80dac063e6d0","input":"0xcb40cbfd","nonce":"0x6","to":"0xb21b333c40354393f18de57f2d0a0fc21f270482","transactionIndex":"0xe","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x993c4386ffc2bd63a48dd31cf5f65aa355cba3c063b08778b328d748937098e5","s":"0x203b1faf595628dd78e760bcc1740065625abb6cf00b1b17224e10fa6b424e43","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xafc7682751d3654f34958e3fb660971bf5918367","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0xefb40664","maxPriorityFeePerGas":"0x3b9aca00","hash":"0xb76bb3d88c9b30d927c45ccfcf8d5b0054411ac8501ad588822a7d04690cccf6","input":"0x40c10f19000000000000000000000000afc7682751d3654f34958e3fb660971bf59183670000000000000000000000000000000000000000000000008ac7230489e80000","nonce":"0x20","to":"0x84ced17d95f3ec7230baf4a369f1e624ae60090d","transactionIndex":"0xf","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x78e9d29c606f6a61a1428ed7326df05210d802c3061f3b469847cc461eb48025","s":"0x517afe5a21175f186233ae7a6c090cd33e028a77e5854e98eb2fa4c9284430e7","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x12bbafcfa06423d87bed591a64c1a1f34791e90a","gas":"0xcafe","gasPrice":"0x7b528d57","maxFeePerGas":"0x16ba45bce","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x798ebe823209869347c08bd81e04fbf60e9bdfe44b1cc923215182d0cf3d4edb","input":"0x40c10f1900000000000000000000000012bbafcfa06423d87bed591a64c1a1f34791e90a0000000000000000000000000000000000000000000000000000000000000032","nonce":"0x4e","to":"0xd25d682189afa7ed0c2811195b3f3d07616927bc","transactionIndex":"0x10","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xbe2aa95f4c32188c9ecbae97286ab983f7cc5a7017d46c404f8eb80b55e2dc13","s":"0x55d8968f509f51633f49260178941fd5a3db999e1995206348d7a3f05152b3d5","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x12bbafcfa06423d87bed591a64c1a1f34791e90a","gas":"0xcafe","gasPrice":"0x7b528d57","maxFeePerGas":"0xc6132c0c","maxPriorityFeePerGas":"0x3b9aca00","hash":"0xbe68a7e02725f799a65ebb069ccc83a014ac7c40e4119bf7c220a2f6ddfee295","input":"0x40c10f1900000000000000000000000012bbafcfa06423d87bed591a64c1a1f34791e90a0000000000000000000000000000000000000000000000000000000000000064","nonce":"0x4f","to":"0xd25d682189afa7ed0c2811195b3f3d07616927bc","transactionIndex":"0x11","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x1750ed45d0d2d048a61dcc3ff3e7ad0cbd395b77698c4f2eeb6baaea4c966d96","s":"0xe646e3a87b6dc50439468bcfd24cbf12a6f95b2762f1527c97a7d1b7f03530e","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xd0c0338baac9ce09c1d1caab88b4360507061e37","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0x1918167aa","maxPriorityFeePerGas":"0x3b9aca00","hash":"0xc90c3a72efe81331727fcce4b5bd4906066da314ca9a0b44023a6b09ea7e8114","input":"0x4e71d92d","nonce":"0xe7","to":"0x0137d796936e199b917b93118eb4e002508a48bd","transactionIndex":"0x12","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x22222ce8fe753082c8e5dc7478fa7b87db9c8d0fb070ebc88ab015db13fd6bb","s":"0x6dceadecf6f6a3ddc433a547dba6d5fcdfb7d006ce09eeae1c06c1828ef9fff9","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x8bd834cc1dd17d1a2f7eb6140c3dd5ab51d0f338","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0x1a4019792","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x619a6cbd43cde074d314c19623bd66d9fb1e13c158d7138775236f798dc1245e","input":"0x1da1db5e00000000000000000000000000000000000000000000000000001b5ec4ff740d","nonce":"0x10","to":"0xbad0009f7a8e796e3f975dc1d6ab3e3c237b857c","transactionIndex":"0x13","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x733c496e8c84f78d113bc8b5ad6d04a133bb10bbcecf0db93d97eeedfa3d984a","s":"0x6627c16aa7dea27db44c0f0641c30ffd544b9b9b1c299dc60611e1e01c714ee8","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x8bd834cc1dd17d1a2f7eb6140c3dd5ab51d0f338","gas":"0x11df0","gasPrice":"0x7b528d57","maxFeePerGas":"0x1d3fbccb8","maxPriorityFeePerGas":"0x3b9aca00","hash":"0xca5a56cd77b9e5b0e79020cc6346edf205bc11e901984d805125f28c2e6686e6","input":"0xd7c01032000000000000000000000000356f24c0f3187a6dcb949e4a60aa0a74a8a0327e0000000000000000000000000f8bacfae87aee49a2eec86df0c6b958ec3fd4fd0000000000000000000000000f8bacfae87aee49a2eec86df0c6b958ec3fd4fd","nonce":"0x11","to":"0xbad0009f7a8e796e3f975dc1d6ab3e3c237b857c","transactionIndex":"0x14","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x4aa872c1a7da70126917604193717575b91407f82449bca956d4089b90cd902","s":"0x4b5f788c68024f8958f66e8c768a8e0f65ef297c4ffd420a715258b0a55cb0a0","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x9bedd66b05712a1add7d1fec899b8641b3ecc863","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0x1e706c8d2","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x999c9ddeed67c6ef6fbf02a6e977a6c1b68e18d24814e51643c7157b87a43e0a","input":"0xa8b78ed0","nonce":"0x3","to":"0xf6c2afb18b85175e5ffb28f20f007c047ce28592","transactionIndex":"0x15","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xf1ca074104ee0b6a67223afd797654b8f21060453f7662dd7be79de938c396da","s":"0x4c9a4e56f0ad21e2dd8d1116c7a3e41ea2c6126853772f7897bd959e81e2e28a","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x9bedd66b05712a1add7d1fec899b8641b3ecc863","gas":"0x2dc6c0","gasPrice":"0xd4babc57","maxFeePerGas":"0x21c13e710","maxPriorityFeePerGas":"0x9502f900","hash":"0x47c8f5d0b3778e4c34eba7fcc356fa04a5afd954ccf484728e72c002764dd3c4","input":"0xf688bcfb0000000000000000000000000000000000000000000000000000000005f5e100","nonce":"0x4","to":"0xf6c2afb18b85175e5ffb28f20f007c047ce28592","transactionIndex":"0x16","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x970982425d18b9949141bbabb5c5230fa168626ce210a97f3856d64700fc0eeb","s":"0x6fa6d0aea6ae48783d80c1e51cda47e11c28b90a5497579b93d7f242d786f67e","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x4b596cebd02c35aa99878eb9ecb24d6f5ca5f865","gas":"0x5208","gasPrice":"0x68c88f79","maxFeePerGas":"0x68c88f79","maxPriorityFeePerGas":"0x68c88f79","hash":"0x396797ae0ebcdb72ff1f96fd08b6128f78acc7417353f142f1a5facd425a33e6","input":"0x","nonce":"0x1","to":"0x375980b8e1a417620ba9b18e5a9e0b17dccbac9d","transactionIndex":"0x17","value":"0x1c9a406c58878","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xcb2a7b106097b2f2a61d3a048054a5175c386b1dcdd5b6fcd7849dcac7c32a66","s":"0x10aef76e98276c47470f04a599b81c260ace9d2f6adc95755c6d22d859e805a2","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x6f4aa3bc9732372daa288beb9b2516374ace5786","gas":"0x1b2e020","gasPrice":"0x61010bda","maxFeePerGas":"0x61010bda","maxPriorityFeePerGas":"0x61010bda","hash":"0x454aa43d6546a6f62246826c16b7a49c6c704238c18802ef0d659922f23a573c","input":"0xe99a3f8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000058ce7eb44ae575fb3b3974861c1138dad3c5aee40000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e06defd69964a6ce467b87c64627a7a2be4be139b504757c625eb6114ec166557d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000641a269023d235ef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000002b05699353b600008ae85d840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b4fbf271143f4fbf7b91a5ded31805e42b2208d600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001f63c28250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000def65f8e2f62bde60cd86ad3b4ad7fa6741cf17500000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000006e512435020ac228a15543236b1f46656f98136300000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000d6ffd79b52a587a0a9941a61f4e6cb0d386d5458000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000413e24433da3efc4c3cc305339a7b77a1b31abb4e4d4967e97e42aed1dd0bf98936f43035f40bc80f6f6e3a9cfb43524a1171ee7f21e9ac2fa586d33a31f10619d1c000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f4aa3bc9732372daa288beb9b2516374ace5786000000000000000000000000000000000000000000000000000000000000012000000000000000000000000058ce7eb44ae575fb3b3974861c1138dad3c5aee400000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000641a269023d235ef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000173ad21460000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000def65f8e2f62bde60cd86ad3b4ad7fa6741cf1750000000000000000000000000000000000000000000000000000000000000ba200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000002b05699353b600008ae85d840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b4fbf271143f4fbf7b91a5ded31805e42b2208d600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000def65f8e2f62bde60cd86ad3b4ad7fa6741cf175ffffffff09616c6c64617461","nonce":"0x82","to":"0x02afbd43cad367fcb71305a2dfb9a3928218f0c1","transactionIndex":"0x18","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xc7ac308b1ae238cb2aa4b030ca79baffb7b498e1b10df0c3354b3cc19cfabac9","s":"0x2358b1093b9aab5fae0cf751766b0bb2e3d8cd2b18ca627e1e12520990a8ed6d","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x6ece61d29b90642941c41240da924690da145696","gas":"0x4399c","gasPrice":"0x506794e0","hash":"0x317ecb5bd19caa42a69f836d41556ebb0e0e00e1c6cd2dee230e6e6192612527","input":"0x46f83b5000000000000000000000000000000000000000000000000000000000000000654666803decc59e7d0a5d3efa3c3653c05645ef4342738445e20a3b43e0b4aa8b000000000000000000000000000000000000000000000000000000000000000f4666803decc59e7d0a5d3efa3c3653c05645ef4342738445e20a3b43e0b4aa8b","nonce":"0x2cc4","to":"0xa6bf2be6c60175601bf88217c75dd4b14abb5fbb","transactionIndex":"0x19","value":"0x0","type":"0x0","chainId":"0x5","v":"0x2d","r":"0x37aeab0db6d550e6cba2c04c9cb10a2af0fec0b11f6e04b85e1ea0b8b9defeae","s":"0x4f32f4ef74872e1385c25e69bf21ee049545a4d423e939eaff29677450efe9eb"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xc4a5c059840a146b81c77bf79f1398f2b3d28ca7","gas":"0x432ec","gasPrice":"0x45db0a51","hash":"0xc879285db5ef0a6bce98021584d16f134c1dc0aed8cc988802c4f72ba6877ff6","input":"0x9f8420b300000000000000000000000000000000000000000000000000470de4df8200000000000000000000000000000000000000000000000000000000000000009c40","nonce":"0x1a7","to":"0xe5e30e7c24e4dfcb281a682562e53154c15d3332","transactionIndex":"0x1a","value":"0x470efc4514e000","type":"0x0","chainId":"0x5","v":"0x2d","r":"0x237e3a541c5ab490843cdc20d0fcb7416bff8da471f6a11ae1b32d2bab119141","s":"0x3c8417d7a60bd5b0bcae4975dbb4aaee54a4b4d588226481be400843bfe2b64e"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x6f4aa3bc9732372daa288beb9b2516374ace5786","gas":"0xffff","gasPrice":"0x44e9acbc","maxFeePerGas":"0x44e9acbc","maxPriorityFeePerGas":"0x44e9acbc","hash":"0xecaa2d6f597608307e5084854854ba6dc1e69395e2abea14f2c6a2fa1d6faf9a","input":"0xe2864fe300000000000000000000000000000000000000000000000000000000000000200000000000000000000000006f4aa3bc9732372daa288beb9b2516374ace57860000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002004a8312e37fcecd450e6684009a2b54bc64f66afbe5217c7b2f63b03cd9980a9e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064893e8223d235ef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000173ad21460000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000def65f8e2f62bde60cd86ad3b4ad7fa6741cf175000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a7640000aaaebeba000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000006e512435020ac228a15543236b1f46656f98136300000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000d6ffd79b52a587a0a9941a61f4e6cb0d386d54580000000000000000000000000000000000000000000000000000000000000000","nonce":"0x83","to":"0x02afbd43cad367fcb71305a2dfb9a3928218f0c1","transactionIndex":"0x1b","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xa18772e4b9e1493ebfd5ae6219cc9ca060b71e83788fb614ab02b03fb36eaf1b","s":"0x482c7e50fde29bb4130fd6e723176e0e9913430ebb9260667d7fb55f5408d9c5","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xdb33365a8730de2f7574ff1189fb9d337bf4c36d","gas":"0x61a80","gasPrice":"0x433653c8","maxFeePerGas":"0x828367af","maxPriorityFeePerGas":"0x37e9071","hash":"0x4dd69b69a568ff30ae439e2ded72fbd7f2e7aaa345836703663f155c749c5eed","input":"0x7f34c0ddc6e984f46ab7c13b7a53643096e79c39103dc74550204d5bd1b5206ef5a2f49689071bb6a332212df26aa57cd4d1e3c0894187a9fc5e5d686cbedba5b187470f000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000e8c44c30e8e52c38ac7bd232e7b7f0c7463a535100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e516d5044645856613738437a6b7856325a364e52777a67685a785872736e75397261616a695a7555423569465a62000000000000000000000000000000000000","nonce":"0x2b57","to":"0xb8ad54644e2371cbb7940b9fa0936f399ba7495f","transactionIndex":"0x1c","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xa1fb0e5662b54ceb3dc1623ebfb200668433cb27252d553669bcd136387394f3","s":"0x27c2f8e19f69a52a0960f05d8b21f11c313dd3e86a7139b5783a18353c407415","yParity":"0x0"}],"transactionsRoot":"0x4a87d0cf5990b1c5bac631583e5965c2ba943858bebb2e07f74d0b697f73821a","uncles":[],"withdrawals":[{"index":"0x1170","validatorIndex":"0x38c2c","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x66edfd65"},{"index":"0x1171","validatorIndex":"0x38c2d","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6cd228e4"},{"index":"0x1172","validatorIndex":"0x38c2e","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x77f3431b"},{"index":"0x1173","validatorIndex":"0x38c2f","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6b61f268"},{"index":"0x1174","validatorIndex":"0x38c30","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6e10bb21"},{"index":"0x1175","validatorIndex":"0x38c31","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6eb115a5"},{"index":"0x1176","validatorIndex":"0x38c32","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7caead1d"},{"index":"0x1177","validatorIndex":"0x38c33","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x772c0ddf"},{"index":"0x1178","validatorIndex":"0x38c34","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x75930a95"},{"index":"0x1179","validatorIndex":"0x38c35","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76a4db09"},{"index":"0x117a","validatorIndex":"0x38c36","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7e692b27"},{"index":"0x117b","validatorIndex":"0x38c37","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x72038ae6"},{"index":"0x117c","validatorIndex":"0x38c38","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6ccce352"},{"index":"0x117d","validatorIndex":"0x38c39","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x79ef6898"},{"index":"0x117e","validatorIndex":"0x38c3a","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6d58977d"},{"index":"0x117f","validatorIndex":"0x38c3b","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76f7d208"}],"withdrawalsRoot":"0xbe712c930a0665264b025ced87cc7839eef95a3cbc26dadc93e9e185a350ad28"}
{"name":"post-shanghai-bad-receipts","fail":true}
{"baseFeePerGas":"0x3fb7c357","difficulty":"0x0","extraData":"0x","gasLimit":"0x1c9c380","gasUsed":"0x18f759","hash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","logsBloom":"0x020010404000001a0000021000000080001100410000100001000010040200980220400000008806200200000100000000000000000000008000000400042000000050000040000112080808800002044000040004042008800480002000000000000002020020000042002400000820000080040000000010200010020010100101212050000008000000008000001010200c80000112010000438040020400000000202400000000002002a0210402000622010000000001700144000040000000002204000000c000410105024010000808000000002004002000000261000000822200200800881000000012500400400000000000000040010000800000","miner":"0x000095e79eac4d76aab57cb2c1f091d553b36ca0","mixHash":"0x5b53dc49cbab268ef9950b1d81b5e36a1b2f1b97aee1b7ff6e4db0e06c29a8b0","nonce":"0x0000000000000000","number":"0x84161e","parentHash":"0x72d92c1498e05952988d4e79a695928a6bcbd37239f8a1734051263b4d3504b8","receiptsRoot":"0xaff90ae18dcc35924a4bddb68d403b8b7812c10c3ea2a114f34105c87d75bcdb","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2a51","stateRoot":"0xc56738518b2c7854a640ae25996d2211c9ef0dd2e4dd9e59e9d9cacef39622da","timestamp":"0x64110a5c","totalDifficulty":"0xa4a470","transactions":[{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x1b7aa44088a0ea95bdc65fef6e5071e946bf7d8f","gas":"0x5208","gasPrice":"0x4159f01735","hash":"0x1e8f148a9aea7d8d16ea6e9446723b8f262e8bcd89c7c961d52046ebd43b4598","input":"0x","nonce":"0x279ad","to":"0xa21765a03dd41e2783696d314f235f4d520f6cac","transactionIndex":"0x0","value":"0x3782dace9d90000","type":"0x0","chainId":"0x5","v":"0x2e","r":"0xf9eca8b74ccaec5f4a83e981baeb8602f38d0271179c592b4a18f3866316a367","s":"0x350a9d26718d1fa9dc4f268f9c0e18fb96dbc037816ca8fc20f33f1a76f9f501"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x4d9a852e6aecd3a6e87fece2ca109780e45e6f2d","gas":"0x160ab","gasPrice":"0xd4babc57","maxFeePerGas":"0x11407d03e","maxPriorityFeePerGas":"0x9502f900","hash":"0xab5c870f4c367012bd763172afbfbe68fbf35336a66ae41aff3f2c9dbf4ea3f8","input":"0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212200c479c99d58d7fbee5ee3aef5001431073a3d465bdfa46cf747a7c0b9289607864736f6c634300080d0033","nonce":"0xafd","to":null,"transactionIndex":"0x1","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x48f6acf4ac4371eb96ffca8cdef5b7704ea8c68a631d1c02927036d4ce92567e","s":"0x1f12261ddde63fd3da2ed9ea1bcbb4b0f25af898248c805a9d4b0a6e42caf9c8","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xce297b30e56bf2f6142c4048fbae1cb8a756fefd","gas":"0x557300","gasPrice":"0xd4babc57","maxFeePerGas":"0xfabdd183","maxPriorityFeePerGas":"0x9502f900","hash":"0xa81fd92b2d0f0bbd3cc355f869cca3243c98c5e2641db9ecf3eeabb3b13bff6a","input":"0x7bbaf1ea0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000","nonce":"0xad92","to":"0x4c0ce02c1219ce5d2afffba97e484272a4637b49","transactionIndex":"0x2","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xd11b842a5f7b0e020470e764b443fafc4044327bca8dbb37131425359abace2","s":"0x1009867573946fb0a4a35339a6eaaece4d0a168b2346539076e6319e9a466b1","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x47a916d0b694c95bc0c09953c1a6e22c8867be32","gas":"0x5208","gasPrice":"0x991ff257","maxFeePerGas":"0xb2fea055","maxPriorityFeePerGas":"0x59682f00","hash":"0xa92c7b720c08c83f1a0ed7e4c163200e30a3a8c03fcc5a51e685ea20cd0cb577","input":"0x","nonce":"0x2","to":"0xf955dfe99bbfd06a8be208274cd654ecfb66a45e","transactionIndex":"0x3","value":"0x11c37937e08000","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xeecd431225215c3ddc2e13cf16fa29f9a2ab1afbaa02988f3ceac27416edf0f5","s":"0x6494062330a9d509f7c778cb45cbcc9932e5f9b4ec94a1ec315f579f8d973b7b","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x672d214fe4db218defae698085a3ccefc773dfa9","gas":"0xf4f6","gasPrice":"0x991ff257","maxFeePerGas":"0xb2fea055","maxPriorityFeePerGas":"0x59682f00","hash":"0x6921b429ad2ec1e97d3457049ad2e893b5a0349beba47ca1c74a9540af75347a","input":"0xa1ddc546000000000000000000000000000000000000000000000000000000000000118f","nonce":"0x8e","to":"0xdef65f8e2f62bde60cd86ad3b4ad7fa6741cf175","transactionIndex":"0x4","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x4732ad21401b509bebb947a8566127fba1e245eb5a262ddc522d6867ab80567e","s":"0x2153013617fefdb06db0a7316d8883056441d33c2abf5ed6291fa0e3cc5c3a2f","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x0b12f7f996579fe7d9302d2574910121c214ee15","gas":"0x56a8","gasPrice":"0x991ff257","maxFeePerGas":"0xb2fea055","maxPriorityFeePerGas":"0x59682f00","hash":"0xf776b2da0b835dde05d0d8b76fd19385d61e7055036cf637f804b36dc94f2384","input":"0x71ec5c05aa669c4922569c1d33f7a81aaa21813800000000000000000000000013a0c5930c028511dc02665e7285134b6d11a5f40000000000000000000000000b12f7f996579fe7d9302d2574910121c214ee150000000000000000000000000000000000000000000000000000000000000000","nonce":"0xe","to":"0x7c125c1d515b8945841b3d5144a060115c58725f","transactionIndex":"0x5","value":"0x2386f26fc10000","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xc4505d4c46ef9a0103178e5ef4fbc857114ae5c4686b68b74d07c3ee3a86e575","s":"0x74db34fd675bea7d2ee74f14fd8709cb88c7d22c2267d12f2c671b5ebc180bd5","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xd36aac0c9676e984d72823fb662ce94d3ab5e551","gas":"0xff212","gasPrice":"0x991ff257","maxFeePerGas":"0xd86d063e","maxPriorityFeePerGas":"0x59682f00","hash":"0x9a08d899cd14ebb930ed59fa774afdb88a22615b3a931e930931ea54d26dc0bc","input":"0x49160658babdf216946a22b96c966ceeba750f14807726306ebeed500a2621a7481df010000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000084d6f6f6e6265616d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a3078434133633746363939643335333137316438434643364236334431433764333841333233373238300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0b616f73c8d00641109f0000054f967b8a135e44e233da070ea88c5e4a53bacac0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c6a3a17399d88e5dfd2de4fa41dcccade6a2d2170000000000000000000000008676147503f761e44b85df01811edd52be01b56c000000000000000000000000000000000000000000000000d02ab486cedc00000000000000000000000000000000000000000000000000000de0b6b3a7640000","nonce":"0x7121","to":"0x2d276bd64fe8643a1d76b2e9530c753423e972c1","transactionIndex":"0x6","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xce452361d331baf2ac86947a1b3b454b3e842923e1f39139b33a572845dd5d7c","s":"0x388126881782af5a146ce8409f1e3a2c9a4cadcfe9a2c1d27258af6e4eb5cec1","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xb83a48ee322989a0a4f838cb207abc28ec021b73","gas":"0x326ff","gasPrice":"0x991ff257","maxFeePerGas":"0x5c3362b9c","maxPriorityFeePerGas":"0x59682f00","hash":"0x0fe0d97e25d5eb11a33a3e8278584c3780941fc2675bdf8fc547cee3d1fd3b17","input":"0xa4110dbe190e65a7fe0ad5acd305c6446a02cb39de30f382000fe67927434063bf4c4b2ca86b3ee6d039dc7a0268f9e1c39266c3f12a752a7eb72f0895dedf62291fd292","nonce":"0x12e","to":"0x96e6192eeaf7bb308f79fb5017a9085754b9e12a","transactionIndex":"0x7","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x46819bb540fa459a5a0cbf041a0286507d597fc8958a6af8b9ce193f00005238","s":"0x31495c58bf4b74925f870c59635912681bee947b1cb4b08cc19f22421b1a10ab","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xb83a48ee322989a0a4f838cb207abc28ec021b73","gas":"0x3270b","gasPrice":"0x991ff257","maxFeePerGas":"0x5c3362b9c","maxPriorityFeePerGas":"0x59682f00","hash":"0xef47a60f57f177a683c723c658137efab66d311e1c5abbc4d74f653535144d03","input":"0xa4110dbe18eba3e815ec7fcb03a8eea0487209c3253024d1dc4f36f775a43fdd3e409b74c0a5c88e54f39b88db6f185a41431b204120d3e66c9b08b86f5e8382623327e5","nonce":"0x12f","to":"0x96e6192eeaf7bb308f79fb5017a9085754b9e12a","transactionIndex":"0x8","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x4d7e11fe3914763a2735493a62b71ae0028e75a750a8b06407996cf478e273c8","s":"0x60c18fdf948721f96fdc2efbf694910122e82191c7a40a5caab247c06ab7f3cf","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x7712a1f96b3f37c3dd88a22d4f7a7977b937fe62","gas":"0x1ff06","gasPrice":"0x991ff257","maxFeePerGas":"0xcf662006","maxPriorityFeePerGas":"0x59682f00","hash":"0xe23a5b35faae5335adc5aca38c5d633b00438b798c2053104b8df48406c9b141","input":"0x3ff9751b0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000002e516d566e75374a51566f445271536748427a72615970374879373848774a744c4669366e5546436f775447647a70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e516d5439716b3343525962464457704446596541763854384831676e6f6e67774b6868354a36384e4c6b4c6972360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c9f31b989aaa745aecc563139f89c8ab3ab492e725d1e0305b7d602fcbf9293c463f0d2e4f5fb0c9efb54eb2cde9af10ebc9c3676f2334007291ffa8efb40adb1c00000000000000000000000000000000000000000000000000000000000000","nonce":"0x16","to":"0xc3b87ea584cb9cb5a4523e2bed16a34bf7746317","transactionIndex":"0x9","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xcc693a9544394653e1f393f02635e2c1f78b5e6c26c4d00a867bcf4adc2bc09e","s":"0x23f4b71b773c19f77cf251b2aeea03f2696bddd847d1f6d75acd2fbea6a543e4","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x12bbafcfa06423d87bed591a64c1a1f34791e90a","gas":"0x1b2e020","gasPrice":"0x8f0d3617","maxFeePerGas":"0x1cb3abd5a","maxPriorityFeePerGas":"0x4f5572c0","hash":"0xd8cea4ba619b317bc05d58534af73beec6c2548b31b24d4dc61c9bbd29cfa17a","input":"0x","nonce":"0x4d","to":"0x12bbafcfa06423d87bed591a64c1a1f34791e90a","transactionIndex":"0xa","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x8dae28608985d6ab47cbe122ee88972e38664cede30978f41944f347bad86e5c","s":"0x17c2898b39b7e3b874dc78e7df3fcff68f4d715385c632aad4bdf6e62505651c","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x6999c36394dd5d3d3295af63a4736ad6bd279448","gas":"0x14d94","gasPrice":"0x7b528d57","maxFeePerGas":"0x7df743e0","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x79a4b9d90b02c768baaad305f266281213cc75062cbe99a13222cc0c4b509498","input":"0x6a7612020000000000000000000000009008d19f58aabd9ed0d60971565aa8510560ab4100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000a4ec6cb13f00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003826d8d7371becafc0afedc3fe85b699b87f4357d55ec39ce83c510ed7d70ff514dce8236351f4627ccec6a7d9a67bc6fc2ec17ca76411113c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000006999c36394dd5d3d3295af63a4736ad6bd27944800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000","nonce":"0x13","to":"0xdce8236351f4627ccec6a7d9a67bc6fc2ec17ca7","transactionIndex":"0xb","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x669487011643510f7512ec15b07d74efb853ba4ad9fe9c7e9850ccf24e3d4c53","s":"0x2191f9ee81087e1df833e69d6129ec330ed4c99be2031060834e22c589fcf79b","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x08ebc052e6353b4d8392113f0f2c5decd691ddcd","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0xf6e4d9c4","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x6790a3bbddbeb21fcb736a59b3775755051c3a6344d8390cf8ca27f2e8a814f0","input":"0x6871ee40","nonce":"0x4","to":"0xb21b333c40354393f18de57f2d0a0fc21f270482","transactionIndex":"0xc","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xa7a58ab858e5dd87b9a74d550e5716ac40ddefd1c21d5baa51e542f4f941d73e","s":"0x1fd0cb1563df0368bd332717d7c8210187cd1ac2ff44f61f5242fc02eaa0c2fe","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x08ebc052e6353b4d8392113f0f2c5decd691ddcd","gas":"0x12c36","gasPrice":"0x7b528d57","maxFeePerGas":"0xe596c292","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x87ec7ace5442db252b5751ffddd38dcb04b088d36b6b0e526ff25607a4293c81","input":"0xcb40cbfd","nonce":"0x5","to":"0xb21b333c40354393f18de57f2d0a0fc21f270482","transactionIndex":"0xd","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x8e4bd40195bdfaa868af97dbf22e0b74295d95564a8381bc9bcfe1af3cde2cdb","s":"0x62057dc87c8b2b197d12c648233aab4134b7c2a2f65db89a49728564f3d0864d","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x08ebc052e6353b4d8392113f0f2c5decd691ddcd","gas":"0x12c36","gasPrice":"0x7b528d57","maxFeePerGas":"0xe596c292","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x40cb487ecffda94f97ce7fc0f7163f2f024235df2c8291169edc80dac063e6d0","input":"0xcb40cbfd","nonce":"0x6","to":"0xb21b333c40354393f18de57f2d0a0fc21f270482","transactionIndex":"0xe","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x993c4386ffc2bd63a48dd31cf5f65aa355cba3c063b08778b328d748937098e5","s":"0x203b1faf595628dd78e760bcc1740065625abb6cf00b1b17224e10fa6b424e43","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xafc7682751d3654f34958e3fb660971bf5918367","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0xefb40664","maxPriorityFeePerGas":"0x3b9aca00","hash":"0xb76bb3d88c9b30d927c45ccfcf8d5b0054411ac8501ad588822a7d04690cccf6","input":"0x40c10f19000000000000000000000000afc7682751d3654f34958e3fb660971bf59183670000000000000000000000000000000000000000000000008ac7230489e80000","nonce":"0x20","to":"0x84ced17d95f3ec7230baf4a369f1e624ae60090d","transactionIndex":"0xf","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x78e9d29c606f6a61a1428ed7326df05210d802c3061f3b469847cc461eb48025","s":"0x517afe5a21175f186233ae7a6c090cd33e028a77e5854e98eb2fa4c9284430e7","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x12bbafcfa06423d87bed591a64c1a1f34791e90a","gas":"0xcafe","gasPrice":"0x7b528d57","maxFeePerGas":"0x16ba45bce","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x798ebe823209869347c08bd81e04fbf60e9bdfe44b1cc923215182d0cf3d4edb","input":"0x40c10f1900000000000000000000000012bbafcfa06423d87bed591a64c1a1f34791e90a0000000000000000000000000000000000000000000000000000000000000032","nonce":"0x4e","to":"0xd25d682189afa7ed0c2811195b3f3d07616927bc","transactionIndex":"0x10","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xbe2aa95f4c32188c9ecbae97286ab983f7cc5a7017d46c404f8eb80b55e2dc13","s":"0x55d8968f509f51633f49260178941fd5a3db999e1995206348d7a3f05152b3d5","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x12bbafcfa06423d87bed591a64c1a1f34791e90a","gas":"0xcafe","gasPrice":"0x7b528d57","maxFeePerGas":"0xc6132c0c","maxPriorityFeePerGas":"0x3b9aca00","hash":"0xbe68a7e02725f799a65ebb069ccc83a014ac7c40e4119bf7c220a2f6ddfee295","input":"0x40c10f1900000000000000000000000012bbafcfa06423d87bed591a64c1a1f34791e90a0000000000000000000000000000000000000000000000000000000000000064","nonce":"0x4f","to":"0xd25d682189afa7ed0c2811195b3f3d07616927bc","transactionIndex":"0x11","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x1750ed45d0d2d048a61dcc3ff3e7ad0cbd395b77698c4f2eeb6baaea4c966d96","s":"0xe646e3a87b6dc50439468bcfd24cbf12a6f95b2762f1527c97a7d1b7f03530e","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xd0c0338baac9ce09c1d1caab88b4360507061e37","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0x1918167aa","maxPriorityFeePerGas":"0x3b9aca00","hash":"0xc90c3a72efe81331727fcce4b5bd4906066da314ca9a0b44023a6b09ea7e8114","input":"0x4e71d92d","nonce":"0xe7","to":"0x0137d796936e199b917b93118eb4e002508a48bd","transactionIndex":"0x12","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x22222ce8fe753082c8e5dc7478fa7b87db9c8d0fb070ebc88ab015db13fd6bb","s":"0x6dceadecf6f6a3ddc433a547dba6d5fcdfb7d006ce09eeae1c06c1828ef9fff9","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x8bd834cc1dd17d1a2f7eb6140c3dd5ab51d0f338","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0x1a4019792","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x619a6cbd43cde074d314c19623bd66d9fb1e13c158d7138775236f798dc1245e","input":"0x1da1db5e00000000000000000000000000000000000000000000000000001b5ec4ff740d","nonce":"0x10","to":"0xbad0009f7a8e796e3f975dc1d6ab3e3c237b857c","transactionIndex":"0x13","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x733c496e8c84f78d113bc8b5ad6d04a133bb10bbcecf0db93d97eeedfa3d984a","s":"0x6627c16aa7dea27db44c0f0641c30ffd544b9b9b1c299dc60611e1e01c714ee8","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x8bd834cc1dd17d1a2f7eb6140c3dd5ab51d0f338","gas":"0x11df0","gasPrice":"0x7b528d57","maxFeePerGas":"0x1d3fbccb8","maxPriorityFeePerGas":"0x3b9aca00","hash":"0xca5a56cd77b9e5b0e79020cc6346edf205bc11e901984d805125f28c2e6686e6","input":"0xd7c01032000000000000000000000000356f24c0f3187a6dcb949e4a60aa0a74a8a0327e0000000000000000000000000f8bacfae87aee49a2eec86df0c6b958ec3fd4fd0000000000000000000000000f8bacfae87aee49a2eec86df0c6b958ec3fd4fd","nonce":"0x11","to":"0xbad0009f7a8e796e3f975dc1d6ab3e3c237b857c","transactionIndex":"0x14","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x4aa872c1a7da70126917604193717575b91407f82449bca956d4089b90cd902","s":"0x4b5f788c68024f8958f66e8c768a8e0f65ef297c4ffd420a715258b0a55cb0a0","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x9bedd66b05712a1add7d1fec899b8641b3ecc863","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0x1e706c8d2","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x999c9ddeed67c6ef6fbf02a6e977a6c1b68e18d24814e51643c7157b87a43e0a","input":"0xa8b78ed0","nonce":"0x3","to":"0xf6c2afb18b85175e5ffb28f20f007c047ce28592","transactionIndex":"0x15","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xf1ca074104ee0b6a67223afd797654b8f21060453f7662dd7be79de938c396da","s":"0x4c9a4e56f0ad21e2dd8d1116c7a3e41ea2c6126853772f7897bd959e81e2e28a","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x9bedd66b05712a1add7d1fec899b8641b3ecc863","gas":"0x2dc6c0","gasPrice":"0xd4babc57","maxFeePerGas":"0x21c13e710","maxPriorityFeePerGas":"0x9502f900","hash":"0x47c8f5d0b3778e4c34eba7fcc356fa04a5afd954ccf484728e72c002764dd3c4","input":"0xf688bcfb0000000000000000000000000000000000000000000000000000000005f5e100","nonce":"0x4","to":"0xf6c2afb18b85175e5ffb28f20f007c047ce28592","transactionIndex":"0x16","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x970982425d18b9949141bbabb5c5230fa168626ce210a97f3856d64700fc0eeb","s":"0x6fa6d0aea6ae48783d80c1e51cda47e11c28b90a5497579b93d7f242d786f67e","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x4b596cebd02c35aa99878eb9ecb24d6f5ca5f865","gas":"0x5208","gasPrice":"0x68c88f79","maxFeePerGas":"0x68c88f79","maxPriorityFeePerGas":"0x68c88f79","hash":"0x396797ae0ebcdb72ff1f96fd08b6128f78acc7417353f142f1a5facd425a33e6","input":"0x","nonce":"0x1","to":"0x375980b8e1a417620ba9b18e5a9e0b17dccbac9d","transactionIndex":"0x17","value":"0x1c9a406c58878","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xcb2a7b106097b2f2a61d3a048054a5175c386b1dcdd5b6fcd7849dcac7c32a66","s":"0x10aef76e98276c47470f04a599b81c260ace9d2f6adc95755c6d22d859e805a2","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x6f4aa3bc9732372daa288beb9b2516374ace5786","gas":"0x1b2e020","gasPrice":"0x61010bda","maxFeePerGas":"0x61010bda","maxPriorityFeePerGas":"0x61010bda","hash":"0x454aa43d6546a6f62246826c16b7a49c6c704238c18802ef0d659922f23a573c","input":"0xe99a3f8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000058ce7eb44ae575fb3b3974861c1138dad3c5aee40000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e06defd69964a6ce467b87c64627a7a2be4be139b504757c625eb6114ec166557d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000641a269023d235ef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000002b05699353b600008ae85d840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b4fbf271143f4fbf7b91a5ded31805e42b2208d600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001f63c28250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000def65f8e2f62bde60cd86ad3b4ad7fa6741cf17500000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000006e512435020ac228a15543236b1f46656f98136300000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000d6ffd79b52a587a0a9941a61f4e6cb0d386d5458000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000413e24433da3efc4c3cc305339a7b77a1b31abb4e4d4967e97e42aed1dd0bf98936f43035f40bc80f6f6e3a9cfb43524a1171ee7f21e9ac2fa586d33a31f10619d1c000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f4aa3bc9732372daa288beb9b2516374ace5786000000000000000000000000000000000000000000000000000000000000012000000000000000000000000058ce7eb44ae575fb3b3974861c1138dad3c5aee400000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000641a269023d235ef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000173ad21460000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000def65f8e2f62bde60cd86ad3b4ad7fa6741cf1750000000000000000000000000000000000000000000000000000000000000ba200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000002b05699353b600008ae85d840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b4fbf271143f4fbf7b91a5ded31805e42b2208d600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000def65f8e2f62bde60cd86ad3b4ad7fa6741cf175ffffffff09616c6c64617461","nonce":"0x82","to":"0x02afbd43cad367fcb71305a2dfb9a3928218f0c1","transactionIndex":"0x18","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xc7ac308b1ae238cb2aa4b030ca79baffb7b498e1b10df0c3354b3cc19cfabac9","s":"0x2358b1093b9aab5fae0cf751766b0bb2e3d8cd2b18ca627e1e12520990a8ed6d","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x6ece61d29b90642941c41240da924690da145696","gas":"0x4399c","gasPrice":"0x506794e0","hash":"0x317ecb5bd19caa42a69f836d41556ebb0e0e00e1c6cd2dee230e6e6192612527","input":"0x46f83b5000000000000000000000000000000000000000000000000000000000000000654666803decc59e7d0a5d3efa3c3653c05645ef4342738445e20a3b43e0b4aa8b000000000000000000000000000000000000000000000000000000000000000f4666803decc59e7d0a5d3efa3c3653c05645ef4342738445e20a3b43e0b4aa8b","nonce":"0x2cc4","to":"0xa6bf2be6c60175601bf88217c75dd4b14abb5fbb","transactionIndex":"0x19","value":"0x0","type":"0x0","chainId":"0x5","v":"0x2d","r":"0x37aeab0db6d550e6cba2c04c9cb10a2af0fec0b11f6e04b85e1ea0b8b9defeae","s":"0x4f32f4ef74872e1385c25e69bf21ee049545a4d423e939eaff29677450efe9eb"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xc4a5c059840a146b81c77bf79f1398f2b3d28ca7","gas":"0x432ec","gasPrice":"0x45db0a51","hash":"0xc879285db5ef0a6bce98021584d16f134c1dc0aed8cc988802c4f72ba6877ff6","input":"0x9f8420b300000000000000000000000000000000000000000000000000470de4df8200000000000000000000000000000000000000000000000000000000000000009c40","nonce":"0x1a7","to":"0xe5e30e7c24e4dfcb281a682562e53154c15d3332","transactionIndex":"0x1a","value":"0x470efc4514e000","type":"0x0","chainId":"0x5","v":"0x2d","r":"0x237e3a541c5ab490843cdc20d0fcb7416bff8da471f6a11ae1b32d2bab119141","s":"0x3c8417d7a60bd5b0bcae4975dbb4aaee54a4b4d588226481be400843bfe2b64e"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x6f4aa3bc9732372daa288beb9b2516374ace5786","gas":"0xffff","gasPrice":"0x44e9acbc","maxFeePerGas":"0x44e9acbc","maxPriorityFeePerGas":"0x44e9acbc","hash":"0xecaa2d6f597608307e5084854854ba6dc1e69395e2abea14f2c6a2fa1d6faf9a","input":"0xe2864fe300000000000000000000000000000000000000000000000000000000000000200000000000000000000000006f4aa3bc9732372daa288beb9b2516374ace57860000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002004a8312e37fcecd450e6684009a2b54bc64f66afbe5217c7b2f63b03cd9980a9e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064893e8223d235ef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000173ad21460000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000def65f8e2f62bde60cd86ad3b4ad7fa6741cf175000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a7640000aaaebeba000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000006e512435020ac228a15543236b1f46656f98136300000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000d6ffd79b52a587a0a9941a61f4e6cb0d386d54580000000000000000000000000000000000000000000000000000000000000000","nonce":"0x83","to":"0x02afbd43cad367fcb71305a2dfb9a3928218f0c1","transactionIndex":"0x1b","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xa18772e4b9e1493ebfd5ae6219cc9ca060b71e83788fb614ab02b03fb36eaf1b","s":"0x482c7e50fde29bb4130fd6e723176e0e9913430ebb9260667d7fb55f5408d9c5","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xdb33365a8730de2f7574ff1189fb9d337bf4c36d","gas":"0x61a80","gasPrice":"0x433653c8","maxFeePerGas":"0x828367af","maxPriorityFeePerGas":"0x37e9071","hash":"0x4dd69b69a568ff30ae439e2ded72fbd7f2e7aaa345836703663f155c749c5eed","input":"0x7f34c0ddc6e984f46ab7c13b7a53643096e79c39103dc74550204d5bd1b5206ef5a2f49689071bb6a332212df26aa57cd4d1e3c0894187a9fc5e5d686cbedba5b187470f000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000e8c44c30e8e52c38ac7bd232e7b7f0c7463a535100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e516d5044645856613738437a6b7856325a364e52777a67685a785872736e75397261616a695a7555423569465a62000000000000000000000000000000000000","nonce":"0x2b57","to":"0xb8ad54644e2371cbb7940b9fa0936f399ba7495f","transactionIndex":"0x1c","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xa1fb0e5662b54ceb3dc1623ebfb200668433cb27252d553669bcd136387394f3","s":"0x27c2f8e19f69a52a0960f05d8b21f11c313dd3e86a7139b5783a18353c407415","yParity":"0x0"}],"transactionsRoot":"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","uncles":[],"withdrawals":[{"index":"0x1170","validatorIndex":"0x38c2c","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x66edfd65"},{"index":"0x1171","validatorIndex":"0x38c2d","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6cd228e4"},{"index":"0x1172","validatorIndex":"0x38c2e","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x77f3431b"},{"index":"0x1173","validatorIndex":"0x38c2f","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6b61f268"},{"index":"0x1174","validatorIndex":"0x38c30","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6e10bb21"},{"index":"0x1175","validatorIndex":"0x38c31","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6eb115a5"},{"index":"0x1176","validatorIndex":"0x38c32","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7caead1d"},{"index":"0x1177","validatorIndex":"0x38c33","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x772c0ddf"},{"index":"0x1178","validatorIndex":"0x38c34","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x75930a95"},{"index":"0x1179","validatorIndex":"0x38c35","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76a4db09"},{"index":"0x117a","validatorIndex":"0x38c36","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7e692b27"},{"index":"0x117b","validatorIndex":"0x38c37","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x72038ae6"},{"index":"0x117c","validatorIndex":"0x38c38","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6ccce352"},{"index":"0x117d","validatorIndex":"0x38c39","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x79ef6898"},{"index":"0x117e","validatorIndex":"0x38c3a","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6d58977d"},{"index":"0x117f","validatorIndex":"0x38c3b","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76f7d208"}],"withdrawalsRoot":"0xbe712c930a0665264b025ced87cc7839eef95a3cbc26dadc93e9e185a350ad28"}
{"name":"post-shanghai-bad-transactions","fail":true}
{"baseFeePerGas":"0x3fb7c357","difficulty":"0x0","extraData":"0x","gasLimit":"0x1c9c380","gasUsed":"0x18f759","hash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","logsBloom":"0x020010404000001a0000021000000080001100410000100001000010040200980220400000008806200200000100000000000000000000008000000400042000000050000040000112080808800002044000040004042008800480002000000000000002020020000042002400000820000080040000000010200010020010100101212050000008000000008000001010200c80000112010000438040020400000000202400000000002002a0210402000622010000000001700144000040000000002204000000c000410105024010000808000000002004002000000261000000822200200800881000000012500400400000000000000040010000800000","miner":"0x000095e79eac4d76aab57cb2c1f091d553b36ca0","mixHash":"0x5b53dc49cbab268ef9950b1d81b5e36a1b2f1b97aee1b7ff6e4db0e06c29a8b0","nonce":"0x0000000000000000","number":"0x84161e","parentHash":"0x72d92c1498e05952988d4e79a695928a6bcbd37239f8a1734051263b4d3504b8","receiptsRoot":"0xaff90ae18dcc35924a4bddb68d403b8b7812c10c3ea2a114f34105c87d75bcdb","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2a51","stateRoot":"0xc56738518b2c7854a640ae25996d2211c9ef0dd2e4dd9e59e9d9cacef39622da","timestamp":"0x64110a5c","totalDifficulty":"0xa4a470","transactions":[{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x1b7aa44088a0ea95bdc65fef6e5071e946bf7d8f","gas":"0x5208","gasPrice":"0x4159f01735","hash":"0x1e8f148a9aea7d8d16ea6e9446723b8f262e8bcd89c7c961d52046ebd43b4598","input":"0x","nonce":"0x279ad","to":"0xa21765a03dd41e2783696d314f235f4d520f6cac","transactionIndex":"0x0","value":"0x3782dace9d90000","type":"0x0","chainId":"0x5","v":"0x2e","r":"0xf9eca8b74ccaec5f4a83e981baeb8602f38d0271179c592b4a18f3866316a367","s":"0x350a9d26718d1fa9dc4f268f9c0e18fb96dbc037816ca8fc20f33f1a76f9f501"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x4d9a852e6aecd3a6e87fece2ca109780e45e6f2d","gas":"0x160ab","gasPrice":"0xd4babc57","maxFeePerGas":"0x11407d03e","maxPriorityFeePerGas":"0x9502f900","hash":"0xab5c870f4c367012bd763172afbfbe68fbf35336a66ae41aff3f2c9dbf4ea3f8","input":"0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212200c479c99d58d7fbee5ee3aef5001431073a3d465bdfa46cf747a7c0b9289607864736f6c634300080d0033","nonce":"0xafd","to":null,"transactionIndex":"0x1","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x48f6acf4ac4371eb96ffca8cdef5b7704ea8c68a631d1c02927036d4ce92567e","s":"0x1f12261ddde63fd3da2ed9ea1bcbb4b0f25af898248c805a9d4b0a6e42caf9c8","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xce297b30e56bf2f6142c4048fbae1cb8a756fefd","gas":"0x557300","gasPrice":"0xd4babc57","maxFeePerGas":"0xfabdd183","maxPriorityFeePerGas":"0x9502f900","hash":"0xa81fd92b2d0f0bbd3cc355f869cca3243c98c5e2641db9ecf3eeabb3b13bff6a","input":"0x7bbaf1ea0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000","nonce":"0xad92","to":"0x4c0ce02c1219ce5d2afffba97e484272a4637b49","transactionIndex":"0x2","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xd11b842a5f7b0e020470e764b443fafc4044327bca8dbb37131425359abace2","s":"0x1009867573946fb0a4a35339a6eaaece4d0a168b2346539076e6319e9a466b1","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x47a916d0b694c95bc0c09953c1a6e22c8867be32","gas":"0x5208","gasPrice":"0x991ff257","maxFeePerGas":"0xb2fea055","maxPriorityFeePerGas":"0x59682f00","hash":"0xa92c7b720c08c83f1a0ed7e4c163200e30a3a8c03fcc5a51e685ea20cd0cb577","input":"0x","nonce":"0x2","to":"0xf955dfe99bbfd06a8be208274cd654ecfb66a45e","transactionIndex":"0x3","value":"0x11c37937e08000","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xeecd431225215c3ddc2e13cf16fa29f9a2ab1afbaa02988f3ceac27416edf0f5","s":"0x6494062330a9d509f7c778cb45cbcc9932e5f9b4ec94a1ec315f579f8d973b7b","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x672d214fe4db218defae698085a3ccefc773dfa9","gas":"0xf4f6","gasPrice":"0x991ff257","maxFeePerGas":"0xb2fea055","maxPriorityFeePerGas":"0x59682f00","hash":"0x6921b429ad2ec1e97d3457049ad2e893b5a0349beba47ca1c74a9540af75347a","input":"0xa1ddc546000000000000000000000000000000000000000000000000000000000000118f","nonce":"0x8e","to":"0xdef65f8e2f62bde60cd86ad3b4ad7fa6741cf175","transactionIndex":"0x4","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x4732ad21401b509bebb947a8566127fba1e245eb5a262ddc522d6867ab80567e","s":"0x2153013617fefdb06db0a7316d8883056441d33c2abf5ed6291fa0e3cc5c3a2f","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x0b12f7f996579fe7d9302d2574910121c214ee15","gas":"0x56a8","gasPrice":"0x991ff257","maxFeePerGas":"0xb2fea055","maxPriorityFeePerGas":"0x59682f00","hash":"0xf776b2da0b835dde05d0d8b76fd19385d61e7055036cf637f804b36dc94f2384","input":"0x71ec5c05aa669c4922569c1d33f7a81aaa21813800000000000000000000000013a0c5930c028511dc02665e7285134b6d11a5f40000000000000000000000000b12f7f996579fe7d9302d2574910121c214ee150000000000000000000000000000000000000000000000000000000000000000","nonce":"0xe","to":"0x7c125c1d515b8945841b3d5144a060115c58725f","transactionIndex":"0x5","value":"0x2386f26fc10000","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xc4505d4c46ef9a0103178e5ef4fbc857114ae5c4686b68b74d07c3ee3a86e575","s":"0x74db34fd675bea7d2ee74f14fd8709cb88c7d22c2267d12f2c671b5ebc180bd5","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xd36aac0c9676e984d72823fb662ce94d3ab5e551","gas":"0xff212","gasPrice":"0x991ff257","maxFeePerGas":"0xd86d063e","maxPriorityFeePerGas":"0x59682f00","hash":"0x9a08d899cd14ebb930ed59fa774afdb88a22615b3a931e930931ea54d26dc0bc","input":"0x49160658babdf216946a22b96c966ceeba750f14807726306ebeed500a2621a7481df010000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000084d6f6f6e6265616d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a3078434133633746363939643335333137316438434643364236334431433764333841333233373238300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0b616f73c8d00641109f0000054f967b8a135e44e233da070ea88c5e4a53bacac0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c6a3a17399d88e5dfd2de4fa41dcccade6a2d2170000000000000000000000008676147503f761e44b85df01811edd52be01b56c000000000000000000000000000000000000000000000000d02ab486cedc00000000000000000000000000000000000000000000000000000de0b6b3a7640000","nonce":"0x7121","to":"0x2d276bd64fe8643a1d76b2e9530c753423e972c1","transactionIndex":"0x6","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xce452361d331baf2ac86947a1b3b454b3e842923e1f39139b33a572845dd5d7c","s":"0x388126881782af5a146ce8409f1e3a2c9a4cadcfe9a2c1d27258af6e4eb5cec1","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xb83a48ee322989a0a4f838cb207abc28ec021b73","gas":"0x326ff","gasPrice":"0x991ff257","maxFeePerGas":"0x5c3362b9c","maxPriorityFeePerGas":"0x59682f00","hash":"0x0fe0d97e25d5eb11a33a3e8278584c3780941fc2675bdf8fc547cee3d1fd3b17","input":"0xa4110dbe190e65a7fe0ad5acd305c6446a02cb39de30f382000fe67927434063bf4c4b2ca86b3ee6d039dc7a0268f9e1c39266c3f12a752a7eb72f0895dedf62291fd292","nonce":"0x12e","to":"0x96e6192eeaf7bb308f79fb5017a9085754b9e12a","transactionIndex":"0x7","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x46819bb540fa459a5a0cbf041a0286507d597fc8958a6af8b9ce193f00005238","s":"0x31495c58bf4b74925f870c59635912681bee947b1cb4b08cc19f22421b1a10ab","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xb83a48ee322989a0a4f838cb207abc28ec021b73","gas":"0x3270b","gasPrice":"0x991ff257","maxFeePerGas":"0x5c3362b9c","maxPriorityFeePerGas":"0x59682f00","hash":"0xef47a60f57f177a683c723c658137efab66d311e1c5abbc4d74f653535144d03","input":"0xa4110dbe18eba3e815ec7fcb03a8eea0487209c3253024d1dc4f36f775a43fdd3e409b74c0a5c88e54f39b88db6f185a41431b204120d3e66c9b08b86f5e8382623327e5","nonce":"0x12f","to":"0x96e6192eeaf7bb308f79fb5017a9085754b9e12a","transactionIndex":"0x8","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x4d7e11fe3914763a2735493a62b71ae0028e75a750a8b06407996cf478e273c8","s":"0x60c18fdf948721f96fdc2efbf694910122e82191c7a40a5caab247c06ab7f3cf","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x7712a1f96b3f37c3dd88a22d4f7a7977b937fe62","gas":"0x1ff06","gasPrice":"0x991ff257","maxFeePerGas":"0xcf662006","maxPriorityFeePerGas":"0x59682f00","hash":"0xe23a5b35faae5335adc5aca38c5d633b00438b798c2053104b8df48406c9b141","input":"0x3ff9751b0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000002e516d566e75374a51566f445271536748427a72615970374879373848774a744c4669366e5546436f775447647a70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e516d5439716b3343525962464457704446596541763854384831676e6f6e67774b6868354a36384e4c6b4c6972360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c9f31b989aaa745aecc563139f89c8ab3ab492e725d1e0305b7d602fcbf9293c463f0d2e4f5fb0c9efb54eb2cde9af10ebc9c3676f2334007291ffa8efb40adb1c00000000000000000000000000000000000000000000000000000000000000","nonce":"0x16","to":"0xc3b87ea584cb9cb5a4523e2bed16a34bf7746317","transactionIndex":"0x9","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xcc693a9544394653e1f393f02635e2c1f78b5e6c26c4d00a867bcf4adc2bc09e","s":"0x23f4b71b773c19f77cf251b2aeea03f2696bddd847d1f6d75acd2fbea6a543e4","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x12bbafcfa06423d87bed591a64c1a1f34791e90a","gas":"0x1b2e020","gasPrice":"0x8f0d3617","maxFeePerGas":"0x1cb3abd5a","maxPriorityFeePerGas":"0x4f5572c0","hash":"0xd8cea4ba619b317bc05d58534af73beec6c2548b31b24d4dc61c9bbd29cfa17a","input":"0x","nonce":"0x4d","to":"0x12bbafcfa06423d87bed591a64c1a1f34791e90a","transactionIndex":"0xa","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x8dae28608985d6ab47cbe122ee88972e38664cede30978f41944f347bad86e5c","s":"0x17c2898b39b7e3b874dc78e7df3fcff68f4d715385c632aad4bdf6e62505651c","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x6999c36394dd5d3d3295af63a4736ad6bd279448","gas":"0x14d94","gasPrice":"0x7b528d57","maxFeePerGas":"0x7df743e0","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x79a4b9d90b02c768baaad305f266281213cc75062cbe99a13222cc0c4b509498","input":"0x6a7612020000000000000000000000009008d19f58aabd9ed0d60971565aa8510560ab4100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000a4ec6cb13f00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003826d8d7371becafc0afedc3fe85b699b87f4357d55ec39ce83c510ed7d70ff514dce8236351f4627ccec6a7d9a67bc6fc2ec17ca76411113c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000006999c36394dd5d3d3295af63a4736ad6bd27944800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000","nonce":"0x13","to":"0xdce8236351f4627ccec6a7d9a67bc6fc2ec17ca7","transactionIndex":"0xb","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x669487011643510f7512ec15b07d74efb853ba4ad9fe9c7e9850ccf24e3d4c53","s":"0x2191f9ee81087e1df833e69d6129ec330ed4c99be2031060834e22c589fcf79b","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x08ebc052e6353b4d8392113f0f2c5decd691ddcd","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0xf6e4d9c4","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x6790a3bbddbeb21fcb736a59b3775755051c3a6344d8390cf8ca27f2e8a814f0","input":"0x6871ee40","nonce":"0x4","to":"0xb21b333c40354393f18de57f2d0a0fc21f270482","transactionIndex":"0xc","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xa7a58ab858e5dd87b9a74d550e5716ac40ddefd1c21d5baa51e542f4f941d73e","s":"0x1fd0cb1563df0368bd332717d7c8210187cd1ac2ff44f61f5242fc02eaa0c2fe","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x08ebc052e6353b4d8392113f0f2c5decd691ddcd","gas":"0x12c36","gasPrice":"0x7b528d57","maxFeePerGas":"0xe596c292","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x87ec7ace5442db252b5751ffddd38dcb04b088d36b6b0e526ff25607a4293c81","input":"0xcb40cbfd","nonce":"0x5","to":"0xb21b333c40354393f18de57f2d0a0fc21f270482","transactionIndex":"0xd","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x8e4bd40195bdfaa868af97dbf22e0b74295d95564a8381bc9bcfe1af3cde2cdb","s":"0x62057dc87c8b2b197d12c648233aab4134b7c2a2f65db89a49728564f3d0864d","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x08ebc052e6353b4d8392113f0f2c5decd691ddcd","gas":"0x12c36","gasPrice":"0x7b528d57","maxFeePerGas":"0xe596c292","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x40cb487ecffda94f97ce7fc0f7163f2f024235df2c8291169edc80dac063e6d0","input":"0xcb40cbfd","nonce":"0x6","to":"0xb21b333c40354393f18de57f2d0a0fc21f270482","transactionIndex":"0xe","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x993c4386ffc2bd63a48dd31cf5f65aa355cba3c063b08778b328d748937098e5","s":"0x203b1faf595628dd78e760bcc1740065625abb6cf00b1b17224e10fa6b424e43","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xafc7682751d3654f34958e3fb660971bf5918367","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0xefb40664","maxPriorityFeePerGas":"0x3b9aca00","hash":"0xb76bb3d88c9b30d927c45ccfcf8d5b0054411ac8501ad588822a7d04690cccf6","input":"0x40c10f19000000000000000000000000afc7682751d3654f34958e3fb660971bf59183670000000000000000000000000000000000000000000000008ac7230489e80000","nonce":"0x20","to":"0x84ced17d95f3ec7230baf4a369f1e624ae60090d","transactionIndex":"0xf","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x78e9d29c606f6a61a1428ed7326df05210d802c3061f3b469847cc461eb48025","s":"0x517afe5a21175f186233ae7a6c090cd33e028a77e5854e98eb2fa4c9284430e7","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x12bbafcfa06423d87bed591a64c1a1f34791e90a","gas":"0xcafe","gasPrice":"0x7b528d57","maxFeePerGas":"0x16ba45bce","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x798ebe823209869347c08bd81e04fbf60e9bdfe44b1cc923215182d0cf3d4edb","input":"0x40c10f1900000000000000000000000012bbafcfa06423d87bed591a64c1a1f34791e90a0000000000000000000000000000000000000000000000000000000000000032","nonce":"0x4e","to":"0xd25d682189afa7ed0c2811195b3f3d07616927bc","transactionIndex":"0x10","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xbe2aa95f4c32188c9ecbae97286ab983f7cc5a7017d46c404f8eb80b55e2dc13","s":"0x55d8968f509f51633f49260178941fd5a3db999e1995206348d7a3f05152b3d5","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x12bbafcfa06423d87bed591a64c1a1f34791e90a","gas":"0xcafe","gasPrice":"0x7b528d57","maxFeePerGas":"0xc6132c0c","maxPriorityFeePerGas":"0x3b9aca00","hash":"0xbe68a7e02725f799a65ebb069ccc83a014ac7c40e4119bf7c220a2f6ddfee295","input":"0x40c10f1900000000000000000000000012bbafcfa06423d87bed591a64c1a1f34791e90a0000000000000000000000000000000000000000000000000000000000000064","nonce":"0x4f","to":"0xd25d682189afa7ed0c2811195b3f3d07616927bc","transactionIndex":"0x11","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x1750ed45d0d2d048a61dcc3ff3e7ad0cbd395b77698c4f2eeb6baaea4c966d96","s":"0xe646e3a87b6dc50439468bcfd24cbf12a6f95b2762f1527c97a7d1b7f03530e","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xd0c0338baac9ce09c1d1caab88b4360507061e37","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0x1918167aa","maxPriorityFeePerGas":"0x3b9aca00","hash":"0xc90c3a72efe81331727fcce4b5bd4906066da314ca9a0b44023a6b09ea7e8114","input":"0x4e71d92d","nonce":"0xe7","to":"0x0137d796936e199b917b93118eb4e002508a48bd","transactionIndex":"0x12","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x22222ce8fe753082c8e5dc7478fa7b87db9c8d0fb070ebc88ab015db13fd6bb","s":"0x6dceadecf6f6a3ddc433a547dba6d5fcdfb7d006ce09eeae1c06c1828ef9fff9","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x8bd834cc1dd17d1a2f7eb6140c3dd5ab51d0f338","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0x1a4019792","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x619a6cbd43cde074d314c19623bd66d9fb1e13c158d7138775236f798dc1245e","input":"0x1da1db5e00000000000000000000000000000000000000000000000000001b5ec4ff740d","nonce":"0x10","to":"0xbad0009f7a8e796e3f975dc1d6ab3e3c237b857c","transactionIndex":"0x13","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x733c496e8c84f78d113bc8b5ad6d04a133bb10bbcecf0db93d97eeedfa3d984a","s":"0x6627c16aa7dea27db44c0f0641c30ffd544b9b9b1c299dc60611e1e01c714ee8","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x8bd834cc1dd17d1a2f7eb6140c3dd5ab51d0f338","gas":"0x11df0","gasPrice":"0x7b528d57","maxFeePerGas":"0x1d3fbccb8","maxPriorityFeePerGas":"0x3b9aca00","hash":"0xca5a56cd77b9e5b0e79020cc6346edf205bc11e901984d805125f28c2e6686e6","input":"0xd7c01032000000000000000000000000356f24c0f3187a6dcb949e4a60aa0a74a8a0327e0000000000000000000000000f8bacfae87aee49a2eec86df0c6b958ec3fd4fd0000000000000000000000000f8bacfae87aee49a2eec86df0c6b958ec3fd4fd","nonce":"0x11","to":"0xbad0009f7a8e796e3f975dc1d6ab3e3c237b857c","transactionIndex":"0x14","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x4aa872c1a7da70126917604193717575b91407f82449bca956d4089b90cd902","s":"0x4b5f788c68024f8958f66e8c768a8e0f65ef297c4ffd420a715258b0a55cb0a0","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x9bedd66b05712a1add7d1fec899b8641b3ecc863","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0x1e706c8d2","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x999c9ddeed67c6ef6fbf02a6e977a6c1b68e18d24814e51643c7157b87a43e0a","input":"0xa8b78ed0","nonce":"0x3","to":"0xf6c2afb18b85175e5ffb28f20f007c047ce28592","transactionIndex":"0x15","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xf1ca074104ee0b6a67223afd797654b8f21060453f7662dd7be79de938c396da","s":"0x4c9a4e56f0ad21e2dd8d1116c7a3e41ea2c6126853772f7897bd959e81e2e28a","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x9bedd66b05712a1add7d1fec899b8641b3ecc863","gas":"0x2dc6c0","gasPrice":"0xd4babc57","maxFeePerGas":"0x21c13e710","maxPriorityFeePerGas":"0x9502f900","hash":"0x47c8f5d0b3778e4c34eba7fcc356fa04a5afd954ccf484728e72c002764dd3c4","input":"0xf688bcfb0000000000000000000000000000000000000000000000000000000005f5e100","nonce":"0x4","to":"0xf6c2afb18b85175e5ffb28f20f007c047ce28592","transactionIndex":"0x16","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x970982425d18b9949141bbabb5c5230fa168626ce210a97f3856d64700fc0eeb","s":"0x6fa6d0aea6ae48783d80c1e51cda47e11c28b90a5497579b93d7f242d786f67e","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x4b596cebd02c35aa99878eb9ecb24d6f5ca5f865","gas":"0x5208","gasPrice":"0x68c88f79","maxFeePerGas":"0x68c88f79","maxPriorityFeePerGas":"0x68c88f79","hash":"0x396797ae0ebcdb72ff1f96fd08b6128f78acc7417353f142f1a5facd425a33e6","input":"0x","nonce":"0x1","to":"0x375980b8e1a417620ba9b18e5a9e0b17dccbac9d","transactionIndex":"0x17","value":"0x1c9a406c58878","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xcb2a7b106097b2f2a61d3a048054a5175c386b1dcdd5b6fcd7849dcac7c32a66","s":"0x10aef76e98276c47470f04a599b81c260ace9d2f6adc95755c6d22d859e805a2","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x6f4aa3bc9732372daa288beb9b2516374ace5786","gas":"0x1b2e020","gasPrice":"0x61010bda","maxFeePerGas":"0x61010bda","maxPriorityFeePerGas":"0x61010bda","hash":"0x454aa43d6546a6f62246826c16b7a49c6c704238c18802ef0d659922f23a573c","input":"0xe99a3f8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000058ce7eb44ae575fb3b3974861c1138dad3c5aee40000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e06defd69964a6ce467b87c64627a7a2be4be139b504757c625eb6114ec166557d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000641a269023d235ef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000002b05699353b600008ae85d840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b4fbf271143f4fbf7b91a5ded31805e42b2208d600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001f63c28250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000def65f8e2f62bde60cd86ad3b4ad7fa6741cf17500000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000006e512435020ac228a15543236b1f46656f98136300000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000d6ffd79b52a587a0a9941a61f4e6cb0d386d5458000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000413e24433da3efc4c3cc305339a7b77a1b31abb4e4d4967e97e42aed1dd0bf98936f43035f40bc80f6f6e3a9cfb43524a1171ee7f21e9ac2fa586d33a31f10619d1c000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f4aa3bc9732372daa288beb9b2516374ace5786000000000000000000000000000000000000000000000000000000000000012000000000000000000000000058ce7eb44ae575fb3b3974861c1138dad3c5aee400000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000641a269023d235ef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000173ad21460000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000def65f8e2f62bde60cd86ad3b4ad7fa6741cf1750000000000000000000000000000000000000000000000000000000000000ba200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000002b05699353b600008ae85d840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b4fbf271143f4fbf7b91a5ded31805e42b2208d600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000def65f8e2f62bde60cd86ad3b4ad7fa6741cf175ffffffff09616c6c64617461","nonce":"0x82","to":"0x02afbd43cad367fcb71305a2dfb9a3928218f0c1","transactionIndex":"0x18","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xc7ac308b1ae238cb2aa4b030ca79baffb7b498e1b10df0c3354b3cc19cfabac9","s":"0x2358b1093b9aab5fae0cf751766b0bb2e3d8cd2b18ca627e1e12520990a8ed6d","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x6ece61d29b90642941c41240da924690da145696","gas":"0x4399c","gasPrice":"0x506794e0","hash":"0x317ecb5bd19caa42a69f836d41556ebb0e0e00e1c6cd2dee230e6e6192612527","input":"0x46f83b5000000000000000000000000000000000000000000000000000000000000000654666803decc59e7d0a5d3efa3c3653c05645ef4342738445e20a3b43e0b4aa8b000000000000000000000000000000000000000000000000000000000000000f4666803decc59e7d0a5d3efa3c3653c05645ef4342738445e20a3b43e0b4aa8b","nonce":"0x2cc4","to":"0xa6bf2be6c60175601bf88217c75dd4b14abb5fbb","transactionIndex":"0x19","value":"0x0","type":"0x0","chainId":"0x5","v":"0x2d","r":"0x37aeab0db6d550e6cba2c04c9cb10a2af0fec0b11f6e04b85e1ea0b8b9defeae","s":"0x4f32f4ef74872e1385c25e69bf21ee049545a4d423e939eaff29677450efe9eb"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xc4a5c059840a146b81c77bf79f1398f2b3d28ca7","gas":"0x432ec","gasPrice":"0x45db0a51","hash":"0xc879285db5ef0a6bce98021584d16f134c1dc0aed8cc988802c4f72ba6877ff6","input":"0x9f8420b300000000000000000000000000000000000000000000000000470de4df8200000000000000000000000000000000000000000000000000000000000000009c40","nonce":"0x1a7","to":"0xe5e30e7c24e4dfcb281a682562e53154c15d3332","transactionIndex":"0x1a","value":"0x470efc4514e000","type":"0x0","chainId":"0x5","v":"0x2d","r":"0x237e3a541c5ab490843cdc20d0fcb7416bff8da471f6a11ae1b32d2bab119141","s":"0x3c8417d7a60bd5b0bcae4975dbb4aaee54a4b4d588226481be400843bfe2b64e"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x6f4aa3bc9732372daa288beb9b2516374ace5786","gas":"0xffff","gasPrice":"0x44e9acbc","maxFeePerGas":"0x44e9acbc","maxPriorityFeePerGas":"0x44e9acbc","hash":"0xecaa2d6f597608307e5084854854ba6dc1e69395e2abea14f2c6a2fa1d6faf9a","input":"0xe2864fe300000000000000000000000000000000000000000000000000000000000000200000000000000000000000006f4aa3bc9732372daa288beb9b2516374ace57860000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002004a8312e37fcecd450e6684009a2b54bc64f66afbe5217c7b2f63b03cd9980a9e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064893e8223d235ef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000173ad21460000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000def65f8e2f62bde60cd86ad3b4ad7fa6741cf175000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a7640000aaaebeba000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000006e512435020ac228a15543236b1f46656f98136300000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000d6ffd79b52a587a0a9941a61f4e6cb0d386d54580000000000000000000000000000000000000000000000000000000000000000","nonce":"0x83","to":"0x02afbd43cad367fcb71305a2dfb9a3928218f0c1","transactionIndex":"0x1b","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xa18772e4b9e1493ebfd5ae6219cc9ca060b71e83788fb614ab02b03fb36eaf1b","s":"0x482c7e50fde29bb4130fd6e723176e0e9913430ebb9260667d7fb55f5408d9c5","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xdb33365a8730de2f7574ff1189fb9d337bf4c36d","gas":"0x61a80","gasPrice":"0x433653c8","maxFeePerGas":"0x828367af","maxPriorityFeePerGas":"0x37e9071","hash":"0x4dd69b69a568ff30ae439e2ded72fbd7f2e7aaa345836703663f155c749c5eed","input":"0x7f34c0ddc6e984f46ab7c13b7a53643096e79c39103dc74550204d5bd1b5206ef5a2f49689071bb6a332212df26aa57cd4d1e3c0894187a9fc5e5d686cbedba5b187470f000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000e8c44c30e8e52c38ac7bd232e7b7f0c7463a535100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e516d5044645856613738437a6b7856325a364e52777a67685a785872736e75397261616a695a7555423569465a62000000000000000000000000000000000000","nonce":"0x2b57","to":"0xb8ad54644e2371cbb7940b9fa0936f399ba7495f","transactionIndex":"0x1c","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xa1fb0e5662b54ceb3dc1623ebfb200668433cb27252d553669bcd136387394f3","s":"0x27c2f8e19f69a52a0960f05d8b21f11c313dd3e86a7139b5783a18353c407415","yParity":"0x0"}],"transactionsRoot":"0x4a87d0cf5990b1c5bac631583e5965c2ba943858bebb2e07f74d0b697f73821a","uncles":[],"withdrawals":[{"index":"0x1170","validatorIndex":"0x38c2c","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x66edfd65"},{"index":"0x1171","validatorIndex":"0x38c2d","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6cd228e4"},{"index":"0x1172","validatorIndex":"0x38c2e","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x77f3431b"},{"index":"0x1173","validatorIndex":"0x38c2f","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6b61f268"},{"index":"0x1174","validatorIndex":"0x38c30","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6e10bb21"},{"index":"0x1175","validatorIndex":"0x38c31","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6eb115a5"},{"index":"0x1176","validatorIndex":"0x38c32","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7caead1d"},{"index":"0x1177","validatorIndex":"0x38c33","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x772c0ddf"},{"index":"0x1178","validatorIndex":"0x38c34","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x75930a95"},{"index":"0x1179","validatorIndex":"0x38c35","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76a4db09"},{"index":"0x117a","validatorIndex":"0x38c36","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7e692b27"},{"index":"0x117b","validatorIndex":"0x38c37","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x72038ae6"},{"index":"0x117c","validatorIndex":"0x38c38","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6ccce352"},{"index":"0x117d","validatorIndex":"0x38c39","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x79ef6898"},{"index":"0x117e","validatorIndex":"0x38c3a","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6d58977d"},{"index":"0x117f","validatorIndex":"0x38c3b","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76f7d208"}],"withdrawalsRoot":"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}
{"name":"post-shanghai-bad-withdrawals","fail":true}
{"baseFeePerGas":"0x3fb7c357","difficulty":"0x0","extraData":"0x","gasLimit":"0x1c9c380","gasUsed":"0x18f759","hash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","logsBloom":"0x020010404000001a0000021000000080001100410000100001000010040200980220400000008806200200000100000000000000000000008000000400042000000050000040000112080808800002044000040004042008800480002000000000000002020020000042002400000820000080040000000010200010020010100101212050000008000000008000001010200c80000112010000438040020400000000202400000000002002a0210402000622010000000001700144000040000000002204000000c000410105024010000808000000002004002000000261000000822200200800881000000012500400400000000000000040010000800000","miner":"0x000095e79eac4d76aab57cb2c1f091d553b36ca0","mixHash":"0x5b53dc49cbab268ef9950b1d81b5e36a1b2f1b97aee1b7ff6e4db0e06c29a8b0","nonce":"0x0000000000000000","number":"0x84161e","parentHash":"0x72d92c1498e05952988d4e79a695928a6bcbd37239f8a1734051263b4d3504b8","receiptsRoot":"0xaff90ae18dcc35924a4bddb68d403b8b7812c10c3ea2a114f34105c87d75bcdb","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2a51","stateRoot":"0xc56738518b2c7854a640ae25996d2211c9ef0dd2e4dd9e59e9d9cacef39622da","timestamp":"0x64110a5c","totalDifficulty":"0xa4a470","transactions":[{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x1b7aa44088a0ea95bdc65fef6e5071e946bf7d8f","gas":"0x5208","gasPrice":"0x4159f01735","hash":"0x1e8f148a9aea7d8d16ea6e9446723b8f262e8bcd89c7c961d52046ebd43b4598","input":"0x","nonce":"0x279ad","to":"0xa21765a03dd41e2783696d314f235f4d520f6cac","transactionIndex":"0x0","value":"0x3782dace9d90000","type":"0x0","chainId":"0x5","v":"0x2e","r":"0xf9eca8b74ccaec5f4a83e981baeb8602f38d0271179c592b4a18f3866316a367","s":"0x350a9d26718d1fa9dc4f268f9c0e18fb96dbc037816ca8fc20f33f1a76f9f501"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x4d9a852e6aecd3a6e87fece2ca109780e45e6f2d","gas":"0x160ab","gasPrice":"0xd4babc57","maxFeePerGas":"0x11407d03e","maxPriorityFeePerGas":"0x9502f900","hash":"0xab5c870f4c367012bd763172afbfbe68fbf35336a66ae41aff3f2c9dbf4ea3f8","input":"0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212200c479c99d58d7fbee5ee3aef5001431073a3d465bdfa46cf747a7c0b9289607864736f6c634300080d0033","nonce":"0xafd","to":null,"transactionIndex":"0x1","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x48f6acf4ac4371eb96ffca8cdef5b7704ea8c68a631d1c02927036d4ce92567e","s":"0x1f12261ddde63fd3da2ed9ea1bcbb4b0f25af898248c805a9d4b0a6e42caf9c8","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xce297b30e56bf2f6142c4048fbae1cb8a756fefd","gas":"0x557300","gasPrice":"0xd4babc57","maxFeePerGas":"0xfabdd183","maxPriorityFeePerGas":"0x9502f900","hash":"0xa81fd92b2d0f0bbd3cc355f869cca3243c98c5e2641db9ecf3eeabb3b13bff6a","input":"0x7bbaf1ea0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000","nonce":"0xad92","to":"0x4c0ce02c1219ce5d2afffba97e484272a4637b49","transactionIndex":"0x2","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xd11b842a5f7b0e020470e764b443fafc4044327bca8dbb37131425359abace2","s":"0x1009867573946fb0a4a35339a6eaaece4d0a168b2346539076e6319e9a466b1","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x47a916d0b694c95bc0c09953c1a6e22c8867be32","gas":"0x5208","gasPrice":"0x991ff257","maxFeePerGas":"0xb2fea055","maxPriorityFeePerGas":"0x59682f00","hash":"0xa92c7b720c08c83f1a0ed7e4c163200e30a3a8c03fcc5a51e685ea20cd0cb577","input":"0x","nonce":"0x2","to":"0xf955dfe99bbfd06a8be208274cd654ecfb66a45e","transactionIndex":"0x3","value":"0x11c37937e08000","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xeecd431225215c3ddc2e13cf16fa29f9a2ab1afbaa02988f3ceac27416edf0f5","s":"0x6494062330a9d509f7c778cb45cbcc9932e5f9b4ec94a1ec315f579f8d973b7b","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x672d214fe4db218defae698085a3ccefc773dfa9","gas":"0xf4f6","gasPrice":"0x991ff257","maxFeePerGas":"0xb2fea055","maxPriorityFeePerGas":"0x59682f00","hash":"0x6921b429ad2ec1e97d3457049ad2e893b5a0349beba47ca1c74a9540af75347a","input":"0xa1ddc546000000000000000000000000000000000000000000000000000000000000118f","nonce":"0x8e","to":"0xdef65f8e2f62bde60cd86ad3b4ad7fa6741cf175","transactionIndex":"0x4","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x4732ad21401b509bebb947a8566127fba1e245eb5a262ddc522d6867ab80567e","s":"0x2153013617fefdb06db0a7316d8883056441d33c2abf5ed6291fa0e3cc5c3a2f","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x0b12f7f996579fe7d9302d2574910121c214ee15","gas":"0x56a8","gasPrice":"0x991ff257","maxFeePerGas":"0xb2fea055","maxPriorityFeePerGas":"0x59682f00","hash":"0xf776b2da0b835dde05d0d8b76fd19385d61e7055036cf637f804b36dc94f2384","input":"0x71ec5c05aa669c4922569c1d33f7a81aaa21813800000000000000000000000013a0c5930c028511dc02665e7285134b6d11a5f40000000000000000000000000b12f7f996579fe7d9302d2574910121c214ee150000000000000000000000000000000000000000000000000000000000000000","nonce":"0xe","to":"0x7c125c1d515b8945841b3d5144a060115c58725f","transactionIndex":"0x5","value":"0x2386f26fc10000","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xc4505d4c46ef9a0103178e5ef4fbc857114ae5c4686b68b74d07c3ee3a86e575","s":"0x74db34fd675bea7d2ee74f14fd8709cb88c7d22c2267d12f2c671b5ebc180bd5","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xd36aac0c9676e984d72823fb662ce94d3ab5e551","gas":"0xff212","gasPrice":"0x991ff257","maxFeePerGas":"0xd86d063e","maxPriorityFeePerGas":"0x59682f00","hash":"0x9a08d899cd14ebb930ed59fa774afdb88a22615b3a931e930931ea54d26dc0bc","input":"0x49160658babdf216946a22b96c966ceeba750f14807726306ebeed500a2621a7481df010000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000084d6f6f6e6265616d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a3078434133633746363939643335333137316438434643364236334431433764333841333233373238300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0b616f73c8d00641109f0000054f967b8a135e44e233da070ea88c5e4a53bacac0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c6a3a17399d88e5dfd2de4fa41dcccade6a2d2170000000000000000000000008676147503f761e44b85df01811edd52be01b56c000000000000000000000000000000000000000000000000d02ab486cedc00000000000000000000000000000000000000000000000000000de0b6b3a7640000","nonce":"0x7121","to":"0x2d276bd64fe8643a1d76b2e9530c753423e972c1","transactionIndex":"0x6","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xce452361d331baf2ac86947a1b3b454b3e842923e1f39139b33a572845dd5d7c","s":"0x388126881782af5a146ce8409f1e3a2c9a4cadcfe9a2c1d27258af6e4eb5cec1","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xb83a48ee322989a0a4f838cb207abc28ec021b73","gas":"0x326ff","gasPrice":"0x991ff257","maxFeePerGas":"0x5c3362b9c","maxPriorityFeePerGas":"0x59682f00","hash":"0x0fe0d97e25d5eb11a33a3e8278584c3780941fc2675bdf8fc547cee3d1fd3b17","input":"0xa4110dbe190e65a7fe0ad5acd305c6446a02cb39de30f382000fe67927434063bf4c4b2ca86b3ee6d039dc7a0268f9e1c39266c3f12a752a7eb72f0895dedf62291fd292","nonce":"0x12e","to":"0x96e6192eeaf7bb308f79fb5017a9085754b9e12a","transactionIndex":"0x7","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x46819bb540fa459a5a0cbf041a0286507d597fc8958a6af8b9ce193f00005238","s":"0x31495c58bf4b74925f870c59635912681bee947b1cb4b08cc19f22421b1a10ab","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xb83a48ee322989a0a4f838cb207abc28ec021b73","gas":"0x3270b","gasPrice":"0x991ff257","maxFeePerGas":"0x5c3362b9c","maxPriorityFeePerGas":"0x59682f00","hash":"0xef47a60f57f177a683c723c658137efab66d311e1c5abbc4d74f653535144d03","input":"0xa4110dbe18eba3e815ec7fcb03a8eea0487209c3253024d1dc4f36f775a43fdd3e409b74c0a5c88e54f39b88db6f185a41431b204120d3e66c9b08b86f5e8382623327e5","nonce":"0x12f","to":"0x96e6192eeaf7bb308f79fb5017a9085754b9e12a","transactionIndex":"0x8","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x4d7e11fe3914763a2735493a62b71ae0028e75a750a8b06407996cf478e273c8","s":"0x60c18fdf948721f96fdc2efbf694910122e82191c7a40a5caab247c06ab7f3cf","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x7712a1f96b3f37c3dd88a22d4f7a7977b937fe62","gas":"0x1ff06","gasPrice":"0x991ff257","maxFeePerGas":"0xcf662006","maxPriorityFeePerGas":"0x59682f00","hash":"0xe23a5b35faae5335adc5aca38c5d633b00438b798c2053104b8df48406c9b141","input":"0x3ff9751b0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000002e516d566e75374a51566f445271536748427a72615970374879373848774a744c4669366e5546436f775447647a70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e516d5439716b3343525962464457704446596541763854384831676e6f6e67774b6868354a36384e4c6b4c6972360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c9f31b989aaa745aecc563139f89c8ab3ab492e725d1e0305b7d602fcbf9293c463f0d2e4f5fb0c9efb54eb2cde9af10ebc9c3676f2334007291ffa8efb40adb1c00000000000000000000000000000000000000000000000000000000000000","nonce":"0x16","to":"0xc3b87ea584cb9cb5a4523e2bed16a34bf7746317","transactionIndex":"0x9","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xcc693a9544394653e1f393f02635e2c1f78b5e6c26c4d00a867bcf4adc2bc09e","s":"0x23f4b71b773c19f77cf251b2aeea03f2696bddd847d1f6d75acd2fbea6a543e4","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x12bbafcfa06423d87bed591a64c1a1f34791e90a","gas":"0x1b2e020","gasPrice":"0x8f0d3617","maxFeePerGas":"0x1cb3abd5a","maxPriorityFeePerGas":"0x4f5572c0","hash":"0xd8cea4ba619b317bc05d58534af73beec6c2548b31b24d4dc61c9bbd29cfa17a","input":"0x","nonce":"0x4d","to":"0x12bbafcfa06423d87bed591a64c1a1f34791e90a","transactionIndex":"0xa","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x8dae28608985d6ab47cbe122ee88972e38664cede30978f41944f347bad86e5c","s":"0x17c2898b39b7e3b874dc78e7df3fcff68f4d715385c632aad4bdf6e62505651c","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x6999c36394dd5d3d3295af63a4736ad6bd279448","gas":"0x14d94","gasPrice":"0x7b528d57","maxFeePerGas":"0x7df743e0","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x79a4b9d90b02c768baaad305f266281213cc75062cbe99a13222cc0c4b509498","input":"0x6a7612020000000000000000000000009008d19f58aabd9ed0d60971565aa8510560ab4100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000a4ec6cb13f00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003826d8d7371becafc0afedc3fe85b699b87f4357d55ec39ce83c510ed7d70ff514dce8236351f4627ccec6a7d9a67bc6fc2ec17ca76411113c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410000000000000000000000006999c36394dd5d3d3295af63a4736ad6bd27944800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000","nonce":"0x13","to":"0xdce8236351f4627ccec6a7d9a67bc6fc2ec17ca7","transactionIndex":"0xb","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x669487011643510f7512ec15b07d74efb853ba4ad9fe9c7e9850ccf24e3d4c53","s":"0x2191f9ee81087e1df833e69d6129ec330ed4c99be2031060834e22c589fcf79b","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x08ebc052e6353b4d8392113f0f2c5decd691ddcd","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0xf6e4d9c4","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x6790a3bbddbeb21fcb736a59b3775755051c3a6344d8390cf8ca27f2e8a814f0","input":"0x6871ee40","nonce":"0x4","to":"0xb21b333c40354393f18de57f2d0a0fc21f270482","transactionIndex":"0xc","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xa7a58ab858e5dd87b9a74d550e5716ac40ddefd1c21d5baa51e542f4f941d73e","s":"0x1fd0cb1563df0368bd332717d7c8210187cd1ac2ff44f61f5242fc02eaa0c2fe","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x08ebc052e6353b4d8392113f0f2c5decd691ddcd","gas":"0x12c36","gasPrice":"0x7b528d57","maxFeePerGas":"0xe596c292","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x87ec7ace5442db252b5751ffddd38dcb04b088d36b6b0e526ff25607a4293c81","input":"0xcb40cbfd","nonce":"0x5","to":"0xb21b333c40354393f18de57f2d0a0fc21f270482","transactionIndex":"0xd","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x8e4bd40195bdfaa868af97dbf22e0b74295d95564a8381bc9bcfe1af3cde2cdb","s":"0x62057dc87c8b2b197d12c648233aab4134b7c2a2f65db89a49728564f3d0864d","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x08ebc052e6353b4d8392113f0f2c5decd691ddcd","gas":"0x12c36","gasPrice":"0x7b528d57","maxFeePerGas":"0xe596c292","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x40cb487ecffda94f97ce7fc0f7163f2f024235df2c8291169edc80dac063e6d0","input":"0xcb40cbfd","nonce":"0x6","to":"0xb21b333c40354393f18de57f2d0a0fc21f270482","transactionIndex":"0xe","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x993c4386ffc2bd63a48dd31cf5f65aa355cba3c063b08778b328d748937098e5","s":"0x203b1faf595628dd78e760bcc1740065625abb6cf00b1b17224e10fa6b424e43","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xafc7682751d3654f34958e3fb660971bf5918367","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0xefb40664","maxPriorityFeePerGas":"0x3b9aca00","hash":"0xb76bb3d88c9b30d927c45ccfcf8d5b0054411ac8501ad588822a7d04690cccf6","input":"0x40c10f19000000000000000000000000afc7682751d3654f34958e3fb660971bf59183670000000000000000000000000000000000000000000000008ac7230489e80000","nonce":"0x20","to":"0x84ced17d95f3ec7230baf4a369f1e624ae60090d","transactionIndex":"0xf","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x78e9d29c606f6a61a1428ed7326df05210d802c3061f3b469847cc461eb48025","s":"0x517afe5a21175f186233ae7a6c090cd33e028a77e5854e98eb2fa4c9284430e7","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x12bbafcfa06423d87bed591a64c1a1f34791e90a","gas":"0xcafe","gasPrice":"0x7b528d57","maxFeePerGas":"0x16ba45bce","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x798ebe823209869347c08bd81e04fbf60e9bdfe44b1cc923215182d0cf3d4edb","input":"0x40c10f1900000000000000000000000012bbafcfa06423d87bed591a64c1a1f34791e90a0000000000000000000000000000000000000000000000000000000000000032","nonce":"0x4e","to":"0xd25d682189afa7ed0c2811195b3f3d07616927bc","transactionIndex":"0x10","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xbe2aa95f4c32188c9ecbae97286ab983f7cc5a7017d46c404f8eb80b55e2dc13","s":"0x55d8968f509f51633f49260178941fd5a3db999e1995206348d7a3f05152b3d5","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x12bbafcfa06423d87bed591a64c1a1f34791e90a","gas":"0xcafe","gasPrice":"0x7b528d57","maxFeePerGas":"0xc6132c0c","maxPriorityFeePerGas":"0x3b9aca00","hash":"0xbe68a7e02725f799a65ebb069ccc83a014ac7c40e4119bf7c220a2f6ddfee295","input":"0x40c10f1900000000000000000000000012bbafcfa06423d87bed591a64c1a1f34791e90a0000000000000000000000000000000000000000000000000000000000000064","nonce":"0x4f","to":"0xd25d682189afa7ed0c2811195b3f3d07616927bc","transactionIndex":"0x11","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0x1750ed45d0d2d048a61dcc3ff3e7ad0cbd395b77698c4f2eeb6baaea4c966d96","s":"0xe646e3a87b6dc50439468bcfd24cbf12a6f95b2762f1527c97a7d1b7f03530e","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xd0c0338baac9ce09c1d1caab88b4360507061e37","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0x1918167aa","maxPriorityFeePerGas":"0x3b9aca00","hash":"0xc90c3a72efe81331727fcce4b5bd4906066da314ca9a0b44023a6b09ea7e8114","input":"0x4e71d92d","nonce":"0xe7","to":"0x0137d796936e199b917b93118eb4e002508a48bd","transactionIndex":"0x12","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x22222ce8fe753082c8e5dc7478fa7b87db9c8d0fb070ebc88ab015db13fd6bb","s":"0x6dceadecf6f6a3ddc433a547dba6d5fcdfb7d006ce09eeae1c06c1828ef9fff9","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x8bd834cc1dd17d1a2f7eb6140c3dd5ab51d0f338","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0x1a4019792","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x619a6cbd43cde074d314c19623bd66d9fb1e13c158d7138775236f798dc1245e","input":"0x1da1db5e00000000000000000000000000000000000000000000000000001b5ec4ff740d","nonce":"0x10","to":"0xbad0009f7a8e796e3f975dc1d6ab3e3c237b857c","transactionIndex":"0x13","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x733c496e8c84f78d113bc8b5ad6d04a133bb10bbcecf0db93d97eeedfa3d984a","s":"0x6627c16aa7dea27db44c0f0641c30ffd544b9b9b1c299dc60611e1e01c714ee8","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x8bd834cc1dd17d1a2f7eb6140c3dd5ab51d0f338","gas":"0x11df0","gasPrice":"0x7b528d57","maxFeePerGas":"0x1d3fbccb8","maxPriorityFeePerGas":"0x3b9aca00","hash":"0xca5a56cd77b9e5b0e79020cc6346edf205bc11e901984d805125f28c2e6686e6","input":"0xd7c01032000000000000000000000000356f24c0f3187a6dcb949e4a60aa0a74a8a0327e0000000000000000000000000f8bacfae87aee49a2eec86df0c6b958ec3fd4fd0000000000000000000000000f8bacfae87aee49a2eec86df0c6b958ec3fd4fd","nonce":"0x11","to":"0xbad0009f7a8e796e3f975dc1d6ab3e3c237b857c","transactionIndex":"0x14","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x4aa872c1a7da70126917604193717575b91407f82449bca956d4089b90cd902","s":"0x4b5f788c68024f8958f66e8c768a8e0f65ef297c4ffd420a715258b0a55cb0a0","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x9bedd66b05712a1add7d1fec899b8641b3ecc863","gas":"0x1b2e020","gasPrice":"0x7b528d57","maxFeePerGas":"0x1e706c8d2","maxPriorityFeePerGas":"0x3b9aca00","hash":"0x999c9ddeed67c6ef6fbf02a6e977a6c1b68e18d24814e51643c7157b87a43e0a","input":"0xa8b78ed0","nonce":"0x3","to":"0xf6c2afb18b85175e5ffb28f20f007c047ce28592","transactionIndex":"0x15","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xf1ca074104ee0b6a67223afd797654b8f21060453f7662dd7be79de938c396da","s":"0x4c9a4e56f0ad21e2dd8d1116c7a3e41ea2c6126853772f7897bd959e81e2e28a","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x9bedd66b05712a1add7d1fec899b8641b3ecc863","gas":"0x2dc6c0","gasPrice":"0xd4babc57","maxFeePerGas":"0x21c13e710","maxPriorityFeePerGas":"0x9502f900","hash":"0x47c8f5d0b3778e4c34eba7fcc356fa04a5afd954ccf484728e72c002764dd3c4","input":"0xf688bcfb0000000000000000000000000000000000000000000000000000000005f5e100","nonce":"0x4","to":"0xf6c2afb18b85175e5ffb28f20f007c047ce28592","transactionIndex":"0x16","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0x970982425d18b9949141bbabb5c5230fa168626ce210a97f3856d64700fc0eeb","s":"0x6fa6d0aea6ae48783d80c1e51cda47e11c28b90a5497579b93d7f242d786f67e","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x4b596cebd02c35aa99878eb9ecb24d6f5ca5f865","gas":"0x5208","gasPrice":"0x68c88f79","maxFeePerGas":"0x68c88f79","maxPriorityFeePerGas":"0x68c88f79","hash":"0x396797ae0ebcdb72ff1f96fd08b6128f78acc7417353f142f1a5facd425a33e6","input":"0x","nonce":"0x1","to":"0x375980b8e1a417620ba9b18e5a9e0b17dccbac9d","transactionIndex":"0x17","value":"0x1c9a406c58878","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xcb2a7b106097b2f2a61d3a048054a5175c386b1dcdd5b6fcd7849dcac7c32a66","s":"0x10aef76e98276c47470f04a599b81c260ace9d2f6adc95755c6d22d859e805a2","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x6f4aa3bc9732372daa288beb9b2516374ace5786","gas":"0x1b2e020","gasPrice":"0x61010bda","maxFeePerGas":"0x61010bda","maxPriorityFeePerGas":"0x61010bda","hash":"0x454aa43d6546a6f62246826c16b7a49c6c704238c18802ef0d659922f23a573c","input":"0xe99a3f8000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000058ce7eb44ae575fb3b3974861c1138dad3c5aee40000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e06defd69964a6ce467b87c64627a7a2be4be139b504757c625eb6114ec166557d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000641a269023d235ef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000002b05699353b600008ae85d840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b4fbf271143f4fbf7b91a5ded31805e42b2208d600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001f63c28250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000def65f8e2f62bde60cd86ad3b4ad7fa6741cf17500000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000006e512435020ac228a15543236b1f46656f98136300000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000d6ffd79b52a587a0a9941a61f4e6cb0d386d5458000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000413e24433da3efc4c3cc305339a7b77a1b31abb4e4d4967e97e42aed1dd0bf98936f43035f40bc80f6f6e3a9cfb43524a1171ee7f21e9ac2fa586d33a31f10619d1c000000000000000000000000000000000000000000000000000000000000000000000000000000000000006f4aa3bc9732372daa288beb9b2516374ace5786000000000000000000000000000000000000000000000000000000000000012000000000000000000000000058ce7eb44ae575fb3b3974861c1138dad3c5aee400000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000641a269023d235ef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000173ad21460000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000def65f8e2f62bde60cd86ad3b4ad7fa6741cf1750000000000000000000000000000000000000000000000000000000000000ba200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000002b05699353b600008ae85d840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000b4fbf271143f4fbf7b91a5ded31805e42b2208d600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000def65f8e2f62bde60cd86ad3b4ad7fa6741cf175ffffffff09616c6c64617461","nonce":"0x82","to":"0x02afbd43cad367fcb71305a2dfb9a3928218f0c1","transactionIndex":"0x18","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xc7ac308b1ae238cb2aa4b030ca79baffb7b498e1b10df0c3354b3cc19cfabac9","s":"0x2358b1093b9aab5fae0cf751766b0bb2e3d8cd2b18ca627e1e12520990a8ed6d","yParity":"0x0"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x6ece61d29b90642941c41240da924690da145696","gas":"0x4399c","gasPrice":"0x506794e0","hash":"0x317ecb5bd19caa42a69f836d41556ebb0e0e00e1c6cd2dee230e6e6192612527","input":"0x46f83b5000000000000000000000000000000000000000000000000000000000000000654666803decc59e7d0a5d3efa3c3653c05645ef4342738445e20a3b43e0b4aa8b000000000000000000000000000000000000000000000000000000000000000f4666803decc59e7d0a5d3efa3c3653c05645ef4342738445e20a3b43e0b4aa8b","nonce":"0x2cc4","to":"0xa6bf2be6c60175601bf88217c75dd4b14abb5fbb","transactionIndex":"0x19","value":"0x0","type":"0x0","chainId":"0x5","v":"0x2d","r":"0x37aeab0db6d550e6cba2c04c9cb10a2af0fec0b11f6e04b85e1ea0b8b9defeae","s":"0x4f32f4ef74872e1385c25e69bf21ee049545a4d423e939eaff29677450efe9eb"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xc4a5c059840a146b81c77bf79f1398f2b3d28ca7","gas":"0x432ec","gasPrice":"0x45db0a51","hash":"0xc879285db5ef0a6bce98021584d16f134c1dc0aed8cc988802c4f72ba6877ff6","input":"0x9f8420b300000000000000000000000000000000000000000000000000470de4df8200000000000000000000000000000000000000000000000000000000000000009c40","nonce":"0x1a7","to":"0xe5e30e7c24e4dfcb281a682562e53154c15d3332","transactionIndex":"0x1a","value":"0x470efc4514e000","type":"0x0","chainId":"0x5","v":"0x2d","r":"0x237e3a541c5ab490843cdc20d0fcb7416bff8da471f6a11ae1b32d2bab119141","s":"0x3c8417d7a60bd5b0bcae4975dbb4aaee54a4b4d588226481be400843bfe2b64e"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0x6f4aa3bc9732372daa288beb9b2516374ace5786","gas":"0xffff","gasPrice":"0x44e9acbc","maxFeePerGas":"0x44e9acbc","maxPriorityFeePerGas":"0x44e9acbc","hash":"0xecaa2d6f597608307e5084854854ba6dc1e69395e2abea14f2c6a2fa1d6faf9a","input":"0xe2864fe300000000000000000000000000000000000000000000000000000000000000200000000000000000000000006f4aa3bc9732372daa288beb9b2516374ace57860000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002004a8312e37fcecd450e6684009a2b54bc64f66afbe5217c7b2f63b03cd9980a9e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064893e8223d235ef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000173ad21460000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000def65f8e2f62bde60cd86ad3b4ad7fa6741cf175000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a7640000aaaebeba000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000006e512435020ac228a15543236b1f46656f98136300000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000d6ffd79b52a587a0a9941a61f4e6cb0d386d54580000000000000000000000000000000000000000000000000000000000000000","nonce":"0x83","to":"0x02afbd43cad367fcb71305a2dfb9a3928218f0c1","transactionIndex":"0x1b","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x1","r":"0xa18772e4b9e1493ebfd5ae6219cc9ca060b71e83788fb614ab02b03fb36eaf1b","s":"0x482c7e50fde29bb4130fd6e723176e0e9913430ebb9260667d7fb55f5408d9c5","yParity":"0x1"},{"blockHash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","blockNumber":"0x84161e","from":"0xdb33365a8730de2f7574ff1189fb9d337bf4c36d","gas":"0x61a80","gasPrice":"0x433653c8","maxFeePerGas":"0x828367af","maxPriorityFeePerGas":"0x37e9071","hash":"0x4dd69b69a568ff30ae439e2ded72fbd7f2e7aaa345836703663f155c749c5eed","input":"0x7f34c0ddc6e984f46ab7c13b7a53643096e79c39103dc74550204d5bd1b5206ef5a2f49689071bb6a332212df26aa57cd4d1e3c0894187a9fc5e5d686cbedba5b187470f000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000e8c44c30e8e52c38ac7bd232e7b7f0c7463a535100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002e516d5044645856613738437a6b7856325a364e52777a67685a785872736e75397261616a695a7555423569465a62000000000000000000000000000000000000","nonce":"0x2b57","to":"0xb8ad54644e2371cbb7940b9fa0936f399ba7495f","transactionIndex":"0x1c","value":"0x0","type":"0x2","accessList":[],"chainId":"0x5","v":"0x0","r":"0xa1fb0e5662b54ceb3dc1623ebfb200668433cb27252d553669bcd136387394f3","s":"0x27c2f8e19f69a52a0960f05d8b21f11c313dd3e86a7139b5783a18353c407415","yParity":"0x0"}],"transactionsRoot":"0x4a87d0cf5990b1c5bac631583e5965c2ba943858bebb2e07f74d0b697f73821a","uncles":[],"withdrawals":[{"index":"0x1170","validatorIndex":"0x38c2c","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x66edfd65"},{"index":"0x1171","validatorIndex":"0x38c2d","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6cd228e4"},{"index":"0x1172","validatorIndex":"0x38c2e","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x77f3431b"},{"index":"0x1173","validatorIndex":"0x38c2f","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6b61f268"},{"index":"0x1174","validatorIndex":"0x38c30","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6e10bb21"},{"index":"0x1175","validatorIndex":"0x38c31","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6eb115a5"},{"index":"0x1176","validatorIndex":"0x38c32","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7caead1d"},{"index":"0x1177","validatorIndex":"0x38c33","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x772c0ddf"},{"index":"0x1178","validatorIndex":"0x38c34","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x75930a95"},{"index":"0x1179","validatorIndex":"0x38c35","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76a4db09"},{"index":"0x117a","validatorIndex":"0x38c36","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7e692b27"},{"index":"0x117b","validatorIndex":"0x38c37","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x72038ae6"},{"index":"0x117c","validatorIndex":"0x38c38","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6ccce352"},{"index":"0x117d","validatorIndex":"0x38c39","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x79ef6898"},{"index":"0x117e","validatorIndex":"0x38c3a","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6d58977d"},{"index":"0x117f","validatorIndex":"0x38c3b","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76f7d208"}],"withdrawalsRoot":"0xbe712c930a0665264b025ced87cc7839eef95a3cbc26dadc93e9e185a350ad28"}
{"name":"post-shanghai-success"}
This source diff could not be displayed because it is too large. You can view the blob instead.
{"name":"pre-shanghai-bad-receipts","fail":true}
This source diff could not be displayed because it is too large. You can view the blob instead.
{"name":"pre-shanghai-bad-transactions","fail":true}
This source diff could not be displayed because it is too large. You can view the blob instead.
{"name":"pre-shanghai-success"}
{"baseFeePerGas":"0x3fb7c357","difficulty":"0x0","extraData":"0x","gasLimit":"0x1c9c380","gasUsed":"0x18f759","hash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","logsBloom":"0x020010404000001a0000021000000080001100410000100001000010040200980220400000008806200200000100000000000000000000008000000400042000000050000040000112080808800002044000040004042008800480002000000000000002020020000042002400000820000080040000000010200010020010100101212050000008000000008000001010200c80000112010000438040020400000000202400000000002002a0210402000622010000000001700144000040000000002204000000c000410105024010000808000000002004002000000261000000822200200800881000000012500400400000000000000040010000800000","miner":"0x000095e79eac4d76aab57cb2c1f091d553b36ca0","mixHash":"0x5b53dc49cbab268ef9950b1d81b5e36a1b2f1b97aee1b7ff6e4db0e06c29a8b0","nonce":"0x0000000000000000","number":"0x84161e","parentHash":"0x72d92c1498e05952988d4e79a695928a6bcbd37239f8a1734051263b4d3504b8","receiptsRoot":"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2a51","stateRoot":"0xc56738518b2c7854a640ae25996d2211c9ef0dd2e4dd9e59e9d9cacef39622da","timestamp":"0x64110a5c","totalDifficulty":"0xa4a470","transactions":["0x1e8f148a9aea7d8d16ea6e9446723b8f262e8bcd89c7c961d52046ebd43b4598","0xab5c870f4c367012bd763172afbfbe68fbf35336a66ae41aff3f2c9dbf4ea3f8","0xa81fd92b2d0f0bbd3cc355f869cca3243c98c5e2641db9ecf3eeabb3b13bff6a","0xa92c7b720c08c83f1a0ed7e4c163200e30a3a8c03fcc5a51e685ea20cd0cb577","0x6921b429ad2ec1e97d3457049ad2e893b5a0349beba47ca1c74a9540af75347a","0xf776b2da0b835dde05d0d8b76fd19385d61e7055036cf637f804b36dc94f2384","0x9a08d899cd14ebb930ed59fa774afdb88a22615b3a931e930931ea54d26dc0bc","0x0fe0d97e25d5eb11a33a3e8278584c3780941fc2675bdf8fc547cee3d1fd3b17","0xef47a60f57f177a683c723c658137efab66d311e1c5abbc4d74f653535144d03","0xe23a5b35faae5335adc5aca38c5d633b00438b798c2053104b8df48406c9b141","0xd8cea4ba619b317bc05d58534af73beec6c2548b31b24d4dc61c9bbd29cfa17a","0x79a4b9d90b02c768baaad305f266281213cc75062cbe99a13222cc0c4b509498","0x6790a3bbddbeb21fcb736a59b3775755051c3a6344d8390cf8ca27f2e8a814f0","0x87ec7ace5442db252b5751ffddd38dcb04b088d36b6b0e526ff25607a4293c81","0x40cb487ecffda94f97ce7fc0f7163f2f024235df2c8291169edc80dac063e6d0","0xb76bb3d88c9b30d927c45ccfcf8d5b0054411ac8501ad588822a7d04690cccf6","0x798ebe823209869347c08bd81e04fbf60e9bdfe44b1cc923215182d0cf3d4edb","0xbe68a7e02725f799a65ebb069ccc83a014ac7c40e4119bf7c220a2f6ddfee295","0xc90c3a72efe81331727fcce4b5bd4906066da314ca9a0b44023a6b09ea7e8114","0x619a6cbd43cde074d314c19623bd66d9fb1e13c158d7138775236f798dc1245e","0xca5a56cd77b9e5b0e79020cc6346edf205bc11e901984d805125f28c2e6686e6","0x999c9ddeed67c6ef6fbf02a6e977a6c1b68e18d24814e51643c7157b87a43e0a","0x47c8f5d0b3778e4c34eba7fcc356fa04a5afd954ccf484728e72c002764dd3c4","0x396797ae0ebcdb72ff1f96fd08b6128f78acc7417353f142f1a5facd425a33e6","0x454aa43d6546a6f62246826c16b7a49c6c704238c18802ef0d659922f23a573c","0x317ecb5bd19caa42a69f836d41556ebb0e0e00e1c6cd2dee230e6e6192612527","0xc879285db5ef0a6bce98021584d16f134c1dc0aed8cc988802c4f72ba6877ff6","0xecaa2d6f597608307e5084854854ba6dc1e69395e2abea14f2c6a2fa1d6faf9a","0x4dd69b69a568ff30ae439e2ded72fbd7f2e7aaa345836703663f155c749c5eed"],"transactionsRoot":"0x4a87d0cf5990b1c5bac631583e5965c2ba943858bebb2e07f74d0b697f73821a","uncles":[],"withdrawals":[{"index":"0x1170","validatorIndex":"0x38c2c","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x66edfd65"},{"index":"0x1171","validatorIndex":"0x38c2d","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6cd228e4"},{"index":"0x1172","validatorIndex":"0x38c2e","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x77f3431b"},{"index":"0x1173","validatorIndex":"0x38c2f","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6b61f268"},{"index":"0x1174","validatorIndex":"0x38c30","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6e10bb21"},{"index":"0x1175","validatorIndex":"0x38c31","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6eb115a5"},{"index":"0x1176","validatorIndex":"0x38c32","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7caead1d"},{"index":"0x1177","validatorIndex":"0x38c33","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x772c0ddf"},{"index":"0x1178","validatorIndex":"0x38c34","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x75930a95"},{"index":"0x1179","validatorIndex":"0x38c35","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76a4db09"},{"index":"0x117a","validatorIndex":"0x38c36","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7e692b27"},{"index":"0x117b","validatorIndex":"0x38c37","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x72038ae6"},{"index":"0x117c","validatorIndex":"0x38c38","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6ccce352"},{"index":"0x117d","validatorIndex":"0x38c39","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x79ef6898"},{"index":"0x117e","validatorIndex":"0x38c3a","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6d58977d"},{"index":"0x117f","validatorIndex":"0x38c3b","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76f7d208"}],"withdrawalsRoot":"0xbe712c930a0665264b025ced87cc7839eef95a3cbc26dadc93e9e185a350ad28"}
{"name":"post-shanghai-bad-receipts","fail":true}
{"baseFeePerGas":"0x3fb7c357","difficulty":"0x0","extraData":"0x","gasLimit":"0x1c9c380","gasUsed":"0x18f759","hash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","logsBloom":"0x020010404000001a0000021000000080001100410000100001000010040200980220400000008806200200000100000000000000000000008000000400042000000050000040000112080808800002044000040004042008800480002000000000000002020020000042002400000820000080040000000010200010020010100101212050000008000000008000001010200c80000112010000438040020400000000202400000000002002a0210402000622010000000001700144000040000000002204000000c000410105024010000808000000002004002000000261000000822200200800881000000012500400400000000000000040010000800000","miner":"0x000095e79eac4d76aab57cb2c1f091d553b36ca0","mixHash":"0x5b53dc49cbab268ef9950b1d81b5e36a1b2f1b97aee1b7ff6e4db0e06c29a8b0","nonce":"0x0000000000000000","number":"0x84161e","parentHash":"0x72d92c1498e05952988d4e79a695928a6bcbd37239f8a1734051263b4d3504b8","receiptsRoot":"0xaff90ae18dcc35924a4bddb68d403b8b7812c10c3ea2a114f34105c87d75bcdb","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2a51","stateRoot":"0xc56738518b2c7854a640ae25996d2211c9ef0dd2e4dd9e59e9d9cacef39622da","timestamp":"0x64110a5c","totalDifficulty":"0xa4a470","transactions":["0x1e8f148a9aea7d8d16ea6e9446723b8f262e8bcd89c7c961d52046ebd43b4598","0xab5c870f4c367012bd763172afbfbe68fbf35336a66ae41aff3f2c9dbf4ea3f8","0xa81fd92b2d0f0bbd3cc355f869cca3243c98c5e2641db9ecf3eeabb3b13bff6a","0xa92c7b720c08c83f1a0ed7e4c163200e30a3a8c03fcc5a51e685ea20cd0cb577","0x6921b429ad2ec1e97d3457049ad2e893b5a0349beba47ca1c74a9540af75347a","0xf776b2da0b835dde05d0d8b76fd19385d61e7055036cf637f804b36dc94f2384","0x9a08d899cd14ebb930ed59fa774afdb88a22615b3a931e930931ea54d26dc0bc","0x0fe0d97e25d5eb11a33a3e8278584c3780941fc2675bdf8fc547cee3d1fd3b17","0xef47a60f57f177a683c723c658137efab66d311e1c5abbc4d74f653535144d03","0xe23a5b35faae5335adc5aca38c5d633b00438b798c2053104b8df48406c9b141","0xd8cea4ba619b317bc05d58534af73beec6c2548b31b24d4dc61c9bbd29cfa17a","0x79a4b9d90b02c768baaad305f266281213cc75062cbe99a13222cc0c4b509498","0x6790a3bbddbeb21fcb736a59b3775755051c3a6344d8390cf8ca27f2e8a814f0","0x87ec7ace5442db252b5751ffddd38dcb04b088d36b6b0e526ff25607a4293c81","0x40cb487ecffda94f97ce7fc0f7163f2f024235df2c8291169edc80dac063e6d0","0xb76bb3d88c9b30d927c45ccfcf8d5b0054411ac8501ad588822a7d04690cccf6","0x798ebe823209869347c08bd81e04fbf60e9bdfe44b1cc923215182d0cf3d4edb","0xbe68a7e02725f799a65ebb069ccc83a014ac7c40e4119bf7c220a2f6ddfee295","0xc90c3a72efe81331727fcce4b5bd4906066da314ca9a0b44023a6b09ea7e8114","0x619a6cbd43cde074d314c19623bd66d9fb1e13c158d7138775236f798dc1245e","0xca5a56cd77b9e5b0e79020cc6346edf205bc11e901984d805125f28c2e6686e6","0x999c9ddeed67c6ef6fbf02a6e977a6c1b68e18d24814e51643c7157b87a43e0a","0x47c8f5d0b3778e4c34eba7fcc356fa04a5afd954ccf484728e72c002764dd3c4","0x396797ae0ebcdb72ff1f96fd08b6128f78acc7417353f142f1a5facd425a33e6","0x454aa43d6546a6f62246826c16b7a49c6c704238c18802ef0d659922f23a573c","0x317ecb5bd19caa42a69f836d41556ebb0e0e00e1c6cd2dee230e6e6192612527","0xc879285db5ef0a6bce98021584d16f134c1dc0aed8cc988802c4f72ba6877ff6","0xecaa2d6f597608307e5084854854ba6dc1e69395e2abea14f2c6a2fa1d6faf9a","0x4dd69b69a568ff30ae439e2ded72fbd7f2e7aaa345836703663f155c749c5eed"],"transactionsRoot":"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","uncles":[],"withdrawals":[{"index":"0x1170","validatorIndex":"0x38c2c","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x66edfd65"},{"index":"0x1171","validatorIndex":"0x38c2d","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6cd228e4"},{"index":"0x1172","validatorIndex":"0x38c2e","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x77f3431b"},{"index":"0x1173","validatorIndex":"0x38c2f","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6b61f268"},{"index":"0x1174","validatorIndex":"0x38c30","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6e10bb21"},{"index":"0x1175","validatorIndex":"0x38c31","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6eb115a5"},{"index":"0x1176","validatorIndex":"0x38c32","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7caead1d"},{"index":"0x1177","validatorIndex":"0x38c33","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x772c0ddf"},{"index":"0x1178","validatorIndex":"0x38c34","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x75930a95"},{"index":"0x1179","validatorIndex":"0x38c35","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76a4db09"},{"index":"0x117a","validatorIndex":"0x38c36","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7e692b27"},{"index":"0x117b","validatorIndex":"0x38c37","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x72038ae6"},{"index":"0x117c","validatorIndex":"0x38c38","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6ccce352"},{"index":"0x117d","validatorIndex":"0x38c39","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x79ef6898"},{"index":"0x117e","validatorIndex":"0x38c3a","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6d58977d"},{"index":"0x117f","validatorIndex":"0x38c3b","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76f7d208"}],"withdrawalsRoot":"0xbe712c930a0665264b025ced87cc7839eef95a3cbc26dadc93e9e185a350ad28"}
{"name":"post-shanghai-bad-transactions","fail":true}
{"baseFeePerGas":"0x3fb7c357","difficulty":"0x0","extraData":"0x","gasLimit":"0x1c9c380","gasUsed":"0x18f759","hash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","logsBloom":"0x020010404000001a0000021000000080001100410000100001000010040200980220400000008806200200000100000000000000000000008000000400042000000050000040000112080808800002044000040004042008800480002000000000000002020020000042002400000820000080040000000010200010020010100101212050000008000000008000001010200c80000112010000438040020400000000202400000000002002a0210402000622010000000001700144000040000000002204000000c000410105024010000808000000002004002000000261000000822200200800881000000012500400400000000000000040010000800000","miner":"0x000095e79eac4d76aab57cb2c1f091d553b36ca0","mixHash":"0x5b53dc49cbab268ef9950b1d81b5e36a1b2f1b97aee1b7ff6e4db0e06c29a8b0","nonce":"0x0000000000000000","number":"0x84161e","parentHash":"0x72d92c1498e05952988d4e79a695928a6bcbd37239f8a1734051263b4d3504b8","receiptsRoot":"0xaff90ae18dcc35924a4bddb68d403b8b7812c10c3ea2a114f34105c87d75bcdb","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2a51","stateRoot":"0xc56738518b2c7854a640ae25996d2211c9ef0dd2e4dd9e59e9d9cacef39622da","timestamp":"0x64110a5c","totalDifficulty":"0xa4a470","transactions":["0x1e8f148a9aea7d8d16ea6e9446723b8f262e8bcd89c7c961d52046ebd43b4598","0xab5c870f4c367012bd763172afbfbe68fbf35336a66ae41aff3f2c9dbf4ea3f8","0xa81fd92b2d0f0bbd3cc355f869cca3243c98c5e2641db9ecf3eeabb3b13bff6a","0xa92c7b720c08c83f1a0ed7e4c163200e30a3a8c03fcc5a51e685ea20cd0cb577","0x6921b429ad2ec1e97d3457049ad2e893b5a0349beba47ca1c74a9540af75347a","0xf776b2da0b835dde05d0d8b76fd19385d61e7055036cf637f804b36dc94f2384","0x9a08d899cd14ebb930ed59fa774afdb88a22615b3a931e930931ea54d26dc0bc","0x0fe0d97e25d5eb11a33a3e8278584c3780941fc2675bdf8fc547cee3d1fd3b17","0xef47a60f57f177a683c723c658137efab66d311e1c5abbc4d74f653535144d03","0xe23a5b35faae5335adc5aca38c5d633b00438b798c2053104b8df48406c9b141","0xd8cea4ba619b317bc05d58534af73beec6c2548b31b24d4dc61c9bbd29cfa17a","0x79a4b9d90b02c768baaad305f266281213cc75062cbe99a13222cc0c4b509498","0x6790a3bbddbeb21fcb736a59b3775755051c3a6344d8390cf8ca27f2e8a814f0","0x87ec7ace5442db252b5751ffddd38dcb04b088d36b6b0e526ff25607a4293c81","0x40cb487ecffda94f97ce7fc0f7163f2f024235df2c8291169edc80dac063e6d0","0xb76bb3d88c9b30d927c45ccfcf8d5b0054411ac8501ad588822a7d04690cccf6","0x798ebe823209869347c08bd81e04fbf60e9bdfe44b1cc923215182d0cf3d4edb","0xbe68a7e02725f799a65ebb069ccc83a014ac7c40e4119bf7c220a2f6ddfee295","0xc90c3a72efe81331727fcce4b5bd4906066da314ca9a0b44023a6b09ea7e8114","0x619a6cbd43cde074d314c19623bd66d9fb1e13c158d7138775236f798dc1245e","0xca5a56cd77b9e5b0e79020cc6346edf205bc11e901984d805125f28c2e6686e6","0x999c9ddeed67c6ef6fbf02a6e977a6c1b68e18d24814e51643c7157b87a43e0a","0x47c8f5d0b3778e4c34eba7fcc356fa04a5afd954ccf484728e72c002764dd3c4","0x396797ae0ebcdb72ff1f96fd08b6128f78acc7417353f142f1a5facd425a33e6","0x454aa43d6546a6f62246826c16b7a49c6c704238c18802ef0d659922f23a573c","0x317ecb5bd19caa42a69f836d41556ebb0e0e00e1c6cd2dee230e6e6192612527","0xc879285db5ef0a6bce98021584d16f134c1dc0aed8cc988802c4f72ba6877ff6","0xecaa2d6f597608307e5084854854ba6dc1e69395e2abea14f2c6a2fa1d6faf9a","0x4dd69b69a568ff30ae439e2ded72fbd7f2e7aaa345836703663f155c749c5eed"],"transactionsRoot":"0x4a87d0cf5990b1c5bac631583e5965c2ba943858bebb2e07f74d0b697f73821a","uncles":[],"withdrawals":[{"index":"0x1170","validatorIndex":"0x38c2c","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x66edfd65"},{"index":"0x1171","validatorIndex":"0x38c2d","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6cd228e4"},{"index":"0x1172","validatorIndex":"0x38c2e","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x77f3431b"},{"index":"0x1173","validatorIndex":"0x38c2f","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6b61f268"},{"index":"0x1174","validatorIndex":"0x38c30","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6e10bb21"},{"index":"0x1175","validatorIndex":"0x38c31","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6eb115a5"},{"index":"0x1176","validatorIndex":"0x38c32","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7caead1d"},{"index":"0x1177","validatorIndex":"0x38c33","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x772c0ddf"},{"index":"0x1178","validatorIndex":"0x38c34","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x75930a95"},{"index":"0x1179","validatorIndex":"0x38c35","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76a4db09"},{"index":"0x117a","validatorIndex":"0x38c36","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7e692b27"},{"index":"0x117b","validatorIndex":"0x38c37","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x72038ae6"},{"index":"0x117c","validatorIndex":"0x38c38","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6ccce352"},{"index":"0x117d","validatorIndex":"0x38c39","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x79ef6898"},{"index":"0x117e","validatorIndex":"0x38c3a","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6d58977d"},{"index":"0x117f","validatorIndex":"0x38c3b","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76f7d208"}],"withdrawalsRoot":"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}
{"name":"post-shanghai-bad-withdrawals","fail":true}
{"baseFeePerGas":"0x3fb7c357","difficulty":"0x0","extraData":"0x","gasLimit":"0x1c9c380","gasUsed":"0x18f759","hash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","logsBloom":"0x020010404000001a0000021000000080001100410000100001000010040200980220400000008806200200000100000000000000000000008000000400042000000050000040000112080808800002044000040004042008800480002000000000000002020020000042002400000820000080040000000010200010020010100101212050000008000000008000001010200c80000112010000438040020400000000202400000000002002a0210402000622010000000001700144000040000000002204000000c000410105024010000808000000002004002000000261000000822200200800881000000012500400400000000000000040010000800000","miner":"0x000095e79eac4d76aab57cb2c1f091d553b36ca0","mixHash":"0x5b53dc49cbab268ef9950b1d81b5e36a1b2f1b97aee1b7ff6e4db0e06c29a8b0","nonce":"0x0000000000000000","number":"0x84161e","parentHash":"0x72d92c1498e05952988d4e79a695928a6bcbd37239f8a1734051263b4d3504b8","receiptsRoot":"0xaff90ae18dcc35924a4bddb68d403b8b7812c10c3ea2a114f34105c87d75bcdb","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2a51","stateRoot":"0xc56738518b2c7854a640ae25996d2211c9ef0dd2e4dd9e59e9d9cacef39622da","timestamp":"0x64110a5c","totalDifficulty":"0xa4a470","transactions":["0x1e8f148a9aea7d8d16ea6e9446723b8f262e8bcd89c7c961d52046ebd43b4598","0xab5c870f4c367012bd763172afbfbe68fbf35336a66ae41aff3f2c9dbf4ea3f8","0xa81fd92b2d0f0bbd3cc355f869cca3243c98c5e2641db9ecf3eeabb3b13bff6a","0xa92c7b720c08c83f1a0ed7e4c163200e30a3a8c03fcc5a51e685ea20cd0cb577","0x6921b429ad2ec1e97d3457049ad2e893b5a0349beba47ca1c74a9540af75347a","0xf776b2da0b835dde05d0d8b76fd19385d61e7055036cf637f804b36dc94f2384","0x9a08d899cd14ebb930ed59fa774afdb88a22615b3a931e930931ea54d26dc0bc","0x0fe0d97e25d5eb11a33a3e8278584c3780941fc2675bdf8fc547cee3d1fd3b17","0xef47a60f57f177a683c723c658137efab66d311e1c5abbc4d74f653535144d03","0xe23a5b35faae5335adc5aca38c5d633b00438b798c2053104b8df48406c9b141","0xd8cea4ba619b317bc05d58534af73beec6c2548b31b24d4dc61c9bbd29cfa17a","0x79a4b9d90b02c768baaad305f266281213cc75062cbe99a13222cc0c4b509498","0x6790a3bbddbeb21fcb736a59b3775755051c3a6344d8390cf8ca27f2e8a814f0","0x87ec7ace5442db252b5751ffddd38dcb04b088d36b6b0e526ff25607a4293c81","0x40cb487ecffda94f97ce7fc0f7163f2f024235df2c8291169edc80dac063e6d0","0xb76bb3d88c9b30d927c45ccfcf8d5b0054411ac8501ad588822a7d04690cccf6","0x798ebe823209869347c08bd81e04fbf60e9bdfe44b1cc923215182d0cf3d4edb","0xbe68a7e02725f799a65ebb069ccc83a014ac7c40e4119bf7c220a2f6ddfee295","0xc90c3a72efe81331727fcce4b5bd4906066da314ca9a0b44023a6b09ea7e8114","0x619a6cbd43cde074d314c19623bd66d9fb1e13c158d7138775236f798dc1245e","0xca5a56cd77b9e5b0e79020cc6346edf205bc11e901984d805125f28c2e6686e6","0x999c9ddeed67c6ef6fbf02a6e977a6c1b68e18d24814e51643c7157b87a43e0a","0x47c8f5d0b3778e4c34eba7fcc356fa04a5afd954ccf484728e72c002764dd3c4","0x396797ae0ebcdb72ff1f96fd08b6128f78acc7417353f142f1a5facd425a33e6","0x454aa43d6546a6f62246826c16b7a49c6c704238c18802ef0d659922f23a573c","0x317ecb5bd19caa42a69f836d41556ebb0e0e00e1c6cd2dee230e6e6192612527","0xc879285db5ef0a6bce98021584d16f134c1dc0aed8cc988802c4f72ba6877ff6","0xecaa2d6f597608307e5084854854ba6dc1e69395e2abea14f2c6a2fa1d6faf9a","0x4dd69b69a568ff30ae439e2ded72fbd7f2e7aaa345836703663f155c749c5eed"],"transactionsRoot":"0x4a87d0cf5990b1c5bac631583e5965c2ba943858bebb2e07f74d0b697f73821a","uncles":[],"withdrawals":[{"index":"0x1170","validatorIndex":"0x38c2c","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x66edfd65"},{"index":"0x1171","validatorIndex":"0x38c2d","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6cd228e4"},{"index":"0x1172","validatorIndex":"0x38c2e","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x77f3431b"},{"index":"0x1173","validatorIndex":"0x38c2f","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6b61f268"},{"index":"0x1174","validatorIndex":"0x38c30","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6e10bb21"},{"index":"0x1175","validatorIndex":"0x38c31","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6eb115a5"},{"index":"0x1176","validatorIndex":"0x38c32","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7caead1d"},{"index":"0x1177","validatorIndex":"0x38c33","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x772c0ddf"},{"index":"0x1178","validatorIndex":"0x38c34","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x75930a95"},{"index":"0x1179","validatorIndex":"0x38c35","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76a4db09"},{"index":"0x117a","validatorIndex":"0x38c36","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7e692b27"},{"index":"0x117b","validatorIndex":"0x38c37","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x72038ae6"},{"index":"0x117c","validatorIndex":"0x38c38","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6ccce352"},{"index":"0x117d","validatorIndex":"0x38c39","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x79ef6898"},{"index":"0x117e","validatorIndex":"0x38c3a","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6d58977d"},{"index":"0x117f","validatorIndex":"0x38c3b","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76f7d208"}],"withdrawalsRoot":"0xbe712c930a0665264b025ced87cc7839eef95a3cbc26dadc93e9e185a350ad28"}
{"name":"post-shanghai-success"}
{"baseFeePerGas":"0x7ccf990f8","difficulty":"0x0","extraData":"0xd883010b02846765746888676f312e32302e31856c696e7578","gasLimit":"0x1c9c380","gasUsed":"0xa79638","hash":"0x9ef7cd2241202b919a0e51240818a8666c73f7ce4b908931e3ae6d26d30f7663","logsBloom":"0xb034000008010014411408c080a0018440087220211154100005a1388807241142a2504080034a00111212a47f05008520200000280202a12800538cc06488486a0141989c7800c0c848011f02249661800e08449145b040a252d18082c009000641004052c80102000804ac10901c24032000980010438a01e50a90a0d8008c138c21204040000b20425000833041028000148124c2012d0aa8d1d0548301808228002015184090000224021040d68220100210220480420308455c382a40020130dc42502986080600000115034c0401c81828490410308005610048026b822e10b4228071ba00bdd20140621b2000c02012300808084181ac308200000011","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x31f0c0305fc07a93b1a33da339c79aadbe8d9811c78d2b514cd18d64e1328f25","nonce":"0x0000000000000000","number":"0x840249","parentHash":"0x2303b55af4add799b19275a491b150c1a03075395f87a7856a4e3327595ed7df","receiptsRoot":"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0xea6d","stateRoot":"0xd12bf4cf3941cf48be329a939b13d3403d326841c69cdcc9a9c13ab2f227e904","timestamp":"0x640fdeb0","totalDifficulty":"0xa4a470","transactions":["0x39c666d9b5cec429accad7b0f94f789ca2ebeb5294b8b129c1b76f552daf57d3","0x2ca7289ab3738d17e0f5093bd96c97c06c9a2ea4c22fc84a6a7fbfda93ce55ee","0xb0085de1476530de3efc6928c4683e7c40f8fac18875f74cbcc47df159de17d9","0xe01c8631c86ded63af95b8dbc0c8aac5d31254c14d6ecb4cc51d98259d838e52","0x69414a126a6f07ab5e31ad2f9069fb986b7c490e096898473873e41ece6af783","0xa2fef1133ee726533c7f190f246fede123e3706a03933c1febc92618f90d2804","0x6585ec5c4c2bbf1f683f90f58e18f3b38d875e94457fe4cbb7bc5bf6581f83af","0x1db276b864fbf01dcf8cededf8d597553ecb0eb9438edfaf2f5bd0cc93297c66","0xcbe7ed31654af4e191ca53445b82de040ae2cd92459a3f951bdcce423d780f08","0x808ba5211f03cc78a732ff0f9383c6355e63c83ae8c6035ced2ba6f7c331dc63","0xdd66f1f26672849ef54c420210f479c9f0c46924d8e9f7b210981ffe8d3fac82","0x254abb2f8cdcffe9ef62ab924312a1e4142578db87e4f7c199fd35991e92f014","0xa7b7c654e7073b8043b680b7ffc95d3f2099abaa0b0578d6f954a2a7c99404e1","0x7ccdfa698c8acf47ab9316ed078eb40819ff575bcf612c6f59f29e7726df3f96","0xa0b035ef315824a6f6a6565fa8de27042ade3af9cf0583a36dea83d6e01bf2a8","0x1ebad7f3e8cb3543d4963686a94d99f61839f666831eab9c9c1b4711de11d3d9","0x501750278e91d8b5be1ccf60e793d4bbcd9b3bb3ccc518d3634a71caeac65f48","0xd80ff8af29ae163d5811ba511e60b3a87a279f677bb3872a0f1aa6d0a226e880","0x096acab3b3fe47b149d375782d1eb00b9fef7904076d60c54b3c197b04e6bf82","0xbe9d1738af74a22400591a9a808fb01a25ab41e2e56f202dd7251eb113e8ceeb","0x0834c720e55cccd97aaf4f8fb0cb66afb9881fb6a762c0f70473ec53f98a712e","0x51a0c33c9b37245b416575bdd2751c0d8a5d8bead49585ac427bfc873d4016af","0x531c25d51ccda59aa9ea82e85c99be9dd4e285af9b8973cbab9ac4a38e26e55a","0x93ac6c08d21cb1b61ff59e5e2d6fa3f9ad54008b0a66c669199050bef219f6e3","0x3792db6dd6285f409e4281951e9f78dad16c4a78072ff1c909dfadea5658d857","0xd2d51764c01e8c0a43fbe362704388df5bacf7e5e620c3864e242530ffb3e828","0x516b0227d9e64eb6e0de6862764d40f5376b5f12fec878436fea3479b4c36bb8","0x81b0abc78b82840adb666775b182a9e292f663b64bcd35004c04436ed3c8281c","0xd0287570d431d2baea96ecc81cb890e7f4f06ab5df02f9b4067768abca19acb5","0x76ddab2674369f34946c5fa2f05e2aa8566d86235b83e808e9b27bc106e04ac7","0x34a5c74011a2c8a00103bc91bfbfd94aa99cd569be69066e4bf64d188fe8714e","0x7b9730ead1b9f59b206d0ddea87be9383ba3fc7b496c7863b0cb847889b86617","0x77166ee0409ba86bd26e7c03ad1a927abaf5af8a8a37149e725cd37512091dd6","0x3c2b6c2ae505c5c36d5f316c1fcb5f54f7346ed35ae35c93462991ded7968a68","0xf99a792837e13827b5e0a8915fb59c760babc95d242feca99a5594e64ff6b6e2","0x522313f5d923f048ae5bd0b5595c1f4fc883bc0b3cf3cb0939d3fcf8b08c829c","0x471ceb0e85af594aa56deca54cb8198567b2afd8406722ea530077aaa6b641b3","0x3e9dca502e9039ae0c6d642f62e9562ff00010c6bfbb8234a6135712ba70dfda","0xc95cac67267f4accb9b5950316ac64772f7d082bed6b712c09cf2da0bdc237b7","0xfca28fdbd13fc16daf7aec7d4a2ad2c6b5f0b2a7b0fb1d9167c09b5e115ff26e","0xc73124ca798b2f7a5df2ea4d568efab2f41b135130ea5cc41d4bcb4b5c57d5bd","0x29abb76b5e7a5ce137bf9c22474d386eb58d249f43178d2b2e15c16dfdc5ca80","0x03e5ab25a58bd44fb9dd0c698b323eab8b8363479dfcbcbb16d0a0bd983880ae","0x3c8ee80ddea7fa2d2b75e44563c10c10756f598e8ad252a49c5d3e8a5c8e6cbf","0xaffa73b68bc7ab0c3f5e28377f5ca0a5df33c0a485f64dc094b7f6ae23353203","0xc66c9c66fbc8fe97fcc16506cde7a58689af1004a18c6171cfe763bcd94f50b2","0x80fec96707519172b53790610d5800cd09a4243aca9bacfa956c56337d06f820","0x61b33bfcf11214906dcdce7d7ed83ad82f38184c03ded07f7782059d02eeedea","0x5d4138d4e28a8327e506cb012346b1b38b65f615a2b991d35cf5d4de244b3e6d","0x875a142b6dfcf10ffb71a7afe0ce4672c047fc7e162ba0383390516d6334d45d","0x79b6df832bfbd04085d0b005a6e3ad8f00fc8717eed59280aa8107268b71e7e0","0xcb2fb25d268f65dc9312e89bd3c328c9847a3c9da282026793c54a745f825ab5","0xe483d4a36ad19fd5eacb7f6d9ad3ce080ad70ac673273e710f6e3d5acbc6559c","0x0564242c37d5013b671ef4864394cc0f3924c589f8aad64118223a9af2f164f6","0x48db358e80b278c3a46c2a166339797060a40f33984a5d974992cd9722139d5d","0x69d7758db91fae31fa35ecbed4d40897c5087f45dc796cd796b8ceead21f972e","0x2951478916ecd27a8e808d08f85be4bf2c0b0e0546f21f4e309145dd96eb8df1","0xaca9028cb5d55bbf71b7bff9884a9a3b0b38a575ffc8f8807ce345cf8bd298ef","0xc7f625a19ee41a1750eac9428b4394a9a2476b8ea2d31b4c2f9f5b4fcb86cae3","0x45499074aa521ac4151138f0aad969bcc2dfc1648d22ff8c42e51c74cb77414d","0x00b5b05c6d1a2eb8abe2c383da600516515e383fc8a29953bb6e6d167e9705b2","0x6fc411f24c7b4b8d821b45de32b9edc5ac998d1ac748a98abe8e983c6f39fc19"],"transactionsRoot":"0x1ad3212eca045505cfc4cacf675b5fa2e7dc7b9f9cee88191464f97d1c9fbca4","uncles":[]}
{"name":"pre-shanghai-bad-receipts","fail":true}
{"baseFeePerGas":"0x7ccf990f8","difficulty":"0x0","extraData":"0xd883010b02846765746888676f312e32302e31856c696e7578","gasLimit":"0x1c9c380","gasUsed":"0xa79638","hash":"0x9ef7cd2241202b919a0e51240818a8666c73f7ce4b908931e3ae6d26d30f7663","logsBloom":"0xb034000008010014411408c080a0018440087220211154100005a1388807241142a2504080034a00111212a47f05008520200000280202a12800538cc06488486a0141989c7800c0c848011f02249661800e08449145b040a252d18082c009000641004052c80102000804ac10901c24032000980010438a01e50a90a0d8008c138c21204040000b20425000833041028000148124c2012d0aa8d1d0548301808228002015184090000224021040d68220100210220480420308455c382a40020130dc42502986080600000115034c0401c81828490410308005610048026b822e10b4228071ba00bdd20140621b2000c02012300808084181ac308200000011","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x31f0c0305fc07a93b1a33da339c79aadbe8d9811c78d2b514cd18d64e1328f25","nonce":"0x0000000000000000","number":"0x840249","parentHash":"0x2303b55af4add799b19275a491b150c1a03075395f87a7856a4e3327595ed7df","receiptsRoot":"0x99da71b17ae1929db912c3315ebe349d37f2bb600454616fdde0ee90d6dbc59e","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0xea6d","stateRoot":"0xd12bf4cf3941cf48be329a939b13d3403d326841c69cdcc9a9c13ab2f227e904","timestamp":"0x640fdeb0","totalDifficulty":"0xa4a470","transactions":["0x39c666d9b5cec429accad7b0f94f789ca2ebeb5294b8b129c1b76f552daf57d3","0x2ca7289ab3738d17e0f5093bd96c97c06c9a2ea4c22fc84a6a7fbfda93ce55ee","0xb0085de1476530de3efc6928c4683e7c40f8fac18875f74cbcc47df159de17d9","0xe01c8631c86ded63af95b8dbc0c8aac5d31254c14d6ecb4cc51d98259d838e52","0x69414a126a6f07ab5e31ad2f9069fb986b7c490e096898473873e41ece6af783","0xa2fef1133ee726533c7f190f246fede123e3706a03933c1febc92618f90d2804","0x6585ec5c4c2bbf1f683f90f58e18f3b38d875e94457fe4cbb7bc5bf6581f83af","0x1db276b864fbf01dcf8cededf8d597553ecb0eb9438edfaf2f5bd0cc93297c66","0xcbe7ed31654af4e191ca53445b82de040ae2cd92459a3f951bdcce423d780f08","0x808ba5211f03cc78a732ff0f9383c6355e63c83ae8c6035ced2ba6f7c331dc63","0xdd66f1f26672849ef54c420210f479c9f0c46924d8e9f7b210981ffe8d3fac82","0x254abb2f8cdcffe9ef62ab924312a1e4142578db87e4f7c199fd35991e92f014","0xa7b7c654e7073b8043b680b7ffc95d3f2099abaa0b0578d6f954a2a7c99404e1","0x7ccdfa698c8acf47ab9316ed078eb40819ff575bcf612c6f59f29e7726df3f96","0xa0b035ef315824a6f6a6565fa8de27042ade3af9cf0583a36dea83d6e01bf2a8","0x1ebad7f3e8cb3543d4963686a94d99f61839f666831eab9c9c1b4711de11d3d9","0x501750278e91d8b5be1ccf60e793d4bbcd9b3bb3ccc518d3634a71caeac65f48","0xd80ff8af29ae163d5811ba511e60b3a87a279f677bb3872a0f1aa6d0a226e880","0x096acab3b3fe47b149d375782d1eb00b9fef7904076d60c54b3c197b04e6bf82","0xbe9d1738af74a22400591a9a808fb01a25ab41e2e56f202dd7251eb113e8ceeb","0x0834c720e55cccd97aaf4f8fb0cb66afb9881fb6a762c0f70473ec53f98a712e","0x51a0c33c9b37245b416575bdd2751c0d8a5d8bead49585ac427bfc873d4016af","0x531c25d51ccda59aa9ea82e85c99be9dd4e285af9b8973cbab9ac4a38e26e55a","0x93ac6c08d21cb1b61ff59e5e2d6fa3f9ad54008b0a66c669199050bef219f6e3","0x3792db6dd6285f409e4281951e9f78dad16c4a78072ff1c909dfadea5658d857","0xd2d51764c01e8c0a43fbe362704388df5bacf7e5e620c3864e242530ffb3e828","0x516b0227d9e64eb6e0de6862764d40f5376b5f12fec878436fea3479b4c36bb8","0x81b0abc78b82840adb666775b182a9e292f663b64bcd35004c04436ed3c8281c","0xd0287570d431d2baea96ecc81cb890e7f4f06ab5df02f9b4067768abca19acb5","0x76ddab2674369f34946c5fa2f05e2aa8566d86235b83e808e9b27bc106e04ac7","0x34a5c74011a2c8a00103bc91bfbfd94aa99cd569be69066e4bf64d188fe8714e","0x7b9730ead1b9f59b206d0ddea87be9383ba3fc7b496c7863b0cb847889b86617","0x77166ee0409ba86bd26e7c03ad1a927abaf5af8a8a37149e725cd37512091dd6","0x3c2b6c2ae505c5c36d5f316c1fcb5f54f7346ed35ae35c93462991ded7968a68","0xf99a792837e13827b5e0a8915fb59c760babc95d242feca99a5594e64ff6b6e2","0x522313f5d923f048ae5bd0b5595c1f4fc883bc0b3cf3cb0939d3fcf8b08c829c","0x471ceb0e85af594aa56deca54cb8198567b2afd8406722ea530077aaa6b641b3","0x3e9dca502e9039ae0c6d642f62e9562ff00010c6bfbb8234a6135712ba70dfda","0xc95cac67267f4accb9b5950316ac64772f7d082bed6b712c09cf2da0bdc237b7","0xfca28fdbd13fc16daf7aec7d4a2ad2c6b5f0b2a7b0fb1d9167c09b5e115ff26e","0xc73124ca798b2f7a5df2ea4d568efab2f41b135130ea5cc41d4bcb4b5c57d5bd","0x29abb76b5e7a5ce137bf9c22474d386eb58d249f43178d2b2e15c16dfdc5ca80","0x03e5ab25a58bd44fb9dd0c698b323eab8b8363479dfcbcbb16d0a0bd983880ae","0x3c8ee80ddea7fa2d2b75e44563c10c10756f598e8ad252a49c5d3e8a5c8e6cbf","0xaffa73b68bc7ab0c3f5e28377f5ca0a5df33c0a485f64dc094b7f6ae23353203","0xc66c9c66fbc8fe97fcc16506cde7a58689af1004a18c6171cfe763bcd94f50b2","0x80fec96707519172b53790610d5800cd09a4243aca9bacfa956c56337d06f820","0x61b33bfcf11214906dcdce7d7ed83ad82f38184c03ded07f7782059d02eeedea","0x5d4138d4e28a8327e506cb012346b1b38b65f615a2b991d35cf5d4de244b3e6d","0x875a142b6dfcf10ffb71a7afe0ce4672c047fc7e162ba0383390516d6334d45d","0x79b6df832bfbd04085d0b005a6e3ad8f00fc8717eed59280aa8107268b71e7e0","0xcb2fb25d268f65dc9312e89bd3c328c9847a3c9da282026793c54a745f825ab5","0xe483d4a36ad19fd5eacb7f6d9ad3ce080ad70ac673273e710f6e3d5acbc6559c","0x0564242c37d5013b671ef4864394cc0f3924c589f8aad64118223a9af2f164f6","0x48db358e80b278c3a46c2a166339797060a40f33984a5d974992cd9722139d5d","0x69d7758db91fae31fa35ecbed4d40897c5087f45dc796cd796b8ceead21f972e","0x2951478916ecd27a8e808d08f85be4bf2c0b0e0546f21f4e309145dd96eb8df1","0xaca9028cb5d55bbf71b7bff9884a9a3b0b38a575ffc8f8807ce345cf8bd298ef","0xc7f625a19ee41a1750eac9428b4394a9a2476b8ea2d31b4c2f9f5b4fcb86cae3","0x45499074aa521ac4151138f0aad969bcc2dfc1648d22ff8c42e51c74cb77414d","0x00b5b05c6d1a2eb8abe2c383da600516515e383fc8a29953bb6e6d167e9705b2","0x6fc411f24c7b4b8d821b45de32b9edc5ac998d1ac748a98abe8e983c6f39fc19"],"transactionsRoot":"0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","uncles":[]}
{"name":"pre-shanghai-bad-transactions","fail":true}
{"baseFeePerGas":"0x7ccf990f8","difficulty":"0x0","extraData":"0xd883010b02846765746888676f312e32302e31856c696e7578","gasLimit":"0x1c9c380","gasUsed":"0xa79638","hash":"0x9ef7cd2241202b919a0e51240818a8666c73f7ce4b908931e3ae6d26d30f7663","logsBloom":"0xb034000008010014411408c080a0018440087220211154100005a1388807241142a2504080034a00111212a47f05008520200000280202a12800538cc06488486a0141989c7800c0c848011f02249661800e08449145b040a252d18082c009000641004052c80102000804ac10901c24032000980010438a01e50a90a0d8008c138c21204040000b20425000833041028000148124c2012d0aa8d1d0548301808228002015184090000224021040d68220100210220480420308455c382a40020130dc42502986080600000115034c0401c81828490410308005610048026b822e10b4228071ba00bdd20140621b2000c02012300808084181ac308200000011","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x31f0c0305fc07a93b1a33da339c79aadbe8d9811c78d2b514cd18d64e1328f25","nonce":"0x0000000000000000","number":"0x840249","parentHash":"0x2303b55af4add799b19275a491b150c1a03075395f87a7856a4e3327595ed7df","receiptsRoot":"0x99da71b17ae1929db912c3315ebe349d37f2bb600454616fdde0ee90d6dbc59e","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0xea6d","stateRoot":"0xd12bf4cf3941cf48be329a939b13d3403d326841c69cdcc9a9c13ab2f227e904","timestamp":"0x640fdeb0","totalDifficulty":"0xa4a470","transactions":["0x39c666d9b5cec429accad7b0f94f789ca2ebeb5294b8b129c1b76f552daf57d3","0x2ca7289ab3738d17e0f5093bd96c97c06c9a2ea4c22fc84a6a7fbfda93ce55ee","0xb0085de1476530de3efc6928c4683e7c40f8fac18875f74cbcc47df159de17d9","0xe01c8631c86ded63af95b8dbc0c8aac5d31254c14d6ecb4cc51d98259d838e52","0x69414a126a6f07ab5e31ad2f9069fb986b7c490e096898473873e41ece6af783","0xa2fef1133ee726533c7f190f246fede123e3706a03933c1febc92618f90d2804","0x6585ec5c4c2bbf1f683f90f58e18f3b38d875e94457fe4cbb7bc5bf6581f83af","0x1db276b864fbf01dcf8cededf8d597553ecb0eb9438edfaf2f5bd0cc93297c66","0xcbe7ed31654af4e191ca53445b82de040ae2cd92459a3f951bdcce423d780f08","0x808ba5211f03cc78a732ff0f9383c6355e63c83ae8c6035ced2ba6f7c331dc63","0xdd66f1f26672849ef54c420210f479c9f0c46924d8e9f7b210981ffe8d3fac82","0x254abb2f8cdcffe9ef62ab924312a1e4142578db87e4f7c199fd35991e92f014","0xa7b7c654e7073b8043b680b7ffc95d3f2099abaa0b0578d6f954a2a7c99404e1","0x7ccdfa698c8acf47ab9316ed078eb40819ff575bcf612c6f59f29e7726df3f96","0xa0b035ef315824a6f6a6565fa8de27042ade3af9cf0583a36dea83d6e01bf2a8","0x1ebad7f3e8cb3543d4963686a94d99f61839f666831eab9c9c1b4711de11d3d9","0x501750278e91d8b5be1ccf60e793d4bbcd9b3bb3ccc518d3634a71caeac65f48","0xd80ff8af29ae163d5811ba511e60b3a87a279f677bb3872a0f1aa6d0a226e880","0x096acab3b3fe47b149d375782d1eb00b9fef7904076d60c54b3c197b04e6bf82","0xbe9d1738af74a22400591a9a808fb01a25ab41e2e56f202dd7251eb113e8ceeb","0x0834c720e55cccd97aaf4f8fb0cb66afb9881fb6a762c0f70473ec53f98a712e","0x51a0c33c9b37245b416575bdd2751c0d8a5d8bead49585ac427bfc873d4016af","0x531c25d51ccda59aa9ea82e85c99be9dd4e285af9b8973cbab9ac4a38e26e55a","0x93ac6c08d21cb1b61ff59e5e2d6fa3f9ad54008b0a66c669199050bef219f6e3","0x3792db6dd6285f409e4281951e9f78dad16c4a78072ff1c909dfadea5658d857","0xd2d51764c01e8c0a43fbe362704388df5bacf7e5e620c3864e242530ffb3e828","0x516b0227d9e64eb6e0de6862764d40f5376b5f12fec878436fea3479b4c36bb8","0x81b0abc78b82840adb666775b182a9e292f663b64bcd35004c04436ed3c8281c","0xd0287570d431d2baea96ecc81cb890e7f4f06ab5df02f9b4067768abca19acb5","0x76ddab2674369f34946c5fa2f05e2aa8566d86235b83e808e9b27bc106e04ac7","0x34a5c74011a2c8a00103bc91bfbfd94aa99cd569be69066e4bf64d188fe8714e","0x7b9730ead1b9f59b206d0ddea87be9383ba3fc7b496c7863b0cb847889b86617","0x77166ee0409ba86bd26e7c03ad1a927abaf5af8a8a37149e725cd37512091dd6","0x3c2b6c2ae505c5c36d5f316c1fcb5f54f7346ed35ae35c93462991ded7968a68","0xf99a792837e13827b5e0a8915fb59c760babc95d242feca99a5594e64ff6b6e2","0x522313f5d923f048ae5bd0b5595c1f4fc883bc0b3cf3cb0939d3fcf8b08c829c","0x471ceb0e85af594aa56deca54cb8198567b2afd8406722ea530077aaa6b641b3","0x3e9dca502e9039ae0c6d642f62e9562ff00010c6bfbb8234a6135712ba70dfda","0xc95cac67267f4accb9b5950316ac64772f7d082bed6b712c09cf2da0bdc237b7","0xfca28fdbd13fc16daf7aec7d4a2ad2c6b5f0b2a7b0fb1d9167c09b5e115ff26e","0xc73124ca798b2f7a5df2ea4d568efab2f41b135130ea5cc41d4bcb4b5c57d5bd","0x29abb76b5e7a5ce137bf9c22474d386eb58d249f43178d2b2e15c16dfdc5ca80","0x03e5ab25a58bd44fb9dd0c698b323eab8b8363479dfcbcbb16d0a0bd983880ae","0x3c8ee80ddea7fa2d2b75e44563c10c10756f598e8ad252a49c5d3e8a5c8e6cbf","0xaffa73b68bc7ab0c3f5e28377f5ca0a5df33c0a485f64dc094b7f6ae23353203","0xc66c9c66fbc8fe97fcc16506cde7a58689af1004a18c6171cfe763bcd94f50b2","0x80fec96707519172b53790610d5800cd09a4243aca9bacfa956c56337d06f820","0x61b33bfcf11214906dcdce7d7ed83ad82f38184c03ded07f7782059d02eeedea","0x5d4138d4e28a8327e506cb012346b1b38b65f615a2b991d35cf5d4de244b3e6d","0x875a142b6dfcf10ffb71a7afe0ce4672c047fc7e162ba0383390516d6334d45d","0x79b6df832bfbd04085d0b005a6e3ad8f00fc8717eed59280aa8107268b71e7e0","0xcb2fb25d268f65dc9312e89bd3c328c9847a3c9da282026793c54a745f825ab5","0xe483d4a36ad19fd5eacb7f6d9ad3ce080ad70ac673273e710f6e3d5acbc6559c","0x0564242c37d5013b671ef4864394cc0f3924c589f8aad64118223a9af2f164f6","0x48db358e80b278c3a46c2a166339797060a40f33984a5d974992cd9722139d5d","0x69d7758db91fae31fa35ecbed4d40897c5087f45dc796cd796b8ceead21f972e","0x2951478916ecd27a8e808d08f85be4bf2c0b0e0546f21f4e309145dd96eb8df1","0xaca9028cb5d55bbf71b7bff9884a9a3b0b38a575ffc8f8807ce345cf8bd298ef","0xc7f625a19ee41a1750eac9428b4394a9a2476b8ea2d31b4c2f9f5b4fcb86cae3","0x45499074aa521ac4151138f0aad969bcc2dfc1648d22ff8c42e51c74cb77414d","0x00b5b05c6d1a2eb8abe2c383da600516515e383fc8a29953bb6e6d167e9705b2","0x6fc411f24c7b4b8d821b45de32b9edc5ac998d1ac748a98abe8e983c6f39fc19"],"transactionsRoot":"0x1ad3212eca045505cfc4cacf675b5fa2e7dc7b9f9cee88191464f97d1c9fbca4","uncles":[]}
{"name":"pre-shanghai-success"}
#!/bin/bash
set -euo pipefail
SOURCE_DIR=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)
cd "$SOURCE_DIR"
export ETH_RPC_URL=https://ethereum-goerli-rpc.allthatnode.com
jq_mutate() {
local name="$1"
jq -c "$2" "$name" > "$name.tmp" && mv "$name.tmp" "$name"
}
success_case() {
# just format the files
jq_mutate "$1" .
jq_mutate "$2" .
}
bad_receipts_root() {
local data_file="$1"
local metadata_file="$2"
jq_mutate "$data_file" '. + {"receiptsRoot": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}'
jq_mutate "$metadata_file" '. + {"fail": true}'
}
bad_withdrawals_root() {
local data_file="$1"
local metadata_file="$2"
jq_mutate "$data_file" '. + {"withdrawalsRoot": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}'
jq_mutate "$metadata_file" '. + {"fail": true}'
}
bad_transactions_root() {
local data_file="$1"
local metadata_file="$2"
jq_mutate "$data_file" '. + {"transactionsRoot": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}'
jq_mutate "$metadata_file" '. + {"fail": true}'
}
generate_test_vector() {
local name="$1"
local blockhash="$2"
local fulltxs="$3"
local mutation_func="$4"
local metadata_file=""
local data_file=""
if [[ "$fulltxs" == true ]]; then
metadata_file="data/blocks/${name}_metadata.json"
data_file="data/blocks/${name}_data.json"
else
metadata_file="data/headers/${name}_metadata.json"
data_file="data/headers/${name}_data.json"
fi
echo "{\"name\": \"$name\"}" > "$metadata_file"
cast rpc eth_getBlockByHash $blockhash $fulltxs > $data_file
# Mutate data using the provided function
$mutation_func "$data_file" $metadata_file
}
mkdir -p data/blocks
mkdir -p data/headers
# Blocks
generate_test_vector "pre-shanghai-success" "0x9ef7cd2241202b919a0e51240818a8666c73f7ce4b908931e3ae6d26d30f7663" true success_case
generate_test_vector "pre-shanghai-bad-transactions" "0x9ef7cd2241202b919a0e51240818a8666c73f7ce4b908931e3ae6d26d30f7663" true bad_transactions_root
generate_test_vector "pre-shanghai-bad-receipts" "0x9ef7cd2241202b919a0e51240818a8666c73f7ce4b908931e3ae6d26d30f7663" true bad_receipts_root
generate_test_vector "post-shanghai-success" "0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452" true success_case
generate_test_vector "post-shanghai-bad-withdrawals" "0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452" true bad_withdrawals_root
generate_test_vector "post-shanghai-bad-transactions" "0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452" true bad_transactions_root
generate_test_vector "post-shanghai-bad-receipts" "0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452" true bad_receipts_root
# Headers
generate_test_vector "pre-shanghai-success" "0x9ef7cd2241202b919a0e51240818a8666c73f7ce4b908931e3ae6d26d30f7663" false success_case
generate_test_vector "pre-shanghai-bad-transactions" "0x9ef7cd2241202b919a0e51240818a8666c73f7ce4b908931e3ae6d26d30f7663" false bad_transactions_root
generate_test_vector "pre-shanghai-bad-receipts" "0x9ef7cd2241202b919a0e51240818a8666c73f7ce4b908931e3ae6d26d30f7663" false bad_receipts_root
generate_test_vector "post-shanghai-success" "0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452" false success_case
generate_test_vector "post-shanghai-bad-withdrawals" "0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452" false bad_withdrawals_root
generate_test_vector "post-shanghai-bad-transactions" "0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452" false bad_transactions_root
generate_test_vector "post-shanghai-bad-receipts" "0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452" false bad_receipts_root
......@@ -181,16 +181,38 @@ func (hdr *rpcHeader) Info(trustCache bool, mustBePostMerge bool) (eth.BlockInfo
type rpcBlock struct {
rpcHeader
Transactions []*types.Transaction `json:"transactions"`
Withdrawals *eth.Withdrawals `json:"withdrawals,omitempty"`
Withdrawals *types.Withdrawals `json:"withdrawals,omitempty"`
}
func (block *rpcBlock) verify() error {
if computed := block.computeBlockHash(); computed != block.Hash {
return fmt.Errorf("failed to verify block hash: computed %s but RPC said %s", computed, block.Hash)
}
for i, tx := range block.Transactions {
if tx == nil {
return fmt.Errorf("block tx %d is null", i)
}
}
if computed := types.DeriveSha(types.Transactions(block.Transactions), trie.NewStackTrie(nil)); block.TxHash != computed {
return fmt.Errorf("failed to verify transactions list: computed %s but RPC said %s", computed, block.TxHash)
}
if block.WithdrawalsRoot != nil {
if block.Withdrawals == nil {
return fmt.Errorf("expected withdrawals")
}
for i, w := range *block.Withdrawals {
if w == nil {
return fmt.Errorf("block withdrawal %d is null", i)
}
}
if computed := types.DeriveSha(*block.Withdrawals, trie.NewStackTrie(nil)); *block.WithdrawalsRoot != computed {
return fmt.Errorf("failed to verify withdrawals list: computed %s but RPC said %s", computed, block.WithdrawalsRoot)
}
} else {
if block.Withdrawals != nil {
return fmt.Errorf("expected no withdrawals due to missing withdrawals-root, but got %d", len(*block.Withdrawals))
}
}
return nil
}
......
package sources
import (
"embed"
"encoding/json"
"strings"
"testing"
"github.com/stretchr/testify/require"
)
func TestBlockJSON(t *testing.T) {
testCases := []struct {
Name string
OK bool
Data string
}{
{Name: "pre-Shanghai good tx", OK: true, Data: `{"number":"0x840249","hash":"0x9ef7cd2241202b919a0e51240818a8666c73f7ce4b908931e3ae6d26d30f7663","transactions":["0x39c666d9b5cec429accad7b0f94f789ca2ebeb5294b8b129c1b76f552daf57d3","0x2ca7289ab3738d17e0f5093bd96c97c06c9a2ea4c22fc84a6a7fbfda93ce55ee","0xb0085de1476530de3efc6928c4683e7c40f8fac18875f74cbcc47df159de17d9","0xe01c8631c86ded63af95b8dbc0c8aac5d31254c14d6ecb4cc51d98259d838e52","0x69414a126a6f07ab5e31ad2f9069fb986b7c490e096898473873e41ece6af783","0xa2fef1133ee726533c7f190f246fede123e3706a03933c1febc92618f90d2804","0x6585ec5c4c2bbf1f683f90f58e18f3b38d875e94457fe4cbb7bc5bf6581f83af","0x1db276b864fbf01dcf8cededf8d597553ecb0eb9438edfaf2f5bd0cc93297c66","0xcbe7ed31654af4e191ca53445b82de040ae2cd92459a3f951bdcce423d780f08","0x808ba5211f03cc78a732ff0f9383c6355e63c83ae8c6035ced2ba6f7c331dc63","0xdd66f1f26672849ef54c420210f479c9f0c46924d8e9f7b210981ffe8d3fac82","0x254abb2f8cdcffe9ef62ab924312a1e4142578db87e4f7c199fd35991e92f014","0xa7b7c654e7073b8043b680b7ffc95d3f2099abaa0b0578d6f954a2a7c99404e1","0x7ccdfa698c8acf47ab9316ed078eb40819ff575bcf612c6f59f29e7726df3f96","0xa0b035ef315824a6f6a6565fa8de27042ade3af9cf0583a36dea83d6e01bf2a8","0x1ebad7f3e8cb3543d4963686a94d99f61839f666831eab9c9c1b4711de11d3d9","0x501750278e91d8b5be1ccf60e793d4bbcd9b3bb3ccc518d3634a71caeac65f48","0xd80ff8af29ae163d5811ba511e60b3a87a279f677bb3872a0f1aa6d0a226e880","0x096acab3b3fe47b149d375782d1eb00b9fef7904076d60c54b3c197b04e6bf82","0xbe9d1738af74a22400591a9a808fb01a25ab41e2e56f202dd7251eb113e8ceeb","0x0834c720e55cccd97aaf4f8fb0cb66afb9881fb6a762c0f70473ec53f98a712e","0x51a0c33c9b37245b416575bdd2751c0d8a5d8bead49585ac427bfc873d4016af","0x531c25d51ccda59aa9ea82e85c99be9dd4e285af9b8973cbab9ac4a38e26e55a","0x93ac6c08d21cb1b61ff59e5e2d6fa3f9ad54008b0a66c669199050bef219f6e3","0x3792db6dd6285f409e4281951e9f78dad16c4a78072ff1c909dfadea5658d857","0xd2d51764c01e8c0a43fbe362704388df5bacf7e5e620c3864e242530ffb3e828","0x516b0227d9e64eb6e0de6862764d40f5376b5f12fec878436fea3479b4c36bb8","0x81b0abc78b82840adb666775b182a9e292f663b64bcd35004c04436ed3c8281c","0xd0287570d431d2baea96ecc81cb890e7f4f06ab5df02f9b4067768abca19acb5","0x76ddab2674369f34946c5fa2f05e2aa8566d86235b83e808e9b27bc106e04ac7","0x34a5c74011a2c8a00103bc91bfbfd94aa99cd569be69066e4bf64d188fe8714e","0x7b9730ead1b9f59b206d0ddea87be9383ba3fc7b496c7863b0cb847889b86617","0x77166ee0409ba86bd26e7c03ad1a927abaf5af8a8a37149e725cd37512091dd6","0x3c2b6c2ae505c5c36d5f316c1fcb5f54f7346ed35ae35c93462991ded7968a68","0xf99a792837e13827b5e0a8915fb59c760babc95d242feca99a5594e64ff6b6e2","0x522313f5d923f048ae5bd0b5595c1f4fc883bc0b3cf3cb0939d3fcf8b08c829c","0x471ceb0e85af594aa56deca54cb8198567b2afd8406722ea530077aaa6b641b3","0x3e9dca502e9039ae0c6d642f62e9562ff00010c6bfbb8234a6135712ba70dfda","0xc95cac67267f4accb9b5950316ac64772f7d082bed6b712c09cf2da0bdc237b7","0xfca28fdbd13fc16daf7aec7d4a2ad2c6b5f0b2a7b0fb1d9167c09b5e115ff26e","0xc73124ca798b2f7a5df2ea4d568efab2f41b135130ea5cc41d4bcb4b5c57d5bd","0x29abb76b5e7a5ce137bf9c22474d386eb58d249f43178d2b2e15c16dfdc5ca80","0x03e5ab25a58bd44fb9dd0c698b323eab8b8363479dfcbcbb16d0a0bd983880ae","0x3c8ee80ddea7fa2d2b75e44563c10c10756f598e8ad252a49c5d3e8a5c8e6cbf","0xaffa73b68bc7ab0c3f5e28377f5ca0a5df33c0a485f64dc094b7f6ae23353203","0xc66c9c66fbc8fe97fcc16506cde7a58689af1004a18c6171cfe763bcd94f50b2","0x80fec96707519172b53790610d5800cd09a4243aca9bacfa956c56337d06f820","0x61b33bfcf11214906dcdce7d7ed83ad82f38184c03ded07f7782059d02eeedea","0x5d4138d4e28a8327e506cb012346b1b38b65f615a2b991d35cf5d4de244b3e6d","0x875a142b6dfcf10ffb71a7afe0ce4672c047fc7e162ba0383390516d6334d45d","0x79b6df832bfbd04085d0b005a6e3ad8f00fc8717eed59280aa8107268b71e7e0","0xcb2fb25d268f65dc9312e89bd3c328c9847a3c9da282026793c54a745f825ab5","0xe483d4a36ad19fd5eacb7f6d9ad3ce080ad70ac673273e710f6e3d5acbc6559c","0x0564242c37d5013b671ef4864394cc0f3924c589f8aad64118223a9af2f164f6","0x48db358e80b278c3a46c2a166339797060a40f33984a5d974992cd9722139d5d","0x69d7758db91fae31fa35ecbed4d40897c5087f45dc796cd796b8ceead21f972e","0x2951478916ecd27a8e808d08f85be4bf2c0b0e0546f21f4e309145dd96eb8df1","0xaca9028cb5d55bbf71b7bff9884a9a3b0b38a575ffc8f8807ce345cf8bd298ef","0xc7f625a19ee41a1750eac9428b4394a9a2476b8ea2d31b4c2f9f5b4fcb86cae3","0x45499074aa521ac4151138f0aad969bcc2dfc1648d22ff8c42e51c74cb77414d","0x00b5b05c6d1a2eb8abe2c383da600516515e383fc8a29953bb6e6d167e9705b2","0x6fc411f24c7b4b8d821b45de32b9edc5ac998d1ac748a98abe8e983c6f39fc19"],"difficulty":"0x0","extraData":"0xd883010b02846765746888676f312e32302e31856c696e7578","gasLimit":"0x1c9c380","gasUsed":"0xa79638","logsBloom":"0xb034000008010014411408c080a0018440087220211154100005a1388807241142a2504080034a00111212a47f05008520200000280202a12800538cc06488486a0141989c7800c0c848011f02249661800e08449145b040a252d18082c009000641004052c80102000804ac10901c24032000980010438a01e50a90a0d8008c138c21204040000b20425000833041028000148124c2012d0aa8d1d0548301808228002015184090000224021040d68220100210220480420308455c382a40020130dc42502986080600000115034c0401c81828490410308005610048026b822e10b4228071ba00bdd20140621b2000c02012300808084181ac308200000011","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x31f0c0305fc07a93b1a33da339c79aadbe8d9811c78d2b514cd18d64e1328f25","nonce":"0x0000000000000000","parentHash":"0x2303b55af4add799b19275a491b150c1a03075395f87a7856a4e3327595ed7df","receiptsRoot":"0x99da71b17ae1929db912c3315ebe349d37f2bb600454616fdde0ee90d6dbc59e","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0xea6d","stateRoot":"0xd12bf4cf3941cf48be329a939b13d3403d326841c69cdcc9a9c13ab2f227e904","timestamp":"0x640fdeb0","totalDifficulty":"0xa4a470","transactionsRoot":"0x1ad3212eca045505cfc4cacf675b5fa2e7dc7b9f9cee88191464f97d1c9fbca4","uncles":[],"baseFeePerGas":"0x7ccf990f8"}
`},
{Name: "pre-Shanghai bad receipts root", OK: false, Data: `{"number":"0x840249","hash":"0x9ef7cd2241202b919a0e51240818a8666c73f7ce4b908931e3ae6d26d30f7663","transactions":["0x39c666d9b5cec429accad7b0f94f789ca2ebeb5294b8b129c1b76f552daf57d3","0x2ca7289ab3738d17e0f5093bd96c97c06c9a2ea4c22fc84a6a7fbfda93ce55ee","0xb0085de1476530de3efc6928c4683e7c40f8fac18875f74cbcc47df159de17d9","0xe01c8631c86ded63af95b8dbc0c8aac5d31254c14d6ecb4cc51d98259d838e52","0x69414a126a6f07ab5e31ad2f9069fb986b7c490e096898473873e41ece6af783","0xa2fef1133ee726533c7f190f246fede123e3706a03933c1febc92618f90d2804","0x6585ec5c4c2bbf1f683f90f58e18f3b38d875e94457fe4cbb7bc5bf6581f83af","0x1db276b864fbf01dcf8cededf8d597553ecb0eb9438edfaf2f5bd0cc93297c66","0xcbe7ed31654af4e191ca53445b82de040ae2cd92459a3f951bdcce423d780f08","0x808ba5211f03cc78a732ff0f9383c6355e63c83ae8c6035ced2ba6f7c331dc63","0xdd66f1f26672849ef54c420210f479c9f0c46924d8e9f7b210981ffe8d3fac82","0x254abb2f8cdcffe9ef62ab924312a1e4142578db87e4f7c199fd35991e92f014","0xa7b7c654e7073b8043b680b7ffc95d3f2099abaa0b0578d6f954a2a7c99404e1","0x7ccdfa698c8acf47ab9316ed078eb40819ff575bcf612c6f59f29e7726df3f96","0xa0b035ef315824a6f6a6565fa8de27042ade3af9cf0583a36dea83d6e01bf2a8","0x1ebad7f3e8cb3543d4963686a94d99f61839f666831eab9c9c1b4711de11d3d9","0x501750278e91d8b5be1ccf60e793d4bbcd9b3bb3ccc518d3634a71caeac65f48","0xd80ff8af29ae163d5811ba511e60b3a87a279f677bb3872a0f1aa6d0a226e880","0x096acab3b3fe47b149d375782d1eb00b9fef7904076d60c54b3c197b04e6bf82","0xbe9d1738af74a22400591a9a808fb01a25ab41e2e56f202dd7251eb113e8ceeb","0x0834c720e55cccd97aaf4f8fb0cb66afb9881fb6a762c0f70473ec53f98a712e","0x51a0c33c9b37245b416575bdd2751c0d8a5d8bead49585ac427bfc873d4016af","0x531c25d51ccda59aa9ea82e85c99be9dd4e285af9b8973cbab9ac4a38e26e55a","0x93ac6c08d21cb1b61ff59e5e2d6fa3f9ad54008b0a66c669199050bef219f6e3","0x3792db6dd6285f409e4281951e9f78dad16c4a78072ff1c909dfadea5658d857","0xd2d51764c01e8c0a43fbe362704388df5bacf7e5e620c3864e242530ffb3e828","0x516b0227d9e64eb6e0de6862764d40f5376b5f12fec878436fea3479b4c36bb8","0x81b0abc78b82840adb666775b182a9e292f663b64bcd35004c04436ed3c8281c","0xd0287570d431d2baea96ecc81cb890e7f4f06ab5df02f9b4067768abca19acb5","0x76ddab2674369f34946c5fa2f05e2aa8566d86235b83e808e9b27bc106e04ac7","0x34a5c74011a2c8a00103bc91bfbfd94aa99cd569be69066e4bf64d188fe8714e","0x7b9730ead1b9f59b206d0ddea87be9383ba3fc7b496c7863b0cb847889b86617","0x77166ee0409ba86bd26e7c03ad1a927abaf5af8a8a37149e725cd37512091dd6","0x3c2b6c2ae505c5c36d5f316c1fcb5f54f7346ed35ae35c93462991ded7968a68","0xf99a792837e13827b5e0a8915fb59c760babc95d242feca99a5594e64ff6b6e2","0x522313f5d923f048ae5bd0b5595c1f4fc883bc0b3cf3cb0939d3fcf8b08c829c","0x471ceb0e85af594aa56deca54cb8198567b2afd8406722ea530077aaa6b641b3","0x3e9dca502e9039ae0c6d642f62e9562ff00010c6bfbb8234a6135712ba70dfda","0xc95cac67267f4accb9b5950316ac64772f7d082bed6b712c09cf2da0bdc237b7","0xfca28fdbd13fc16daf7aec7d4a2ad2c6b5f0b2a7b0fb1d9167c09b5e115ff26e","0xc73124ca798b2f7a5df2ea4d568efab2f41b135130ea5cc41d4bcb4b5c57d5bd","0x29abb76b5e7a5ce137bf9c22474d386eb58d249f43178d2b2e15c16dfdc5ca80","0x03e5ab25a58bd44fb9dd0c698b323eab8b8363479dfcbcbb16d0a0bd983880ae","0x3c8ee80ddea7fa2d2b75e44563c10c10756f598e8ad252a49c5d3e8a5c8e6cbf","0xaffa73b68bc7ab0c3f5e28377f5ca0a5df33c0a485f64dc094b7f6ae23353203","0xc66c9c66fbc8fe97fcc16506cde7a58689af1004a18c6171cfe763bcd94f50b2","0x80fec96707519172b53790610d5800cd09a4243aca9bacfa956c56337d06f820","0x61b33bfcf11214906dcdce7d7ed83ad82f38184c03ded07f7782059d02eeedea","0x5d4138d4e28a8327e506cb012346b1b38b65f615a2b991d35cf5d4de244b3e6d","0x875a142b6dfcf10ffb71a7afe0ce4672c047fc7e162ba0383390516d6334d45d","0x79b6df832bfbd04085d0b005a6e3ad8f00fc8717eed59280aa8107268b71e7e0","0xcb2fb25d268f65dc9312e89bd3c328c9847a3c9da282026793c54a745f825ab5","0xe483d4a36ad19fd5eacb7f6d9ad3ce080ad70ac673273e710f6e3d5acbc6559c","0x0564242c37d5013b671ef4864394cc0f3924c589f8aad64118223a9af2f164f6","0x48db358e80b278c3a46c2a166339797060a40f33984a5d974992cd9722139d5d","0x69d7758db91fae31fa35ecbed4d40897c5087f45dc796cd796b8ceead21f972e","0x2951478916ecd27a8e808d08f85be4bf2c0b0e0546f21f4e309145dd96eb8df1","0xaca9028cb5d55bbf71b7bff9884a9a3b0b38a575ffc8f8807ce345cf8bd298ef","0xc7f625a19ee41a1750eac9428b4394a9a2476b8ea2d31b4c2f9f5b4fcb86cae3","0x45499074aa521ac4151138f0aad969bcc2dfc1648d22ff8c42e51c74cb77414d","0x00b5b05c6d1a2eb8abe2c383da600516515e383fc8a29953bb6e6d167e9705b2","0x6fc411f24c7b4b8d821b45de32b9edc5ac998d1ac748a98abe8e983c6f39fc19"],"difficulty":"0x0","extraData":"0xd883010b02846765746888676f312e32302e31856c696e7578","gasLimit":"0x1c9c380","gasUsed":"0xa79638","logsBloom":"0xb034000008010014411408c080a0018440087220211154100005a1388807241142a2504080034a00111212a47f05008520200000280202a12800538cc06488486a0141989c7800c0c848011f02249661800e08449145b040a252d18082c009000641004052c80102000804ac10901c24032000980010438a01e50a90a0d8008c138c21204040000b20425000833041028000148124c2012d0aa8d1d0548301808228002015184090000224021040d68220100210220480420308455c382a40020130dc42502986080600000115034c0401c81828490410308005610048026b822e10b4228071ba00bdd20140621b2000c02012300808084181ac308200000011","miner":"0x0000000000000000000000000000000000000000","mixHash":"0x31f0c0305fc07a93b1a33da339c79aadbe8d9811c78d2b514cd18d64e1328f25","nonce":"0x0000000000000000","parentHash":"0x2303b55af4add799b19275a491b150c1a03075395f87a7856a4e3327595ed7df","receiptsRoot":"0x99da71b17ae1929db912c3315ebe349d37f2bb600454616fdde0ee90d6dbc59f","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0xea6d","stateRoot":"0xd12bf4cf3941cf48be329a939b13d3403d326841c69cdcc9a9c13ab2f227e904","timestamp":"0x640fdeb0","totalDifficulty":"0xa4a470","transactionsRoot":"0x1ad3212eca045505cfc4cacf675b5fa2e7dc7b9f9cee88191464f97d1c9fbca4","uncles":[],"baseFeePerGas":"0x7ccf990f8"}
`},
{Name: "Shanghai good tx", OK: true, Data: `{"baseFeePerGas":"0x3fb7c357","difficulty":"0x0","extraData":"0x","gasLimit":"0x1c9c380","gasUsed":"0x18f759","hash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","logsBloom":"0x020010404000001a0000021000000080001100410000100001000010040200980220400000008806200200000100000000000000000000008000000400042000000050000040000112080808800002044000040004042008800480002000000000000002020020000042002400000820000080040000000010200010020010100101212050000008000000008000001010200c80000112010000438040020400000000202400000000002002a0210402000622010000000001700144000040000000002204000000c000410105024010000808000000002004002000000261000000822200200800881000000012500400400000000000000040010000800000","miner":"0x000095e79eac4d76aab57cb2c1f091d553b36ca0","mixHash":"0x5b53dc49cbab268ef9950b1d81b5e36a1b2f1b97aee1b7ff6e4db0e06c29a8b0","nonce":"0x0000000000000000","number":"0x84161e","parentHash":"0x72d92c1498e05952988d4e79a695928a6bcbd37239f8a1734051263b4d3504b8","receiptsRoot":"0xaff90ae18dcc35924a4bddb68d403b8b7812c10c3ea2a114f34105c87d75bcdb","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2a51","stateRoot":"0xc56738518b2c7854a640ae25996d2211c9ef0dd2e4dd9e59e9d9cacef39622da","timestamp":"0x64110a5c","totalDifficulty":"0xa4a470","transactions":["0x1e8f148a9aea7d8d16ea6e9446723b8f262e8bcd89c7c961d52046ebd43b4598","0xab5c870f4c367012bd763172afbfbe68fbf35336a66ae41aff3f2c9dbf4ea3f8","0xa81fd92b2d0f0bbd3cc355f869cca3243c98c5e2641db9ecf3eeabb3b13bff6a","0xa92c7b720c08c83f1a0ed7e4c163200e30a3a8c03fcc5a51e685ea20cd0cb577","0x6921b429ad2ec1e97d3457049ad2e893b5a0349beba47ca1c74a9540af75347a","0xf776b2da0b835dde05d0d8b76fd19385d61e7055036cf637f804b36dc94f2384","0x9a08d899cd14ebb930ed59fa774afdb88a22615b3a931e930931ea54d26dc0bc","0x0fe0d97e25d5eb11a33a3e8278584c3780941fc2675bdf8fc547cee3d1fd3b17","0xef47a60f57f177a683c723c658137efab66d311e1c5abbc4d74f653535144d03","0xe23a5b35faae5335adc5aca38c5d633b00438b798c2053104b8df48406c9b141","0xd8cea4ba619b317bc05d58534af73beec6c2548b31b24d4dc61c9bbd29cfa17a","0x79a4b9d90b02c768baaad305f266281213cc75062cbe99a13222cc0c4b509498","0x6790a3bbddbeb21fcb736a59b3775755051c3a6344d8390cf8ca27f2e8a814f0","0x87ec7ace5442db252b5751ffddd38dcb04b088d36b6b0e526ff25607a4293c81","0x40cb487ecffda94f97ce7fc0f7163f2f024235df2c8291169edc80dac063e6d0","0xb76bb3d88c9b30d927c45ccfcf8d5b0054411ac8501ad588822a7d04690cccf6","0x798ebe823209869347c08bd81e04fbf60e9bdfe44b1cc923215182d0cf3d4edb","0xbe68a7e02725f799a65ebb069ccc83a014ac7c40e4119bf7c220a2f6ddfee295","0xc90c3a72efe81331727fcce4b5bd4906066da314ca9a0b44023a6b09ea7e8114","0x619a6cbd43cde074d314c19623bd66d9fb1e13c158d7138775236f798dc1245e","0xca5a56cd77b9e5b0e79020cc6346edf205bc11e901984d805125f28c2e6686e6","0x999c9ddeed67c6ef6fbf02a6e977a6c1b68e18d24814e51643c7157b87a43e0a","0x47c8f5d0b3778e4c34eba7fcc356fa04a5afd954ccf484728e72c002764dd3c4","0x396797ae0ebcdb72ff1f96fd08b6128f78acc7417353f142f1a5facd425a33e6","0x454aa43d6546a6f62246826c16b7a49c6c704238c18802ef0d659922f23a573c","0x317ecb5bd19caa42a69f836d41556ebb0e0e00e1c6cd2dee230e6e6192612527","0xc879285db5ef0a6bce98021584d16f134c1dc0aed8cc988802c4f72ba6877ff6","0xecaa2d6f597608307e5084854854ba6dc1e69395e2abea14f2c6a2fa1d6faf9a","0x4dd69b69a568ff30ae439e2ded72fbd7f2e7aaa345836703663f155c749c5eed"],"transactionsRoot":"0x4a87d0cf5990b1c5bac631583e5965c2ba943858bebb2e07f74d0b697f73821a","uncles":[],"withdrawals":[{"index":"0x1170","validatorIndex":"0x38c2c","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x66edfd65"},{"index":"0x1171","validatorIndex":"0x38c2d","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6cd228e4"},{"index":"0x1172","validatorIndex":"0x38c2e","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x77f3431b"},{"index":"0x1173","validatorIndex":"0x38c2f","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6b61f268"},{"index":"0x1174","validatorIndex":"0x38c30","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6e10bb21"},{"index":"0x1175","validatorIndex":"0x38c31","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6eb115a5"},{"index":"0x1176","validatorIndex":"0x38c32","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7caead1d"},{"index":"0x1177","validatorIndex":"0x38c33","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x772c0ddf"},{"index":"0x1178","validatorIndex":"0x38c34","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x75930a95"},{"index":"0x1179","validatorIndex":"0x38c35","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76a4db09"},{"index":"0x117a","validatorIndex":"0x38c36","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7e692b27"},{"index":"0x117b","validatorIndex":"0x38c37","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x72038ae6"},{"index":"0x117c","validatorIndex":"0x38c38","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6ccce352"},{"index":"0x117d","validatorIndex":"0x38c39","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x79ef6898"},{"index":"0x117e","validatorIndex":"0x38c3a","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6d58977d"},{"index":"0x117f","validatorIndex":"0x38c3b","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76f7d208"}],"withdrawalsRoot":"0xbe712c930a0665264b025ced87cc7839eef95a3cbc26dadc93e9e185a350ad28"}
`},
{Name: "Shanghai bad withdrawals root", OK: false, Data: `{"baseFeePerGas":"0x3fb7c357","difficulty":"0x0","extraData":"0x","gasLimit":"0x1c9c380","gasUsed":"0x18f759","hash":"0xa16c6bcda4fdca88b5761965c4d724f7afc6a6900d9051a204e544870adb3452","logsBloom":"0x020010404000001a0000021000000080001100410000100001000010040200980220400000008806200200000100000000000000000000008000000400042000000050000040000112080808800002044000040004042008800480002000000000000002020020000042002400000820000080040000000010200010020010100101212050000008000000008000001010200c80000112010000438040020400000000202400000000002002a0210402000622010000000001700144000040000000002204000000c000410105024010000808000000002004002000000261000000822200200800881000000012500400400000000000000040010000800000","miner":"0x000095e79eac4d76aab57cb2c1f091d553b36ca0","mixHash":"0x5b53dc49cbab268ef9950b1d81b5e36a1b2f1b97aee1b7ff6e4db0e06c29a8b0","nonce":"0x0000000000000000","number":"0x84161e","parentHash":"0x72d92c1498e05952988d4e79a695928a6bcbd37239f8a1734051263b4d3504b8","receiptsRoot":"0xaff90ae18dcc35924a4bddb68d403b8b7812c10c3ea2a114f34105c87d75bcdb","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x2a51","stateRoot":"0xc56738518b2c7854a640ae25996d2211c9ef0dd2e4dd9e59e9d9cacef39622da","timestamp":"0x64110a5c","totalDifficulty":"0xa4a470","transactions":["0x1e8f148a9aea7d8d16ea6e9446723b8f262e8bcd89c7c961d52046ebd43b4598","0xab5c870f4c367012bd763172afbfbe68fbf35336a66ae41aff3f2c9dbf4ea3f8","0xa81fd92b2d0f0bbd3cc355f869cca3243c98c5e2641db9ecf3eeabb3b13bff6a","0xa92c7b720c08c83f1a0ed7e4c163200e30a3a8c03fcc5a51e685ea20cd0cb577","0x6921b429ad2ec1e97d3457049ad2e893b5a0349beba47ca1c74a9540af75347a","0xf776b2da0b835dde05d0d8b76fd19385d61e7055036cf637f804b36dc94f2384","0x9a08d899cd14ebb930ed59fa774afdb88a22615b3a931e930931ea54d26dc0bc","0x0fe0d97e25d5eb11a33a3e8278584c3780941fc2675bdf8fc547cee3d1fd3b17","0xef47a60f57f177a683c723c658137efab66d311e1c5abbc4d74f653535144d03","0xe23a5b35faae5335adc5aca38c5d633b00438b798c2053104b8df48406c9b141","0xd8cea4ba619b317bc05d58534af73beec6c2548b31b24d4dc61c9bbd29cfa17a","0x79a4b9d90b02c768baaad305f266281213cc75062cbe99a13222cc0c4b509498","0x6790a3bbddbeb21fcb736a59b3775755051c3a6344d8390cf8ca27f2e8a814f0","0x87ec7ace5442db252b5751ffddd38dcb04b088d36b6b0e526ff25607a4293c81","0x40cb487ecffda94f97ce7fc0f7163f2f024235df2c8291169edc80dac063e6d0","0xb76bb3d88c9b30d927c45ccfcf8d5b0054411ac8501ad588822a7d04690cccf6","0x798ebe823209869347c08bd81e04fbf60e9bdfe44b1cc923215182d0cf3d4edb","0xbe68a7e02725f799a65ebb069ccc83a014ac7c40e4119bf7c220a2f6ddfee295","0xc90c3a72efe81331727fcce4b5bd4906066da314ca9a0b44023a6b09ea7e8114","0x619a6cbd43cde074d314c19623bd66d9fb1e13c158d7138775236f798dc1245e","0xca5a56cd77b9e5b0e79020cc6346edf205bc11e901984d805125f28c2e6686e6","0x999c9ddeed67c6ef6fbf02a6e977a6c1b68e18d24814e51643c7157b87a43e0a","0x47c8f5d0b3778e4c34eba7fcc356fa04a5afd954ccf484728e72c002764dd3c4","0x396797ae0ebcdb72ff1f96fd08b6128f78acc7417353f142f1a5facd425a33e6","0x454aa43d6546a6f62246826c16b7a49c6c704238c18802ef0d659922f23a573c","0x317ecb5bd19caa42a69f836d41556ebb0e0e00e1c6cd2dee230e6e6192612527","0xc879285db5ef0a6bce98021584d16f134c1dc0aed8cc988802c4f72ba6877ff6","0xecaa2d6f597608307e5084854854ba6dc1e69395e2abea14f2c6a2fa1d6faf9a","0x4dd69b69a568ff30ae439e2ded72fbd7f2e7aaa345836703663f155c749c5eed"],"transactionsRoot":"0x4a87d0cf5990b1c5bac631583e5965c2ba943858bebb2e07f74d0b697f73821a","uncles":[],"withdrawals":[{"index":"0x1170","validatorIndex":"0x38c2c","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x66edfd65"},{"index":"0x1171","validatorIndex":"0x38c2d","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6cd228e4"},{"index":"0x1172","validatorIndex":"0x38c2e","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x77f3431b"},{"index":"0x1173","validatorIndex":"0x38c2f","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6b61f268"},{"index":"0x1174","validatorIndex":"0x38c30","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6e10bb21"},{"index":"0x1175","validatorIndex":"0x38c31","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6eb115a5"},{"index":"0x1176","validatorIndex":"0x38c32","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7caead1d"},{"index":"0x1177","validatorIndex":"0x38c33","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x772c0ddf"},{"index":"0x1178","validatorIndex":"0x38c34","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x75930a95"},{"index":"0x1179","validatorIndex":"0x38c35","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76a4db09"},{"index":"0x117a","validatorIndex":"0x38c36","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x7e692b27"},{"index":"0x117b","validatorIndex":"0x38c37","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x72038ae6"},{"index":"0x117c","validatorIndex":"0x38c38","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6ccce352"},{"index":"0x117d","validatorIndex":"0x38c39","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x79ef6898"},{"index":"0x117e","validatorIndex":"0x38c3a","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x6d58977d"},{"index":"0x117f","validatorIndex":"0x38c3b","address":"0x8f0844fd51e31ff6bf5babe21dccf7328e19fd9f","amount":"0x76f7d208"}],"withdrawalsRoot":"0xbe712c930a0665264b025ced87cc7839eef95a3cbc26dadc93e9e185a350ad27"}
`},
//go:embed testdata
var blocksTestdata embed.FS
type testMetadata struct {
Name string `json:"name"`
Fail bool `json:"fail,omitempty"`
}
func readJsonTestdata(t *testing.T, name string, dest any) {
f, err := blocksTestdata.Open(name)
require.NoError(t, err, "must open %q", name)
require.NoError(t, json.NewDecoder(f).Decode(dest), "must json-decode %q", name)
require.NoError(t, f.Close(), "must close %q", name)
}
func TestBlockHeaderJSON(t *testing.T) {
headersDir, err := blocksTestdata.ReadDir("testdata/data/headers")
require.NoError(t, err)
for _, entry := range headersDir {
if !strings.HasSuffix(entry.Name(), "_metadata.json") {
continue
}
var metadata testMetadata
readJsonTestdata(t, "testdata/data/headers/"+entry.Name(), &metadata)
t.Run(metadata.Name, func(t *testing.T) {
var header rpcHeader
readJsonTestdata(t, "testdata/data/headers/"+strings.Replace(entry.Name(), "_metadata.json", "_data.json", 1), &header)
h := header.computeBlockHash()
if metadata.Fail {
require.NotEqual(t, h, header.Hash, "expecting verification error")
} else {
require.Equal(t, h, header.Hash, "blockhash should verify ok")
}
})
}
for _, testCase := range testCases {
var x rpcHeader
require.NoError(t, json.Unmarshal([]byte(testCase.Data), &x))
h := x.computeBlockHash()
if testCase.OK {
require.Equal(t, h, x.Hash, "blockhash should verify ok")
} else {
require.NotEqual(t, h, x.Hash, "expecting verification error")
}
func TestBlockJSON(t *testing.T) {
blocksDir, err := blocksTestdata.ReadDir("testdata/data/blocks")
require.NoError(t, err)
for _, entry := range blocksDir {
if !strings.HasSuffix(entry.Name(), "_metadata.json") {
continue
}
var metadata testMetadata
readJsonTestdata(t, "testdata/data/blocks/"+entry.Name(), &metadata)
t.Run(metadata.Name, func(t *testing.T) {
var block rpcBlock
readJsonTestdata(t, "testdata/data/blocks/"+strings.Replace(entry.Name(), "_metadata.json", "_data.json", 1), &block)
err := block.verify()
if metadata.Fail {
require.NotNil(t, err, "expecting verification error")
} else {
require.NoError(t, err, "verification should pass")
}
})
}
}
......@@ -238,23 +238,15 @@ func (m *SimpleTxManager) craftTx(ctx context.Context, candidate TxCandidate) (*
rawTx.Gas = gas
}
// Avoid bumping the nonce if the gas estimation fails.
nonce, err := m.nextNonce(ctx)
if err != nil {
return nil, err
}
rawTx.Nonce = nonce
ctx, cancel := context.WithTimeout(ctx, m.cfg.NetworkTimeout)
defer cancel()
return m.cfg.Signer(ctx, m.cfg.From, types.NewTx(rawTx))
return m.signWithNextNonce(ctx, rawTx)
}
// nextNonce returns a nonce to use for the next transaction. It uses
// eth_getTransactionCount with "latest" once, and then subsequent calls simply
// increment this number. If the transaction manager is reset, it will query the
// eth_getTransactionCount nonce again.
func (m *SimpleTxManager) nextNonce(ctx context.Context) (uint64, error) {
// signWithNextNonce returns a signed transaction with the next available nonce.
// The nonce is fetched once using eth_getTransactionCount with "latest", and
// then subsequent calls simply increment this number. If the transaction manager
// is reset, it will query the eth_getTransactionCount nonce again. If signing
// fails, the nonce is not incremented.
func (m *SimpleTxManager) signWithNextNonce(ctx context.Context, rawTx *types.DynamicFeeTx) (*types.Transaction, error) {
m.nonceLock.Lock()
defer m.nonceLock.Unlock()
......@@ -265,15 +257,25 @@ func (m *SimpleTxManager) nextNonce(ctx context.Context) (uint64, error) {
nonce, err := m.backend.NonceAt(childCtx, m.cfg.From, nil)
if err != nil {
m.metr.RPCError()
return 0, fmt.Errorf("failed to get nonce: %w", err)
return nil, fmt.Errorf("failed to get nonce: %w", err)
}
m.nonce = &nonce
} else {
*m.nonce++
}
m.metr.RecordNonce(*m.nonce)
return *m.nonce, nil
rawTx.Nonce = *m.nonce
ctx, cancel := context.WithTimeout(ctx, m.cfg.NetworkTimeout)
defer cancel()
tx, err := m.cfg.Signer(ctx, m.cfg.From, types.NewTx(rawTx))
if err != nil {
// decrement the nonce, so we can retry signing with the same nonce next time
// signWithNextNonce is called
*m.nonce--
} else {
m.metr.RecordNonce(*m.nonce)
}
return tx, err
}
// resetNonce resets the internal nonce tracking. This is called if any pending send
......
......@@ -450,6 +450,40 @@ func TestTxMgr_EstimateGasFails(t *testing.T) {
require.Equal(t, lastNonce+1, tx.Nonce())
}
func TestTxMgr_SigningFails(t *testing.T) {
t.Parallel()
errorSigning := false
cfg := configWithNumConfs(1)
cfg.Signer = func(ctx context.Context, from common.Address, tx *types.Transaction) (*types.Transaction, error) {
if errorSigning {
return nil, fmt.Errorf("signer error")
} else {
return tx, nil
}
}
h := newTestHarnessWithConfig(t, cfg)
candidate := h.createTxCandidate()
// Set the gas limit to zero to trigger gas estimation.
candidate.GasLimit = 0
// Craft a successful transaction.
tx, err := h.mgr.craftTx(context.Background(), candidate)
require.Nil(t, err)
lastNonce := tx.Nonce()
// Mock signer failure.
errorSigning = true
_, err = h.mgr.craftTx(context.Background(), candidate)
require.ErrorContains(t, err, "signer error")
// Ensure successful craft uses the correct nonce
errorSigning = false
tx, err = h.mgr.craftTx(context.Background(), candidate)
require.Nil(t, err)
require.Equal(t, lastNonce+1, tx.Nonce())
}
// TestTxMgrOnlyOnePublicationSucceeds asserts that the tx manager will return a
// receipt so long as at least one of the publications is able to succeed with a
// simulated rpc failure.
......
package op_service
func FormatVersion(version string, gitCommit string, gitDate string, meta string) string {
v := version
if gitCommit != "" {
if len(gitCommit) >= 8 {
v += "-" + gitCommit[:8]
} else {
v += "-" + gitCommit
}
}
if gitDate != "" {
v += "-" + gitDate
}
if meta != "" {
v += "-" + meta
}
return v
}
package op_service
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestFormatVersion(t *testing.T) {
tests := []struct {
version string
gitCommit string
gitDate string
meta string
expected string
}{
{
version: "v1.0.0",
gitCommit: "c90a760cfaccefb60b942ffe4ccf4f9692587cec",
gitDate: "1698107786",
meta: "",
expected: "v1.0.0-c90a760c-1698107786",
},
{
version: "v1.0.0",
gitCommit: "dev",
gitDate: "1698107786",
meta: "",
expected: "v1.0.0-dev-1698107786",
},
{
version: "v1.0.0",
gitCommit: "",
gitDate: "1698107786",
meta: "",
expected: "v1.0.0-1698107786",
},
{
version: "v1.0.0",
gitCommit: "dev",
gitDate: "",
meta: "",
expected: "v1.0.0-dev",
},
{
version: "v1.0.0",
gitCommit: "",
gitDate: "",
meta: "rc.1",
expected: "v1.0.0-rc.1",
},
{
version: "v1.0.0",
gitCommit: "",
gitDate: "",
meta: "",
expected: "v1.0.0",
},
{
version: "v1.0.0",
gitCommit: "c90a760cfaccefb60b942ffe4ccf4f9692587cec",
gitDate: "1698107786",
meta: "beta",
expected: "v1.0.0-c90a760c-1698107786-beta",
},
}
for _, test := range tests {
test := test
t.Run(test.expected, func(t *testing.T) {
actual := FormatVersion(test.version, test.gitCommit, test.gitDate, test.meta)
require.Equal(t, test.expected, actual)
})
}
}
......@@ -2,9 +2,9 @@ package main
import (
"errors"
"fmt"
"os"
opservice "github.com/ethereum-optimism/optimism/op-service"
"github.com/urfave/cli/v2"
"github.com/ethereum/go-ethereum/log"
......@@ -21,7 +21,7 @@ var (
func main() {
app := cli.NewApp()
app.Version = fmt.Sprintf("%s-%s-%s", Version, GitCommit, GitDate)
app.Version = opservice.FormatVersion(Version, GitCommit, GitDate, "")
app.Name = "op-wheel"
app.Usage = "Optimism Wheel is a CLI tool for the execution engine"
app.Description = "Optimism Wheel is a CLI tool to direct the engine one way or the other with DB cheats and Engine API routines."
......
......@@ -11,6 +11,7 @@ import semver
# Minimum version numbers for packages migrating from legacy versioning.
MIN_VERSIONS = {
'ci-builder': '0.6.0',
'chain-mon': '0.2.2',
'indexer': '0.5.0',
'op-node': '0.10.14',
'op-batcher': '0.10.14',
......
......@@ -46,7 +46,7 @@
"express-prom-bundle": "^6.6.0",
"lodash": "^4.17.21",
"morgan": "^1.10.0",
"pino": "^8.16.0",
"pino": "^8.16.1",
"pino-multi-stream": "^6.0.0",
"pino-sentry": "^0.14.0",
"prom-client": "^14.2.0"
......
......@@ -46,7 +46,7 @@
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^6.7.5",
"@typescript-eslint/parser": "^6.8.0",
"@typescript-eslint/parser": "^6.9.0",
"tsx": "^3.14.0",
"typescript": "^5.2.2"
}
......
......@@ -53,7 +53,7 @@
"@types/glob": "^8.1.0",
"@vitest/coverage-istanbul": "^0.34.6",
"@wagmi/cli": "^1.5.2",
"@wagmi/core": "^1.4.4",
"@wagmi/core": "^1.4.5",
"abitype": "^0.10.1",
"glob": "^10.3.10",
"isomorphic-fetch": "^3.0.0",
......
......@@ -33,7 +33,7 @@
},
"devDependencies": {
"@eth-optimism/contracts-ts": "workspace:^",
"@swc/core": "^1.3.92",
"@swc/core": "^1.3.94",
"@vitest/coverage-istanbul": "^0.34.6",
"tsup": "^7.2.0",
"typescript": "^5.2.2",
......
......@@ -35,10 +35,10 @@ importers:
version: 20.8.6
'@typescript-eslint/eslint-plugin':
specifier: ^6.7.5
version: 6.7.5(@typescript-eslint/parser@6.8.0)(eslint@8.51.0)(typescript@5.2.2)
version: 6.7.5(@typescript-eslint/parser@6.9.0)(eslint@8.51.0)(typescript@5.2.2)
'@typescript-eslint/parser':
specifier: ^6.8.0
version: 6.8.0(eslint@8.51.0)(typescript@5.2.2)
specifier: ^6.9.0
version: 6.9.0(eslint@8.51.0)(typescript@5.2.2)
chai:
specifier: ^4.3.10
version: 4.3.10
......@@ -56,10 +56,10 @@ importers:
version: 8.3.0(eslint@8.51.0)
eslint-config-standard:
specifier: ^16.0.3
version: 16.0.3(eslint-plugin-import@2.28.1)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@5.2.0)(eslint@8.51.0)
version: 16.0.3(eslint-plugin-import@2.29.0)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@5.2.0)(eslint@8.51.0)
eslint-plugin-import:
specifier: ^2.26.0
version: 2.28.1(@typescript-eslint/parser@6.8.0)(eslint@8.51.0)
specifier: ^2.29.0
version: 2.29.0(@typescript-eslint/parser@6.9.0)(eslint@8.51.0)
eslint-plugin-jsdoc:
specifier: ^35.1.2
version: 35.5.1(eslint@8.51.0)
......@@ -130,7 +130,7 @@ importers:
devDependencies:
tsup:
specifier: ^7.2.0
version: 7.2.0(@swc/core@1.3.92)(typescript@5.2.2)
version: 7.2.0(@swc/core@1.3.94)(typescript@5.2.2)
vitest:
specifier: ^0.34.4
version: 0.34.4
......@@ -228,8 +228,8 @@ importers:
specifier: ^1.10.0
version: 1.10.0
pino:
specifier: ^8.16.0
version: 8.16.0
specifier: ^8.16.1
version: 8.16.1
pino-multi-stream:
specifier: ^6.0.0
version: 6.0.0
......@@ -269,10 +269,10 @@ importers:
devDependencies:
'@typescript-eslint/eslint-plugin':
specifier: ^6.7.5
version: 6.7.5(@typescript-eslint/parser@6.8.0)(eslint@8.51.0)(typescript@5.2.2)
version: 6.7.5(@typescript-eslint/parser@6.9.0)(eslint@8.51.0)(typescript@5.2.2)
'@typescript-eslint/parser':
specifier: ^6.8.0
version: 6.8.0(eslint@8.51.0)(typescript@5.2.2)
specifier: ^6.9.0
version: 6.9.0(eslint@8.51.0)(typescript@5.2.2)
tsx:
specifier: ^3.14.0
version: 3.14.0
......@@ -321,10 +321,10 @@ importers:
version: 0.34.6(vitest@0.34.2)
'@wagmi/cli':
specifier: ^1.5.2
version: 1.5.2(@wagmi/core@1.4.4)(typescript@5.2.2)(wagmi@1.0.1)
version: 1.5.2(@wagmi/core@1.4.5)(typescript@5.2.2)(wagmi@1.0.1)
'@wagmi/core':
specifier: ^1.4.4
version: 1.4.4(react@18.2.0)(typescript@5.2.2)(viem@1.16.6)
specifier: ^1.4.5
version: 1.4.5(react@18.2.0)(typescript@5.2.2)(viem@1.16.6)
abitype:
specifier: ^0.10.1
version: 0.10.1(typescript@5.2.2)
......@@ -342,7 +342,7 @@ importers:
version: 22.1.0
tsup:
specifier: ^7.2.0
version: 7.2.0(@swc/core@1.3.92)(typescript@5.2.2)
version: 7.2.0(@swc/core@1.3.94)(typescript@5.2.2)
typescript:
specifier: ^5.2.2
version: 5.2.2
......@@ -433,7 +433,7 @@ importers:
version: 22.1.0
tsup:
specifier: ^7.2.0
version: 7.2.0(@swc/core@1.3.92)(typescript@5.2.2)
version: 7.2.0(@swc/core@1.3.94)(typescript@5.2.2)
typescript:
specifier: ^5.2.2
version: 5.2.2
......@@ -557,14 +557,14 @@ importers:
specifier: workspace:^
version: link:../contracts-ts
'@swc/core':
specifier: ^1.3.92
version: 1.3.92
specifier: ^1.3.94
version: 1.3.94
'@vitest/coverage-istanbul':
specifier: ^0.34.6
version: 0.34.6(vitest@0.34.1)
tsup:
specifier: ^7.2.0
version: 7.2.0(@swc/core@1.3.92)(typescript@5.2.2)
version: 7.2.0(@swc/core@1.3.94)(typescript@5.2.2)
typescript:
specifier: ^5.2.2
version: 5.2.2
......@@ -3550,8 +3550,8 @@ packages:
'@stablelib/random': 1.0.2
'@stablelib/wipe': 1.0.1
/@swc/core-darwin-arm64@1.3.92:
resolution: {integrity: sha512-v7PqZUBtIF6Q5Cp48gqUiG8zQQnEICpnfNdoiY3xjQAglCGIQCjJIDjreZBoeZQZspB27lQN4eZ43CX18+2SnA==}
/@swc/core-darwin-arm64@1.3.94:
resolution: {integrity: sha512-KNuE6opIy/wAXiGUWLhGWhCG3wA/AdjG6eYkv6dstrAURLaQMAoD8vDfVm8pxS8FA8Kx+0Z4QiDNPqk5aKIsqg==}
engines: {node: '>=10'}
cpu: [arm64]
os: [darwin]
......@@ -3559,8 +3559,8 @@ packages:
dev: true
optional: true
/@swc/core-darwin-x64@1.3.92:
resolution: {integrity: sha512-Q3XIgQfXyxxxms3bPN+xGgvwk0TtG9l89IomApu+yTKzaIIlf051mS+lGngjnh9L0aUiCp6ICyjDLtutWP54fw==}
/@swc/core-darwin-x64@1.3.94:
resolution: {integrity: sha512-HypemhyehQrLqXwfJv5ronD4BMAXdgMCP4Ei7rt3B6Ftmt9axwGvdwGiXxsYR9h1ncyxoVxN+coGxbNIhKhahw==}
engines: {node: '>=10'}
cpu: [x64]
os: [darwin]
......@@ -3568,8 +3568,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-arm-gnueabihf@1.3.92:
resolution: {integrity: sha512-tnOCoCpNVXC+0FCfG84PBZJyLlz0Vfj9MQhyhCvlJz9hQmvpf8nTdKH7RHrOn8VfxtUBLdVi80dXgIFgbvl7qA==}
/@swc/core-linux-arm-gnueabihf@1.3.94:
resolution: {integrity: sha512-KzKN54c7Y6X1db+bBVSXG4+bXmAPvXtDWk+TgwNJH4yYliOrnP/RKkHA5QZ9VFSnqJF06/sAO4kYBiL/aVQDBQ==}
engines: {node: '>=10'}
cpu: [arm]
os: [linux]
......@@ -3577,8 +3577,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-arm64-gnu@1.3.92:
resolution: {integrity: sha512-lFfGhX32w8h1j74Iyz0Wv7JByXIwX11OE9UxG+oT7lG0RyXkF4zKyxP8EoxfLrDXse4Oop434p95e3UNC3IfCw==}
/@swc/core-linux-arm64-gnu@1.3.94:
resolution: {integrity: sha512-iAcR8Ho0Uck/SLSrgYfXkpcGOXuN5waMZO7GlL/52QODr7GJtOfZ0H1MCZLbIFkPJp/iXoJpYgym4d/qSd477Q==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
......@@ -3586,8 +3586,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-arm64-musl@1.3.92:
resolution: {integrity: sha512-rOZtRcLj57MSAbiecMsqjzBcZDuaCZ8F6l6JDwGkQ7u1NYR57cqF0QDyU7RKS1Jq27Z/Vg21z5cwqoH5fLN+Sg==}
/@swc/core-linux-arm64-musl@1.3.94:
resolution: {integrity: sha512-VCHL1Mb9ENHx+sAeubSSg481MUeP9/PYzPPy9tfswunj/w35M+vEWflwK2dzQL9kUTFD3zcFTpAgsKnj6aX24w==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
......@@ -3595,8 +3595,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-x64-gnu@1.3.92:
resolution: {integrity: sha512-qptoMGnBL6v89x/Qpn+l1TH1Y0ed+v0qhNfAEVzZvCvzEMTFXphhlhYbDdpxbzRmCjH6GOGq7Y+xrWt9T1/ARg==}
/@swc/core-linux-x64-gnu@1.3.94:
resolution: {integrity: sha512-gjq7U6clhJi0Oel2a4gwR4MbSu+THQ2hmBNVCOSA3JjPZWZTkJXaJDpnh/r7PJxKBwUDlo0VPlwiwjepAQR2Rw==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
......@@ -3604,8 +3604,8 @@ packages:
dev: true
optional: true
/@swc/core-linux-x64-musl@1.3.92:
resolution: {integrity: sha512-g2KrJ43bZkCZHH4zsIV5ErojuV1OIpUHaEyW1gf7JWKaFBpWYVyubzFPvPkjcxHGLbMsEzO7w/NVfxtGMlFH/Q==}
/@swc/core-linux-x64-musl@1.3.94:
resolution: {integrity: sha512-rSylruWyeol2ujZDHmwiovupMR5ukMXivlA7DDxmQ1dFUV9HuiPknQrU5rEbI3V2V3V5RkpbEKjnADen7AeMPQ==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
......@@ -3613,8 +3613,8 @@ packages:
dev: true
optional: true
/@swc/core-win32-arm64-msvc@1.3.92:
resolution: {integrity: sha512-3MCRGPAYDoQ8Yyd3WsCMc8eFSyKXY5kQLyg/R5zEqA0uthomo0m0F5/fxAJMZGaSdYkU1DgF73ctOWOf+Z/EzQ==}
/@swc/core-win32-arm64-msvc@1.3.94:
resolution: {integrity: sha512-OenDUr5MQkz506ebVQq6ezoZ3GZ26nchgf5mPnwab4gx2TEiyR9zn7MdX5LWskTmOK3+FszPbGK0B5oLK6Y5yw==}
engines: {node: '>=10'}
cpu: [arm64]
os: [win32]
......@@ -3622,8 +3622,8 @@ packages:
dev: true
optional: true
/@swc/core-win32-ia32-msvc@1.3.92:
resolution: {integrity: sha512-zqTBKQhgfWm73SVGS8FKhFYDovyRl1f5dTX1IwSKynO0qHkRCqJwauFJv/yevkpJWsI2pFh03xsRs9HncTQKSA==}
/@swc/core-win32-ia32-msvc@1.3.94:
resolution: {integrity: sha512-mi6NcmtJKnaiHAxLtVz+WzunscsEwPdA0j15DuiYVx06Xo+MdRLJj4eVBgVLwGD1AI3IqKs4MVVx2cD7n0h5mg==}
engines: {node: '>=10'}
cpu: [ia32]
os: [win32]
......@@ -3631,8 +3631,8 @@ packages:
dev: true
optional: true
/@swc/core-win32-x64-msvc@1.3.92:
resolution: {integrity: sha512-41bE66ddr9o/Fi1FBh0sHdaKdENPTuDpv1IFHxSg0dJyM/jX8LbkjnpdInYXHBxhcLVAPraVRrNsC4SaoPw2Pg==}
/@swc/core-win32-x64-msvc@1.3.94:
resolution: {integrity: sha512-Ba0ZLcGMnqPWWF9Xa+rWhhnkpvE7XoQegMP/VCF2JIHb2ieGBC8jChO6nKRFKZjib/3wghGzxakyDQx3LDhDug==}
engines: {node: '>=10'}
cpu: [x64]
os: [win32]
......@@ -3640,8 +3640,8 @@ packages:
dev: true
optional: true
/@swc/core@1.3.92:
resolution: {integrity: sha512-vx0vUrf4YTEw59njOJ46Ha5i0cZTMYdRHQ7KXU29efN1MxcmJH2RajWLPlvQarOP1ab9iv9cApD7SMchDyx2vA==}
/@swc/core@1.3.94:
resolution: {integrity: sha512-jTHn8UJOGgERKZLy8euEixVAzC/w/rUSuMlM3e7hxgap/TC595hSkuQwtkpL238dsuEPveD44GMy2A5UBtSvjg==}
engines: {node: '>=10'}
requiresBuild: true
peerDependencies:
......@@ -3653,16 +3653,16 @@ packages:
'@swc/counter': 0.1.1
'@swc/types': 0.1.5
optionalDependencies:
'@swc/core-darwin-arm64': 1.3.92
'@swc/core-darwin-x64': 1.3.92
'@swc/core-linux-arm-gnueabihf': 1.3.92
'@swc/core-linux-arm64-gnu': 1.3.92
'@swc/core-linux-arm64-musl': 1.3.92
'@swc/core-linux-x64-gnu': 1.3.92
'@swc/core-linux-x64-musl': 1.3.92
'@swc/core-win32-arm64-msvc': 1.3.92
'@swc/core-win32-ia32-msvc': 1.3.92
'@swc/core-win32-x64-msvc': 1.3.92
'@swc/core-darwin-arm64': 1.3.94
'@swc/core-darwin-x64': 1.3.94
'@swc/core-linux-arm-gnueabihf': 1.3.94
'@swc/core-linux-arm64-gnu': 1.3.94
'@swc/core-linux-arm64-musl': 1.3.94
'@swc/core-linux-x64-gnu': 1.3.94
'@swc/core-linux-x64-musl': 1.3.94
'@swc/core-win32-arm64-msvc': 1.3.94
'@swc/core-win32-ia32-msvc': 1.3.94
'@swc/core-win32-x64-msvc': 1.3.94
dev: true
/@swc/counter@0.1.1:
......@@ -4120,7 +4120,7 @@ packages:
resolution: {integrity: sha512-wKoab31pknvILkxAF8ss+v9iNyhw5Iu/0jLtRkUD74cNfOOLJNnqfFKAv0r7wVaTQxRZtWrMpGfShwwBjOcgcg==}
deprecated: This is a stub types definition. pino provides its own type definitions, so you do not need this installed.
dependencies:
pino: 8.16.0
pino: 8.16.1
dev: true
/@types/prettier@2.3.2:
......@@ -4238,7 +4238,7 @@ packages:
'@types/node': 20.8.6
dev: false
/@typescript-eslint/eslint-plugin@6.7.5(@typescript-eslint/parser@6.8.0)(eslint@8.51.0)(typescript@5.2.2):
/@typescript-eslint/eslint-plugin@6.7.5(@typescript-eslint/parser@6.9.0)(eslint@8.51.0)(typescript@5.2.2):
resolution: {integrity: sha512-JhtAwTRhOUcP96D0Y6KYnwig/MRQbOoLGXTON2+LlyB/N35SP9j1boai2zzwXb7ypKELXMx3DVk9UTaEq1vHEw==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
......@@ -4250,7 +4250,7 @@ packages:
optional: true
dependencies:
'@eslint-community/regexpp': 4.6.2
'@typescript-eslint/parser': 6.8.0(eslint@8.51.0)(typescript@5.2.2)
'@typescript-eslint/parser': 6.9.0(eslint@8.51.0)(typescript@5.2.2)
'@typescript-eslint/scope-manager': 6.7.5
'@typescript-eslint/type-utils': 6.7.5(eslint@8.51.0)(typescript@5.2.2)
'@typescript-eslint/utils': 6.7.5(eslint@8.51.0)(typescript@5.2.2)
......@@ -4267,8 +4267,8 @@ packages:
- supports-color
dev: true
/@typescript-eslint/parser@6.8.0(eslint@8.51.0)(typescript@5.2.2):
resolution: {integrity: sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==}
/@typescript-eslint/parser@6.9.0(eslint@8.51.0)(typescript@5.2.2):
resolution: {integrity: sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
eslint: ^7.0.0 || ^8.0.0
......@@ -4277,10 +4277,10 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/scope-manager': 6.8.0
'@typescript-eslint/types': 6.8.0
'@typescript-eslint/typescript-estree': 6.8.0(typescript@5.2.2)
'@typescript-eslint/visitor-keys': 6.8.0
'@typescript-eslint/scope-manager': 6.9.0
'@typescript-eslint/types': 6.9.0
'@typescript-eslint/typescript-estree': 6.9.0(typescript@5.2.2)
'@typescript-eslint/visitor-keys': 6.9.0
debug: 4.3.4(supports-color@8.1.1)
eslint: 8.51.0
typescript: 5.2.2
......@@ -4296,12 +4296,12 @@ packages:
'@typescript-eslint/visitor-keys': 6.7.5
dev: true
/@typescript-eslint/scope-manager@6.8.0:
resolution: {integrity: sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==}
/@typescript-eslint/scope-manager@6.9.0:
resolution: {integrity: sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==}
engines: {node: ^16.0.0 || >=18.0.0}
dependencies:
'@typescript-eslint/types': 6.8.0
'@typescript-eslint/visitor-keys': 6.8.0
'@typescript-eslint/types': 6.9.0
'@typescript-eslint/visitor-keys': 6.9.0
dev: true
/@typescript-eslint/type-utils@6.7.5(eslint@8.51.0)(typescript@5.2.2):
......@@ -4329,8 +4329,8 @@ packages:
engines: {node: ^16.0.0 || >=18.0.0}
dev: true
/@typescript-eslint/types@6.8.0:
resolution: {integrity: sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==}
/@typescript-eslint/types@6.9.0:
resolution: {integrity: sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==}
engines: {node: ^16.0.0 || >=18.0.0}
dev: true
......@@ -4355,8 +4355,8 @@ packages:
- supports-color
dev: true
/@typescript-eslint/typescript-estree@6.8.0(typescript@5.2.2):
resolution: {integrity: sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==}
/@typescript-eslint/typescript-estree@6.9.0(typescript@5.2.2):
resolution: {integrity: sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
typescript: '*'
......@@ -4364,8 +4364,8 @@ packages:
typescript:
optional: true
dependencies:
'@typescript-eslint/types': 6.8.0
'@typescript-eslint/visitor-keys': 6.8.0
'@typescript-eslint/types': 6.9.0
'@typescript-eslint/visitor-keys': 6.9.0
debug: 4.3.4(supports-color@8.1.1)
globby: 11.1.0
is-glob: 4.0.3
......@@ -4403,11 +4403,11 @@ packages:
eslint-visitor-keys: 3.4.3
dev: true
/@typescript-eslint/visitor-keys@6.8.0:
resolution: {integrity: sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==}
/@typescript-eslint/visitor-keys@6.9.0:
resolution: {integrity: sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==}
engines: {node: ^16.0.0 || >=18.0.0}
dependencies:
'@typescript-eslint/types': 6.8.0
'@typescript-eslint/types': 6.9.0
eslint-visitor-keys: 3.4.3
dev: true
......@@ -4621,7 +4621,7 @@ packages:
dependencies:
typescript: 5.2.2
/@wagmi/cli@1.5.2(@wagmi/core@1.4.4)(typescript@5.2.2)(wagmi@1.0.1):
/@wagmi/cli@1.5.2(@wagmi/core@1.4.5)(typescript@5.2.2)(wagmi@1.0.1):
resolution: {integrity: sha512-UfLMYhW6mQBCjR8A5s01Chf9GpHzdpcuuBuzJ36QGXcMSJAxylz5ImVZWfCRV0ct1UruydjKVSW1QSI6azNxRQ==}
engines: {node: '>=14'}
hasBin: true
......@@ -4637,7 +4637,7 @@ packages:
wagmi:
optional: true
dependencies:
'@wagmi/core': 1.4.4(react@18.2.0)(typescript@5.2.2)(viem@1.16.6)
'@wagmi/core': 1.4.5(react@18.2.0)(typescript@5.2.2)(viem@1.16.6)
abitype: 0.8.7(typescript@5.2.2)(zod@3.22.3)
abort-controller: 3.0.0
bundle-require: 3.1.2(esbuild@0.16.17)
......@@ -4702,8 +4702,8 @@ packages:
- utf-8-validate
- zod
/@wagmi/connectors@3.1.2(react@18.2.0)(typescript@5.2.2)(viem@1.16.6):
resolution: {integrity: sha512-IlLKErqCzQRBUcCvXGPowcczbWcvJtEG006gPsAoePNJEXCHEWoKASghgu+L/bqD7006Z6mW6zlTNjcSQJvFAg==}
/@wagmi/connectors@3.1.3(react@18.2.0)(typescript@5.2.2)(viem@1.16.6):
resolution: {integrity: sha512-UgwsQKQDFObJVJMf9pDfFoXTv710o4zrTHyhIWKBTMMkLpCMsMxN5+ZaDhBYt/BgoRinfRYQo8uwuwLhxE6Log==}
peerDependencies:
typescript: '>=5.0.4'
viem: '>=0.3.35'
......@@ -4715,10 +4715,10 @@ packages:
'@ledgerhq/connect-kit-loader': 1.1.0
'@safe-global/safe-apps-provider': 0.17.1(typescript@5.2.2)
'@safe-global/safe-apps-sdk': 8.0.0(typescript@5.2.2)
'@walletconnect/ethereum-provider': 2.10.1(@walletconnect/modal@2.6.2)
'@walletconnect/ethereum-provider': 2.10.2(@walletconnect/modal@2.6.2)
'@walletconnect/legacy-provider': 2.0.0
'@walletconnect/modal': 2.6.2(react@18.2.0)
'@walletconnect/utils': 2.10.1
'@walletconnect/utils': 2.10.2
abitype: 0.8.7(typescript@5.2.2)(zod@3.22.3)
eventemitter3: 4.0.7
typescript: 5.2.2
......@@ -4763,8 +4763,8 @@ packages:
- utf-8-validate
- zod
/@wagmi/core@1.4.4(react@18.2.0)(typescript@5.2.2)(viem@1.16.6):
resolution: {integrity: sha512-38Pa5iH9/2zHX837vYm6M+c//BBikt6vKJqUiEgkIzSqFvlfzbxaNmwybpIxl98N5r+X22C3yHv5bboO9eP0vQ==}
/@wagmi/core@1.4.5(react@18.2.0)(typescript@5.2.2)(viem@1.16.6):
resolution: {integrity: sha512-N9luRb1Uk4tBN9kaYcQSWKE9AsRt/rvZaFt5IZech4JPzNN2sQlfhKd9GEjOXYRDqEPHdDvos7qyBKiDNTz4GA==}
peerDependencies:
typescript: '>=5.0.4'
viem: '>=0.3.35'
......@@ -4772,7 +4772,7 @@ packages:
typescript:
optional: true
dependencies:
'@wagmi/connectors': 3.1.2(react@18.2.0)(typescript@5.2.2)(viem@1.16.6)
'@wagmi/connectors': 3.1.3(react@18.2.0)(typescript@5.2.2)(viem@1.16.6)
abitype: 0.8.7(typescript@5.2.2)(zod@3.22.3)
eventemitter3: 4.0.7
typescript: 5.2.2
......@@ -4791,8 +4791,8 @@ packages:
- zod
dev: true
/@walletconnect/core@2.10.1:
resolution: {integrity: sha512-WAoXfmj+Zy5q48TnrKUjmHXJCBahzKwbul+noepRZf7JDtUAZ9IOWpUjg+UPRbfK5EiWZ0TF42S6SXidf7EHoQ==}
/@walletconnect/core@2.10.2:
resolution: {integrity: sha512-JQz/xp3SLEpTeRQctdck2ugSBVEpMxoSE+lFi2voJkZop1hv6P+uqr6E4PzjFluAjeAnKlT1xvra0aFWjPWVcw==}
dependencies:
'@walletconnect/heartbeat': 1.2.1
'@walletconnect/jsonrpc-provider': 1.0.13
......@@ -4805,8 +4805,8 @@ packages:
'@walletconnect/relay-auth': 1.0.4
'@walletconnect/safe-json': 1.0.2
'@walletconnect/time': 1.0.2
'@walletconnect/types': 2.10.1
'@walletconnect/utils': 2.10.1
'@walletconnect/types': 2.10.2
'@walletconnect/utils': 2.10.2
events: 3.3.0
lodash.isequal: 4.5.0
uint8arrays: 3.1.1
......@@ -4863,8 +4863,8 @@ packages:
dependencies:
tslib: 1.14.1
/@walletconnect/ethereum-provider@2.10.1(@walletconnect/modal@2.6.2):
resolution: {integrity: sha512-Yhoz8EXkKzxOlBT6G+elphqCx/gkH6RxD9/ZAiy9lLc8Ng5p1gvKCVVP5zsGNE9FbkKmHd+J9JJRzn2Bw2yqtQ==}
/@walletconnect/ethereum-provider@2.10.2(@walletconnect/modal@2.6.2):
resolution: {integrity: sha512-QMYFZ6+rVq2CJLdIPdKK0j1Qm66UA27oQU5V2SrL8EVwl7wFfm0Bq7fnL+qAWeDpn612dNeNErpk/ROa1zWlWg==}
peerDependencies:
'@walletconnect/modal': '>=2'
peerDependenciesMeta:
......@@ -4876,10 +4876,10 @@ packages:
'@walletconnect/jsonrpc-types': 1.0.3
'@walletconnect/jsonrpc-utils': 1.0.8
'@walletconnect/modal': 2.6.2(react@18.2.0)
'@walletconnect/sign-client': 2.10.1
'@walletconnect/types': 2.10.1
'@walletconnect/universal-provider': 2.10.1
'@walletconnect/utils': 2.10.1
'@walletconnect/sign-client': 2.10.2
'@walletconnect/types': 2.10.2
'@walletconnect/universal-provider': 2.10.2
'@walletconnect/utils': 2.10.2
events: 3.3.0
transitivePeerDependencies:
- '@react-native-async-storage/async-storage'
......@@ -5102,17 +5102,17 @@ packages:
dependencies:
tslib: 1.14.1
/@walletconnect/sign-client@2.10.1:
resolution: {integrity: sha512-iG3eJGi1yXeG3xGeVSSMf8wDFyx239B0prLQfy1uYDtYFb2ynnH/09oqAZyKn96W5nfQzUgM2Mz157PVdloH3Q==}
/@walletconnect/sign-client@2.10.2:
resolution: {integrity: sha512-vviSLV3f92I0bReX+OLr1HmbH0uIzYEQQFd1MzIfDk9PkfFT/LLAHhUnDaIAMkIdippqDcJia+5QEtT4JihL3Q==}
dependencies:
'@walletconnect/core': 2.10.1
'@walletconnect/core': 2.10.2
'@walletconnect/events': 1.0.1
'@walletconnect/heartbeat': 1.2.1
'@walletconnect/jsonrpc-utils': 1.0.8
'@walletconnect/logger': 2.0.1
'@walletconnect/time': 1.0.2
'@walletconnect/types': 2.10.1
'@walletconnect/utils': 2.10.1
'@walletconnect/types': 2.10.2
'@walletconnect/utils': 2.10.2
events: 3.3.0
transitivePeerDependencies:
- '@react-native-async-storage/async-storage'
......@@ -5144,8 +5144,8 @@ packages:
dependencies:
tslib: 1.14.1
/@walletconnect/types@2.10.1:
resolution: {integrity: sha512-7pccAhajQdiH2kYywjE1XI64IqRI+4ioyGy0wvz8d0UFQ/DSG3MLKR8jHf5aTOafQQ/HRLz6xvlzN4a7gIVkUQ==}
/@walletconnect/types@2.10.2:
resolution: {integrity: sha512-luNV+07Wdla4STi9AejseCQY31tzWKQ5a7C3zZZaRK/di+rFaAAb7YW04OP4klE7tw/mJRGPTlekZElmHxO8kQ==}
dependencies:
'@walletconnect/events': 1.0.1
'@walletconnect/heartbeat': 1.2.1
......@@ -5171,17 +5171,17 @@ packages:
- '@react-native-async-storage/async-storage'
- lokijs
/@walletconnect/universal-provider@2.10.1:
resolution: {integrity: sha512-81QxTH/X4dRoYCz0U9iOrBYOcj7N897ONcB57wsGhEkV7Rc9htmWJq2CzeOuxvVZ+pNZkE+/aw9LrhizO1Ltxg==}
/@walletconnect/universal-provider@2.10.2:
resolution: {integrity: sha512-wFgI0LbQ3D56sgaUMsgOHCM5m8WLxiC71BGuCKQfApgsbNMVKugYVy2zWHyUyi8sqTQHI+uSaVpDev4UHq9LEw==}
dependencies:
'@walletconnect/jsonrpc-http-connection': 1.0.7
'@walletconnect/jsonrpc-provider': 1.0.13
'@walletconnect/jsonrpc-types': 1.0.3
'@walletconnect/jsonrpc-utils': 1.0.8
'@walletconnect/logger': 2.0.1
'@walletconnect/sign-client': 2.10.1
'@walletconnect/types': 2.10.1
'@walletconnect/utils': 2.10.1
'@walletconnect/sign-client': 2.10.2
'@walletconnect/types': 2.10.2
'@walletconnect/utils': 2.10.2
events: 3.3.0
transitivePeerDependencies:
- '@react-native-async-storage/async-storage'
......@@ -5212,8 +5212,8 @@ packages:
- lokijs
- utf-8-validate
/@walletconnect/utils@2.10.1:
resolution: {integrity: sha512-DM0dKgm9O58l7VqJEyV2OVv16XRePhDAReI23let6WdW1dSpw/Y/A89Lp99ZJOjLm2FxyblMRF3YRaZtHwBffw==}
/@walletconnect/utils@2.10.2:
resolution: {integrity: sha512-syxXRpc2yhSknMu3IfiBGobxOY7fLfLTJuw+ppKaeO6WUdZpIit3wfuGOcc0Ms3ZPFCrGfyGOoZsCvgdXtptRg==}
dependencies:
'@stablelib/chacha20poly1305': 1.0.1
'@stablelib/hkdf': 1.0.1
......@@ -5223,7 +5223,7 @@ packages:
'@walletconnect/relay-api': 1.0.9
'@walletconnect/safe-json': 1.0.2
'@walletconnect/time': 1.0.2
'@walletconnect/types': 2.10.1
'@walletconnect/types': 2.10.2
'@walletconnect/window-getters': 1.0.1
'@walletconnect/window-metadata': 1.0.1
detect-browser: 5.3.0
......@@ -5680,6 +5680,17 @@ packages:
is-string: 1.0.7
dev: true
/array-includes@3.1.7:
resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
define-properties: 1.2.0
es-abstract: 1.22.1
get-intrinsic: 1.2.1
is-string: 1.0.7
dev: true
/array-union@2.1.0:
resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
engines: {node: '>=8'}
......@@ -5689,8 +5700,8 @@ packages:
engines: {node: '>=12'}
dev: true
/array.prototype.findlastindex@1.2.2:
resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==}
/array.prototype.findlastindex@1.2.3:
resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
......@@ -5708,6 +5719,17 @@ packages:
define-properties: 1.2.0
es-abstract: 1.22.1
es-shim-unscopables: 1.0.0
dev: false
/array.prototype.flat@1.3.2:
resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
define-properties: 1.2.0
es-abstract: 1.22.1
es-shim-unscopables: 1.0.0
dev: true
/array.prototype.flatmap@1.3.1:
resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==}
......@@ -5719,6 +5741,16 @@ packages:
es-shim-unscopables: 1.0.0
dev: true
/array.prototype.flatmap@1.3.2:
resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
define-properties: 1.2.0
es-abstract: 1.22.1
es-shim-unscopables: 1.0.0
dev: true
/array.prototype.tosorted@1.1.1:
resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==}
dependencies:
......@@ -7509,7 +7541,7 @@ packages:
eslint: 8.51.0
dev: true
/eslint-config-standard@16.0.3(eslint-plugin-import@2.28.1)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@5.2.0)(eslint@8.51.0):
/eslint-config-standard@16.0.3(eslint-plugin-import@2.29.0)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@5.2.0)(eslint@8.51.0):
resolution: {integrity: sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==}
peerDependencies:
eslint: ^7.12.1
......@@ -7518,7 +7550,7 @@ packages:
eslint-plugin-promise: ^4.2.1 || ^5.0.0
dependencies:
eslint: 8.51.0
eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.8.0)(eslint@8.51.0)
eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.9.0)(eslint@8.51.0)
eslint-plugin-node: 11.1.0(eslint@8.51.0)
eslint-plugin-promise: 5.2.0(eslint@8.51.0)
dev: true
......@@ -7527,13 +7559,13 @@ packages:
resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
dependencies:
debug: 3.2.7
is-core-module: 2.13.0
is-core-module: 2.13.1
resolve: 1.22.4
transitivePeerDependencies:
- supports-color
dev: true
/eslint-module-utils@2.8.0(@typescript-eslint/parser@6.8.0)(eslint-import-resolver-node@0.3.9)(eslint@8.51.0):
/eslint-module-utils@2.8.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-node@0.3.9)(eslint@8.51.0):
resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==}
engines: {node: '>=4'}
peerDependencies:
......@@ -7554,7 +7586,7 @@ packages:
eslint-import-resolver-webpack:
optional: true
dependencies:
'@typescript-eslint/parser': 6.8.0(eslint@8.51.0)(typescript@5.2.2)
'@typescript-eslint/parser': 6.9.0(eslint@8.51.0)(typescript@5.2.2)
debug: 3.2.7
eslint: 8.51.0
eslint-import-resolver-node: 0.3.9
......@@ -7573,8 +7605,8 @@ packages:
regexpp: 3.2.0
dev: true
/eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.8.0)(eslint@8.51.0):
resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==}
/eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.9.0)(eslint@8.51.0):
resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==}
engines: {node: '>=4'}
peerDependencies:
'@typescript-eslint/parser': '*'
......@@ -7583,23 +7615,23 @@ packages:
'@typescript-eslint/parser':
optional: true
dependencies:
'@typescript-eslint/parser': 6.8.0(eslint@8.51.0)(typescript@5.2.2)
array-includes: 3.1.6
array.prototype.findlastindex: 1.2.2
array.prototype.flat: 1.3.1
array.prototype.flatmap: 1.3.1
'@typescript-eslint/parser': 6.9.0(eslint@8.51.0)(typescript@5.2.2)
array-includes: 3.1.7
array.prototype.findlastindex: 1.2.3
array.prototype.flat: 1.3.2
array.prototype.flatmap: 1.3.2
debug: 3.2.7
doctrine: 2.1.0
eslint: 8.51.0
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.8.0)(eslint-import-resolver-node@0.3.9)(eslint@8.51.0)
has: 1.0.3
is-core-module: 2.13.0
eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-node@0.3.9)(eslint@8.51.0)
hasown: 2.0.0
is-core-module: 2.13.1
is-glob: 4.0.3
minimatch: 3.1.2
object.fromentries: 2.0.6
object.groupby: 1.0.0
object.values: 1.1.6
object.fromentries: 2.0.7
object.groupby: 1.0.1
object.values: 1.1.7
semver: 6.3.1
tsconfig-paths: 3.14.2
transitivePeerDependencies:
......@@ -8611,6 +8643,9 @@ packages:
/function-bind@1.1.1:
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
/function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
/function.prototype.name@1.1.5:
resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
engines: {node: '>= 0.4'}
......@@ -9078,6 +9113,12 @@ packages:
type-fest: 0.8.1
dev: true
/hasown@2.0.0:
resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==}
engines: {node: '>= 0.4'}
dependencies:
function-bind: 1.1.2
/he@1.2.0:
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
hasBin: true
......@@ -9381,6 +9422,12 @@ packages:
resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==}
dependencies:
has: 1.0.3
dev: true
/is-core-module@2.13.1:
resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
dependencies:
hasown: 2.0.0
/is-date-object@1.0.5:
resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
......@@ -11458,8 +11505,17 @@ packages:
es-abstract: 1.22.1
dev: true
/object.groupby@1.0.0:
resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==}
/object.fromentries@2.0.7:
resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
define-properties: 1.2.0
es-abstract: 1.22.1
dev: true
/object.groupby@1.0.1:
resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==}
dependencies:
call-bind: 1.0.2
define-properties: 1.2.0
......@@ -11483,6 +11539,15 @@ packages:
es-abstract: 1.22.1
dev: true
/object.values@1.1.7:
resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
define-properties: 1.2.0
es-abstract: 1.22.1
dev: true
/obliterator@1.6.1:
resolution: {integrity: sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==}
dev: true
......@@ -11974,8 +12039,8 @@ packages:
sonic-boom: 2.8.0
thread-stream: 0.15.2
/pino@8.16.0:
resolution: {integrity: sha512-UUmvQ/7KTZt/vHjhRrnyS7h+J7qPBQnpG80V56xmIC+o9IqYmQOw/UIny9S9zYDfRBR0ClouCr464EkBMIT7Fw==}
/pino@8.16.1:
resolution: {integrity: sha512-3bKsVhBmgPjGV9pyn4fO/8RtoVDR8ssW1ev819FsRXlRNgW8gR/9Kx+gCK4UPWd4JjrRDLWpzd/pb1AyWm3MGA==}
hasBin: true
dependencies:
atomic-sleep: 1.0.0
......@@ -12652,7 +12717,7 @@ packages:
resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==}
hasBin: true
dependencies:
is-core-module: 2.13.0
is-core-module: 2.13.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
......@@ -13820,7 +13885,7 @@ packages:
resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==}
dev: true
/tsup@7.2.0(@swc/core@1.3.92)(typescript@5.2.2):
/tsup@7.2.0(@swc/core@1.3.94)(typescript@5.2.2):
resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==}
engines: {node: '>=16.14'}
hasBin: true
......@@ -13836,7 +13901,7 @@ packages:
typescript:
optional: true
dependencies:
'@swc/core': 1.3.92
'@swc/core': 1.3.94
bundle-require: 4.0.1(esbuild@0.18.15)
cac: 6.7.14
chokidar: 3.5.3
......
......@@ -308,9 +308,9 @@ A reference implementation of the L1 Attributes predeploy contract can be found
[L1Block.sol]: ../packages/contracts-bedrock/src/L2/L1Block.sol
After running `pnpm build` in the `packages/contracts` directory, the bytecode to add to the genesis
file will be located in the `deployedBytecode` field of the build artifacts file at
`/packages/contracts/artifacts/contracts/L2/L1Block.sol/L1Block.json`.
After running `pnpm build` in the `packages/contracts-bedrock` directory, the bytecode to add to
the genesis file will be located in the `deployedBytecode` field of the build artifacts file at
`/packages/contracts-bedrock/forge-artifacts/L1Block.sol/L1Block.json`.
## User-Deposited Transactions
......
......@@ -12,7 +12,7 @@
You can spin up a local devnet via `docker compose`.
For convenience, we have defined `make` targets to start and stop the devnet with a single command.
To run the devnet, you will need `docker` installed.
Then, as a precondition, make sure that you have compiled the contracts by `cd`ing into `packages/contracts`
Then, as a precondition, make sure that you have compiled the contracts by `cd`ing into `packages/contracts-bedrock`
and running `pnpm i` followed by `pnpm build`. You'll only need to do this if you change the contracts in the future.
Then, run the following:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment