From 7578a468504c6c35bfd936e71b3567a0af4455f9 Mon Sep 17 00:00:00 2001 From: Gavin Yu Date: Tue, 2 Apr 2024 10:51:33 +0800 Subject: [PATCH 01/14] improve proposing strategy Co-authored-by: David Co-authored-by: maskpp --- driver/chain_syncer/calldata/syncer_test.go | 34 ----- driver/driver_test.go | 5 - go.mod | 2 +- go.sum | 8 +- internal/docker/nodes/docker-compose.yml | 2 +- internal/testutils/suite.go | 6 - .../block_batch_iterator_test.go | 2 +- pkg/rpc/methods.go | 2 +- prover/event_handler/block_proposed_test.go | 35 +++++ prover/event_handler/block_verified_test.go | 21 +++ .../event_handler/transition_proved_test.go | 131 ++++++++++++++++++ prover/guardian.go | 4 +- prover/prover.go | 2 +- 13 files changed, 200 insertions(+), 54 deletions(-) create mode 100644 prover/event_handler/block_proposed_test.go create mode 100644 prover/event_handler/block_verified_test.go create mode 100644 prover/event_handler/transition_proved_test.go diff --git a/driver/chain_syncer/calldata/syncer_test.go b/driver/chain_syncer/calldata/syncer_test.go index 391d08e06..4032c9f33 100644 --- a/driver/chain_syncer/calldata/syncer_test.go +++ b/driver/chain_syncer/calldata/syncer_test.go @@ -188,40 +188,6 @@ func (s *CalldataSyncerTestSuite) TestTreasuryIncome() { s.Zero(balanceAfter.Cmp(balance)) } -func (s *CalldataSyncerTestSuite) TestRetrievePastBlock() { - syncer, err := NewSyncer( - context.Background(), - s.RPCClient, - s.s.state, - s.s.progressTracker, - 5, - ) - s.Nil(err) - - s.s = syncer - for i := 0; i < 10; i++ { - s.ProposeAndInsertValidBlock(s.p, s.s) - } - genesisL1Header, err := s.RPCClient.GetGenesisL1Header(context.Background()) - s.Nil(err) - l1Snapshot := s.SetL1Snapshot() - for i := 0; i < 5; i++ { - s.ProposeAndInsertValidBlock(s.p, s.s) - } - s.RevertL1Snapshot(l1Snapshot) - s.initProposer() - - // Propose 5 blocks on another fork - for i := 0; i < 5; i++ { - s.ProposeInvalidTxListBytes(s.p) - } - reorgResult, err := s.s.retrievePastBlock(context.Background(), 12, 0, genesisL1Header) - s.Nil(err) - s.NotNil(reorgResult) - s.Equal(reorgResult.IsReorged, true) - s.GreaterOrEqual(reorgResult.L1CurrentToReset.Number.Uint64(), genesisL1Header.Number.Uint64()) -} - func (s *CalldataSyncerTestSuite) initProposer() { prop := new(proposer.Proposer) l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) diff --git a/driver/driver_test.go b/driver/driver_test.go index 300f5a4be..780b0b483 100644 --- a/driver/driver_test.go +++ b/driver/driver_test.go @@ -132,11 +132,6 @@ func (s *DriverTestSuite) TestCheckL1ReorgToHigherFork() { s.RevertL1Snapshot(testnetL1SnapshotID) s.InitProposer() - l1Head3, err := s.d.rpc.L1.HeaderByNumber(context.Background(), nil) - s.Nil(err) - s.Equal(l1Head3.Number.Uint64(), l1Head1.Number.Uint64()) - s.Equal(l1Head3.Hash(), l1Head1.Hash()) - // Because of evm_revert operation, the nonce of the proposer need to be adjusted. // Propose ten blocks on another fork for i := 0; i < 10; i++ { diff --git a/go.mod b/go.mod index 50eb11519..99794bda0 100644 --- a/go.mod +++ b/go.mod @@ -226,6 +226,6 @@ require ( sigs.k8s.io/yaml v1.3.0 // indirect ) -replace github.com/ethereum/go-ethereum v1.13.14 => github.com/taikoxyz/taiko-geth v0.0.0-20240325051151-061196ff327c +replace github.com/ethereum/go-ethereum v1.13.14 => github.com/taikoxyz/taiko-geth v0.0.0-20240401065233-1e8d3b233894 replace github.com/ethereum-optimism/optimism v1.7.0 => github.com/taikoxyz/optimism v0.0.0-20240402022152-070fc9dba2ec diff --git a/go.sum b/go.sum index df5a7c138..86dd94270 100644 --- a/go.sum +++ b/go.sum @@ -857,6 +857,8 @@ github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtB github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -960,8 +962,8 @@ github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDd github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/taikoxyz/optimism v0.0.0-20240402022152-070fc9dba2ec h1:3CwBNzTe8gl+enXcbsQrbh4RObS/UCWvZ3dtMrdiuEg= github.com/taikoxyz/optimism v0.0.0-20240402022152-070fc9dba2ec/go.mod h1:X4jEuxN69o7ZVG20Yt3joIOaCDKb1G/dPYVjnR3XxrU= -github.com/taikoxyz/taiko-geth v0.0.0-20240325051151-061196ff327c h1:xrVME9T4Gq4DH9y46/b2JqO1uIWwT4wWISWn9e4WqI4= -github.com/taikoxyz/taiko-geth v0.0.0-20240325051151-061196ff327c/go.mod h1:nqByouVW0a0qx5KKgvYgoXba+pYEHznAAQp6LhZilgM= +github.com/taikoxyz/taiko-geth v0.0.0-20240401065233-1e8d3b233894 h1:sXS2kkWgkoxPbtWD5csZGI3YnvD8CBeiFUpL4bba9Bc= +github.com/taikoxyz/taiko-geth v0.0.0-20240401065233-1e8d3b233894/go.mod h1:nqByouVW0a0qx5KKgvYgoXba+pYEHznAAQp6LhZilgM= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161/go.mod h1:wM7WEvslTq+iOEAMDLSzhVuOt5BRZ05WirO+b09GHQU= github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b/go.mod h1:5XA7W9S6mni3h5uvOC75dA3m9CCCaS83lltmc0ukdi4= @@ -1576,6 +1578,8 @@ k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/internal/docker/nodes/docker-compose.yml b/internal/docker/nodes/docker-compose.yml index 711b3a081..adf2d0240 100644 --- a/internal/docker/nodes/docker-compose.yml +++ b/internal/docker/nodes/docker-compose.yml @@ -17,7 +17,7 @@ services: l2_execution_engine: container_name: l2_node - image: gcr.io/evmchain/taiko-geth:taiko + image: gcr.io/evmchain/taiko-geth:sha-7ec6b5e restart: unless-stopped pull_policy: always volumes: diff --git a/internal/testutils/suite.go b/internal/testutils/suite.go index b564e48d9..8c0763e35 100644 --- a/internal/testutils/suite.go +++ b/internal/testutils/suite.go @@ -157,9 +157,3 @@ func (s *ClientTestSuite) RevertL1Snapshot(snapshotID string) { s.Nil(s.RPCClient.L1.CallContext(context.Background(), &revertRes, "evm_revert", snapshotID)) s.True(revertRes) } - -func (s *ClientTestSuite) MineL1Block() { - var blockID string - s.Nil(s.RPCClient.L1.CallContext(context.Background(), &blockID, "evm_mine")) - s.NotEmpty(blockID) -} diff --git a/pkg/chain_iterator/block_batch_iterator_test.go b/pkg/chain_iterator/block_batch_iterator_test.go index 5a7760edf..3a8f32b8c 100644 --- a/pkg/chain_iterator/block_batch_iterator_test.go +++ b/pkg/chain_iterator/block_batch_iterator_test.go @@ -78,7 +78,7 @@ func (s *BlockBatchIteratorTestSuite) TestIterWithoutSpecifiedEndHeight() { s.Nil(err) s.Nil(iter.Iter()) - s.Equal(headHeight-blockConfirmations, lastEnd.Uint64()) + s.GreaterOrEqual(lastEnd.Uint64(), headHeight-blockConfirmations) } func (s *BlockBatchIteratorTestSuite) TestIterWithLessThanConfirmations() { diff --git a/pkg/rpc/methods.go b/pkg/rpc/methods.go index 8910f08eb..451787bc5 100644 --- a/pkg/rpc/methods.go +++ b/pkg/rpc/methods.go @@ -444,7 +444,7 @@ func (c *Client) CheckL1Reorg(ctx context.Context, blockID *big.Int) (*ReorgChec return result, nil } - // 1. Check whether the L2 block's coreesponding L1 block which in L1Origin has been reorged. + // 1. Check whether the L2 block's corresponding L1 block which in L1Origin has been reorged. l1Origin, err := c.L2.L1OriginByID(ctxWithTimeout, blockID) if err != nil { // If the L2 EE is just synced through P2P, so there is no L1Origin information recorded in diff --git a/prover/event_handler/block_proposed_test.go b/prover/event_handler/block_proposed_test.go new file mode 100644 index 000000000..267d4d97e --- /dev/null +++ b/prover/event_handler/block_proposed_test.go @@ -0,0 +1,35 @@ +package handler + +import ( + "context" + "time" + + proofProducer "github.com/taikoxyz/taiko-client/prover/proof_producer" + state "github.com/taikoxyz/taiko-client/prover/shared_state" + + "github.com/ethereum/go-ethereum/common" + "github.com/taikoxyz/taiko-client/bindings" +) + +func (s *EventHandlerTestSuite) TestBlockProposedHandle() { + opts := &NewBlockProposedEventHandlerOps{ + SharedState: &state.SharedState{}, + ProverAddress: common.Address{}, + GenesisHeightL1: 0, + RPC: s.RPCClient, + ProofGenerationCh: make(chan *proofProducer.ProofWithHeader), + AssignmentExpiredCh: make(chan *bindings.TaikoL1ClientBlockProposed), + ProofSubmissionCh: make(chan *proofProducer.ProofRequestBody), + ProofContestCh: make(chan *proofProducer.ContestRequestBody), + BackOffRetryInterval: 1 * time.Minute, + BackOffMaxRetrys: 5, + ContesterMode: true, + ProveUnassignedBlocks: true, + } + handler := NewBlockProposedEventHandler( + opts, + ) + e := s.ProposeAndInsertValidBlock(s.proposer, s.calldataSyncer) + err := handler.Handle(context.Background(), e, func() {}) + s.Nil(err) +} diff --git a/prover/event_handler/block_verified_test.go b/prover/event_handler/block_verified_test.go new file mode 100644 index 000000000..764385bb8 --- /dev/null +++ b/prover/event_handler/block_verified_test.go @@ -0,0 +1,21 @@ +package handler + +import ( + "github.com/ethereum/go-ethereum/core/types" + "github.com/taikoxyz/taiko-client/bindings" + "github.com/taikoxyz/taiko-client/internal/testutils" +) + +func (s *EventHandlerTestSuite) TestBlockVerifiedHandle() { + handler := &BlockVerifiedEventHandler{} + id := testutils.RandomHash().Big().Uint64() + s.NotPanics(func() { + handler.Handle(&bindings.TaikoL1ClientBlockVerified{ + BlockId: testutils.RandomHash().Big(), + Raw: types.Log{ + BlockHash: testutils.RandomHash(), + BlockNumber: id, + }, + }) + }) +} diff --git a/prover/event_handler/transition_proved_test.go b/prover/event_handler/transition_proved_test.go new file mode 100644 index 000000000..e2172116f --- /dev/null +++ b/prover/event_handler/transition_proved_test.go @@ -0,0 +1,131 @@ +package handler + +import ( + "context" + "os" + "testing" + "time" + + proofProducer "github.com/taikoxyz/taiko-client/prover/proof_producer" + + "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/suite" + "github.com/taikoxyz/taiko-client/bindings" + "github.com/taikoxyz/taiko-client/driver" + "github.com/taikoxyz/taiko-client/driver/chain_syncer/beaconsync" + "github.com/taikoxyz/taiko-client/driver/chain_syncer/calldata" + "github.com/taikoxyz/taiko-client/driver/state" + "github.com/taikoxyz/taiko-client/internal/testutils" + "github.com/taikoxyz/taiko-client/pkg/jwt" + "github.com/taikoxyz/taiko-client/pkg/rpc" + "github.com/taikoxyz/taiko-client/proposer" +) + +type EventHandlerTestSuite struct { + testutils.ClientTestSuite + d *driver.Driver + proposer *proposer.Proposer + calldataSyncer *calldata.Syncer +} + +func (s *EventHandlerTestSuite) SetupTest() { + s.ClientTestSuite.SetupTest() + + // Init driver + jwtSecret, err := jwt.ParseSecretFromFile(os.Getenv("JWT_SECRET")) + s.Nil(err) + s.NotEmpty(jwtSecret) + + d := new(driver.Driver) + s.Nil(d.InitFromConfig(context.Background(), &driver.Config{ + ClientConfig: &rpc.ClientConfig{ + L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), + L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), + L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), + JwtSecret: string(jwtSecret), + }, + })) + s.d = d + + // Init calldata syncer + testState, err := state.New(context.Background(), s.RPCClient) + s.Nil(err) + s.Nil(testState.ResetL1Current(context.Background(), common.Big0)) + + tracker := beaconsync.NewSyncProgressTracker(s.RPCClient.L2, 30*time.Second) + s.calldataSyncer, err = calldata.NewSyncer( + context.Background(), + s.RPCClient, + testState, + tracker, + 0, + ) + s.Nil(err) + + // Init proposer + l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) + s.Nil(err) + + prop := new(proposer.Proposer) + + s.Nil(prop.InitFromConfig(context.Background(), &proposer.Config{ + ClientConfig: &rpc.ClientConfig{ + L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), + L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), + TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), + TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), + TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), + }, + AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), + L1ProposerPrivKey: l1ProposerPrivKey, + L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), + ProposeInterval: 1024 * time.Hour, + MaxProposedTxListsPerEpoch: 1, + WaitReceiptTimeout: 12 * time.Second, + ProverEndpoints: s.ProverEndpoints, + OptimisticTierFee: common.Big256, + SgxTierFee: common.Big256, + MaxTierFeePriceBumps: 3, + TierFeePriceBump: common.Big2, + L1BlockBuilderTip: common.Big0, + TxmgrConfigs: &txmgr.CLIConfig{ + L1RPCURL: os.Getenv("L1_NODE_WS_ENDPOINT"), + NumConfirmations: 1, + SafeAbortNonceTooLowCount: txmgr.DefaultBatcherFlagValues.SafeAbortNonceTooLowCount, + PrivateKey: common.Bytes2Hex(crypto.FromECDSA(l1ProposerPrivKey)), + FeeLimitMultiplier: txmgr.DefaultBatcherFlagValues.FeeLimitMultiplier, + FeeLimitThresholdGwei: txmgr.DefaultBatcherFlagValues.FeeLimitThresholdGwei, + MinBaseFeeGwei: txmgr.DefaultBatcherFlagValues.MinBaseFeeGwei, + MinTipCapGwei: txmgr.DefaultBatcherFlagValues.MinTipCapGwei, + ResubmissionTimeout: txmgr.DefaultBatcherFlagValues.ResubmissionTimeout, + ReceiptQueryInterval: 1 * time.Second, + NetworkTimeout: txmgr.DefaultBatcherFlagValues.NetworkTimeout, + TxSendTimeout: txmgr.DefaultBatcherFlagValues.TxSendTimeout, + TxNotInMempoolTimeout: txmgr.DefaultBatcherFlagValues.TxNotInMempoolTimeout, + }, + })) + + s.proposer = prop +} + +func (s *EventHandlerTestSuite) TestTransitionProvedHandle() { + handler := NewTransitionProvedEventHandler( + s.RPCClient, + make(chan *proofProducer.ContestRequestBody), + true, + ) + e := s.ProposeAndInsertValidBlock(s.proposer, s.calldataSyncer) + err := handler.Handle(context.Background(), &bindings.TaikoL1ClientTransitionProved{ + BlockId: e.BlockId, + Tier: e.Meta.MinTier, + }) + s.Nil(err) +} + +func TestTransitionProvedEventHandlerTestSuite(t *testing.T) { + suite.Run(t, new(EventHandlerTestSuite)) +} diff --git a/prover/guardian.go b/prover/guardian.go index ed0bcd6eb..c23b33e78 100644 --- a/prover/guardian.go +++ b/prover/guardian.go @@ -12,9 +12,9 @@ var ( heartbeatInterval = 12 * time.Second ) -// gurdianProverHeartbeatLoop keeps sending heartbeats to the guardian prover health check server +// guardianProverHeartbeatLoop keeps sending heartbeats to the guardian prover health check server // on an interval. -func (p *Prover) gurdianProverHeartbeatLoop(ctx context.Context) { +func (p *Prover) guardianProverHeartbeatLoop(ctx context.Context) { p.wg.Add(1) defer p.wg.Done() diff --git a/prover/prover.go b/prover/prover.go index 228415002..e5b98feb6 100644 --- a/prover/prover.go +++ b/prover/prover.go @@ -232,7 +232,7 @@ func (p *Prover) Start() error { log.Error("Failed to send guardian prover startup", "error", err) } - go p.gurdianProverHeartbeatLoop(p.ctx) + go p.guardianProverHeartbeatLoop(p.ctx) } // 4. Start the main event loop of the prover. From a1b14265cfbd1ddb75afb3b4a36ab8a0979d1ce9 Mon Sep 17 00:00:00 2001 From: maskpp Date: Wed, 3 Apr 2024 11:23:33 +0800 Subject: [PATCH 02/14] revert comment --- proposer/proposer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposer/proposer.go b/proposer/proposer.go index 111648386..a8bdc72a4 100644 --- a/proposer/proposer.go +++ b/proposer/proposer.go @@ -187,7 +187,7 @@ func (p *Proposer) eventLoop() { log.Error("Proposing operation error", "error", err) continue } - // if no new transactions and empty block interval has passed, propose an empty block + // If there is always no new transaction and the empty block interval has passed, propose an empty block. if p.ForceEmptyBlocksInterval != 0 { if time.Now().Before(lastNonEmptyBlockProposedAt.Add(p.ForceEmptyBlocksInterval)) { continue From 03afcd91365c8e7070c7bf31b635497f4cb89e85 Mon Sep 17 00:00:00 2001 From: maskpp Date: Wed, 3 Apr 2024 14:38:14 +0800 Subject: [PATCH 03/14] fix comments --- cmd/flags/proposer.go | 4 ++-- proposer/config.go | 4 ++-- proposer/config_test.go | 6 +++--- proposer/proposer.go | 4 ++-- proposer/proposer_test.go | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cmd/flags/proposer.go b/cmd/flags/proposer.go index 8e5629568..f2c4196ba 100644 --- a/cmd/flags/proposer.go +++ b/cmd/flags/proposer.go @@ -78,7 +78,7 @@ var ( Category: proposerCategory, Value: 0, } - ProposeEmptyBlocksInterval = &cli.DurationFlag{ + FroceProposingInternal = &cli.DurationFlag{ Name: "epoch.emptyBlockInterval", Usage: "Time interval to propose empty blocks", Category: proposerCategory, @@ -139,7 +139,7 @@ var ProposerFlags = MergeFlags(CommonFlags, []cli.Flag{ TxPoolLocals, TxPoolLocalsOnly, ExtraData, - ProposeEmptyBlocksInterval, + FroceProposingInternal, MaxProposedTxListsPerEpoch, ProverEndpoints, OptimisticTierFee, diff --git a/proposer/config.go b/proposer/config.go index 3a7f41e30..71d054fe3 100644 --- a/proposer/config.go +++ b/proposer/config.go @@ -30,7 +30,7 @@ type Config struct { LocalAddressesOnly bool BlockMinGasLimit uint64 BlockMinTxListBytes uint64 - ForceEmptyBlocksInterval time.Duration + FroceProposingInternal time.Duration MaxProposedTxListsPerEpoch uint64 ProposeBlockTxGasLimit uint64 WaitReceiptTimeout time.Duration @@ -98,7 +98,7 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { BlockMinGasLimit: c.Uint64(flags.BlockMinGasLimit.Name), BlockMinTxListBytes: c.Uint64(flags.BlockMinTxListBytes.Name), - ForceEmptyBlocksInterval: c.Duration(flags.ProposeEmptyBlocksInterval.Name), + FroceProposingInternal: c.Duration(flags.FroceProposingInternal.Name), MaxProposedTxListsPerEpoch: c.Uint64(flags.MaxProposedTxListsPerEpoch.Name), ProposeBlockTxGasLimit: c.Uint64(flags.TxGasLimit.Name), WaitReceiptTimeout: c.Duration(flags.WaitReceiptTimeout.Name), diff --git a/proposer/config_test.go b/proposer/config_test.go index d30213585..3bd616dff 100644 --- a/proposer/config_test.go +++ b/proposer/config_test.go @@ -100,7 +100,7 @@ func (s *ProposerTestSuite) TestNewConfigFromCliContextL2RecipErr() { "TestNewConfigFromCliContextL2RecipErr", "--" + flags.L1ProposerPrivKey.Name, encoding.GoldenTouchPrivKey, "--" + flags.ProposeInterval.Name, proposeInterval, - "--" + flags.ProposeEmptyBlocksInterval.Name, proposeInterval, + "--" + flags.FroceProposingInternal.Name, proposeInterval, "--" + flags.L2SuggestedFeeRecipient.Name, "notAnAddress", }), "invalid L2 suggested fee recipient address") } @@ -115,7 +115,7 @@ func (s *ProposerTestSuite) TestNewConfigFromCliContextTxPoolLocalsErr() { "TestNewConfigFromCliContextTxPoolLocalsErr", "--" + flags.L1ProposerPrivKey.Name, encoding.GoldenTouchPrivKey, "--" + flags.ProposeInterval.Name, proposeInterval, - "--" + flags.ProposeEmptyBlocksInterval.Name, proposeInterval, + "--" + flags.FroceProposingInternal.Name, proposeInterval, "--" + flags.L2SuggestedFeeRecipient.Name, goldenTouchAddress.Hex(), "--" + flags.TxPoolLocals.Name, "notAnAddress", }), "invalid account in --txpool.locals") @@ -131,7 +131,7 @@ func (s *ProposerTestSuite) SetupApp() *cli.App { &cli.StringFlag{Name: flags.TaikoTokenAddress.Name}, &cli.StringFlag{Name: flags.L1ProposerPrivKey.Name}, &cli.StringFlag{Name: flags.L2SuggestedFeeRecipient.Name}, - &cli.DurationFlag{Name: flags.ProposeEmptyBlocksInterval.Name}, + &cli.DurationFlag{Name: flags.FroceProposingInternal.Name}, &cli.DurationFlag{Name: flags.ProposeInterval.Name}, &cli.StringFlag{Name: flags.TxPoolLocals.Name}, &cli.StringFlag{Name: flags.ProverEndpoints.Name}, diff --git a/proposer/proposer.go b/proposer/proposer.go index a8bdc72a4..4b7e7ac3b 100644 --- a/proposer/proposer.go +++ b/proposer/proposer.go @@ -188,8 +188,8 @@ func (p *Proposer) eventLoop() { continue } // If there is always no new transaction and the empty block interval has passed, propose an empty block. - if p.ForceEmptyBlocksInterval != 0 { - if time.Now().Before(lastNonEmptyBlockProposedAt.Add(p.ForceEmptyBlocksInterval)) { + if p.FroceProposingInternal != 0 { + if time.Now().Before(lastNonEmptyBlockProposedAt.Add(p.FroceProposingInternal)) { continue } diff --git a/proposer/proposer_test.go b/proposer/proposer_test.go index 84e14bd61..e4e94500c 100644 --- a/proposer/proposer_test.go +++ b/proposer/proposer_test.go @@ -153,7 +153,7 @@ func (s *ProposerTestSuite) getLatestProposedTxs( } func (s *ProposerTestSuite) TestEmptyBlock() { - s.p.ForceEmptyBlocksInterval = 3 * time.Second + s.p.FroceProposingInternal = 3 * time.Second s.p.BlockMinGasLimit = math.MaxUint64 s.p.BlockMinTxListBytes = math.MaxUint64 s.p.ProposeInterval = time.Second From 233f0e83b2f4249c387102727b0504cc565a326c Mon Sep 17 00:00:00 2001 From: David Date: Wed, 3 Apr 2024 15:11:26 +0800 Subject: [PATCH 04/14] chore: update go.mod --- go.mod | 2 +- go.sum | 4 ++-- internal/docker/nodes/docker-compose.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index aafc2c61a..bdcebe3d1 100644 --- a/go.mod +++ b/go.mod @@ -226,6 +226,6 @@ require ( sigs.k8s.io/yaml v1.3.0 // indirect ) -replace github.com/ethereum/go-ethereum v1.13.14 => github.com/taikoxyz/taiko-geth v0.0.0-20240402074646-f24e67d028a4 +replace github.com/ethereum/go-ethereum v1.13.14 => github.com/taikoxyz/taiko-geth v0.0.0-20240403070732-2eac3d10ea69 replace github.com/ethereum-optimism/optimism v1.7.0 => github.com/taikoxyz/optimism v0.0.0-20240402022152-070fc9dba2ec diff --git a/go.sum b/go.sum index 3921f3971..c79a70fc4 100644 --- a/go.sum +++ b/go.sum @@ -962,8 +962,8 @@ github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDd github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/taikoxyz/optimism v0.0.0-20240402022152-070fc9dba2ec h1:3CwBNzTe8gl+enXcbsQrbh4RObS/UCWvZ3dtMrdiuEg= github.com/taikoxyz/optimism v0.0.0-20240402022152-070fc9dba2ec/go.mod h1:X4jEuxN69o7ZVG20Yt3joIOaCDKb1G/dPYVjnR3XxrU= -github.com/taikoxyz/taiko-geth v0.0.0-20240402074646-f24e67d028a4 h1:wfL0uOnwLk/njskM/ZLLhvlZXVzg4ASHNmIGUpk0ObE= -github.com/taikoxyz/taiko-geth v0.0.0-20240402074646-f24e67d028a4/go.mod h1:nqByouVW0a0qx5KKgvYgoXba+pYEHznAAQp6LhZilgM= +github.com/taikoxyz/taiko-geth v0.0.0-20240403070732-2eac3d10ea69 h1:kl830bUZwaIC+csxgFYBlovSjc+3cW2DVmNn1WqNaso= +github.com/taikoxyz/taiko-geth v0.0.0-20240403070732-2eac3d10ea69/go.mod h1:nqByouVW0a0qx5KKgvYgoXba+pYEHznAAQp6LhZilgM= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161/go.mod h1:wM7WEvslTq+iOEAMDLSzhVuOt5BRZ05WirO+b09GHQU= github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b/go.mod h1:5XA7W9S6mni3h5uvOC75dA3m9CCCaS83lltmc0ukdi4= diff --git a/internal/docker/nodes/docker-compose.yml b/internal/docker/nodes/docker-compose.yml index 74925a102..711b3a081 100644 --- a/internal/docker/nodes/docker-compose.yml +++ b/internal/docker/nodes/docker-compose.yml @@ -17,7 +17,7 @@ services: l2_execution_engine: container_name: l2_node - image: gcr.io/evmchain/taiko-geth:sha-da89c69 + image: gcr.io/evmchain/taiko-geth:taiko restart: unless-stopped pull_policy: always volumes: From b4a61824dd4b9c1130d6d9f7699f75935ff75765 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 3 Apr 2024 15:43:37 +0800 Subject: [PATCH 05/14] delete proposeEmptyBlockOp and fix test cases. --- cmd/flags/proposer.go | 20 ++-- internal/testutils/helper.go | 65 ++++++++++- internal/testutils/interfaces.go | 1 - proposer/config.go | 27 +++-- proposer/config_test.go | 6 +- proposer/proposer.go | 115 +++++++++---------- proposer/proposer_test.go | 189 ++++++++++++++----------------- 7 files changed, 237 insertions(+), 186 deletions(-) diff --git a/cmd/flags/proposer.go b/cmd/flags/proposer.go index f2c4196ba..90e99fd70 100644 --- a/cmd/flags/proposer.go +++ b/cmd/flags/proposer.go @@ -66,21 +66,21 @@ var ( Category: proposerCategory, Value: 0, } - BlockMinGasLimit = &cli.Uint64Flag{ - Name: "epoch.minGasLimit", - Usage: "Minimum gas limit for a proposed block", + MinGasUsed = &cli.Uint64Flag{ + Name: "epoch.minGasUsed", + Usage: "Minimum gas used for a transactions list to propose", Category: proposerCategory, Value: 0, } - BlockMinTxListBytes = &cli.Uint64Flag{ + MinTxListBytes = &cli.Uint64Flag{ Name: "epoch.minTxListBytes", - Usage: "Minimum bytes for a proposed transaction list", + Usage: "Minimum bytes for a transactions list to propose", Category: proposerCategory, Value: 0, } - FroceProposingInternal = &cli.DurationFlag{ - Name: "epoch.emptyBlockInterval", - Usage: "Time interval to propose empty blocks", + MinProposingInternal = &cli.DurationFlag{ + Name: "epoch.minProposingInterval", + Usage: "Minimum time interval to force proposing a block, even if there are no transaction in mempool", Category: proposerCategory, Value: 0, } @@ -139,7 +139,9 @@ var ProposerFlags = MergeFlags(CommonFlags, []cli.Flag{ TxPoolLocals, TxPoolLocalsOnly, ExtraData, - FroceProposingInternal, + MinGasUsed, + MinTxListBytes, + MinProposingInternal, MaxProposedTxListsPerEpoch, ProverEndpoints, OptimisticTierFee, diff --git a/internal/testutils/helper.go b/internal/testutils/helper.go index d127ef853..1552b9ed4 100644 --- a/internal/testutils/helper.go +++ b/internal/testutils/helper.go @@ -6,12 +6,14 @@ import ( "crypto/rand" "errors" "fmt" + "math/big" "net/http" "net/url" "os" "time" "github.com/cenkalti/backoff/v4" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" @@ -21,6 +23,7 @@ import ( "github.com/phayes/freeport" "github.com/taikoxyz/taiko-client/bindings" + "github.com/taikoxyz/taiko-client/pkg/rpc" "github.com/taikoxyz/taiko-client/prover/server" ) @@ -30,6 +33,17 @@ func (s *ClientTestSuite) ProposeInvalidTxListBytes(proposer Proposer) { s.Nil(proposer.ProposeTxList(context.Background(), invalidTxListBytes, 1)) } +func (s *ClientTestSuite) proposeEmptyBlockOp(ctx context.Context, proposer Proposer) error { + emptyTxListBytes, err := rlp.EncodeToBytes(types.Transactions{}) + if err != nil { + return err + } + if err = proposer.ProposeTxList(ctx, emptyTxListBytes, 0); err != nil { + return err + } + return nil +} + func (s *ClientTestSuite) ProposeAndInsertEmptyBlocks( proposer Proposer, calldataSyncer CalldataSyncer, @@ -58,7 +72,7 @@ func (s *ClientTestSuite) ProposeAndInsertEmptyBlocks( s.ProposeInvalidTxListBytes(proposer) // Random bytes txList - s.Nil(proposer.ProposeEmptyBlockOp(context.Background())) + s.Nil(s.proposeEmptyBlockOp(context.Background(), proposer)) events = append(events, []*bindings.TaikoL1ClientBlockProposed{<-sink, <-sink, <-sink}...) @@ -299,3 +313,52 @@ func LocalRandomProverEndpoint() *url.URL { func SignatureFromRSV(r, s string, v byte) []byte { return append(append(hexutil.MustDecode(r), hexutil.MustDecode(s)...), v) } + +// MakeDynamicTx creates a dynamic transaction, used for tests. +func MakeDynamicTx( + client *rpc.EthClient, + priv *ecdsa.PrivateKey, + to *common.Address, + value *big.Int, + data []byte, +) (*types.Transaction, error) { + head, err := client.HeaderByNumber(context.Background(), nil) + if err != nil { + return nil, err + } + + auth, err := bind.NewKeyedTransactorWithChainID(priv, client.ChainID) + if err != nil { + return nil, err + } + + nonce, err := client.PendingNonceAt(context.Background(), auth.From) + if err != nil { + return nil, err + } + + gasTipCap, err := client.SuggestGasTipCap(context.Background()) + if err != nil { + return nil, err + } + + tx, err := auth.Signer(auth.From, types.NewTx(&types.DynamicFeeTx{ + To: to, + Nonce: nonce, + Value: value, + GasTipCap: gasTipCap, + GasFeeCap: new(big.Int).Add( + gasTipCap, + new(big.Int).Mul(head.BaseFee, big.NewInt(2)), + ), + Gas: 2100_000, + Data: data, + })) + if err != nil { + return nil, err + } + if err = client.SendTransaction(context.Background(), tx); err != nil { + return nil, err + } + return tx, nil +} diff --git a/internal/testutils/interfaces.go b/internal/testutils/interfaces.go index 08ea83d29..04d5b9ae8 100644 --- a/internal/testutils/interfaces.go +++ b/internal/testutils/interfaces.go @@ -13,7 +13,6 @@ type CalldataSyncer interface { type Proposer interface { utils.SubcommandApplication ProposeOp(ctx context.Context) error - ProposeEmptyBlockOp(ctx context.Context) error ProposeTxList( ctx context.Context, txListBytes []byte, diff --git a/proposer/config.go b/proposer/config.go index 71d054fe3..df0e55bb6 100644 --- a/proposer/config.go +++ b/proposer/config.go @@ -28,9 +28,9 @@ type Config struct { ProposeInterval time.Duration LocalAddresses []common.Address LocalAddressesOnly bool - BlockMinGasLimit uint64 - BlockMinTxListBytes uint64 - FroceProposingInternal time.Duration + MinGasUsed uint64 + MinTxListBytes uint64 + MinProposingInternal time.Duration MaxProposedTxListsPerEpoch uint64 ProposeBlockTxGasLimit uint64 WaitReceiptTimeout time.Duration @@ -88,17 +88,16 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { TaikoTokenAddress: common.HexToAddress(c.String(flags.TaikoTokenAddress.Name)), Timeout: c.Duration(flags.RPCTimeout.Name), }, - AssignmentHookAddress: common.HexToAddress(c.String(flags.ProposerAssignmentHookAddress.Name)), - L1ProposerPrivKey: l1ProposerPrivKey, - L2SuggestedFeeRecipient: common.HexToAddress(l2SuggestedFeeRecipient), - ExtraData: c.String(flags.ExtraData.Name), - ProposeInterval: c.Duration(flags.ProposeInterval.Name), - LocalAddresses: localAddresses, - LocalAddressesOnly: c.Bool(flags.TxPoolLocalsOnly.Name), - - BlockMinGasLimit: c.Uint64(flags.BlockMinGasLimit.Name), - BlockMinTxListBytes: c.Uint64(flags.BlockMinTxListBytes.Name), - FroceProposingInternal: c.Duration(flags.FroceProposingInternal.Name), + AssignmentHookAddress: common.HexToAddress(c.String(flags.ProposerAssignmentHookAddress.Name)), + L1ProposerPrivKey: l1ProposerPrivKey, + L2SuggestedFeeRecipient: common.HexToAddress(l2SuggestedFeeRecipient), + ExtraData: c.String(flags.ExtraData.Name), + ProposeInterval: c.Duration(flags.ProposeInterval.Name), + LocalAddresses: localAddresses, + LocalAddressesOnly: c.Bool(flags.TxPoolLocalsOnly.Name), + MinGasUsed: c.Uint64(flags.MinGasUsed.Name), + MinTxListBytes: c.Uint64(flags.MinTxListBytes.Name), + MinProposingInternal: c.Duration(flags.MinProposingInternal.Name), MaxProposedTxListsPerEpoch: c.Uint64(flags.MaxProposedTxListsPerEpoch.Name), ProposeBlockTxGasLimit: c.Uint64(flags.TxGasLimit.Name), WaitReceiptTimeout: c.Duration(flags.WaitReceiptTimeout.Name), diff --git a/proposer/config_test.go b/proposer/config_test.go index 3bd616dff..8d57d4605 100644 --- a/proposer/config_test.go +++ b/proposer/config_test.go @@ -100,7 +100,7 @@ func (s *ProposerTestSuite) TestNewConfigFromCliContextL2RecipErr() { "TestNewConfigFromCliContextL2RecipErr", "--" + flags.L1ProposerPrivKey.Name, encoding.GoldenTouchPrivKey, "--" + flags.ProposeInterval.Name, proposeInterval, - "--" + flags.FroceProposingInternal.Name, proposeInterval, + "--" + flags.MinProposingInternal.Name, proposeInterval, "--" + flags.L2SuggestedFeeRecipient.Name, "notAnAddress", }), "invalid L2 suggested fee recipient address") } @@ -115,7 +115,7 @@ func (s *ProposerTestSuite) TestNewConfigFromCliContextTxPoolLocalsErr() { "TestNewConfigFromCliContextTxPoolLocalsErr", "--" + flags.L1ProposerPrivKey.Name, encoding.GoldenTouchPrivKey, "--" + flags.ProposeInterval.Name, proposeInterval, - "--" + flags.FroceProposingInternal.Name, proposeInterval, + "--" + flags.MinProposingInternal.Name, proposeInterval, "--" + flags.L2SuggestedFeeRecipient.Name, goldenTouchAddress.Hex(), "--" + flags.TxPoolLocals.Name, "notAnAddress", }), "invalid account in --txpool.locals") @@ -131,7 +131,7 @@ func (s *ProposerTestSuite) SetupApp() *cli.App { &cli.StringFlag{Name: flags.TaikoTokenAddress.Name}, &cli.StringFlag{Name: flags.L1ProposerPrivKey.Name}, &cli.StringFlag{Name: flags.L2SuggestedFeeRecipient.Name}, - &cli.DurationFlag{Name: flags.FroceProposingInternal.Name}, + &cli.DurationFlag{Name: flags.MinProposingInternal.Name}, &cli.DurationFlag{Name: flags.ProposeInterval.Name}, &cli.StringFlag{Name: flags.TxPoolLocals.Name}, &cli.StringFlag{Name: flags.ProverEndpoints.Name}, diff --git a/proposer/proposer.go b/proposer/proposer.go index 4b7e7ac3b..5d712d475 100644 --- a/proposer/proposer.go +++ b/proposer/proposer.go @@ -63,10 +63,13 @@ type Proposer struct { CustomProposeOpHook func() error AfterCommitHook func() error + lastNonEmptyBlockProposedAt time.Time + txmgr *txmgr.SimpleTxManager - ctx context.Context - wg sync.WaitGroup + ctx context.Context + wg sync.WaitGroup + stopCh chan struct{} } // InitFromCli New initializes the given proposer instance based on the command line flags. @@ -84,6 +87,8 @@ func (p *Proposer) InitFromConfig(ctx context.Context, cfg *Config) (err error) p.proposerAddress = crypto.PubkeyToAddress(cfg.L1ProposerPrivKey.PublicKey) p.ctx = ctx p.Config = cfg + p.lastNonEmptyBlockProposedAt = time.Now() + p.stopCh = make(chan struct{}) // RPC clients if p.rpc, err = rpc.NewClient(p.ctx, cfg.ClientConfig); err != nil { @@ -171,65 +176,34 @@ func (p *Proposer) eventLoop() { p.wg.Done() }() - var lastNonEmptyBlockProposedAt = time.Now() for { p.updateProposingTicker() select { + case <-p.stopCh: + return case <-p.ctx.Done(): return // proposing interval timer has been reached case <-p.proposingTimer.C: - metrics.ProposerProposeEpochCounter.Inc(1) // Attempt propose operation - if err := p.ProposeOp(p.ctx); err != nil { - if !errors.Is(err, errNoNewTxs) { - log.Error("Proposing operation error", "error", err) - continue - } - // If there is always no new transaction and the empty block interval has passed, propose an empty block. - if p.FroceProposingInternal != 0 { - if time.Now().Before(lastNonEmptyBlockProposedAt.Add(p.FroceProposingInternal)) { - continue - } - - if err := p.ProposeEmptyBlockOp(p.ctx); err != nil { - log.Error("Proposing an empty block operation error", "error", err) - } - - lastNonEmptyBlockProposedAt = time.Now() - } - - continue + err := p.ProposeOp(p.ctx) + if err != nil && !errors.Is(err, errNoNewTxs) { + log.Error("Proposing operation error", "error", err) } - - lastNonEmptyBlockProposedAt = time.Now() } } } // Close closes the proposer instance. func (p *Proposer) Close() { + close(p.stopCh) p.wg.Wait() } -// ProposeOp performs a proposing operation, fetching transactions -// from L2 execution engine's tx pool, splitting them by proposing constraints, -// and then proposing them to TaikoL1 contract. -func (p *Proposer) ProposeOp(ctx context.Context) error { - if p.CustomProposeOpHook != nil { - return p.CustomProposeOpHook() - } - - // Wait until L2 execution engine is synced at first. - if err := p.rpc.WaitTillL2ExecutionEngineSynced(ctx); err != nil { - return fmt.Errorf("failed to wait until L2 execution engine synced: %w", err) - } - - log.Info("Start fetching L2 execution engine's transaction pool content") - +func (p *Proposer) getTxLists(allowEmpty bool) ([]types.Transactions, error) { preBuiltTxList, err := p.rpc.GetPoolContent( - ctx, + p.ctx, p.proposerAddress, p.protocolConfigs.BlockMaxGasLimit, rpc.BlockMaxTxListBytes, @@ -237,17 +211,20 @@ func (p *Proposer) ProposeOp(ctx context.Context) error { p.MaxProposedTxListsPerEpoch, ) if err != nil { - return fmt.Errorf("failed to fetch transaction pool content: %w", err) + return nil, fmt.Errorf("failed to fetch transaction pool content: %w", err) } txLists := make([]types.Transactions, 0, len(preBuiltTxList)) for _, txs := range preBuiltTxList { - if txs.EstimatedGasUsed < p.BlockMinGasLimit || - txs.BytesLength < p.BlockMinTxListBytes { + if !allowEmpty && + (txs.EstimatedGasUsed < p.MinGasUsed || txs.BytesLength < p.MinTxListBytes) { break } txLists = append(txLists, txs.TxList) } + if allowEmpty && len(txLists) == 0 { + txLists = append(txLists, types.Transactions{}) + } if p.LocalAddressesOnly { var ( @@ -259,7 +236,7 @@ func (p *Proposer) ProposeOp(ctx context.Context) error { for _, tx := range txs { sender, err := types.Sender(signer, tx) if err != nil { - return err + return nil, err } for _, localAddress := range p.LocalAddresses { @@ -278,6 +255,42 @@ func (p *Proposer) ProposeOp(ctx context.Context) error { log.Info("Transactions lists count", "count", len(txLists)) + return txLists, nil +} + +func (p *Proposer) ProposeOp(ctx context.Context) error { + metrics.ProposerProposeEpochCounter.Inc(1) + // Attempt propose operation + if err := p.proposeOp( + ctx, + !time.Now().Before(p.lastNonEmptyBlockProposedAt.Add(p.MinProposingInternal)), + ); err != nil { + return err + } + p.lastNonEmptyBlockProposedAt = time.Now() + return nil +} + +// ProposeOp performs a proposing operation, fetching transactions +// from L2 execution engine's tx pool, splitting them by proposing constraints, +// and then proposing them to TaikoL1 contract. +func (p *Proposer) proposeOp(ctx context.Context, allowEmpty bool) error { + if p.CustomProposeOpHook != nil { + return p.CustomProposeOpHook() + } + + // Wait until L2 execution engine is synced at first. + if err := p.rpc.WaitTillL2ExecutionEngineSynced(ctx); err != nil { + return fmt.Errorf("failed to wait until L2 execution engine synced: %w", err) + } + + log.Info("Start fetching L2 execution engine's transaction pool content") + + txLists, err := p.getTxLists(allowEmpty) + if err != nil { + return err + } + if len(txLists) == 0 { return errNoNewTxs } @@ -341,18 +354,6 @@ func (p *Proposer) ProposeTxList( return nil } -// ProposeEmptyBlockOp performs a proposing one empty block operation. -func (p *Proposer) ProposeEmptyBlockOp(ctx context.Context) error { - emptyTxListBytes, err := rlp.EncodeToBytes(types.Transactions{}) - if err != nil { - return err - } - if err = p.ProposeTxList(ctx, emptyTxListBytes, 0); err != nil { - return err - } - return nil -} - // updateProposingTicker updates the internal proposing timer. func (p *Proposer) updateProposingTicker() { if p.proposingTimer != nil { diff --git a/proposer/proposer_test.go b/proposer/proposer_test.go index e4e94500c..9be02b8ab 100644 --- a/proposer/proposer_test.go +++ b/proposer/proposer_test.go @@ -2,21 +2,24 @@ package proposer import ( "context" - "math/big" "os" "testing" "time" "github.com/ethereum-optimism/optimism/op-service/txmgr" - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/miner" "github.com/ethereum/go-ethereum/rlp" "github.com/stretchr/testify/suite" "github.com/taikoxyz/taiko-client/bindings" + "github.com/taikoxyz/taiko-client/driver/chain_syncer/beaconsync" + "github.com/taikoxyz/taiko-client/driver/chain_syncer/calldata" + "github.com/taikoxyz/taiko-client/driver/state" txlistfetcher "github.com/taikoxyz/taiko-client/driver/txlist_fetcher" "github.com/taikoxyz/taiko-client/internal/testutils" "github.com/taikoxyz/taiko-client/internal/utils" @@ -26,6 +29,7 @@ import ( type ProposerTestSuite struct { testutils.ClientTestSuite + s *calldata.Syncer p *Proposer cancel context.CancelFunc } @@ -33,6 +37,19 @@ type ProposerTestSuite struct { func (s *ProposerTestSuite) SetupTest() { s.ClientTestSuite.SetupTest() + state2, err := state.New(context.Background(), s.RPCClient) + s.Nil(err) + + syncer, err := calldata.NewSyncer( + context.Background(), + s.RPCClient, + state2, + beaconsync.NewSyncProgressTracker(s.RPCClient.L2, 1*time.Hour), + 0, + ) + s.Nil(err) + s.s = syncer + l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) s.Nil(err) @@ -57,6 +74,7 @@ func (s *ProposerTestSuite) SetupTest() { AssignmentHookAddress: common.HexToAddress(os.Getenv("ASSIGNMENT_HOOK_ADDRESS")), L1ProposerPrivKey: l1ProposerPrivKey, L2SuggestedFeeRecipient: common.HexToAddress(os.Getenv("L2_SUGGESTED_FEE_RECIPIENT")), + MinProposingInternal: 0, ProposeInterval: 1024 * time.Hour, MaxProposedTxListsPerEpoch: 1, WaitReceiptTimeout: 12 * time.Second, @@ -120,102 +138,93 @@ func parseTxs(client *rpc.Client, event *bindings.TaikoL1ClientBlockProposed) (t } func (s *ProposerTestSuite) getLatestProposedTxs( - start uint64, n int, timeout time.Duration, -) ([]types.Transactions, error) { +) (<-chan []types.Transactions, error) { sink := make(chan *bindings.TaikoL1ClientBlockProposed) - - sub, err := s.p.rpc.TaikoL1.WatchBlockProposed(&bind.WatchOpts{ - Start: &start, - }, sink, nil, nil) + sub, err := s.p.rpc.TaikoL1.WatchBlockProposed(nil, sink, nil, nil) if err != nil { return nil, err } - defer sub.Unsubscribe() - - var txLst = make([]types.Transactions, 0, n) - tick := time.After(timeout) - for len(txLst) < cap(txLst) { - select { - case event := <-sink: - txs, err := parseTxs(s.RPCClient, event) - if err != nil { - return nil, err + + var resCh = make(chan []types.Transactions, 1) + go func() { + defer sub.Unsubscribe() + + txLst := make([]types.Transactions, 0, n) + tick := time.After(timeout) + for len(txLst) < cap(txLst) { + select { + case event := <-sink: + txs, err := parseTxs(s.RPCClient, event) + if err != nil { + log.Error("failed to parse txs", "err", err) + } + txLst = append(txLst, txs) + case <-tick: + return } - txLst = append(txLst, txs) - case <-tick: - break } - } + resCh <- txLst + }() - return txLst, nil + return resCh, nil } -func (s *ProposerTestSuite) TestEmptyBlock() { - s.p.FroceProposingInternal = 3 * time.Second - s.p.BlockMinGasLimit = math.MaxUint64 - s.p.BlockMinTxListBytes = math.MaxUint64 - s.p.ProposeInterval = time.Second +func (s *ProposerTestSuite) TestProposeOpEmptyBlock() { + // mint blocks + defer s.Nil(s.s.ProcessL1Blocks(context.Background())) + + p := s.p - number, err := s.RPCClient.L1.BlockNumber(context.Background()) + txsCh, err := s.getLatestProposedTxs(1, time.Minute) s.Nil(err) - // start proposer - s.Nil(s.p.Start()) - defer s.p.Close() + // Start proposer + p.LocalAddressesOnly = false + p.MinGasUsed = math.MaxUint64 + p.MinTxListBytes = math.MaxUint64 + p.MinProposingInternal = 0 + s.Nil(p.ProposeOp(context.Background())) - txs, err := s.getLatestProposedTxs(number, 1, time.Second*30) + // wait result. + txs := <-txsCh s.Nil(err) - s.Equal(true, len(txs) == 1 && len(txs[0]) == 0) + s.Equal(true, len(txs) == 1 && txs[0].Len() == 0) } func (s *ProposerTestSuite) TestProposeOpNoEmptyBlock() { - p := s.p - - head, err := s.RPCClient.L1.HeaderByNumber(context.Background(), nil) - s.Nil(err) - - auth, err := bind.NewKeyedTransactorWithChainID(p.L1ProposerPrivKey, s.RPCClient.L2.ChainID) - s.Nil(err) + defer s.Nil(s.s.ProcessL1Blocks(context.Background())) - nonce, err := s.RPCClient.L2.PendingNonceAt(context.Background(), auth.From) - s.Nil(err) - - gasTipCap, err := s.RPCClient.L2.SuggestGasTipCap(context.Background()) - s.Nil(err) - gasFeeCap := new(big.Int).Add( - gasTipCap, - new(big.Int).Mul(head.BaseFee, big.NewInt(2)), - ) + p := s.p batchSize := 100 + + var err error for i := 0; i < batchSize; i++ { to := common.BytesToAddress(testutils.RandomBytes(32)) - baseTx := types.NewTx(&types.DynamicFeeTx{ - ChainID: s.RPCClient.L2.ChainID, - To: &to, - Nonce: nonce + uint64(i), - GasTipCap: gasTipCap, - GasFeeCap: gasFeeCap, - Gas: 2100000, - }) - tx, err := auth.Signer(auth.From, baseTx) + _, err = testutils.MakeDynamicTx(s.RPCClient.L2, s.TestAddrPrivKey, &to, nil, nil) s.Nil(err) - s.Nil(s.RPCClient.L2.SendTransaction(context.Background(), tx)) } - preBuiltTxList, err := s.RPCClient.GetPoolContent( - context.Background(), - p.proposerAddress, - p.protocolConfigs.BlockMaxGasLimit, - rpc.BlockMaxTxListBytes, - p.LocalAddresses, - p.MaxProposedTxListsPerEpoch, - ) + var preBuiltTxList []*miner.PreBuiltTxList + for i := 0; i < 3 && len(preBuiltTxList) == 0; i++ { + preBuiltTxList, err = s.RPCClient.GetPoolContent( + context.Background(), + p.proposerAddress, + p.protocolConfigs.BlockMaxGasLimit, + rpc.BlockMaxTxListBytes, + p.LocalAddresses, + p.MaxProposedTxListsPerEpoch, + ) + time.Sleep(time.Second) + } s.Nil(err) s.Equal(true, len(preBuiltTxList) > 0) + txsCh, err := s.getLatestProposedTxs(len(preBuiltTxList), time.Minute) + s.Nil(err) + var ( blockMinGasLimit uint64 = math.MaxUint64 blockMinTxListBytes uint64 = math.MaxUint64 @@ -237,21 +246,22 @@ func (s *ProposerTestSuite) TestProposeOpNoEmptyBlock() { // Start proposer p.LocalAddressesOnly = false - p.BlockMinGasLimit = blockMinGasLimit - p.BlockMinTxListBytes = blockMinTxListBytes + p.MinGasUsed = blockMinGasLimit + p.MinTxListBytes = blockMinTxListBytes p.ProposeInterval = time.Second - s.Nil(p.Start()) - defer p.Close() - - txs, err := s.getLatestProposedTxs(head.Number.Uint64(), len(txLists), time.Minute) - s.Nil(err) + p.MinProposingInternal = time.Minute + s.Nil(p.ProposeOp(context.Background())) + txs := <-txsCh for i := 0; i < len(txLists); i++ { s.Equal(txLists[i].Len(), txs[i].Len()) } } func (s *ProposerTestSuite) TestProposeOp() { + // mint blocks + defer s.Nil(s.s.ProcessL1Blocks(context.Background())) + // Propose txs in L2 execution engine's mempool sink := make(chan *bindings.TaikoL1ClientBlockProposed) @@ -262,30 +272,10 @@ func (s *ProposerTestSuite) TestProposeOp() { close(sink) }() - nonce, err := s.p.rpc.L2.PendingNonceAt(context.Background(), s.TestAddr) + to := common.BytesToAddress(testutils.RandomBytes(20)) + _, err = testutils.MakeDynamicTx(s.RPCClient.L2, s.TestAddrPrivKey, &to, nil, nil) s.Nil(err) - parent, err := s.p.rpc.L2.BlockByNumber(context.Background(), nil) - s.Nil(err) - - baseFeeInfo, err := s.p.rpc.TaikoL2.GetBasefee(nil, 1, uint32(parent.GasUsed())) - s.Nil(err) - - to := common.BytesToAddress(testutils.RandomBytes(32)) - tx := types.NewTx(&types.DynamicFeeTx{ - ChainID: s.RPCClient.L2.ChainID, - Nonce: nonce, - GasTipCap: common.Big0, - GasFeeCap: new(big.Int).SetUint64(baseFeeInfo.Basefee.Uint64() * 2), - Gas: 21000, - To: &to, - Value: common.Big1, - }) - - signedTx, err := types.SignTx(tx, types.LatestSignerForChainID(s.p.rpc.L2.ChainID), s.TestAddrPrivKey) - s.Nil(err) - s.Nil(s.p.rpc.L2.SendTransaction(context.Background(), signedTx)) - s.Nil(s.p.ProposeOp(context.Background())) event := <-sink @@ -315,13 +305,10 @@ func (s *ProposerTestSuite) TestProposeOpLocalsOnly() { close(sink) }() + s.p.MinProposingInternal = 1 * time.Hour s.Error(errNoNewTxs, s.p.ProposeOp(context.Background())) } -func (s *ProposerTestSuite) TestProposeEmptyBlockOp() { - s.Nil(s.p.ProposeEmptyBlockOp(context.Background())) -} - func (s *ProposerTestSuite) TestCustomProposeOpHook() { flag := false From 7715fc451ef146afd9993e261039dddac98aeaf4 Mon Sep 17 00:00:00 2001 From: David Date: Thu, 4 Apr 2024 17:17:21 +0800 Subject: [PATCH 06/14] test: update tests --- .github/workflows/test.yml | 1 - driver/chain_syncer/calldata/syncer_test.go | 7 +++++++ driver/driver_test.go | 6 ++++++ internal/docker/nodes/docker-compose.yml | 2 +- internal/testutils/helper.go | 17 ++++++--------- pkg/rpc/engine.go | 8 +++---- pkg/rpc/methods.go | 6 ++++-- pkg/rpc/methods_test.go | 21 ------------------- proposer/proposer_test.go | 4 ++-- .../event_handler/transition_proved_test.go | 2 ++ prover/prover_test.go | 2 ++ 11 files changed, 34 insertions(+), 42 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8fa9319ff..d4a2b5d97 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -45,7 +45,6 @@ jobs: with: repository: taikoxyz/taiko-mono path: ${{ env.TAIKO_MONO_DIR }} - ref: revert_change - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 diff --git a/driver/chain_syncer/calldata/syncer_test.go b/driver/chain_syncer/calldata/syncer_test.go index a8def4541..5a2cc346b 100644 --- a/driver/chain_syncer/calldata/syncer_test.go +++ b/driver/chain_syncer/calldata/syncer_test.go @@ -18,6 +18,7 @@ import ( "github.com/taikoxyz/taiko-client/driver/state" "github.com/taikoxyz/taiko-client/internal/testutils" "github.com/taikoxyz/taiko-client/internal/utils" + "github.com/taikoxyz/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-client/pkg/rpc" "github.com/taikoxyz/taiko-client/proposer" ) @@ -189,10 +190,16 @@ func (s *CalldataSyncerTestSuite) initProposer() { l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) s.Nil(err) + jwtSecret, err := jwt.ParseSecretFromFile(os.Getenv("JWT_SECRET")) + s.Nil(err) + s.NotEmpty(jwtSecret) + s.Nil(prop.InitFromConfig(context.Background(), &proposer.Config{ ClientConfig: &rpc.ClientConfig{ L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), + L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + JwtSecret: string(jwtSecret), TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), diff --git a/driver/driver_test.go b/driver/driver_test.go index ab05e80ba..11745e58d 100644 --- a/driver/driver_test.go +++ b/driver/driver_test.go @@ -287,6 +287,10 @@ func (s *DriverTestSuite) TestL1Current() { func (s *DriverTestSuite) InitProposer() { p := new(proposer.Proposer) + jwtSecret, err := jwt.ParseSecretFromFile(os.Getenv("JWT_SECRET")) + s.Nil(err) + s.NotEmpty(jwtSecret) + l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) s.Nil(err) @@ -294,6 +298,8 @@ func (s *DriverTestSuite) InitProposer() { ClientConfig: &rpc.ClientConfig{ L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), + L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + JwtSecret: string(jwtSecret), TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), diff --git a/internal/docker/nodes/docker-compose.yml b/internal/docker/nodes/docker-compose.yml index ba7d6498b..711b3a081 100644 --- a/internal/docker/nodes/docker-compose.yml +++ b/internal/docker/nodes/docker-compose.yml @@ -17,7 +17,7 @@ services: l2_execution_engine: container_name: l2_node - image: gcr.io/evmchain/taiko-geth:sha-840bcff + image: gcr.io/evmchain/taiko-geth:taiko restart: unless-stopped pull_policy: always volumes: diff --git a/internal/testutils/helper.go b/internal/testutils/helper.go index 1552b9ed4..6f6418498 100644 --- a/internal/testutils/helper.go +++ b/internal/testutils/helper.go @@ -33,15 +33,10 @@ func (s *ClientTestSuite) ProposeInvalidTxListBytes(proposer Proposer) { s.Nil(proposer.ProposeTxList(context.Background(), invalidTxListBytes, 1)) } -func (s *ClientTestSuite) proposeEmptyBlockOp(ctx context.Context, proposer Proposer) error { +func (s *ClientTestSuite) proposeEmptyBlockOp(ctx context.Context, proposer Proposer) { emptyTxListBytes, err := rlp.EncodeToBytes(types.Transactions{}) - if err != nil { - return err - } - if err = proposer.ProposeTxList(ctx, emptyTxListBytes, 0); err != nil { - return err - } - return nil + s.Nil(err) + s.Nil(proposer.ProposeTxList(ctx, emptyTxListBytes, 0)) } func (s *ClientTestSuite) ProposeAndInsertEmptyBlocks( @@ -72,7 +67,7 @@ func (s *ClientTestSuite) ProposeAndInsertEmptyBlocks( s.ProposeInvalidTxListBytes(proposer) // Random bytes txList - s.Nil(s.proposeEmptyBlockOp(context.Background(), proposer)) + s.proposeEmptyBlockOp(context.Background(), proposer) events = append(events, []*bindings.TaikoL1ClientBlockProposed{<-sink, <-sink, <-sink}...) @@ -314,8 +309,8 @@ func SignatureFromRSV(r, s string, v byte) []byte { return append(append(hexutil.MustDecode(r), hexutil.MustDecode(s)...), v) } -// MakeDynamicTx creates a dynamic transaction, used for tests. -func MakeDynamicTx( +// SendDynamicFeeTx sends a dynamic transaction, used for tests. +func SendDynamicFeeTx( client *rpc.EthClient, priv *ecdsa.PrivateKey, to *common.Address, diff --git a/pkg/rpc/engine.go b/pkg/rpc/engine.go index c03a71c0b..b1bb2c753 100644 --- a/pkg/rpc/engine.go +++ b/pkg/rpc/engine.go @@ -99,6 +99,7 @@ func (c *EngineClient) ExchangeTransitionConfiguration( return result, nil } +// TxPoolContent fetches the transaction pool content from the L2 execution engine. func (c *EngineClient) TxPoolContent( ctx context.Context, beneficiary common.Address, @@ -111,8 +112,8 @@ func (c *EngineClient) TxPoolContent( timeoutCtx, cancel := context.WithTimeout(ctx, defaultTimeout) defer cancel() - result := make([]*miner.PreBuiltTxList, 0) - err := c.CallContext( + var result []*miner.PreBuiltTxList + if err := c.CallContext( timeoutCtx, &result, "taikoAuth_txPoolContent", @@ -122,8 +123,7 @@ func (c *EngineClient) TxPoolContent( maxBytesPerTxList, locals, maxTransactionsLists, - ) - if err != nil { + ); err != nil { return nil, err } return result, nil diff --git a/pkg/rpc/methods.go b/pkg/rpc/methods.go index b1a5ad964..7cfbc1527 100644 --- a/pkg/rpc/methods.go +++ b/pkg/rpc/methods.go @@ -267,12 +267,14 @@ func (c *Client) GetPoolContent( } return c.L2Engine.TxPoolContent( - ctxWithTimeout, beneficiary, + ctxWithTimeout, + beneficiary, baseFeeInfo.Basefee, uint64(blockMaxGasLimit), maxBytesPerTxList, localsArg, - maxTransactionsLists) + maxTransactionsLists, + ) } // L2AccountNonce fetches the nonce of the given L2 account at a specified height. diff --git a/pkg/rpc/methods_test.go b/pkg/rpc/methods_test.go index 4cc388b80..599957202 100644 --- a/pkg/rpc/methods_test.go +++ b/pkg/rpc/methods_test.go @@ -115,27 +115,6 @@ func TestWaitTillL2ExecutionEngineSyncedContextErr(t *testing.T) { require.ErrorContains(t, err, "context canceled") } -func TestGetPoolContentValid(t *testing.T) { - client := newTestClient(t) - configs, err := client.TaikoL1.GetConfig(&bind.CallOpts{Context: context.Background()}) - require.Nil(t, err) - goldenTouchAddress, err := client.TaikoL2.GOLDENTOUCHADDRESS(nil) - require.Nil(t, err) - gasLimit := configs.BlockMaxGasLimit - - txPools := []common.Address{goldenTouchAddress} - - _, err2 := client.GetPoolContent( - context.Background(), - goldenTouchAddress, - gasLimit, - BlockMaxTxListBytes, - txPools, - 4, - ) - require.Nil(t, err2) -} - // randomHash generates a random blob of data and returns it as a hash. func randomHash() common.Hash { var hash common.Hash diff --git a/proposer/proposer_test.go b/proposer/proposer_test.go index 690e643bc..5c3822bb2 100644 --- a/proposer/proposer_test.go +++ b/proposer/proposer_test.go @@ -202,7 +202,7 @@ func (s *ProposerTestSuite) TestProposeOpNoEmptyBlock() { var err error for i := 0; i < batchSize; i++ { to := common.BytesToAddress(testutils.RandomBytes(32)) - _, err = testutils.MakeDynamicTx(s.RPCClient.L2, s.TestAddrPrivKey, &to, nil, nil) + _, err = testutils.SendDynamicFeeTx(s.RPCClient.L2, s.TestAddrPrivKey, &to, nil, nil) s.Nil(err) } @@ -272,7 +272,7 @@ func (s *ProposerTestSuite) TestProposeOp() { }() to := common.BytesToAddress(testutils.RandomBytes(20)) - _, err = testutils.MakeDynamicTx(s.RPCClient.L2, s.TestAddrPrivKey, &to, nil, nil) + _, err = testutils.SendDynamicFeeTx(s.RPCClient.L2, s.TestAddrPrivKey, &to, nil, nil) s.Nil(err) s.Nil(s.p.ProposeOp(context.Background())) diff --git a/prover/event_handler/transition_proved_test.go b/prover/event_handler/transition_proved_test.go index 4b10e36d4..995931da5 100644 --- a/prover/event_handler/transition_proved_test.go +++ b/prover/event_handler/transition_proved_test.go @@ -76,6 +76,8 @@ func (s *EventHandlerTestSuite) SetupTest() { ClientConfig: &rpc.ClientConfig{ L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), + L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + JwtSecret: string(jwtSecret), TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), diff --git a/prover/prover_test.go b/prover/prover_test.go index 69a4367ee..bcf38376f 100644 --- a/prover/prover_test.go +++ b/prover/prover_test.go @@ -76,6 +76,8 @@ func (s *ProverTestSuite) SetupTest() { ClientConfig: &rpc.ClientConfig{ L1Endpoint: os.Getenv("L1_NODE_WS_ENDPOINT"), L2Endpoint: os.Getenv("L2_EXECUTION_ENGINE_WS_ENDPOINT"), + L2EngineEndpoint: os.Getenv("L2_EXECUTION_ENGINE_AUTH_ENDPOINT"), + JwtSecret: string(jwtSecret), TaikoL1Address: common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), TaikoL2Address: common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), TaikoTokenAddress: common.HexToAddress(os.Getenv("TAIKO_TOKEN_ADDRESS")), From 2e4caa9a210b3ec934942637a31afab9931be7e3 Mon Sep 17 00:00:00 2001 From: David Date: Thu, 4 Apr 2024 17:52:06 +0800 Subject: [PATCH 07/14] feat: update bindings --- bindings/.githead | 2 +- bindings/encoding/input.go | 6 - bindings/gen_lib_depositing.go | 315 -------------------------- bindings/gen_lib_verifying.go | 2 +- bindings/gen_taiko_l1.go | 401 +++++++++++++++------------------ proposer/proposer.go | 74 +++--- proposer/proposer_test.go | 30 --- scripts/gen_bindings.sh | 4 - 8 files changed, 221 insertions(+), 613 deletions(-) delete mode 100644 bindings/gen_lib_depositing.go diff --git a/bindings/.githead b/bindings/.githead index cd39ac859..0f5e09780 100644 --- a/bindings/.githead +++ b/bindings/.githead @@ -1 +1 @@ -e61efa6e88cdb5c8ac32d98743f23d8df0a2b662 +2c311e1aea456bca815f8cbbe42b2f5810d0db9f diff --git a/bindings/encoding/input.go b/bindings/encoding/input.go index fead02380..327e409ea 100644 --- a/bindings/encoding/input.go +++ b/bindings/encoding/input.go @@ -242,7 +242,6 @@ var ( TaikoL2ABI *abi.ABI TaikoTokenABI *abi.ABI GuardianProverABI *abi.ABI - LibDepositingABI *abi.ABI LibProposingABI *abi.ABI LibProvingABI *abi.ABI LibUtilsABI *abi.ABI @@ -273,10 +272,6 @@ func init() { log.Crit("Get GuardianProver ABI error", "error", err) } - if LibDepositingABI, err = bindings.LibDepositingMetaData.GetAbi(); err != nil { - log.Crit("Get LibDepositing ABI error", "error", err) - } - if LibProposingABI, err = bindings.LibProposingMetaData.GetAbi(); err != nil { log.Crit("Get LibProposing ABI error", "error", err) } @@ -309,7 +304,6 @@ func init() { TaikoL1ABI.Errors, TaikoL2ABI.Errors, GuardianProverABI.Errors, - LibDepositingABI.Errors, LibProposingABI.Errors, LibProvingABI.Errors, LibUtilsABI.Errors, diff --git a/bindings/gen_lib_depositing.go b/bindings/gen_lib_depositing.go deleted file mode 100644 index 2c3a275cb..000000000 --- a/bindings/gen_lib_depositing.go +++ /dev/null @@ -1,315 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package bindings - -import ( - "errors" - "math/big" - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = ethereum.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -// LibDepositingMetaData contains all meta data concerning the LibDepositing contract. -var LibDepositingMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"event\",\"name\":\"EthDeposited\",\"inputs\":[{\"name\":\"deposit\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_INVALID_ETH_DEPOSIT\",\"inputs\":[]}]", -} - -// LibDepositingABI is the input ABI used to generate the binding from. -// Deprecated: Use LibDepositingMetaData.ABI instead. -var LibDepositingABI = LibDepositingMetaData.ABI - -// LibDepositing is an auto generated Go binding around an Ethereum contract. -type LibDepositing struct { - LibDepositingCaller // Read-only binding to the contract - LibDepositingTransactor // Write-only binding to the contract - LibDepositingFilterer // Log filterer for contract events -} - -// LibDepositingCaller is an auto generated read-only Go binding around an Ethereum contract. -type LibDepositingCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// LibDepositingTransactor is an auto generated write-only Go binding around an Ethereum contract. -type LibDepositingTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// LibDepositingFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type LibDepositingFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// LibDepositingSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type LibDepositingSession struct { - Contract *LibDepositing // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// LibDepositingCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type LibDepositingCallerSession struct { - Contract *LibDepositingCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// LibDepositingTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type LibDepositingTransactorSession struct { - Contract *LibDepositingTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// LibDepositingRaw is an auto generated low-level Go binding around an Ethereum contract. -type LibDepositingRaw struct { - Contract *LibDepositing // Generic contract binding to access the raw methods on -} - -// LibDepositingCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type LibDepositingCallerRaw struct { - Contract *LibDepositingCaller // Generic read-only contract binding to access the raw methods on -} - -// LibDepositingTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type LibDepositingTransactorRaw struct { - Contract *LibDepositingTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewLibDepositing creates a new instance of LibDepositing, bound to a specific deployed contract. -func NewLibDepositing(address common.Address, backend bind.ContractBackend) (*LibDepositing, error) { - contract, err := bindLibDepositing(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &LibDepositing{LibDepositingCaller: LibDepositingCaller{contract: contract}, LibDepositingTransactor: LibDepositingTransactor{contract: contract}, LibDepositingFilterer: LibDepositingFilterer{contract: contract}}, nil -} - -// NewLibDepositingCaller creates a new read-only instance of LibDepositing, bound to a specific deployed contract. -func NewLibDepositingCaller(address common.Address, caller bind.ContractCaller) (*LibDepositingCaller, error) { - contract, err := bindLibDepositing(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &LibDepositingCaller{contract: contract}, nil -} - -// NewLibDepositingTransactor creates a new write-only instance of LibDepositing, bound to a specific deployed contract. -func NewLibDepositingTransactor(address common.Address, transactor bind.ContractTransactor) (*LibDepositingTransactor, error) { - contract, err := bindLibDepositing(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &LibDepositingTransactor{contract: contract}, nil -} - -// NewLibDepositingFilterer creates a new log filterer instance of LibDepositing, bound to a specific deployed contract. -func NewLibDepositingFilterer(address common.Address, filterer bind.ContractFilterer) (*LibDepositingFilterer, error) { - contract, err := bindLibDepositing(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &LibDepositingFilterer{contract: contract}, nil -} - -// bindLibDepositing binds a generic wrapper to an already deployed contract. -func bindLibDepositing(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := LibDepositingMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_LibDepositing *LibDepositingRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _LibDepositing.Contract.LibDepositingCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_LibDepositing *LibDepositingRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LibDepositing.Contract.LibDepositingTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_LibDepositing *LibDepositingRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _LibDepositing.Contract.LibDepositingTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_LibDepositing *LibDepositingCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _LibDepositing.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_LibDepositing *LibDepositingTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _LibDepositing.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_LibDepositing *LibDepositingTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _LibDepositing.Contract.contract.Transact(opts, method, params...) -} - -// LibDepositingEthDepositedIterator is returned from FilterEthDeposited and is used to iterate over the raw logs and unpacked data for EthDeposited events raised by the LibDepositing contract. -type LibDepositingEthDepositedIterator struct { - Event *LibDepositingEthDeposited // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *LibDepositingEthDepositedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(LibDepositingEthDeposited) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(LibDepositingEthDeposited) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *LibDepositingEthDepositedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *LibDepositingEthDepositedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// LibDepositingEthDeposited represents a EthDeposited event raised by the LibDepositing contract. -type LibDepositingEthDeposited struct { - Deposit TaikoDataEthDeposit - Raw types.Log // Blockchain specific contextual infos -} - -// FilterEthDeposited is a free log retrieval operation binding the contract event 0x7120a3b075ad25974c5eed76dedb3a217c76c9c6d1f1e201caeba9b89de9a9d9. -// -// Solidity: event EthDeposited((address,uint96,uint64) deposit) -func (_LibDepositing *LibDepositingFilterer) FilterEthDeposited(opts *bind.FilterOpts) (*LibDepositingEthDepositedIterator, error) { - - logs, sub, err := _LibDepositing.contract.FilterLogs(opts, "EthDeposited") - if err != nil { - return nil, err - } - return &LibDepositingEthDepositedIterator{contract: _LibDepositing.contract, event: "EthDeposited", logs: logs, sub: sub}, nil -} - -// WatchEthDeposited is a free log subscription operation binding the contract event 0x7120a3b075ad25974c5eed76dedb3a217c76c9c6d1f1e201caeba9b89de9a9d9. -// -// Solidity: event EthDeposited((address,uint96,uint64) deposit) -func (_LibDepositing *LibDepositingFilterer) WatchEthDeposited(opts *bind.WatchOpts, sink chan<- *LibDepositingEthDeposited) (event.Subscription, error) { - - logs, sub, err := _LibDepositing.contract.WatchLogs(opts, "EthDeposited") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(LibDepositingEthDeposited) - if err := _LibDepositing.contract.UnpackLog(event, "EthDeposited", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseEthDeposited is a log parse operation binding the contract event 0x7120a3b075ad25974c5eed76dedb3a217c76c9c6d1f1e201caeba9b89de9a9d9. -// -// Solidity: event EthDeposited((address,uint96,uint64) deposit) -func (_LibDepositing *LibDepositingFilterer) ParseEthDeposited(log types.Log) (*LibDepositingEthDeposited, error) { - event := new(LibDepositingEthDeposited) - if err := _LibDepositing.contract.UnpackLog(event, "EthDeposited", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} diff --git a/bindings/gen_lib_verifying.go b/bindings/gen_lib_verifying.go index eeee70bf8..46eaa1092 100644 --- a/bindings/gen_lib_verifying.go +++ b/bindings/gen_lib_verifying.go @@ -31,7 +31,7 @@ var ( // LibVerifyingMetaData contains all meta data concerning the LibVerifying contract. var LibVerifyingMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reserved2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]}]", + ABI: "[{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]}]", } // LibVerifyingABI is the input ABI used to generate the binding from. diff --git a/bindings/gen_taiko_l1.go b/bindings/gen_taiko_l1.go index 6258efbba..6a3df349a 100644 --- a/bindings/gen_taiko_l1.go +++ b/bindings/gen_taiko_l1.go @@ -67,13 +67,6 @@ type TaikoDataConfig struct { MaxBlocksToVerifyPerProposal uint64 BlockMaxGasLimit uint32 LivenessBond *big.Int - EthDepositRingBufferSize *big.Int - EthDepositMinCountPerBlock uint64 - EthDepositMaxCountPerBlock uint64 - EthDepositMinAmount *big.Int - EthDepositMaxAmount *big.Int - EthDepositGas *big.Int - EthDepositMaxFee *big.Int BlockSyncThreshold uint8 } @@ -86,10 +79,10 @@ type TaikoDataEthDeposit struct { // TaikoDataSlotA is an auto generated low-level Go binding around an user-defined struct. type TaikoDataSlotA struct { - GenesisHeight uint64 - GenesisTimestamp uint64 - NumEthDeposits uint64 - NextEthDepositToProcess uint64 + GenesisHeight uint64 + GenesisTimestamp uint64 + ReservedA1 uint64 + ReservedA2 uint64 } // TaikoDataSlotB is an auto generated low-level Go binding around an user-defined struct. @@ -97,9 +90,9 @@ type TaikoDataSlotB struct { NumBlocks uint64 LastVerifiedBlockId uint64 ProvingPaused bool - Reserved1 uint8 - Reserved2 uint16 - Reserved3 uint32 + ReservedB1 uint8 + ReservedB2 uint16 + ReservedB3 uint32 LastUnpausedAt uint64 } @@ -127,7 +120,7 @@ type TaikoDataTransitionState struct { // TaikoL1ClientMetaData contains all meta data concerning the TaikoL1Client contract. var TaikoL1ClientMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canDepositEthToL2\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositEtherToL2\",\"inputs\":[{\"name\":\"_recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"ts_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerifyPerProposal\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"ethDepositRingBufferSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ethDepositMinCountPerBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"ethDepositMaxCountPerBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"ethDepositMinAmount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"ethDepositMaxAmount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"ethDepositGas\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ethDepositMaxFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"blockSyncThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"a_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"numEthDeposits\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextEthDepositToProcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"b_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reserved2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlock\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"deposits_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"numEthDeposits\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextEthDepositToProcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reserved2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EthDeposited\",\"inputs\":[{\"name\":\"deposit\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EthDeposited\",\"inputs\":[{\"name\":\"deposit\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reserved2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reserved2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ASSIGNED_PROVER_NOT_ALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ASSIGNED_PROVER_NOT_ALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_ETH_DEPOSIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_ETH_DEPOSIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_MISSING_VERIFIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_MISSING_VERIFIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROPOSER_NOT_EOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROPOSER_NOT_EOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_TIERS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]}]", + ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"ts_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerifyPerProposal\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockSyncThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"a_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"__reservedA1\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"__reservedA2\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"b_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlock\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"deposits_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"__reserve1\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"__reservedA1\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"__reservedA2\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EthDeposited\",\"inputs\":[{\"name\":\"deposit\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ASSIGNED_PROVER_NOT_ALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ASSIGNED_PROVER_NOT_ALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_MISSING_VERIFIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_MISSING_VERIFIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROPOSER_NOT_EOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROPOSER_NOT_EOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_TIERS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]}]", } // TaikoL1ClientABI is the input ABI used to generate the binding from. @@ -307,37 +300,6 @@ func (_TaikoL1Client *TaikoL1ClientCallerSession) AddressManager() (common.Addre return _TaikoL1Client.Contract.AddressManager(&_TaikoL1Client.CallOpts) } -// CanDepositEthToL2 is a free data retrieval call binding the contract method 0xcf151d9a. -// -// Solidity: function canDepositEthToL2(uint256 _amount) view returns(bool) -func (_TaikoL1Client *TaikoL1ClientCaller) CanDepositEthToL2(opts *bind.CallOpts, _amount *big.Int) (bool, error) { - var out []interface{} - err := _TaikoL1Client.contract.Call(opts, &out, "canDepositEthToL2", _amount) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// CanDepositEthToL2 is a free data retrieval call binding the contract method 0xcf151d9a. -// -// Solidity: function canDepositEthToL2(uint256 _amount) view returns(bool) -func (_TaikoL1Client *TaikoL1ClientSession) CanDepositEthToL2(_amount *big.Int) (bool, error) { - return _TaikoL1Client.Contract.CanDepositEthToL2(&_TaikoL1Client.CallOpts, _amount) -} - -// CanDepositEthToL2 is a free data retrieval call binding the contract method 0xcf151d9a. -// -// Solidity: function canDepositEthToL2(uint256 _amount) view returns(bool) -func (_TaikoL1Client *TaikoL1ClientCallerSession) CanDepositEthToL2(_amount *big.Int) (bool, error) { - return _TaikoL1Client.Contract.CanDepositEthToL2(&_TaikoL1Client.CallOpts, _amount) -} - // GetBlock is a free data retrieval call binding the contract method 0x5fa15e79. // // Solidity: function getBlock(uint64 _blockId) view returns((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) blk_, (bytes32,bytes32,bytes32,address,uint96,address,uint96,uint64,uint16,uint8) ts_) @@ -385,7 +347,7 @@ func (_TaikoL1Client *TaikoL1ClientCallerSession) GetBlock(_blockId uint64) (str // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint256,uint64,uint64,uint96,uint96,uint256,uint256,uint8)) +// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) func (_TaikoL1Client *TaikoL1ClientCaller) GetConfig(opts *bind.CallOpts) (TaikoDataConfig, error) { var out []interface{} err := _TaikoL1Client.contract.Call(opts, &out, "getConfig") @@ -402,14 +364,14 @@ func (_TaikoL1Client *TaikoL1ClientCaller) GetConfig(opts *bind.CallOpts) (Taiko // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint256,uint64,uint64,uint96,uint96,uint256,uint256,uint8)) +// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) func (_TaikoL1Client *TaikoL1ClientSession) GetConfig() (TaikoDataConfig, error) { return _TaikoL1Client.Contract.GetConfig(&_TaikoL1Client.CallOpts) } // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint256,uint64,uint64,uint96,uint96,uint256,uint256,uint8)) +// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint8)) func (_TaikoL1Client *TaikoL1ClientCallerSession) GetConfig() (TaikoDataConfig, error) { return _TaikoL1Client.Contract.GetConfig(&_TaikoL1Client.CallOpts) } @@ -709,24 +671,27 @@ func (_TaikoL1Client *TaikoL1ClientCallerSession) Resolve0(_name [32]byte, _allo // State is a free data retrieval call binding the contract method 0xc19d93fb. // -// Solidity: function state() view returns((uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) +// Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) func (_TaikoL1Client *TaikoL1ClientCaller) State(opts *bind.CallOpts) (struct { - SlotA TaikoDataSlotA - SlotB TaikoDataSlotB + Reserve1 [32]byte + SlotA TaikoDataSlotA + SlotB TaikoDataSlotB }, error) { var out []interface{} err := _TaikoL1Client.contract.Call(opts, &out, "state") outstruct := new(struct { - SlotA TaikoDataSlotA - SlotB TaikoDataSlotB + Reserve1 [32]byte + SlotA TaikoDataSlotA + SlotB TaikoDataSlotB }) if err != nil { return *outstruct, err } - outstruct.SlotA = *abi.ConvertType(out[0], new(TaikoDataSlotA)).(*TaikoDataSlotA) - outstruct.SlotB = *abi.ConvertType(out[1], new(TaikoDataSlotB)).(*TaikoDataSlotB) + outstruct.Reserve1 = *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + outstruct.SlotA = *abi.ConvertType(out[1], new(TaikoDataSlotA)).(*TaikoDataSlotA) + outstruct.SlotB = *abi.ConvertType(out[2], new(TaikoDataSlotB)).(*TaikoDataSlotB) return *outstruct, err @@ -734,20 +699,22 @@ func (_TaikoL1Client *TaikoL1ClientCaller) State(opts *bind.CallOpts) (struct { // State is a free data retrieval call binding the contract method 0xc19d93fb. // -// Solidity: function state() view returns((uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) +// Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) func (_TaikoL1Client *TaikoL1ClientSession) State() (struct { - SlotA TaikoDataSlotA - SlotB TaikoDataSlotB + Reserve1 [32]byte + SlotA TaikoDataSlotA + SlotB TaikoDataSlotB }, error) { return _TaikoL1Client.Contract.State(&_TaikoL1Client.CallOpts) } // State is a free data retrieval call binding the contract method 0xc19d93fb. // -// Solidity: function state() view returns((uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) +// Solidity: function state() view returns(bytes32 __reserve1, (uint64,uint64,uint64,uint64) slotA, (uint64,uint64,bool,uint8,uint16,uint32,uint64) slotB) func (_TaikoL1Client *TaikoL1ClientCallerSession) State() (struct { - SlotA TaikoDataSlotA - SlotB TaikoDataSlotB + Reserve1 [32]byte + SlotA TaikoDataSlotA + SlotB TaikoDataSlotB }, error) { return _TaikoL1Client.Contract.State(&_TaikoL1Client.CallOpts) } @@ -773,27 +740,6 @@ func (_TaikoL1Client *TaikoL1ClientTransactorSession) AcceptOwnership() (*types. return _TaikoL1Client.Contract.AcceptOwnership(&_TaikoL1Client.TransactOpts) } -// DepositEtherToL2 is a paid mutator transaction binding the contract method 0x047a289d. -// -// Solidity: function depositEtherToL2(address _recipient) payable returns() -func (_TaikoL1Client *TaikoL1ClientTransactor) DepositEtherToL2(opts *bind.TransactOpts, _recipient common.Address) (*types.Transaction, error) { - return _TaikoL1Client.contract.Transact(opts, "depositEtherToL2", _recipient) -} - -// DepositEtherToL2 is a paid mutator transaction binding the contract method 0x047a289d. -// -// Solidity: function depositEtherToL2(address _recipient) payable returns() -func (_TaikoL1Client *TaikoL1ClientSession) DepositEtherToL2(_recipient common.Address) (*types.Transaction, error) { - return _TaikoL1Client.Contract.DepositEtherToL2(&_TaikoL1Client.TransactOpts, _recipient) -} - -// DepositEtherToL2 is a paid mutator transaction binding the contract method 0x047a289d. -// -// Solidity: function depositEtherToL2(address _recipient) payable returns() -func (_TaikoL1Client *TaikoL1ClientTransactorSession) DepositEtherToL2(_recipient common.Address) (*types.Transaction, error) { - return _TaikoL1Client.Contract.DepositEtherToL2(&_TaikoL1Client.TransactOpts, _recipient) -} - // Init is a paid mutator transaction binding the contract method 0x347258aa. // // Solidity: function init(address _owner, address _addressManager, bytes32 _genesisBlockHash) returns() @@ -815,6 +761,27 @@ func (_TaikoL1Client *TaikoL1ClientTransactorSession) Init(_owner common.Address return _TaikoL1Client.Contract.Init(&_TaikoL1Client.TransactOpts, _owner, _addressManager, _genesisBlockHash) } +// Init2 is a paid mutator transaction binding the contract method 0x069489a2. +// +// Solidity: function init2() returns() +func (_TaikoL1Client *TaikoL1ClientTransactor) Init2(opts *bind.TransactOpts) (*types.Transaction, error) { + return _TaikoL1Client.contract.Transact(opts, "init2") +} + +// Init2 is a paid mutator transaction binding the contract method 0x069489a2. +// +// Solidity: function init2() returns() +func (_TaikoL1Client *TaikoL1ClientSession) Init2() (*types.Transaction, error) { + return _TaikoL1Client.Contract.Init2(&_TaikoL1Client.TransactOpts) +} + +// Init2 is a paid mutator transaction binding the contract method 0x069489a2. +// +// Solidity: function init2() returns() +func (_TaikoL1Client *TaikoL1ClientTransactorSession) Init2() (*types.Transaction, error) { + return _TaikoL1Client.Contract.Init2(&_TaikoL1Client.TransactOpts) +} + // Pause is a paid mutator transaction binding the contract method 0x8456cb59. // // Solidity: function pause() returns() @@ -2103,140 +2070,6 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) ParseEthDeposited(log types.Log) (* return event, nil } -// TaikoL1ClientEthDeposited0Iterator is returned from FilterEthDeposited0 and is used to iterate over the raw logs and unpacked data for EthDeposited0 events raised by the TaikoL1Client contract. -type TaikoL1ClientEthDeposited0Iterator struct { - Event *TaikoL1ClientEthDeposited0 // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *TaikoL1ClientEthDeposited0Iterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(TaikoL1ClientEthDeposited0) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(TaikoL1ClientEthDeposited0) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *TaikoL1ClientEthDeposited0Iterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *TaikoL1ClientEthDeposited0Iterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// TaikoL1ClientEthDeposited0 represents a EthDeposited0 event raised by the TaikoL1Client contract. -type TaikoL1ClientEthDeposited0 struct { - Deposit TaikoDataEthDeposit - Raw types.Log // Blockchain specific contextual infos -} - -// FilterEthDeposited0 is a free log retrieval operation binding the contract event 0x7120a3b075ad25974c5eed76dedb3a217c76c9c6d1f1e201caeba9b89de9a9d9. -// -// Solidity: event EthDeposited((address,uint96,uint64) deposit) -func (_TaikoL1Client *TaikoL1ClientFilterer) FilterEthDeposited0(opts *bind.FilterOpts) (*TaikoL1ClientEthDeposited0Iterator, error) { - - logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "EthDeposited0") - if err != nil { - return nil, err - } - return &TaikoL1ClientEthDeposited0Iterator{contract: _TaikoL1Client.contract, event: "EthDeposited0", logs: logs, sub: sub}, nil -} - -// WatchEthDeposited0 is a free log subscription operation binding the contract event 0x7120a3b075ad25974c5eed76dedb3a217c76c9c6d1f1e201caeba9b89de9a9d9. -// -// Solidity: event EthDeposited((address,uint96,uint64) deposit) -func (_TaikoL1Client *TaikoL1ClientFilterer) WatchEthDeposited0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientEthDeposited0) (event.Subscription, error) { - - logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "EthDeposited0") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(TaikoL1ClientEthDeposited0) - if err := _TaikoL1Client.contract.UnpackLog(event, "EthDeposited0", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseEthDeposited0 is a log parse operation binding the contract event 0x7120a3b075ad25974c5eed76dedb3a217c76c9c6d1f1e201caeba9b89de9a9d9. -// -// Solidity: event EthDeposited((address,uint96,uint64) deposit) -func (_TaikoL1Client *TaikoL1ClientFilterer) ParseEthDeposited0(log types.Log) (*TaikoL1ClientEthDeposited0, error) { - event := new(TaikoL1ClientEthDeposited0) - if err := _TaikoL1Client.contract.UnpackLog(event, "EthDeposited0", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // TaikoL1ClientInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the TaikoL1Client contract. type TaikoL1ClientInitializedIterator struct { Event *TaikoL1ClientInitialized // Event containing the contract specifics and raw log @@ -2945,6 +2778,140 @@ func (_TaikoL1Client *TaikoL1ClientFilterer) ParseProvingPaused(log types.Log) ( return event, nil } +// TaikoL1ClientProvingPaused0Iterator is returned from FilterProvingPaused0 and is used to iterate over the raw logs and unpacked data for ProvingPaused0 events raised by the TaikoL1Client contract. +type TaikoL1ClientProvingPaused0Iterator struct { + Event *TaikoL1ClientProvingPaused0 // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TaikoL1ClientProvingPaused0Iterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientProvingPaused0) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TaikoL1ClientProvingPaused0) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TaikoL1ClientProvingPaused0Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TaikoL1ClientProvingPaused0Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TaikoL1ClientProvingPaused0 represents a ProvingPaused0 event raised by the TaikoL1Client contract. +type TaikoL1ClientProvingPaused0 struct { + Paused bool + Raw types.Log // Blockchain specific contextual infos +} + +// FilterProvingPaused0 is a free log retrieval operation binding the contract event 0xed64db85835d07c3c990b8ebdd55e32d64e5ed53143b6ef2179e7bfaf17ddc3b. +// +// Solidity: event ProvingPaused(bool paused) +func (_TaikoL1Client *TaikoL1ClientFilterer) FilterProvingPaused0(opts *bind.FilterOpts) (*TaikoL1ClientProvingPaused0Iterator, error) { + + logs, sub, err := _TaikoL1Client.contract.FilterLogs(opts, "ProvingPaused0") + if err != nil { + return nil, err + } + return &TaikoL1ClientProvingPaused0Iterator{contract: _TaikoL1Client.contract, event: "ProvingPaused0", logs: logs, sub: sub}, nil +} + +// WatchProvingPaused0 is a free log subscription operation binding the contract event 0xed64db85835d07c3c990b8ebdd55e32d64e5ed53143b6ef2179e7bfaf17ddc3b. +// +// Solidity: event ProvingPaused(bool paused) +func (_TaikoL1Client *TaikoL1ClientFilterer) WatchProvingPaused0(opts *bind.WatchOpts, sink chan<- *TaikoL1ClientProvingPaused0) (event.Subscription, error) { + + logs, sub, err := _TaikoL1Client.contract.WatchLogs(opts, "ProvingPaused0") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TaikoL1ClientProvingPaused0) + if err := _TaikoL1Client.contract.UnpackLog(event, "ProvingPaused0", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseProvingPaused0 is a log parse operation binding the contract event 0xed64db85835d07c3c990b8ebdd55e32d64e5ed53143b6ef2179e7bfaf17ddc3b. +// +// Solidity: event ProvingPaused(bool paused) +func (_TaikoL1Client *TaikoL1ClientFilterer) ParseProvingPaused0(log types.Log) (*TaikoL1ClientProvingPaused0, error) { + event := new(TaikoL1ClientProvingPaused0) + if err := _TaikoL1Client.contract.UnpackLog(event, "ProvingPaused0", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // TaikoL1ClientStateVariablesUpdatedIterator is returned from FilterStateVariablesUpdated and is used to iterate over the raw logs and unpacked data for StateVariablesUpdated events raised by the TaikoL1Client contract. type TaikoL1ClientStateVariablesUpdatedIterator struct { Event *TaikoL1ClientStateVariablesUpdated // Event containing the contract specifics and raw log diff --git a/proposer/proposer.go b/proposer/proposer.go index 5d712d475..4cdbf2d1b 100644 --- a/proposer/proposer.go +++ b/proposer/proposer.go @@ -3,7 +3,6 @@ package proposer import ( "bytes" "context" - "errors" "fmt" "math/rand" "sync" @@ -29,7 +28,6 @@ import ( ) var ( - errNoNewTxs = errors.New("no new transactions") proverAssignmentTimeout = 30 * time.Minute requestProverServerTimeout = 12 * time.Second ) @@ -59,11 +57,7 @@ type Proposer struct { // Protocol configurations protocolConfigs *bindings.TaikoDataConfig - // Only for testing purposes - CustomProposeOpHook func() error - AfterCommitHook func() error - - lastNonEmptyBlockProposedAt time.Time + lastUnfilteredPoolContentProposedAt time.Time txmgr *txmgr.SimpleTxManager @@ -87,7 +81,7 @@ func (p *Proposer) InitFromConfig(ctx context.Context, cfg *Config) (err error) p.proposerAddress = crypto.PubkeyToAddress(cfg.L1ProposerPrivKey.PublicKey) p.ctx = ctx p.Config = cfg - p.lastNonEmptyBlockProposedAt = time.Now() + p.lastUnfilteredPoolContentProposedAt = time.Now() p.stopCh = make(chan struct{}) // RPC clients @@ -187,10 +181,14 @@ func (p *Proposer) eventLoop() { // proposing interval timer has been reached case <-p.proposingTimer.C: // Attempt propose operation - err := p.ProposeOp(p.ctx) - if err != nil && !errors.Is(err, errNoNewTxs) { + metrics.ProposerProposeEpochCounter.Inc(1) + if err := p.ProposeOp( + p.ctx, + ); err != nil { log.Error("Proposing operation error", "error", err) + continue } + p.lastUnfilteredPoolContentProposedAt = time.Now() } } } @@ -201,7 +199,9 @@ func (p *Proposer) Close() { p.wg.Wait() } -func (p *Proposer) getTxLists(allowEmpty bool) ([]types.Transactions, error) { +// fetchPoolContent fetches the transaction pool content from L2 execution engine. +func (p *Proposer) fetchPoolContent(filterPoolContent bool) ([]types.Transactions, error) { + // Fetch the pool content. preBuiltTxList, err := p.rpc.GetPoolContent( p.ctx, p.proposerAddress, @@ -214,18 +214,28 @@ func (p *Proposer) getTxLists(allowEmpty bool) ([]types.Transactions, error) { return nil, fmt.Errorf("failed to fetch transaction pool content: %w", err) } - txLists := make([]types.Transactions, 0, len(preBuiltTxList)) - for _, txs := range preBuiltTxList { - if !allowEmpty && - (txs.EstimatedGasUsed < p.MinGasUsed || txs.BytesLength < p.MinTxListBytes) { + txLists := []types.Transactions{} + for i, txs := range preBuiltTxList { + // Filter the pool content if the filterPoolContent flag is set. + if txs.EstimatedGasUsed < p.MinGasUsed && txs.BytesLength < p.MinTxListBytes && filterPoolContent { + log.Info( + "Pool content skipped", + "index", i, + "estimatedGasUsed", txs.EstimatedGasUsed, + "minGasUsed", p.MinGasUsed, + "bytesLength", txs.BytesLength, + "minBytesLength", p.MinTxListBytes, + ) break } txLists = append(txLists, txs.TxList) } - if allowEmpty && len(txLists) == 0 { + // If the pool content is empty and the checkPoolContent flag is not set, return an empty list. + if !filterPoolContent && len(txLists) == 0 { txLists = append(txLists, types.Transactions{}) } + // If LocalAddressesOnly is set, filter the transactions by the local addresses. if p.LocalAddressesOnly { var ( localTxsLists []types.Transactions @@ -258,43 +268,29 @@ func (p *Proposer) getTxLists(allowEmpty bool) ([]types.Transactions, error) { return txLists, nil } -func (p *Proposer) ProposeOp(ctx context.Context) error { - metrics.ProposerProposeEpochCounter.Inc(1) - // Attempt propose operation - if err := p.proposeOp( - ctx, - !time.Now().Before(p.lastNonEmptyBlockProposedAt.Add(p.MinProposingInternal)), - ); err != nil { - return err - } - p.lastNonEmptyBlockProposedAt = time.Now() - return nil -} - // ProposeOp performs a proposing operation, fetching transactions // from L2 execution engine's tx pool, splitting them by proposing constraints, // and then proposing them to TaikoL1 contract. -func (p *Proposer) proposeOp(ctx context.Context, allowEmpty bool) error { - if p.CustomProposeOpHook != nil { - return p.CustomProposeOpHook() - } +func (p *Proposer) ProposeOp(ctx context.Context) error { + // Check if it's time to propose unfiltered pool content. + filterPoolContent := time.Now().Before(p.lastUnfilteredPoolContentProposedAt.Add(p.MinProposingInternal)) // Wait until L2 execution engine is synced at first. if err := p.rpc.WaitTillL2ExecutionEngineSynced(ctx); err != nil { return fmt.Errorf("failed to wait until L2 execution engine synced: %w", err) } - log.Info("Start fetching L2 execution engine's transaction pool content") + log.Info( + "Start fetching L2 execution engine's transaction pool content", + "filterPoolContent", filterPoolContent, + "lastUnfilteredPoolContentProposedAt", p.lastUnfilteredPoolContentProposedAt, + ) - txLists, err := p.getTxLists(allowEmpty) + txLists, err := p.fetchPoolContent(filterPoolContent) if err != nil { return err } - if len(txLists) == 0 { - return errNoNewTxs - } - // Propose all L2 transactions lists. for i, txs := range txLists { if i >= int(p.MaxProposedTxListsPerEpoch) { diff --git a/proposer/proposer_test.go b/proposer/proposer_test.go index 5c3822bb2..443851880 100644 --- a/proposer/proposer_test.go +++ b/proposer/proposer_test.go @@ -290,36 +290,6 @@ func (s *ProposerTestSuite) TestProposeOp() { s.Equal(types.ReceiptStatusSuccessful, receipt.Status) } -func (s *ProposerTestSuite) TestProposeOpLocalsOnly() { - s.p.LocalAddresses = []common.Address{common.BytesToAddress(testutils.RandomBytes(20))} - s.p.LocalAddressesOnly = true - - // Propose txs in L2 execution engine's mempool - sink := make(chan *bindings.TaikoL1ClientBlockProposed) - - sub, err := s.p.rpc.TaikoL1.WatchBlockProposed(nil, sink, nil, nil) - s.Nil(err) - defer func() { - sub.Unsubscribe() - close(sink) - }() - - s.p.MinProposingInternal = 1 * time.Hour - s.Error(errNoNewTxs, s.p.ProposeOp(context.Background())) -} - -func (s *ProposerTestSuite) TestCustomProposeOpHook() { - flag := false - - s.p.CustomProposeOpHook = func() error { - flag = true - return nil - } - - s.Nil(s.p.ProposeOp(context.Background())) - s.True(flag) -} - func (s *ProposerTestSuite) TestAssignProverSuccessFirstRound() { s.SetL1Automine(false) defer s.SetL1Automine(true) diff --git a/scripts/gen_bindings.sh b/scripts/gen_bindings.sh index ea5f6f099..c1a1eaf50 100755 --- a/scripts/gen_bindings.sh +++ b/scripts/gen_bindings.sh @@ -39,10 +39,6 @@ cat ${TAIKO_MONO_DIR}/packages/protocol/out/LibProposing.sol/LibProposing.json | jq .abi | ${ABIGEN_BIN} --abi - --type LibProposing --pkg bindings --out $DIR/../bindings/gen_lib_proposing.go -cat ${TAIKO_MONO_DIR}/packages/protocol/out/LibDepositing.sol/LibDepositing.json | - jq .abi | - ${ABIGEN_BIN} --abi - --type LibDepositing --pkg bindings --out $DIR/../bindings/gen_lib_depositing.go - cat ${TAIKO_MONO_DIR}/packages/protocol/out/LibUtils.sol/LibUtils.json | jq .abi | ${ABIGEN_BIN} --abi - --type LibUtils --pkg bindings --out $DIR/../bindings/gen_lib_utils.go From 242441ae290a94b46c34cef6e12d1c2df9ef1267 Mon Sep 17 00:00:00 2001 From: David Date: Thu, 4 Apr 2024 19:59:42 +0800 Subject: [PATCH 08/14] feat: update tests --- proposer/proposer_test.go | 206 ++++++-------------------------------- 1 file changed, 29 insertions(+), 177 deletions(-) diff --git a/proposer/proposer_test.go b/proposer/proposer_test.go index 443851880..c064af820 100644 --- a/proposer/proposer_test.go +++ b/proposer/proposer_test.go @@ -2,34 +2,25 @@ package proposer import ( "context" + "math/big" "os" "testing" "time" "github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/miner" - "github.com/ethereum/go-ethereum/rlp" "github.com/stretchr/testify/suite" "github.com/taikoxyz/taiko-client/bindings" - "github.com/taikoxyz/taiko-client/driver/chain_syncer/beaconsync" - "github.com/taikoxyz/taiko-client/driver/chain_syncer/calldata" - "github.com/taikoxyz/taiko-client/driver/state" - txlistfetcher "github.com/taikoxyz/taiko-client/driver/txlist_fetcher" "github.com/taikoxyz/taiko-client/internal/testutils" - "github.com/taikoxyz/taiko-client/internal/utils" "github.com/taikoxyz/taiko-client/pkg/jwt" "github.com/taikoxyz/taiko-client/pkg/rpc" ) type ProposerTestSuite struct { testutils.ClientTestSuite - s *calldata.Syncer p *Proposer cancel context.CancelFunc } @@ -37,26 +28,12 @@ type ProposerTestSuite struct { func (s *ProposerTestSuite) SetupTest() { s.ClientTestSuite.SetupTest() - state2, err := state.New(context.Background(), s.RPCClient) - s.Nil(err) - - syncer, err := calldata.NewSyncer( - context.Background(), - s.RPCClient, - state2, - beaconsync.NewSyncProgressTracker(s.RPCClient.L2, 1*time.Hour), - 0, - ) - s.Nil(err) - s.s = syncer - l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) s.Nil(err) p := new(Proposer) ctx, cancel := context.WithCancel(context.Background()) - jwtSecret, err := jwt.ParseSecretFromFile(os.Getenv("JWT_SECRET")) s.Nil(err) s.NotEmpty(jwtSecret) @@ -109,158 +86,7 @@ func (s *ProposerTestSuite) TestName() { s.Equal("proposer", s.p.Name()) } -func parseTxs(client *rpc.Client, event *bindings.TaikoL1ClientBlockProposed) (types.Transactions, error) { - tx, err := client.L1.TransactionInBlock(context.Background(), event.Raw.BlockHash, event.Raw.TxIndex) - if err != nil { - return nil, err - } - - // Decode transactions list. - var txListDecoder txlistfetcher.TxListFetcher - if event.Meta.BlobUsed { - txListDecoder = txlistfetcher.NewBlobTxListFetcher(client) - } else { - txListDecoder = new(txlistfetcher.CalldataFetcher) - } - txListBytes, err := txListDecoder.Fetch(context.Background(), tx, &event.Meta) - if err != nil { - return nil, err - } - - txListBytes, err = utils.Decompress(txListBytes) - if err != nil { - return nil, err - } - - var txs types.Transactions - return txs, rlp.DecodeBytes(txListBytes, &txs) -} - -func (s *ProposerTestSuite) getLatestProposedTxs( - n int, - timeout time.Duration, -) (<-chan []types.Transactions, error) { - sink := make(chan *bindings.TaikoL1ClientBlockProposed) - sub, err := s.p.rpc.TaikoL1.WatchBlockProposed(nil, sink, nil, nil) - if err != nil { - return nil, err - } - - var resCh = make(chan []types.Transactions, 1) - go func() { - defer sub.Unsubscribe() - - txLst := make([]types.Transactions, 0, n) - tick := time.After(timeout) - for len(txLst) < cap(txLst) { - select { - case event := <-sink: - txs, err := parseTxs(s.RPCClient, event) - if err != nil { - log.Error("failed to parse txs", "err", err) - } - txLst = append(txLst, txs) - case <-tick: - return - } - } - resCh <- txLst - }() - - return resCh, nil -} - -func (s *ProposerTestSuite) TestProposeOpEmptyBlock() { - // mint blocks - defer s.Nil(s.s.ProcessL1Blocks(context.Background())) - - p := s.p - - txsCh, err := s.getLatestProposedTxs(1, time.Minute) - s.Nil(err) - - // Start proposer - p.LocalAddressesOnly = false - p.MinGasUsed = math.MaxUint64 - p.MinTxListBytes = math.MaxUint64 - p.MinProposingInternal = 0 - s.Nil(p.ProposeOp(context.Background())) - - // wait result. - txs := <-txsCh - s.Nil(err) - s.Equal(true, len(txs) == 1 && txs[0].Len() == 0) -} - -func (s *ProposerTestSuite) TestProposeOpNoEmptyBlock() { - defer s.Nil(s.s.ProcessL1Blocks(context.Background())) - - p := s.p - - batchSize := 100 - - var err error - for i := 0; i < batchSize; i++ { - to := common.BytesToAddress(testutils.RandomBytes(32)) - _, err = testutils.SendDynamicFeeTx(s.RPCClient.L2, s.TestAddrPrivKey, &to, nil, nil) - s.Nil(err) - } - - var preBuiltTxList []*miner.PreBuiltTxList - for i := 0; i < 3 && len(preBuiltTxList) == 0; i++ { - preBuiltTxList, err = s.RPCClient.GetPoolContent( - context.Background(), - p.proposerAddress, - p.protocolConfigs.BlockMaxGasLimit, - rpc.BlockMaxTxListBytes, - p.LocalAddresses, - p.MaxProposedTxListsPerEpoch, - ) - time.Sleep(time.Second) - } - s.Nil(err) - s.Equal(true, len(preBuiltTxList) > 0) - - txsCh, err := s.getLatestProposedTxs(len(preBuiltTxList), time.Minute) - s.Nil(err) - - var ( - blockMinGasLimit uint64 = math.MaxUint64 - blockMinTxListBytes uint64 = math.MaxUint64 - txLists = make([]types.Transactions, 0, len(preBuiltTxList)) - ) - for _, txs := range preBuiltTxList { - if txs.EstimatedGasUsed <= blockMinGasLimit { - blockMinGasLimit = txs.EstimatedGasUsed - } else { - break - } - if txs.BytesLength <= blockMinTxListBytes { - blockMinTxListBytes = txs.BytesLength - } else { - break - } - txLists = append(txLists, txs.TxList) - } - - // Start proposer - p.LocalAddressesOnly = false - p.MinGasUsed = blockMinGasLimit - p.MinTxListBytes = blockMinTxListBytes - p.ProposeInterval = time.Second - p.MinProposingInternal = time.Minute - s.Nil(p.ProposeOp(context.Background())) - - txs := <-txsCh - for i := 0; i < len(txLists); i++ { - s.Equal(txLists[i].Len(), txs[i].Len()) - } -} - func (s *ProposerTestSuite) TestProposeOp() { - // mint blocks - defer s.Nil(s.s.ProcessL1Blocks(context.Background())) - // Propose txs in L2 execution engine's mempool sink := make(chan *bindings.TaikoL1ClientBlockProposed) @@ -271,9 +97,29 @@ func (s *ProposerTestSuite) TestProposeOp() { close(sink) }() - to := common.BytesToAddress(testutils.RandomBytes(20)) - _, err = testutils.SendDynamicFeeTx(s.RPCClient.L2, s.TestAddrPrivKey, &to, nil, nil) + nonce, err := s.p.rpc.L2.PendingNonceAt(context.Background(), s.TestAddr) + s.Nil(err) + + parent, err := s.p.rpc.L2.BlockByNumber(context.Background(), nil) + s.Nil(err) + + baseFeeInfo, err := s.p.rpc.TaikoL2.GetBasefee(nil, 1, uint32(parent.GasUsed())) + s.Nil(err) + + to := common.BytesToAddress(testutils.RandomBytes(32)) + tx := types.NewTx(&types.DynamicFeeTx{ + ChainID: s.RPCClient.L2.ChainID, + Nonce: nonce, + GasTipCap: common.Big0, + GasFeeCap: new(big.Int).SetUint64(baseFeeInfo.Basefee.Uint64() * 2), + Gas: 21000, + To: &to, + Value: common.Big1, + }) + + signedTx, err := types.SignTx(tx, types.LatestSignerForChainID(s.p.rpc.L2.ChainID), s.TestAddrPrivKey) s.Nil(err) + s.Nil(s.p.rpc.L2.SendTransaction(context.Background(), signedTx)) s.Nil(s.p.ProposeOp(context.Background())) @@ -290,6 +136,12 @@ func (s *ProposerTestSuite) TestProposeOp() { s.Equal(types.ReceiptStatusSuccessful, receipt.Status) } +func (s *ProposerTestSuite) TestProposeEmptyBlockOp() { + s.p.MinProposingInternal = 1 * time.Second + s.p.lastUnfilteredPoolContentProposedAt = time.Now().Add(-10 * time.Second) + s.Nil(s.p.ProposeOp(context.Background())) +} + func (s *ProposerTestSuite) TestAssignProverSuccessFirstRound() { s.SetL1Automine(false) defer s.SetL1Automine(true) From d2b9fdaea0964a287bd01e344a966f8b758192b7 Mon Sep 17 00:00:00 2001 From: David Date: Thu, 4 Apr 2024 20:00:36 +0800 Subject: [PATCH 09/14] feat: update tests --- internal/testutils/helper.go | 52 ------------------------------------ 1 file changed, 52 deletions(-) diff --git a/internal/testutils/helper.go b/internal/testutils/helper.go index 6f6418498..a24687c77 100644 --- a/internal/testutils/helper.go +++ b/internal/testutils/helper.go @@ -6,14 +6,12 @@ import ( "crypto/rand" "errors" "fmt" - "math/big" "net/http" "net/url" "os" "time" "github.com/cenkalti/backoff/v4" - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" @@ -23,7 +21,6 @@ import ( "github.com/phayes/freeport" "github.com/taikoxyz/taiko-client/bindings" - "github.com/taikoxyz/taiko-client/pkg/rpc" "github.com/taikoxyz/taiko-client/prover/server" ) @@ -308,52 +305,3 @@ func LocalRandomProverEndpoint() *url.URL { func SignatureFromRSV(r, s string, v byte) []byte { return append(append(hexutil.MustDecode(r), hexutil.MustDecode(s)...), v) } - -// SendDynamicFeeTx sends a dynamic transaction, used for tests. -func SendDynamicFeeTx( - client *rpc.EthClient, - priv *ecdsa.PrivateKey, - to *common.Address, - value *big.Int, - data []byte, -) (*types.Transaction, error) { - head, err := client.HeaderByNumber(context.Background(), nil) - if err != nil { - return nil, err - } - - auth, err := bind.NewKeyedTransactorWithChainID(priv, client.ChainID) - if err != nil { - return nil, err - } - - nonce, err := client.PendingNonceAt(context.Background(), auth.From) - if err != nil { - return nil, err - } - - gasTipCap, err := client.SuggestGasTipCap(context.Background()) - if err != nil { - return nil, err - } - - tx, err := auth.Signer(auth.From, types.NewTx(&types.DynamicFeeTx{ - To: to, - Nonce: nonce, - Value: value, - GasTipCap: gasTipCap, - GasFeeCap: new(big.Int).Add( - gasTipCap, - new(big.Int).Mul(head.BaseFee, big.NewInt(2)), - ), - Gas: 2100_000, - Data: data, - })) - if err != nil { - return nil, err - } - if err = client.SendTransaction(context.Background(), tx); err != nil { - return nil, err - } - return tx, nil -} From 84384c77595210b0b4454b131eb0998fc5c4b994 Mon Sep 17 00:00:00 2001 From: David Date: Thu, 4 Apr 2024 20:06:44 +0800 Subject: [PATCH 10/14] feat: update tests --- proposer/proposer.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/proposer/proposer.go b/proposer/proposer.go index 4cdbf2d1b..935250073 100644 --- a/proposer/proposer.go +++ b/proposer/proposer.go @@ -182,13 +182,10 @@ func (p *Proposer) eventLoop() { case <-p.proposingTimer.C: // Attempt propose operation metrics.ProposerProposeEpochCounter.Inc(1) - if err := p.ProposeOp( - p.ctx, - ); err != nil { + if err := p.ProposeOp(p.ctx); err != nil { log.Error("Proposing operation error", "error", err) continue } - p.lastUnfilteredPoolContentProposedAt = time.Now() } } } @@ -305,6 +302,10 @@ func (p *Proposer) ProposeOp(ctx context.Context) error { if err := p.ProposeTxList(ctx, txListBytes, uint(txs.Len())); err != nil { return fmt.Errorf("failed to send TaikoL1.proposeBlock transactions: %w", err) } + + if len(txs) != 0 { + p.lastUnfilteredPoolContentProposedAt = time.Now() + } } return nil From d9522db1aef021783e23ffc7e27f84ee300d4daa Mon Sep 17 00:00:00 2001 From: David Date: Thu, 4 Apr 2024 20:07:45 +0800 Subject: [PATCH 11/14] feat: update tests --- proposer/proposer.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/proposer/proposer.go b/proposer/proposer.go index 935250073..9039fc583 100644 --- a/proposer/proposer.go +++ b/proposer/proposer.go @@ -180,8 +180,9 @@ func (p *Proposer) eventLoop() { return // proposing interval timer has been reached case <-p.proposingTimer.C: - // Attempt propose operation metrics.ProposerProposeEpochCounter.Inc(1) + + // Attempt a proposing operation if err := p.ProposeOp(p.ctx); err != nil { log.Error("Proposing operation error", "error", err) continue From 7e99d21b096f7aec98f71ba8b77e76c62e6a435d Mon Sep 17 00:00:00 2001 From: maskpp Date: Thu, 4 Apr 2024 21:46:50 +0800 Subject: [PATCH 12/14] trigger ci From 70f9b484b9f781bef34493ff0a731aafa26c7ce5 Mon Sep 17 00:00:00 2001 From: David Date: Thu, 4 Apr 2024 23:26:03 +0800 Subject: [PATCH 13/14] feat: changes based on protocol PR 16641 --- bindings/.githead | 2 +- bindings/encoding/input.go | 4 ++++ bindings/encoding/struct.go | 1 + bindings/gen_lib_proposing.go | 2 +- bindings/gen_taiko_l1.go | 2 +- proposer/proposer.go | 2 ++ proposer/transaction_builder/blob.go | 20 ++++++++++++++++++++ proposer/transaction_builder/calldata.go | 11 +++++++++++ proposer/transaction_builder/common_test.go | 6 ++++++ 9 files changed, 47 insertions(+), 3 deletions(-) diff --git a/bindings/.githead b/bindings/.githead index 0f5e09780..439c45c23 100644 --- a/bindings/.githead +++ b/bindings/.githead @@ -1 +1 @@ -2c311e1aea456bca815f8cbbe42b2f5810d0db9f +b853c08eb82cf93bba81b51169c1add8b42f4b09 diff --git a/bindings/encoding/input.go b/bindings/encoding/input.go index 327e409ea..71f018c03 100644 --- a/bindings/encoding/input.go +++ b/bindings/encoding/input.go @@ -130,6 +130,10 @@ var ( }, }, }, + { + Name: "signature", + Type: "bytes", + }, } proverAssignmentComponents = []abi.ArgumentMarshaling{ { diff --git a/bindings/encoding/struct.go b/bindings/encoding/struct.go index 05573b3ae..087eec06d 100644 --- a/bindings/encoding/struct.go +++ b/bindings/encoding/struct.go @@ -31,6 +31,7 @@ type BlockParams struct { ExtraData [32]byte ParentMetaHash [32]byte HookCalls []HookCall + Signature []byte } // TierFee should be same with TaikoData.TierFee. diff --git a/bindings/gen_lib_proposing.go b/bindings/gen_lib_proposing.go index c93bc2249..3e35789ee 100644 --- a/bindings/gen_lib_proposing.go +++ b/bindings/gen_lib_proposing.go @@ -31,7 +31,7 @@ var ( // LibProposingMetaData contains all meta data concerning the LibProposing contract. var LibProposingMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROPOSER_NOT_EOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]}]", + ABI: "[{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]}]", } // LibProposingABI is the input ABI used to generate the binding from. diff --git a/bindings/gen_taiko_l1.go b/bindings/gen_taiko_l1.go index 6a3df349a..de8c4c3c9 100644 --- a/bindings/gen_taiko_l1.go +++ b/bindings/gen_taiko_l1.go @@ -120,7 +120,7 @@ type TaikoDataTransitionState struct { // TaikoL1ClientMetaData contains all meta data concerning the TaikoL1Client contract. var TaikoL1ClientMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"ts_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerifyPerProposal\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockSyncThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"a_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"__reservedA1\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"__reservedA2\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"b_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlock\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"deposits_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"__reserve1\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"__reservedA1\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"__reservedA2\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EthDeposited\",\"inputs\":[{\"name\":\"deposit\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ASSIGNED_PROVER_NOT_ALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ASSIGNED_PROVER_NOT_ALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_MISSING_VERIFIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_MISSING_VERIFIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROPOSER_NOT_EOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROPOSER_NOT_EOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_TIERS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]}]", + ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"ts_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerifyPerProposal\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockSyncThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"a_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"__reservedA1\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"__reservedA2\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"b_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"init2\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastUnpausedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlock\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"deposits_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"__reserve1\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"__reservedA1\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"__reservedA2\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EthDeposited\",\"inputs\":[{\"name\":\"deposit\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StateVariablesUpdated\",\"inputs\":[{\"name\":\"slotB\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reservedB1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reservedB2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reservedB3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ASSIGNED_PROVER_NOT_ALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ASSIGNED_PROVER_NOT_ALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_CANNOT_CONTEST\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_MISSING_VERIFIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_MISSING_VERIFIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_TIERS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]}]", } // TaikoL1ClientABI is the input ABI used to generate the binding from. diff --git a/proposer/proposer.go b/proposer/proposer.go index 9039fc583..f03dd52c3 100644 --- a/proposer/proposer.go +++ b/proposer/proposer.go @@ -132,6 +132,7 @@ func (p *Proposer) InitFromConfig(ctx context.Context, cfg *Config) (err error) if cfg.BlobAllowed { p.txBuilder = builder.NewBlobTransactionBuilder( p.rpc, + p.L1ProposerPrivKey, p.proverSelector, p.Config.L1BlockBuilderTip, cfg.TaikoL1Address, @@ -143,6 +144,7 @@ func (p *Proposer) InitFromConfig(ctx context.Context, cfg *Config) (err error) } else { p.txBuilder = builder.NewCalldataTransactionBuilder( p.rpc, + p.L1ProposerPrivKey, p.proverSelector, p.Config.L1BlockBuilderTip, cfg.L2SuggestedFeeRecipient, diff --git a/proposer/transaction_builder/blob.go b/proposer/transaction_builder/blob.go index aeae2db5c..2a26e94e3 100644 --- a/proposer/transaction_builder/blob.go +++ b/proposer/transaction_builder/blob.go @@ -2,11 +2,15 @@ package builder import ( "context" + "crypto/ecdsa" + "crypto/sha256" "math/big" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/kzg4844" "github.com/taikoxyz/taiko-client/bindings/encoding" "github.com/taikoxyz/taiko-client/pkg/rpc" selector "github.com/taikoxyz/taiko-client/proposer/prover_selector" @@ -16,6 +20,7 @@ import ( // bytes saved in blob. type BlobTransactionBuilder struct { rpc *rpc.Client + proposerPrivateKey *ecdsa.PrivateKey proverSelector selector.ProverSelector l1BlockBuilderTip *big.Int taikoL1Address common.Address @@ -28,6 +33,7 @@ type BlobTransactionBuilder struct { // NewBlobTransactionBuilder creates a new BlobTransactionBuilder instance based on giving configurations. func NewBlobTransactionBuilder( rpc *rpc.Client, + proposerPrivateKey *ecdsa.PrivateKey, proverSelector selector.ProverSelector, l1BlockBuilderTip *big.Int, taikoL1Address common.Address, @@ -38,6 +44,7 @@ func NewBlobTransactionBuilder( ) *BlobTransactionBuilder { return &BlobTransactionBuilder{ rpc, + proposerPrivateKey, proverSelector, l1BlockBuilderTip, taikoL1Address, @@ -93,6 +100,18 @@ func (b *BlobTransactionBuilder) Build( return nil, err } + commitment, err := blob.ComputeKZGCommitment() + if err != nil { + return nil, err + } + blobHash := kzg4844.CalcBlobHashV1(sha256.New(), &commitment) + + signature, err := crypto.Sign(blobHash[:], b.proposerPrivateKey) + if err != nil { + return nil, err + } + signature[64] = uint8(uint(signature[64])) + 27 + // ABI encode the TaikoL1.proposeBlock parameters. encodedParams, err := encoding.EncodeBlockParams(&encoding.BlockParams{ AssignedProver: assignedProver, @@ -100,6 +119,7 @@ func (b *BlobTransactionBuilder) Build( Coinbase: b.l2SuggestedFeeRecipient, ParentMetaHash: parentMetaHash, HookCalls: []encoding.HookCall{{Hook: b.assignmentHookAddress, Data: hookInputData}}, + Signature: signature, }) if err != nil { return nil, err diff --git a/proposer/transaction_builder/calldata.go b/proposer/transaction_builder/calldata.go index a46855b5c..469ab1bd7 100644 --- a/proposer/transaction_builder/calldata.go +++ b/proposer/transaction_builder/calldata.go @@ -2,6 +2,7 @@ package builder import ( "context" + "crypto/ecdsa" "math/big" "github.com/ethereum-optimism/optimism/op-service/txmgr" @@ -17,6 +18,7 @@ import ( // bytes saved in calldata. type CalldataTransactionBuilder struct { rpc *rpc.Client + proposerPrivateKey *ecdsa.PrivateKey proverSelector selector.ProverSelector l1BlockBuilderTip *big.Int l2SuggestedFeeRecipient common.Address @@ -29,6 +31,7 @@ type CalldataTransactionBuilder struct { // NewCalldataTransactionBuilder creates a new CalldataTransactionBuilder instance based on giving configurations. func NewCalldataTransactionBuilder( rpc *rpc.Client, + proposerPrivateKey *ecdsa.PrivateKey, proverSelector selector.ProverSelector, l1BlockBuilderTip *big.Int, l2SuggestedFeeRecipient common.Address, @@ -39,6 +42,7 @@ func NewCalldataTransactionBuilder( ) *CalldataTransactionBuilder { return &CalldataTransactionBuilder{ rpc, + proposerPrivateKey, proverSelector, l1BlockBuilderTip, l2SuggestedFeeRecipient, @@ -83,6 +87,12 @@ func (b *CalldataTransactionBuilder) Build( return nil, err } + signature, err := crypto.Sign(crypto.Keccak256(txListBytes), b.proposerPrivateKey) + if err != nil { + return nil, err + } + signature[64] = uint8(uint(signature[64])) + 27 + // ABI encode the TaikoL1.proposeBlock parameters. encodedParams, err := encoding.EncodeBlockParams(&encoding.BlockParams{ AssignedProver: assignedProver, @@ -90,6 +100,7 @@ func (b *CalldataTransactionBuilder) Build( ExtraData: rpc.StringToBytes32(b.extraData), ParentMetaHash: parentMetaHash, HookCalls: []encoding.HookCall{{Hook: b.assignmentHookAddress, Data: hookInputData}}, + Signature: signature, }) if err != nil { return nil, err diff --git a/proposer/transaction_builder/common_test.go b/proposer/transaction_builder/common_test.go index 53a5ac32a..851ad5385 100644 --- a/proposer/transaction_builder/common_test.go +++ b/proposer/transaction_builder/common_test.go @@ -8,6 +8,7 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" "github.com/stretchr/testify/suite" "github.com/taikoxyz/taiko-client/bindings/encoding" @@ -27,6 +28,9 @@ func (s *TransactionBuilderTestSuite) SetupTest() { protocolConfigs, err := s.RPCClient.TaikoL1.GetConfig(nil) s.Nil(err) + l1ProposerPrivKey, err := crypto.ToECDSA(common.FromHex(os.Getenv("L1_PROPOSER_PRIVATE_KEY"))) + s.Nil(err) + proverSelector, err := selector.NewETHFeeEOASelector( &protocolConfigs, s.RPCClient, @@ -42,6 +46,7 @@ func (s *TransactionBuilderTestSuite) SetupTest() { s.Nil(err) s.calldataTxBuilder = NewCalldataTransactionBuilder( s.RPCClient, + l1ProposerPrivKey, proverSelector, common.Big0, common.HexToAddress(os.Getenv("TAIKO_L2_ADDRESS")), @@ -52,6 +57,7 @@ func (s *TransactionBuilderTestSuite) SetupTest() { ) s.blobTxBuiler = NewBlobTransactionBuilder( s.RPCClient, + l1ProposerPrivKey, proverSelector, common.Big0, common.HexToAddress(os.Getenv("TAIKO_L1_ADDRESS")), From eec98408c0c2cc32f35c7517d76182eefceb471b Mon Sep 17 00:00:00 2001 From: David Date: Thu, 4 Apr 2024 23:48:59 +0800 Subject: [PATCH 14/14] feat: remove an unnecessary channel --- driver/state/state.go | 11 ++--------- proposer/proposer.go | 9 ++------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/driver/state/state.go b/driver/state/state.go index 48f0351e6..de7dad52b 100644 --- a/driver/state/state.go +++ b/driver/state/state.go @@ -33,16 +33,12 @@ type State struct { // RPC clients rpc *rpc.Client - stopCh chan struct{} - wg sync.WaitGroup + wg sync.WaitGroup } // New creates a new driver state instance. func New(ctx context.Context, rpc *rpc.Client) (*State, error) { - s := &State{ - rpc: rpc, - stopCh: make(chan struct{}), - } + s := &State{rpc: rpc} if err := s.init(ctx); err != nil { return nil, err @@ -55,7 +51,6 @@ func New(ctx context.Context, rpc *rpc.Client) (*State, error) { // Close closes all inner subscriptions. func (s *State) Close() { - close(s.stopCh) s.wg.Wait() } @@ -130,8 +125,6 @@ func (s *State) eventLoop(ctx context.Context) { select { case <-ctx.Done(): return - case <-s.stopCh: - return case e := <-blockProposedCh: s.setHeadBlockID(e.BlockId) case e := <-transitionProvedCh: diff --git a/proposer/proposer.go b/proposer/proposer.go index f03dd52c3..543b27858 100644 --- a/proposer/proposer.go +++ b/proposer/proposer.go @@ -61,9 +61,8 @@ type Proposer struct { txmgr *txmgr.SimpleTxManager - ctx context.Context - wg sync.WaitGroup - stopCh chan struct{} + ctx context.Context + wg sync.WaitGroup } // InitFromCli New initializes the given proposer instance based on the command line flags. @@ -82,7 +81,6 @@ func (p *Proposer) InitFromConfig(ctx context.Context, cfg *Config) (err error) p.ctx = ctx p.Config = cfg p.lastUnfilteredPoolContentProposedAt = time.Now() - p.stopCh = make(chan struct{}) // RPC clients if p.rpc, err = rpc.NewClient(p.ctx, cfg.ClientConfig); err != nil { @@ -176,8 +174,6 @@ func (p *Proposer) eventLoop() { p.updateProposingTicker() select { - case <-p.stopCh: - return case <-p.ctx.Done(): return // proposing interval timer has been reached @@ -195,7 +191,6 @@ func (p *Proposer) eventLoop() { // Close closes the proposer instance. func (p *Proposer) Close() { - close(p.stopCh) p.wg.Wait() }