diff --git a/aggregator/aggregator.go b/aggregator/aggregator.go index e7be4ec000..5d6adc7b1f 100644 --- a/aggregator/aggregator.go +++ b/aggregator/aggregator.go @@ -866,6 +866,7 @@ func (a *Aggregator) isSynced(ctx context.Context, batchNum *uint64) bool { log.Warnf("Failed to get last consolidated batch: %v", err) return false } + if lastVerifiedBatch == nil { return false } diff --git a/aggregator/pb/aggregator.pb.go b/aggregator/pb/aggregator.pb.go index 154edddbe8..3ee5723389 100644 --- a/aggregator/pb/aggregator.pb.go +++ b/aggregator/pb/aggregator.pb.go @@ -20,11 +20,11 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// * +//* // @dev Result -// - OK: succesfully completed -// - ERROR: request is not correct, i.e. input data is wrong -// - INTERNAL_ERROR: internal server error when delivering the response +// - OK: succesfully completed +// - ERROR: request is not correct, i.e. input data is wrong +// - INTERNAL_ERROR: internal server error when delivering the response type Result int32 const ( @@ -247,7 +247,6 @@ type AggregatorMessage struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Types that are assignable to Request: - // // *AggregatorMessage_GetStatusRequest // *AggregatorMessage_GenBatchProofRequest // *AggregatorMessage_GenAggregatedProofRequest @@ -392,7 +391,6 @@ type ProverMessage struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Types that are assignable to Response: - // // *ProverMessage_GetStatusResponse // *ProverMessage_GenBatchProofResponse // *ProverMessage_GenAggregatedProofResponse @@ -530,7 +528,7 @@ func (*ProverMessage_CancelResponse) isProverMessage_Response() {} func (*ProverMessage_GetProofResponse) isProverMessage_Response() {} -// * +//* // @dev GetStatusRequest type GetStatusRequest struct { state protoimpl.MessageState @@ -570,7 +568,7 @@ func (*GetStatusRequest) Descriptor() ([]byte, []int) { return file_aggregator_proto_rawDescGZIP(), []int{3} } -// * +//* // @dev GenBatchProofRequest // @param {input} - input prover type GenBatchProofRequest struct { @@ -620,7 +618,7 @@ func (x *GenBatchProofRequest) GetInput() *InputProver { return nil } -// * +//* // @dev GenAggregatedProofRequest // @param {recursive_proof_1} - proof json of the first batch to aggregate // @param {recursive_proof_2} - proof json of the second batch to aggregate @@ -679,7 +677,7 @@ func (x *GenAggregatedProofRequest) GetRecursiveProof_2() string { return "" } -// * +//* // @dev GenFinalProofRequest // @param {recursive_proof} - proof json of the batch or aggregated proof to finalise // @param {aggregator_addr} - address of the aggregator @@ -738,7 +736,7 @@ func (x *GenFinalProofRequest) GetAggregatorAddr() string { return "" } -// * +//* // @dev CancelRequest // @param {id} - identifier of the proof request to cancel type CancelRequest struct { @@ -788,7 +786,7 @@ func (x *CancelRequest) GetId() string { return "" } -// * +//* // @dev Request GetProof // @param {id} - proof identifier of the proof request // @param {timeout} - time to wait until the service responds @@ -847,7 +845,7 @@ func (x *GetProofRequest) GetTimeout() uint64 { return 0 } -// * +//* // @dev Response GetStatus // @param {status} - server status // - BOOTING: being ready to compute proofs @@ -1076,7 +1074,7 @@ func (x *GenBatchProofResponse) GetResult() Result { return Result_RESULT_UNSPECIFIED } -// * +//* // @dev GenAggregatedProofResponse // @param {id} - proof identifier, to be used in GetProofRequest() // @param {result} - request result @@ -1135,7 +1133,7 @@ func (x *GenAggregatedProofResponse) GetResult() Result { return Result_RESULT_UNSPECIFIED } -// * +//* // @dev Response GenFinalProof // @param {id} - proof identifier, to be used in GetProofRequest() // @param {result} - request result @@ -1194,7 +1192,7 @@ func (x *GenFinalProofResponse) GetResult() Result { return Result_RESULT_UNSPECIFIED } -// * +//* // @dev CancelResponse // @param {result} - request result type CancelResponse struct { @@ -1244,19 +1242,18 @@ func (x *CancelResponse) GetResult() Result { return Result_RESULT_UNSPECIFIED } -// * +//* // @dev GetProofResponse // @param {id} - proof identifier // @param {final_proof} - groth16 proof + public circuit inputs // @param {recursive_proof} - recursive proof json // @param {result} - proof result -// - COMPLETED_OK: proof has been computed successfully and it is valid -// - ERROR: request error -// - COMPLETED_ERROR: proof has been computed successfully and it is not valid -// - PENDING: proof is being computed -// - INTERNAL_ERROR: server error during proof computation -// - CANCEL: proof has been cancelled -// +// - COMPLETED_OK: proof has been computed successfully and it is valid +// - ERROR: request error +// - COMPLETED_ERROR: proof has been computed successfully and it is not valid +// - PENDING: proof is being computed +// - INTERNAL_ERROR: server error during proof computation +// - CANCEL: proof has been cancelled // @param {result_string} - extends result information type GetProofResponse struct { state protoimpl.MessageState @@ -1265,7 +1262,6 @@ type GetProofResponse struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Types that are assignable to Proof: - // // *GetProofResponse_FinalProof // *GetProofResponse_RecursiveProof Proof isGetProofResponse_Proof `protobuf_oneof:"proof"` @@ -1363,6 +1359,7 @@ func (*GetProofResponse_FinalProof) isGetProofResponse_Proof() {} func (*GetProofResponse_RecursiveProof) isGetProofResponse_Proof() {} +// // @dev FinalProof // @param {proof} - groth16 proof // @param {public} - public circuit inputs @@ -1421,6 +1418,7 @@ func (x *FinalProof) GetPublic() *PublicInputsExtended { return nil } +// // @dev PublicInputs // @param {old_state_root} // @param {old_acc_input_hash} @@ -1549,7 +1547,7 @@ func (x *PublicInputs) GetAggregatorAddr() string { return "" } -// * +//* // @dev ProofB // @param {proofs} - two elliptic curves points type ProofB struct { @@ -1599,7 +1597,7 @@ func (x *ProofB) GetProofs() []string { return nil } -// * +//* // @dev Proof // @param {proof_a} - elliptic curve point // @param {proof_b} - two elliptic curves points @@ -1667,7 +1665,7 @@ func (x *Proof) GetProofC() []string { return nil } -// * +//* // @dev InputProver // @param {public_inputs} - public inputs // @param {db} - database containing all key-values in smt matching the old state root @@ -1735,7 +1733,7 @@ func (x *InputProver) GetContractsBytecode() map[string]string { return nil } -// * +//* // @dev PublicInputsExtended // @param {public_inputs} - public inputs // @param {new_state_root} - final state root. Used as a sanity check. diff --git a/cmd/run.go b/cmd/run.go index 4f49295c2f..1b2dabe919 100644 --- a/cmd/run.go +++ b/cmd/run.go @@ -3,11 +3,12 @@ package main import ( "context" "fmt" - "math" "net" "net/http" + "net/http/pprof" "os" "os/signal" + "time" "github.com/0xPolygonHermez/zkevm-node" "github.com/0xPolygonHermez/zkevm-node/aggregator" @@ -22,7 +23,6 @@ import ( "github.com/0xPolygonHermez/zkevm-node/metrics" "github.com/0xPolygonHermez/zkevm-node/pool" "github.com/0xPolygonHermez/zkevm-node/pool/pgpoolstorage" - "github.com/0xPolygonHermez/zkevm-node/pricegetter" "github.com/0xPolygonHermez/zkevm-node/sequencer" "github.com/0xPolygonHermez/zkevm-node/sequencer/broadcast" "github.com/0xPolygonHermez/zkevm-node/sequencer/broadcast/pb" @@ -36,6 +36,11 @@ import ( "google.golang.org/grpc" ) +const ( + two = 2 + ten = 10 +) + func start(cliCtx *cli.Context) error { zkevm.PrintVersion(os.Stdout) @@ -80,21 +85,11 @@ func start(cliCtx *cli.Context) error { log.Fatal(err) } // Read Fork ID FROM POE SC - // TODO: Uncomment when the POE SC is implemented - /* - currentForkID, err := etherman.GetL2ForkID() - if err != nil { - log.Fatal(err) - } - - forkIDIntervals, err := etherman.GetL2ForkIDIntervals() - if err != nil { - log.Fatal(err) - } - */ - - currentForkID := c.DefaultForkID - forkIDIntervals := []state.ForkIDInterval{{FromBatchNumber: 0, ToBatchNumber: math.MaxUint64, ForkId: c.DefaultForkID}} + forkIDIntervals, err := etherman.GetForks(cliCtx.Context) + if err != nil || len(forkIDIntervals) == 0 { + log.Fatal("error getting forks: ", err) + } + currentForkID := forkIDIntervals[len(forkIDIntervals)-1].ForkId c.Aggregator.ChainID = l2ChainID c.Aggregator.ForkId = currentForkID @@ -147,9 +142,12 @@ func start(cliCtx *cli.Context) error { } if c.Metrics.Enabled { - go startMetricsHttpServer(c) + go startMetricsHttpServer(c.Metrics) } + if c.Metrics.ProfilingEnabled { + go startProfilingHttpServer(c.Metrics) + } waitSignal(cancelFuncs) return nil @@ -210,17 +208,12 @@ func runJSONRPCServer(c config.Config, pool *pool.Pool, st *state.State, apis ma } func createSequencer(cfg config.Config, pool *pool.Pool, etmStorage *ethtxmanager.PostgresStorage, st *state.State) *sequencer.Sequencer { - pg, err := pricegetter.NewClient(cfg.PriceGetter) - if err != nil { - log.Fatal(err) - } - etherman, err := newEtherman(cfg) if err != nil { log.Fatal(err) } - for _, privateKey := range cfg.Sequencer.PrivateKeys { + for _, privateKey := range cfg.Sequencer.Finalizer.PrivateKeys { _, err := etherman.LoadAuthFromKeyStore(privateKey.Path, privateKey.Password) if err != nil { log.Fatal(err) @@ -229,7 +222,7 @@ func createSequencer(cfg config.Config, pool *pool.Pool, etmStorage *ethtxmanage ethTxManager := ethtxmanager.New(cfg.EthTxManager, etherman, etmStorage, st) - seq, err := sequencer.New(cfg.Sequencer, pool, st, etherman, pg, ethTxManager) + seq, err := sequencer.New(cfg.Sequencer, pool, st, etherman, ethTxManager) if err != nil { log.Fatal(err) } @@ -323,19 +316,49 @@ func createEthTxManager(cfg config.Config, etmStorage *ethtxmanager.PostgresStor return etm } -func startMetricsHttpServer(c *config.Config) { +func startProfilingHttpServer(c metrics.Config) { mux := http.NewServeMux() - address := fmt.Sprintf("%s:%d", c.Metrics.Host, c.Metrics.Port) + address := fmt.Sprintf("%s:%d", c.ProfilingHost, c.ProfilingPort) + lis, err := net.Listen("tcp", address) + if err != nil { + log.Errorf("failed to create tcp listener for profiling: %v", err) + return + } + mux.HandleFunc(metrics.ProfilingIndexEndpoint, pprof.Index) + mux.HandleFunc(metrics.ProfileEndpoint, pprof.Profile) + mux.HandleFunc(metrics.ProfilingCmdEndpoint, pprof.Cmdline) + mux.HandleFunc(metrics.ProfilingSymbolEndpoint, pprof.Symbol) + mux.HandleFunc(metrics.ProfilingTraceEndpoint, pprof.Trace) + profilingServer := &http.Server{ + Handler: mux, + ReadTimeout: two * time.Minute, + } + log.Infof("profiling server listening on port %d", c.ProfilingPort) + if err := profilingServer.Serve(lis); err != nil { + if err == http.ErrServerClosed { + log.Warnf("http server for profiling stopped") + return + } + log.Errorf("closed http connection for profiling server: %v", err) + return + } +} + +func startMetricsHttpServer(c metrics.Config) { + mux := http.NewServeMux() + address := fmt.Sprintf("%s:%d", c.Host, c.Port) lis, err := net.Listen("tcp", address) if err != nil { log.Errorf("failed to create tcp listener for metrics: %v", err) return } mux.Handle(metrics.Endpoint, promhttp.Handler()) - metricsServer := &http.Server{ //nolint Potential Slowloris Attack - Handler: mux, + + metricsServer := &http.Server{ + Handler: mux, + ReadTimeout: ten * time.Second, } - log.Infof("metrics server listening on port %d", c.Metrics.Port) + log.Infof("metrics server listening on port %d", c.Port) if err := metricsServer.Serve(lis); err != nil { if err == http.ErrServerClosed { log.Warnf("http server for metrics stopped") diff --git a/config/config_test.go b/config/config_test.go index 2c3f96c051..f682c98840 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -56,15 +56,7 @@ func Test_Defaults(t *testing.T) { }, { path: "Sequencer.LastBatchVirtualizationTimeMaxWaitPeriod", - expectedValue: types.NewDuration(300 * time.Second), - }, - { - path: "Sequencer.WaitBlocksToUpdateGER", - expectedValue: uint64(10), - }, - { - path: "Sequencer.WaitBlocksToConsiderGerFinal", - expectedValue: uint64(10), + expectedValue: types.NewDuration(5 * time.Second), }, { path: "Sequencer.MaxTxsPerBatch", @@ -72,15 +64,7 @@ func Test_Defaults(t *testing.T) { }, { path: "Sequencer.MaxBatchBytesSize", - expectedValue: 150000, - }, - { - path: "Sequencer.MaxTimeForBatchToBeOpen", - expectedValue: types.NewDuration(15 * time.Second), - }, - { - path: "Sequencer.ElapsedTimeToCloseBatchWithoutTxsDueToNewGER", - expectedValue: types.NewDuration(60 * time.Second), + expectedValue: uint64(150000), }, { path: "Sequencer.BlocksAmountForTxsToBeDeleted", @@ -90,41 +74,37 @@ func Test_Defaults(t *testing.T) { path: "Sequencer.FrequencyToCheckTxsForDelete", expectedValue: types.NewDuration(12 * time.Hour), }, - { - path: "Sequencer.ProfitabilityChecker.SendBatchesEvenWhenNotProfitable", - expectedValue: true, - }, { path: "Sequencer.MaxCumulativeGasUsed", expectedValue: uint64(30000000), }, { path: "Sequencer.MaxKeccakHashes", - expectedValue: int32(468), + expectedValue: uint32(468), }, { path: "Sequencer.MaxPoseidonHashes", - expectedValue: int32(279620), + expectedValue: uint32(279620), }, { path: "Sequencer.MaxPoseidonPaddings", - expectedValue: int32(149796), + expectedValue: uint32(149796), }, { path: "Sequencer.MaxMemAligns", - expectedValue: int32(262144), + expectedValue: uint32(262144), }, { path: "Sequencer.MaxArithmetics", - expectedValue: int32(262144), + expectedValue: uint32(262144), }, { path: "Sequencer.MaxBinaries", - expectedValue: int32(262144), + expectedValue: uint32(262144), }, { path: "Sequencer.MaxSteps", - expectedValue: int32(8388608), + expectedValue: uint32(8388608), }, { path: "Sequencer.MaxSequenceSize", @@ -134,6 +114,34 @@ func Test_Defaults(t *testing.T) { path: "Sequencer.MaxAllowedFailedCounter", expectedValue: uint64(50), }, + { + path: "Sequencer.Finalizer.GERDeadlineTimeoutInSec", + expectedValue: types.NewDuration(5 * time.Second), + }, + { + path: "Sequencer.Finalizer.ForcedBatchDeadlineTimeoutInSec", + expectedValue: types.NewDuration(60 * time.Second), + }, + { + path: "Sequencer.Finalizer.SendingToL1DeadlineTimeoutInSec", + expectedValue: types.NewDuration(20 * time.Second), + }, + { + path: "Sequencer.Finalizer.SleepDurationInMs", + expectedValue: types.NewDuration(100 * time.Millisecond), + }, + { + path: "Sequencer.Finalizer.ResourcePercentageToCloseBatch", + expectedValue: uint32(10), + }, + { + path: "Sequencer.Finalizer.GERFinalityNumberOfBlocks", + expectedValue: uint64(64), + }, + { + path: "Sequencer.Finalizer.ClosingSignalsManagerWaitForL1OperationsInSec", + expectedValue: types.NewDuration(10 * time.Second), + }, { path: "Etherman.URL", expectedValue: "http://localhost:8545", @@ -144,7 +152,7 @@ func Test_Defaults(t *testing.T) { }, { path: "Etherman.PoEAddr", - expectedValue: common.HexToAddress("0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6"), + expectedValue: common.HexToAddress("0x8A791620dd6260079BF849Dc5567aDC3F2FdC318"), }, { path: "Etherman.MaticAddr", @@ -152,7 +160,7 @@ func Test_Defaults(t *testing.T) { }, { path: "Etherman.GlobalExitRootManagerAddr", - expectedValue: common.HexToAddress("0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9"), + expectedValue: common.HexToAddress("0xa513E6E4b8f2a923D98304ec87F64353C4D5C853"), }, { path: "Etherman.MultiGasProvider", diff --git a/config/default.go b/config/default.go index 21c301fda5..a7c4fd8971 100644 --- a/config/default.go +++ b/config/default.go @@ -33,9 +33,9 @@ FreeClaimGasLimit = 150000 [Etherman] URL = "http://localhost:8545" L1ChainID = 1337 -PoEAddr = "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6" +PoEAddr = "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318" MaticAddr = "0x5FbDB2315678afecb367f032d93F642f64180aa3" -GlobalExitRootManagerAddr = "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" +GlobalExitRootManagerAddr = "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853" MultiGasProvider = true [Etherman.Etherscan] ApiKey = "" @@ -60,18 +60,13 @@ DefaultSenderAddress = "0x1111111111111111111111111111111111111111" [Synchronizer] SyncInterval = "0s" SyncChunkSize = 100 -GenBlockNumber = 57 +GenBlockNumber = 63 [Sequencer] MaxSequenceSize = "2000000" WaitPeriodPoolIsEmpty = "1s" -WaitPeriodSendSequence = "15s" -LastBatchVirtualizationTimeMaxWaitPeriod = "300s" -WaitBlocksToUpdateGER = 10 -WaitBlocksToConsiderGerFinal = 10 -ElapsedTimeToCloseBatchWithoutTxsDueToNewGER = "60s" -MinTimeToCloseBatch = "60s" -MaxTimeForBatchToBeOpen = "15s" +WaitPeriodSendSequence = "5s" +LastBatchVirtualizationTimeMaxWaitPeriod = "5s" BlocksAmountForTxsToBeDeleted = 100 FrequencyToCheckTxsForDelete = "12h" MaxTxsPerBatch = 150 @@ -84,9 +79,26 @@ MaxMemAligns = 262144 MaxArithmetics = 262144 MaxBinaries = 262144 MaxSteps = 8388608 +WeightBatchBytesSize = 1 +WeightCumulativeGasUsed = 1 +WeightKeccakHashes = 1 +WeightPoseidonHashes = 1 +WeightPoseidonPaddings = 1 +WeightMemAligns = 1 +WeightArithmetics = 1 +WeightBinaries = 1 +WeightSteps = 1 MaxAllowedFailedCounter = 50 - [Sequencer.ProfitabilityChecker] - SendBatchesEvenWhenNotProfitable = true + [Sequencer.Finalizer] + GERDeadlineTimeoutInSec = "5s" + ForcedBatchDeadlineTimeoutInSec = "60s" + SendingToL1DeadlineTimeoutInSec = "20s" + SleepDurationInMs = "100ms" + ResourcePercentageToCloseBatch = 10 + GERFinalityNumberOfBlocks = 64 + ClosingSignalsManagerWaitForL1OperationsInSec = "10s" + SenderAddress = "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" + PrivateKeys = [{Path = "/pk/sequencer.keystore", Password = "testonly"}] [PriceGetter] Type = "default" diff --git a/config/environments/local/local.genesis.config.json b/config/environments/local/local.genesis.config.json index d4caae4a65..54db6b8369 100644 --- a/config/environments/local/local.genesis.config.json +++ b/config/environments/local/local.genesis.config.json @@ -1,76 +1,101 @@ { - "root": "0x16851d9301e0a13a24dab6b0baec16a73502cdce67e3d3efa2629c86940d34f4", + "root": "0x5c8df6a4b7748c1308a60c5380a2ff77deb5cfee3bf4fba76eef189d651d4558", "genesis": [ - { - "balance": "200000000000000000000000000", - "nonce": "1", - "address": "0x9d98deabc42dd696deb9e40b4f1cab7ddbf55988", - "bytecode": "0x608060405260043610620001675760003560e01c80637b6323c111620000c5578063d02103ca1162000078578063d02103ca146200047d578063d96a15f7146200049f578063dbc1697614620004b6578063ed6be5c914620004ce578063ee25560b14620004e5578063ff634ed7146200051657600080fd5b80637b6323c1146200037057806381b1c17414620003955780639e34070f14620003cf578063a08e8a0814620003f4578063aaa13cc2146200041e578063bab161bf146200044357600080fd5b806334ac9cf2116200011e57806334ac9cf214620002a25780633ae0504714620002c45780633da8168214620002dc5780633e1970431462000301578063463855491462000326578063647c576c146200034b57600080fd5b80630871e971146200016c57806315064c9614620001855780632072f6c514620001b657806322e95f2c14620001ce5780632dfdf0b5146200020c578063318aee3d1462000233575b600080fd5b620001836200017d36600462002432565b6200052d565b005b3480156200019257600080fd5b50602254620001a19060ff1681565b60405190151581526020015b60405180910390f35b348015620001c357600080fd5b5062000183620009cf565b348015620001db57600080fd5b50620001f3620001ed366004620024be565b62000a08565b6040516001600160a01b039091168152602001620001ad565b3480156200021957600080fd5b506200022460215481565b604051908152602001620001ad565b3480156200024057600080fd5b506200027d62000252366004620024fa565b60256020526000908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001ad565b348015620002af57600080fd5b50602754620001f3906001600160a01b031681565b348015620002d157600080fd5b506200022462000a5b565b348015620002e957600080fd5b50620001a1620002fb366004620025e7565b62000b4e565b3480156200030e57600080fd5b50620002246200032036600462002664565b62000c4f565b3480156200033357600080fd5b50620001836200034536600462002774565b62000cdc565b3480156200035857600080fd5b50620001836200036a3660046200285a565b62000e82565b3480156200037d57600080fd5b50620001836200038f36600462002774565b62000fe1565b348015620003a257600080fd5b50620001f3620003b4366004620028aa565b6024602052600090815260409020546001600160a01b031681565b348015620003dc57600080fd5b50620001a1620003ee366004620028aa565b62001469565b3480156200040157600080fd5b506200040b600081565b60405160ff9091168152602001620001ad565b3480156200042b57600080fd5b50620001f36200043d366004620028c4565b620014ae565b3480156200045057600080fd5b506022546200046790610100900463ffffffff1681565b60405163ffffffff9091168152602001620001ad565b3480156200048a57600080fd5b50602654620001f3906001600160a01b031681565b62000183620004b036600462002977565b620015c5565b348015620004c357600080fd5b506200018362001771565b348015620004db57600080fd5b5062000467600081565b348015620004f257600080fd5b506200022462000504366004620028aa565b60236020526000908152604090205481565b3480156200052357600080fd5b506200040b600181565b60225460ff16156200055c5760405162461bcd60e51b81526004016200055390620029de565b60405180910390fd5b60225463ffffffff610100909104811690861603620005e45760405162461bcd60e51b815260206004820152603d60248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2044657374696e6174696f6e2063616e6e6f7420626520697473656c66000000606482015260840162000553565b60008060606001600160a01b03891662000687578534146200067d5760405162461bcd60e51b8152602060048201526044602482018190527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a908201527f20416d6f756e7420646f6573206e6f74206d61746368206d6573736167652e76606482015263616c756560e01b608482015260a40162000553565b60009150620008e9565b6001600160a01b03808a1660009081526025602090815260409182902082518084019093525463ffffffff81168352640100000000900490921691810182905290156200074657604051632770a7eb60e21b81526001600160a01b038b1690639dc29fac90620006fe9033908b9060040162002a46565b600060405180830381600087803b1580156200071957600080fd5b505af11580156200072e573d6000803e3d6000fd5b505050508060200151935080600001519250620008e7565b84156200075b576200075b8a888888620017a8565b620007726001600160a01b038b1633308a62001bcc565b899350602260019054906101000a900463ffffffff169250896001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015620007c9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620007f3919081019062002ada565b8a6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000832573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200085c919081019062002ada565b8b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200089b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008c1919062002b12565b604051602001620008d59392919062002b60565b60405160208183030381529060405291505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600083858b8b8b876021546040516200092b98979695949392919062002b9d565b60405180910390a16200095662000950600084868c8c8c888051906020012062000c4f565b62001c39565b6026546001600160a01b03166333d6247d6200097162000a5b565b6040518263ffffffff1660e01b81526004016200099091815260200190565b600060405180830381600087803b158015620009ab57600080fd5b505af1158015620009c0573d6000803e3d6000fd5b50505050505050505050505050565b6027546001600160a01b03163314620009fc5760405162461bcd60e51b8152600401620005539062002c0a565b62000a0662001d8a565b565b600060246000848460405160200162000a2392919062002c67565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b602154600090819081805b602081101562000b45578260011660010362000ac6576001816020811062000a925762000a9262002c91565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000af3565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b62000b0060028462002cd3565b6040805160208101859052908101849052909350606001604051602081830303815290604052805190602001209150808062000b3c9062002cea565b91505062000a66565b50919392505050565b6000846001600160401b038416825b602081101562000c40578160011660010362000bca5786818151811062000b885762000b8862002c91565b60200260200101518360405160200162000bac929190918252602082015260400190565b60405160208183030381529060405280519060200120925062000c1c565b8287828151811062000be05762000be062002c91565b602002602001015160405160200162000c03929190918252602082015260400190565b6040516020818303038152906040528051906020012092505b62000c2960028362002cd3565b91508062000c378162002cea565b91505062000b5d565b5050821490505b949350505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b60225460ff161562000d025760405162461bcd60e51b81526004016200055390620029de565b62000d188a8a8a8a8a8a8a8a8a8a600162001de8565b62000d298963ffffffff1662002073565b6000836001600160a01b03168387898560405160240162000d4d9392919062002d06565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000d84919062002d41565b60006040518083038185875af1925050503d806000811462000dc3576040519150601f19603f3d011682016040523d82523d6000602084013e62000dc8565b606091505b505090508062000e345760405162461bcd60e51b815260206004820152603060248201527f506f6c79676f6e5a6b45564d4272696467653a3a636c61696d4d65737361676560448201526f0e8813595cdcd859d94819985a5b195960821b606482015260840162000553565b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459838a8888878760405162000e6d95949392919062002d5f565b60405180910390a15050505050505050505050565b600054610100900460ff161580801562000ea35750600054600160ff909116105b8062000ebf5750303b15801562000ebf575060005460ff166001145b62000f245760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162000553565b6000805460ff19166001179055801562000f48576000805461ff0019166101001790555b6022805463ffffffff86166101000264ffffffff0019909116179055602680546001600160a01b038086166001600160a01b0319928316179092556027805492851692909116919091179055801562000fdb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60225460ff1615620010075760405162461bcd60e51b81526004016200055390620029de565b6200101d8a8a8a8a8a8a8a8a8a8a600062001de8565b6200102e8963ffffffff1662002073565b6001600160a01b0385166200112557604080516000808252602082019092526001600160a01b03851690849060405162001069919062002d41565b60006040518083038185875af1925050503d8060008114620010a8576040519150601f19603f3d011682016040523d82523d6000602084013e620010ad565b606091505b50509050806200111e5760405162461bcd60e51b815260206004820152603560248201527f506f6c79676f6e5a6b45564d4272696467653a3a636c61696d41737365743a20604482015274115d1a195c881d1c985b9cd9995c8819985a5b1959605a1b606482015260840162000553565b506200141c565b60225463ffffffff6101009091048116908716036200115a57620011546001600160a01b0386168484620020b5565b6200141c565b600086866040516020016200117192919062002c67565b60408051601f198184030181529181528151602092830120600081815260249093529120549091506001600160a01b031680620013b457600080600085806020019051810190620011c3919062002d96565b925092509250600085848484604051620011dd9062002399565b620011eb9392919062002b60565b8190604051809103906000f59050801580156200120c573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062001240908c908c9060040162002a46565b600060405180830381600087803b1580156200125b57600080fd5b505af115801562001270573d6000803e3d6000fd5b50505050806024600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808d63ffffffff1681526020018c6001600160a01b031681525060256000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507fccd7715648d1f2bb13e158f96b5b6c3aeda555d4cb87112e274a6f28bc571d598c8c83604051620013a29392919063ffffffff9390931683526001600160a01b03918216602084015216604082015260600190565b60405180910390a15050505062001419565b6040516340c10f1960e01b81526001600160a01b038216906340c10f1990620013e4908890889060040162002a46565b600060405180830381600087803b158015620013ff57600080fd5b505af115801562001414573d6000803e3d6000fd5b505050505b50505b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe2754598389878786866040516200145595949392919062002d5f565b60405180910390a150505050505050505050565b6000806200147a6101008462002cd3565b905060006200148c6101008562002e0b565b60009283526023602052604090922054600190921b9182169091149392505050565b6000808888604051602001620014c692919062002c67565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620014f99062002399565b601f1982820381018352601f90910116604081905262001526908d908d908d908d908d9060200162002e4b565b60408051601f198184030181529082905262001546929160200162002e8c565b604051602081830303815290604052805190602001206040516020016200159f94939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60225460ff1615620015eb5760405162461bcd60e51b81526004016200055390620029de565b60225463ffffffff610100909104811690841603620016735760405162461bcd60e51b815260206004820152603f60248201527f506f6c79676f6e5a6b45564d4272696467653a3a6272696467654d657373616760448201527f653a2044657374696e6174696f6e2063616e6e6f7420626520697473656c6600606482015260840162000553565b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001602260019054906101000a900463ffffffff163386863487602154604051620016c798979695949392919062002b9d565b60405180910390a1620016fe620009506001602260019054906101000a900463ffffffff1633878734888051906020012062000c4f565b6026546001600160a01b03166333d6247d6200171962000a5b565b6040518263ffffffff1660e01b81526004016200173891815260200190565b600060405180830381600087803b1580156200175357600080fd5b505af115801562001768573d6000803e3d6000fd5b50505050505050565b6027546001600160a01b031633146200179e5760405162461bcd60e51b8152600401620005539062002c0a565b62000a06620020d7565b6000620017eb83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506200218692505050565b9050632afa533160e01b6001600160e01b0319821601620019e05760008080808080806200181d896004818d62002ebf565b8101906200182c919062002eeb565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146200186e5760405162461bcd60e51b8152600401620005539062002f46565b6001600160a01b0386163014620018995760405162461bcd60e51b8152600401620005539062002fa3565b8a85146200190c5760405162461bcd60e51b815260206004820152603960248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a205065726044820152780dad2e840c2dadeeadce840c8decae640dcdee840dac2e8c6d603b1b606482015260840162000553565b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e16916200198c919062002d41565b6000604051808303816000865af19150503d8060008114620019cb576040519150601f19603f3d011682016040523d82523d6000602084013e620019d0565b606091505b5050505050505050505062001bc5565b6001600160e01b031981166323f2ebc360e21b1462001a565760405162461bcd60e51b815260206004820152602b60248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a204e6f7460448201526a081d985b1a590818d85b1b60aa1b606482015260840162000553565b60008080808080808062001a6e8a6004818e62002ebf565b81019062001a7d919062003005565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001ac15760405162461bcd60e51b8152600401620005539062002f46565b6001600160a01b038716301462001aec5760405162461bcd60e51b8152600401620005539062002fa3565b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162001b75919062002d41565b6000604051808303816000865af19150503d806000811462001bb4576040519150601f19603f3d011682016040523d82523d6000602084013e62001bb9565b606091505b50505050505050505050505b5050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000fdb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526200218d565b80600162001c4a602060026200318e565b62001c5691906200319c565b6021541062001cbb5760405162461bcd60e51b815260206004820152602a60248201527f4465706f736974436f6e74726163743a5f6465706f7369743a204d65726b6c65604482015269081d1c995948199d5b1b60b21b606482015260840162000553565b60016021600082825462001cd09190620031b6565b909155505060215460005b602081101562001d7a578160011660010362001d1057826001826020811062001d085762001d0862002c91565b015550505050565b6001816020811062001d265762001d2662002c91565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925060028262001d63919062002cd3565b91508062001d718162002cea565b91505062001cdb565b5062001d85620031d1565b505050565b60225460ff161562001db05760405162461bcd60e51b81526004016200055390620029de565b6022805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b62001df98a63ffffffff1662001469565b1562001e505760405162461bcd60e51b815260206004820152603060248201526000805160206200477983398151915260448201526f08105b1c9958591e4818db185a5b595960821b606482015260840162000553565b6026546040805160208082018d90528183018c9052825180830384018152606083019384905280519101206312bd9b1960e11b90925260648101919091526000916001600160a01b03169063257b3632906084016020604051808303816000875af115801562001ec4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001eea9190620031e7565b90508060000362001f4d5760405162461bcd60e51b81526020600482015260376024820152600080516020620047798339815191526044820152760811db1bd8985b115e1a5d149bdbdd081a5b9d985b1a59604a1b606482015260840162000553565b60225463ffffffff878116610100909204161462001fcf5760405162461bcd60e51b815260206004820152604360248201526000805160206200477983398151915260448201527f2044657374696e6174696f6e206e6574776f726b20646f6573206e6f74206d616064820152620e8c6d60eb1b608482015260a40162000553565b602254600090610100900463ffffffff1662001fed57508862001ff0565b50895b6200201b6200200c848b8b8b8b8b8b8051906020012062000c4f565b8e8e63ffffffff168462000b4e565b620009c05760405162461bcd60e51b81526020600482015260326024820152600080516020620047798339815191526044820152711024b73b30b634b21039b6ba10383937b7b360711b606482015260840162000553565b6000620020836101008362002cd3565b90506000620020956101008462002e0b565b6000928352602360205260409092208054600190931b9092179091555050565b62001d858363a9059cbb60e01b848460405160240162001c0192919062002a46565b60225460ff16620021515760405162461bcd60e51b815260206004820152603b60248201527f456d657267656e63794d616e616765723a3a6966456d657267656e637953746160448201527f74653a206f6e6c7920696620656d657267656e63792073746174650000000000606482015260840162000553565b6022805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6020015190565b6000620021e4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620022669092919063ffffffff16565b80519091501562001d85578080602001905181019062002205919062003201565b62001d855760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000553565b606062000c47848460008585600080866001600160a01b0316858760405162002290919062002d41565b60006040518083038185875af1925050503d8060008114620022cf576040519150601f19603f3d011682016040523d82523d6000602084013e620022d4565b606091505b5091509150620022e787838387620022f2565b979650505050505050565b60608315620023665782516000036200235e576001600160a01b0385163b6200235e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000553565b508162000c47565b62000c4783838151156200237d5781518083602001fd5b8060405162461bcd60e51b815260040162000553919062003221565b611542806200323783390190565b6001600160a01b0381168114620023bd57600080fd5b50565b8035620023cd81620023a7565b919050565b803563ffffffff81168114620023cd57600080fd5b60008083601f840112620023fa57600080fd5b5081356001600160401b038111156200241257600080fd5b6020830191508360208285010111156200242b57600080fd5b9250929050565b60008060008060008060a087890312156200244c57600080fd5b86356200245981620023a7565b95506200246960208801620023d2565b945060408701356200247b81620023a7565b93506060870135925060808701356001600160401b038111156200249e57600080fd5b620024ac89828a01620023e7565b979a9699509497509295939492505050565b60008060408385031215620024d257600080fd5b620024dd83620023d2565b91506020830135620024ef81620023a7565b809150509250929050565b6000602082840312156200250d57600080fd5b81356200251a81620023a7565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562002562576200256262002521565b604052919050565b600082601f8301126200257c57600080fd5b813560206001600160401b038211156200259a576200259a62002521565b8160051b620025ab82820162002537565b9283528481018201928281019087851115620025c657600080fd5b83870192505b84831015620022e757823582529183019190830190620025cc565b60008060008060808587031215620025fe57600080fd5b8435935060208501356001600160401b03808211156200261d57600080fd5b6200262b888389016200256a565b94506040870135915080821682146200264357600080fd5b509396929550929360600135925050565b60ff81168114620023bd57600080fd5b600080600080600080600060e0888a0312156200268057600080fd5b87356200268d8162002654565b96506200269d60208901620023d2565b95506040880135620026af81620023a7565b9450620026bf60608901620023d2565b93506080880135620026d181620023a7565b9699959850939692959460a0840135945060c09093013592915050565b60006001600160401b038211156200270a576200270a62002521565b50601f01601f191660200190565b600082601f8301126200272a57600080fd5b8135620027416200273b82620026ee565b62002537565b8181528460208386010111156200275757600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806000806000806000806101408b8d0312156200279557600080fd5b8a356001600160401b0380821115620027ad57600080fd5b620027bb8e838f016200256a565b9b50620027cb60208e01620023d2565b9a5060408d0135995060608d01359850620027e960808e01620023d2565b9750620027f960a08e01620023c0565b96506200280960c08e01620023d2565b95506200281960e08e01620023c0565b94506101008d013593506101208d01359150808211156200283957600080fd5b50620028488d828e0162002718565b9150509295989b9194979a5092959850565b6000806000606084860312156200287057600080fd5b6200287b84620023d2565b925060208401356200288d81620023a7565b915060408401356200289f81620023a7565b809150509250925092565b600060208284031215620028bd57600080fd5b5035919050565b600080600080600080600060a0888a031215620028e057600080fd5b620028eb88620023d2565b96506020880135620028fd81620023a7565b955060408801356001600160401b03808211156200291a57600080fd5b620029288b838c01620023e7565b909750955060608a01359150808211156200294257600080fd5b50620029518a828b01620023e7565b9094509250506080880135620029678162002654565b8091505092959891949750929550565b6000806000606084860312156200298d57600080fd5b6200299884620023d2565b92506020840135620029aa81620023a7565b915060408401356001600160401b03811115620029c657600080fd5b620029d48682870162002718565b9150509250925092565b60208082526042908201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960408201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606082015261746560f01b608082015260a00190565b6001600160a01b03929092168252602082015260400190565b60005b8381101562002a7c57818101518382015260200162002a62565b8381111562000fdb5750506000910152565b600082601f83011262002aa057600080fd5b815162002ab16200273b82620026ee565b81815284602083860101111562002ac757600080fd5b62000c4782602083016020870162002a5f565b60006020828403121562002aed57600080fd5b81516001600160401b0381111562002b0457600080fd5b62000c478482850162002a8e565b60006020828403121562002b2557600080fd5b81516200251a8162002654565b6000815180845262002b4c81602086016020860162002a5f565b601f01601f19169290920160200192915050565b60608152600062002b75606083018662002b32565b828103602084015262002b89818662002b32565b91505060ff83166040830152949350505050565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c0830181905260009162002bf18483018762002b32565b925080851660e085015250509998505050505050505050565b6020808252603a908201527f506f6c79676f6e5a6b45564d3a3a6f6e6c79506f6c79676f6e5a6b45564d3a2060408201527f6f6e6c7920506f6c79676f6e5a6b45564d20636f6e7472616374000000000000606082015260800190565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008262002ce55762002ce562002ca7565b500490565b60006001820162002cff5762002cff62002cbd565b5060010190565b6001600160a01b038416815263ffffffff8316602082015260606040820181905260009062002d389083018462002b32565b95945050505050565b6000825162002d5581846020870162002a5f565b9190910192915050565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b60008060006060848603121562002dac57600080fd5b83516001600160401b038082111562002dc457600080fd5b62002dd28783880162002a8e565b9450602086015191508082111562002de957600080fd5b5062002df88682870162002a8e565b92505060408401516200289f8162002654565b60008262002e1d5762002e1d62002ca7565b500690565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60608152600062002e6160608301878962002e22565b828103602084015262002e7681868862002e22565b91505060ff831660408301529695505050505050565b6000835162002ea081846020880162002a5f565b83519083019062002eb681836020880162002a5f565b01949350505050565b6000808585111562002ed057600080fd5b8386111562002ede57600080fd5b5050820193919092039150565b600080600080600080600060e0888a03121562002f0757600080fd5b873562002f1481620023a7565b9650602088013562002f2681620023a7565b955060408801359450606088013593506080880135620026d18162002654565b6020808252603c908201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2050657260408201527f6d6974206f776e6572206d757374206265207468652073656e64657200000000606082015260800190565b60208082526033908201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a205370656040820152726e646572206d7573742062652027746869732760681b606082015260800190565b8015158114620023bd57600080fd5b600080600080600080600080610100898b0312156200302357600080fd5b88356200303081620023a7565b975060208901356200304281620023a7565b965060408901359550606089013594506080890135620030628162002ff6565b935060a0890135620030748162002654565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115620030d2578160001904821115620030b657620030b662002cbd565b80851615620030c457918102915b93841c939080029062003096565b509250929050565b600082620030eb5750600162000a55565b81620030fa5750600062000a55565b81600181146200311357600281146200311e576200313e565b600191505062000a55565b60ff84111562003132576200313262002cbd565b50506001821b62000a55565b5060208310610133831016604e8410600b841016171562003163575081810a62000a55565b6200316f838362003091565b806000190482111562003186576200318662002cbd565b029392505050565b60006200251a8383620030da565b600082821015620031b157620031b162002cbd565b500390565b60008219821115620031cc57620031cc62002cbd565b500190565b634e487b7160e01b600052600160045260246000fd5b600060208284031215620031fa57600080fd5b5051919050565b6000602082840312156200321457600080fd5b81516200251a8162002ff6565b6020815260006200251a602083018462002b3256fe60c06040523480156200001157600080fd5b5060405162001542380380620015428339810160408190526200003491620002ad565b82826003620000448382620003c1565b506004620000538282620003c1565b5050600580546001600160a81b0319163360ff60a01b191617600160a01b60ff851602179055504660808190526200008b9062000098565b60a052506200048d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000c562000146565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b606060038054620001579062000332565b80601f0160208091040260200160405190810160405280929190818152602001828054620001859062000332565b8015620001d65780601f10620001aa57610100808354040283529160200191620001d6565b820191906000526020600020905b815481529060010190602001808311620001b857829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200020857600080fd5b81516001600160401b0380821115620002255762000225620001e0565b604051601f8301601f19908116603f01168101908282118183101715620002505762000250620001e0565b816040528381526020925086838588010111156200026d57600080fd5b600091505b8382101562000291578582018301518183018401529082019062000272565b83821115620002a35760008385830101525b9695505050505050565b600080600060608486031215620002c357600080fd5b83516001600160401b0380821115620002db57600080fd5b620002e987838801620001f6565b945060208601519150808211156200030057600080fd5b506200030f86828701620001f6565b925050604084015160ff811681146200032757600080fd5b809150509250925092565b600181811c908216806200034757607f821691505b6020821081036200036857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003bc57600081815260208120601f850160051c81016020861015620003975750805b601f850160051c820191505b81811015620003b857828155600101620003a3565b5050505b505050565b81516001600160401b03811115620003dd57620003dd620001e0565b620003f581620003ee845462000332565b846200036e565b602080601f8311600181146200042d5760008415620004145750858301515b600019600386901b1c1916600185901b178555620003b8565b600085815260208120601f198616915b828110156200045e578886015182559484019460019091019084016200043d565b50858210156200047d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611088620004ba60003960006104690152600081816102f9015261043301526110886000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146102ce578063a9059cbb146102e1578063cd0d0096146102f4578063d505accf1461031b578063dd62ed3e1461032e578063ffa1ad741461034157600080fd5b806370a082311461023f5780637ecebe001461026857806395d89b41146102885780639dc29fac14610290578063a3c573eb146102a357600080fd5b806330adf81f116100ff57806330adf81f146101c9578063313ce567146101f05780633644e5151461020f578063395093511461021757806340c10f191461022a57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806320606b701461018f57806323b872dd146101b6575b600080fd5b610144610361565b6040516101519190610dc2565b60405180910390f35b61016d610168366004610e33565b6103f3565b6040519015158152602001610151565b6002545b604051908152602001610151565b6101817f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61016d6101c4366004610e5d565b61040b565b6101817f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b600554600160a01b900460ff1660405160ff9091168152602001610151565b61018161042f565b61016d610225366004610e33565b61048b565b61023d610238366004610e33565b6104ad565b005b61018161024d366004610e99565b6001600160a01b031660009081526020819052604090205490565b610181610276366004610e99565b60066020526000908152604090205481565b6101446104ee565b61023d61029e366004610e33565b6104fd565b6005546102b6906001600160a01b031681565b6040516001600160a01b039091168152602001610151565b61016d6102dc366004610e33565b610531565b61016d6102ef366004610e33565b6105ac565b6101817f000000000000000000000000000000000000000000000000000000000000000081565b61023d610329366004610ebb565b6105ba565b61018161033c366004610f2e565b6107f5565b610144604051806040016040528060018152602001603160f81b81525081565b60606003805461037090610f61565b80601f016020809104026020016040519081016040528092919081815260200182805461039c90610f61565b80156103e95780601f106103be576101008083540402835291602001916103e9565b820191906000526020600020905b8154815290600101906020018083116103cc57829003601f168201915b5050505050905090565b600033610401818585610820565b5060019392505050565b600033610419858285610945565b6104248585856109bf565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104665761046146610b51565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b60003361040181858561049e83836107f5565b6104a89190610fb1565b610820565b6005546001600160a01b031633146104e05760405162461bcd60e51b81526004016104d790610fc9565b60405180910390fd5b6104ea8282610bfd565b5050565b60606004805461037090610f61565b6005546001600160a01b031633146105275760405162461bcd60e51b81526004016104d790610fc9565b6104ea8282610caa565b6000338161053f82866107f5565b90508381101561059f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104d7565b6104248286868403610820565b6000336104018185856109bf565b834211156106165760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104d7565b6001600160a01b038716600090815260066020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661066383611019565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106c161042f565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107825750896001600160a01b0316816001600160a01b0316145b6107de5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104d7565b6107e98a8a8a610820565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108825760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104d7565b6001600160a01b0382166108e35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104d7565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061095184846107f5565b905060001981146109b957818110156109ac5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104d7565b6109b98484848403610820565b50505050565b6001600160a01b038316610a235760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104d7565b6001600160a01b038216610a855760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104d7565b6001600160a01b03831660009081526020819052604090205481811015610afd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104d7565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611033833981519152910160405180910390a36109b9565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610b7c610361565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c535760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104d7565b8060026000828254610c659190610fb1565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611033833981519152910160405180910390a35050565b6001600160a01b038216610d0a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104d7565b6001600160a01b03821660009081526020819052604090205481811015610d7e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104d7565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110338339815191529101610938565b600060208083528351808285015260005b81811015610def57858101830151858201604001528201610dd3565b81811115610e01576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114610e2e57600080fd5b919050565b60008060408385031215610e4657600080fd5b610e4f83610e17565b946020939093013593505050565b600080600060608486031215610e7257600080fd5b610e7b84610e17565b9250610e8960208501610e17565b9150604084013590509250925092565b600060208284031215610eab57600080fd5b610eb482610e17565b9392505050565b600080600080600080600060e0888a031215610ed657600080fd5b610edf88610e17565b9650610eed60208901610e17565b95506040880135945060608801359350608088013560ff81168114610f1157600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f4157600080fd5b610f4a83610e17565b9150610f5860208401610e17565b90509250929050565b600181811c90821680610f7557607f821691505b602082108103610f9557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115610fc457610fc4610f9b565b500190565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161102b5761102b610f9b565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212208b7986f78e961ad6c0885b86b24ce427045be98073c1f3d7fe18180542ab873564736f6c634300080f0033506f6c79676f6e5a6b45564d4272696467653a3a5f7665726966794c6561663aa26469706673582212207321963add10aa42fbf70097691018c23164a96132c6cd71e46023fffa7d461764736f6c634300080f0033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x01", - "0x0000000000000000000000000000000000000000000000000000000000000022": "0x0100", - "0x0000000000000000000000000000000000000000000000000000000000000026": "0xae4bb80be56b819606589de61d5ec3b522eeb032" - }, - "contractName": "PolygonZkEVMBridge" - }, - { - "balance": "0", - "nonce": "3", - "address": "0xc949254d682d8c9ad5682521675b8f43b102aec4", - "pvtKey": "0xdfd01798f92667dbf91df722434e8fbe96af0211d4d1b82bbbbc8f1def7a814f" - }, - { - "balance": "100000000000000000000000", - "nonce": "0", - "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "pvtKey": "0x00" - }, - { - "balance": "0", - "nonce": "1", - "address": "0xae4bb80be56b819606589de61d5ec3b522eeb032", - "bytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b366004610164565b60006020819052908152604090205481565b6100a061009b366004610164565b6100cd565b005b6002546100b5906001600160a01b031681565b6040516001600160a01b039091168152602001610064565b6002546001600160a01b0316331461015f5760405162461bcd60e51b815260206004820152604560248201527f506f6c79676f6e5a6b45564d476c6f62616c45786974526f6f744c323a3a757060448201527f6461746545786974526f6f743a204f6e6c7920506f6c79676f6e5a6b45564d42606482015264726964676560d81b608482015260a40160405180910390fd5b600155565b60006020828403121561017657600080fd5b503591905056fea2646970667358221220515fd6c3d86946bd7f5a4ef86115f8c7ba072b8c318ac2c46e1526fb50a66c3364736f6c634300080f0033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x9d98deabc42dd696deb9e40b4f1cab7ddbf55988" - }, - "contractName": "PolygonZkEVMGlobalExitRootL2" + { + "contractName": "PolygonZkEVMDeployer", + "balance": "0", + "nonce": "4", + "address": "0x70c5dCfCdf437D051c49C13356958fADf9323913", + "bytecode": "0x6080604052600436106100605760003560e01c80632b79805a146100655780634a94d4871461007a5780636d07dbf81461008d578063715018a6146100c35780638da5cb5b146100d8578063e11ae6cb146100f6578063f2fde38b14610109575b600080fd5b610078610073366004610733565b610129565b005b6100786100883660046107c6565b610189565b34801561009957600080fd5b506100ad6100a836600461081d565b6101cb565b6040516100ba919061083f565b60405180910390f35b3480156100cf57600080fd5b506100786101de565b3480156100e457600080fd5b506000546001600160a01b03166100ad565b610078610104366004610853565b6101f2565b34801561011557600080fd5b506100786101243660046108a3565b610246565b6101316102c4565b600061013e85858561031e565b905061014a818361041e565b507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c8160405161017a919061083f565b60405180910390a15050505050565b6101916102c4565b61019c838383610462565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b90600090a1505050565b60006101d78383610490565b9392505050565b6101e66102c4565b6101f0600061049d565b565b6101fa6102c4565b600061020784848461031e565b90507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c81604051610238919061083f565b60405180910390a150505050565b61024e6102c4565b6001600160a01b0381166102b85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6102c18161049d565b50565b6000546001600160a01b031633146101f05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102af565b6000834710156103705760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016102af565b81516000036103c15760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016102af565b8282516020840186f590506001600160a01b0381166101d75760405162461bcd60e51b8152602060048201526019602482015278437265617465323a204661696c6564206f6e206465706c6f7960381b60448201526064016102af565b60606101d7838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506104ed565b6060610488848484604051806060016040528060298152602001610932602991396104ed565b949350505050565b60006101d78383306105c8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60608247101561054e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016102af565b600080866001600160a01b0316858760405161056a91906108e2565b60006040518083038185875af1925050503d80600081146105a7576040519150601f19603f3d011682016040523d82523d6000602084013e6105ac565b606091505b50915091506105bd878383876105f2565b979650505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6060831561066157825160000361065a576001600160a01b0385163b61065a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102af565b5081610488565b61048883838151156106765781518083602001fd5b8060405162461bcd60e51b81526004016102af91906108fe565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126106b757600080fd5b813567ffffffffffffffff808211156106d2576106d2610690565b604051601f8301601f19908116603f011681019082821181831017156106fa576106fa610690565b8160405283815286602085880101111561071357600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561074957600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561076f57600080fd5b61077b888389016106a6565b9350606087013591508082111561079157600080fd5b5061079e878288016106a6565b91505092959194509250565b80356001600160a01b03811681146107c157600080fd5b919050565b6000806000606084860312156107db57600080fd5b6107e4846107aa565b9250602084013567ffffffffffffffff81111561080057600080fd5b61080c868287016106a6565b925050604084013590509250925092565b6000806040838503121561083057600080fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b60008060006060848603121561086857600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561088d57600080fd5b610899868287016106a6565b9150509250925092565b6000602082840312156108b557600080fd5b6101d7826107aa565b60005b838110156108d95781810151838201526020016108c1565b50506000910152565b600082516108f48184602087016108be565b9190910192915050565b602081526000825180602084015261091d8160408501602087016108be565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212207bb17a87bc2c0ad76098275332177f42e104a72ca11bed987dfdf2a11cc1edaa64736f6c63430008110033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000cae25c8623761783fe4ce241c9b428126a7612a" } - ], - "transactions": [ - { - "rawTx": "0xf902768080839896808080b90266608060405234801561001057600080fd5b5060405161024638038061024683398101604081905261002f91610054565b600280546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6101b3806100936000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b366004610164565b60006020819052908152604090205481565b6100a061009b366004610164565b6100cd565b005b6002546100b5906001600160a01b031681565b6040516001600160a01b039091168152602001610064565b6002546001600160a01b0316331461015f5760405162461bcd60e51b815260206004820152604560248201527f506f6c79676f6e5a6b45564d476c6f62616c45786974526f6f744c323a3a757060448201527f6461746545786974526f6f743a204f6e6c7920506f6c79676f6e5a6b45564d42606482015264726964676560d81b608482015260a40160405180910390fd5b600155565b60006020828403121561017657600080fd5b503591905056fea2646970667358221220515fd6c3d86946bd7f5a4ef86115f8c7ba072b8c318ac2c46e1526fb50a66c3364736f6c634300080f00330000000000000000000000009d98deabc42dd696deb9e40b4f1cab7ddbf559888203e8808062c7b6ed3f97f48cb0c909b6fc5fa0bda9ae0392c5e3c6abb883afff10d8843d354c515eb025b1ea82e17a389a23d5d4b0b6dbc45cbf215d181958094d03c4b11b", - "receipt": { - "status": 1, - "gasUsed": "0x029ed4", - "logs": [] - }, - "createAddress": "0xae4bb80be56b819606589de61d5ec3b522eeb032" - }, - { - "rawTx": "0xf947fe0180839896808080b947ee608060405234801561001057600080fd5b506147ce806100206000396000f3fe608060405260043610620001675760003560e01c80637b6323c111620000c5578063d02103ca1162000078578063d02103ca146200047d578063d96a15f7146200049f578063dbc1697614620004b6578063ed6be5c914620004ce578063ee25560b14620004e5578063ff634ed7146200051657600080fd5b80637b6323c1146200037057806381b1c17414620003955780639e34070f14620003cf578063a08e8a0814620003f4578063aaa13cc2146200041e578063bab161bf146200044357600080fd5b806334ac9cf2116200011e57806334ac9cf214620002a25780633ae0504714620002c45780633da8168214620002dc5780633e1970431462000301578063463855491462000326578063647c576c146200034b57600080fd5b80630871e971146200016c57806315064c9614620001855780632072f6c514620001b657806322e95f2c14620001ce5780632dfdf0b5146200020c578063318aee3d1462000233575b600080fd5b620001836200017d36600462002432565b6200052d565b005b3480156200019257600080fd5b50602254620001a19060ff1681565b60405190151581526020015b60405180910390f35b348015620001c357600080fd5b5062000183620009cf565b348015620001db57600080fd5b50620001f3620001ed366004620024be565b62000a08565b6040516001600160a01b039091168152602001620001ad565b3480156200021957600080fd5b506200022460215481565b604051908152602001620001ad565b3480156200024057600080fd5b506200027d62000252366004620024fa565b60256020526000908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001ad565b348015620002af57600080fd5b50602754620001f3906001600160a01b031681565b348015620002d157600080fd5b506200022462000a5b565b348015620002e957600080fd5b50620001a1620002fb366004620025e7565b62000b4e565b3480156200030e57600080fd5b50620002246200032036600462002664565b62000c4f565b3480156200033357600080fd5b50620001836200034536600462002774565b62000cdc565b3480156200035857600080fd5b50620001836200036a3660046200285a565b62000e82565b3480156200037d57600080fd5b50620001836200038f36600462002774565b62000fe1565b348015620003a257600080fd5b50620001f3620003b4366004620028aa565b6024602052600090815260409020546001600160a01b031681565b348015620003dc57600080fd5b50620001a1620003ee366004620028aa565b62001469565b3480156200040157600080fd5b506200040b600081565b60405160ff9091168152602001620001ad565b3480156200042b57600080fd5b50620001f36200043d366004620028c4565b620014ae565b3480156200045057600080fd5b506022546200046790610100900463ffffffff1681565b60405163ffffffff9091168152602001620001ad565b3480156200048a57600080fd5b50602654620001f3906001600160a01b031681565b62000183620004b036600462002977565b620015c5565b348015620004c357600080fd5b506200018362001771565b348015620004db57600080fd5b5062000467600081565b348015620004f257600080fd5b506200022462000504366004620028aa565b60236020526000908152604090205481565b3480156200052357600080fd5b506200040b600181565b60225460ff16156200055c5760405162461bcd60e51b81526004016200055390620029de565b60405180910390fd5b60225463ffffffff610100909104811690861603620005e45760405162461bcd60e51b815260206004820152603d60248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2044657374696e6174696f6e2063616e6e6f7420626520697473656c66000000606482015260840162000553565b60008060606001600160a01b03891662000687578534146200067d5760405162461bcd60e51b8152602060048201526044602482018190527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a908201527f20416d6f756e7420646f6573206e6f74206d61746368206d6573736167652e76606482015263616c756560e01b608482015260a40162000553565b60009150620008e9565b6001600160a01b03808a1660009081526025602090815260409182902082518084019093525463ffffffff81168352640100000000900490921691810182905290156200074657604051632770a7eb60e21b81526001600160a01b038b1690639dc29fac90620006fe9033908b9060040162002a46565b600060405180830381600087803b1580156200071957600080fd5b505af11580156200072e573d6000803e3d6000fd5b505050508060200151935080600001519250620008e7565b84156200075b576200075b8a888888620017a8565b620007726001600160a01b038b1633308a62001bcc565b899350602260019054906101000a900463ffffffff169250896001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015620007c9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620007f3919081019062002ada565b8a6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000832573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200085c919081019062002ada565b8b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200089b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008c1919062002b12565b604051602001620008d59392919062002b60565b60405160208183030381529060405291505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600083858b8b8b876021546040516200092b98979695949392919062002b9d565b60405180910390a16200095662000950600084868c8c8c888051906020012062000c4f565b62001c39565b6026546001600160a01b03166333d6247d6200097162000a5b565b6040518263ffffffff1660e01b81526004016200099091815260200190565b600060405180830381600087803b158015620009ab57600080fd5b505af1158015620009c0573d6000803e3d6000fd5b50505050505050505050505050565b6027546001600160a01b03163314620009fc5760405162461bcd60e51b8152600401620005539062002c0a565b62000a0662001d8a565b565b600060246000848460405160200162000a2392919062002c67565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b602154600090819081805b602081101562000b45578260011660010362000ac6576001816020811062000a925762000a9262002c91565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000af3565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b62000b0060028462002cd3565b6040805160208101859052908101849052909350606001604051602081830303815290604052805190602001209150808062000b3c9062002cea565b91505062000a66565b50919392505050565b6000846001600160401b038416825b602081101562000c40578160011660010362000bca5786818151811062000b885762000b8862002c91565b60200260200101518360405160200162000bac929190918252602082015260400190565b60405160208183030381529060405280519060200120925062000c1c565b8287828151811062000be05762000be062002c91565b602002602001015160405160200162000c03929190918252602082015260400190565b6040516020818303038152906040528051906020012092505b62000c2960028362002cd3565b91508062000c378162002cea565b91505062000b5d565b5050821490505b949350505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b60225460ff161562000d025760405162461bcd60e51b81526004016200055390620029de565b62000d188a8a8a8a8a8a8a8a8a8a600162001de8565b62000d298963ffffffff1662002073565b6000836001600160a01b03168387898560405160240162000d4d9392919062002d06565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000d84919062002d41565b60006040518083038185875af1925050503d806000811462000dc3576040519150601f19603f3d011682016040523d82523d6000602084013e62000dc8565b606091505b505090508062000e345760405162461bcd60e51b815260206004820152603060248201527f506f6c79676f6e5a6b45564d4272696467653a3a636c61696d4d65737361676560448201526f0e8813595cdcd859d94819985a5b195960821b606482015260840162000553565b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459838a8888878760405162000e6d95949392919062002d5f565b60405180910390a15050505050505050505050565b600054610100900460ff161580801562000ea35750600054600160ff909116105b8062000ebf5750303b15801562000ebf575060005460ff166001145b62000f245760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162000553565b6000805460ff19166001179055801562000f48576000805461ff0019166101001790555b6022805463ffffffff86166101000264ffffffff0019909116179055602680546001600160a01b038086166001600160a01b0319928316179092556027805492851692909116919091179055801562000fdb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60225460ff1615620010075760405162461bcd60e51b81526004016200055390620029de565b6200101d8a8a8a8a8a8a8a8a8a8a600062001de8565b6200102e8963ffffffff1662002073565b6001600160a01b0385166200112557604080516000808252602082019092526001600160a01b03851690849060405162001069919062002d41565b60006040518083038185875af1925050503d8060008114620010a8576040519150601f19603f3d011682016040523d82523d6000602084013e620010ad565b606091505b50509050806200111e5760405162461bcd60e51b815260206004820152603560248201527f506f6c79676f6e5a6b45564d4272696467653a3a636c61696d41737365743a20604482015274115d1a195c881d1c985b9cd9995c8819985a5b1959605a1b606482015260840162000553565b506200141c565b60225463ffffffff6101009091048116908716036200115a57620011546001600160a01b0386168484620020b5565b6200141c565b600086866040516020016200117192919062002c67565b60408051601f198184030181529181528151602092830120600081815260249093529120549091506001600160a01b031680620013b457600080600085806020019051810190620011c3919062002d96565b925092509250600085848484604051620011dd9062002399565b620011eb9392919062002b60565b8190604051809103906000f59050801580156200120c573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062001240908c908c9060040162002a46565b600060405180830381600087803b1580156200125b57600080fd5b505af115801562001270573d6000803e3d6000fd5b50505050806024600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808d63ffffffff1681526020018c6001600160a01b031681525060256000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507fccd7715648d1f2bb13e158f96b5b6c3aeda555d4cb87112e274a6f28bc571d598c8c83604051620013a29392919063ffffffff9390931683526001600160a01b03918216602084015216604082015260600190565b60405180910390a15050505062001419565b6040516340c10f1960e01b81526001600160a01b038216906340c10f1990620013e4908890889060040162002a46565b600060405180830381600087803b158015620013ff57600080fd5b505af115801562001414573d6000803e3d6000fd5b505050505b50505b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe2754598389878786866040516200145595949392919062002d5f565b60405180910390a150505050505050505050565b6000806200147a6101008462002cd3565b905060006200148c6101008562002e0b565b60009283526023602052604090922054600190921b9182169091149392505050565b6000808888604051602001620014c692919062002c67565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620014f99062002399565b601f1982820381018352601f90910116604081905262001526908d908d908d908d908d9060200162002e4b565b60408051601f198184030181529082905262001546929160200162002e8c565b604051602081830303815290604052805190602001206040516020016200159f94939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60225460ff1615620015eb5760405162461bcd60e51b81526004016200055390620029de565b60225463ffffffff610100909104811690841603620016735760405162461bcd60e51b815260206004820152603f60248201527f506f6c79676f6e5a6b45564d4272696467653a3a6272696467654d657373616760448201527f653a2044657374696e6174696f6e2063616e6e6f7420626520697473656c6600606482015260840162000553565b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001602260019054906101000a900463ffffffff163386863487602154604051620016c798979695949392919062002b9d565b60405180910390a1620016fe620009506001602260019054906101000a900463ffffffff1633878734888051906020012062000c4f565b6026546001600160a01b03166333d6247d6200171962000a5b565b6040518263ffffffff1660e01b81526004016200173891815260200190565b600060405180830381600087803b1580156200175357600080fd5b505af115801562001768573d6000803e3d6000fd5b50505050505050565b6027546001600160a01b031633146200179e5760405162461bcd60e51b8152600401620005539062002c0a565b62000a06620020d7565b6000620017eb83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506200218692505050565b9050632afa533160e01b6001600160e01b0319821601620019e05760008080808080806200181d896004818d62002ebf565b8101906200182c919062002eeb565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146200186e5760405162461bcd60e51b8152600401620005539062002f46565b6001600160a01b0386163014620018995760405162461bcd60e51b8152600401620005539062002fa3565b8a85146200190c5760405162461bcd60e51b815260206004820152603960248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a205065726044820152780dad2e840c2dadeeadce840c8decae640dcdee840dac2e8c6d603b1b606482015260840162000553565b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e16916200198c919062002d41565b6000604051808303816000865af19150503d8060008114620019cb576040519150601f19603f3d011682016040523d82523d6000602084013e620019d0565b606091505b5050505050505050505062001bc5565b6001600160e01b031981166323f2ebc360e21b1462001a565760405162461bcd60e51b815260206004820152602b60248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a204e6f7460448201526a081d985b1a590818d85b1b60aa1b606482015260840162000553565b60008080808080808062001a6e8a6004818e62002ebf565b81019062001a7d919062003005565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001ac15760405162461bcd60e51b8152600401620005539062002f46565b6001600160a01b038716301462001aec5760405162461bcd60e51b8152600401620005539062002fa3565b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162001b75919062002d41565b6000604051808303816000865af19150503d806000811462001bb4576040519150601f19603f3d011682016040523d82523d6000602084013e62001bb9565b606091505b50505050505050505050505b5050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000fdb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526200218d565b80600162001c4a602060026200318e565b62001c5691906200319c565b6021541062001cbb5760405162461bcd60e51b815260206004820152602a60248201527f4465706f736974436f6e74726163743a5f6465706f7369743a204d65726b6c65604482015269081d1c995948199d5b1b60b21b606482015260840162000553565b60016021600082825462001cd09190620031b6565b909155505060215460005b602081101562001d7a578160011660010362001d1057826001826020811062001d085762001d0862002c91565b015550505050565b6001816020811062001d265762001d2662002c91565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925060028262001d63919062002cd3565b91508062001d718162002cea565b91505062001cdb565b5062001d85620031d1565b505050565b60225460ff161562001db05760405162461bcd60e51b81526004016200055390620029de565b6022805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b62001df98a63ffffffff1662001469565b1562001e505760405162461bcd60e51b815260206004820152603060248201526000805160206200477983398151915260448201526f08105b1c9958591e4818db185a5b595960821b606482015260840162000553565b6026546040805160208082018d90528183018c9052825180830384018152606083019384905280519101206312bd9b1960e11b90925260648101919091526000916001600160a01b03169063257b3632906084016020604051808303816000875af115801562001ec4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001eea9190620031e7565b90508060000362001f4d5760405162461bcd60e51b81526020600482015260376024820152600080516020620047798339815191526044820152760811db1bd8985b115e1a5d149bdbdd081a5b9d985b1a59604a1b606482015260840162000553565b60225463ffffffff878116610100909204161462001fcf5760405162461bcd60e51b815260206004820152604360248201526000805160206200477983398151915260448201527f2044657374696e6174696f6e206e6574776f726b20646f6573206e6f74206d616064820152620e8c6d60eb1b608482015260a40162000553565b602254600090610100900463ffffffff1662001fed57508862001ff0565b50895b6200201b6200200c848b8b8b8b8b8b8051906020012062000c4f565b8e8e63ffffffff168462000b4e565b620009c05760405162461bcd60e51b81526020600482015260326024820152600080516020620047798339815191526044820152711024b73b30b634b21039b6ba10383937b7b360711b606482015260840162000553565b6000620020836101008362002cd3565b90506000620020956101008462002e0b565b6000928352602360205260409092208054600190931b9092179091555050565b62001d858363a9059cbb60e01b848460405160240162001c0192919062002a46565b60225460ff16620021515760405162461bcd60e51b815260206004820152603b60248201527f456d657267656e63794d616e616765723a3a6966456d657267656e637953746160448201527f74653a206f6e6c7920696620656d657267656e63792073746174650000000000606482015260840162000553565b6022805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6020015190565b6000620021e4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620022669092919063ffffffff16565b80519091501562001d85578080602001905181019062002205919062003201565b62001d855760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000553565b606062000c47848460008585600080866001600160a01b0316858760405162002290919062002d41565b60006040518083038185875af1925050503d8060008114620022cf576040519150601f19603f3d011682016040523d82523d6000602084013e620022d4565b606091505b5091509150620022e787838387620022f2565b979650505050505050565b60608315620023665782516000036200235e576001600160a01b0385163b6200235e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000553565b508162000c47565b62000c4783838151156200237d5781518083602001fd5b8060405162461bcd60e51b815260040162000553919062003221565b611542806200323783390190565b6001600160a01b0381168114620023bd57600080fd5b50565b8035620023cd81620023a7565b919050565b803563ffffffff81168114620023cd57600080fd5b60008083601f840112620023fa57600080fd5b5081356001600160401b038111156200241257600080fd5b6020830191508360208285010111156200242b57600080fd5b9250929050565b60008060008060008060a087890312156200244c57600080fd5b86356200245981620023a7565b95506200246960208801620023d2565b945060408701356200247b81620023a7565b93506060870135925060808701356001600160401b038111156200249e57600080fd5b620024ac89828a01620023e7565b979a9699509497509295939492505050565b60008060408385031215620024d257600080fd5b620024dd83620023d2565b91506020830135620024ef81620023a7565b809150509250929050565b6000602082840312156200250d57600080fd5b81356200251a81620023a7565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562002562576200256262002521565b604052919050565b600082601f8301126200257c57600080fd5b813560206001600160401b038211156200259a576200259a62002521565b8160051b620025ab82820162002537565b9283528481018201928281019087851115620025c657600080fd5b83870192505b84831015620022e757823582529183019190830190620025cc565b60008060008060808587031215620025fe57600080fd5b8435935060208501356001600160401b03808211156200261d57600080fd5b6200262b888389016200256a565b94506040870135915080821682146200264357600080fd5b509396929550929360600135925050565b60ff81168114620023bd57600080fd5b600080600080600080600060e0888a0312156200268057600080fd5b87356200268d8162002654565b96506200269d60208901620023d2565b95506040880135620026af81620023a7565b9450620026bf60608901620023d2565b93506080880135620026d181620023a7565b9699959850939692959460a0840135945060c09093013592915050565b60006001600160401b038211156200270a576200270a62002521565b50601f01601f191660200190565b600082601f8301126200272a57600080fd5b8135620027416200273b82620026ee565b62002537565b8181528460208386010111156200275757600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806000806000806000806101408b8d0312156200279557600080fd5b8a356001600160401b0380821115620027ad57600080fd5b620027bb8e838f016200256a565b9b50620027cb60208e01620023d2565b9a5060408d0135995060608d01359850620027e960808e01620023d2565b9750620027f960a08e01620023c0565b96506200280960c08e01620023d2565b95506200281960e08e01620023c0565b94506101008d013593506101208d01359150808211156200283957600080fd5b50620028488d828e0162002718565b9150509295989b9194979a5092959850565b6000806000606084860312156200287057600080fd5b6200287b84620023d2565b925060208401356200288d81620023a7565b915060408401356200289f81620023a7565b809150509250925092565b600060208284031215620028bd57600080fd5b5035919050565b600080600080600080600060a0888a031215620028e057600080fd5b620028eb88620023d2565b96506020880135620028fd81620023a7565b955060408801356001600160401b03808211156200291a57600080fd5b620029288b838c01620023e7565b909750955060608a01359150808211156200294257600080fd5b50620029518a828b01620023e7565b9094509250506080880135620029678162002654565b8091505092959891949750929550565b6000806000606084860312156200298d57600080fd5b6200299884620023d2565b92506020840135620029aa81620023a7565b915060408401356001600160401b03811115620029c657600080fd5b620029d48682870162002718565b9150509250925092565b60208082526042908201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960408201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606082015261746560f01b608082015260a00190565b6001600160a01b03929092168252602082015260400190565b60005b8381101562002a7c57818101518382015260200162002a62565b8381111562000fdb5750506000910152565b600082601f83011262002aa057600080fd5b815162002ab16200273b82620026ee565b81815284602083860101111562002ac757600080fd5b62000c4782602083016020870162002a5f565b60006020828403121562002aed57600080fd5b81516001600160401b0381111562002b0457600080fd5b62000c478482850162002a8e565b60006020828403121562002b2557600080fd5b81516200251a8162002654565b6000815180845262002b4c81602086016020860162002a5f565b601f01601f19169290920160200192915050565b60608152600062002b75606083018662002b32565b828103602084015262002b89818662002b32565b91505060ff83166040830152949350505050565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c0830181905260009162002bf18483018762002b32565b925080851660e085015250509998505050505050505050565b6020808252603a908201527f506f6c79676f6e5a6b45564d3a3a6f6e6c79506f6c79676f6e5a6b45564d3a2060408201527f6f6e6c7920506f6c79676f6e5a6b45564d20636f6e7472616374000000000000606082015260800190565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008262002ce55762002ce562002ca7565b500490565b60006001820162002cff5762002cff62002cbd565b5060010190565b6001600160a01b038416815263ffffffff8316602082015260606040820181905260009062002d389083018462002b32565b95945050505050565b6000825162002d5581846020870162002a5f565b9190910192915050565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b60008060006060848603121562002dac57600080fd5b83516001600160401b038082111562002dc457600080fd5b62002dd28783880162002a8e565b9450602086015191508082111562002de957600080fd5b5062002df88682870162002a8e565b92505060408401516200289f8162002654565b60008262002e1d5762002e1d62002ca7565b500690565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60608152600062002e6160608301878962002e22565b828103602084015262002e7681868862002e22565b91505060ff831660408301529695505050505050565b6000835162002ea081846020880162002a5f565b83519083019062002eb681836020880162002a5f565b01949350505050565b6000808585111562002ed057600080fd5b8386111562002ede57600080fd5b5050820193919092039150565b600080600080600080600060e0888a03121562002f0757600080fd5b873562002f1481620023a7565b9650602088013562002f2681620023a7565b955060408801359450606088013593506080880135620026d18162002654565b6020808252603c908201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2050657260408201527f6d6974206f776e6572206d757374206265207468652073656e64657200000000606082015260800190565b60208082526033908201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a205370656040820152726e646572206d7573742062652027746869732760681b606082015260800190565b8015158114620023bd57600080fd5b600080600080600080600080610100898b0312156200302357600080fd5b88356200303081620023a7565b975060208901356200304281620023a7565b965060408901359550606089013594506080890135620030628162002ff6565b935060a0890135620030748162002654565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115620030d2578160001904821115620030b657620030b662002cbd565b80851615620030c457918102915b93841c939080029062003096565b509250929050565b600082620030eb5750600162000a55565b81620030fa5750600062000a55565b81600181146200311357600281146200311e576200313e565b600191505062000a55565b60ff84111562003132576200313262002cbd565b50506001821b62000a55565b5060208310610133831016604e8410600b841016171562003163575081810a62000a55565b6200316f838362003091565b806000190482111562003186576200318662002cbd565b029392505050565b60006200251a8383620030da565b600082821015620031b157620031b162002cbd565b500390565b60008219821115620031cc57620031cc62002cbd565b500190565b634e487b7160e01b600052600160045260246000fd5b600060208284031215620031fa57600080fd5b5051919050565b6000602082840312156200321457600080fd5b81516200251a8162002ff6565b6020815260006200251a602083018462002b3256fe60c06040523480156200001157600080fd5b5060405162001542380380620015428339810160408190526200003491620002ad565b82826003620000448382620003c1565b506004620000538282620003c1565b5050600580546001600160a81b0319163360ff60a01b191617600160a01b60ff851602179055504660808190526200008b9062000098565b60a052506200048d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000c562000146565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b606060038054620001579062000332565b80601f0160208091040260200160405190810160405280929190818152602001828054620001859062000332565b8015620001d65780601f10620001aa57610100808354040283529160200191620001d6565b820191906000526020600020905b815481529060010190602001808311620001b857829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200020857600080fd5b81516001600160401b0380821115620002255762000225620001e0565b604051601f8301601f19908116603f01168101908282118183101715620002505762000250620001e0565b816040528381526020925086838588010111156200026d57600080fd5b600091505b8382101562000291578582018301518183018401529082019062000272565b83821115620002a35760008385830101525b9695505050505050565b600080600060608486031215620002c357600080fd5b83516001600160401b0380821115620002db57600080fd5b620002e987838801620001f6565b945060208601519150808211156200030057600080fd5b506200030f86828701620001f6565b925050604084015160ff811681146200032757600080fd5b809150509250925092565b600181811c908216806200034757607f821691505b6020821081036200036857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003bc57600081815260208120601f850160051c81016020861015620003975750805b601f850160051c820191505b81811015620003b857828155600101620003a3565b5050505b505050565b81516001600160401b03811115620003dd57620003dd620001e0565b620003f581620003ee845462000332565b846200036e565b602080601f8311600181146200042d5760008415620004145750858301515b600019600386901b1c1916600185901b178555620003b8565b600085815260208120601f198616915b828110156200045e578886015182559484019460019091019084016200043d565b50858210156200047d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611088620004ba60003960006104690152600081816102f9015261043301526110886000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146102ce578063a9059cbb146102e1578063cd0d0096146102f4578063d505accf1461031b578063dd62ed3e1461032e578063ffa1ad741461034157600080fd5b806370a082311461023f5780637ecebe001461026857806395d89b41146102885780639dc29fac14610290578063a3c573eb146102a357600080fd5b806330adf81f116100ff57806330adf81f146101c9578063313ce567146101f05780633644e5151461020f578063395093511461021757806340c10f191461022a57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806320606b701461018f57806323b872dd146101b6575b600080fd5b610144610361565b6040516101519190610dc2565b60405180910390f35b61016d610168366004610e33565b6103f3565b6040519015158152602001610151565b6002545b604051908152602001610151565b6101817f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61016d6101c4366004610e5d565b61040b565b6101817f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b600554600160a01b900460ff1660405160ff9091168152602001610151565b61018161042f565b61016d610225366004610e33565b61048b565b61023d610238366004610e33565b6104ad565b005b61018161024d366004610e99565b6001600160a01b031660009081526020819052604090205490565b610181610276366004610e99565b60066020526000908152604090205481565b6101446104ee565b61023d61029e366004610e33565b6104fd565b6005546102b6906001600160a01b031681565b6040516001600160a01b039091168152602001610151565b61016d6102dc366004610e33565b610531565b61016d6102ef366004610e33565b6105ac565b6101817f000000000000000000000000000000000000000000000000000000000000000081565b61023d610329366004610ebb565b6105ba565b61018161033c366004610f2e565b6107f5565b610144604051806040016040528060018152602001603160f81b81525081565b60606003805461037090610f61565b80601f016020809104026020016040519081016040528092919081815260200182805461039c90610f61565b80156103e95780601f106103be576101008083540402835291602001916103e9565b820191906000526020600020905b8154815290600101906020018083116103cc57829003601f168201915b5050505050905090565b600033610401818585610820565b5060019392505050565b600033610419858285610945565b6104248585856109bf565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104665761046146610b51565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b60003361040181858561049e83836107f5565b6104a89190610fb1565b610820565b6005546001600160a01b031633146104e05760405162461bcd60e51b81526004016104d790610fc9565b60405180910390fd5b6104ea8282610bfd565b5050565b60606004805461037090610f61565b6005546001600160a01b031633146105275760405162461bcd60e51b81526004016104d790610fc9565b6104ea8282610caa565b6000338161053f82866107f5565b90508381101561059f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104d7565b6104248286868403610820565b6000336104018185856109bf565b834211156106165760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104d7565b6001600160a01b038716600090815260066020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661066383611019565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106c161042f565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107825750896001600160a01b0316816001600160a01b0316145b6107de5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104d7565b6107e98a8a8a610820565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108825760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104d7565b6001600160a01b0382166108e35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104d7565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061095184846107f5565b905060001981146109b957818110156109ac5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104d7565b6109b98484848403610820565b50505050565b6001600160a01b038316610a235760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104d7565b6001600160a01b038216610a855760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104d7565b6001600160a01b03831660009081526020819052604090205481811015610afd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104d7565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611033833981519152910160405180910390a36109b9565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610b7c610361565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c535760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104d7565b8060026000828254610c659190610fb1565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611033833981519152910160405180910390a35050565b6001600160a01b038216610d0a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104d7565b6001600160a01b03821660009081526020819052604090205481811015610d7e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104d7565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110338339815191529101610938565b600060208083528351808285015260005b81811015610def57858101830151858201604001528201610dd3565b81811115610e01576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114610e2e57600080fd5b919050565b60008060408385031215610e4657600080fd5b610e4f83610e17565b946020939093013593505050565b600080600060608486031215610e7257600080fd5b610e7b84610e17565b9250610e8960208501610e17565b9150604084013590509250925092565b600060208284031215610eab57600080fd5b610eb482610e17565b9392505050565b600080600080600080600060e0888a031215610ed657600080fd5b610edf88610e17565b9650610eed60208901610e17565b95506040880135945060608801359350608088013560ff81168114610f1157600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f4157600080fd5b610f4a83610e17565b9150610f5860208401610e17565b90509250929050565b600181811c90821680610f7557607f821691505b602082108103610f9557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115610fc457610fc4610f9b565b500190565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161102b5761102b610f9b565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212208b7986f78e961ad6c0885b86b24ce427045be98073c1f3d7fe18180542ab873564736f6c634300080f0033506f6c79676f6e5a6b45564d4272696467653a3a5f7665726966794c6561663aa26469706673582212207321963add10aa42fbf70097691018c23164a96132c6cd71e46023fffa7d461764736f6c634300080f00338203e88080777dd3dc8232ea55dbedf0681a6a9134de7200ab1334a6015345d9257ef62971780fe992e94f761de3335283ba6c1d9f3f512e05503d4526f62eb9644a1cf5681c", - "receipt": { - "status": 1, - "gasUsed": "0x3d3cde", - "logs": [] - }, - "createAddress": "0x9d98deabc42dd696deb9e40b4f1cab7ddbf55988" - }, - { - "rawTx": "0xf887028083989680949d98deabc42dd696deb9e40b4f1cab7ddbf5598880b864647c576c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ae4bb80be56b819606589de61d5ec3b522eeb03200000000000000000000000000000000000000000000000000000000000000008203e8808052465a317fd5c147ded90409a32915bbe579c557787787abbc17e67a47f773694f7fa1fd7b14ab8175e1725ec18cee985bcc262340ad5a215b097f2b3a880ee41b", - "receipt": { - "status": 1, - "gasUsed": "0x016aa5", - "logs": [ - [ - "0x9d98deabc42dd696deb9e40b4f1cab7ddbf55988", - [ - "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" - ], - "0x0000000000000000000000000000000000000000000000000000000000000001" - ] - ] - }, - "createAddress": null + }, + { + "contractName": "ProxyAdmin", + "balance": "0", + "nonce": "1", + "address": "0xF4041D86682E321927b1AEFEf2c1086A67E2b954", + "bytecode": "0x60806040526004361061006b5760003560e01c8063204e1c7a14610070578063715018a6146100a65780637eff275e146100bd5780638da5cb5b146100dd5780639623609d146100fb57806399a88ec41461010e578063f2fde38b1461012e578063f3b7dead1461014e575b600080fd5b34801561007c57600080fd5b5061009061008b366004610483565b61016e565b60405161009d91906104a7565b60405180910390f35b3480156100b257600080fd5b506100bb6101ff565b005b3480156100c957600080fd5b506100bb6100d83660046104bb565b610213565b3480156100e957600080fd5b506000546001600160a01b0316610090565b6100bb61010936600461050a565b61027d565b34801561011a57600080fd5b506100bb6101293660046104bb565b6102ec565b34801561013a57600080fd5b506100bb610149366004610483565b610320565b34801561015a57600080fd5b50610090610169366004610483565b61039e565b6000806000836001600160a01b031660405161019490635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101cf576040519150601f19603f3d011682016040523d82523d6000602084013e6101d4565b606091505b5091509150816101e357600080fd5b808060200190518101906101f791906105e0565b949350505050565b6102076103c4565b610211600061041e565b565b61021b6103c4565b6040516308f2839760e41b81526001600160a01b03831690638f283970906102479084906004016104a7565b600060405180830381600087803b15801561026157600080fd5b505af1158015610275573d6000803e3d6000fd5b505050505050565b6102856103c4565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102b590869086906004016105fd565b6000604051808303818588803b1580156102ce57600080fd5b505af11580156102e2573d6000803e3d6000fd5b5050505050505050565b6102f46103c4565b604051631b2ce7f360e11b81526001600160a01b03831690633659cfe6906102479084906004016104a7565b6103286103c4565b6001600160a01b0381166103925760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61039b8161041e565b50565b6000806000836001600160a01b0316604051610194906303e1469160e61b815260040190565b6000546001600160a01b031633146102115760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610389565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116811461039b57600080fd5b60006020828403121561049557600080fd5b81356104a08161046e565b9392505050565b6001600160a01b0391909116815260200190565b600080604083850312156104ce57600080fd5b82356104d98161046e565b915060208301356104e98161046e565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561051f57600080fd5b833561052a8161046e565b9250602084013561053a8161046e565b9150604084013567ffffffffffffffff8082111561055757600080fd5b818601915086601f83011261056b57600080fd5b81358181111561057d5761057d6104f4565b604051601f8201601f19908116603f011681019083821181831017156105a5576105a56104f4565b816040528281528960208487010111156105be57600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000602082840312156105f257600080fd5b81516104a08161046e565b60018060a01b038316815260006020604081840152835180604085015260005b818110156106395785810183015185820160600152820161061d565b506000606082860101526060601f19601f83011685010192505050939250505056fea26469706673582212206232e2e10dd0ae62d268793365a9581496905b1311fa12c8e65667fb563742fa64736f6c63430008110033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000dead72fd97a579e98aef2f9eb190066e1858d15a" } + }, + { + "contractName": "PolygonZkEVMBridge implementation", + "balance": "0", + "nonce": "1", + "address": "0xe74D91A48dD2ED0a9f5585368abDED7AF071b12C", + "bytecode": "0x608060405260043610620001435760003560e01c80633e19704311620000b9578063bab161bf1162000078578063bab161bf14620003e6578063d02103ca1462000420578063d96a15f71462000449578063dbc169761462000460578063ee25560b1462000478578063fb57083414620004a957600080fd5b80633e19704314620002f8578063647c576c146200031d57806381b1c17414620003425780639e34070f146200037c578063aaa13cc214620003c157600080fd5b80632d2c9d9411620001065780632d2c9d9414620002035780632dfdf0b51462000228578063318aee3d146200024f57806334ac9cf214620002be5780633ae0504714620002e057600080fd5b80630871e971146200014857806315064c9614620001615780632072f6c5146200019257806322e95f2c14620001aa5780632cffd02e14620001de575b600080fd5b6200015f6200015936600462002418565b620004ce565b005b3480156200016e57600080fd5b506068546200017d9060ff1681565b60405190151581526020015b60405180910390f35b3480156200019f57600080fd5b506200015f620008df565b348015620001b757600080fd5b50620001cf620001c9366004620024a4565b62000917565b604051620001899190620024e0565b348015620001eb57600080fd5b506200015f620001fd36600462002507565b6200096a565b3480156200021057600080fd5b506200015f6200022236600462002507565b62000d6e565b3480156200023557600080fd5b506200024060535481565b60405190815260200162000189565b3480156200025c57600080fd5b50620002996200026e366004620025ec565b606b6020526000908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000189565b348015620002cb57600080fd5b50606c54620001cf906001600160a01b031681565b348015620002ed57600080fd5b506200024062000ebd565b3480156200030557600080fd5b50620002406200031736600462002623565b62000fa3565b3480156200032a57600080fd5b506200015f6200033c366004620026ad565b62001030565b3480156200034f57600080fd5b50620001cf62000361366004620026fd565b606a602052600090815260409020546001600160a01b031681565b3480156200038957600080fd5b506200017d6200039b366004620026fd565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b348015620003ce57600080fd5b50620001cf620003e036600462002717565b620011ad565b348015620003f357600080fd5b506068546200040a90610100900463ffffffff1681565b60405163ffffffff909116815260200162000189565b3480156200042d57600080fd5b50606854620001cf90600160281b90046001600160a01b031681565b6200015f6200045a366004620027ca565b620012c4565b3480156200046d57600080fd5b506200015f62001448565b3480156200048557600080fd5b506200024062000497366004620026fd565b60696020526000908152604090205481565b348015620004b657600080fd5b506200017d620004c836600462002834565b6200147e565b60685460ff1615620004f357604051630bc011ff60e21b815260040160405180910390fd5b620004fd62001567565b60685463ffffffff868116610100909204161480620005235750600263ffffffff861610155b1562000542576040516302caf51760e11b815260040160405180910390fd5b6000806060856001600160a01b038a166200058257863414620005785760405163b89240f560e01b815260040160405180910390fd5b60009250620007e7565b3415620005a25760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b03808b166000908152606b602090815260409182902082518084019093525463ffffffff81168352640100000000900490921691810182905290156200066157604051632770a7eb60e21b81526001600160a01b038c1690639dc29fac90620006199033908c9060040162002881565b600060405180830381600087803b1580156200063457600080fd5b505af115801562000649573d6000803e3d6000fd5b505050508060200151945080600001519350620007e5565b85156200067657620006768b898989620015c2565b6040516370a0823160e01b81526000906001600160a01b038d16906370a0823190620006a7903090600401620024e0565b602060405180830381865afa158015620006c5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006eb91906200289a565b9050620007046001600160a01b038d1633308c62001925565b6040516370a0823160e01b81526000906001600160a01b038e16906370a082319062000735903090600401620024e0565b602060405180830381865afa15801562000753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200077991906200289a565b9050620007878282620028ca565b6068548e9850610100900463ffffffff1696509350620007a78762001992565b620007b28e62001a59565b620007bd8f62001b17565b604051602001620007d19392919062002934565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868c8c86886053546040516200082998979695949392919062002971565b60405180910390a1620008546200084e600085878d8d87898051906020012062000fa3565b62001bd8565b606854600160281b90046001600160a01b03166333d6247d6200087662000ebd565b6040518263ffffffff1660e01b81526004016200089591815260200190565b600060405180830381600087803b158015620008b057600080fd5b505af1158015620008c5573d6000803e3d6000fd5b5050505050505050620008d760018055565b505050505050565b606c546001600160a01b031633146200090b5760405163e2e8106b60e01b815260040160405180910390fd5b6200091562001cdc565b565b6000606a6000848460405160200162000932929190620029de565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156200098f57604051630bc011ff60e21b815260040160405180910390fd5b620009a68b8b8b8b8b8b8b8b8b8b8b600062001d39565b6001600160a01b03861662000a4f57604080516000808252602082019092526001600160a01b038616908590604051620009e1919062002a1e565b60006040518083038185875af1925050503d806000811462000a20576040519150601f19603f3d011682016040523d82523d6000602084013e62000a25565b606091505b505090508062000a4857604051630ce8f45160e31b815260040160405180910390fd5b5062000d20565b60685463ffffffff61010090910481169088160362000a845762000a7e6001600160a01b038716858562001eb7565b62000d20565b6000878760405160200162000a9b929190620029de565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b03168062000cb8576000808062000ae48688018862002af5565b92509250925060008584848460405162000afe9062002391565b62000b0c9392919062002934565b8190604051809103906000f590508015801562000b2d573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000b61908d908d9060040162002881565b600060405180830381600087803b15801562000b7c57600080fd5b505af115801562000b91573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000ca695949392919062002b93565b60405180910390a15050505062000d1d565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000ce8908990899060040162002881565b600060405180830381600087803b15801562000d0357600080fd5b505af115801562000d18573d6000803e3d6000fd5b505050505b50505b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459838a8888878760405162000d5995949392919062002bce565b60405180910390a15050505050505050505050565b60685460ff161562000d9357604051630bc011ff60e21b815260040160405180910390fd5b62000daa8b8b8b8b8b8b8b8b8b8b8b600162001d39565b6000846001600160a01b031684888a868660405160240162000dd0949392919062002c05565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000e07919062002a1e565b60006040518083038185875af1925050503d806000811462000e46576040519150601f19603f3d011682016040523d82523d6000602084013e62000e4b565b606091505b505090508062000e6e576040516337e391c360e01b815260040160405180910390fd5b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459838b8989888860405162000ea795949392919062002bce565b60405180910390a1505050505050505050505050565b605354600090819081805b602081101562000f9a578083901c60011660010362000f2b576033816020811062000ef75762000ef762002c42565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000f58565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b6040805160208101849052908101839052606001604051602081830303815290604052805190602001209150808062000f919062002c58565b91505062000ec8565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b600054610100900460ff1615808015620010515750600054600160ff909116105b806200106d5750303b1580156200106d575060005460ff166001145b620010d65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015620010fa576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff87160265010000000000600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b0319169184169190911790556200116062001ed9565b8015620011a7576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6000808888604051602001620011c5929190620029de565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620011f89062002391565b601f1982820381018352601f90910116604081905262001225908d908d908d908d908d9060200162002c74565b60408051601f198184030181529082905262001245929160200162002cb5565b604051602081830303815290604052805190602001206040516020016200129e94939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60685460ff1615620012e957604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8581166101009092041614806200130f5750600263ffffffff851610155b156200132e576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338787348888605354604051620013849998979695949392919062002ce8565b60405180910390a1620013cd6200084e6001606860019054906101000a900463ffffffff16338888348989604051620013bf92919062002d57565b604051809103902062000fa3565b606854600160281b90046001600160a01b03166333d6247d620013ef62000ebd565b6040518263ffffffff1660e01b81526004016200140e91815260200190565b600060405180830381600087803b1580156200142957600080fd5b505af11580156200143e573d6000803e3d6000fd5b5050505050505050565b606c546001600160a01b03163314620014745760405163e2e8106b60e01b815260040160405180910390fd5b6200091562001f0d565b600084815b60208110156200155957600163ffffffff8616821c81169003620014f557858160208110620014b657620014b662002c42565b602002013582604051602001620014d7929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001544565b818682602081106200150b576200150b62002c42565b60200201356040516020016200152b929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80620015508162002c58565b91505062001483565b50821490505b949350505050565b600260015403620015bb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620010cd565b6002600155565b6000620015d3600482848662002d67565b620015de9162002d93565b9050632afa533160e01b6001600160e01b03198216016200177f57600080808080808062001610896004818d62002d67565b8101906200161f919062002dc4565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620016605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146200168a5760405163750643af60e01b815260040160405180910390fd5b8a8514620016ab576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e16916200172b919062002a1e565b6000604051808303816000865af19150503d80600081146200176a576040519150601f19603f3d011682016040523d82523d6000602084013e6200176f565b606091505b505050505050505050506200191e565b6001600160e01b031981166323f2ebc360e21b14620017b157604051637141605d60e11b815260040160405180910390fd5b600080808080808080620017c98a6004818e62002d67565b810190620017d8919062002e2e565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146200181b5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0387163014620018455760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691620018ce919062002a1e565b6000604051808303816000865af19150503d80600081146200190d576040519150601f19603f3d011682016040523d82523d6000602084013e62001912565b606091505b50505050505050505050505b5050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620011a79085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001f66565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b03861691620019db919062002a1e565b600060405180830381855afa9150503d806000811462001a18576040519150601f19603f3d011682016040523d82523d6000602084013e62001a1d565b606091505b50915091508162001a4e57604051806040016040528060078152602001664e4f5f4e414d4560c81b8152506200155f565b6200155f816200203f565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b0386169162001aa2919062002a1e565b600060405180830381855afa9150503d806000811462001adf576040519150601f19603f3d011682016040523d82523d6000602084013e62001ae4565b606091505b50915091508162001a4e57604051806040016040528060098152602001681393d7d4d6535093d360ba1b8152506200155f565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162001b5f919062002a1e565b600060405180830381855afa9150503d806000811462001b9c576040519150601f19603f3d011682016040523d82523d6000602084013e62001ba1565b606091505b509150915081801562001bb5575080516020145b62001bc25760126200155f565b808060200190518101906200155f919062002eba565b80600162001be96020600262002fd7565b62001bf59190620028ca565b6053541062001c17576040516377ae67b360e11b815260040160405180910390fd5b600060536000815462001c2a9062002c58565b9182905550905060005b602081101562001cc6578082901c60011660010362001c6c57826033826020811062001c645762001c6462002c42565b015550505050565b6033816020811062001c825762001c8262002c42565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001cbd9062002c58565b91505062001c34565b5062001cd162002fe5565b505050565b60018055565b60685460ff161562001d0157604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b62001d4a8b63ffffffff16620021e8565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af115801562001dc5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001deb91906200289a565b90508060000362001e0e57604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff888116610100909204161462001e3f576040516302caf51760e11b815260040160405180910390fd5b606854600090610100900463ffffffff1662001e5d57508962001e60565b508a5b62001e8962001e80848c8c8c8c8c8c8c604051620013bf92919062002d57565b8f8f846200147e565b62001ea7576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b62001cd18363a9059cbb60e01b84846040516024016200195a92919062002881565b600054610100900460ff1662001f035760405162461bcd60e51b8152600401620010cd9062002ffb565b6200091562002234565b60685460ff1662001f3157604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600062001fbd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200225e9092919063ffffffff16565b80519091501562001cd1578080602001905181019062001fde919062003046565b62001cd15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620010cd565b6060604082511062002061578180602001905181019062000964919062003066565b8151602003620021b55760005b602081108015620020a157508281815181106200208f576200208f62002c42565b01602001516001600160f81b03191615155b15620020bc5780620020b38162002c58565b9150506200206e565b80600003620020f55750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b0381111562002112576200211262002a08565b6040519080825280601f01601f1916602001820160405280156200213d576020820181803683370190505b50905060005b82811015620021ad5784818151811062002161576200216162002c42565b602001015160f81c60f81b82828151811062002181576200218162002c42565b60200101906001600160f81b031916908160001a90535080620021a48162002c58565b91505062002143565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200191e57604051630c8d9eab60e31b815260040160405180910390fd5b600054610100900460ff1662001cd65760405162461bcd60e51b8152600401620010cd9062002ffb565b60606200155f848460008585600080866001600160a01b0316858760405162002288919062002a1e565b60006040518083038185875af1925050503d8060008114620022c7576040519150601f19603f3d011682016040523d82523d6000602084013e620022cc565b606091505b5091509150620022df87838387620022ea565b979650505050505050565b606083156200235e57825160000362002356576001600160a01b0385163b620023565760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620010cd565b50816200155f565b6200155f8383815115620023755781518083602001fd5b8060405162461bcd60e51b8152600401620010cd9190620030e5565b61159c80620030fb83390190565b6001600160a01b0381168114620023b557600080fd5b50565b803563ffffffff81168114620021e357600080fd5b60008083601f840112620023e057600080fd5b5081356001600160401b03811115620023f857600080fd5b6020830191508360208285010111156200241157600080fd5b9250929050565b60008060008060008060a087890312156200243257600080fd5b86356200243f816200239f565b95506200244f60208801620023b8565b9450604087013562002461816200239f565b93506060870135925060808701356001600160401b038111156200248457600080fd5b6200249289828a01620023cd565b979a9699509497509295939492505050565b60008060408385031215620024b857600080fd5b620024c383620023b8565b91506020830135620024d5816200239f565b809150509250929050565b6001600160a01b0391909116815260200190565b8061040081018310156200096457600080fd5b60008060008060008060008060008060006105208c8e0312156200252a57600080fd5b620025368d8d620024f4565b9a50620025476104008d01620023b8565b99506104208c013598506104408c01359750620025686104608d01620023b8565b96506104808c01356200257b816200239f565b95506200258c6104a08d01620023b8565b94506104c08c01356200259f816200239f565b93506104e08c013592506105008c01356001600160401b03811115620025c457600080fd5b620025d28e828f01620023cd565b915080935050809150509295989b509295989b9093969950565b600060208284031215620025ff57600080fd5b81356200260c816200239f565b9392505050565b60ff81168114620023b557600080fd5b600080600080600080600060e0888a0312156200263f57600080fd5b87356200264c8162002613565b96506200265c60208901620023b8565b955060408801356200266e816200239f565b94506200267e60608901620023b8565b9350608088013562002690816200239f565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620026c357600080fd5b620026ce84620023b8565b92506020840135620026e0816200239f565b91506040840135620026f2816200239f565b809150509250925092565b6000602082840312156200271057600080fd5b5035919050565b600080600080600080600060a0888a0312156200273357600080fd5b6200273e88620023b8565b9650602088013562002750816200239f565b955060408801356001600160401b03808211156200276d57600080fd5b6200277b8b838c01620023cd565b909750955060608a01359150808211156200279557600080fd5b50620027a48a828b01620023cd565b9094509250506080880135620027ba8162002613565b8091505092959891949750929550565b60008060008060608587031215620027e157600080fd5b620027ec85620023b8565b93506020850135620027fe816200239f565b925060408501356001600160401b038111156200281a57600080fd5b6200282887828801620023cd565b95989497509550505050565b60008060008061046085870312156200284c57600080fd5b843593506200285f8660208701620024f4565b9250620028706104208601620023b8565b939692955092936104400135925050565b6001600160a01b03929092168252602082015260400190565b600060208284031215620028ad57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115620009645762000964620028b4565b60005b83811015620028fd578181015183820152602001620028e3565b50506000910152565b6000815180845262002920816020860160208601620028e0565b601f01601f19169290920160200192915050565b60608152600062002949606083018662002906565b82810360208401526200295d818662002906565b91505060ff83166040830152949350505050565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c08301819052600091620029c58483018762002906565b925080851660e085015250509998505050505050505050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b634e487b7160e01b600052604160045260246000fd5b6000825162002a32818460208701620028e0565b9190910192915050565b604051601f8201601f191681016001600160401b038111828210171562002a675762002a6762002a08565b604052919050565b60006001600160401b0382111562002a8b5762002a8b62002a08565b50601f01601f191660200190565b600082601f83011262002aab57600080fd5b813562002ac262002abc8262002a6f565b62002a3c565b81815284602083860101111562002ad857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562002b0b57600080fd5b83356001600160401b038082111562002b2357600080fd5b62002b318783880162002a99565b9450602086013591508082111562002b4857600080fd5b5062002b578682870162002a99565b9250506040840135620026f28162002613565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090620022df908301848662002b6a565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009062002c38908301848662002b6a565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006001820162002c6d5762002c6d620028b4565b5060010190565b60608152600062002c8a60608301878962002b6a565b828103602084015262002c9f81868862002b6a565b91505060ff831660408301529695505050505050565b6000835162002cc9818460208801620028e0565b83519083019062002cdf818360208801620028e0565b01949350505050565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c0830181905260009162002d3d848301878962002b6a565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b6000808585111562002d7857600080fd5b8386111562002d8657600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562002dbc5780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562002de057600080fd5b873562002ded816200239f565b9650602088013562002dff816200239f565b955060408801359450606088013593506080880135620026908162002613565b8015158114620023b557600080fd5b600080600080600080600080610100898b03121562002e4c57600080fd5b883562002e59816200239f565b9750602089013562002e6b816200239f565b96506040890135955060608901359450608089013562002e8b8162002e1f565b935060a089013562002e9d8162002613565b979a969950949793969295929450505060c08201359160e0013590565b60006020828403121562002ecd57600080fd5b81516200260c8162002613565b600181815b8085111562002f1b57816000190482111562002eff5762002eff620028b4565b8085161562002f0d57918102915b93841c939080029062002edf565b509250929050565b60008262002f345750600162000964565b8162002f435750600062000964565b816001811462002f5c576002811462002f675762002f87565b600191505062000964565b60ff84111562002f7b5762002f7b620028b4565b50506001821b62000964565b5060208310610133831016604e8410600b841016171562002fac575081810a62000964565b62002fb8838362002eda565b806000190482111562002fcf5762002fcf620028b4565b029392505050565b60006200260c838362002f23565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000602082840312156200305957600080fd5b81516200260c8162002e1f565b6000602082840312156200307957600080fd5b81516001600160401b038111156200309057600080fd5b8201601f81018413620030a257600080fd5b8051620030b362002abc8262002a6f565b818152856020838501011115620030c957600080fd5b620030dc826020830160208601620028e0565b95945050505050565b6020815260006200260c60208301846200290656fe6101006040523480156200001257600080fd5b506040516200159c3803806200159c83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110e0620004bc60003960006101f70152600081816102ba015281816104e0015261054e0152600061049101526000818161031f015261045b01526110e06000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146102f4578063a9059cbb14610307578063cd0d00961461031a578063d505accf14610341578063dd62ed3e14610354578063ffa1ad741461036757600080fd5b806370a08231146102515780637ecebe001461027a57806395d89b411461029a5780639dc29fac146102a2578063a3c573eb146102b557600080fd5b806330adf81f116100ff57806330adf81f146101c9578063313ce567146101f05780633644e51514610221578063395093511461022957806340c10f191461023c57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806320606b701461018f57806323b872dd146101b6575b600080fd5b610144610387565b6040516101519190610e26565b60405180910390f35b61016d610168366004610e90565b610419565b6040519015158152602001610151565b6002545b604051908152602001610151565b6101817f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61016d6101c4366004610eba565b610433565b6101817f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610151565b610181610457565b61016d610237366004610e90565b6104b3565b61024f61024a366004610e90565b6104d5565b005b61018161025f366004610ef6565b6001600160a01b031660009081526020819052604090205490565b610181610288366004610ef6565b60056020526000908152604090205481565b610144610534565b61024f6102b0366004610e90565b610543565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610151565b61016d610302366004610e90565b610595565b61016d610315366004610e90565b610610565b6101817f000000000000000000000000000000000000000000000000000000000000000081565b61024f61034f366004610f18565b61061e565b610181610362366004610f8b565b610859565b610144604051806040016040528060018152602001603160f81b81525081565b60606003805461039690610fbe565b80601f01602080910402602001604051908101604052809291908181526020018280546103c290610fbe565b801561040f5780601f106103e45761010080835404028352916020019161040f565b820191906000526020600020905b8154815290600101906020018083116103f257829003601f168201915b5050505050905090565b600033610427818585610884565b60019150505b92915050565b6000336104418582856109a9565b61044c858585610a23565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461048e5761048946610bb5565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336104278185856104c68383610859565b6104d0919061100e565b610884565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105265760405162461bcd60e51b815260040161051d90611021565b60405180910390fd5b6105308282610c61565b5050565b60606004805461039690610fbe565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461058b5760405162461bcd60e51b815260040161051d90611021565b6105308282610d0e565b600033816105a38286610859565b9050838110156106035760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161051d565b61044c8286868403610884565b600033610427818585610a23565b8342111561067a5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b606482015260840161051d565b6001600160a01b038716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866106c783611071565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610725610457565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156107b0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107e65750896001600160a01b0316816001600160a01b0316145b6108425760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b606482015260840161051d565b61084d8a8a8a610884565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108e65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161051d565b6001600160a01b0382166109475760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161051d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006109b58484610859565b90506000198114610a1d5781811015610a105760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161051d565b610a1d8484848403610884565b50505050565b6001600160a01b038316610a875760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161051d565b6001600160a01b038216610ae95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161051d565b6001600160a01b03831660009081526020819052604090205481811015610b615760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161051d565b6001600160a01b038481166000818152602081815260408083208787039055938716808352918490208054870190559251858152909260008051602061108b833981519152910160405180910390a3610a1d565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610be0610387565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610cb75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161051d565b8060026000828254610cc9919061100e565b90915550506001600160a01b0382166000818152602081815260408083208054860190555184815260008051602061108b833981519152910160405180910390a35050565b6001600160a01b038216610d6e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161051d565b6001600160a01b03821660009081526020819052604090205481811015610de25760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161051d565b6001600160a01b03831660008181526020818152604080832086860390556002805487900390555185815291929160008051602061108b833981519152910161099c565b600060208083528351808285015260005b81811015610e5357858101830151858201604001528201610e37565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e8b57600080fd5b919050565b60008060408385031215610ea357600080fd5b610eac83610e74565b946020939093013593505050565b600080600060608486031215610ecf57600080fd5b610ed884610e74565b9250610ee660208501610e74565b9150604084013590509250925092565b600060208284031215610f0857600080fd5b610f1182610e74565b9392505050565b600080600080600080600060e0888a031215610f3357600080fd5b610f3c88610e74565b9650610f4a60208901610e74565b95506040880135945060608801359350608088013560ff81168114610f6e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f9e57600080fd5b610fa783610e74565b9150610fb560208401610e74565b90509250929050565b600181811c90821680610fd257607f821691505b602082108103610ff257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042d5761042d610ff8565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161108357611083610ff8565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c54f702400844bca54b965f08b878a7ad166d07c77c1b4434783c6c861d64cea64736f6c63430008110033a26469706673582212202aa6f7b7ecc82d0d4918ea3545a938824a9c0c986e4c0adb6b439e9bf3d70d0864736f6c63430008110033" + }, + { + "contractName": "PolygonZkEVMBridge proxy", + "balance": "200000000000000000000000000", + "nonce": "1", + "address": "0xd0a3d58d135e2ee795dFB26ec150D339394254B9", + "bytecode": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106be565b610118565b61005b6100933660046106d9565b610155565b3480156100a457600080fd5b506100ad6101bc565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106be565b6101ed565b3480156100f557600080fd5b506100ad61020d565b610106610269565b6101166101116102fe565b610308565b565b61012061032c565b6001600160a01b0316330361014d5761014a8160405180602001604052806000815250600061035f565b50565b61014a6100fe565b61015d61032c565b6001600160a01b031633036101b4576101af8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061035f915050565b505050565b6101af6100fe565b60006101c661032c565b6001600160a01b031633036101e2576101dd6102fe565b905090565b6101ea6100fe565b90565b6101f561032c565b6001600160a01b0316330361014d5761014a8161038a565b600061021761032c565b6001600160a01b031633036101e2576101dd61032c565b606061025383836040518060600160405280602781526020016107d0602791396103de565b9392505050565b6001600160a01b03163b151590565b61027161032c565b6001600160a01b031633036101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101dd610456565b3660008037600080366000845af43d6000803e808015610327573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103688361047e565b6000825111806103755750805b156101af57610384838361022e565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103b361032c565b604080516001600160a01b03928316815291841660208301520160405180910390a161014a816104be565b6060600080856001600160a01b0316856040516103fb9190610780565b600060405180830381855af49150503d8060008114610436576040519150601f19603f3d011682016040523d82523d6000602084013e61043b565b606091505b509150915061044c86838387610567565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610350565b610487816105e6565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105235760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016102f5565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b606083156105d45782516000036105cd576105818561025a565b6105cd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102f5565b50816105de565b6105de8383610678565b949350505050565b6105ef8161025a565b6106515760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102f5565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610546565b8151156106885781518083602001fd5b8060405162461bcd60e51b81526004016102f5919061079c565b80356001600160a01b03811681146106b957600080fd5b919050565b6000602082840312156106d057600080fd5b610253826106a2565b6000806000604084860312156106ee57600080fd5b6106f7846106a2565b9250602084013567ffffffffffffffff8082111561071457600080fd5b818601915086601f83011261072857600080fd5b81358181111561073757600080fd5b87602082850101111561074957600080fd5b6020830194508093505050509250925092565b60005b8381101561077757818101518382015260200161075f565b50506000910152565b6000825161079281846020870161075c565b9190910192915050565b60208152600082518060208401526107bb81604085016020870161075c565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220557373ec903fd3bc4b75a2c6285870c5d4a0ead46cf8edd41db562a58981cc1264736f6c63430008110033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000068": "0x00000000000000a40d5f56745a118d0906a34e69aec8c0db1cb8fa0000000100", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000f4041d86682e321927b1aefef2c1086a67e2b954", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000e74d91a48dd2ed0a9f5585368abded7af071b12c" + } + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", + "balance": "0", + "nonce": "1", + "address": "0xE641334b752d435a5133f64c6DBAB34431A9B9DC", + "bytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b36600461012f565b60006020819052908152604090205481565b6100a061009b36600461012f565b6100e1565b005b6100c97f000000000000000000000000d0a3d58d135e2ee795dfb26ec150d339394254b981565b6040516001600160a01b039091168152602001610064565b336001600160a01b037f000000000000000000000000d0a3d58d135e2ee795dfb26ec150d339394254b9161461012a5760405163b49365dd60e01b815260040160405180910390fd5b600155565b60006020828403121561014157600080fd5b503591905056fea2646970667358221220859fbbe22cdffd5d3aab670dd9922eb1c7afadaaea0a619f34b3cb92884acce464736f6c63430008110033" + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", + "balance": "0", + "nonce": "1", + "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", + "bytecode": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106ca565b610118565b61005b6100933660046106e5565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106ca565b61020b565b3480156100f557600080fd5b506100ad610235565b610106610292565b610116610111610331565b61033b565b565b61012061035f565b6001600160a01b0316336001600160a01b031614156101575761015481604051806020016040528060008152506000610392565b50565b6101546100fe565b61016761035f565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610392915050565b505050565b6101c36100fe565b60006101da61035f565b6001600160a01b0316336001600160a01b03161415610200576101fb610331565b905090565b6102086100fe565b90565b61021361035f565b6001600160a01b0316336001600160a01b0316141561015757610154816103f1565b600061023f61035f565b6001600160a01b0316336001600160a01b03161415610200576101fb61035f565b606061028583836040518060600160405280602781526020016107e460279139610445565b9392505050565b3b151590565b61029a61035f565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb610519565b3660008037600080366000845af43d6000803e80801561035a573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b61039b83610541565b6040516001600160a01b038416907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a26000825111806103dc5750805b156101c3576103eb8383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61041a61035f565b604080516001600160a01b03928316815291841660208301520160405180910390a1610154816105e9565b6060833b6104a45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610328565b600080856001600160a01b0316856040516104bf9190610794565b600060405180830381855af49150503d80600081146104fa576040519150601f19603f3d011682016040523d82523d6000602084013e6104ff565b606091505b509150915061050f828286610675565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610383565b803b6105a55760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610328565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b03811661064e5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610328565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036105c8565b60608315610684575081610285565b8251156106945782518084602001fd5b8160405162461bcd60e51b815260040161032891906107b0565b80356001600160a01b03811681146106c557600080fd5b919050565b6000602082840312156106dc57600080fd5b610285826106ae565b6000806000604084860312156106fa57600080fd5b610703846106ae565b9250602084013567ffffffffffffffff8082111561072057600080fd5b818601915086601f83011261073457600080fd5b81358181111561074357600080fd5b87602082850101111561075557600080fd5b6020830194508093505050509250925092565b60005b8381101561078357818101518382015260200161076b565b838111156103eb5750506000910152565b600082516107a6818460208701610768565b9190910192915050565b60208152600082518060208401526107cf816040850160208701610768565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204675187caf3a43285d9a2c1844a981e977bd52a85ff073e7fc649f73847d70a464736f6c63430008090033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000f4041d86682e321927b1aefef2c1086a67e2b954", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000e641334b752d435a5133f64c6dbab34431a9b9dc" + } + }, + { + "contractName": "PolygonZkEVMTimelock", + "balance": "0", + "nonce": "1", + "address": "0xDEAd72Fd97a579E98AEF2F9EB190066E1858D15a", + "bytecode": "0x6080604052600436106101865760003560e01c806364d62353116100d7578063b1c5f42711610085578063b1c5f427146104dc578063bc197c81146104fc578063c4d252f514610528578063d45c443514610548578063d547741f14610575578063e38335e514610595578063f23a6e61146105a8578063f27a0c92146105d457600080fd5b806364d62353146103f15780638065657f146104115780638f2a0bb0146104315780638f61f4f51461045157806391d1485414610473578063a217fddf14610493578063b08e51c0146104a857600080fd5b8063248a9ca311610134578063248a9ca3146102c45780632ab0f529146102f45780632f2ff15d1461032557806331d507501461034557806336568abe146103655780633a6aae7214610385578063584b153e146103d157600080fd5b806301d5062a1461019257806301ffc9a7146101b457806307bd0265146101e95780630d3cf6fc14610219578063134008d31461024d57806313bc9f2014610260578063150b7a021461028057600080fd5b3661018d57005b600080fd5b34801561019e57600080fd5b506101b26101ad366004611406565b6105e9565b005b3480156101c057600080fd5b506101d46101cf36600461147a565b61066c565b60405190151581526020015b60405180910390f35b3480156101f557600080fd5b5061020b600080516020611df083398151915281565b6040519081526020016101e0565b34801561022557600080fd5b5061020b7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101b261025b3660046114a4565b610697565b34801561026c57600080fd5b506101d461027b36600461150f565b61073a565b34801561028c57600080fd5b506102ab61029b3660046115dd565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101e0565b3480156102d057600080fd5b5061020b6102df36600461150f565b60009081526020819052604090206001015490565b34801561030057600080fd5b506101d461030f36600461150f565b6000908152600160208190526040909120541490565b34801561033157600080fd5b506101b2610340366004611644565b610760565b34801561035157600080fd5b506101d461036036600461150f565b61078a565b34801561037157600080fd5b506101b2610380366004611644565b6107a3565b34801561039157600080fd5b506103b97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101e0565b3480156103dd57600080fd5b506101d46103ec36600461150f565b610826565b3480156103fd57600080fd5b506101b261040c36600461150f565b61083c565b34801561041d57600080fd5b5061020b61042c3660046114a4565b6108e0565b34801561043d57600080fd5b506101b261044c3660046116b4565b61091f565b34801561045d57600080fd5b5061020b600080516020611dd083398151915281565b34801561047f57600080fd5b506101d461048e366004611644565b610a5f565b34801561049f57600080fd5b5061020b600081565b3480156104b457600080fd5b5061020b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156104e857600080fd5b5061020b6104f7366004611765565b610a88565b34801561050857600080fd5b506102ab61051736600461188c565b63bc197c8160e01b95945050505050565b34801561053457600080fd5b506101b261054336600461150f565b610acd565b34801561055457600080fd5b5061020b61056336600461150f565b60009081526001602052604090205490565b34801561058157600080fd5b506101b2610590366004611644565b610ba2565b6101b26105a3366004611765565b610bc7565b3480156105b457600080fd5b506102ab6105c3366004611935565b63f23a6e6160e01b95945050505050565b3480156105e057600080fd5b5061020b610d3f565b600080516020611dd083398151915261060181610dd5565b60006106118989898989896108e0565b905061061d8184610de2565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610659969594939291906119c2565b60405180910390a3505050505050505050565b60006001600160e01b03198216630271189760e51b1480610691575061069182610ed6565b92915050565b600080516020611df08339815191526106b1816000610a5f565b6106bf576106bf8133610f0b565b60006106cf8888888888886108e0565b90506106db8185610f64565b6106e788888888611000565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161071f94939291906119ff565b60405180910390a3610730816110d3565b5050505050505050565b6000818152600160205260408120546001811180156107595750428111155b9392505050565b60008281526020819052604090206001015461077b81610dd5565b610785838361110c565b505050565b60008181526001602052604081205481905b1192915050565b6001600160a01b03811633146108185760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6108228282611190565b5050565b600081815260016020819052604082205461079c565b33301461089f5760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201526a62652074696d656c6f636b60a81b606482015260840161080f565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b60008686868686866040516020016108fd969594939291906119c2565b6040516020818303038152906040528051906020012090509695505050505050565b600080516020611dd083398151915261093781610dd5565b8887146109565760405162461bcd60e51b815260040161080f90611a31565b8885146109755760405162461bcd60e51b815260040161080f90611a31565b60006109878b8b8b8b8b8b8b8b610a88565b90506109938184610de2565b60005b8a811015610a515780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e858181106109d3576109d3611a74565b90506020020160208101906109e89190611a8a565b8d8d868181106109fa576109fa611a74565b905060200201358c8c87818110610a1357610a13611a74565b9050602002810190610a259190611aa5565b8c8b604051610a39969594939291906119c2565b60405180910390a3610a4a81611b01565b9050610996565b505050505050505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008888888888888888604051602001610aa9989796959493929190611bab565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610af781610dd5565b610b0082610826565b610b665760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e2063616044820152701b9b9bdd0818994818d85b98d95b1b1959607a1b606482015260840161080f565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610bbd81610dd5565b6107858383611190565b600080516020611df0833981519152610be1816000610a5f565b610bef57610bef8133610f0b565b878614610c0e5760405162461bcd60e51b815260040161080f90611a31565b878414610c2d5760405162461bcd60e51b815260040161080f90611a31565b6000610c3f8a8a8a8a8a8a8a8a610a88565b9050610c4b8185610f64565b60005b89811015610d295760008b8b83818110610c6a57610c6a611a74565b9050602002016020810190610c7f9190611a8a565b905060008a8a84818110610c9557610c95611a74565b9050602002013590503660008a8a86818110610cb357610cb3611a74565b9050602002810190610cc59190611aa5565b91509150610cd584848484611000565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b5886868686604051610d0c94939291906119ff565b60405180910390a35050505080610d2290611b01565b9050610c4e565b50610d33816110d3565b50505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc39190611c4c565b15610dce5750600090565b5060025490565b610ddf8133610f0b565b50565b610deb8261078a565b15610e505760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201526e1c9958591e481cd8da19591d5b1959608a1b606482015260840161080f565b610e58610d3f565b811015610eb65760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e746044820152652064656c617960d01b606482015260840161080f565b610ec08142611c6e565b6000928352600160205260409092209190915550565b60006001600160e01b03198216637965db0b60e01b148061069157506301ffc9a760e01b6001600160e01b0319831614610691565b610f158282610a5f565b61082257610f22816111f5565b610f2d836020611207565b604051602001610f3e929190611ca5565b60408051601f198184030181529082905262461bcd60e51b825261080f91600401611d14565b610f6d8261073a565b610f895760405162461bcd60e51b815260040161080f90611d47565b801580610fa55750600081815260016020819052604090912054145b6108225760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e6720646570656044820152656e64656e637960d01b606482015260840161080f565b6000846001600160a01b031684848460405161101d929190611d91565b60006040518083038185875af1925050503d806000811461105a576040519150601f19603f3d011682016040523d82523d6000602084013e61105f565b606091505b50509050806110cc5760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e6720746044820152721c985b9cd858dd1a5bdb881c995d995c9d1959606a1b606482015260840161080f565b5050505050565b6110dc8161073a565b6110f85760405162461bcd60e51b815260040161080f90611d47565b600090815260016020819052604090912055565b6111168282610a5f565b610822576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561114c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61119a8282610a5f565b15610822576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606106916001600160a01b03831660145b60606000611216836002611da1565b611221906002611c6e565b6001600160401b0381111561123857611238611528565b6040519080825280601f01601f191660200182016040528015611262576020820181803683370190505b509050600360fc1b8160008151811061127d5761127d611a74565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106112ac576112ac611a74565b60200101906001600160f81b031916908160001a90535060006112d0846002611da1565b6112db906001611c6e565b90505b6001811115611353576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061130f5761130f611a74565b1a60f81b82828151811061132557611325611a74565b60200101906001600160f81b031916908160001a90535060049490941c9361134c81611db8565b90506112de565b5083156107595760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161080f565b80356001600160a01b03811681146113b957600080fd5b919050565b60008083601f8401126113d057600080fd5b5081356001600160401b038111156113e757600080fd5b6020830191508360208285010111156113ff57600080fd5b9250929050565b600080600080600080600060c0888a03121561142157600080fd5b61142a886113a2565b96506020880135955060408801356001600160401b0381111561144c57600080fd5b6114588a828b016113be565b989b979a50986060810135976080820135975060a09091013595509350505050565b60006020828403121561148c57600080fd5b81356001600160e01b03198116811461075957600080fd5b60008060008060008060a087890312156114bd57600080fd5b6114c6876113a2565b95506020870135945060408701356001600160401b038111156114e857600080fd5b6114f489828a016113be565b979a9699509760608101359660809091013595509350505050565b60006020828403121561152157600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561156657611566611528565b604052919050565b600082601f83011261157f57600080fd5b81356001600160401b0381111561159857611598611528565b6115ab601f8201601f191660200161153e565b8181528460208386010111156115c057600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156115f357600080fd5b6115fc856113a2565b935061160a602086016113a2565b92506040850135915060608501356001600160401b0381111561162c57600080fd5b6116388782880161156e565b91505092959194509250565b6000806040838503121561165757600080fd5b82359150611667602084016113a2565b90509250929050565b60008083601f84011261168257600080fd5b5081356001600160401b0381111561169957600080fd5b6020830191508360208260051b85010111156113ff57600080fd5b600080600080600080600080600060c08a8c0312156116d257600080fd5b89356001600160401b03808211156116e957600080fd5b6116f58d838e01611670565b909b50995060208c013591508082111561170e57600080fd5b61171a8d838e01611670565b909950975060408c013591508082111561173357600080fd5b506117408c828d01611670565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561178157600080fd5b88356001600160401b038082111561179857600080fd5b6117a48c838d01611670565b909a50985060208b01359150808211156117bd57600080fd5b6117c98c838d01611670565b909850965060408b01359150808211156117e257600080fd5b506117ef8b828c01611670565b999c989b509699959896976060870135966080013595509350505050565b600082601f83011261181e57600080fd5b813560206001600160401b0382111561183957611839611528565b8160051b61184882820161153e565b928352848101820192828101908785111561186257600080fd5b83870192505b8483101561188157823582529183019190830190611868565b979650505050505050565b600080600080600060a086880312156118a457600080fd5b6118ad866113a2565b94506118bb602087016113a2565b935060408601356001600160401b03808211156118d757600080fd5b6118e389838a0161180d565b945060608801359150808211156118f957600080fd5b61190589838a0161180d565b9350608088013591508082111561191b57600080fd5b506119288882890161156e565b9150509295509295909350565b600080600080600060a0868803121561194d57600080fd5b611956866113a2565b9450611964602087016113a2565b9350604086013592506060860135915060808601356001600160401b0381111561198d57600080fd5b6119288882890161156e565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a0604082015260006119ea60a083018688611999565b60608301949094525060800152949350505050565b60018060a01b0385168152836020820152606060408201526000611a27606083018486611999565b9695505050505050565b60208082526023908201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611a9c57600080fd5b610759826113a2565b6000808335601e19843603018112611abc57600080fd5b8301803591506001600160401b03821115611ad657600080fd5b6020019150368190038213156113ff57600080fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611b1357611b13611aeb565b5060010190565b81835260006020808501808196508560051b810191508460005b87811015611b9e5782840389528135601e19883603018112611b5557600080fd5b870185810190356001600160401b03811115611b7057600080fd5b803603821315611b7f57600080fd5b611b8a868284611999565b9a87019a9550505090840190600101611b34565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b811015611bec576001600160a01b03611bd7846113a2565b16825260209283019290910190600101611bbe565b5083810360208501528881526001600160fb1b03891115611c0c57600080fd5b8860051b9150818a60208301370182810360209081016040850152611c349082018789611b1a565b60608401959095525050608001529695505050505050565b600060208284031215611c5e57600080fd5b8151801515811461075957600080fd5b8082018082111561069157610691611aeb565b60005b83811015611c9c578181015183820152602001611c84565b50506000910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351611cd7816017850160208801611c81565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611d08816028840160208801611c81565b01602801949350505050565b6020815260008251806020840152611d33816040850160208701611c81565b601f01601f19169190910160400192915050565b6020808252602a908201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e206973604082015269206e6f7420726561647960b01b606082015260800190565b8183823760009101908152919050565b808202811582820484141761069157610691611aeb565b600081611dc757611dc7611aeb565b50600019019056feb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63a2646970667358221220e85779c5558fca47883d23a3cceaeb125898c578f2a4d1ea63a0d3bd9db9b9eb64736f6c63430008110033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000000000000000000000000a", + "0xa35b5405ab15b96b03cc591647476727d852994a412b5030df6fc27d6663ae98": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x3068bd570ea4e7d974748b6421609a672ffc2752a61ba3a01cab0651ae1ac36d": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x555ccfd2adedd3617807cc741088518e69e1b40eeadcc863c31e3de2eeb454dd": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0xba259d66f4dd33fbb3dec88075da2b4d0684440fd415c1f24df79a0258ca9e62": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0xd449b9dacab93eed6e33b971a4f75b09702709f5b92088a7d361838e246a3556": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + } + }, + { + "accountName": "keyless Deployer", + "balance": "0", + "nonce": "1", + "address": "0x8b5081b0a6186731873f39d566ed886c7404c3D0" + }, + { + "accountName": "deployer", + "balance": "0", + "nonce": "8", + "address": "0x0cae25c8623761783Fe4CE241C9b428126A7612A" + }, + { + "accountName": "test account", + "balance": "100000000000000000000000", + "nonce": "0", + "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" + } ] -} \ No newline at end of file + } \ No newline at end of file diff --git a/config/environments/local/local.node.config.toml b/config/environments/local/local.node.config.toml index 0bbbdb86e7..7f0ace8283 100644 --- a/config/environments/local/local.node.config.toml +++ b/config/environments/local/local.node.config.toml @@ -29,9 +29,9 @@ FreeClaimGasLimit = 1500000 [Etherman] URL = "http://your.L1node.url" L1ChainID = 5 -PoEAddr = "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6" +PoEAddr = "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318" MaticAddr = "0x5FbDB2315678afecb367f032d93F642f64180aa3" -GlobalExitRootManagerAddr = "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" +GlobalExitRootManagerAddr = "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853" MultiGasProvider = false [Etherman.Etherscan] ApiKey = "" @@ -52,18 +52,13 @@ DefaultSenderAddress = "0x1111111111111111111111111111111111111111" [Synchronizer] SyncInterval = "1s" SyncChunkSize = 100 -GenBlockNumber = 57 +GenBlockNumber = 63 [Sequencer] MaxSequenceSize = "2000000" WaitPeriodPoolIsEmpty = "1s" -WaitPeriodSendSequence = "15s" -LastBatchVirtualizationTimeMaxWaitPeriod = "300s" -WaitBlocksToUpdateGER = 10 -WaitBlocksToConsiderGerFinal = 10 -ElapsedTimeToCloseBatchWithoutTxsDueToNewGER = "60s" -MinTimeToCloseBatch = "60s" -MaxTimeForBatchToBeOpen = "15s" +WaitPeriodSendSequence = "5s" +LastBatchVirtualizationTimeMaxWaitPeriod = "5s" BlocksAmountForTxsToBeDeleted = 100 FrequencyToCheckTxsForDelete = "12h" MaxTxsPerBatch = 150 @@ -76,11 +71,26 @@ MaxMemAligns = 262144 MaxArithmetics = 262144 MaxBinaries = 262144 MaxSteps = 8388608 +WeightBatchBytesSize = 1 +WeightCumulativeGasUsed = 1 +WeightKeccakHashes = 1 +WeightPoseidonHashes = 1 +WeightPoseidonPaddings = 1 +WeightMemAligns = 1 +WeightArithmetics = 1 +WeightBinaries = 1 +WeightSteps = 1 MaxAllowedFailedCounter = 50 -SenderAddress = "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" -PrivateKeys = [{Path = "/pk/sequencer.keystore", Password = "testonly"}] - [Sequencer.ProfitabilityChecker] - SendBatchesEvenWhenNotProfitable = "true" + [Sequencer.Finalizer] + GERDeadlineTimeoutInSec = "5s" + ForcedBatchDeadlineTimeoutInSec = "60s" + SendingToL1DeadlineTimeoutInSec = "20s" + SleepDurationInMs = "100ms" + ResourcePercentageToCloseBatch = 10 + GERFinalityNumberOfBlocks = 0 + ClosingSignalsManagerWaitForL1OperationsInSec = "10s" + SenderAddress = "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" + PrivateKeys = [{Path = "/pk/sequencer.keystore", Password = "testonly"}] [Aggregator] Host = "0.0.0.0" @@ -123,4 +133,7 @@ Port = 61090 Host = "0.0.0.0" Port = 9091 Enabled = false +ProfilingHost = "0.0.0.0" +ProfilingPort = 6060 +ProfilingEnabled = false diff --git a/config/environments/public/public.genesis.config.json b/config/environments/public/public.genesis.config.json index ed43dad1f7..09e1ccba4f 100644 --- a/config/environments/public/public.genesis.config.json +++ b/config/environments/public/public.genesis.config.json @@ -1,15 +1,15 @@ { - "root": "0x9db7fd5c3c6315ad21e10e643a258ee8cc8d35ee0bc51b1f704a7e7a6090c523", + "root": "0x542fe6dd40caff7b634682a31707cf2e2e840c3ad99c96160dc24188ca4c6279", "genesis": [ { "balance": "200000000000000000000000000", "nonce": "1", "address": "0x9d98deabc42dd696deb9e40b4f1cab7ddbf55988", - "bytecode": "0x608060405260043610620001675760003560e01c806381b1c17411620000c5578063d02103ca1162000078578063d02103ca146200047d578063d96a15f7146200049f578063dbc1697614620004b6578063ed6be5c914620004ce578063ee25560b14620004e5578063ff634ed7146200051657600080fd5b806381b1c17414620003735780638f61151914620003ad5780639e34070f14620003cf578063a08e8a0814620003f4578063aaa13cc2146200041e578063bab161bf146200044357600080fd5b80633ae05047116200011e5780633ae0504714620002a25780633da8168214620002ba5780633e19704314620002df578063463855491462000304578063647c576c14620003295780637b6323c1146200034e57600080fd5b80630871e971146200016c57806315064c9614620001855780632072f6c514620001b657806322e95f2c14620001ce5780632dfdf0b5146200020c578063318aee3d1462000233575b600080fd5b620001836200017d36600462002470565b6200052d565b005b3480156200019257600080fd5b50602254620001a19060ff1681565b60405190151581526020015b60405180910390f35b348015620001c357600080fd5b5062000183620009d2565b348015620001db57600080fd5b50620001f3620001ed366004620024fd565b62000a0b565b6040516001600160a01b039091168152602001620001ad565b3480156200021957600080fd5b506200022460215481565b604051908152602001620001ad565b3480156200024057600080fd5b506200027d6200025236600462002539565b60256020526000908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001ad565b348015620002af57600080fd5b506200022462000a5e565b348015620002c757600080fd5b50620001a1620002d936600462002628565b62000b51565b348015620002ec57600080fd5b5062000224620002fe366004620026a6565b62000c53565b3480156200031157600080fd5b506200018362000323366004620027b7565b62000ce0565b3480156200033657600080fd5b5062000183620003483660046200289e565b62000e86565b3480156200035b57600080fd5b50620001836200036d366004620027b7565b62000fe5565b3480156200038057600080fd5b50620001f362000392366004620028ee565b6024602052600090815260409020546001600160a01b031681565b348015620003ba57600080fd5b50602754620001f3906001600160a01b031681565b348015620003dc57600080fd5b50620001a1620003ee366004620028ee565b62001492565b3480156200040157600080fd5b506200040b600081565b60405160ff9091168152602001620001ad565b3480156200042b57600080fd5b50620001f36200043d36600462002908565b620014d7565b3480156200045057600080fd5b506022546200046790610100900463ffffffff1681565b60405163ffffffff9091168152602001620001ad565b3480156200048a57600080fd5b50602654620001f3906001600160a01b031681565b62000183620004b0366004620029bc565b620015ee565b348015620004c357600080fd5b50620001836200179a565b348015620004db57600080fd5b5062000467600081565b348015620004f257600080fd5b506200022462000504366004620028ee565b60236020526000908152604090205481565b3480156200052357600080fd5b506200040b600181565b60225460ff16156200055c5760405162461bcd60e51b8152600401620005539062002a24565b60405180910390fd5b60225463ffffffff610100909104811690861603620005e45760405162461bcd60e51b815260206004820152603b60248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2044455354494e4154494f4e5f43414e545f42455f495453454c460000000000606482015260840162000553565b60008060606001600160a01b0389166200067b5785341462000671576040805162461bcd60e51b81526020600482015260248101919091527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f20414d4f554e545f444f45535f4e4f545f4d415443485f4d53475f56414c5545606482015260840162000553565b60009150620008ec565b6001600160a01b03808a1660009081526025602090815260409182902082518084019093525463ffffffff81168352640100000000900490921691810182905290156200074957604051632770a7eb60e21b8152336004820152602481018890526001600160a01b038b1690639dc29fac906044016020604051808303816000875af115801562000710573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000736919062002a9b565b50602081015181519094509250620008ea565b84156200075e576200075e8a888888620017d1565b620007756001600160a01b038b1633308a62001bf9565b899350602260019054906101000a900463ffffffff169250896001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015620007cc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620007f6919081019062002b36565b8a6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000835573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200085f919081019062002b36565b8b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200089e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008c4919062002b6f565b604051602001620008d89392919062002bbd565b60405160208183030381529060405291505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600083858b8b8b876021546040516200092e98979695949392919062002bfa565b60405180910390a16200095962000953600084868c8c8c888051906020012062000c53565b62001c66565b6026546001600160a01b03166333d6247d6200097462000a5e565b6040518263ffffffff1660e01b81526004016200099391815260200190565b600060405180830381600087803b158015620009ae57600080fd5b505af1158015620009c3573d6000803e3d6000fd5b50505050505050505050505050565b6027546001600160a01b03163314620009ff5760405162461bcd60e51b8152600401620005539062002c67565b62000a0962001db7565b565b600060246000848460405160200162000a2692919062002cc4565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b602154600090819081805b602081101562000b48578260011660010362000ac9576001816020811062000a955762000a9562002cee565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000af6565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b62000b0360028462002d30565b6040805160208101859052908101849052909350606001604051602081830303815290604052805190602001209150808062000b3f9062002d47565b91505062000a69565b50919392505050565b60008467ffffffffffffffff8416825b602081101562000c44578160011660010362000bce5786818151811062000b8c5762000b8c62002cee565b60200260200101518360405160200162000bb0929190918252602082015260400190565b60405160208183030381529060405280519060200120925062000c20565b8287828151811062000be45762000be462002cee565b602002602001015160405160200162000c07929190918252602082015260400190565b6040516020818303038152906040528051906020012092505b62000c2d60028362002d30565b91508062000c3b8162002d47565b91505062000b61565b5050821490505b949350505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b60225460ff161562000d065760405162461bcd60e51b8152600401620005539062002a24565b62000d1c8a8a8a8a8a8a8a8a8a8a600162001e15565b62000d2d8963ffffffff16620020a0565b6000836001600160a01b03168387898560405160240162000d519392919062002d63565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000d88919062002d9e565b60006040518083038185875af1925050503d806000811462000dc7576040519150601f19603f3d011682016040523d82523d6000602084013e62000dcc565b606091505b505090508062000e385760405162461bcd60e51b815260206004820152603060248201527f506f6c79676f6e5a6b45564d4272696467653a3a636c61696d4d65737361676560448201526f0e88135154d4d051d157d1905253115160821b606482015260840162000553565b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459838a8888878760405162000e7195949392919062002dbc565b60405180910390a15050505050505050505050565b600054610100900460ff161580801562000ea75750600054600160ff909116105b8062000ec35750303b15801562000ec3575060005460ff166001145b62000f285760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162000553565b6000805460ff19166001179055801562000f4c576000805461ff0019166101001790555b6022805463ffffffff86166101000264ffffffff0019909116179055602680546001600160a01b038086166001600160a01b0319928316179092556027805492851692909116919091179055801562000fdf576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60225460ff16156200100b5760405162461bcd60e51b8152600401620005539062002a24565b620010218a8a8a8a8a8a8a8a8a8a600062001e15565b620010328963ffffffff16620020a0565b6001600160a01b0385166200112757604080516000808252602082019092526001600160a01b0385169084906040516200106d919062002d9e565b60006040518083038185875af1925050503d8060008114620010ac576040519150601f19603f3d011682016040523d82523d6000602084013e620010b1565b606091505b5050905080620011205760405162461bcd60e51b815260206004820152603360248201527f506f6c79676f6e5a6b45564d4272696467653a3a636c61696d41737365743a2060448201527211551217d514905394d1915497d19052531151606a1b606482015260840162000553565b5062001445565b60225463ffffffff6101009091048116908716036200115c57620011566001600160a01b0386168484620020e2565b62001445565b600086866040516020016200117392919062002cc4565b60408051601f198184030181529181528151602092830120600081815260249093529120549091506001600160a01b031680620013ca57600080600085806020019051810190620011c5919062002df3565b925092509250600085848484604051620011df90620023d6565b620011ed9392919062002bbd565b8190604051809103906000f59050801580156200120e573d6000803e3d6000fd5b506040516340c10f1960e01b81526001600160a01b038b81166004830152602482018b9052919250908216906340c10f19906044016020604051808303816000875af115801562001263573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001289919062002a9b565b50806024600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808d63ffffffff1681526020018c6001600160a01b031681525060256000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507fccd7715648d1f2bb13e158f96b5b6c3aeda555d4cb87112e274a6f28bc571d598c8c83604051620013b89392919063ffffffff9390931683526001600160a01b03918216602084015216604082015260600190565b60405180910390a15050505062001442565b6040516340c10f1960e01b81526001600160a01b038681166004830152602482018690528216906340c10f19906044016020604051808303816000875af11580156200141a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001440919062002a9b565b505b50505b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe2754598389878786866040516200147e95949392919062002dbc565b60405180910390a150505050505050505050565b600080620014a36101008462002d30565b90506000620014b56101008562002e69565b60009283526023602052604090922054600190921b9182169091149392505050565b6000808888604051602001620014ef92919062002cc4565b604051602081830303815290604052805190602001209050600060ff60f81b3083604051806020016200152290620023d6565b601f1982820381018352601f9091011660408190526200154f908d908d908d908d908d9060200162002ea9565b60408051601f19818403018152908290526200156f929160200162002eea565b60405160208183030381529060405280519060200120604051602001620015c894939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60225460ff1615620016145760405162461bcd60e51b8152600401620005539062002a24565b60225463ffffffff6101009091048116908416036200169c5760405162461bcd60e51b815260206004820152603d60248201527f506f6c79676f6e5a6b45564d4272696467653a3a6272696467654d657373616760448201527f653a2044455354494e4154494f4e5f43414e545f42455f495453454c46000000606482015260840162000553565b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001602260019054906101000a900463ffffffff163386863487602154604051620016f098979695949392919062002bfa565b60405180910390a162001727620009536001602260019054906101000a900463ffffffff1633878734888051906020012062000c53565b6026546001600160a01b03166333d6247d6200174262000a5e565b6040518263ffffffff1660e01b81526004016200176191815260200190565b600060405180830381600087803b1580156200177c57600080fd5b505af115801562001791573d6000803e3d6000fd5b50505050505050565b6027546001600160a01b03163314620017c75760405162461bcd60e51b8152600401620005539062002c67565b62000a0962002114565b60006200181483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250620021c392505050565b9050632afa533160e01b6001600160e01b031982160162001a0d57600080808080808062001846896004818d62002f1d565b81019062001855919062002f49565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620018975760405162461bcd60e51b8152600401620005539062002fa4565b6001600160a01b0386163014620018c25760405162461bcd60e51b8152600401620005539062003001565b8a8514620019395760405162461bcd60e51b815260206004820152603960248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2050455260448201527f4d49545f414d4f554e545f444f45535f4e4f545f4d4154434800000000000000606482015260840162000553565b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e1691620019b9919062002d9e565b6000604051808303816000865af19150503d8060008114620019f8576040519150601f19603f3d011682016040523d82523d6000602084013e620019fd565b606091505b5050505050505050505062001bf2565b6001600160e01b031981166323f2ebc360e21b1462001a835760405162461bcd60e51b815260206004820152602b60248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a204e4f5460448201526a17d59053125117d0d0531360aa1b606482015260840162000553565b60008080808080808062001a9b8a6004818e62002f1d565b81019062001aaa919062003052565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001aee5760405162461bcd60e51b8152600401620005539062002fa4565b6001600160a01b038716301462001b195760405162461bcd60e51b8152600401620005539062003001565b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162001ba2919062002d9e565b6000604051808303816000865af19150503d806000811462001be1576040519150601f19603f3d011682016040523d82523d6000602084013e62001be6565b606091505b50505050505050505050505b5050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000fdf9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152620021ca565b80600162001c7760206002620031db565b62001c839190620031e9565b6021541062001ce85760405162461bcd60e51b815260206004820152602a60248201527f4465706f736974436f6e74726163743a5f6465706f7369743a204d45524b4c4560448201526917d514915157d195531360b21b606482015260840162000553565b60016021600082825462001cfd919062003203565b909155505060215460005b602081101562001da7578160011660010362001d3d57826001826020811062001d355762001d3562002cee565b015550505050565b6001816020811062001d535762001d5362002cee565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925060028262001d90919062002d30565b91508062001d9e8162002d47565b91505062001d08565b5062001db26200321e565b505050565b60225460ff161562001ddd5760405162461bcd60e51b8152600401620005539062002a24565b6022805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b62001e268a63ffffffff1662001492565b1562001e7d5760405162461bcd60e51b81526020600482015260306024820152600080516020620047bb83398151915260448201526f081053149150511657d0d3105253515160821b606482015260840162000553565b6026546040805160208082018d90528183018c9052825180830384018152606083019384905280519101206312bd9b1960e11b90925260648101919091526000916001600160a01b03169063257b3632906084016020604051808303816000875af115801562001ef1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f17919062003234565b90508060000362001f805760405162461bcd60e51b81526020600482015260396024820152600080516020620047bb83398151915260448201527f20474c4f42414c5f455849545f524f4f545f494e56414c494400000000000000606482015260840162000553565b60225463ffffffff8781166101009092041614620020025760405162461bcd60e51b81526020600482015260436024820152600080516020620047bb83398151915260448201527f2044455354494e4154494f4e5f4e4554574f524b5f444f45535f4e4f545f4d416064820152620a886960eb1b608482015260a40162000553565b602254600090610100900463ffffffff166200202057508862002023565b50895b6200204e6200203f848b8b8b8b8b8b8051906020012062000c53565b8e8e63ffffffff168462000b51565b620009c35760405162461bcd60e51b815260206004820152602c6024820152600080516020620047bb83398151915260448201526b0814d35517d253959053125160a21b606482015260840162000553565b6000620020b06101008362002d30565b90506000620020c26101008462002e69565b6000928352602360205260409092208054600190931b9092179091555050565b6040516001600160a01b03831660248201526044810182905262001db290849063a9059cbb60e01b9060640162001c2e565b60225460ff166200218e5760405162461bcd60e51b815260206004820152603b60248201527f456d657267656e63794d616e616765723a3a6966456d657267656e637953746160448201527f74653a206f6e6c7920696620656d657267656e63792073746174650000000000606482015260840162000553565b6022805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6020015190565b600062002221826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620022a39092919063ffffffff16565b80519091501562001db2578080602001905181019062002242919062002a9b565b62001db25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000553565b606062000c4b848460008585600080866001600160a01b03168587604051620022cd919062002d9e565b60006040518083038185875af1925050503d80600081146200230c576040519150601f19603f3d011682016040523d82523d6000602084013e62002311565b606091505b509150915062002324878383876200232f565b979650505050505050565b60608315620023a35782516000036200239b576001600160a01b0385163b6200239b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000553565b508162000c4b565b62000c4b8383815115620023ba5781518083602001fd5b8060405162461bcd60e51b81526004016200055391906200324e565b611557806200326483390190565b6001600160a01b0381168114620023fa57600080fd5b50565b80356200240a81620023e4565b919050565b803563ffffffff811681146200240a57600080fd5b60008083601f8401126200243757600080fd5b50813567ffffffffffffffff8111156200245057600080fd5b6020830191508360208285010111156200246957600080fd5b9250929050565b60008060008060008060a087890312156200248a57600080fd5b86356200249781620023e4565b9550620024a7602088016200240f565b94506040870135620024b981620023e4565b935060608701359250608087013567ffffffffffffffff811115620024dd57600080fd5b620024eb89828a0162002424565b979a9699509497509295939492505050565b600080604083850312156200251157600080fd5b6200251c836200240f565b915060208301356200252e81620023e4565b809150509250929050565b6000602082840312156200254c57600080fd5b81356200255981620023e4565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715620025a257620025a262002560565b604052919050565b600082601f830112620025bc57600080fd5b8135602067ffffffffffffffff821115620025db57620025db62002560565b8160051b620025ec82820162002576565b92835284810182019282810190878511156200260757600080fd5b83870192505b8483101562002324578235825291830191908301906200260d565b600080600080608085870312156200263f57600080fd5b84359350602085013567ffffffffffffffff808211156200265f57600080fd5b6200266d88838901620025aa565b94506040870135915080821682146200268557600080fd5b509396929550929360600135925050565b60ff81168114620023fa57600080fd5b600080600080600080600060e0888a031215620026c257600080fd5b8735620026cf8162002696565b9650620026df602089016200240f565b95506040880135620026f181620023e4565b945062002701606089016200240f565b935060808801356200271381620023e4565b9699959850939692959460a0840135945060c09093013592915050565b600067ffffffffffffffff8211156200274d576200274d62002560565b50601f01601f191660200190565b600082601f8301126200276d57600080fd5b8135620027846200277e8262002730565b62002576565b8181528460208386010111156200279a57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806000806000806000806101408b8d031215620027d857600080fd5b8a3567ffffffffffffffff80821115620027f157600080fd5b620027ff8e838f01620025aa565b9b506200280f60208e016200240f565b9a5060408d0135995060608d013598506200282d60808e016200240f565b97506200283d60a08e01620023fd565b96506200284d60c08e016200240f565b95506200285d60e08e01620023fd565b94506101008d013593506101208d01359150808211156200287d57600080fd5b506200288c8d828e016200275b565b9150509295989b9194979a5092959850565b600080600060608486031215620028b457600080fd5b620028bf846200240f565b92506020840135620028d181620023e4565b91506040840135620028e381620023e4565b809150509250925092565b6000602082840312156200290157600080fd5b5035919050565b600080600080600080600060a0888a0312156200292457600080fd5b6200292f886200240f565b965060208801356200294181620023e4565b9550604088013567ffffffffffffffff808211156200295f57600080fd5b6200296d8b838c0162002424565b909750955060608a01359150808211156200298757600080fd5b50620029968a828b0162002424565b9094509250506080880135620029ac8162002696565b8091505092959891949750929550565b600080600060608486031215620029d257600080fd5b620029dd846200240f565b92506020840135620029ef81620023e4565b9150604084013567ffffffffffffffff81111562002a0c57600080fd5b62002a1a868287016200275b565b9150509250925092565b60208082526042908201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960408201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606082015261746560f01b608082015260a00190565b8015158114620023fa57600080fd5b60006020828403121562002aae57600080fd5b8151620025598162002a8c565b60005b8381101562002ad857818101518382015260200162002abe565b8381111562000fdf5750506000910152565b600082601f83011262002afc57600080fd5b815162002b0d6200277e8262002730565b81815284602083860101111562002b2357600080fd5b62000c4b82602083016020870162002abb565b60006020828403121562002b4957600080fd5b815167ffffffffffffffff81111562002b6157600080fd5b62000c4b8482850162002aea565b60006020828403121562002b8257600080fd5b8151620025598162002696565b6000815180845262002ba981602086016020860162002abb565b601f01601f19169290920160200192915050565b60608152600062002bd2606083018662002b8f565b828103602084015262002be6818662002b8f565b91505060ff83166040830152949350505050565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c0830181905260009162002c4e8483018762002b8f565b925080851660e085015250509998505050505050505050565b6020808252603d908201527f506f6c79676f6e5a6b45564d3a3a6f6e6c79506f6c79676f6e5a6b45564d3a2060408201527f6f6e6c7920506f6c79676f6e205a4b2d45564d20636f6e747261637474000000606082015260800190565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008262002d425762002d4262002d04565b500490565b60006001820162002d5c5762002d5c62002d1a565b5060010190565b6001600160a01b038416815263ffffffff8316602082015260606040820181905260009062002d959083018462002b8f565b95945050505050565b6000825162002db281846020870162002abb565b9190910192915050565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b60008060006060848603121562002e0957600080fd5b835167ffffffffffffffff8082111562002e2257600080fd5b62002e308783880162002aea565b9450602086015191508082111562002e4757600080fd5b5062002e568682870162002aea565b9250506040840151620028e38162002696565b60008262002e7b5762002e7b62002d04565b500690565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60608152600062002ebf60608301878962002e80565b828103602084015262002ed481868862002e80565b91505060ff831660408301529695505050505050565b6000835162002efe81846020880162002abb565b83519083019062002f1481836020880162002abb565b01949350505050565b6000808585111562002f2e57600080fd5b8386111562002f3c57600080fd5b5050820193919092039150565b600080600080600080600060e0888a03121562002f6557600080fd5b873562002f7281620023e4565b9650602088013562002f8481620023e4565b955060408801359450606088013593506080880135620027138162002696565b6020808252603c908201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2050455260408201527f4d49545f4f574e45525f4d5553545f42455f5448455f53454e44455200000000606082015260800190565b60208082526031908201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a205350456040820152704e4445525f4d5553545f42455f5448495360781b606082015260800190565b600080600080600080600080610100898b0312156200307057600080fd5b88356200307d81620023e4565b975060208901356200308f81620023e4565b965060408901359550606089013594506080890135620030af8162002a8c565b935060a0890135620030c18162002696565b979a969950949793969295929450505060c08201359160e0013590565b600181815b808511156200311f57816000190482111562003103576200310362002d1a565b808516156200311157918102915b93841c9390800290620030e3565b509250929050565b600082620031385750600162000a58565b81620031475750600062000a58565b81600181146200316057600281146200316b576200318b565b600191505062000a58565b60ff8411156200317f576200317f62002d1a565b50506001821b62000a58565b5060208310610133831016604e8410600b8410161715620031b0575081810a62000a58565b620031bc8383620030de565b8060001904821115620031d357620031d362002d1a565b029392505050565b600062002559838362003127565b600082821015620031fe57620031fe62002d1a565b500390565b6000821982111562003219576200321962002d1a565b500190565b634e487b7160e01b600052600160045260246000fd5b6000602082840312156200324757600080fd5b5051919050565b60208152600062002559602083018462002b8f56fe60c06040523480156200001157600080fd5b5060405162001557380380620015578339810160408190526200003491620002ad565b82826003620000448382620003c1565b506004620000538282620003c1565b5050600580546001600160a81b0319163360ff60a01b191617600160a01b60ff851602179055504660808190526200008b9062000098565b60a052506200048d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000c562000146565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b606060038054620001579062000332565b80601f0160208091040260200160405190810160405280929190818152602001828054620001859062000332565b8015620001d65780601f10620001aa57610100808354040283529160200191620001d6565b820191906000526020600020905b815481529060010190602001808311620001b857829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200020857600080fd5b81516001600160401b0380821115620002255762000225620001e0565b604051601f8301601f19908116603f01168101908282118183101715620002505762000250620001e0565b816040528381526020925086838588010111156200026d57600080fd5b600091505b8382101562000291578582018301518183018401529082019062000272565b83821115620002a35760008385830101525b9695505050505050565b600080600060608486031215620002c357600080fd5b83516001600160401b0380821115620002db57600080fd5b620002e987838801620001f6565b945060208601519150808211156200030057600080fd5b506200030f86828701620001f6565b925050604084015160ff811681146200032757600080fd5b809150509250925092565b600181811c908216806200034757607f821691505b6020821081036200036857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003bc57600081815260208120601f850160051c81016020861015620003975750805b601f850160051c820191505b81811015620003b857828155600101620003a3565b5050505b505050565b81516001600160401b03811115620003dd57620003dd620001e0565b620003f581620003ee845462000332565b846200036e565b602080601f8311600181146200042d5760008415620004145750858301515b600019600386901b1c1916600185901b178555620003b8565b600085815260208120601f198616915b828110156200045e578886015182559484019460019091019084016200043d565b50858210156200047d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05161109d620004ba60003960006104690152600081816102f70152610433015261109d6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146102cc578063a9059cbb146102df578063cd0d0096146102f2578063d505accf14610319578063dd62ed3e1461032e578063ffa1ad741461034157600080fd5b806370a082311461023d5780637ecebe001461026657806395d89b41146102865780639dc29fac1461028e578063a3c573eb146102a157600080fd5b806330adf81f116100ff57806330adf81f146101c9578063313ce567146101f05780633644e5151461020f578063395093511461021757806340c10f191461022a57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806320606b701461018f57806323b872dd146101b6575b600080fd5b610144610361565b6040516101519190610e03565b60405180910390f35b61016d610168366004610e74565b6103f3565b6040519015158152602001610151565b6002545b604051908152602001610151565b6101817f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61016d6101c4366004610e9e565b61040b565b6101817f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b600554600160a01b900460ff1660405160ff9091168152602001610151565b61018161042f565b61016d610225366004610e74565b61048b565b61016d610238366004610e74565b6104ad565b61018161024b366004610eda565b6001600160a01b031660009081526020819052604090205490565b610181610274366004610eda565b60066020526000908152604090205481565b6101446104f6565b61016d61029c366004610e74565b610505565b6005546102b4906001600160a01b031681565b6040516001600160a01b039091168152602001610151565b61016d6102da366004610e74565b61053c565b61016d6102ed366004610e74565b6105b7565b6101817f000000000000000000000000000000000000000000000000000000000000000081565b61032c610327366004610efc565b6105c5565b005b61018161033c366004610f6f565b610800565b610144604051806040016040528060018152602001603160f81b81525081565b60606003805461037090610fa2565b80601f016020809104026020016040519081016040528092919081815260200182805461039c90610fa2565b80156103e95780601f106103be576101008083540402835291602001916103e9565b820191906000526020600020905b8154815290600101906020018083116103cc57829003601f168201915b5050505050905090565b60003361040181858561082b565b5060019392505050565b600033610419858285610950565b6104248585856109ca565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104665761046146610b6e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b60003361040181858561049e8383610800565b6104a89190610ff2565b61082b565b6005546000906001600160a01b031633146104e35760405162461bcd60e51b81526004016104da9061100a565b60405180910390fd5b6104ed8383610c1a565b50600192915050565b60606004805461037090610fa2565b6005546000906001600160a01b031633146105325760405162461bcd60e51b81526004016104da9061100a565b6104ed8383610cd9565b6000338161054a8286610800565b9050838110156105aa5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104da565b610424828686840361082b565b6000336104018185856109ca565b834211156106215760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104da565b6001600160a01b038716600090815260066020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661066e8361104e565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106cc61042f565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610757573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061078d5750896001600160a01b0316816001600160a01b0316145b6107e95760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104da565b6107f48a8a8a61082b565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661088d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104da565b6001600160a01b0382166108ee5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104da565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061095c8484610800565b905060001981146109c457818110156109b75760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104da565b6109c4848484840361082b565b50505050565b6001600160a01b038316610a2e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104da565b6001600160a01b038216610a905760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104da565b6001600160a01b03831660009081526020819052604090205481811015610b085760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104da565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36109c4565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610b99610361565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c705760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104da565b8060026000828254610c829190610ff2565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038216610d395760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104da565b6001600160a01b03821660009081526020819052604090205481811015610dad5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104da565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610943565b600060208083528351808285015260005b81811015610e3057858101830151858201604001528201610e14565b81811115610e42576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114610e6f57600080fd5b919050565b60008060408385031215610e8757600080fd5b610e9083610e58565b946020939093013593505050565b600080600060608486031215610eb357600080fd5b610ebc84610e58565b9250610eca60208501610e58565b9150604084013590509250925092565b600060208284031215610eec57600080fd5b610ef582610e58565b9392505050565b600080600080600080600060e0888a031215610f1757600080fd5b610f2088610e58565b9650610f2e60208901610e58565b95506040880135945060608801359350608088013560ff81168114610f5257600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f8257600080fd5b610f8b83610e58565b9150610f9960208401610e58565b90509250929050565b600181811c90821680610fb657607f821691505b602082108103610fd657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561100557611005610fdc565b500190565b60208082526024908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e4f545f42526040820152634944474560e01b606082015260800190565b60006001820161106057611060610fdc565b506001019056fea264697066735822122070fae8b3daebe7fc894d50296739b7a26e638f37239109230c7dfd552785f2a264736f6c634300080f0033506f6c79676f6e5a6b45564d4272696467653a3a5f7665726966794c6561663aa2646970667358221220a0c682e41bbc0bcf599110077edba37d297487e713d10fc5634097fd73bd508664736f6c634300080f0033", + "bytecode": "0x608060405260043610620001435760003560e01c80633e19704311620000b9578063bab161bf1162000078578063bab161bf14620003e6578063d02103ca1462000420578063d96a15f71462000449578063dbc169761462000460578063ee25560b1462000478578063fb57083414620004a957600080fd5b80633e19704314620002f8578063647c576c146200031d57806381b1c17414620003425780639e34070f146200037c578063aaa13cc214620003c157600080fd5b80632d2c9d9411620001065780632d2c9d9414620002035780632dfdf0b51462000228578063318aee3d146200024f57806334ac9cf214620002be5780633ae0504714620002e057600080fd5b80630871e971146200014857806315064c9614620001615780632072f6c5146200019257806322e95f2c14620001aa5780632cffd02e14620001de575b600080fd5b6200015f6200015936600462002418565b620004ce565b005b3480156200016e57600080fd5b506068546200017d9060ff1681565b60405190151581526020015b60405180910390f35b3480156200019f57600080fd5b506200015f620008df565b348015620001b757600080fd5b50620001cf620001c9366004620024a4565b62000917565b604051620001899190620024e0565b348015620001eb57600080fd5b506200015f620001fd36600462002507565b6200096a565b3480156200021057600080fd5b506200015f6200022236600462002507565b62000d6e565b3480156200023557600080fd5b506200024060535481565b60405190815260200162000189565b3480156200025c57600080fd5b50620002996200026e366004620025ec565b606b6020526000908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000189565b348015620002cb57600080fd5b50606c54620001cf906001600160a01b031681565b348015620002ed57600080fd5b506200024062000ebd565b3480156200030557600080fd5b50620002406200031736600462002623565b62000fa3565b3480156200032a57600080fd5b506200015f6200033c366004620026ad565b62001030565b3480156200034f57600080fd5b50620001cf62000361366004620026fd565b606a602052600090815260409020546001600160a01b031681565b3480156200038957600080fd5b506200017d6200039b366004620026fd565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b348015620003ce57600080fd5b50620001cf620003e036600462002717565b620011ad565b348015620003f357600080fd5b506068546200040a90610100900463ffffffff1681565b60405163ffffffff909116815260200162000189565b3480156200042d57600080fd5b50606854620001cf90600160281b90046001600160a01b031681565b6200015f6200045a366004620027ca565b620012c4565b3480156200046d57600080fd5b506200015f62001448565b3480156200048557600080fd5b506200024062000497366004620026fd565b60696020526000908152604090205481565b348015620004b657600080fd5b506200017d620004c836600462002834565b6200147e565b60685460ff1615620004f357604051630bc011ff60e21b815260040160405180910390fd5b620004fd62001567565b60685463ffffffff868116610100909204161480620005235750600263ffffffff861610155b1562000542576040516302caf51760e11b815260040160405180910390fd5b6000806060856001600160a01b038a166200058257863414620005785760405163b89240f560e01b815260040160405180910390fd5b60009250620007e7565b3415620005a25760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b03808b166000908152606b602090815260409182902082518084019093525463ffffffff81168352640100000000900490921691810182905290156200066157604051632770a7eb60e21b81526001600160a01b038c1690639dc29fac90620006199033908c9060040162002881565b600060405180830381600087803b1580156200063457600080fd5b505af115801562000649573d6000803e3d6000fd5b505050508060200151945080600001519350620007e5565b85156200067657620006768b898989620015c2565b6040516370a0823160e01b81526000906001600160a01b038d16906370a0823190620006a7903090600401620024e0565b602060405180830381865afa158015620006c5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006eb91906200289a565b9050620007046001600160a01b038d1633308c62001925565b6040516370a0823160e01b81526000906001600160a01b038e16906370a082319062000735903090600401620024e0565b602060405180830381865afa15801562000753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200077991906200289a565b9050620007878282620028ca565b6068548e9850610100900463ffffffff1696509350620007a78762001992565b620007b28e62001a59565b620007bd8f62001b17565b604051602001620007d19392919062002934565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868c8c86886053546040516200082998979695949392919062002971565b60405180910390a1620008546200084e600085878d8d87898051906020012062000fa3565b62001bd8565b606854600160281b90046001600160a01b03166333d6247d6200087662000ebd565b6040518263ffffffff1660e01b81526004016200089591815260200190565b600060405180830381600087803b158015620008b057600080fd5b505af1158015620008c5573d6000803e3d6000fd5b5050505050505050620008d760018055565b505050505050565b606c546001600160a01b031633146200090b5760405163e2e8106b60e01b815260040160405180910390fd5b6200091562001cdc565b565b6000606a6000848460405160200162000932929190620029de565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156200098f57604051630bc011ff60e21b815260040160405180910390fd5b620009a68b8b8b8b8b8b8b8b8b8b8b600062001d39565b6001600160a01b03861662000a4f57604080516000808252602082019092526001600160a01b038616908590604051620009e1919062002a1e565b60006040518083038185875af1925050503d806000811462000a20576040519150601f19603f3d011682016040523d82523d6000602084013e62000a25565b606091505b505090508062000a4857604051630ce8f45160e31b815260040160405180910390fd5b5062000d20565b60685463ffffffff61010090910481169088160362000a845762000a7e6001600160a01b038716858562001eb7565b62000d20565b6000878760405160200162000a9b929190620029de565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b03168062000cb8576000808062000ae48688018862002af5565b92509250925060008584848460405162000afe9062002391565b62000b0c9392919062002934565b8190604051809103906000f590508015801562000b2d573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000b61908d908d9060040162002881565b600060405180830381600087803b15801562000b7c57600080fd5b505af115801562000b91573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000ca695949392919062002b93565b60405180910390a15050505062000d1d565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000ce8908990899060040162002881565b600060405180830381600087803b15801562000d0357600080fd5b505af115801562000d18573d6000803e3d6000fd5b505050505b50505b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459838a8888878760405162000d5995949392919062002bce565b60405180910390a15050505050505050505050565b60685460ff161562000d9357604051630bc011ff60e21b815260040160405180910390fd5b62000daa8b8b8b8b8b8b8b8b8b8b8b600162001d39565b6000846001600160a01b031684888a868660405160240162000dd0949392919062002c05565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000e07919062002a1e565b60006040518083038185875af1925050503d806000811462000e46576040519150601f19603f3d011682016040523d82523d6000602084013e62000e4b565b606091505b505090508062000e6e576040516337e391c360e01b815260040160405180910390fd5b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459838b8989888860405162000ea795949392919062002bce565b60405180910390a1505050505050505050505050565b605354600090819081805b602081101562000f9a578083901c60011660010362000f2b576033816020811062000ef75762000ef762002c42565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000f58565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b6040805160208101849052908101839052606001604051602081830303815290604052805190602001209150808062000f919062002c58565b91505062000ec8565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b600054610100900460ff1615808015620010515750600054600160ff909116105b806200106d5750303b1580156200106d575060005460ff166001145b620010d65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015620010fa576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff87160265010000000000600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b0319169184169190911790556200116062001ed9565b8015620011a7576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6000808888604051602001620011c5929190620029de565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620011f89062002391565b601f1982820381018352601f90910116604081905262001225908d908d908d908d908d9060200162002c74565b60408051601f198184030181529082905262001245929160200162002cb5565b604051602081830303815290604052805190602001206040516020016200129e94939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60685460ff1615620012e957604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8581166101009092041614806200130f5750600263ffffffff851610155b156200132e576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338787348888605354604051620013849998979695949392919062002ce8565b60405180910390a1620013cd6200084e6001606860019054906101000a900463ffffffff16338888348989604051620013bf92919062002d57565b604051809103902062000fa3565b606854600160281b90046001600160a01b03166333d6247d620013ef62000ebd565b6040518263ffffffff1660e01b81526004016200140e91815260200190565b600060405180830381600087803b1580156200142957600080fd5b505af11580156200143e573d6000803e3d6000fd5b5050505050505050565b606c546001600160a01b03163314620014745760405163e2e8106b60e01b815260040160405180910390fd5b6200091562001f0d565b600084815b60208110156200155957600163ffffffff8616821c81169003620014f557858160208110620014b657620014b662002c42565b602002013582604051602001620014d7929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001544565b818682602081106200150b576200150b62002c42565b60200201356040516020016200152b929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80620015508162002c58565b91505062001483565b50821490505b949350505050565b600260015403620015bb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620010cd565b6002600155565b6000620015d3600482848662002d67565b620015de9162002d93565b9050632afa533160e01b6001600160e01b03198216016200177f57600080808080808062001610896004818d62002d67565b8101906200161f919062002dc4565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620016605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146200168a5760405163750643af60e01b815260040160405180910390fd5b8a8514620016ab576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e16916200172b919062002a1e565b6000604051808303816000865af19150503d80600081146200176a576040519150601f19603f3d011682016040523d82523d6000602084013e6200176f565b606091505b505050505050505050506200191e565b6001600160e01b031981166323f2ebc360e21b14620017b157604051637141605d60e11b815260040160405180910390fd5b600080808080808080620017c98a6004818e62002d67565b810190620017d8919062002e2e565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146200181b5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0387163014620018455760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691620018ce919062002a1e565b6000604051808303816000865af19150503d80600081146200190d576040519150601f19603f3d011682016040523d82523d6000602084013e62001912565b606091505b50505050505050505050505b5050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620011a79085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001f66565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b03861691620019db919062002a1e565b600060405180830381855afa9150503d806000811462001a18576040519150601f19603f3d011682016040523d82523d6000602084013e62001a1d565b606091505b50915091508162001a4e57604051806040016040528060078152602001664e4f5f4e414d4560c81b8152506200155f565b6200155f816200203f565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b0386169162001aa2919062002a1e565b600060405180830381855afa9150503d806000811462001adf576040519150601f19603f3d011682016040523d82523d6000602084013e62001ae4565b606091505b50915091508162001a4e57604051806040016040528060098152602001681393d7d4d6535093d360ba1b8152506200155f565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162001b5f919062002a1e565b600060405180830381855afa9150503d806000811462001b9c576040519150601f19603f3d011682016040523d82523d6000602084013e62001ba1565b606091505b509150915081801562001bb5575080516020145b62001bc25760126200155f565b808060200190518101906200155f919062002eba565b80600162001be96020600262002fd7565b62001bf59190620028ca565b6053541062001c17576040516377ae67b360e11b815260040160405180910390fd5b600060536000815462001c2a9062002c58565b9182905550905060005b602081101562001cc6578082901c60011660010362001c6c57826033826020811062001c645762001c6462002c42565b015550505050565b6033816020811062001c825762001c8262002c42565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001cbd9062002c58565b91505062001c34565b5062001cd162002fe5565b505050565b60018055565b60685460ff161562001d0157604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b62001d4a8b63ffffffff16620021e8565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af115801562001dc5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001deb91906200289a565b90508060000362001e0e57604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff888116610100909204161462001e3f576040516302caf51760e11b815260040160405180910390fd5b606854600090610100900463ffffffff1662001e5d57508962001e60565b508a5b62001e8962001e80848c8c8c8c8c8c8c604051620013bf92919062002d57565b8f8f846200147e565b62001ea7576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b62001cd18363a9059cbb60e01b84846040516024016200195a92919062002881565b600054610100900460ff1662001f035760405162461bcd60e51b8152600401620010cd9062002ffb565b6200091562002234565b60685460ff1662001f3157604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600062001fbd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200225e9092919063ffffffff16565b80519091501562001cd1578080602001905181019062001fde919062003046565b62001cd15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620010cd565b6060604082511062002061578180602001905181019062000964919062003066565b8151602003620021b55760005b602081108015620020a157508281815181106200208f576200208f62002c42565b01602001516001600160f81b03191615155b15620020bc5780620020b38162002c58565b9150506200206e565b80600003620020f55750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b0381111562002112576200211262002a08565b6040519080825280601f01601f1916602001820160405280156200213d576020820181803683370190505b50905060005b82811015620021ad5784818151811062002161576200216162002c42565b602001015160f81c60f81b82828151811062002181576200218162002c42565b60200101906001600160f81b031916908160001a90535080620021a48162002c58565b91505062002143565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200191e57604051630c8d9eab60e31b815260040160405180910390fd5b600054610100900460ff1662001cd65760405162461bcd60e51b8152600401620010cd9062002ffb565b60606200155f848460008585600080866001600160a01b0316858760405162002288919062002a1e565b60006040518083038185875af1925050503d8060008114620022c7576040519150601f19603f3d011682016040523d82523d6000602084013e620022cc565b606091505b5091509150620022df87838387620022ea565b979650505050505050565b606083156200235e57825160000362002356576001600160a01b0385163b620023565760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620010cd565b50816200155f565b6200155f8383815115620023755781518083602001fd5b8060405162461bcd60e51b8152600401620010cd9190620030e5565b61159c80620030fb83390190565b6001600160a01b0381168114620023b557600080fd5b50565b803563ffffffff81168114620021e357600080fd5b60008083601f840112620023e057600080fd5b5081356001600160401b03811115620023f857600080fd5b6020830191508360208285010111156200241157600080fd5b9250929050565b60008060008060008060a087890312156200243257600080fd5b86356200243f816200239f565b95506200244f60208801620023b8565b9450604087013562002461816200239f565b93506060870135925060808701356001600160401b038111156200248457600080fd5b6200249289828a01620023cd565b979a9699509497509295939492505050565b60008060408385031215620024b857600080fd5b620024c383620023b8565b91506020830135620024d5816200239f565b809150509250929050565b6001600160a01b0391909116815260200190565b8061040081018310156200096457600080fd5b60008060008060008060008060008060006105208c8e0312156200252a57600080fd5b620025368d8d620024f4565b9a50620025476104008d01620023b8565b99506104208c013598506104408c01359750620025686104608d01620023b8565b96506104808c01356200257b816200239f565b95506200258c6104a08d01620023b8565b94506104c08c01356200259f816200239f565b93506104e08c013592506105008c01356001600160401b03811115620025c457600080fd5b620025d28e828f01620023cd565b915080935050809150509295989b509295989b9093969950565b600060208284031215620025ff57600080fd5b81356200260c816200239f565b9392505050565b60ff81168114620023b557600080fd5b600080600080600080600060e0888a0312156200263f57600080fd5b87356200264c8162002613565b96506200265c60208901620023b8565b955060408801356200266e816200239f565b94506200267e60608901620023b8565b9350608088013562002690816200239f565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620026c357600080fd5b620026ce84620023b8565b92506020840135620026e0816200239f565b91506040840135620026f2816200239f565b809150509250925092565b6000602082840312156200271057600080fd5b5035919050565b600080600080600080600060a0888a0312156200273357600080fd5b6200273e88620023b8565b9650602088013562002750816200239f565b955060408801356001600160401b03808211156200276d57600080fd5b6200277b8b838c01620023cd565b909750955060608a01359150808211156200279557600080fd5b50620027a48a828b01620023cd565b9094509250506080880135620027ba8162002613565b8091505092959891949750929550565b60008060008060608587031215620027e157600080fd5b620027ec85620023b8565b93506020850135620027fe816200239f565b925060408501356001600160401b038111156200281a57600080fd5b6200282887828801620023cd565b95989497509550505050565b60008060008061046085870312156200284c57600080fd5b843593506200285f8660208701620024f4565b9250620028706104208601620023b8565b939692955092936104400135925050565b6001600160a01b03929092168252602082015260400190565b600060208284031215620028ad57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115620009645762000964620028b4565b60005b83811015620028fd578181015183820152602001620028e3565b50506000910152565b6000815180845262002920816020860160208601620028e0565b601f01601f19169290920160200192915050565b60608152600062002949606083018662002906565b82810360208401526200295d818662002906565b91505060ff83166040830152949350505050565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c08301819052600091620029c58483018762002906565b925080851660e085015250509998505050505050505050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b634e487b7160e01b600052604160045260246000fd5b6000825162002a32818460208701620028e0565b9190910192915050565b604051601f8201601f191681016001600160401b038111828210171562002a675762002a6762002a08565b604052919050565b60006001600160401b0382111562002a8b5762002a8b62002a08565b50601f01601f191660200190565b600082601f83011262002aab57600080fd5b813562002ac262002abc8262002a6f565b62002a3c565b81815284602083860101111562002ad857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562002b0b57600080fd5b83356001600160401b038082111562002b2357600080fd5b62002b318783880162002a99565b9450602086013591508082111562002b4857600080fd5b5062002b578682870162002a99565b9250506040840135620026f28162002613565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090620022df908301848662002b6a565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009062002c38908301848662002b6a565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006001820162002c6d5762002c6d620028b4565b5060010190565b60608152600062002c8a60608301878962002b6a565b828103602084015262002c9f81868862002b6a565b91505060ff831660408301529695505050505050565b6000835162002cc9818460208801620028e0565b83519083019062002cdf818360208801620028e0565b01949350505050565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c0830181905260009162002d3d848301878962002b6a565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b6000808585111562002d7857600080fd5b8386111562002d8657600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562002dbc5780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562002de057600080fd5b873562002ded816200239f565b9650602088013562002dff816200239f565b955060408801359450606088013593506080880135620026908162002613565b8015158114620023b557600080fd5b600080600080600080600080610100898b03121562002e4c57600080fd5b883562002e59816200239f565b9750602089013562002e6b816200239f565b96506040890135955060608901359450608089013562002e8b8162002e1f565b935060a089013562002e9d8162002613565b979a969950949793969295929450505060c08201359160e0013590565b60006020828403121562002ecd57600080fd5b81516200260c8162002613565b600181815b8085111562002f1b57816000190482111562002eff5762002eff620028b4565b8085161562002f0d57918102915b93841c939080029062002edf565b509250929050565b60008262002f345750600162000964565b8162002f435750600062000964565b816001811462002f5c576002811462002f675762002f87565b600191505062000964565b60ff84111562002f7b5762002f7b620028b4565b50506001821b62000964565b5060208310610133831016604e8410600b841016171562002fac575081810a62000964565b62002fb8838362002eda565b806000190482111562002fcf5762002fcf620028b4565b029392505050565b60006200260c838362002f23565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000602082840312156200305957600080fd5b81516200260c8162002e1f565b6000602082840312156200307957600080fd5b81516001600160401b038111156200309057600080fd5b8201601f81018413620030a257600080fd5b8051620030b362002abc8262002a6f565b818152856020838501011115620030c957600080fd5b620030dc826020830160208601620028e0565b95945050505050565b6020815260006200260c60208301846200290656fe6101006040523480156200001257600080fd5b506040516200159c3803806200159c83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110e0620004bc60003960006101f70152600081816102ba015281816104e0015261054e0152600061049101526000818161031f015261045b01526110e06000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146102f4578063a9059cbb14610307578063cd0d00961461031a578063d505accf14610341578063dd62ed3e14610354578063ffa1ad741461036757600080fd5b806370a08231146102515780637ecebe001461027a57806395d89b411461029a5780639dc29fac146102a2578063a3c573eb146102b557600080fd5b806330adf81f116100ff57806330adf81f146101c9578063313ce567146101f05780633644e51514610221578063395093511461022957806340c10f191461023c57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806320606b701461018f57806323b872dd146101b6575b600080fd5b610144610387565b6040516101519190610e26565b60405180910390f35b61016d610168366004610e90565b610419565b6040519015158152602001610151565b6002545b604051908152602001610151565b6101817f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61016d6101c4366004610eba565b610433565b6101817f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610151565b610181610457565b61016d610237366004610e90565b6104b3565b61024f61024a366004610e90565b6104d5565b005b61018161025f366004610ef6565b6001600160a01b031660009081526020819052604090205490565b610181610288366004610ef6565b60056020526000908152604090205481565b610144610534565b61024f6102b0366004610e90565b610543565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610151565b61016d610302366004610e90565b610595565b61016d610315366004610e90565b610610565b6101817f000000000000000000000000000000000000000000000000000000000000000081565b61024f61034f366004610f18565b61061e565b610181610362366004610f8b565b610859565b610144604051806040016040528060018152602001603160f81b81525081565b60606003805461039690610fbe565b80601f01602080910402602001604051908101604052809291908181526020018280546103c290610fbe565b801561040f5780601f106103e45761010080835404028352916020019161040f565b820191906000526020600020905b8154815290600101906020018083116103f257829003601f168201915b5050505050905090565b600033610427818585610884565b60019150505b92915050565b6000336104418582856109a9565b61044c858585610a23565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461048e5761048946610bb5565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336104278185856104c68383610859565b6104d0919061100e565b610884565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105265760405162461bcd60e51b815260040161051d90611021565b60405180910390fd5b6105308282610c61565b5050565b60606004805461039690610fbe565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461058b5760405162461bcd60e51b815260040161051d90611021565b6105308282610d0e565b600033816105a38286610859565b9050838110156106035760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161051d565b61044c8286868403610884565b600033610427818585610a23565b8342111561067a5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b606482015260840161051d565b6001600160a01b038716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866106c783611071565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610725610457565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156107b0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107e65750896001600160a01b0316816001600160a01b0316145b6108425760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b606482015260840161051d565b61084d8a8a8a610884565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108e65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161051d565b6001600160a01b0382166109475760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161051d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006109b58484610859565b90506000198114610a1d5781811015610a105760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161051d565b610a1d8484848403610884565b50505050565b6001600160a01b038316610a875760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161051d565b6001600160a01b038216610ae95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161051d565b6001600160a01b03831660009081526020819052604090205481811015610b615760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161051d565b6001600160a01b038481166000818152602081815260408083208787039055938716808352918490208054870190559251858152909260008051602061108b833981519152910160405180910390a3610a1d565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610be0610387565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610cb75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161051d565b8060026000828254610cc9919061100e565b90915550506001600160a01b0382166000818152602081815260408083208054860190555184815260008051602061108b833981519152910160405180910390a35050565b6001600160a01b038216610d6e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161051d565b6001600160a01b03821660009081526020819052604090205481811015610de25760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161051d565b6001600160a01b03831660008181526020818152604080832086860390556002805487900390555185815291929160008051602061108b833981519152910161099c565b600060208083528351808285015260005b81811015610e5357858101830151858201604001528201610e37565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e8b57600080fd5b919050565b60008060408385031215610ea357600080fd5b610eac83610e74565b946020939093013593505050565b600080600060608486031215610ecf57600080fd5b610ed884610e74565b9250610ee660208501610e74565b9150604084013590509250925092565b600060208284031215610f0857600080fd5b610f1182610e74565b9392505050565b600080600080600080600060e0888a031215610f3357600080fd5b610f3c88610e74565b9650610f4a60208901610e74565b95506040880135945060608801359350608088013560ff81168114610f6e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f9e57600080fd5b610fa783610e74565b9150610fb560208401610e74565b90509250929050565b600181811c90821680610fd257607f821691505b602082108103610ff257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042d5761042d610ff8565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161108357611083610ff8565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c54f702400844bca54b965f08b878a7ad166d07c77c1b4434783c6c861d64cea64736f6c63430008110033a26469706673582212202aa6f7b7ecc82d0d4918ea3545a938824a9c0c986e4c0adb6b439e9bf3d70d0864736f6c63430008110033", "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000068": "0xae4bb80be56b819606589de61d5ec3b522eeb0320000000100", "0x0000000000000000000000000000000000000000000000000000000000000000": "0x01", - "0x0000000000000000000000000000000000000000000000000000000000000022": "0x0100", - "0x0000000000000000000000000000000000000000000000000000000000000026": "0xae4bb80be56b819606589de61d5ec3b522eeb032" + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x01" }, "contractName": "PolygonZkEVMBridge" }, @@ -23,48 +23,9 @@ "balance": "0", "nonce": "1", "address": "0xae4bb80be56b819606589de61d5ec3b522eeb032", - "bytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b366004610156565b60006020819052908152604090205481565b6100a061009b366004610156565b6100cd565b005b6002546100b5906001600160a01b031681565b6040516001600160a01b039091168152602001610064565b6002546001600160a01b031633146101515760405162461bcd60e51b815260206004820152603960248201527f506f6c79676f6e5a4b45564d476c6f62616c45786974526f6f744c323a3a757060448201527f6461746545786974526f6f743a204f4e4c595f42524944474500000000000000606482015260840160405180910390fd5b600155565b60006020828403121561016857600080fd5b503591905056fea2646970667358221220f7451da1829b0ecb4873ed6f3f3d32d71e72a79502689acac6a4216f7a54a4a164736f6c634300080f0033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x9d98deabc42dd696deb9e40b4f1cab7ddbf55988" - }, + "bytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b36600461012f565b60006020819052908152604090205481565b6100a061009b36600461012f565b6100e1565b005b6100c97f0000000000000000000000009d98deabc42dd696deb9e40b4f1cab7ddbf5598881565b6040516001600160a01b039091168152602001610064565b336001600160a01b037f0000000000000000000000009d98deabc42dd696deb9e40b4f1cab7ddbf55988161461012a5760405163b49365dd60e01b815260040160405180910390fd5b600155565b60006020828403121561014157600080fd5b503591905056fea2646970667358221220859fbbe22cdffd5d3aab670dd9922eb1c7afadaaea0a619f34b3cb92884acce464736f6c63430008110033", + "storage": {}, "contractName": "PolygonZkEVMGlobalExitRootL2" } - ], - "transactions": [ - { - "rawTx": "0xf902688080839896808080b90258608060405234801561001057600080fd5b5060405161023838038061023883398101604081905261002f91610054565b600280546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6101a5806100936000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b366004610156565b60006020819052908152604090205481565b6100a061009b366004610156565b6100cd565b005b6002546100b5906001600160a01b031681565b6040516001600160a01b039091168152602001610064565b6002546001600160a01b031633146101515760405162461bcd60e51b815260206004820152603960248201527f506f6c79676f6e5a4b45564d476c6f62616c45786974526f6f744c323a3a757060448201527f6461746545786974526f6f743a204f4e4c595f42524944474500000000000000606482015260840160405180910390fd5b600155565b60006020828403121561016857600080fd5b503591905056fea2646970667358221220f7451da1829b0ecb4873ed6f3f3d32d71e72a79502689acac6a4216f7a54a4a164736f6c634300080f00330000000000000000000000009d98deabc42dd696deb9e40b4f1cab7ddbf559888203e88080a312fbe6c30bd5d81585296345811447188115aadb366d719cc2c2662c73756f46069fb27ca774be0634fb35523870184fbccc0a5560bcf151dd655d2d3fdd3a1b", - "receipt": { - "status": 1, - "gasUsed": "0x0292b0", - "logs": [] - }, - "createAddress": "0xae4bb80be56b819606589de61d5ec3b522eeb032" - }, - { - "rawTx": "0xf948400180839896808080b94830608060405234801561001057600080fd5b50614810806100206000396000f3fe608060405260043610620001675760003560e01c806381b1c17411620000c5578063d02103ca1162000078578063d02103ca146200047d578063d96a15f7146200049f578063dbc1697614620004b6578063ed6be5c914620004ce578063ee25560b14620004e5578063ff634ed7146200051657600080fd5b806381b1c17414620003735780638f61151914620003ad5780639e34070f14620003cf578063a08e8a0814620003f4578063aaa13cc2146200041e578063bab161bf146200044357600080fd5b80633ae05047116200011e5780633ae0504714620002a25780633da8168214620002ba5780633e19704314620002df578063463855491462000304578063647c576c14620003295780637b6323c1146200034e57600080fd5b80630871e971146200016c57806315064c9614620001855780632072f6c514620001b657806322e95f2c14620001ce5780632dfdf0b5146200020c578063318aee3d1462000233575b600080fd5b620001836200017d36600462002470565b6200052d565b005b3480156200019257600080fd5b50602254620001a19060ff1681565b60405190151581526020015b60405180910390f35b348015620001c357600080fd5b5062000183620009d2565b348015620001db57600080fd5b50620001f3620001ed366004620024fd565b62000a0b565b6040516001600160a01b039091168152602001620001ad565b3480156200021957600080fd5b506200022460215481565b604051908152602001620001ad565b3480156200024057600080fd5b506200027d6200025236600462002539565b60256020526000908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001ad565b348015620002af57600080fd5b506200022462000a5e565b348015620002c757600080fd5b50620001a1620002d936600462002628565b62000b51565b348015620002ec57600080fd5b5062000224620002fe366004620026a6565b62000c53565b3480156200031157600080fd5b506200018362000323366004620027b7565b62000ce0565b3480156200033657600080fd5b5062000183620003483660046200289e565b62000e86565b3480156200035b57600080fd5b50620001836200036d366004620027b7565b62000fe5565b3480156200038057600080fd5b50620001f362000392366004620028ee565b6024602052600090815260409020546001600160a01b031681565b348015620003ba57600080fd5b50602754620001f3906001600160a01b031681565b348015620003dc57600080fd5b50620001a1620003ee366004620028ee565b62001492565b3480156200040157600080fd5b506200040b600081565b60405160ff9091168152602001620001ad565b3480156200042b57600080fd5b50620001f36200043d36600462002908565b620014d7565b3480156200045057600080fd5b506022546200046790610100900463ffffffff1681565b60405163ffffffff9091168152602001620001ad565b3480156200048a57600080fd5b50602654620001f3906001600160a01b031681565b62000183620004b0366004620029bc565b620015ee565b348015620004c357600080fd5b50620001836200179a565b348015620004db57600080fd5b5062000467600081565b348015620004f257600080fd5b506200022462000504366004620028ee565b60236020526000908152604090205481565b3480156200052357600080fd5b506200040b600181565b60225460ff16156200055c5760405162461bcd60e51b8152600401620005539062002a24565b60405180910390fd5b60225463ffffffff610100909104811690861603620005e45760405162461bcd60e51b815260206004820152603b60248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2044455354494e4154494f4e5f43414e545f42455f495453454c460000000000606482015260840162000553565b60008060606001600160a01b0389166200067b5785341462000671576040805162461bcd60e51b81526020600482015260248101919091527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f20414d4f554e545f444f45535f4e4f545f4d415443485f4d53475f56414c5545606482015260840162000553565b60009150620008ec565b6001600160a01b03808a1660009081526025602090815260409182902082518084019093525463ffffffff81168352640100000000900490921691810182905290156200074957604051632770a7eb60e21b8152336004820152602481018890526001600160a01b038b1690639dc29fac906044016020604051808303816000875af115801562000710573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000736919062002a9b565b50602081015181519094509250620008ea565b84156200075e576200075e8a888888620017d1565b620007756001600160a01b038b1633308a62001bf9565b899350602260019054906101000a900463ffffffff169250896001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015620007cc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620007f6919081019062002b36565b8a6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000835573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200085f919081019062002b36565b8b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200089e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008c4919062002b6f565b604051602001620008d89392919062002bbd565b60405160208183030381529060405291505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600083858b8b8b876021546040516200092e98979695949392919062002bfa565b60405180910390a16200095962000953600084868c8c8c888051906020012062000c53565b62001c66565b6026546001600160a01b03166333d6247d6200097462000a5e565b6040518263ffffffff1660e01b81526004016200099391815260200190565b600060405180830381600087803b158015620009ae57600080fd5b505af1158015620009c3573d6000803e3d6000fd5b50505050505050505050505050565b6027546001600160a01b03163314620009ff5760405162461bcd60e51b8152600401620005539062002c67565b62000a0962001db7565b565b600060246000848460405160200162000a2692919062002cc4565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b602154600090819081805b602081101562000b48578260011660010362000ac9576001816020811062000a955762000a9562002cee565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000af6565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b62000b0360028462002d30565b6040805160208101859052908101849052909350606001604051602081830303815290604052805190602001209150808062000b3f9062002d47565b91505062000a69565b50919392505050565b60008467ffffffffffffffff8416825b602081101562000c44578160011660010362000bce5786818151811062000b8c5762000b8c62002cee565b60200260200101518360405160200162000bb0929190918252602082015260400190565b60405160208183030381529060405280519060200120925062000c20565b8287828151811062000be45762000be462002cee565b602002602001015160405160200162000c07929190918252602082015260400190565b6040516020818303038152906040528051906020012092505b62000c2d60028362002d30565b91508062000c3b8162002d47565b91505062000b61565b5050821490505b949350505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b60225460ff161562000d065760405162461bcd60e51b8152600401620005539062002a24565b62000d1c8a8a8a8a8a8a8a8a8a8a600162001e15565b62000d2d8963ffffffff16620020a0565b6000836001600160a01b03168387898560405160240162000d519392919062002d63565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000d88919062002d9e565b60006040518083038185875af1925050503d806000811462000dc7576040519150601f19603f3d011682016040523d82523d6000602084013e62000dcc565b606091505b505090508062000e385760405162461bcd60e51b815260206004820152603060248201527f506f6c79676f6e5a6b45564d4272696467653a3a636c61696d4d65737361676560448201526f0e88135154d4d051d157d1905253115160821b606482015260840162000553565b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459838a8888878760405162000e7195949392919062002dbc565b60405180910390a15050505050505050505050565b600054610100900460ff161580801562000ea75750600054600160ff909116105b8062000ec35750303b15801562000ec3575060005460ff166001145b62000f285760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162000553565b6000805460ff19166001179055801562000f4c576000805461ff0019166101001790555b6022805463ffffffff86166101000264ffffffff0019909116179055602680546001600160a01b038086166001600160a01b0319928316179092556027805492851692909116919091179055801562000fdf576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60225460ff16156200100b5760405162461bcd60e51b8152600401620005539062002a24565b620010218a8a8a8a8a8a8a8a8a8a600062001e15565b620010328963ffffffff16620020a0565b6001600160a01b0385166200112757604080516000808252602082019092526001600160a01b0385169084906040516200106d919062002d9e565b60006040518083038185875af1925050503d8060008114620010ac576040519150601f19603f3d011682016040523d82523d6000602084013e620010b1565b606091505b5050905080620011205760405162461bcd60e51b815260206004820152603360248201527f506f6c79676f6e5a6b45564d4272696467653a3a636c61696d41737365743a2060448201527211551217d514905394d1915497d19052531151606a1b606482015260840162000553565b5062001445565b60225463ffffffff6101009091048116908716036200115c57620011566001600160a01b0386168484620020e2565b62001445565b600086866040516020016200117392919062002cc4565b60408051601f198184030181529181528151602092830120600081815260249093529120549091506001600160a01b031680620013ca57600080600085806020019051810190620011c5919062002df3565b925092509250600085848484604051620011df90620023d6565b620011ed9392919062002bbd565b8190604051809103906000f59050801580156200120e573d6000803e3d6000fd5b506040516340c10f1960e01b81526001600160a01b038b81166004830152602482018b9052919250908216906340c10f19906044016020604051808303816000875af115801562001263573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001289919062002a9b565b50806024600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808d63ffffffff1681526020018c6001600160a01b031681525060256000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507fccd7715648d1f2bb13e158f96b5b6c3aeda555d4cb87112e274a6f28bc571d598c8c83604051620013b89392919063ffffffff9390931683526001600160a01b03918216602084015216604082015260600190565b60405180910390a15050505062001442565b6040516340c10f1960e01b81526001600160a01b038681166004830152602482018690528216906340c10f19906044016020604051808303816000875af11580156200141a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001440919062002a9b565b505b50505b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe2754598389878786866040516200147e95949392919062002dbc565b60405180910390a150505050505050505050565b600080620014a36101008462002d30565b90506000620014b56101008562002e69565b60009283526023602052604090922054600190921b9182169091149392505050565b6000808888604051602001620014ef92919062002cc4565b604051602081830303815290604052805190602001209050600060ff60f81b3083604051806020016200152290620023d6565b601f1982820381018352601f9091011660408190526200154f908d908d908d908d908d9060200162002ea9565b60408051601f19818403018152908290526200156f929160200162002eea565b60405160208183030381529060405280519060200120604051602001620015c894939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60225460ff1615620016145760405162461bcd60e51b8152600401620005539062002a24565b60225463ffffffff6101009091048116908416036200169c5760405162461bcd60e51b815260206004820152603d60248201527f506f6c79676f6e5a6b45564d4272696467653a3a6272696467654d657373616760448201527f653a2044455354494e4154494f4e5f43414e545f42455f495453454c46000000606482015260840162000553565b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001602260019054906101000a900463ffffffff163386863487602154604051620016f098979695949392919062002bfa565b60405180910390a162001727620009536001602260019054906101000a900463ffffffff1633878734888051906020012062000c53565b6026546001600160a01b03166333d6247d6200174262000a5e565b6040518263ffffffff1660e01b81526004016200176191815260200190565b600060405180830381600087803b1580156200177c57600080fd5b505af115801562001791573d6000803e3d6000fd5b50505050505050565b6027546001600160a01b03163314620017c75760405162461bcd60e51b8152600401620005539062002c67565b62000a0962002114565b60006200181483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250620021c392505050565b9050632afa533160e01b6001600160e01b031982160162001a0d57600080808080808062001846896004818d62002f1d565b81019062001855919062002f49565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620018975760405162461bcd60e51b8152600401620005539062002fa4565b6001600160a01b0386163014620018c25760405162461bcd60e51b8152600401620005539062003001565b8a8514620019395760405162461bcd60e51b815260206004820152603960248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2050455260448201527f4d49545f414d4f554e545f444f45535f4e4f545f4d4154434800000000000000606482015260840162000553565b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e1691620019b9919062002d9e565b6000604051808303816000865af19150503d8060008114620019f8576040519150601f19603f3d011682016040523d82523d6000602084013e620019fd565b606091505b5050505050505050505062001bf2565b6001600160e01b031981166323f2ebc360e21b1462001a835760405162461bcd60e51b815260206004820152602b60248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a204e4f5460448201526a17d59053125117d0d0531360aa1b606482015260840162000553565b60008080808080808062001a9b8a6004818e62002f1d565b81019062001aaa919062003052565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001aee5760405162461bcd60e51b8152600401620005539062002fa4565b6001600160a01b038716301462001b195760405162461bcd60e51b8152600401620005539062003001565b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162001ba2919062002d9e565b6000604051808303816000865af19150503d806000811462001be1576040519150601f19603f3d011682016040523d82523d6000602084013e62001be6565b606091505b50505050505050505050505b5050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000fdf9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152620021ca565b80600162001c7760206002620031db565b62001c839190620031e9565b6021541062001ce85760405162461bcd60e51b815260206004820152602a60248201527f4465706f736974436f6e74726163743a5f6465706f7369743a204d45524b4c4560448201526917d514915157d195531360b21b606482015260840162000553565b60016021600082825462001cfd919062003203565b909155505060215460005b602081101562001da7578160011660010362001d3d57826001826020811062001d355762001d3562002cee565b015550505050565b6001816020811062001d535762001d5362002cee565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925060028262001d90919062002d30565b91508062001d9e8162002d47565b91505062001d08565b5062001db26200321e565b505050565b60225460ff161562001ddd5760405162461bcd60e51b8152600401620005539062002a24565b6022805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b62001e268a63ffffffff1662001492565b1562001e7d5760405162461bcd60e51b81526020600482015260306024820152600080516020620047bb83398151915260448201526f081053149150511657d0d3105253515160821b606482015260840162000553565b6026546040805160208082018d90528183018c9052825180830384018152606083019384905280519101206312bd9b1960e11b90925260648101919091526000916001600160a01b03169063257b3632906084016020604051808303816000875af115801562001ef1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f17919062003234565b90508060000362001f805760405162461bcd60e51b81526020600482015260396024820152600080516020620047bb83398151915260448201527f20474c4f42414c5f455849545f524f4f545f494e56414c494400000000000000606482015260840162000553565b60225463ffffffff8781166101009092041614620020025760405162461bcd60e51b81526020600482015260436024820152600080516020620047bb83398151915260448201527f2044455354494e4154494f4e5f4e4554574f524b5f444f45535f4e4f545f4d416064820152620a886960eb1b608482015260a40162000553565b602254600090610100900463ffffffff166200202057508862002023565b50895b6200204e6200203f848b8b8b8b8b8b8051906020012062000c53565b8e8e63ffffffff168462000b51565b620009c35760405162461bcd60e51b815260206004820152602c6024820152600080516020620047bb83398151915260448201526b0814d35517d253959053125160a21b606482015260840162000553565b6000620020b06101008362002d30565b90506000620020c26101008462002e69565b6000928352602360205260409092208054600190931b9092179091555050565b6040516001600160a01b03831660248201526044810182905262001db290849063a9059cbb60e01b9060640162001c2e565b60225460ff166200218e5760405162461bcd60e51b815260206004820152603b60248201527f456d657267656e63794d616e616765723a3a6966456d657267656e637953746160448201527f74653a206f6e6c7920696620656d657267656e63792073746174650000000000606482015260840162000553565b6022805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6020015190565b600062002221826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620022a39092919063ffffffff16565b80519091501562001db2578080602001905181019062002242919062002a9b565b62001db25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000553565b606062000c4b848460008585600080866001600160a01b03168587604051620022cd919062002d9e565b60006040518083038185875af1925050503d80600081146200230c576040519150601f19603f3d011682016040523d82523d6000602084013e62002311565b606091505b509150915062002324878383876200232f565b979650505050505050565b60608315620023a35782516000036200239b576001600160a01b0385163b6200239b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000553565b508162000c4b565b62000c4b8383815115620023ba5781518083602001fd5b8060405162461bcd60e51b81526004016200055391906200324e565b611557806200326483390190565b6001600160a01b0381168114620023fa57600080fd5b50565b80356200240a81620023e4565b919050565b803563ffffffff811681146200240a57600080fd5b60008083601f8401126200243757600080fd5b50813567ffffffffffffffff8111156200245057600080fd5b6020830191508360208285010111156200246957600080fd5b9250929050565b60008060008060008060a087890312156200248a57600080fd5b86356200249781620023e4565b9550620024a7602088016200240f565b94506040870135620024b981620023e4565b935060608701359250608087013567ffffffffffffffff811115620024dd57600080fd5b620024eb89828a0162002424565b979a9699509497509295939492505050565b600080604083850312156200251157600080fd5b6200251c836200240f565b915060208301356200252e81620023e4565b809150509250929050565b6000602082840312156200254c57600080fd5b81356200255981620023e4565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715620025a257620025a262002560565b604052919050565b600082601f830112620025bc57600080fd5b8135602067ffffffffffffffff821115620025db57620025db62002560565b8160051b620025ec82820162002576565b92835284810182019282810190878511156200260757600080fd5b83870192505b8483101562002324578235825291830191908301906200260d565b600080600080608085870312156200263f57600080fd5b84359350602085013567ffffffffffffffff808211156200265f57600080fd5b6200266d88838901620025aa565b94506040870135915080821682146200268557600080fd5b509396929550929360600135925050565b60ff81168114620023fa57600080fd5b600080600080600080600060e0888a031215620026c257600080fd5b8735620026cf8162002696565b9650620026df602089016200240f565b95506040880135620026f181620023e4565b945062002701606089016200240f565b935060808801356200271381620023e4565b9699959850939692959460a0840135945060c09093013592915050565b600067ffffffffffffffff8211156200274d576200274d62002560565b50601f01601f191660200190565b600082601f8301126200276d57600080fd5b8135620027846200277e8262002730565b62002576565b8181528460208386010111156200279a57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806000806000806000806101408b8d031215620027d857600080fd5b8a3567ffffffffffffffff80821115620027f157600080fd5b620027ff8e838f01620025aa565b9b506200280f60208e016200240f565b9a5060408d0135995060608d013598506200282d60808e016200240f565b97506200283d60a08e01620023fd565b96506200284d60c08e016200240f565b95506200285d60e08e01620023fd565b94506101008d013593506101208d01359150808211156200287d57600080fd5b506200288c8d828e016200275b565b9150509295989b9194979a5092959850565b600080600060608486031215620028b457600080fd5b620028bf846200240f565b92506020840135620028d181620023e4565b91506040840135620028e381620023e4565b809150509250925092565b6000602082840312156200290157600080fd5b5035919050565b600080600080600080600060a0888a0312156200292457600080fd5b6200292f886200240f565b965060208801356200294181620023e4565b9550604088013567ffffffffffffffff808211156200295f57600080fd5b6200296d8b838c0162002424565b909750955060608a01359150808211156200298757600080fd5b50620029968a828b0162002424565b9094509250506080880135620029ac8162002696565b8091505092959891949750929550565b600080600060608486031215620029d257600080fd5b620029dd846200240f565b92506020840135620029ef81620023e4565b9150604084013567ffffffffffffffff81111562002a0c57600080fd5b62002a1a868287016200275b565b9150509250925092565b60208082526042908201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960408201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606082015261746560f01b608082015260a00190565b8015158114620023fa57600080fd5b60006020828403121562002aae57600080fd5b8151620025598162002a8c565b60005b8381101562002ad857818101518382015260200162002abe565b8381111562000fdf5750506000910152565b600082601f83011262002afc57600080fd5b815162002b0d6200277e8262002730565b81815284602083860101111562002b2357600080fd5b62000c4b82602083016020870162002abb565b60006020828403121562002b4957600080fd5b815167ffffffffffffffff81111562002b6157600080fd5b62000c4b8482850162002aea565b60006020828403121562002b8257600080fd5b8151620025598162002696565b6000815180845262002ba981602086016020860162002abb565b601f01601f19169290920160200192915050565b60608152600062002bd2606083018662002b8f565b828103602084015262002be6818662002b8f565b91505060ff83166040830152949350505050565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c0830181905260009162002c4e8483018762002b8f565b925080851660e085015250509998505050505050505050565b6020808252603d908201527f506f6c79676f6e5a6b45564d3a3a6f6e6c79506f6c79676f6e5a6b45564d3a2060408201527f6f6e6c7920506f6c79676f6e205a4b2d45564d20636f6e747261637474000000606082015260800190565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008262002d425762002d4262002d04565b500490565b60006001820162002d5c5762002d5c62002d1a565b5060010190565b6001600160a01b038416815263ffffffff8316602082015260606040820181905260009062002d959083018462002b8f565b95945050505050565b6000825162002db281846020870162002abb565b9190910192915050565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b60008060006060848603121562002e0957600080fd5b835167ffffffffffffffff8082111562002e2257600080fd5b62002e308783880162002aea565b9450602086015191508082111562002e4757600080fd5b5062002e568682870162002aea565b9250506040840151620028e38162002696565b60008262002e7b5762002e7b62002d04565b500690565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60608152600062002ebf60608301878962002e80565b828103602084015262002ed481868862002e80565b91505060ff831660408301529695505050505050565b6000835162002efe81846020880162002abb565b83519083019062002f1481836020880162002abb565b01949350505050565b6000808585111562002f2e57600080fd5b8386111562002f3c57600080fd5b5050820193919092039150565b600080600080600080600060e0888a03121562002f6557600080fd5b873562002f7281620023e4565b9650602088013562002f8481620023e4565b955060408801359450606088013593506080880135620027138162002696565b6020808252603c908201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2050455260408201527f4d49545f4f574e45525f4d5553545f42455f5448455f53454e44455200000000606082015260800190565b60208082526031908201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a205350456040820152704e4445525f4d5553545f42455f5448495360781b606082015260800190565b600080600080600080600080610100898b0312156200307057600080fd5b88356200307d81620023e4565b975060208901356200308f81620023e4565b965060408901359550606089013594506080890135620030af8162002a8c565b935060a0890135620030c18162002696565b979a969950949793969295929450505060c08201359160e0013590565b600181815b808511156200311f57816000190482111562003103576200310362002d1a565b808516156200311157918102915b93841c9390800290620030e3565b509250929050565b600082620031385750600162000a58565b81620031475750600062000a58565b81600181146200316057600281146200316b576200318b565b600191505062000a58565b60ff8411156200317f576200317f62002d1a565b50506001821b62000a58565b5060208310610133831016604e8410600b8410161715620031b0575081810a62000a58565b620031bc8383620030de565b8060001904821115620031d357620031d362002d1a565b029392505050565b600062002559838362003127565b600082821015620031fe57620031fe62002d1a565b500390565b6000821982111562003219576200321962002d1a565b500190565b634e487b7160e01b600052600160045260246000fd5b6000602082840312156200324757600080fd5b5051919050565b60208152600062002559602083018462002b8f56fe60c06040523480156200001157600080fd5b5060405162001557380380620015578339810160408190526200003491620002ad565b82826003620000448382620003c1565b506004620000538282620003c1565b5050600580546001600160a81b0319163360ff60a01b191617600160a01b60ff851602179055504660808190526200008b9062000098565b60a052506200048d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000c562000146565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b606060038054620001579062000332565b80601f0160208091040260200160405190810160405280929190818152602001828054620001859062000332565b8015620001d65780601f10620001aa57610100808354040283529160200191620001d6565b820191906000526020600020905b815481529060010190602001808311620001b857829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200020857600080fd5b81516001600160401b0380821115620002255762000225620001e0565b604051601f8301601f19908116603f01168101908282118183101715620002505762000250620001e0565b816040528381526020925086838588010111156200026d57600080fd5b600091505b8382101562000291578582018301518183018401529082019062000272565b83821115620002a35760008385830101525b9695505050505050565b600080600060608486031215620002c357600080fd5b83516001600160401b0380821115620002db57600080fd5b620002e987838801620001f6565b945060208601519150808211156200030057600080fd5b506200030f86828701620001f6565b925050604084015160ff811681146200032757600080fd5b809150509250925092565b600181811c908216806200034757607f821691505b6020821081036200036857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003bc57600081815260208120601f850160051c81016020861015620003975750805b601f850160051c820191505b81811015620003b857828155600101620003a3565b5050505b505050565b81516001600160401b03811115620003dd57620003dd620001e0565b620003f581620003ee845462000332565b846200036e565b602080601f8311600181146200042d5760008415620004145750858301515b600019600386901b1c1916600185901b178555620003b8565b600085815260208120601f198616915b828110156200045e578886015182559484019460019091019084016200043d565b50858210156200047d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05161109d620004ba60003960006104690152600081816102f70152610433015261109d6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146102cc578063a9059cbb146102df578063cd0d0096146102f2578063d505accf14610319578063dd62ed3e1461032e578063ffa1ad741461034157600080fd5b806370a082311461023d5780637ecebe001461026657806395d89b41146102865780639dc29fac1461028e578063a3c573eb146102a157600080fd5b806330adf81f116100ff57806330adf81f146101c9578063313ce567146101f05780633644e5151461020f578063395093511461021757806340c10f191461022a57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806320606b701461018f57806323b872dd146101b6575b600080fd5b610144610361565b6040516101519190610e03565b60405180910390f35b61016d610168366004610e74565b6103f3565b6040519015158152602001610151565b6002545b604051908152602001610151565b6101817f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61016d6101c4366004610e9e565b61040b565b6101817f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b600554600160a01b900460ff1660405160ff9091168152602001610151565b61018161042f565b61016d610225366004610e74565b61048b565b61016d610238366004610e74565b6104ad565b61018161024b366004610eda565b6001600160a01b031660009081526020819052604090205490565b610181610274366004610eda565b60066020526000908152604090205481565b6101446104f6565b61016d61029c366004610e74565b610505565b6005546102b4906001600160a01b031681565b6040516001600160a01b039091168152602001610151565b61016d6102da366004610e74565b61053c565b61016d6102ed366004610e74565b6105b7565b6101817f000000000000000000000000000000000000000000000000000000000000000081565b61032c610327366004610efc565b6105c5565b005b61018161033c366004610f6f565b610800565b610144604051806040016040528060018152602001603160f81b81525081565b60606003805461037090610fa2565b80601f016020809104026020016040519081016040528092919081815260200182805461039c90610fa2565b80156103e95780601f106103be576101008083540402835291602001916103e9565b820191906000526020600020905b8154815290600101906020018083116103cc57829003601f168201915b5050505050905090565b60003361040181858561082b565b5060019392505050565b600033610419858285610950565b6104248585856109ca565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104665761046146610b6e565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b60003361040181858561049e8383610800565b6104a89190610ff2565b61082b565b6005546000906001600160a01b031633146104e35760405162461bcd60e51b81526004016104da9061100a565b60405180910390fd5b6104ed8383610c1a565b50600192915050565b60606004805461037090610fa2565b6005546000906001600160a01b031633146105325760405162461bcd60e51b81526004016104da9061100a565b6104ed8383610cd9565b6000338161054a8286610800565b9050838110156105aa5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104da565b610424828686840361082b565b6000336104018185856109ca565b834211156106215760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104da565b6001600160a01b038716600090815260066020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661066e8361104e565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106cc61042f565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610757573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061078d5750896001600160a01b0316816001600160a01b0316145b6107e95760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104da565b6107f48a8a8a61082b565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661088d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104da565b6001600160a01b0382166108ee5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104da565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061095c8484610800565b905060001981146109c457818110156109b75760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104da565b6109c4848484840361082b565b50505050565b6001600160a01b038316610a2e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104da565b6001600160a01b038216610a905760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104da565b6001600160a01b03831660009081526020819052604090205481811015610b085760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104da565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36109c4565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610b99610361565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c705760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104da565b8060026000828254610c829190610ff2565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038216610d395760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104da565b6001600160a01b03821660009081526020819052604090205481811015610dad5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104da565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610943565b600060208083528351808285015260005b81811015610e3057858101830151858201604001528201610e14565b81811115610e42576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114610e6f57600080fd5b919050565b60008060408385031215610e8757600080fd5b610e9083610e58565b946020939093013593505050565b600080600060608486031215610eb357600080fd5b610ebc84610e58565b9250610eca60208501610e58565b9150604084013590509250925092565b600060208284031215610eec57600080fd5b610ef582610e58565b9392505050565b600080600080600080600060e0888a031215610f1757600080fd5b610f2088610e58565b9650610f2e60208901610e58565b95506040880135945060608801359350608088013560ff81168114610f5257600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f8257600080fd5b610f8b83610e58565b9150610f9960208401610e58565b90509250929050565b600181811c90821680610fb657607f821691505b602082108103610fd657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561100557611005610fdc565b500190565b60208082526024908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e4f545f42526040820152634944474560e01b606082015260800190565b60006001820161106057611060610fdc565b506001019056fea264697066735822122070fae8b3daebe7fc894d50296739b7a26e638f37239109230c7dfd552785f2a264736f6c634300080f0033506f6c79676f6e5a6b45564d4272696467653a3a5f7665726966794c6561663aa2646970667358221220a0c682e41bbc0bcf599110077edba37d297487e713d10fc5634097fd73bd508664736f6c634300080f00338203e8808051a27a5284dcb37f4c2ded2056d80c32495322bf713143e7c73e243d3926cf016192b19c51280fb480ff91ea414aa3fac25c8b4e32f6b8e6dc6bedb7700b538a1c", - "receipt": { - "status": 1, - "gasUsed": "0x3d7463", - "logs": [] - }, - "createAddress": "0x9d98deabc42dd696deb9e40b4f1cab7ddbf55988" - }, - { - "rawTx": "0xf887028083989680949d98deabc42dd696deb9e40b4f1cab7ddbf5598880b864647c576c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ae4bb80be56b819606589de61d5ec3b522eeb03200000000000000000000000000000000000000000000000000000000000000008203e8808052465a317fd5c147ded90409a32915bbe579c557787787abbc17e67a47f773694f7fa1fd7b14ab8175e1725ec18cee985bcc262340ad5a215b097f2b3a880ee41b", - "receipt": { - "status": 1, - "gasUsed": "0x016a8f", - "logs": [ - [ - "0x9d98deabc42dd696deb9e40b4f1cab7ddbf55988", - [ - "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" - ], - "0x0000000000000000000000000000000000000000000000000000000000000001" - ] - ] - }, - "createAddress": null - } ] } \ No newline at end of file diff --git a/config/environments/public/public.node.config.toml b/config/environments/public/public.node.config.toml index 11ba656ea9..b02314d374 100644 --- a/config/environments/public/public.node.config.toml +++ b/config/environments/public/public.node.config.toml @@ -65,3 +65,6 @@ URI = "zkevm-prover:50071" Host = "0.0.0.0" Port = 9091 Enabled = false +ProfilingHost = "0.0.0.0" +ProfilingPort = 6060 +ProfilingEnabled = false diff --git a/config/network.go b/config/network.go index c9969d300e..25c72087c3 100644 --- a/config/network.go +++ b/config/network.go @@ -4,9 +4,7 @@ import ( "encoding/json" "io/ioutil" "os" - "strconv" - "github.com/0xPolygonHermez/zkevm-node/encoding" "github.com/0xPolygonHermez/zkevm-node/log" "github.com/0xPolygonHermez/zkevm-node/merkletree" "github.com/0xPolygonHermez/zkevm-node/state" @@ -23,21 +21,8 @@ type NetworkConfig struct { } type genesisFromJSON struct { - Root string `json:"root"` - Genesis []genesisAccountFromJSON `json:"genesis"` - Transactions []genesisTxsFromJSON `json:"transactions"` -} - -type genesisTxsFromJSON struct { - RawTx string `json:"rawTx"` - Receipt receiptFromJSON `json:"receipt"` - CreateAddress string `json:"createAddress"` -} - -type receiptFromJSON struct { - Status uint8 `json:"status"` - GasUsed string `json:"gasUsed"` - Logs [][]interface{} `json:"logs"` + Root string `json:"root"` + Genesis []genesisAccountFromJSON `json:"genesis"` } type genesisAccountFromJSON struct { @@ -92,26 +77,9 @@ func loadGenesisFileConfig(ctx *cli.Context) (NetworkConfig, error) { Root: common.HexToHash(cfgJSON.Root), Actions: []*state.GenesisAction{}, } - for _, tx := range cfgJSON.Transactions { - gasUsed, err := strconv.ParseUint(tx.Receipt.GasUsed, 0, encoding.BitSize64) - if err != nil { - log.Error("error decoding genesis gasUsed. Error: ", err) - return cfg, err - } - auxTx := state.GenesisTx{ - RawTx: tx.RawTx, - Receipt: state.GenesisReceipt{ - Status: tx.Receipt.Status, - GasUsed: gasUsed, - Logs: tx.Receipt.Logs, - }, - CreateAddress: common.HexToAddress(tx.CreateAddress), - } - cfg.Genesis.Transactions = append(cfg.Genesis.Transactions, auxTx) - } - const l2GlobalExitRootManagerSCName = "PolygonZkEVMGlobalExitRootL2" - const l2BridgeSCName = "PolygonZkEVMBridge" + const l2GlobalExitRootManagerSCName = "PolygonZkEVMGlobalExitRootL2 proxy" + const l2BridgeSCName = "PolygonZkEVMBridge proxy" for _, account := range cfgJSON.Genesis { if account.ContractName == l2GlobalExitRootManagerSCName { diff --git a/config/network_test.go b/config/network_test.go index 372bfede94..cc91c0d694 100644 --- a/config/network_test.go +++ b/config/network_test.go @@ -40,7 +40,7 @@ func TestLoadCustomNetworkConfig(t *testing.T) { "storage": { "0x0000000000000000000000000000000000000000000000000000000000000002": "0x9d98deabc42dd696deb9e40b4f1cab7ddbf55988" }, - "contractName": "PolygonZkEVMGlobalExitRootL2" + "contractName": "PolygonZkEVMGlobalExitRootL2 proxy" }, { "balance": "100000000000000000000000", @@ -50,7 +50,7 @@ func TestLoadCustomNetworkConfig(t *testing.T) { "storage": { "0x0000000000000000000000000000000000000000000000000000000000000000": "0xc949254d682d8c9ad5682521675b8f43b102aec4" }, - "contractName": "PolygonZkEVMBridge" + "contractName": "PolygonZkEVMBridge proxy" }, { "balance": "0", diff --git a/db/migrations/pool/0001.sql b/db/migrations/pool/0001.sql index e2cb88550a..f88321daed 100644 --- a/db/migrations/pool/0001.sql +++ b/db/migrations/pool/0001.sql @@ -4,7 +4,7 @@ DROP SCHEMA IF EXISTS pool CASCADE; -- +migrate Up CREATE SCHEMA pool; -CREATE TABLE pool.txs +CREATE TABLE pool.transaction ( hash VARCHAR PRIMARY KEY, encoded VARCHAR, @@ -26,8 +26,8 @@ CREATE TABLE pool.txs from_address varchar NOT NULL ); -CREATE INDEX idx_state_gas_price_nonce ON pool.txs (status, gas_price, nonce); -CREATE INDEX idx_failed_counter ON pool.txs (failed_counter); +CREATE INDEX idx_state_gas_price_nonce ON pool.transaction (status, gas_price, nonce); +CREATE INDEX idx_failed_counter ON pool.transaction (failed_counter); CREATE TABLE pool.gas_price ( diff --git a/db/migrations/state/0001.sql b/db/migrations/state/0001.sql index c8d0b2c89b..f09e06d343 100644 --- a/db/migrations/state/0001.sql +++ b/db/migrations/state/0001.sql @@ -12,6 +12,16 @@ CREATE TABLE state.block received_at TIMESTAMP WITH TIME ZONE NOT NULL ); +CREATE TABLE state.forced_batch +( + forced_batch_num BIGINT PRIMARY KEY, + global_exit_root VARCHAR, + timestamp TIMESTAMP WITH TIME ZONE NOT NULL, + raw_txs_data VARCHAR, + coinbase VARCHAR, + block_num BIGINT NOT NULL REFERENCES state.block (block_num) ON DELETE CASCADE +); + CREATE TABLE state.batch ( --batch abstraction: will be created through trusted state batch_num BIGINT PRIMARY KEY, @@ -21,7 +31,8 @@ CREATE TABLE state.batch acc_input_hash VARCHAR, timestamp TIMESTAMP WITH TIME ZONE, coinbase VARCHAR, - raw_txs_data BYTEA + raw_txs_data BYTEA, + forced_batch_num BIGINT REFERENCES state.forced_batch(forced_batch_num) ); CREATE TABLE state.virtual_batch @@ -38,18 +49,8 @@ CREATE TABLE state.verified_batch tx_hash VARCHAR, aggregator VARCHAR, state_root VARCHAR, - block_num BIGINT NOT NULL REFERENCES state.block (block_num) ON DELETE CASCADE -); - -CREATE TABLE state.forced_batch -( - forced_batch_num BIGINT PRIMARY KEY, - global_exit_root VARCHAR, - timestamp TIMESTAMP WITH TIME ZONE NOT NULL, - raw_txs_data VARCHAR, - coinbase VARCHAR, - batch_num BIGINT, -- It can be null if the batch state is not trusted - block_num BIGINT NOT NULL REFERENCES state.block (block_num) ON DELETE CASCADE + block_num BIGINT NOT NULL REFERENCES state.block (block_num) ON DELETE CASCADE, + is_trusted BOOLEAN DEFAULT true ); CREATE TABLE state.l2block @@ -77,6 +78,7 @@ CREATE TABLE state.exit_root ( id SERIAL PRIMARY KEY, block_num BIGINT NOT NULL REFERENCES state.block (block_num) ON DELETE CASCADE, + timestamp TIMESTAMP WITH TIME ZONE NOT NULL, mainnet_exit_root BYTEA, rollup_exit_root BYTEA, global_exit_root BYTEA @@ -121,11 +123,14 @@ CREATE TABLE state.log CREATE TABLE state.proof ( - batch_num BIGINT NOT NULL PRIMARY KEY REFERENCES state.batch (batch_num) ON DELETE CASCADE, - proof jsonb, + batch_num BIGINT NOT NULL REFERENCES state.batch (batch_num) ON DELETE CASCADE, + batch_num_final BIGINT NOT NULL REFERENCES state.batch (batch_num) ON DELETE CASCADE, + proof VARCHAR, proof_id VARCHAR, - input_prover jsonb, - prover VARCHAR + input_prover VARCHAR, + prover VARCHAR, + generating BOOLEAN DEFAULT FALSE, + PRIMARY KEY (batch_num, batch_num_final) ); CREATE TABLE IF NOT EXISTS state.sequences @@ -133,3 +138,29 @@ CREATE TABLE IF NOT EXISTS state.sequences from_batch_num BIGINT REFERENCES state.batch (batch_num) ON DELETE CASCADE, to_batch_num BIGINT REFERENCES state.batch (batch_num) ON DELETE CASCADE ); + +CREATE TABLE state.monitored_txs +( + owner VARCHAR NOT NULL, + id VARCHAR NOT NULL, + from_addr VARCHAR NOT NULL, + to_addr VARCHAR, + nonce DECIMAL(78, 0) NOT NULL, + value DECIMAL(78, 0), + data VARCHAR, + gas DECIMAL(78, 0) NOT NULL, + gas_price DECIMAL(78, 0) NOT NULL, + status VARCHAR NOT NULL, + history VARCHAR[], + block_num BIGINT, + created_at TIMESTAMP WITH TIME ZONE NOT NULL, + updated_at TIMESTAMP WITH TIME ZONE NOT NULL, + PRIMARY KEY (owner, id) +); + +CREATE TABLE state.debug +( + error_type VARCHAR, + timestamp timestamp, + payload VARCHAR +); \ No newline at end of file diff --git a/db/migrations/state/0002.sql b/db/migrations/state/0002.sql index 5065b8f964..8185b5a54b 100644 --- a/db/migrations/state/0002.sql +++ b/db/migrations/state/0002.sql @@ -1,24 +1,53 @@ -- +migrate Up -DROP TABLE state.proof; -CREATE TABLE state.proof -( - batch_num BIGINT NOT NULL REFERENCES state.batch (batch_num) ON DELETE CASCADE, - batch_num_final BIGINT NOT NULL REFERENCES state.batch (batch_num) ON DELETE CASCADE, - proof VARCHAR, - proof_id VARCHAR, - input_prover VARCHAR, - prover VARCHAR, - generating BOOLEAN DEFAULT FALSE, - PRIMARY KEY (batch_num, batch_num_final) -); +ALTER TABLE state.proof +ADD COLUMN prover_id VARCHAR; +UPDATE state.proof +SET prover_id = prover; +UPDATE state.proof +SET prover = NULL; +ALTER TABLE state.proof +ADD COLUMN created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(); +ALTER TABLE state.proof +ADD COLUMN updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(); +ALTER TABLE state.proof +ADD COLUMN generating_since TIMESTAMP WITH TIME ZONE; +UPDATE state.proof +SET generating_since = NOW() WHERE generating IS TRUE; +ALTER TABLE state.proof +DROP COLUMN IF EXISTS generating; + +CREATE INDEX IF NOT EXISTS transaction_l2_block_num_idx ON state.transaction (l2_block_num); +CREATE INDEX IF NOT EXISTS l2block_batch_num_idx ON state.l2block (batch_num); +CREATE INDEX IF NOT EXISTS l2block_received_at_idx ON state.l2block (received_at); +CREATE INDEX IF NOT EXISTS batch_timestamp_idx ON state.batch ("timestamp"); +CREATE INDEX IF NOT EXISTS log_tx_hash_idx ON state.log (tx_hash); +CREATE INDEX IF NOT EXISTS log_address_idx ON state.log (address); + +ALTER TABLE state.virtual_batch +ADD COLUMN sequencer_addr VARCHAR DEFAULT '0x0000000000000000000000000000000000000000'; -- +migrate Down -DROP TABLE state.proof; -CREATE TABLE state.proof -( - batch_num BIGINT NOT NULL PRIMARY KEY REFERENCES state.batch (batch_num) ON DELETE CASCADE, - proof jsonb, - proof_id VARCHAR, - input_prover jsonb, - prover VARCHAR -); +UPDATE state.proof +SET prover = prover_id; +ALTER TABLE state.proof +DROP COLUMN IF EXISTS prover_id; +ALTER TABLE state.proof +DROP COLUMN IF EXISTS created_at; +ALTER TABLE state.proof +DROP COLUMN IF EXISTS updated_at; +ALTER TABLE state.proof +ADD COLUMN generating BOOLEAN DEFAULT FALSE; +UPDATE state.proof +SET generating = TRUE WHERE generating_since IS NOT NULL; +ALTER TABLE state.proof +DROP COLUMN IF EXISTS generating_since; + +DROP INDEX IF EXISTS state.transaction_l2_block_num_idx; +DROP INDEX IF EXISTS state.l2block_batch_num_idx; +DROP INDEX IF EXISTS state.l2block_received_at_idx; +DROP INDEX IF EXISTS state.batch_timestamp_idx; +DROP INDEX IF EXISTS state.log_tx_hash_idx; +DROP INDEX IF EXISTS state.log_address_idx; + +ALTER TABLE state.virtual_batch +DROP COLUMN IF EXISTS sequencer_addr; diff --git a/db/migrations/state/0002_test.go b/db/migrations/state/0002_test.go index 8ab57a217a..e71a80d7b9 100644 --- a/db/migrations/state/0002_test.go +++ b/db/migrations/state/0002_test.go @@ -5,11 +5,11 @@ import ( "testing" "time" + "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/assert" ) -// This migration creates a different proof table dropping all the information. - +// this migration changes length of the token name type migrationTest0002 struct{} func (m migrationTest0002) InsertData(db *sql.DB) error { @@ -18,49 +18,109 @@ func (m migrationTest0002) InsertData(db *sql.DB) error { if _, err := db.Exec(addBlock, 1, time.Now(), "0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1"); err != nil { return err } - // Insert batch to respect the FKey - _, err := db.Exec("INSERT INTO state.batch (batch_num) VALUES (1)") - if err != nil { - return err + // Insert batches + for i := 0; i < 4; i++ { + _, err := db.Exec(`INSERT INTO state.batch (batch_num, global_exit_root, local_exit_root, state_root, acc_input_hash, timestamp, coinbase, raw_txs_data) + VALUES ($1, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', + '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', + $2, '0x2536C2745Ac4A584656A830f7bdCd329c94e8F30', $3)`, i, time.Now(), common.HexToHash("0x29e885edaf8e0000000000000000a23cf2d7d9f1")) + if err != nil { + return err + } } - // Insert old proof + // Insert proof const insertProof = `INSERT INTO state.proof ( - batch_num, proof, proof_id, input_prover, prover + batch_num, batch_num_final, proof, proof_id, input_prover, prover, generating ) VALUES ( - 1,'{}','proof_identifier','{}','prover 1' + 1, 1, '{"test": "test"}','proof_identifier','{"test": "test"}','prover 1', true );` - _, err = db.Exec(insertProof) - return err + _, err := db.Exec(insertProof) + if err != nil { + return err + } + // Insert virtual batch + const insertVirtualBatch = `INSERT INTO state.virtual_batch ( + batch_num, tx_hash, coinbase, block_num + ) VALUES ( + 1, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x514910771af9ca656af840dff83e8264ecf986ca', 1);` + _, err = db.Exec(insertVirtualBatch) + if err != nil { + return err + } + return nil } +var indexes = []string{"transaction_l2_block_num_idx", "l2block_batch_num_idx", "l2block_received_at_idx", + "batch_timestamp_idx", "log_tx_hash_idx", "log_address_idx"} + func (m migrationTest0002) RunAssertsAfterMigrationUp(t *testing.T, db *sql.DB) { + for _, idx := range indexes { + // getIndex + const getIndex = `SELECT count(*) FROM pg_indexes WHERE indexname = $1;` + row := db.QueryRow(getIndex, idx) + var result int + assert.NoError(t, row.Scan(&result)) + assert.Equal(t, 1, result) + } // Insert new proof - const insertProof = `INSERT INTO state.proof ( + const insertNewProof = `INSERT INTO state.proof ( + batch_num, batch_num_final, proof, proof_id, input_prover, prover, generating_since, prover_id, updated_at, created_at + ) VALUES ( + 2, 2, '{"test": "test"}','proof_identifier','{"test": "test"}','prover 1', $1, 'prover identifier', $1, $1 + );` + _, err := db.Exec(insertNewProof, time.Now()) + assert.NoError(t, err) + const insertOldProof = `INSERT INTO state.proof ( batch_num, batch_num_final, proof, proof_id, input_prover, prover, generating ) VALUES ( - 1, 1, '{}','proof_identifier','{}','prover 1', true + 3, 3, '{"test": "test"}','proof_identifier','{"test": "test"}','prover 1', true );` - _, err := db.Exec(insertProof) + _, err = db.Exec(insertOldProof) + assert.Error(t, err) + // Insert virtual batch + const insertVirtualBatch = `INSERT INTO state.virtual_batch ( + batch_num, tx_hash, coinbase, block_num, sequencer_addr) + VALUES (2, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x514910771af9ca656af840dff83e8264ecf986ca', 1, '0x514910771af9ca656af840dff83e8264ecf986ca');` + _, err = db.Exec(insertVirtualBatch) assert.NoError(t, err) } func (m migrationTest0002) RunAssertsAfterMigrationDown(t *testing.T, db *sql.DB) { + for _, idx := range indexes { + // getIndex + const getIndex = `SELECT count(*) FROM pg_indexes WHERE indexname = $1;` + row := db.QueryRow(getIndex, idx) + var result int + assert.NoError(t, row.Scan(&result)) + assert.Equal(t, 0, result) + } // Insert new proof const insertNewProof = `INSERT INTO state.proof ( - batch_num, batch_num_final, proof, proof_id, input_prover, prover, generating + batch_num, batch_num_final, proof, proof_id, input_prover, prover, generating_since, prover_id, updated_at, created_at ) VALUES ( - 1, 1, '{}','proof_identifier','{}','prover 1', true + 3, 3, '{"test": "test"}','proof_identifier','{"test": "test"}','prover 1', $1, 'prover identifier', $1, $1 );` - _, err := db.Exec(insertNewProof) + _, err := db.Exec(insertNewProof, time.Now()) assert.Error(t, err) - - // Insert old proof - const insertProof = `INSERT INTO state.proof ( - batch_num, proof, proof_id, input_prover, prover + const insertOldProof = `INSERT INTO state.proof ( + batch_num, batch_num_final, proof, proof_id, input_prover, prover, generating ) VALUES ( - 1,'{}','proof_identifier','{}','prover 1' + 3, 3, '{"test": "test"}','proof_identifier','{"test": "test"}','prover 1', true );` - _, err = db.Exec(insertProof) + _, err = db.Exec(insertOldProof) + assert.NoError(t, err) + // Insert virtual batch + insertVirtualBatch := `INSERT INTO state.virtual_batch ( + batch_num, tx_hash, coinbase, block_num, sequencer_addr, + ) VALUES ( + 3, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x514910771af9ca656af840dff83e8264ecf986ca', 1, '0x514910771af9ca656af840dff83e8264ecf986ca');` + _, err = db.Exec(insertVirtualBatch) + assert.Error(t, err) + // Insert virtual batch + insertVirtualBatch = `INSERT INTO state.virtual_batch ( + batch_num, tx_hash, coinbase, block_num) + VALUES (3, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x514910771af9ca656af840dff83e8264ecf986ca', 1);` + _, err = db.Exec(insertVirtualBatch) assert.NoError(t, err) } diff --git a/db/migrations/state/0003.sql b/db/migrations/state/0003.sql deleted file mode 100644 index 32950cadaf..0000000000 --- a/db/migrations/state/0003.sql +++ /dev/null @@ -1,10 +0,0 @@ --- +migrate Up -CREATE TABLE state.debug -( - error_type VARCHAR, - timestamp timestamp, - payload VARCHAR -); - --- +migrate Down -DROP TABLE state.debug; diff --git a/db/migrations/state/0003_test.go b/db/migrations/state/0003_test.go deleted file mode 100644 index f503ed8759..0000000000 --- a/db/migrations/state/0003_test.go +++ /dev/null @@ -1,33 +0,0 @@ -package migrations_test - -import ( - "database/sql" - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -// This migration adds the column `eth_tx_hash` on `batch` - -type migrationTest0003 struct{} - -func (m migrationTest0003) InsertData(db *sql.DB) error { - return nil -} - -func (m migrationTest0003) RunAssertsAfterMigrationUp(t *testing.T, db *sql.DB) { - const insertDebug = `INSERT INTO state.debug (error_type, timestamp, payload) VALUES ('error type', $1, 'payload stored')` - _, err := db.Exec(insertDebug, time.Now()) - assert.NoError(t, err) -} - -func (m migrationTest0003) RunAssertsAfterMigrationDown(t *testing.T, db *sql.DB) { - const insertDebug = `INSERT INTO state.debug (error_type, timestamp, payload) VALUES ('error type', $1, 'payload stored')` - _, err := db.Exec(insertDebug, time.Now()) - assert.Error(t, err) -} - -func TestMigration0003(t *testing.T) { - runMigrationTest(t, 3, migrationTest0003{}) -} diff --git a/db/migrations/state/0004.sql b/db/migrations/state/0004.sql deleted file mode 100644 index 507e794667..0000000000 --- a/db/migrations/state/0004.sql +++ /dev/null @@ -1,15 +0,0 @@ --- +migrate Up -ALTER TABLE state.forced_batch -DROP COLUMN IF EXISTS batch_num; - -ALTER TABLE state.batch -ADD COLUMN forced_batch_num BIGINT; -ALTER TABLE state.batch -ADD FOREIGN KEY (forced_batch_num) REFERENCES state.forced_batch(forced_batch_num); - --- +migrate Down -ALTER TABLE state.batch -DROP COLUMN IF EXISTS forced_batch_num; - -ALTER TABLE state.forced_batch -ADD COLUMN batch_num BIGINT; diff --git a/db/migrations/state/0004_test.go b/db/migrations/state/0004_test.go deleted file mode 100644 index 88a7d5f2d1..0000000000 --- a/db/migrations/state/0004_test.go +++ /dev/null @@ -1,71 +0,0 @@ -package migrations_test - -import ( - "database/sql" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/assert" -) - -// This migration creates the fiat table - -type migrationTest0004 struct{} - -func (m migrationTest0004) InsertData(db *sql.DB) error { - // Insert block to respect the FKey - const addBlock = "INSERT INTO state.block (block_num, received_at, block_hash) VALUES ($1, $2, $3)" - if _, err := db.Exec(addBlock, 1, time.Now(), "0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1"); err != nil { - return err - } - const addForcedBatch = "INSERT INTO state.forced_batch (forced_batch_num, global_exit_root, raw_txs_data, coinbase, timestamp, block_num, batch_num) VALUES ($1, $2, $3, $4, $5, $6, $7)" - if _, err := db.Exec(addForcedBatch, 1, "0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1", "", "0x2536C2745Ac4A584656A830f7bdCd329c94e8F30", time.Now(), 1, 1); err != nil { - return err - } - // Insert batch - _, err := db.Exec(`INSERT INTO state.batch (batch_num, global_exit_root, local_exit_root, state_root, acc_input_hash, timestamp, coinbase, raw_txs_data) - VALUES (1, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', - '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', - $1, '0x2536C2745Ac4A584656A830f7bdCd329c94e8F30', $2)`, time.Now(), common.HexToHash("0x29e885edaf8e0000000000000000a23cf2d7d9f1")) - if err != nil { - return err - } - return nil -} - -func (m migrationTest0004) RunAssertsAfterMigrationUp(t *testing.T, db *sql.DB) { - // Insert batch - _, err := db.Exec(`INSERT INTO state.batch (batch_num, global_exit_root, local_exit_root, state_root, acc_input_hash, timestamp, coinbase, raw_txs_data, forced_batch_num) - VALUES (2, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', - '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', - $1, '0x2536C2745Ac4A584656A830f7bdCd329c94e8F30', $2, 1)`, time.Now(), common.HexToHash("0x29e885edaf8e0000000000000000a23cf2d7d9f1")) - assert.NoError(t, err) - addForcedBatch := "INSERT INTO state.forced_batch (forced_batch_num, global_exit_root, raw_txs_data, coinbase, timestamp, block_num, batch_num) VALUES ($1, $2, $3, $4, $5, $6, $7)" - _, err = db.Exec(addForcedBatch, 1, "0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1", "", "0x2536C2745Ac4A584656A830f7bdCd329c94e8F30", time.Now(), 1, 2) - assert.Error(t, err) - addForcedBatch = "INSERT INTO state.forced_batch (forced_batch_num, global_exit_root, raw_txs_data, coinbase, timestamp, block_num) VALUES ($1, $2, $3, $4, $5, $6)" - _, err = db.Exec(addForcedBatch, 2, "0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1", "", "0x2536C2745Ac4A584656A830f7bdCd329c94e8F30", time.Now(), 1) - assert.NoError(t, err) -} - -func (m migrationTest0004) RunAssertsAfterMigrationDown(t *testing.T, db *sql.DB) { - const addForcedBatch = "INSERT INTO state.forced_batch (forced_batch_num, global_exit_root, raw_txs_data, coinbase, timestamp, block_num, batch_num) VALUES ($1, $2, $3, $4, $5, $6, $7)" - _, err := db.Exec(addForcedBatch, 3, "0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1", "", "0x2536C2745Ac4A584656A830f7bdCd329c94e8F30", time.Now(), 1, 1) - assert.NoError(t, err) - // Insert batch - _, err = db.Exec(`INSERT INTO state.batch (batch_num, global_exit_root, local_exit_root, state_root, acc_input_hash, timestamp, coinbase, raw_txs_data, forced_batch_num) - VALUES (3, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', - '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', - $1, '0x2536C2745Ac4A584656A830f7bdCd329c94e8F30', $2, 1)`, time.Now(), common.HexToHash("0x29e885edaf8e0000000000000000a23cf2d7d9f1")) - assert.Error(t, err) - _, err = db.Exec(`INSERT INTO state.batch (batch_num, global_exit_root, local_exit_root, state_root, acc_input_hash, timestamp, coinbase, raw_txs_data) - VALUES (3, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', - '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', - $1, '0x2536C2745Ac4A584656A830f7bdCd329c94e8F30', $2)`, time.Now(), common.HexToHash("0x29e885edaf8e0000000000000000a23cf2d7d9f1")) - assert.NoError(t, err) -} - -func TestMigration0004(t *testing.T) { - runMigrationTest(t, 4, migrationTest0004{}) -} diff --git a/db/migrations/state/0005.sql b/db/migrations/state/0005.sql deleted file mode 100644 index c63867455b..0000000000 --- a/db/migrations/state/0005.sql +++ /dev/null @@ -1,28 +0,0 @@ --- +migrate Down -DROP TABLE IF EXISTS state.monitored_txs; - -ALTER TABLE state.verified_batch -DROP COLUMN IF EXISTS is_trusted; - --- +migrate Up -CREATE TABLE state.monitored_txs -( - owner VARCHAR NOT NULL, - id VARCHAR NOT NULL, - from_addr VARCHAR NOT NULL, - to_addr VARCHAR, - nonce DECIMAL(78, 0) NOT NULL, - value DECIMAL(78, 0), - data VARCHAR, - gas DECIMAL(78, 0) NOT NULL, - gas_price DECIMAL(78, 0) NOT NULL, - status VARCHAR NOT NULL, - history VARCHAR[], - block_num BIGINT, - created_at TIMESTAMP WITH TIME ZONE NOT NULL, - updated_at TIMESTAMP WITH TIME ZONE NOT NULL, - PRIMARY KEY (owner, id) -); - -ALTER TABLE state.verified_batch -ADD COLUMN is_trusted BOOLEAN DEFAULT true; diff --git a/db/migrations/state/0005_test.go b/db/migrations/state/0005_test.go deleted file mode 100644 index 9a8e5c4565..0000000000 --- a/db/migrations/state/0005_test.go +++ /dev/null @@ -1,125 +0,0 @@ -package migrations_test - -import ( - "database/sql" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/assert" -) - -// this migration changes length of the token name -type migrationTest0005 struct{} - -func (m migrationTest0005) InsertData(db *sql.DB) error { - // Insert block to respect the FKey - const addBlock = "INSERT INTO state.block (block_num, received_at, block_hash) VALUES ($1, $2, $3)" - if _, err := db.Exec(addBlock, 1, time.Now(), "0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1"); err != nil { - return err - } - // Insert batch - _, err := db.Exec(`INSERT INTO state.batch (batch_num, global_exit_root, local_exit_root, state_root, acc_input_hash, timestamp, coinbase, raw_txs_data) - VALUES (1, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', - '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', - $1, '0x2536C2745Ac4A584656A830f7bdCd329c94e8F30', $2)`, time.Now(), common.HexToHash("0x29e885edaf8e0000000000000000a23cf2d7d9f1")) - if err != nil { - return err - } - // Insert virtual batch - const insertVirtualBatch = `INSERT INTO state.virtual_batch ( - batch_num, tx_hash, coinbase, block_num - ) VALUES ( - 1, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x514910771af9ca656af840dff83e8264ecf986ca', 1);` - _, err = db.Exec(insertVirtualBatch) - if err != nil { - return err - } - // Insert verified batch - const insertVerifiedBatch = `INSERT INTO state.verified_batch ( - batch_num, tx_hash, aggregator, state_root, block_num - ) VALUES ( - 1, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x514910771af9ca656af840dff83e8264ecf986ca', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', 1 - );` - _, err = db.Exec(insertVerifiedBatch) - return err -} - -func (m migrationTest0005) RunAssertsAfterMigrationUp(t *testing.T, db *sql.DB) { - // Insert batch - _, err := db.Exec(`INSERT INTO state.batch (batch_num, global_exit_root, local_exit_root, state_root, acc_input_hash, timestamp, coinbase, raw_txs_data) - VALUES (2, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', - '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', - $1, '0x2536C2745Ac4A584656A830f7bdCd329c94e8F30', $2)`, time.Now(), common.HexToHash("0x29e885edaf8e0000000000000000a23cf2d7d9f1")) - assert.NoError(t, err) - // Insert virtual batch - const insertVirtualBatch = `INSERT INTO state.virtual_batch ( - batch_num, tx_hash, coinbase, block_num - ) VALUES ( - 2, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x514910771af9ca656af840dff83e8264ecf986ca', 1);` - _, err = db.Exec(insertVirtualBatch) - assert.NoError(t, err) - - // Insert verified batch - const insertVerifiedBatch = `INSERT INTO state.verified_batch ( - batch_num, tx_hash, aggregator, state_root, block_num, is_trusted - ) VALUES ( - 2, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x514910771af9ca656af840dff83e8264ecf986ca', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', 1, true - );` - _, err = db.Exec(insertVerifiedBatch) - assert.NoError(t, err) - - // Insert monitored_txs - const insertMonitoredTxs = `INSERT INTO state.monitored_txs ( - owner, id, from_addr, to_addr, nonce, value, data, gas, gas_price, status, block_num, created_at, updated_at - ) VALUES ( - '0x514910771af9ca656af840dff83e8264ecf986ca', '1', '0x514910771af9ca656af840dff83e8264ecf986ca', '0x514910771af9ca656af840dff83e8264ecf986ca', 1, 0, '0x', 100, 12, 'created', 1, $1, $2 - );` - _, err = db.Exec(insertMonitoredTxs, time.Now(), time.Now()) - assert.NoError(t, err) -} - -func (m migrationTest0005) RunAssertsAfterMigrationDown(t *testing.T, db *sql.DB) { - // Insert batch - _, err := db.Exec(`INSERT INTO state.batch (batch_num, global_exit_root, local_exit_root, state_root, acc_input_hash, timestamp, coinbase, raw_txs_data) - VALUES (3, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', - '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', - $1, '0x2536C2745Ac4A584656A830f7bdCd329c94e8F30', $2)`, time.Now(), common.HexToHash("0x29e885edaf8e0000000000000000a23cf2d7d9f1")) - assert.NoError(t, err) - // Insert virtual batch - const insertVirtualBatch = `INSERT INTO state.virtual_batch ( - batch_num, tx_hash, coinbase, block_num - ) VALUES ( - 3, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x514910771af9ca656af840dff83e8264ecf986ca', 1);` - _, err = db.Exec(insertVirtualBatch) - assert.NoError(t, err) - - // Insert verified batch - insertVerifiedBatch := `INSERT INTO state.verified_batch ( - batch_num, tx_hash, aggregator, state_root, block_num, is_trusted - ) VALUES ( - 3, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x514910771af9ca656af840dff83e8264ecf986ca', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', 1, true - );` - _, err = db.Exec(insertVerifiedBatch) - assert.Error(t, err) - insertVerifiedBatch = `INSERT INTO state.verified_batch ( - batch_num, tx_hash, aggregator, state_root, block_num - ) VALUES ( - 3, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x514910771af9ca656af840dff83e8264ecf986ca', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', 1 - );` - _, err = db.Exec(insertVerifiedBatch) - assert.NoError(t, err) - - // Insert monitored_txs - const insertMonitoredTxs = `INSERT INTO state.monitored_txs ( - owner, id, from_addr, to_addr, nonce, value, data, gas, gas_price, status, block_num, created_at, updated_at - ) VALUES ( - '0x514910771af9ca656af840dff83e8264ecf986ca', '1', '0x514910771af9ca656af840dff83e8264ecf986ca', '0x514910771af9ca656af840dff83e8264ecf986ca', 1, 0, '0x', 100, 12, 'created', 1, $1, $2 - );` - _, err = db.Exec(insertMonitoredTxs, time.Now(), time.Now()) - assert.Error(t, err) -} - -func TestMigration0005(t *testing.T) { - runMigrationTest(t, 5, migrationTest0005{}) -} diff --git a/db/migrations/state/0006.sql b/db/migrations/state/0006.sql deleted file mode 100644 index 99d898af10..0000000000 --- a/db/migrations/state/0006.sql +++ /dev/null @@ -1,47 +0,0 @@ --- +migrate Up -ALTER TABLE state.proof -ADD COLUMN prover_id VARCHAR; -UPDATE state.proof -SET prover_id = prover; -UPDATE state.proof -SET prover = NULL; -ALTER TABLE state.proof -ADD COLUMN created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(); -ALTER TABLE state.proof -ADD COLUMN updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(); -ALTER TABLE state.proof -ADD COLUMN generating_since TIMESTAMP WITH TIME ZONE; -UPDATE state.proof -SET generating_since = NOW() WHERE generating IS TRUE; -ALTER TABLE state.proof -DROP COLUMN IF EXISTS generating; - -CREATE INDEX IF NOT EXISTS transaction_l2_block_num_idx ON state.transaction (l2_block_num); -CREATE INDEX IF NOT EXISTS l2block_batch_num_idx ON state.l2block (batch_num); -CREATE INDEX IF NOT EXISTS l2block_received_at_idx ON state.l2block (received_at); -CREATE INDEX IF NOT EXISTS batch_timestamp_idx ON state.batch ("timestamp"); -CREATE INDEX IF NOT EXISTS log_tx_hash_idx ON state.log (tx_hash); -CREATE INDEX IF NOT EXISTS log_address_idx ON state.log (address); - --- +migrate Down -UPDATE state.proof -SET prover = prover_id; -ALTER TABLE state.proof -DROP COLUMN IF EXISTS prover_id; -ALTER TABLE state.proof -DROP COLUMN IF EXISTS created_at; -ALTER TABLE state.proof -DROP COLUMN IF EXISTS updated_at; -ALTER TABLE state.proof -ADD COLUMN generating BOOLEAN DEFAULT FALSE; -UPDATE state.proof -SET generating = TRUE WHERE generating_since IS NOT NULL; -ALTER TABLE state.proof -DROP COLUMN IF EXISTS generating_since; - -DROP INDEX IF EXISTS state.transaction_l2_block_num_idx; -DROP INDEX IF EXISTS state.l2block_batch_num_idx; -DROP INDEX IF EXISTS state.l2block_received_at_idx; -DROP INDEX IF EXISTS state.batch_timestamp_idx; -DROP INDEX IF EXISTS state.log_tx_hash_idx; -DROP INDEX IF EXISTS state.log_address_idx; diff --git a/db/migrations/state/0006_test.go b/db/migrations/state/0006_test.go deleted file mode 100644 index bd623f0477..0000000000 --- a/db/migrations/state/0006_test.go +++ /dev/null @@ -1,101 +0,0 @@ -package migrations_test - -import ( - "database/sql" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/assert" -) - -// this migration changes length of the token name -type migrationTest0006 struct{} - -func (m migrationTest0006) InsertData(db *sql.DB) error { - // Insert block to respect the FKey - const addBlock = "INSERT INTO state.block (block_num, received_at, block_hash) VALUES ($1, $2, $3)" - if _, err := db.Exec(addBlock, 1, time.Now(), "0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1"); err != nil { - return err - } - // Insert batches - for i := 0; i < 4; i++ { - _, err := db.Exec(`INSERT INTO state.batch (batch_num, global_exit_root, local_exit_root, state_root, acc_input_hash, timestamp, coinbase, raw_txs_data) - VALUES ($1, '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', - '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', '0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1', - $2, '0x2536C2745Ac4A584656A830f7bdCd329c94e8F30', $3)`, i, time.Now(), common.HexToHash("0x29e885edaf8e0000000000000000a23cf2d7d9f1")) - if err != nil { - return err - } - } - // Insert proof - const insertProof = `INSERT INTO state.proof ( - batch_num, batch_num_final, proof, proof_id, input_prover, prover, generating - ) VALUES ( - 1, 1, '{"test": "test"}','proof_identifier','{"test": "test"}','prover 1', true - );` - _, err := db.Exec(insertProof) - if err != nil { - return err - } - return nil -} - -var indexes = []string{"transaction_l2_block_num_idx", "l2block_batch_num_idx", "l2block_received_at_idx", - "batch_timestamp_idx", "log_tx_hash_idx", "log_address_idx"} - -func (m migrationTest0006) RunAssertsAfterMigrationUp(t *testing.T, db *sql.DB) { - for _, idx := range indexes { - // getIndex - const getIndex = `SELECT count(*) FROM pg_indexes WHERE indexname = $1;` - row := db.QueryRow(getIndex, idx) - var result int - assert.NoError(t, row.Scan(&result)) - assert.Equal(t, 1, result) - } - // Insert new proof - const insertNewProof = `INSERT INTO state.proof ( - batch_num, batch_num_final, proof, proof_id, input_prover, prover, generating_since, prover_id, updated_at, created_at - ) VALUES ( - 2, 2, '{"test": "test"}','proof_identifier','{"test": "test"}','prover 1', $1, 'prover identifier', $1, $1 - );` - _, err := db.Exec(insertNewProof, time.Now()) - assert.NoError(t, err) - const insertOldProof = `INSERT INTO state.proof ( - batch_num, batch_num_final, proof, proof_id, input_prover, prover, generating - ) VALUES ( - 3, 3, '{"test": "test"}','proof_identifier','{"test": "test"}','prover 1', true - );` - _, err = db.Exec(insertOldProof) - assert.Error(t, err) -} - -func (m migrationTest0006) RunAssertsAfterMigrationDown(t *testing.T, db *sql.DB) { - for _, idx := range indexes { - // getIndex - const getIndex = `SELECT count(*) FROM pg_indexes WHERE indexname = $1;` - row := db.QueryRow(getIndex, idx) - var result int - assert.NoError(t, row.Scan(&result)) - assert.Equal(t, 0, result) - } - // Insert new proof - const insertNewProof = `INSERT INTO state.proof ( - batch_num, batch_num_final, proof, proof_id, input_prover, prover, generating_since, prover_id, updated_at, created_at - ) VALUES ( - 3, 3, '{"test": "test"}','proof_identifier','{"test": "test"}','prover 1', $1, 'prover identifier', $1, $1 - );` - _, err := db.Exec(insertNewProof, time.Now()) - assert.Error(t, err) - const insertOldProof = `INSERT INTO state.proof ( - batch_num, batch_num_final, proof, proof_id, input_prover, prover, generating - ) VALUES ( - 3, 3, '{"test": "test"}','proof_identifier','{"test": "test"}','prover 1', true - );` - _, err = db.Exec(insertOldProof) - assert.NoError(t, err) -} - -func TestMigration0006(t *testing.T) { - runMigrationTest(t, 6, migrationTest0006{}) -} diff --git a/docker-compose.yml b/docker-compose.yml index 8bc89d6b9d..00576e149a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -92,7 +92,7 @@ services: zkevm-prover: container_name: zkevm-prover - image: hermeznetwork/zkevm-prover:e7ac5c4 + image: hermeznetwork/zkevm-prover:88f3835 ports: - 50061:50061 # MT - 50071:50071 # Executor diff --git a/docs/running_local.md b/docs/running_local.md index a329c6f98e..576ee46506 100644 --- a/docs/running_local.md +++ b/docs/running_local.md @@ -191,7 +191,7 @@ To configure your Metamask to use your local environment, follow these steps: | Address | Description | |---|---| -| 0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9 | Proof of Efficiency | +| 0xa513E6E4b8f2a923D98304ec87F64353C4D5C853 | Proof of Efficiency | | 0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9 | Bridge | | 0x5FbDB2315678afecb367f032d93F642f64180aa3 | Matic token | | 0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0 | GlobalExitRootManager | diff --git a/etherman/etherman.go b/etherman/etherman.go index 33bf6aa1da..808498dfb9 100644 --- a/etherman/etherman.go +++ b/etherman/etherman.go @@ -34,20 +34,21 @@ import ( ) var ( - updateGlobalExitRootSignatureHash = crypto.Keccak256Hash([]byte("UpdateGlobalExitRoot(bytes32,bytes32)")) - forcedBatchSignatureHash = crypto.Keccak256Hash([]byte("ForceBatch(uint64,bytes32,address,bytes)")) - sequencedBatchesEventSignatureHash = crypto.Keccak256Hash([]byte("SequenceBatches(uint64)")) - forceSequencedBatchesSignatureHash = crypto.Keccak256Hash([]byte("SequenceForceBatches(uint64)")) - verifyBatchesSignatureHash = crypto.Keccak256Hash([]byte("VerifyBatches(uint64,bytes32,address)")) - trustedVerifyBatchesSignatureHash = crypto.Keccak256Hash([]byte("TrustedVerifyBatches(uint64,bytes32,address)")) - setTrustedSequencerURLSignatureHash = crypto.Keccak256Hash([]byte("SetTrustedSequencerURL(string)")) - setForceBatchAllowedSignatureHash = crypto.Keccak256Hash([]byte("SetForceBatchAllowed(bool)")) - setTrustedSequencerSignatureHash = crypto.Keccak256Hash([]byte("SetTrustedSequencer(address)")) - transferOwnershipSignatureHash = crypto.Keccak256Hash([]byte("OwnershipTransferred(address,address)")) - setSecurityCouncilSignatureHash = crypto.Keccak256Hash([]byte("SetSecurityCouncil(address)")) - proofDifferentStateSignatureHash = crypto.Keccak256Hash([]byte("ProofDifferentState(bytes32,bytes32)")) - emergencyStateActivatedSignatureHash = crypto.Keccak256Hash([]byte("EmergencyStateActivated()")) - emergencyStateDeactivatedSignatureHash = crypto.Keccak256Hash([]byte("EmergencyStateDeactivated()")) + updateGlobalExitRootSignatureHash = crypto.Keccak256Hash([]byte("UpdateGlobalExitRoot(bytes32,bytes32)")) + forcedBatchSignatureHash = crypto.Keccak256Hash([]byte("ForceBatch(uint64,bytes32,address,bytes)")) + sequencedBatchesEventSignatureHash = crypto.Keccak256Hash([]byte("SequenceBatches(uint64)")) + forceSequencedBatchesSignatureHash = crypto.Keccak256Hash([]byte("SequenceForceBatches(uint64)")) + verifyBatchesSignatureHash = crypto.Keccak256Hash([]byte("VerifyBatches(uint64,bytes32,address)")) + verifyBatchesTrustedAggregatorSignatureHash = crypto.Keccak256Hash([]byte("VerifyBatchesTrustedAggregator(uint64,bytes32,address)")) + setTrustedSequencerURLSignatureHash = crypto.Keccak256Hash([]byte("SetTrustedSequencerURL(string)")) + setForceBatchAllowedSignatureHash = crypto.Keccak256Hash([]byte("SetForceBatchAllowed(bool)")) + setTrustedSequencerSignatureHash = crypto.Keccak256Hash([]byte("SetTrustedSequencer(address)")) + transferOwnershipSignatureHash = crypto.Keccak256Hash([]byte("OwnershipTransferred(address,address)")) + setSecurityCouncilSignatureHash = crypto.Keccak256Hash([]byte("SetSecurityCouncil(address)")) + proofDifferentStateSignatureHash = crypto.Keccak256Hash([]byte("ProofDifferentState(bytes32,bytes32)")) + emergencyStateActivatedSignatureHash = crypto.Keccak256Hash([]byte("EmergencyStateActivated()")) + emergencyStateDeactivatedSignatureHash = crypto.Keccak256Hash([]byte("EmergencyStateDeactivated()")) + updateZkEVMVersionSignatureHash = crypto.Keccak256Hash([]byte("UpdateZkEVMVersion(uint64,uint64,string)")) // Proxy events initializedSignatureHash = crypto.Keccak256Hash([]byte("Initialized(uint8)")) @@ -68,7 +69,7 @@ var ( func SequencedBatchesSigHash() common.Hash { return sequencedBatchesEventSignatureHash } // TrustedVerifyBatchesSigHash returns the hash for the `TrustedVerifyBatches` event. -func TrustedVerifyBatchesSigHash() common.Hash { return trustedVerifyBatchesSignatureHash } +func TrustedVerifyBatchesSigHash() common.Hash { return verifyBatchesTrustedAggregatorSignatureHash } // EventOrder is the the type used to identify the events order type EventOrder string @@ -197,6 +198,47 @@ func (etherMan *Client) VerifyGenBlockNumber(ctx context.Context, genBlockNumber return true, nil } +// GetForks returns fork information +func (etherMan *Client) GetForks(ctx context.Context) ([]state.ForkIDInterval, error) { + // Filter query + query := ethereum.FilterQuery{ + FromBlock: new(big.Int).SetUint64(1), + Addresses: etherMan.SCAddresses, + Topics: [][]common.Hash{{updateZkEVMVersionSignatureHash}}, + } + logs, err := etherMan.EthClient.FilterLogs(ctx, query) + if err != nil { + return []state.ForkIDInterval{}, err + } + var forks []state.ForkIDInterval + for i, l := range logs { + zkevmVersion, err := etherMan.PoE.ParseUpdateZkEVMVersion(l) + if err != nil { + return []state.ForkIDInterval{}, err + } + var fork state.ForkIDInterval + if i == 0 { + fork = state.ForkIDInterval{ + FromBatchNumber: zkevmVersion.NumBatch, + ToBatchNumber: math.MaxUint64, + ForkId: zkevmVersion.ForkID, + Version: zkevmVersion.Version, + } + } else { + forks[len(forks)-1].ToBatchNumber = zkevmVersion.NumBatch - 1 + fork = state.ForkIDInterval{ + FromBatchNumber: zkevmVersion.NumBatch, + ToBatchNumber: math.MaxUint64, + ForkId: zkevmVersion.ForkID, + Version: zkevmVersion.Version, + } + } + forks = append(forks, fork) + } + log.Debugf("Forks decoded: %+v", forks) + return forks, nil +} + // GetRollupInfoByBlockRange function retrieves the Rollup information that are included in all this ethereum blocks // from block x to block y. func (etherMan *Client) GetRollupInfoByBlockRange(ctx context.Context, fromBlock uint64, toBlock *uint64) ([]Block, map[common.Hash][]Order, error) { @@ -246,8 +288,8 @@ func (etherMan *Client) processEvent(ctx context.Context, vLog types.Log, blocks return etherMan.updateGlobalExitRootEvent(ctx, vLog, blocks, blocksOrder) case forcedBatchSignatureHash: return etherMan.forcedBatchEvent(ctx, vLog, blocks, blocksOrder) - case trustedVerifyBatchesSignatureHash: - return etherMan.trustedVerifyBatchesEvent(ctx, vLog, blocks, blocksOrder) + case verifyBatchesTrustedAggregatorSignatureHash: + return etherMan.verifyBatchesTrustedAggregatorEvent(ctx, vLog, blocks, blocksOrder) case verifyBatchesSignatureHash: log.Warn("VerifyBatches event not implemented yet") return nil @@ -289,6 +331,9 @@ func (etherMan *Client) processEvent(ctx context.Context, vLog types.Log, blocks case emergencyStateDeactivatedSignatureHash: log.Debug("EmergencyStateDeactivated event detected") return nil + case updateZkEVMVersionSignatureHash: + log.Debug("UpdateZkEVMVersion event detected") + return nil } log.Warn("Event not registered: ", vLog) return nil @@ -394,7 +439,7 @@ func (etherMan *Client) sequenceBatches(opts bind.TransactOpts, sequences []ethm batches = append(batches, batch) } - tx, err := etherMan.PoE.SequenceBatches(&opts, batches) + tx, err := etherMan.PoE.SequenceBatches(&opts, batches, opts.From) if err != nil { if parsedErr, ok := tryParseError(err); ok { err = parsedErr @@ -437,7 +482,7 @@ func (etherMan *Client) BuildTrustedVerifyBatchesTxData(lastVerifiedBatch, newVe const pendStateNum = 0 // TODO hardcoded for now until we implement the pending state feature - tx, err := etherMan.PoE.TrustedVerifyBatches( + tx, err := etherMan.PoE.VerifyBatchesTrustedAggregator( &opts, pendStateNum, lastVerifiedBatch, @@ -617,15 +662,16 @@ func decodeSequences(txData []byte, lastBatchNumber uint64, sequencer common.Add if err != nil { return nil, err } - + coinbase := (data[1]).(common.Address) sequencedBatches := make([]SequencedBatch, len(sequences)) for i, seq := range sequences { bn := lastBatchNumber - uint64(len(sequences)-(i+1)) sequencedBatches[i] = SequencedBatch{ BatchNumber: bn, - Coinbase: sequencer, + SequencerAddr: sequencer, TxHash: txHash, Nonce: nonce, + Coinbase: coinbase, PolygonZkEVMBatchData: seq, } } @@ -633,9 +679,9 @@ func decodeSequences(txData []byte, lastBatchNumber uint64, sequencer common.Add return sequencedBatches, nil } -func (etherMan *Client) trustedVerifyBatchesEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error { +func (etherMan *Client) verifyBatchesTrustedAggregatorEvent(ctx context.Context, vLog types.Log, blocks *[]Block, blocksOrder *map[common.Hash][]Order) error { log.Debug("TrustedVerifyBatches event detected") - vb, err := etherMan.PoE.ParseTrustedVerifyBatches(vLog) + vb, err := etherMan.PoE.ParseVerifyBatchesTrustedAggregator(vLog) if err != nil { return err } diff --git a/etherman/etherman_test.go b/etherman/etherman_test.go index 56fefea596..d41d6e9fa3 100644 --- a/etherman/etherman_test.go +++ b/etherman/etherman_test.go @@ -4,6 +4,7 @@ import ( "context" "encoding/hex" "fmt" + "math" "math/big" "testing" "time" @@ -163,7 +164,7 @@ func TestSequencedBatchesEvent(t *testing.T) { MinForcedTimestamp: 0, Transactions: common.Hex2Bytes(rawTxs), }) - _, err = etherman.PoE.SequenceBatches(auth, sequences) + _, err = etherman.PoE.SequenceBatches(auth, sequences, auth.From) require.NoError(t, err) // Mine the tx in a block @@ -180,6 +181,8 @@ func TestSequencedBatchesEvent(t *testing.T) { assert.Equal(t, common.Hex2Bytes(rawTxs), blocks[2].SequencedBatches[0][1].Transactions) assert.Equal(t, currentBlock.Time(), blocks[2].SequencedBatches[0][0].Timestamp) assert.Equal(t, ger, blocks[2].SequencedBatches[0][0].GlobalExitRoot) + assert.Equal(t, auth.From, blocks[2].SequencedBatches[0][0].Coinbase) + assert.Equal(t, auth.From, blocks[2].SequencedBatches[0][0].SequencerAddr) assert.Equal(t, currentBlock.Time(), blocks[2].SequencedBatches[0][0].MinForcedTimestamp) assert.Equal(t, 0, order[blocks[2].BlockHash][0].Pos) } @@ -201,7 +204,7 @@ func TestVerifyBatchEvent(t *testing.T) { MinForcedTimestamp: 0, Transactions: common.Hex2Bytes(rawTxs), } - _, err = etherman.PoE.SequenceBatches(auth, []polygonzkevm.PolygonZkEVMBatchData{tx}) + _, err = etherman.PoE.SequenceBatches(auth, []polygonzkevm.PolygonZkEVMBatchData{tx}, auth.From) require.NoError(t, err) // Mine the tx in a block @@ -212,7 +215,7 @@ func TestVerifyBatchEvent(t *testing.T) { proofC = [2]*big.Int{big.NewInt(1), big.NewInt(1)} proofB = [2][2]*big.Int{proofC, proofC} ) - _, err = etherman.PoE.TrustedVerifyBatches(auth, uint64(0), uint64(0), uint64(1), [32]byte{}, [32]byte{}, proofA, proofB, proofC) + _, err = etherman.PoE.VerifyBatchesTrustedAggregator(auth, uint64(0), uint64(0), uint64(1), [32]byte{}, [32]byte{}, proofA, proofB, proofC) require.NoError(t, err) // Mine the tx in a block @@ -329,6 +332,8 @@ func TestSendSequences(t *testing.T) { assert.Equal(t, 1, len(blocks[1].SequencedBatches)) assert.Equal(t, currentBlock.Time()-1, blocks[1].SequencedBatches[0][0].Timestamp) assert.Equal(t, ger, blocks[1].SequencedBatches[0][0].GlobalExitRoot) + assert.Equal(t, auth.From, blocks[1].SequencedBatches[0][0].Coinbase) + assert.Equal(t, auth.From, blocks[1].SequencedBatches[0][0].SequencerAddr) assert.Equal(t, uint64(0), blocks[1].SequencedBatches[0][0].MinForcedTimestamp) assert.Equal(t, 0, order[blocks[1].BlockHash][0].Pos) } @@ -384,3 +389,16 @@ func TestErrorEtherScanPrice(t *testing.T) { gp := etherman.GetL1GasPrice(ctx) assert.Equal(t, big.NewInt(765625002), gp) } + +func TestGetForks(t *testing.T) { + // Set up testing environment + etherman, _, _, _, _ := newTestingEnv() + ctx := context.Background() + forks, err := etherman.GetForks(ctx) + require.NoError(t, err) + assert.Equal(t, 1, len(forks)) + assert.Equal(t, uint64(1), forks[0].ForkId) + assert.Equal(t, uint64(0), forks[0].FromBatchNumber) + assert.Equal(t, uint64(math.MaxUint64), forks[0].ToBatchNumber) + assert.Equal(t, "v1", forks[0].Version) +} diff --git a/etherman/simulated.go b/etherman/simulated.go index 3381a28ecc..b566e8ecde 100644 --- a/etherman/simulated.go +++ b/etherman/simulated.go @@ -50,16 +50,12 @@ func NewSimulatedEtherman(cfg Config, auth *bind.TransactOpts) (etherman *Client if err != nil { return nil, nil, common.Address{}, nil, err } - const posBridge = 2 + const posBridge = 1 calculatedBridgeAddr := crypto.CreateAddress(auth.From, nonce+posBridge) - const posPoE = 3 + const posPoE = 2 calculatedPoEAddr := crypto.CreateAddress(auth.From, nonce+posPoE) genesis := common.HexToHash("0xfd3434cd8f67e59d73488a2b8da242dd1f02849ea5dd99f0ca22c836c3d5b4a9") // Random value. Needs to be different to 0x0 - exitManagerAddr, _, globalExitRoot, err := polygonzkevmglobalexitroot.DeployPolygonzkevmglobalexitroot(auth, client) - if err != nil { - return nil, nil, common.Address{}, nil, err - } - _, err = globalExitRoot.Initialize(auth, calculatedPoEAddr, calculatedBridgeAddr) + exitManagerAddr, _, globalExitRoot, err := polygonzkevmglobalexitroot.DeployPolygonzkevmglobalexitroot(auth, client, calculatedPoEAddr, calculatedBridgeAddr) if err != nil { return nil, nil, common.Address{}, nil, err } @@ -67,7 +63,7 @@ func NewSimulatedEtherman(cfg Config, auth *bind.TransactOpts) (etherman *Client if err != nil { return nil, nil, common.Address{}, nil, err } - poeAddr, _, poe, err := polygonzkevm.DeployPolygonzkevm(auth, client) + poeAddr, _, poe, err := polygonzkevm.DeployPolygonzkevm(auth, client, exitManagerAddr, maticAddr, rollupVerifierAddr, bridgeAddr, 1000, 1) //nolint if err != nil { return nil, nil, common.Address{}, nil, err } @@ -78,14 +74,12 @@ func NewSimulatedEtherman(cfg Config, auth *bind.TransactOpts) (etherman *Client poeParams := polygonzkevm.PolygonZkEVMInitializePackedParameters{ Admin: auth.From, - ChainID: 1000, //nolint:gomnd TrustedSequencer: auth.From, PendingStateTimeout: 10000, //nolint:gomnd - ForceBatchAllowed: true, TrustedAggregator: auth.From, TrustedAggregatorTimeout: 10000, //nolint:gomnd } - _, err = poe.Initialize(auth, exitManagerAddr, maticAddr, rollupVerifierAddr, bridgeAddr, poeParams, genesis, "http://localhost", "L2") //nolint:gomnd + _, err = poe.Initialize(auth, poeParams, genesis, "http://localhost", "L2", "v1") //nolint:gomnd if err != nil { return nil, nil, common.Address{}, nil, err } diff --git a/etherman/smartcontracts/abi/polygonzkevm.abi b/etherman/smartcontracts/abi/polygonzkevm.abi index 4a838bda67..4cf528ed54 100644 --- a/etherman/smartcontracts/abi/polygonzkevm.abi +++ b/etherman/smartcontracts/abi/polygonzkevm.abi @@ -1,4 +1,248 @@ [ + { + "inputs": [ + { + "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "name": "_globalExitRootManager", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "_matic", + "type": "address" + }, + { + "internalType": "contract IVerifierRollup", + "name": "_rollupVerifier", + "type": "address" + }, + { + "internalType": "contract IPolygonZkEVMBridge", + "name": "_bridgeAddress", + "type": "address" + }, + { + "internalType": "uint64", + "name": "_chainID", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "_forkID", + "type": "uint64" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "BatchAlreadyVerified", + "type": "error" + }, + { + "inputs": [], + "name": "BatchNotSequencedOrNotSequenceEnd", + "type": "error" + }, + { + "inputs": [], + "name": "ExceedMaxVerifyBatches", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchBelowLastVerifiedBatch", + "type": "error" + }, + { + "inputs": [], + "name": "FinalNumBatchDoesNotMatchPendingState", + "type": "error" + }, + { + "inputs": [], + "name": "FinalPendingStateNumInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchTimeoutNotExpired", + "type": "error" + }, + { + "inputs": [], + "name": "ForceBatchesOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "ForcedDataDoesNotMatch", + "type": "error" + }, + { + "inputs": [], + "name": "GlobalExitRootNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "HaltTimeoutNotExpired", + "type": "error" + }, + { + "inputs": [], + "name": "InitNumBatchAboveLastVerifiedBatch", + "type": "error" + }, + { + "inputs": [], + "name": "InitNumBatchDoesNotMatchPendingState", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidProof", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRangeBatchTimeTarget", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRangeMultiplierBatchFee", + "type": "error" + }, + { + "inputs": [], + "name": "NewAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "NewPendingStateTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "NewTrustedAggregatorTimeoutMustBeLower", + "type": "error" + }, + { + "inputs": [], + "name": "NotEnoughMaticAmount", + "type": "error" + }, + { + "inputs": [], + "name": "OldAccInputHashDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OldStateRootDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyAdmin", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyNotEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyPendingAdmin", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyTrustedAggregator", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyTrustedSequencer", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateDoesNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateNotConsolidable", + "type": "error" + }, + { + "inputs": [], + "name": "PendingStateTimeoutExceedHaltAggregationTimeout", + "type": "error" + }, + { + "inputs": [], + "name": "SequenceZeroBatches", + "type": "error" + }, + { + "inputs": [], + "name": "SequencedTimestampBelowForcedTimestamp", + "type": "error" + }, + { + "inputs": [], + "name": "SequencedTimestampInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "StoredRootMustBeDifferentThanNewRoot", + "type": "error" + }, + { + "inputs": [], + "name": "TransactionsLengthAboveMax", + "type": "error" + }, + { + "inputs": [], + "name": "TrustedAggregatorTimeoutExceedHaltAggregationTimeout", + "type": "error" + }, + { + "inputs": [], + "name": "TrustedAggregatorTimeoutNotExpired", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AcceptAdminRole", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -169,32 +413,6 @@ "name": "SequenceForceBatches", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "SetAdmin", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bool", - "name": "newForceBatchAllowed", - "type": "bool" - } - ], - "name": "SetForceBatchAllowed", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -279,36 +497,49 @@ { "indexed": false, "internalType": "uint64", - "name": "newVeryBatchTimeTarget", + "name": "newVerifyBatchTimeTarget", "type": "uint64" } ], - "name": "SetVeryBatchTimeTarget", + "name": "SetVerifyBatchTimeTarget", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": true, + "indexed": false, + "internalType": "address", + "name": "newPendingAdmin", + "type": "address" + } + ], + "name": "TransferAdminRole", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, "internalType": "uint64", "name": "numBatch", "type": "uint64" }, { "indexed": false, - "internalType": "bytes32", - "name": "stateRoot", - "type": "bytes32" + "internalType": "uint64", + "name": "forkID", + "type": "uint64" }, { - "indexed": true, - "internalType": "address", - "name": "aggregator", - "type": "address" + "indexed": false, + "internalType": "string", + "name": "version", + "type": "string" } ], - "name": "TrustedVerifyBatches", + "name": "UpdateZkEVMVersion", "type": "event" }, { @@ -337,68 +568,35 @@ "type": "event" }, { - "inputs": [], - "name": "FORCE_BATCH_TIMEOUT", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "HALT_AGGREGATION_TIMEOUT", - "outputs": [ + "anonymous": false, + "inputs": [ { + "indexed": true, "internalType": "uint64", - "name": "", + "name": "numBatch", "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_BATCH_MULTIPLIER", - "outputs": [ + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_TRANSACTIONS_BYTE_LENGTH", - "outputs": [ + "indexed": false, + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "aggregator", + "type": "address" } ], - "stateMutability": "view", - "type": "function" + "name": "VerifyBatchesTrustedAggregator", + "type": "event" }, { "inputs": [], - "name": "MAX_VERIFY_BATCHES", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", + "name": "acceptAdminRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { @@ -536,19 +734,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "forceBatchAllowed", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -568,6 +753,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "forkID", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getCurrentBatchFee", @@ -648,26 +846,6 @@ }, { "inputs": [ - { - "internalType": "contract IPolygonZkEVMGlobalExitRoot", - "name": "_globalExitRootManager", - "type": "address" - }, - { - "internalType": "contract IERC20Upgradeable", - "name": "_matic", - "type": "address" - }, - { - "internalType": "contract IVerifierRollup", - "name": "_rollupVerifier", - "type": "address" - }, - { - "internalType": "contract IPolygonZkEVMBridge", - "name": "_bridgeAddress", - "type": "address" - }, { "components": [ { @@ -675,11 +853,6 @@ "name": "admin", "type": "address" }, - { - "internalType": "uint64", - "name": "chainID", - "type": "uint64" - }, { "internalType": "address", "name": "trustedSequencer", @@ -690,11 +863,6 @@ "name": "pendingStateTimeout", "type": "uint64" }, - { - "internalType": "bool", - "name": "forceBatchAllowed", - "type": "bool" - }, { "internalType": "address", "name": "trustedAggregator", @@ -724,6 +892,11 @@ "internalType": "string", "name": "_networkName", "type": "string" + }, + { + "internalType": "string", + "name": "_version", + "type": "string" } ], "name": "initialize", @@ -959,6 +1132,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "pendingAdmin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "pendingStateTimeout", @@ -1107,6 +1293,11 @@ "internalType": "struct PolygonZkEVM.BatchData[]", "name": "batches", "type": "tuple[]" + }, + { + "internalType": "address", + "name": "l2Coinbase", + "type": "address" } ], "name": "sequenceBatches", @@ -1173,32 +1364,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "setAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bool", - "name": "newForceBatchAllowed", - "type": "bool" - } - ], - "name": "setForceBatchAllowed", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -1281,11 +1446,24 @@ "inputs": [ { "internalType": "uint64", - "name": "newVeryBatchTimeTarget", + "name": "newVerifyBatchTimeTarget", "type": "uint64" } ], - "name": "setVeryBatchTimeTarget", + "name": "setVerifyBatchTimeTarget", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newPendingAdmin", + "type": "address" + } + ], + "name": "transferAdminRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -1355,6 +1533,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "verifyBatchTimeTarget", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -1398,7 +1589,7 @@ "type": "uint256[2]" } ], - "name": "trustedVerifyBatches", + "name": "verifyBatches", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -1446,22 +1637,9 @@ "type": "uint256[2]" } ], - "name": "verifyBatches", + "name": "verifyBatchesTrustedAggregator", "outputs": [], "stateMutability": "nonpayable", "type": "function" - }, - { - "inputs": [], - "name": "veryBatchTimeTarget", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" } ] \ No newline at end of file diff --git a/etherman/smartcontracts/abi/polygonzkevmbridge.abi b/etherman/smartcontracts/abi/polygonzkevmbridge.abi index d64ab6c566..7d71292388 100644 --- a/etherman/smartcontracts/abi/polygonzkevmbridge.abi +++ b/etherman/smartcontracts/abi/polygonzkevmbridge.abi @@ -1,4 +1,84 @@ [ + { + "inputs": [], + "name": "AlreadyClaimed", + "type": "error" + }, + { + "inputs": [], + "name": "AmountDoesNotMatchMsgValue", + "type": "error" + }, + { + "inputs": [], + "name": "DestinationNetworkInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "EtherTransferFailed", + "type": "error" + }, + { + "inputs": [], + "name": "GlobalExitRootInvalid", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSmtProof", + "type": "error" + }, + { + "inputs": [], + "name": "MerkleTreeFull", + "type": "error" + }, + { + "inputs": [], + "name": "MessageFailed", + "type": "error" + }, + { + "inputs": [], + "name": "MsgValueNotZero", + "type": "error" + }, + { + "inputs": [], + "name": "NotValidAmount", + "type": "error" + }, + { + "inputs": [], + "name": "NotValidOwner", + "type": "error" + }, + { + "inputs": [], + "name": "NotValidSignature", + "type": "error" + }, + { + "inputs": [], + "name": "NotValidSpender", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyNotEmergencyState", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyPolygonZkEVM", + "type": "error" + }, { "anonymous": false, "inputs": [ @@ -136,50 +216,17 @@ "internalType": "address", "name": "wrappedTokenAddress", "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "metadata", + "type": "bytes" } ], "name": "NewWrappedToken", "type": "event" }, - { - "inputs": [], - "name": "LEAF_TYPE_ASSET", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "LEAF_TYPE_MESSAGE", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAINNET_NETWORK_ID", - "outputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "activateEmergencyState", @@ -246,9 +293,9 @@ { "inputs": [ { - "internalType": "bytes32[]", + "internalType": "bytes32[32]", "name": "smtProof", - "type": "bytes32[]" + "type": "bytes32[32]" }, { "internalType": "uint32", @@ -304,9 +351,9 @@ { "inputs": [ { - "internalType": "bytes32[]", + "internalType": "bytes32[32]", "name": "smtProof", - "type": "bytes32[]" + "type": "bytes32[32]" }, { "internalType": "uint32", @@ -489,7 +536,7 @@ "name": "globalExitRootManager", "outputs": [ { - "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", "name": "", "type": "address" } @@ -505,7 +552,7 @@ "type": "uint32" }, { - "internalType": "contract IPolygonZkEVMGlobalExitRoot", + "internalType": "contract IBasePolygonZkEVMGlobalExitRoot", "name": "_globalExitRootManager", "type": "address" }, @@ -644,14 +691,14 @@ "type": "bytes32" }, { - "internalType": "bytes32[]", + "internalType": "bytes32[32]", "name": "smtProof", - "type": "bytes32[]" + "type": "bytes32[32]" }, { - "internalType": "uint64", + "internalType": "uint32", "name": "index", - "type": "uint64" + "type": "uint32" }, { "internalType": "bytes32", diff --git a/etherman/smartcontracts/abi/polygonzkevmglobalexitroot.abi b/etherman/smartcontracts/abi/polygonzkevmglobalexitroot.abi index d55b8a7ef0..85f181413d 100644 --- a/etherman/smartcontracts/abi/polygonzkevmglobalexitroot.abi +++ b/etherman/smartcontracts/abi/polygonzkevmglobalexitroot.abi @@ -1,16 +1,24 @@ [ { - "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" + "internalType": "address", + "name": "_rollupAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_bridgeAddress", + "type": "address" } ], - "name": "Initialized", - "type": "event" + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "OnlyAllowedContracts", + "type": "error" }, { "anonymous": false, @@ -76,24 +84,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "_rollupAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "_bridgeAddress", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [], "name": "lastMainnetExitRoot", diff --git a/etherman/smartcontracts/bin/mockverifier.bin b/etherman/smartcontracts/bin/mockverifier.bin index 13af359141..cbc0d50e6d 100644 --- a/etherman/smartcontracts/bin/mockverifier.bin +++ b/etherman/smartcontracts/bin/mockverifier.bin @@ -1 +1 @@ -608060405234801561001057600080fd5b50610101806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c806343753b4d14602d575b600080fd5b60426038366004606c565b6001949350505050565b604051901515815260200160405180910390f35b8060408101831015606657600080fd5b92915050565b600080600080610120808688031215608357600080fd5b608b87876056565b945060c0860187811115609d57600080fd5b60408701945060ab88826056565b93505086818701111560bc57600080fd5b5092959194509261010001915056fea2646970667358221220fd8a3c0f0aaf813f6cb0732c65b6c70c98673d54168129b4c058b08dac9751d564736f6c634300080f0033 \ No newline at end of file +608060405234801561001057600080fd5b50610101806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c806343753b4d14602d575b600080fd5b60426038366004606c565b6001949350505050565b604051901515815260200160405180910390f35b8060408101831015606657600080fd5b92915050565b600080600080610120808688031215608357600080fd5b608b87876056565b945060c0860187811115609d57600080fd5b60408701945060ab88826056565b93505086818701111560bc57600080fd5b5092959194509261010001915056fea2646970667358221220e4fded42456aefeafae525ecf0e782474df02f10c53f98f759d2ad7ab8489cc164736f6c63430008110033 \ No newline at end of file diff --git a/etherman/smartcontracts/bin/polygonzkevm.bin b/etherman/smartcontracts/bin/polygonzkevm.bin index 0ba644f52f..acf843c3aa 100644 --- a/etherman/smartcontracts/bin/polygonzkevm.bin +++ b/etherman/smartcontracts/bin/polygonzkevm.bin @@ -1 +1 @@ -608060405234801561001057600080fd5b50615f3b80620000216000396000f3fe608060405234801561001057600080fd5b50600436106103af5760003560e01c80638da5cb5b116101f4578063cfa8ed471161011a578063e7a7ed02116100ad578063f14916d61161007c578063f14916d6146108f2578063f2fde38b14610905578063f851a44014610918578063f8b823e41461092b57600080fd5b8063e7a7ed021461089f578063e8bf92ed146108b9578063eaeb077b146108cc578063edc41121146108df57600080fd5b8063d939b315116100e9578063d939b31514610861578063dbc169761461087b578063e11f3f1814610883578063e217cfd61461089657600080fd5b8063cfa8ed471461080d578063d02103ca14610827578063d8d1091b1461083a578063d8f54db01461084d57600080fd5b8063ab9fc5ef11610192578063b6b0b09711610161578063b6b0b097146107c5578063c0ed84e0146107df578063c89e42df146107e7578063cf136306146107fa57600080fd5b8063ab9fc5ef14610713578063adc879e91461071d578063afd23cbe14610737578063b4d63f581461076557600080fd5b80639eb831b9116101ce5780639eb831b9146106d85780639f0d039d146106e0578063a3c573eb146106e8578063aa58bad6146106fb57600080fd5b80638da5cb5b146106ac57806399f5634e146106bd5780639c9f3dfe146106c557600080fd5b80634a910e6a116102d9578063715018a611610277578063837a473811610246578063837a473814610607578063841b24d7146106755780638b48931e1461068f5780638c4a0af71461069957600080fd5b8063715018a6146105c65780637215541a146105ce57806375c508b3146105e15780637fcb3653146105f457600080fd5b806360943d6a116102b357806360943d6a1461056d5780636b8616ce146105805780636ff512cc146105a0578063704b6c02146105b357600080fd5b80634a910e6a146105325780635392c5e014610545578063542028d51461056557600080fd5b8063383b3be811610351578063456052671161032057806345605267146104d8578063458c0477146104f25780634834a343146105055780634a1a89a71461051857600080fd5b8063383b3be814610485578063394218e9146104985780633c158267146104ab578063423fa856146104be57600080fd5b806319d8ac611161038d57806319d8ac6114610404578063220d78991461042f57806329878983146104425780632d0889d31461046d57600080fd5b8063107bf28c146103b457806315064c96146103d25780631816b7e5146103ef575b600080fd5b6103bc610934565b6040516103c99190615364565b60405180910390f35b6065546103df9060ff1681565b60405190151581526020016103c9565b6104026103fd366004615377565b6109c2565b005b606854610417906001600160401b031681565b6040516001600160401b0390911681526020016103c9565b6103bc61043d3660046153b7565b610b43565b606a54610455906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b610477620493e081565b6040519081526020016103c9565b6103df610493366004615404565b610ce9565b6104026104a6366004615404565b610d30565b6104026104b9366004615541565b610f61565b60685461041790600160401b90046001600160401b031681565b60685461041790600160801b90046001600160401b031681565b607254610417906001600160401b031681565b61040261051336600461567f565b611840565b60725461041790600160401b90046001600160401b031681565b610402610540366004615404565b611c16565b610477610553366004615404565b606d6020526000908152604090205481565b6103bc611cd5565b61040261057b366004615721565b611ce2565b61047761058e366004615404565b60666020526000908152604090205481565b6104026105ae3660046157f8565b61209b565b6104026105c13660046157f8565b612170565b610402612224565b6104026105dc366004615404565b612238565b6104026105ef366004615815565b612492565b606954610417906001600160401b031681565b61064a6106153660046158b3565b6071602052600090815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b0395861681529490931660208501529183015260608201526080016103c9565b60725461041790600160c01b90046001600160401b031681565b61041762093a8081565b6104026106a73660046158da565b612582565b6033546001600160a01b0316610455565b610477612635565b6104026106d3366004615404565b612731565b610477600c81565b607454610477565b607054610455906001600160a01b031681565b6065546104179061010090046001600160401b031681565b6104176206978081565b606c5461041790600160a81b90046001600160401b031681565b606554610752906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103c9565b6107a0610773366004615404565b606760205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b0392831660208501529116908201526060016103c9565b60655461045590600160581b90046001600160a01b031681565b61041761292f565b6104026107f53660046158f7565b61297c565b610402610808366004615404565b612a1e565b60695461045590600160401b90046001600160a01b031681565b606c54610455906001600160a01b031681565b610402610848366004615933565b612adb565b606c546103df90600160a01b900460ff1681565b60725461041790600160801b90046001600160401b031681565b610402613165565b610402610891366004615815565b6132b3565b6104176103e881565b60685461041790600160c01b90046001600160401b031681565b606b54610455906001600160a01b031681565b6104026108da366004615a25565b61347e565b6104026108ed36600461567f565b6138bc565b6104026109003660046157f8565b613a3b565b6104026109133660046157f8565b613aef565b607354610455906001600160a01b031681565b61047760745481565b606f805461094190615a69565b80601f016020809104026020016040519081016040528092919081815260200182805461096d90615a69565b80156109ba5780601f1061098f576101008083540402835291602001916109ba565b820191906000526020600020905b81548152906001019060200180831161099d57829003601f168201915b505050505081565b6073546001600160a01b03163314610a2d5760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b60648201526084015b60405180910390fd5b6103e88161ffff1610158015610a4857506104008161ffff16105b610ae05760405162461bcd60e51b815260206004820152604a60248201527f506f6c79676f6e5a6b45564d3a3a7365744d756c7469706c696572426174636860448201527f4665653a206e65774d756c7469706c696572426174636846656520696e636f7260648201527f726563742072616e676500000000000000000000000000000000000000000000608482015260a401610a24565b606580546affff0000000000000000001916690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b03808616600081815260676020526040808220549388168252902054606092911580610b7557508115155b610be9576040805162461bcd60e51b81526020600482015260248101919091527f506f6c79676f6e5a6b45564d3a3a676574496e707574536e61726b427974657360448201527f3a206f6c64416363496e7075744861736820646f6573206e6f742065786973746064820152608401610a24565b80610c5e576040805162461bcd60e51b81526020600482015260248101919091527f506f6c79676f6e5a6b45564d3a3a676574496e707574536e61726b427974657360448201527f3a206e6577416363496e7075744861736820646f6573206e6f742065786973746064820152608401610a24565b606c54604080516bffffffffffffffffffffffff193360601b166020820152603481019790975260548701939093526001600160c01b031960c0998a1b81166074880152600160a81b909104891b8116607c870152608486019490945260a485015260c4840194909452509290931b90911660e4830152805180830360cc01815260ec909201905290565b6072546001600160401b0382811660009081526071602052604081205490924292610d1f92600160801b90920481169116615ab9565b6001600160401b0316111592915050565b6073546001600160a01b03163314610d965760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b62093a806001600160401b0382161115610e3e5760405162461bcd60e51b815260206004820152604e60248201527f506f6c79676f6e5a6b45564d3a3a73657454727573746564416767726567617460448201527f6f7254696d656f75743a20457863656564206d61782068616c7420616767726560648201527f676174696f6e2074696d656f7574000000000000000000000000000000000000608482015260a401610a24565b60655460ff16610efa576072546001600160401b03600160c01b909104811690821610610efa5760405162461bcd60e51b8152602060048201526044602482018190527f506f6c79676f6e5a6b45564d3a3a736574547275737465644167677265676174908201527f6f7254696d656f75743a204e65772074696d656f7574206d757374206265206c60648201527f6f77657200000000000000000000000000000000000000000000000000000000608482015260a401610a24565b6072805477ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b6001600160401b038416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610b38565b60655460ff1615610fe55760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401610a24565b606954600160401b90046001600160a01b0316331461106c5760405162461bcd60e51b815260206004820152603a60248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c795472757374656453657175656e6360448201527f65723a204f6e6c7920747275737465642073657175656e6365720000000000006064820152608401610a24565b8051806110e15760405162461bcd60e51b815260206004820152603d60248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365426174636865733a204160448201527f74206c65617374206d7573742073657175656e636520312062617463680000006064820152608401610a24565b6103e8811061115a576040805162461bcd60e51b81526020600482015260248101919091527f506f6c79676f6e5a6b45564d3a3a73657175656e6365426174636865733a204360448201527f616e6e6f742073657175656e63652074686174206d616e7920626174636865736064820152608401610a24565b6068546001600160401b03600160401b82048116600081815260676020526040812054838516949293600160801b90930490921691905b858110156116535760008782815181106111ad576111ad615ae4565b60200260200101519050600081606001516001600160401b0316111561138457836111d781615afa565b94505060008160000151805190602001208260200151836060015160405160200161122293929190928352602083019190915260c01b6001600160c01b031916604082015260480190565b60408051601f1981840301815291815281516020928301206001600160401b0388166000908152606690935291205490915081146112c85760405162461bcd60e51b815260206004820152603d60248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365426174636865733a204660448201527f6f7263656420626174636865732064617461206d757374206d617463680000006064820152608401610a24565b81606001516001600160401b031682604001516001600160401b0316101561137e5760405162461bcd60e51b815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365426174636865733a204660448201527f6f7263656420626174636865732074696d657374616d70206d7573742062652060648201527f626967676572206f7220657175616c207468616e206d696e0000000000000000608482015260a401610a24565b50611512565b602081015115806114265750606c5460208201516040517f257b36320000000000000000000000000000000000000000000000000000000081526001600160a01b039092169163257b3632916113e09160040190815260200190565b6020604051808303816000875af11580156113ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114239190615b20565b15155b6114985760405162461bcd60e51b815260206004820152603a60248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365426174636865733a204760448201527f6c6f62616c206578697420726f6f74206d7573742065786973740000000000006064820152608401610a24565b805151620493e0116115125760405162461bcd60e51b815260206004820152603a60248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365426174636865733a205460448201527f72616e73616374696f6e73206279746573206f766572666c6f770000000000006064820152608401610a24565b856001600160401b031681604001516001600160401b03161015801561154557504281604001516001600160401b031611155b6115b75760405162461bcd60e51b815260206004820152603d60248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365426174636865733a205460448201527f696d657374616d70206d75737420626520696e736964652072616e67650000006064820152608401610a24565b805180516020918201208183015160408085015181519485018890529084019290925260608084019190915260c09190911b6001600160c01b031916608083015233901b6bffffffffffffffffffffffff19166088820152609c01604051602081830303815290604052805190602001209250848061163590615afa565b9550508060400151955050808061164b90615b39565b915050611191565b506068546001600160401b03600160c01b909104811690831611156116e05760405162461bcd60e51b815260206004820152603560248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365426174636865733a204660448201527f6f7263652062617463686573206f766572666c6f7700000000000000000000006064820152608401610a24565b60685460009061170090600160801b90046001600160401b031684615b52565b611713906001600160401b031687615b7a565b60408051606081018252848152426001600160401b03908116602080840191825260688054600160401b9081900485168688019081528c861660008181526067909552979093209551865592516001909501805492519585166fffffffffffffffffffffffffffffffff199384161795851684029590951790945583548b841691161793029290921767ffffffffffffffff60801b1916600160801b928716929092029190911790556074549091506117f1903390309084906117d69190615b91565b606554600160581b90046001600160a01b0316929190613b7c565b6117f9613c2d565b606854604051600160401b9091046001600160401b0316907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050565b60655460ff16156118c45760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401610a24565b6072546001600160401b0387811660009081526067602052604090206001015442926118fb92600160c01b90910481169116615ab9565b6001600160401b0316111561199e5760405162461bcd60e51b815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2054727560448201527f737465642061676772656761746f722074696d656f7574206e6f74206578706960648201527f7265640000000000000000000000000000000000000000000000000000000000608482015260a401610a24565b6103e86119ab8888615b52565b6001600160401b031610611a275760405162461bcd60e51b815260206004820152603c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2043616e60448201527f6e6f74207665726966792074686174206d616e792062617463686573000000006064820152608401610a24565b611a378888888888888888613cd1565b611a408661424e565b607254600160801b90046001600160401b0316600003611b11576069805467ffffffffffffffff19166001600160401b038881169182179092556000908152606d602052604090208590556072541615611aae57607280546fffffffffffffffffffffffffffffffff191690555b606c546040516333d6247d60e01b8152600481018790526001600160a01b03909116906333d6247d90602401600060405180830381600087803b158015611af457600080fd5b505af1158015611b08573d6000803e3d6000fd5b50505050611bcb565b611b19613c2d565b607280546001600160401b0316906000611b3283615afa565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b8152607254871660009081526071909352949091209251835492518616600160401b026fffffffffffffffffffffffffffffffff199093169516949094171781559151600183015551600290910155505b60405184815233906001600160401b038816907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966906020015b60405180910390a35050505050505050565b606a546001600160a01b03163314611cc957611c3181610ce9565b611cc95760405162461bcd60e51b815260206004820152605460248201527f506f6c79676f6e5a6b45564d3a3a636f6e736f6c696461746550656e64696e6760448201527f53746174653a2050656e64696e67207374617465206973206e6f74207265616460648201527f7920746f20626520636f6e736f6c696461746564000000000000000000000000608482015260a401610a24565b611cd281614440565b50565b606e805461094190615a69565b600054610100900460ff1615808015611d025750600054600160ff909116105b80611d1c5750303b158015611d1c575060005460ff166001145b611d8e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a24565b6000805460ff191660011790558015611db1576000805461ff0019166101001790555b606c80546001600160a01b03199081166001600160a01b038c811691909117909255606580547fff0000000000000000000000000000000000000000ffffffffffffffffffffff16600160581b8c851602179055606b805482168a841617905560708054909116918816919091179055611e2e60208601866157f8565b607380546001600160a01b0319166001600160a01b0392909216919091179055611e5e60608601604087016157f8565b606980546001600160a01b0392909216600160401b027fffffffff0000000000000000000000000000000000000000ffffffffffffffff909216919091179055611eae60c0860160a087016157f8565b606a80546001600160a01b0319166001600160a01b039290921691909117905560008052606d6020527fda90043ba5b4096ba14704bc227ab0d3167da15b887e62ab2e76e37daa711356849055611f0b60e0860160c08701615404565b607280546001600160401b0392909216600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055611f536040860160208701615404565b606c80546001600160401b0392909216600160a81b027fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff909216919091179055611fa36080860160608701615404565b607280546001600160401b0392909216600160801b0267ffffffffffffffff60801b19909216919091179055611fdf60a08601608087016158da565b606c8054911515600160a01b0260ff60a01b19909216919091179055606e6120078482615bf6565b50606f6120148382615bf6565b50670de0b6b3a7640000607455606580546affffffffffffffffffff0019166a03ea00000000000007080017905561204a61462a565b8015612090576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b6073546001600160a01b031633146121015760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b606980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff16600160401b6001600160a01b038416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610b38565b6073546001600160a01b031633146121d65760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b607380546001600160a01b0319166001600160a01b0383169081179091556040519081527f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a190602001610b38565b61222c6146b0565b612236600061470a565b565b6033546001600160a01b0316331461248a57600061225461292f565b9050806001600160401b0316826001600160401b0316116122dd5760405162461bcd60e51b815260206004820152603c60248201527f506f6c79676f6e5a6b45564d3a3a6163746976617465456d657267656e63795360448201527f746174653a20426174636820616c7265616479207665726966696564000000006064820152608401610a24565b6068546001600160401b03600160401b90910481169083161180159061231f57506001600160401b038083166000908152606760205260409020600101541615155b6123b75760405162461bcd60e51b815260206004820152605060248201527f506f6c79676f6e5a6b45564d3a3a6163746976617465456d657267656e63795360448201527f746174653a204261746368206e6f742073657175656e636564206f72206e6f7460648201527f20656e64206f662073657175656e636500000000000000000000000000000000608482015260a401610a24565b6001600160401b0380831660009081526067602052604090206001015442916123e59162093a809116615ab9565b6001600160401b031611156124885760405162461bcd60e51b815260206004820152604d60248201527f506f6c79676f6e5a6b45564d3a3a6163746976617465456d657267656e63795360448201527f746174653a204167677265676174696f6e2068616c742074696d656f7574206960648201527f73206e6f74206578706972656400000000000000000000000000000000000000608482015260a401610a24565b505b611cd261475c565b60655460ff16156125165760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401610a24565b6125278989898989898989896147cc565b6001600160401b0386166000908152606d60209081526040918290205482519081529081018690527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161209061475c565b6073546001600160a01b031633146125e85760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b606c8054821515600160a01b0260ff60a01b199091161790556040517fbacda50a4a8575be1d91a7ebe29ee45056f3a94f12a2281eb6b43afa33bcefe690610b3890831515815260200190565b6065546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918291600160581b9091046001600160a01b0316906370a0823190602401602060405180830381865afa1580156126a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c59190615b20565b905060006126d161292f565b6068546001600160401b03600160401b820481169161270191600160801b8204811691600160c01b900416615b52565b61270b9190615ab9565b6127159190615b52565b6001600160401b0316905061272a8183615ccb565b9250505090565b6073546001600160a01b031633146127975760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b62093a806001600160401b038216111561283f5760405162461bcd60e51b815260206004820152604960248201527f506f6c79676f6e5a6b45564d3a3a73657450656e64696e67537461746554696d60448201527f656f75743a20457863656564206d61782068616c74206167677265676174696f60648201527f6e2074696d656f75740000000000000000000000000000000000000000000000608482015260a401610a24565b60655460ff166128d4576072546001600160401b03600160801b9091048116908216106128d45760405162461bcd60e51b815260206004820152603f60248201527f506f6c79676f6e5a6b45564d3a3a73657450656e64696e67537461746554696d60448201527f656f75743a204e65772074696d656f7574206d757374206265206c6f776572006064820152608401610a24565b6072805467ffffffffffffffff60801b1916600160801b6001600160401b038416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610b38565b6072546000906001600160401b03161561296c57506072546001600160401b03908116600090815260716020526040902054600160401b90041690565b506069546001600160401b031690565b6073546001600160a01b031633146129e25760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b606e6129ee8282615bf6565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610b389190615364565b6073546001600160a01b03163314612a845760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b6065805468ffffffffffffffff0019166101006001600160401b038416908102919091179091556040519081527f03a12f7e53d2a9e31a9e913d85c12c4c38feb92abe003c111329298af088437f90602001610b38565b60655460ff1615612b5f5760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401610a24565b606c54600160a01b900460ff161515600114612bef5760405162461bcd60e51b815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a6973466f7263654261746368416c6c6f776560448201527f643a204f6e6c7920696620666f72636520626174636820697320617661696c61606482015262626c6560e81b608482015260a401610a24565b805180612c645760405162461bcd60e51b815260206004820152603f60248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365466f726365426174636860448201527f65733a204d75737420666f726365206174206c656173742031206261746368006064820152608401610a24565b6103e88110612d015760405162461bcd60e51b815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365466f726365426174636860448201527f65733a2043616e6e6f74207665726966792074686174206d616e79206261746360648201527f6865730000000000000000000000000000000000000000000000000000000000608482015260a401610a24565b6068546001600160401b03600160c01b8204811691612d29918491600160801b900416615cdf565b1115612d9d5760405162461bcd60e51b815260206004820152603760248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365466f726365426174636860448201527f65733a20466f72636520626174636820696e76616c69640000000000000000006064820152608401610a24565b6068546001600160401b03600160401b820481166000818152606760205260408120549193600160801b9004909216915b8481101561305e576000868281518110612dea57612dea615ae4565b602002602001015190508380612dff90615afa565b825180516020918201208185015160408087015181519485019390935283015260c01b6001600160c01b03191660608201529095506000915060680160408051601f1981840301815291815281516020928301206001600160401b038816600090815260669093529120549091508114612f075760405162461bcd60e51b815260206004820152604260248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365466f726365426174636860448201527f65733a20466f7263656420626174636865732064617461206d757374206d617460648201527f6368000000000000000000000000000000000000000000000000000000000000608482015260a401610a24565b612f12600188615b7a565b8303612fcf5742620697808360400151612f2c9190615ab9565b6001600160401b03161115612fcf5760405162461bcd60e51b815260206004820152604960248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365466f726365426174636860448201527f65733a20466f72636564206261746368206973206e6f7420696e2074696d656f60648201527f757420706572696f640000000000000000000000000000000000000000000000608482015260a401610a24565b8151805160209182012081840151604080519384018890528301919091526060808301919091524260c01b6001600160c01b031916608083015233901b6bffffffffffffffffffffffff19166088820152609c01604051602081830303815290604052805190602001209350858061304690615afa565b9650505050808061305690615b39565b915050612dce565b506068805467ffffffffffffffff1916426001600160401b03908116918217808455604080516060810182528681526020808201958652600160401b9384900485168284019081528a861660008181526067909352848320935184559651600193909301805491519387166fffffffffffffffffffffffffffffffff199092169190911792861685029290921790915585547fffffffffffffffff00000000000000000000000000000000ffffffffffffffff1694830267ffffffffffffffff60801b191694909417600160801b88851602179485905551930416917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a25050505050565b60655460ff166131dd5760405162461bcd60e51b815260206004820152603b60248201527f456d657267656e63794d616e616765723a3a6966456d657267656e637953746160448201527f74653a206f6e6c7920696620656d657267656e637920737461746500000000006064820152608401610a24565b6073546001600160a01b031633146132435760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b607060009054906101000a90046001600160a01b03166001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561329357600080fd5b505af11580156132a7573d6000803e3d6000fd5b50505050612236614ed6565b606a546001600160a01b031633146133335760405162461bcd60e51b815260206004820152603c60248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c79547275737465644167677265676160448201527f746f723a204f6e6c7920747275737465642061676772656761746f72000000006064820152608401610a24565b6133448989898989898989896147cc565b6069805467ffffffffffffffff19166001600160401b038881169182179092556000908152606d60205260409020859055607254161561339857607280546fffffffffffffffffffffffffffffffff191690555b606c546040516333d6247d60e01b8152600481018790526001600160a01b03909116906333d6247d90602401600060405180830381600087803b1580156133de57600080fd5b505af11580156133f2573d6000803e3d6000fd5b50506072805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a80000000000000000000000000000000000000000000000000179055505060405184815233906001600160401b038816907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a3505050505050505050565b60655460ff16156135025760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401610a24565b606c54600160a01b900460ff1615156001146135925760405162461bcd60e51b815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a6973466f7263654261746368416c6c6f776560448201527f643a204f6e6c7920696620666f72636520626174636820697320617661696c61606482015262626c6560e81b608482015260a401610a24565b600061359d60745490565b9050818111156136155760405162461bcd60e51b815260206004820152602a60248201527f506f6c79676f6e5a6b45564d3a3a666f72636542617463683a204e6f7420656e60448201527f6f756768206d61746963000000000000000000000000000000000000000000006064820152608401610a24565b620493e083511061368e5760405162461bcd60e51b815260206004820152603560248201527f506f6c79676f6e5a6b45564d3a3a666f72636542617463683a205472616e736160448201527f6374696f6e73206279746573206f766572666c6f7700000000000000000000006064820152608401610a24565b6065546136ad90600160581b90046001600160a01b0316333084613b7c565b606c54604080517f3ed691ef00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691633ed691ef9160048083019260209291908290030181865afa158015613710573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137349190615b20565b60688054919250600160c01b9091046001600160401b031690601861375883615afa565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555050838051906020012081426040516020016137b793929190928352602083019190915260c01b6001600160c01b031916604082015260480190565b60408051808303601f190181529181528151602092830120606854600160c01b90046001600160401b03166000908152606690935291205532330361385b57606854604080518381523360208201526060918101829052600091810191909152600160c01b9091046001600160401b0316907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26138b6565b606860189054906101000a90046001600160401b03166001600160401b03167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233876040516138ad93929190615cf7565b60405180910390a25b50505050565b606a546001600160a01b0316331461393c5760405162461bcd60e51b815260206004820152603c60248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c79547275737465644167677265676160448201527f746f723a204f6e6c7920747275737465642061676772656761746f72000000006064820152608401610a24565b61394c8888888888888888613cd1565b6069805467ffffffffffffffff19166001600160401b038881169182179092556000908152606d6020526040902085905560725416156139a057607280546fffffffffffffffffffffffffffffffff191690555b606c546040516333d6247d60e01b8152600481018790526001600160a01b03909116906333d6247d90602401600060405180830381600087803b1580156139e657600080fd5b505af11580156139fa573d6000803e3d6000fd5b50506040518681523392506001600160401b03891691507f0c0ce073a7d7b5850c04ccc4b20ee7d3179d5f57d0ac44399565792c0f72fce790602001611c04565b6073546001600160a01b03163314613aa15760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b606a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610b38565b613af76146b0565b6001600160a01b038116613b735760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a24565b611cd28161470a565b6040516001600160a01b03808516602483015283166044820152606481018290526138b69085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614f83565b6072546001600160401b03600160401b820481169116111561223657607254600090613c6a90600160401b90046001600160401b03166001615ab9565b9050613c7581610ce9565b15611cd257607254600090600290613c979084906001600160401b0316615b52565b613ca19190615d28565b613cab9083615ab9565b9050613cb681610ce9565b15613cc857613cc481614440565b5050565b613cc482614440565b600080613cdc61292f565b90506001600160401b038a1615613e68576072546001600160401b03908116908b161115613d985760405162461bcd60e51b815260206004820152605960248201527f506f6c79676f6e5a6b45564d3a3a5f766572696679426174636865733a20706560448201527f6e64696e6753746174654e756d206d757374206265206c657373206f7220657160648201527f75616c207468616e206c61737450656e64696e67537461746500000000000000608482015260a401610a24565b6001600160401b03808b1660009081526071602052604090206002810154815490945090918b8116600160401b9092041614613e625760405162461bcd60e51b815260206004820152604d60248201527f506f6c79676f6e5a6b45564d3a3a5f766572696679426174636865733a20696e60448201527f69744e756d4261746368206d757374206d61746368207468652070656e64696e60648201527f6720737461746520626174636800000000000000000000000000000000000000608482015260a401610a24565b50613fcb565b6001600160401b0389166000908152606d6020526040902054915081613f1d5760405162461bcd60e51b8152602060048201526044602482018190527f506f6c79676f6e5a6b45564d3a3a5f766572696679426174636865733a20696e908201527f69744e756d426174636820737461746520726f6f7420646f6573206e6f74206560648201527f7869737400000000000000000000000000000000000000000000000000000000608482015260a401610a24565b806001600160401b0316896001600160401b03161115613fcb5760405162461bcd60e51b815260206004820152605e60248201527f506f6c79676f6e5a6b45564d3a3a5f766572696679426174636865733a20696e60448201527f69744e756d4261746368206d757374206265206c657373206f7220657175616c60648201527f207468616e2063757272656e744c617374566572696669656442617463680000608482015260a401610a24565b806001600160401b0316886001600160401b0316116140785760405162461bcd60e51b815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a5f766572696679426174636865733a20666960448201527f6e616c4e65774261746368206d75737420626520626967676572207468616e2060648201527f63757272656e744c617374566572696669656442617463680000000000000000608482015260a401610a24565b60006140878a8a8a868b610b43565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516140bc9190615d4e565b602060405180830381855afa1580156140d9573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906140fc9190615b20565b6141069190615d6a565b606b546040805160208101825283815290516343753b4d60e01b81529293506001600160a01b03909116916343753b4d9161414a918b918b918b9190600401615d7e565b602060405180830381865afa158015614167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061418b9190615df8565b6141fd5760405162461bcd60e51b815260206004820152602b60248201527f506f6c79676f6e5a6b45564d3a3a5f766572696679426174636865733a20496e60448201527f76616c69642070726f6f660000000000000000000000000000000000000000006064820152608401610a24565b6142403361420b858d615b52565b6001600160401b031661421c612635565b6142269190615b91565b606554600160581b90046001600160a01b0316919061506d565b505050505050505050505050565b600061425861292f565b9050816000806142688484615b52565b6001600160401b031690505b836001600160401b0316836001600160401b03161461431a576001600160401b038084166000908152606760205260409020606554600182015491926101009091048116916142c4911642615b7a565b11156142ff5760018101546142e990600160401b90046001600160401b031685615b52565b6142fc906001600160401b031684615cdf565b92505b60010154600160401b90046001600160401b03169250614274565b60006143268383615b7a565b9050828110156143a657600061433c8285615b7a565b9050600c811161434c578061434f565b600c5b905061435c816003615b91565b61436790600a615ef9565b6065546143869083906901000000000000000000900461ffff16615ef9565b6074546143939190615b91565b61439d9190615ccb565b60745550614438565b60006143b28483615b7a565b9050600c81116143c257806143c5565b600c5b905060006143d4826003615b91565b6143df90600a615ef9565b6065546143fe9084906901000000000000000000900461ffff16615ef9565b60745461440b9190615b91565b6144159190615ccb565b9050806074546074546144289190615b91565b6144329190615ccb565b60745550505b505050505050565b6001600160401b0381161580159061446d57506072546001600160401b03600160401b9091048116908216115b801561448857506072546001600160401b0390811690821611155b6144fa5760405162461bcd60e51b815260206004820152603f60248201527f506f6c79676f6e5a6b45564d3a3a5f636f6e736f6c696461746550656e64696e60448201527f6753746174653a2070656e64696e6753746174654e756d20696e76616c6964006064820152608401610a24565b6001600160401b038181166000818152607160209081526040808320805460698054600160401b9283900490981667ffffffffffffffff19909816881790556002820154878652606d9094529382902092909255607280546fffffffffffffffff000000000000000019169390940292909217909255606c54600183015491516333d6247d60e01b815260048101929092529192916001600160a01b0316906333d6247d90602401600060405180830381600087803b1580156145bc57600080fd5b505af11580156145d0573d6000803e3d6000fd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161461d91815260200190565b60405180910390a3505050565b600054610100900460ff166146a75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a24565b6122363361470a565b6033546001600160a01b031633146122365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a24565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b607060009054906101000a90046001600160a01b03166001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156147ac57600080fd5b505af11580156147c0573d6000803e3d6000fd5b505050506122366150b6565b60006001600160401b038a161561497c576072546001600160401b03908116908b1611156148ae5760405162461bcd60e51b815260206004820152606560248201527f506f6c79676f6e5a6b45564d3a3a5f70726f766544697374696e637450656e6460448201527f696e6753746174653a2070656e64696e6753746174654e756d206d757374206260648201527f65206c657373206f7220657175616c207468616e206c61737450656e64696e6760848201527f537461746500000000000000000000000000000000000000000000000000000060a482015260c401610a24565b506001600160401b03808a1660009081526071602052604090206002810154815490928a8116600160401b90920416146149765760405162461bcd60e51b815260206004820152605960248201527f506f6c79676f6e5a6b45564d3a3a5f70726f766544697374696e637450656e6460448201527f696e6753746174653a20696e69744e756d4261746368206d757374206d61746360648201527f68207468652070656e64696e6720737461746520626174636800000000000000608482015260a401610a24565b50614ae6565b506001600160401b0387166000908152606d602052604090205480614a2f5760405162461bcd60e51b815260206004820152605060248201527f506f6c79676f6e5a6b45564d3a3a5f70726f766544697374696e637450656e6460448201527f696e6753746174653a20696e69744e756d426174636820737461746520726f6f60648201527f7420646f6573206e6f7420657869737400000000000000000000000000000000608482015260a401610a24565b6069546001600160401b039081169089161115614ae65760405162461bcd60e51b815260206004820152606360248201527f506f6c79676f6e5a6b45564d3a3a5f70726f766544697374696e637450656e6460448201527f696e6753746174653a20696e69744e756d4261746368206d757374206265206c60648201527f657373206f7220657175616c207468616e206c617374566572696669656442616084820152620e8c6d60eb1b60a482015260c401610a24565b6072546001600160401b03908116908a1611801590614b165750896001600160401b0316896001600160401b0316115b8015614b3757506072546001600160401b03600160401b9091048116908a16115b614bcf5760405162461bcd60e51b815260206004820152604860248201527f506f6c79676f6e5a6b45564d3a3a5f70726f766544697374696e637450656e6460448201527f696e6753746174653a2066696e616c50656e64696e6753746174654e756d206960648201527f6e636f7272656374000000000000000000000000000000000000000000000000608482015260a401610a24565b6001600160401b03898116600090815260716020526040902054600160401b9004811690881614614c9a5760405162461bcd60e51b815260206004820152606360248201527f506f6c79676f6e5a6b45564d3a3a5f70726f766544697374696e637450656e6460448201527f696e6753746174653a2066696e616c4e65774261746368206d7573742062652060648201527f657175616c207468616e2063757272656e744c617374566572696669656442616084820152620e8c6d60eb1b60a482015260c401610a24565b6000614ca9898989858a610b43565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614cde9190615d4e565b602060405180830381855afa158015614cfb573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190614d1e9190615b20565b614d289190615d6a565b606b546040805160208101825283815290516343753b4d60e01b81529293506001600160a01b03909116916343753b4d91614d6c918a918a918a9190600401615d7e565b602060405180830381865afa158015614d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614dad9190615df8565b614e1f5760405162461bcd60e51b815260206004820152603760248201527f506f6c79676f6e5a6b45564d3a3a5f70726f766544697374696e637450656e6460448201527f696e6753746174653a20496e76616c69642070726f6f660000000000000000006064820152608401610a24565b6001600160401b038b166000908152607160205260409020600201548790036142405760405162461bcd60e51b815260206004820152605b60248201527f506f6c79676f6e5a6b45564d3a3a5f70726f766544697374696e637450656e6460448201527f696e6753746174653a2053746f72656420726f6f74206d75737420626520646960648201527f66666572656e74207468616e206e657720737461746520726f6f740000000000608482015260a401610a24565b60655460ff16614f4e5760405162461bcd60e51b815260206004820152603b60248201527f456d657267656e63794d616e616765723a3a6966456d657267656e637953746160448201527f74653a206f6e6c7920696620656d657267656e637920737461746500000000006064820152608401610a24565b6065805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6000614fd8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166151729092919063ffffffff16565b8051909150156150685780806020019051810190614ff69190615df8565b6150685760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a24565b505050565b6040516001600160a01b0383166024820152604481018290526150689084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401613bc9565b60655460ff161561513a5760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401610a24565b6065805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060615181848460008561518b565b90505b9392505050565b6060824710156152035760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a24565b6001600160a01b0385163b61525a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a24565b600080866001600160a01b031685876040516152769190615d4e565b60006040518083038185875af1925050503d80600081146152b3576040519150601f19603f3d011682016040523d82523d6000602084013e6152b8565b606091505b50915091506152c88282866152d3565b979650505050505050565b606083156152e2575081615184565b8251156152f25782518084602001fd5b8160405162461bcd60e51b8152600401610a249190615364565b60005b8381101561532757818101518382015260200161530f565b838111156138b65750506000910152565b6000815180845261535081602086016020860161530c565b601f01601f19169290920160200192915050565b6020815260006151846020830184615338565b60006020828403121561538957600080fd5b813561ffff8116811461518457600080fd5b80356001600160401b03811681146153b257600080fd5b919050565b600080600080600060a086880312156153cf57600080fd5b6153d88661539b565b94506153e66020870161539b565b94979496505050506040830135926060810135926080909101359150565b60006020828403121561541657600080fd5b6151848261539b565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156154575761545761541f565b60405290565b604051606081016001600160401b03811182821017156154575761545761541f565b604051601f8201601f191681016001600160401b03811182821017156154a7576154a761541f565b604052919050565b60006001600160401b038211156154c8576154c861541f565b5060051b60200190565b600082601f8301126154e357600080fd5b81356001600160401b038111156154fc576154fc61541f565b61550f601f8201601f191660200161547f565b81815284602083860101111561552457600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561555457600080fd5b82356001600160401b038082111561556b57600080fd5b818501915085601f83011261557f57600080fd5b813561559261558d826154af565b61547f565b81815260059190911b830184019084810190888311156155b157600080fd5b8585015b8381101561564a578035858111156155cd5760008081fd5b86016080818c03601f19018113156155e55760008081fd5b6155ed615435565b89830135888111156155ff5760008081fd5b61560d8e8c838701016154d2565b8252506040808401358b830152606061562781860161539b565b8284015261563684860161539b565b9083015250855250509186019186016155b5565b5098975050505050505050565b806040810183101561566857600080fd5b92915050565b806080810183101561566857600080fd5b6000806000806000806000806101a0898b03121561569c57600080fd5b6156a58961539b565b97506156b360208a0161539b565b96506156c160408a0161539b565b955060608901359450608089013593506156de8a60a08b01615657565b92506156ed8a60e08b0161566e565b91506156fd8a6101608b01615657565b90509295985092959890939650565b6001600160a01b0381168114611cd257600080fd5b600080600080600080600080888a036101c081121561573f57600080fd5b893561574a8161570c565b985060208a013561575a8161570c565b975060408a013561576a8161570c565b965060608a013561577a8161570c565b955060e0607f198201121561578e57600080fd5b5060808901935061016089013592506101808901356001600160401b03808211156157b857600080fd5b6157c48c838d016154d2565b93506101a08b01359150808211156157db57600080fd5b506157e88b828c016154d2565b9150509295985092959890939650565b60006020828403121561580a57600080fd5b81356151848161570c565b60008060008060008060008060006101c08a8c03121561583457600080fd5b61583d8a61539b565b985061584b60208b0161539b565b975061585960408b0161539b565b965061586760608b0161539b565b955060808a0135945060a08a013593506158848b60c08c01615657565b92506158948b6101008c0161566e565b91506158a48b6101808c01615657565b90509295985092959850929598565b6000602082840312156158c557600080fd5b5035919050565b8015158114611cd257600080fd5b6000602082840312156158ec57600080fd5b8135615184816158cc565b60006020828403121561590957600080fd5b81356001600160401b0381111561591f57600080fd5b61592b848285016154d2565b949350505050565b6000602080838503121561594657600080fd5b82356001600160401b038082111561595d57600080fd5b818501915085601f83011261597157600080fd5b813561597f61558d826154af565b81815260059190911b8301840190848101908883111561599e57600080fd5b8585015b8381101561564a578035858111156159ba5760008081fd5b86016060818c03601f19018113156159d25760008081fd5b6159da61545d565b89830135888111156159ec5760008081fd5b6159fa8e8c838701016154d2565b8252506040808401358b830152615a1283850161539b565b90820152855250509186019186016159a2565b60008060408385031215615a3857600080fd5b82356001600160401b03811115615a4e57600080fd5b615a5a858286016154d2565b95602094909401359450505050565b600181811c90821680615a7d57607f821691505b602082108103615a9d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60006001600160401b03808316818516808303821115615adb57615adb615aa3565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b60006001600160401b03808316818103615b1657615b16615aa3565b6001019392505050565b600060208284031215615b3257600080fd5b5051919050565b600060018201615b4b57615b4b615aa3565b5060010190565b60006001600160401b0383811690831681811015615b7257615b72615aa3565b039392505050565b600082821015615b8c57615b8c615aa3565b500390565b6000816000190483118215151615615bab57615bab615aa3565b500290565b601f82111561506857600081815260208120601f850160051c81016020861015615bd75750805b601f850160051c820191505b8181101561443857828155600101615be3565b81516001600160401b03811115615c0f57615c0f61541f565b615c2381615c1d8454615a69565b84615bb0565b602080601f831160018114615c585760008415615c405750858301515b600019600386901b1c1916600185901b178555614438565b600085815260208120601f198616915b82811015615c8757888601518255948401946001909101908401615c68565b5085821015615ca55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b600082615cda57615cda615cb5565b500490565b60008219821115615cf257615cf2615aa3565b500190565b8381526001600160a01b0383166020820152606060408201526000615d1f6060830184615338565b95945050505050565b60006001600160401b0380841680615d4257615d42615cb5565b92169190910492915050565b60008251615d6081846020870161530c565b9190910192915050565b600082615d7957615d79615cb5565b500690565b61012081016040808784376000838201818152879190815b6002811015615db657848483379084018281529284019290600101615d96565b5050828760c0870137610100850181815286935091505b6001811015615dec578251825260209283019290910190600101615dcd565b50505095945050505050565b600060208284031215615e0a57600080fd5b8151615184816158cc565b600181815b80851115615e50578160001904821115615e3657615e36615aa3565b80851615615e4357918102915b93841c9390800290615e1a565b509250929050565b600082615e6757506001615668565b81615e7457506000615668565b8160018114615e8a5760028114615e9457615eb0565b6001915050615668565b60ff841115615ea557615ea5615aa3565b50506001821b615668565b5060208310610133831016604e8410600b8410161715615ed3575081810a615668565b615edd8383615e15565b8060001904821115615ef157615ef1615aa3565b029392505050565b60006151848383615e5856fea2646970667358221220ea509bc505efc7dc646bd307099d94fdc965a048e39f3a02723bea443cbced3b64736f6c634300080f0033 \ No newline at end of file +6101406040523480156200001257600080fd5b5060405162004b7938038062004b798339810160408190526200003591620000a5565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b0391821661010052166101205262000131565b6001600160a01b03811681146200008557600080fd5b50565b80516001600160401b0381168114620000a057600080fd5b919050565b60008060008060008060c08789031215620000bf57600080fd5b8651620000cc816200006f565b6020880151909650620000df816200006f565b6040880151909550620000f2816200006f565b606088015190945062000105816200006f565b9250620001156080880162000088565b91506200012560a0880162000088565b90509295509295509295565b60805160a05160c05160e0516101005161012051614981620001f8600039600081816105de01528181610bc701526121bc0152600081816107160152610b9d0152600081816106dc0152818161263f015261366201526000818161082701528181610ef201528181611383015281816127650152818161291901528181612bd001526134360152600081816108c301528181612fa4015261396f0152600081816107cb0152818161168701528181611a7a015281816128ed015261306f01526149816000f3fe608060405234801561001057600080fd5b50600436106103835760003560e01c80638c3d7301116101de578063cfa8ed471161010f578063e7a7ed02116100ad578063f14916d61161007c578063f14916d61461090b578063f2fde38b1461091e578063f851a44014610931578063f8b823e41461094457600080fd5b8063e7a7ed02146108a4578063e8bf92ed146108be578063eaeb077b146108e5578063f020c93e146108f857600080fd5b8063d8d1091b116100e9578063d8d1091b1461085c578063d939b3151461086f578063dbc1697614610889578063e11f3f181461089157600080fd5b8063cfa8ed4714610808578063d02103ca14610822578063d2e129f91461084957600080fd5b8063ada8f9191161017c578063b4d63f5811610156578063b4d63f5814610766578063b6b0b097146107c6578063c0ed84e0146107ed578063c89e42df146107f557600080fd5b8063ada8f919146106fe578063adc879e914610711578063afd23cbe1461073857600080fd5b80639c9f3dfe116101b85780639c9f3dfe146106a95780639f0d039d146106bc578063a066215c146106c4578063a3c573eb146106d757600080fd5b80638c3d7301146106885780638da5cb5b1461069057806399f5634e146106a157600080fd5b80634a1a89a7116102b8578063715018a6116102565780637fcb3653116102305780637fcb3653146105c6578063831c7ead146105d9578063837a473814610600578063841b24d71461066e57600080fd5b8063715018a6146105985780637215541a146105a057806375c508b3146105b357600080fd5b8063542028d511610292578063542028d51461054a5780635e9145c9146105525780636b8616ce146105655780636ff512cc1461058557600080fd5b80634a1a89a7146104ef5780634a910e6a146105095780635392c5e01461051c57600080fd5b80632987898311610325578063423fa856116102ff578063423fa8561461049557806345605267146104af578063458c0477146104c95780634834a343146104dc57600080fd5b80632987898314610455578063383b3be81461046f578063394218e91461048257600080fd5b80631816b7e5116103615780631816b7e5146103ef57806319d8ac6114610404578063220d789914610417578063267822471461042a57600080fd5b80630a0d9fbe14610388578063107bf28c146103bd57806315064c96146103d2575b600080fd5b606f546103a09061010090046001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6103c561094d565b6040516103b49190613ecc565b606f546103df9060ff1681565b60405190151581526020016103b4565b6104026103fd366004613edf565b6109db565b005b6073546103a0906001600160401b031681565b6103c5610425366004613f1f565b610ab9565b607b5461043d906001600160a01b031681565b6040516001600160a01b0390911681526020016103b4565b60745461043d90600160401b90046001600160a01b031681565b6103df61047d366004613f6c565b610c25565b610402610490366004613f6c565b610c6c565b6073546103a090600160401b90046001600160401b031681565b6073546103a090600160801b90046001600160401b031681565b6079546103a0906001600160401b031681565b6104026104ea366004613faf565b610d84565b6079546103a090600160401b90046001600160401b031681565b610402610517366004613f6c565b611060565b61053c61052a366004613f6c565b60756020526000908152604090205481565b6040519081526020016103b4565b6103c56110e8565b61040261056036600461409e565b6110f5565b61053c610573366004613f6c565b60716020526000908152604090205481565b6104026105933660046140f1565b6116f7565b610402611791565b6104026105ae366004613f6c565b6117a5565b6104026105c136600461410c565b6118fd565b6074546103a0906001600160401b031681565b6103a07f000000000000000000000000000000000000000000000000000000000000000081565b61064361060e3660046141aa565b6078602052600090815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b0395861681529490931660208501529183015260608201526080016103b4565b6079546103a090600160c01b90046001600160401b031681565b610402611998565b6033546001600160a01b031661043d565b61053c611a3f565b6104026106b7366004613f6c565b611b62565b60705461053c565b6104026106d2366004613f6c565b611c6e565b61043d7f000000000000000000000000000000000000000000000000000000000000000081565b61040261070c3660046140f1565b611d36565b6103a07f000000000000000000000000000000000000000000000000000000000000000081565b606f54610753906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103b4565b6107a1610774366004613f6c565b607260205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b0392831660208501529116908201526060016103b4565b61043d7f000000000000000000000000000000000000000000000000000000000000000081565b6103a0611dbc565b610402610803366004614265565b611e09565b606f5461043d90600160581b90046001600160a01b031681565b61043d7f000000000000000000000000000000000000000000000000000000000000000081565b6104026108573660046142e2565b611e70565b61040261086a366004614394565b612244565b6079546103a090600160801b90046001600160401b031681565b610402612612565b61040261089f36600461410c565b6126b8565b6073546103a090600160c01b90046001600160401b031681565b61043d7f000000000000000000000000000000000000000000000000000000000000000081565b6104026108f33660046143d5565b612851565b610402610906366004613faf565b612b24565b6104026109193660046140f1565b612c71565b61040261092c3660046140f1565b612d0b565b607a5461043d906001600160a01b031681565b61053c60705481565b6077805461095a90614420565b80601f016020809104026020016040519081016040528092919081815260200182805461098690614420565b80156109d35780601f106109a8576101008083540402835291602001916109d3565b820191906000526020600020905b8154815290600101906020018083116109b657829003601f168201915b505050505081565b607a546001600160a01b03163314610a0657604051634755657960e01b815260040160405180910390fd5b6103e88161ffff161080610a1f57506103ff8161ffff16115b15610a56576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80546affff0000000000000000001916690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086166000818152607260205260408082205493881682529020546060929115801590610aec575081155b15610b23576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610b5a576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516bffffffffffffffffffffffff193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b6079546001600160401b0382811660009081526078602052604081205490924292610c5b92600160801b90920481169116614470565b6001600160401b0316111592915050565b607a546001600160a01b03163314610c9757604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610cc457604051631d06e87960e01b815260040160405180910390fd5b606f5460ff16610d1d576079546001600160401b03600160c01b909104811690821610610d1d576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b6001600160401b038416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610aae565b606f5460ff1615610da857604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b038781166000908152607260205260409020600101544292610ddf92600160c01b90910481169116614470565b6001600160401b03161115610e20576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8610e2d8888614497565b6001600160401b03161115610e5557604051635acfba9d60e11b815260040160405180910390fd5b610e658888888888888888612d98565b610e6e866130a4565b607954600160801b90046001600160401b0316600003610f5b576074805467ffffffffffffffff19166001600160401b0388811691821790925560009081526075602052604090208590556079541615610edc57607980546fffffffffffffffffffffffffffffffff191690555b6040516333d6247d60e01b8152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015610f3e57600080fd5b505af1158015610f52573d6000803e3d6000fd5b50505050611015565b610f63613298565b607980546001600160401b0316906000610f7c836144b7565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b8152607954871660009081526078909352949091209251835492518616600160401b026fffffffffffffffffffffffffffffffff199093169516949094171781559151600183015551600290910155505b60405184815233906001600160401b038816907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966906020015b60405180910390a35050505050505050565b607454600160401b90046001600160a01b031633146110dc57606f5460ff161561109d57604051630bc011ff60e21b815260040160405180910390fd5b6110a681610c25565b6110dc576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110e581613338565b50565b6076805461095a90614420565b606f5460ff161561111957604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b03163314611164576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036111875760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156111aa57604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b82048116600081815260726020526040812054838516949293600160801b909304909216919082905b868110156115415760008a8a838181106111ff576111ff6144dd565b905060200281019061121191906144f3565b61121a90614513565b805180516020909101206060820151919250906001600160401b0316156113405785611245816144b7565b9650506000818360200151846060015160405160200161128593929190928352602083019190915260c01b6001600160c01b031916604082015260480190565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152607190935291205490915081146112d65760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b03808816600090815260716020526040808220919091556060850151908501519082169116101561133a576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611457565b6020820151158015906113fa575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af11580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f8919061459f565b155b15611431576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815151620493e01015611457576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b0316108061148757504282604001516001600160401b0316115b156114be576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b6001600160c01b03191660808301528b901b6bffffffffffffffffffffffff19166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611539906145b8565b9150506111e3565b5061154c8685614470565b6073549094506001600160401b03600160c01b909104811690841611156115865760405163c630a00d60e01b815260040160405180910390fd5b60006115928285614497565b6115a5906001600160401b0316886145d1565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585166fffffffffffffffffffffffffffffffff199384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611664576073805467ffffffffffffffff60801b1916600160801b6001600160401b038716021790555b6116af33308361167360705490565b61167d91906145e4565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169291906134f0565b6116b7613298565b6040516001600160401b038616907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b607a546001600160a01b0316331461172257604051634755657960e01b815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff16600160581b6001600160a01b038416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610aae565b6117996135a7565b6117a36000613601565b565b6033546001600160a01b031633146118f55760006117c1611dbc565b9050806001600160401b0316826001600160401b03161161180e576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6073546001600160401b03600160401b9091048116908316118061184d57506001600160401b0380831660009081526072602052604090206001015416155b15611884576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160401b0380831660009081526072602052604090206001015442916118b29162093a809116614470565b6001600160401b031611156118f3576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6110e5613660565b606f5460ff161561192157604051630bc011ff60e21b815260040160405180910390fd5b6119328989898989898989896136db565b6001600160401b0386166000908152607560209081526040918290205482519081529081018690527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161198d613660565b505050505050505050565b607b546001600160a01b031633146119dc576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0390921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae5919061459f565b90506000611af1611dbc565b6073546001600160401b03600160401b8204811691611b2191600160801b8204811691600160c01b900416614497565b611b2b9190614470565b611b359190614497565b6001600160401b0316905080600003611b515760009250505090565b611b5b8183614611565b9250505090565b607a546001600160a01b03163314611b8d57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115611bba57604051630cc9650760e41b815260040160405180910390fd5b606f5460ff16611c13576079546001600160401b03600160801b909104811690821610611c13576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805467ffffffffffffffff60801b1916600160801b6001600160401b038416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610aae565b607a546001600160a01b03163314611c9957604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b03161115611cdf576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f805468ffffffffffffffff0019166101006001600160401b038416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610aae565b607a546001600160a01b03163314611d6157604051634755657960e01b815260040160405180910390fd5b607b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610aae565b6079546000906001600160401b031615611df957506079546001600160401b03908116600090815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b03163314611e3457604051634755657960e01b815260040160405180910390fd5b6076611e408282614673565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610aae9190613ecc565b600054610100900460ff1615808015611e905750600054600160ff909116105b80611eaa5750303b158015611eaa575060005460ff166001145b611f215760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b6000805460ff191660011790558015611f44576000805461ff0019166101001790555b611f5160208801886140f1565b607a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055611f8e60408801602089016140f1565b606f80546001600160a01b0392909216600160581b027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055611fde60808801606089016140f1565b607480546001600160a01b0392909216600160401b027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad86905560766120578682614673565b5060776120648582614673565b5062093a806120796060890160408a01613f6c565b6001600160401b031611156120a157604051630cc9650760e41b815260040160405180910390fd5b6120b16060880160408901613f6c565b607980546001600160401b0392909216600160801b0267ffffffffffffffff60801b1990921691909117905562093a806120f160a0890160808a01613f6c565b6001600160401b0316111561211957604051631d06e87960e01b815260040160405180910390fd5b61212960a0880160808901613f6c565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b6001600160401b039390931692909202919091179055670de0b6b3a7640000607055606f80546affffffffffffffffffff0019166a03ea000000000000070800179055612197613a5c565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f000000000000000000000000000000000000000000000000000000000000000085856040516121ed949392919061475b565b60405180910390a1801561223b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b606f5460ff161561226857604051630bc011ff60e21b815260040160405180910390fd5b80600081900361228b5760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156122ae57604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b82048116916122d6918491600160801b900416614792565b11156122f55760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481166000818152607260205260408120549193600160801b9004909216915b848110156124fc576000878783818110612342576123426144dd565b905060200281019061235491906147a5565b61235d906147bb565b905083612369816144b7565b825180516020918201208185015160408087015190519499509194506000936123b39386939101928352602083019190915260c01b6001600160c01b031916604082015260480190565b60408051601f1981840301815291815281516020928301206001600160401b0389166000908152607190935291205490915081146124045760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386166000908152607160205260408120556124286001896145d1565b840361248357426206978084604001516124429190614470565b6001600160401b03161115612483576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b6001600160c01b031916608083015233901b6bffffffffffffffffffffffff19166088820152609c0160405160208183030381529060405280519060200120945050505080806124f4906145b8565b915050612326565b506125078484614470565b607380546001600160401b0342811667ffffffffffffffff199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686026fffffffffffffffffffffffffffffffff1990921693871693909317179091558554938916600160801b0267ffffffffffffffff60801b19938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b0316331461263d57604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561269857600080fd5b505af11580156126ac573d6000803e3d6000fd5b505050506117a3613ae2565b607454600160401b90046001600160a01b031633146126ea5760405163bbcbbc0560e01b815260040160405180910390fd5b6126fb8989898989898989896136db565b6074805467ffffffffffffffff19166001600160401b038881169182179092556000908152607560205260409020859055607954161561274f57607980546fffffffffffffffffffffffffffffffff191690555b6040516333d6247d60e01b8152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b1580156127b157600080fd5b505af11580156127c5573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a80000000000000000000000000000000000000000000000000179055505060405184815233906001600160401b038816907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a3505050505050505050565b606f5460ff161561287557604051630bc011ff60e21b815260040160405180910390fd5b600061288060705490565b9050818111156128bc576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620493e08311156128e0576040516328a69b1f60e21b815260040160405180910390fd5b6129156001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330846134f0565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612975573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612999919061459f565b60738054919250600160c01b9091046001600160401b03169060186129bd836144b7565b91906101000a8154816001600160401b0302191690836001600160401b031602179055505084846040516129f2929190614836565b60408051918290038220602083015281018290526001600160c01b03194260c01b16606082015260680160408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b031660009081526071909352912055323303612ac057607354604080518381523360208201526060918101829052600091810191909152600160c01b9091046001600160401b0316907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612b1d565b607360189054906101000a90046001600160401b03166001600160401b03167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612b149493929190614846565b60405180910390a25b5050505050565b607454600160401b90046001600160a01b03163314612b565760405163bbcbbc0560e01b815260040160405180910390fd5b612b668888888888888888612d98565b6074805467ffffffffffffffff19166001600160401b0388811691821790925560009081526075602052604090208590556079541615612bba57607980546fffffffffffffffffffffffffffffffff191690555b6040516333d6247d60e01b8152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015612c1c57600080fd5b505af1158015612c30573d6000803e3d6000fd5b50506040518681523392506001600160401b03891691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200161104e565b607a546001600160a01b03163314612c9c57604051634755657960e01b815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff16600160401b6001600160a01b038416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610aae565b612d136135a7565b6001600160a01b038116612d8f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401611f18565b6110e581613601565b600080612da3611dbc565b90506001600160401b038a1615612e39576079546001600160401b03908116908b161115612de45760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808b1660009081526078602052604090206002810154815490945090918b8116600160401b9092041614612e3357604051632bd2e3e760e01b815260040160405180910390fd5b50612ea5565b6001600160401b038916600090815260756020526040902054915081612e72576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316896001600160401b03161115612ea557604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611612ef0576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612eff8a8a8a868b610ab9565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051612f34919061486f565b602060405180830381855afa158015612f51573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190612f74919061459f565b612f7e9190614881565b6040805160208101825282815290516343753b4d60e01b81529192506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916343753b4d91612fde918b918b918b9190600401614895565b602060405180830381865afa158015612ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061301f9190614903565b61303c576040516309bde33960e01b815260040160405180910390fd5b6130963361304a858d614497565b6001600160401b031661305b611a3f565b61306591906145e4565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190613b53565b505050505050505050505050565b60006130ae611dbc565b9050816000806130be8484614497565b606f546001600160401b0391821692506000916130e191610100900416426145d1565b90505b846001600160401b0316846001600160401b031614613181576001600160401b038085166000908152607260205260409020600181015490911682101561317557600181015461314490600160401b90046001600160401b031686614497565b613157906001600160401b031685614792565b6001820154600160401b90046001600160401b03169550935061317b565b50613181565b506130e4565b600061318d84846145d1565b9050808410156131e457838103600c81116131a857806131ab565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816131da576131da6145fb565b0460705550613254565b808403600c81116131f557806131f8565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161322f5761322f6145fb565b04905080607054670de0b6b3a7640000028161324d5761324d6145fb565b0460705550505b683635c9adc5dea00000607054111561327957683635c9adc5dea0000060705561223b565b633b9aca00607054101561223b57633b9aca0060705550505050505050565b6079546001600160401b03600160401b82048116911611156117a3576079546000906132d590600160401b90046001600160401b03166001614470565b90506132e081610c25565b156110e5576079546000906002906133029084906001600160401b0316614497565b61330c9190614925565b6133169083614470565b905061332181610c25565b156133335761332f81613338565b5050565b61332f825b6079546001600160401b03600160401b909104811690821611158061336b57506079546001600160401b03908116908216115b156133a2576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160401b038181166000818152607860209081526040808320805460748054600160401b9283900490981667ffffffffffffffff1990981688179055600282015487865260759094529382902092909255607980546fffffffffffffffff000000000000000019169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b15801561348257600080fd5b505af1158015613496573d6000803e3d6000fd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516134e391815260200190565b60405180910390a3505050565b6040516001600160a01b03808516602483015283166044820152606481018290526135a19085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613ba1565b50505050565b6033546001600160a01b031633146117a35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611f18565b603380546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156136bb57600080fd5b505af11580156136cf573d6000803e3d6000fd5b505050506117a3613c86565b60006001600160401b038a161561376f576079546001600160401b03908116908b16111561371c5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808a1660009081526078602052604090206002810154815490928a8116600160401b909204161461376957604051632bd2e3e760e01b815260040160405180910390fd5b506137d7565b506001600160401b038716600090815260756020526040902054806137a7576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b0390811690891611156137d757604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b03908116908a1611806138065750896001600160401b0316896001600160401b031611155b8061382757506079546001600160401b03600160401b9091048116908a1611155b1561385e576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160401b03898116600090815260786020526040902054600160401b90048116908816146138bb576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006138ca898989858a610ab9565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516138ff919061486f565b602060405180830381855afa15801561391c573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061393f919061459f565b6139499190614881565b6040805160208101825282815290516343753b4d60e01b81529192506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916343753b4d916139a9918a918a918a9190600401614895565b602060405180830381865afa1580156139c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ea9190614903565b613a07576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038b16600090815260786020526040902060020154879003613096576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16613ad95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611f18565b6117a333613601565b606f5460ff16613b1e576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6040516001600160a01b038316602482015260448101829052613b9c9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161353d565b505050565b6000613bf6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613ce29092919063ffffffff16565b805190915015613b9c5780806020019051810190613c149190614903565b613b9c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611f18565b606f5460ff1615613caa57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060613cf18484600085613cfb565b90505b9392505050565b606082471015613d735760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401611f18565b6001600160a01b0385163b613dca5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611f18565b600080866001600160a01b03168587604051613de6919061486f565b60006040518083038185875af1925050503d8060008114613e23576040519150601f19603f3d011682016040523d82523d6000602084013e613e28565b606091505b5091509150613e38828286613e43565b979650505050505050565b60608315613e52575081613cf4565b825115613e625782518084602001fd5b8160405162461bcd60e51b8152600401611f189190613ecc565b60005b83811015613e97578181015183820152602001613e7f565b50506000910152565b60008151808452613eb8816020860160208601613e7c565b601f01601f19169290920160200192915050565b602081526000613cf46020830184613ea0565b600060208284031215613ef157600080fd5b813561ffff81168114613cf457600080fd5b80356001600160401b0381168114613f1a57600080fd5b919050565b600080600080600060a08688031215613f3757600080fd5b613f4086613f03565b9450613f4e60208701613f03565b94979496505050506040830135926060810135926080909101359150565b600060208284031215613f7e57600080fd5b613cf482613f03565b8060408101831015613f9857600080fd5b92915050565b8060808101831015613f9857600080fd5b6000806000806000806000806101a0898b031215613fcc57600080fd5b613fd589613f03565b9750613fe360208a01613f03565b9650613ff160408a01613f03565b9550606089013594506080890135935061400e8a60a08b01613f87565b925061401d8a60e08b01613f9e565b915061402d8a6101608b01613f87565b90509295985092959890939650565b60008083601f84011261404e57600080fd5b5081356001600160401b0381111561406557600080fd5b6020830191508360208260051b850101111561408057600080fd5b9250929050565b80356001600160a01b0381168114613f1a57600080fd5b6000806000604084860312156140b357600080fd5b83356001600160401b038111156140c957600080fd5b6140d58682870161403c565b90945092506140e8905060208501614087565b90509250925092565b60006020828403121561410357600080fd5b613cf482614087565b60008060008060008060008060006101c08a8c03121561412b57600080fd5b6141348a613f03565b985061414260208b01613f03565b975061415060408b01613f03565b965061415e60608b01613f03565b955060808a0135945060a08a0135935061417b8b60c08c01613f87565b925061418b8b6101008c01613f9e565b915061419b8b6101808c01613f87565b90509295985092959850929598565b6000602082840312156141bc57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126141ea57600080fd5b81356001600160401b0380821115614204576142046141c3565b604051601f8301601f19908116603f0116810190828211818310171561422c5761422c6141c3565b8160405283815286602085880101111561424557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561427757600080fd5b81356001600160401b0381111561428d57600080fd5b614299848285016141d9565b949350505050565b60008083601f8401126142b357600080fd5b5081356001600160401b038111156142ca57600080fd5b60208301915083602082850101111561408057600080fd5b6000806000806000808688036101208112156142fd57600080fd5b60a081121561430b57600080fd5b5086955060a0870135945060c08701356001600160401b038082111561433057600080fd5b61433c8a838b016141d9565b955060e089013591508082111561435257600080fd5b61435e8a838b016141d9565b945061010089013591508082111561437557600080fd5b5061438289828a016142a1565b979a9699509497509295939492505050565b600080602083850312156143a757600080fd5b82356001600160401b038111156143bd57600080fd5b6143c98582860161403c565b90969095509350505050565b6000806000604084860312156143ea57600080fd5b83356001600160401b0381111561440057600080fd5b61440c868287016142a1565b909790965060209590950135949350505050565b600181811c9082168061443457607f821691505b60208210810361445457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156144905761449061445a565b5092915050565b6001600160401b038281168282160390808211156144905761449061445a565b60006001600160401b038083168181036144d3576144d361445a565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261450957600080fd5b9190910192915050565b60006080823603121561452557600080fd5b604051608081016001600160401b038282108183111715614548576145486141c3565b81604052843591508082111561455d57600080fd5b5061456a368286016141d9565b8252506020830135602082015261458360408401613f03565b604082015261459460608401613f03565b606082015292915050565b6000602082840312156145b157600080fd5b5051919050565b6000600182016145ca576145ca61445a565b5060010190565b81810381811115613f9857613f9861445a565b8082028115828204841417613f9857613f9861445a565b634e487b7160e01b600052601260045260246000fd5b600082614620576146206145fb565b500490565b601f821115613b9c57600081815260208120601f850160051c8101602086101561464c5750805b601f850160051c820191505b8181101561466b57828155600101614658565b505050505050565b81516001600160401b0381111561468c5761468c6141c3565b6146a08161469a8454614420565b84614625565b602080601f8311600181146146d557600084156146bd5750858301515b600019600386901b1c1916600185901b17855561466b565b600085815260208120601f198616915b82811015614704578886015182559484019460019091019084016146e5565b50858210156147225787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006001600160401b03808716835280861660208401525060606040830152614788606083018486614732565b9695505050505050565b80820180821115613f9857613f9861445a565b60008235605e1983360301811261450957600080fd5b6000606082360312156147cd57600080fd5b604051606081016001600160401b0382821081831117156147f0576147f06141c3565b81604052843591508082111561480557600080fd5b50614812368286016141d9565b8252506020830135602082015261482b60408401613f03565b604082015292915050565b8183823760009101908152919050565b8481526001600160a01b0384166020820152606060408201526000614788606083018486614732565b60008251614509818460208701613e7c565b600082614890576148906145fb565b500690565b61012081016040808784378083018660005b60028110156148c4578382843791830191908301906001016148a7565b505050808560c08501375061010082018360005b60018110156148f75781518352602092830192909101906001016148d8565b50505095945050505050565b60006020828403121561491557600080fd5b81518015158114613cf457600080fd5b60006001600160401b038084168061493f5761493f6145fb565b9216919091049291505056fea264697066735822122072ed050d1998118630bb876e7055794a22f8bedaec013380c1d9e72b528968db64736f6c63430008110033 \ No newline at end of file diff --git a/etherman/smartcontracts/bin/polygonzkevmbridge.bin b/etherman/smartcontracts/bin/polygonzkevmbridge.bin index f8848682d7..2e7b4e7e84 100644 --- a/etherman/smartcontracts/bin/polygonzkevmbridge.bin +++ b/etherman/smartcontracts/bin/polygonzkevmbridge.bin @@ -1 +1 @@ -608060405234801561001057600080fd5b50614f9c806100206000396000f3fe608060405260043610620001ab5760003560e01c80637b6323c111620000e7578063d02103ca1162000089578063ed6be5c91162000060578063ed6be5c91462000512578063ee25560b1462000529578063ff634ed7146200055a57600080fd5b8063d02103ca14620004c1578063d96a15f714620004e3578063dbc1697614620004fa57600080fd5b8063a08e8a0811620000be578063a08e8a081462000438578063aaa13cc21462000462578063bab161bf146200048757600080fd5b80637b6323c114620003b457806381b1c17414620003d95780639e34070f146200041357600080fd5b806334ac9cf211620001515780633e19704311620001285780633e197043146200034557806346385549146200036a578063647c576c146200038f57600080fd5b806334ac9cf214620002e65780633ae0504714620003085780633da81682146200032057600080fd5b806322e95f2c116200018657806322e95f2c14620002125780632dfdf0b51462000250578063318aee3d146200027757600080fd5b80630871e97114620001b057806315064c9614620001c95780632072f6c514620001fa575b600080fd5b620001c7620001c136600462002b6e565b62000571565b005b348015620001d657600080fd5b50602254620001e59060ff1681565b60405190151581526020015b60405180910390f35b3480156200020757600080fd5b50620001c762000a9e565b3480156200021f57600080fd5b50620002376200023136600462002bfb565b62000b2c565b6040516001600160a01b039091168152602001620001f1565b3480156200025d57600080fd5b506200026860215481565b604051908152602001620001f1565b3480156200028457600080fd5b50620002c16200029636600462002c37565b60256020526000908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001f1565b348015620002f357600080fd5b5060275462000237906001600160a01b031681565b3480156200031557600080fd5b506200026862000ba8565b3480156200032d57600080fd5b50620001e56200033f36600462002d1f565b62000c9b565b3480156200035257600080fd5b50620002686200036436600462002d9d565b62000d9b565b3480156200037757600080fd5b50620001c76200038936600462002eae565b62000e45565b3480156200039c57600080fd5b50620001c7620003ae36600462002f95565b6200108e565b348015620003c157600080fd5b50620001c7620003d336600462002eae565b62001214565b348015620003e657600080fd5b5062000237620003f836600462002fe5565b6024602052600090815260409020546001600160a01b031681565b3480156200042057600080fd5b50620001e56200043236600462002fe5565b62001741565b3480156200044557600080fd5b506200044f600081565b60405160ff9091168152602001620001f1565b3480156200046f57600080fd5b50620002376200048136600462002fff565b62001786565b3480156200049457600080fd5b50602254620004ab90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001f1565b348015620004ce57600080fd5b5060265462000237906001600160a01b031681565b620001c7620004f4366004620030b3565b620018da565b3480156200050757600080fd5b50620001c762001ae6565b3480156200051f57600080fd5b50620004ab600081565b3480156200053657600080fd5b50620002686200054836600462002fe5565b60236020526000908152604090205481565b3480156200056757600080fd5b506200044f600181565b60225460ff1615620005fb5760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a4015b60405180910390fd5b60225463ffffffff610100909104811690861603620006835760405162461bcd60e51b815260206004820152603d60248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2044657374696e6174696f6e2063616e6e6f7420626520697473656c660000006064820152608401620005f2565b60008060606001600160a01b0389166200073f57853414620007355760405162461bcd60e51b8152602060048201526044602482018190527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a908201527f20416d6f756e7420646f6573206e6f74206d61746368206d6573736167652e7660648201527f616c756500000000000000000000000000000000000000000000000000000000608482015260a401620005f2565b60009150620009b8565b6001600160a01b03808a1660009081526025602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562000815576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018890526001600160a01b038b1690639dc29fac90604401600060405180830381600087803b158015620007e857600080fd5b505af1158015620007fd573d6000803e3d6000fd5b505050508060200151935080600001519250620009b6565b84156200082a576200082a8a88888862001b72565b620008416001600160a01b038b1633308a62002132565b899350602260019054906101000a900463ffffffff169250896001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000898573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620008c291908101906200319e565b8a6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000901573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200092b91908101906200319e565b8b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200096a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009909190620031d7565b604051602001620009a49392919062003225565b60405160208183030381529060405291505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600083858b8b8b87602154604051620009fa98979695949392919062003262565b60405180910390a162000a2562000a1f600084868c8c8c888051906020012062000d9b565b620021b8565b6026546001600160a01b03166333d6247d62000a4062000ba8565b6040518263ffffffff1660e01b815260040162000a5f91815260200190565b600060405180830381600087803b15801562000a7a57600080fd5b505af115801562000a8f573d6000803e3d6000fd5b50505050505050505050505050565b6027546001600160a01b0316331462000b205760405162461bcd60e51b815260206004820152603a60248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c79506f6c79676f6e5a6b45564d3a2060448201527f6f6e6c7920506f6c79676f6e5a6b45564d20636f6e74726163740000000000006064820152608401620005f2565b62000b2a6200231c565b565b600060246000848460405160200162000b7092919060e09290921b6001600160e01b031916825260601b6bffffffffffffffffffffffff1916600482015260180190565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b602154600090819081805b602081101562000c92578260011660010362000c13576001816020811062000bdf5762000bdf620032ce565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000c40565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b62000c4d60028462003310565b6040805160208101859052908101849052909350606001604051602081830303815290604052805190602001209150808062000c899062003327565b91505062000bb3565b50919392505050565b60008467ffffffffffffffff8416825b602081101562000d8e578160011660010362000d185786818151811062000cd65762000cd6620032ce565b60200260200101518360405160200162000cfa929190918252602082015260400190565b60405160208183030381529060405280519060200120925062000d6a565b8287828151811062000d2e5762000d2e620032ce565b602002602001015160405160200162000d51929190918252602082015260400190565b6040516020818303038152906040528051906020012092505b62000d7760028362003310565b91508062000d858162003327565b91505062000cab565b5050909114949350505050565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b60225460ff161562000ecb5760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401620005f2565b62000ee18a8a8a8a8a8a8a8a8a8a6001620023da565b62000ef28963ffffffff16620026fa565b6000836001600160a01b03168387898560405160240162000f169392919062003343565b60408051601f198184030181529181526020820180516001600160e01b03167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162000f6691906200337c565b60006040518083038185875af1925050503d806000811462000fa5576040519150601f19603f3d011682016040523d82523d6000602084013e62000faa565b606091505b5050905080620010235760405162461bcd60e51b815260206004820152603060248201527f506f6c79676f6e5a6b45564d4272696467653a3a636c61696d4d65737361676560448201527f3a204d657373616765206661696c6564000000000000000000000000000000006064820152608401620005f2565b6040805163ffffffff8c81168252891660208201526001600160a01b0388811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b600054610100900460ff1615808015620010af5750600054600160ff909116105b80620010cb5750303b158015620010cb575060005460ff166001145b6200113f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401620005f2565b6000805460ff19166001179055801562001163576000805461ff0019166101001790555b6022805463ffffffff86166101000264ffffffff0019909116179055602680546001600160a01b038086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255602780549285169290911691909117905580156200120e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60225460ff16156200129a5760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401620005f2565b620012b08a8a8a8a8a8a8a8a8a8a6000620023da565b620012c18963ffffffff16620026fa565b6001600160a01b038516620013c057604080516000808252602082019092526001600160a01b038516908490604051620012fc91906200337c565b60006040518083038185875af1925050503d80600081146200133b576040519150601f19603f3d011682016040523d82523d6000602084013e62001340565b606091505b5050905080620013b95760405162461bcd60e51b815260206004820152603560248201527f506f6c79676f6e5a6b45564d4272696467653a3a636c61696d41737365743a2060448201527f4574686572207472616e73666572206661696c656400000000000000000000006064820152608401620005f2565b50620016d7565b60225463ffffffff610100909104811690871603620013f557620013ef6001600160a01b03861684846200273c565b620016d7565b6040516001600160e01b031960e088901b1660208201526bffffffffffffffffffffffff19606087901b16602482015260009060380160408051601f198184030181529181528151602092830120600081815260249093529120549091506001600160a01b0316806200166f576000806000858060200190518101906200147d91906200339a565b925092509250600085848484604051620014979062002ad4565b620014a59392919062003225565b8190604051809103906000f5905080158015620014c6573d6000803e3d6000fd5b506040516340c10f1960e01b81526001600160a01b038b81166004830152602482018b9052919250908216906340c10f1990604401600060405180830381600087803b1580156200151657600080fd5b505af11580156200152b573d6000803e3d6000fd5b50505050806024600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808d63ffffffff1681526020018c6001600160a01b031681525060256000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507fccd7715648d1f2bb13e158f96b5b6c3aeda555d4cb87112e274a6f28bc571d598c8c836040516200165d9392919063ffffffff9390931683526001600160a01b03918216602084015216604082015260600190565b60405180910390a150505050620016d4565b6040516340c10f1960e01b81526001600160a01b038681166004830152602482018690528216906340c10f1990604401600060405180830381600087803b158015620016ba57600080fd5b505af1158015620016cf573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8b81168252881660208201526001600160a01b0387811682840152851660608201526080810184905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a150505050505050505050565b600080620017526101008462003310565b90506000620017646101008562003410565b60009283526023602052604090922054600190921b9182169091149392505050565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620017f19062002ad4565b601f1982820381018352601f9091011660408190526200181e908d908d908d908d908d9060200162003450565b60408051601f19818403018152908290526200183e929160200162003491565b60405160208183030381529060405280519060200120604051602001620018b494939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60225460ff1615620019605760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401620005f2565b60225463ffffffff610100909104811690841603620019e85760405162461bcd60e51b815260206004820152603f60248201527f506f6c79676f6e5a6b45564d4272696467653a3a6272696467654d657373616760448201527f653a2044657374696e6174696f6e2063616e6e6f7420626520697473656c66006064820152608401620005f2565b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001602260019054906101000a900463ffffffff16338686348760215460405162001a3c98979695949392919062003262565b60405180910390a162001a7362000a1f6001602260019054906101000a900463ffffffff1633878734888051906020012062000d9b565b6026546001600160a01b03166333d6247d62001a8e62000ba8565b6040518263ffffffff1660e01b815260040162001aad91815260200190565b600060405180830381600087803b15801562001ac857600080fd5b505af115801562001add573d6000803e3d6000fd5b50505050505050565b6027546001600160a01b0316331462001b685760405162461bcd60e51b815260206004820152603a60248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c79506f6c79676f6e5a6b45564d3a2060448201527f6f6e6c7920506f6c79676f6e5a6b45564d20636f6e74726163740000000000006064820152608401620005f2565b62000b2a62002787565b600062001bb583838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506200283692505050565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b031982160162001e8a57600080808080808062001c00896004818d620034c4565b81019062001c0f9190620034f0565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001ca65760405162461bcd60e51b815260206004820152603c60248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2050657260448201527f6d6974206f776e6572206d757374206265207468652073656e646572000000006064820152608401620005f2565b6001600160a01b038616301462001d265760405162461bcd60e51b815260206004820152603360248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2053706560448201527f6e646572206d75737420626520277468697327000000000000000000000000006064820152608401620005f2565b8a851462001d9d5760405162461bcd60e51b815260206004820152603960248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2050657260448201527f6d697420616d6f756e7420646f6573206e6f74206d61746368000000000000006064820152608401620005f2565b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162001e3691906200337c565b6000604051808303816000865af19150503d806000811462001e75576040519150601f19603f3d011682016040523d82523d6000602084013e62001e7a565b606091505b505050505050505050506200212b565b6001600160e01b031981166323f2ebc360e21b1462001f125760405162461bcd60e51b815260206004820152602b60248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a204e6f7460448201527f2076616c69642063616c6c0000000000000000000000000000000000000000006064820152608401620005f2565b60008080808080808062001f2a8a6004818e620034c4565b81019062001f3991906200355a565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001fd25760405162461bcd60e51b815260206004820152603c60248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2050657260448201527f6d6974206f776e6572206d757374206265207468652073656e646572000000006064820152608401620005f2565b6001600160a01b0387163014620020525760405162461bcd60e51b815260206004820152603360248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2053706560448201527f6e646572206d75737420626520277468697327000000000000000000000000006064820152608401620005f2565b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691620020db91906200337c565b6000604051808303816000865af19150503d80600081146200211a576040519150601f19603f3d011682016040523d82523d6000602084013e6200211f565b606091505b50505050505050505050505b5050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526200120e9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526200283d565b806001620021c960206002620036e3565b620021d59190620036f1565b602154106200224d5760405162461bcd60e51b815260206004820152602a60248201527f4465706f736974436f6e74726163743a5f6465706f7369743a204d65726b6c6560448201527f20747265652066756c6c000000000000000000000000000000000000000000006064820152608401620005f2565b6001602160008282546200226291906200370b565b909155505060215460005b60208110156200230c5781600116600103620022a25782600182602081106200229a576200229a620032ce565b015550505050565b60018160208110620022b857620022b8620032ce565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250600282620022f5919062003310565b915080620023038162003327565b9150506200226d565b506200231762003726565b505050565b60225460ff1615620023a25760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401620005f2565b6022805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b620023eb8a63ffffffff1662001741565b15620024605760405162461bcd60e51b815260206004820152603060248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7665726966794c6561663a60448201527f20416c726561647920636c61696d6564000000000000000000000000000000006064820152608401620005f2565b6026546040805160208082018d90528183018c9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091526000916001600160a01b03169063257b3632906084016020604051808303816000875af1158015620024ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200251391906200373c565b9050806000036200258d5760405162461bcd60e51b815260206004820152603760248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7665726966794c6561663a60448201527f20476c6f62616c45786974526f6f7420696e76616c69640000000000000000006064820152608401620005f2565b60225463ffffffff87811661010090920416146200263a5760405162461bcd60e51b815260206004820152604360248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7665726966794c6561663a60448201527f2044657374696e6174696f6e206e6574776f726b20646f6573206e6f74206d6160648201527f7463680000000000000000000000000000000000000000000000000000000000608482015260a401620005f2565b602254600090610100900463ffffffff16620026585750886200265b565b50895b6200268662002677848b8b8b8b8b8b8051906020012062000d9b565b8e8e63ffffffff168462000c9b565b62000a8f5760405162461bcd60e51b815260206004820152603260248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7665726966794c6561663a60448201527f20496e76616c696420736d742070726f6f6600000000000000000000000000006064820152608401620005f2565b60006200270a6101008362003310565b905060006200271c6101008462003410565b6000928352602360205260409092208054600190931b9092179091555050565b6040516001600160a01b038316602482015260448101829052620023179084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640162002180565b60225460ff16620028015760405162461bcd60e51b815260206004820152603b60248201527f456d657267656e63794d616e616765723a3a6966456d657267656e637953746160448201527f74653a206f6e6c7920696620656d657267656e637920737461746500000000006064820152608401620005f2565b6022805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6020015190565b600062002894826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620029299092919063ffffffff16565b805190915015620023175780806020019051810190620028b5919062003756565b620023175760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620005f2565b60606200293a848460008562002944565b90505b9392505050565b606082471015620029be5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401620005f2565b6001600160a01b0385163b62002a175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620005f2565b600080866001600160a01b0316858760405162002a3591906200337c565b60006040518083038185875af1925050503d806000811462002a74576040519150601f19603f3d011682016040523d82523d6000602084013e62002a79565b606091505b509150915062002a8b82828662002a96565b979650505050505050565b6060831562002aa75750816200293d565b82511562002ab85782518084602001fd5b8160405162461bcd60e51b8152600401620005f2919062003776565b6117db806200378c83390190565b6001600160a01b038116811462002af857600080fd5b50565b803562002b088162002ae2565b919050565b803563ffffffff8116811462002b0857600080fd5b60008083601f84011262002b3557600080fd5b50813567ffffffffffffffff81111562002b4e57600080fd5b60208301915083602082850101111562002b6757600080fd5b9250929050565b60008060008060008060a0878903121562002b8857600080fd5b863562002b958162002ae2565b955062002ba56020880162002b0d565b9450604087013562002bb78162002ae2565b935060608701359250608087013567ffffffffffffffff81111562002bdb57600080fd5b62002be989828a0162002b22565b979a9699509497509295939492505050565b6000806040838503121562002c0f57600080fd5b62002c1a8362002b0d565b9150602083013562002c2c8162002ae2565b809150509250929050565b60006020828403121562002c4a57600080fd5b81356200293d8162002ae2565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171562002c995762002c9962002c57565b604052919050565b600082601f83011262002cb357600080fd5b8135602067ffffffffffffffff82111562002cd25762002cd262002c57565b8160051b62002ce382820162002c6d565b928352848101820192828101908785111562002cfe57600080fd5b83870192505b8483101562002a8b5782358252918301919083019062002d04565b6000806000806080858703121562002d3657600080fd5b84359350602085013567ffffffffffffffff8082111562002d5657600080fd5b62002d648883890162002ca1565b945060408701359150808216821462002d7c57600080fd5b509396929550929360600135925050565b60ff8116811462002af857600080fd5b600080600080600080600060e0888a03121562002db957600080fd5b873562002dc68162002d8d565b965062002dd66020890162002b0d565b9550604088013562002de88162002ae2565b945062002df86060890162002b0d565b9350608088013562002e0a8162002ae2565b9699959850939692959460a0840135945060c09093013592915050565b600067ffffffffffffffff82111562002e445762002e4462002c57565b50601f01601f191660200190565b600082601f83011262002e6457600080fd5b813562002e7b62002e758262002e27565b62002c6d565b81815284602083860101111562002e9157600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806000806000806000806101408b8d03121562002ecf57600080fd5b8a3567ffffffffffffffff8082111562002ee857600080fd5b62002ef68e838f0162002ca1565b9b5062002f0660208e0162002b0d565b9a5060408d0135995060608d0135985062002f2460808e0162002b0d565b975062002f3460a08e0162002afb565b965062002f4460c08e0162002b0d565b955062002f5460e08e0162002afb565b94506101008d013593506101208d013591508082111562002f7457600080fd5b5062002f838d828e0162002e52565b9150509295989b9194979a5092959850565b60008060006060848603121562002fab57600080fd5b62002fb68462002b0d565b9250602084013562002fc88162002ae2565b9150604084013562002fda8162002ae2565b809150509250925092565b60006020828403121562002ff857600080fd5b5035919050565b600080600080600080600060a0888a0312156200301b57600080fd5b620030268862002b0d565b96506020880135620030388162002ae2565b9550604088013567ffffffffffffffff808211156200305657600080fd5b620030648b838c0162002b22565b909750955060608a01359150808211156200307e57600080fd5b506200308d8a828b0162002b22565b9094509250506080880135620030a38162002d8d565b8091505092959891949750929550565b600080600060608486031215620030c957600080fd5b620030d48462002b0d565b92506020840135620030e68162002ae2565b9150604084013567ffffffffffffffff8111156200310357600080fd5b620031118682870162002e52565b9150509250925092565b60005b83811015620031385781810151838201526020016200311e565b838111156200120e5750506000910152565b600082601f8301126200315c57600080fd5b81516200316d62002e758262002e27565b8181528460208386010111156200318357600080fd5b620031968260208301602087016200311b565b949350505050565b600060208284031215620031b157600080fd5b815167ffffffffffffffff811115620031c957600080fd5b62003196848285016200314a565b600060208284031215620031ea57600080fd5b81516200293d8162002d8d565b60008151808452620032118160208601602086016200311b565b601f01601f19169290920160200192915050565b6060815260006200323a6060830186620031f7565b82810360208401526200324e8186620031f7565b91505060ff83166040830152949350505050565b600061010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620032b582850187620031f7565b925080851660e085015250509998505050505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082620033225762003322620032e4565b500490565b6000600182016200333c576200333c620032fa565b5060010190565b6001600160a01b038416815263ffffffff83166020820152606060408201526000620033736060830184620031f7565b95945050505050565b60008251620033908184602087016200311b565b9190910192915050565b600080600060608486031215620033b057600080fd5b835167ffffffffffffffff80821115620033c957600080fd5b620033d7878388016200314a565b94506020860151915080821115620033ee57600080fd5b50620033fd868287016200314a565b925050604084015162002fda8162002d8d565b600082620034225762003422620032e4565b500690565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006200346660608301878962003427565b82810360208401526200347b81868862003427565b91505060ff831660408301529695505050505050565b60008351620034a58184602088016200311b565b835190830190620034bb8183602088016200311b565b01949350505050565b60008085851115620034d557600080fd5b83861115620034e357600080fd5b5050820193919092039150565b600080600080600080600060e0888a0312156200350c57600080fd5b8735620035198162002ae2565b965060208801356200352b8162002ae2565b95506040880135945060608801359350608088013562002e0a8162002d8d565b801515811462002af857600080fd5b600080600080600080600080610100898b0312156200357857600080fd5b8835620035858162002ae2565b97506020890135620035978162002ae2565b965060408901359550606089013594506080890135620035b7816200354b565b935060a0890135620035c98162002d8d565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115620036275781600019048211156200360b576200360b620032fa565b808516156200361957918102915b93841c9390800290620035eb565b509250929050565b600082620036405750600162000ba2565b816200364f5750600062000ba2565b8160018114620036685760028114620036735762003693565b600191505062000ba2565b60ff841115620036875762003687620032fa565b50506001821b62000ba2565b5060208310610133831016604e8410600b8410161715620036b8575081810a62000ba2565b620036c48383620035e6565b8060001904821115620036db57620036db620032fa565b029392505050565b60006200293d83836200362f565b600082821015620037065762003706620032fa565b500390565b60008219821115620037215762003721620032fa565b500190565b634e487b7160e01b600052600160045260246000fd5b6000602082840312156200374f57600080fd5b5051919050565b6000602082840312156200376957600080fd5b81516200293d816200354b565b6020815260006200293d6020830184620031f756fe60c06040523480156200001157600080fd5b50604051620017db380380620017db8339810160408190526200003491620002ad565b82826003620000448382620003c1565b506004620000538282620003c1565b5050600580546001600160a81b0319163360ff60a01b191617600160a01b60ff851602179055504660808190526200008b9062000098565b60a052506200048d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000c562000146565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b606060038054620001579062000332565b80601f0160208091040260200160405190810160405280929190818152602001828054620001859062000332565b8015620001d65780601f10620001aa57610100808354040283529160200191620001d6565b820191906000526020600020905b815481529060010190602001808311620001b857829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200020857600080fd5b81516001600160401b0380821115620002255762000225620001e0565b604051601f8301601f19908116603f01168101908282118183101715620002505762000250620001e0565b816040528381526020925086838588010111156200026d57600080fd5b600091505b8382101562000291578582018301518183018401529082019062000272565b83821115620002a35760008385830101525b9695505050505050565b600080600060608486031215620002c357600080fd5b83516001600160401b0380821115620002db57600080fd5b620002e987838801620001f6565b945060208601519150808211156200030057600080fd5b506200030f86828701620001f6565b925050604084015160ff811681146200032757600080fd5b809150509250925092565b600181811c908216806200034757607f821691505b6020821081036200036857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003bc57600081815260208120601f850160051c81016020861015620003975750805b601f850160051c820191505b81811015620003b857828155600101620003a3565b5050505b505050565b81516001600160401b03811115620003dd57620003dd620001e0565b620003f581620003ee845462000332565b846200036e565b602080601f8311600181146200042d5760008415620004145750858301515b600019600386901b1c1916600185901b178555620003b8565b600085815260208120601f198616915b828110156200045e578886015182559484019460019091019084016200043d565b50858210156200047d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611321620004ba60003960006104e001526000818161034a01526104aa01526113216000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461036c578063dd62ed3e1461037f578063ffa1ad74146103b857600080fd5b8063a457c2d71461031f578063a9059cbb14610332578063cd0d00961461034557600080fd5b806395d89b41116100bd57806395d89b41146102d95780639dc29fac146102e1578063a3c573eb146102f457600080fd5b806370a08231146102905780637ecebe00146102b957600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610260578063395093511461026857806340c10f191461027b57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b6101846103d8565b60405161019191906110b4565b60405180910390f35b6101ad6101a8366004611125565b61046a565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad61020436600461114f565b610482565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60055474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610191565b6101c16104a6565b6101ad610276366004611125565b610502565b61028e610289366004611125565b610541565b005b6101c161029e36600461118b565b6001600160a01b031660009081526020819052604090205490565b6101c16102c736600461118b565b60066020526000908152604090205481565b6101846105d4565b61028e6102ef366004611125565b6105e3565b600554610307906001600160a01b031681565b6040516001600160a01b039091168152602001610191565b6101ad61032d366004611125565b61066d565b6101ad610340366004611125565b610717565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028e61037a3660046111ad565b610725565b6101c161038d366004611220565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610184604051806040016040528060018152602001603160f81b81525081565b6060600380546103e790611253565b80601f016020809104026020016040519081016040528092919081815260200182805461041390611253565b80156104605780601f1061043557610100808354040283529160200191610460565b820191906000526020600020905b81548152906001019060200180831161044357829003601f168201915b5050505050905090565b6000336104788185856109aa565b5060019392505050565b600033610490858285610b03565b61049b858585610b95565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104dd576104d846610dac565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610478908290869061053c9087906112a3565b6109aa565b6005546001600160a01b031633146105c65760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6105d08282610e58565b5050565b6060600480546103e790611253565b6005546001600160a01b031633146106635760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084016105bd565b6105d08282610f37565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091908381101561070a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016105bd565b61049b82868684036109aa565b600033610478818585610b95565b8342111561079a5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d69740000000000000000000000000000000000000000000000000000000060648201526084016105bd565b6001600160a01b038716600090815260066020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866107e7836112bb565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006108456104a6565b6040517f1901000000000000000000000000000000000000000000000000000000000000602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156108eb573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906109215750896001600160a01b0316816001600160a01b0316145b6109935760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e61747572650000000000000000000000000000000000000000000000000060648201526084016105bd565b61099e8a8a8a6109aa565b50505050505050505050565b6001600160a01b038316610a255760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105bd565b6001600160a01b038216610aa15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105bd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610b8f5781811015610b825760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105bd565b610b8f84848484036109aa565b50505050565b6001600160a01b038316610c115760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105bd565b6001600160a01b038216610c8d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105bd565b6001600160a01b03831660009081526020819052604090205481811015610d1c5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016105bd565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290610d539084906112a3565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610d9f91815260200190565b60405180910390a3610b8f565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610dd76103d8565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610eae5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105bd565b8060026000828254610ec091906112a3565b90915550506001600160a01b03821660009081526020819052604081208054839290610eed9084906112a3565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038216610fb35760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105bd565b6001600160a01b038216600090815260208190526040902054818110156110425760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016105bd565b6001600160a01b03831660009081526020819052604081208383039055600280548492906110719084906112d4565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610af6565b600060208083528351808285015260005b818110156110e1578581018301518582016040015282016110c5565b818111156110f3576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461112057600080fd5b919050565b6000806040838503121561113857600080fd5b61114183611109565b946020939093013593505050565b60008060006060848603121561116457600080fd5b61116d84611109565b925061117b60208501611109565b9150604084013590509250925092565b60006020828403121561119d57600080fd5b6111a682611109565b9392505050565b600080600080600080600060e0888a0312156111c857600080fd5b6111d188611109565b96506111df60208901611109565b95506040880135945060608801359350608088013560ff8116811461120357600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561123357600080fd5b61123c83611109565b915061124a60208401611109565b90509250929050565b600181811c9082168061126757607f821691505b60208210810361128757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156112b6576112b661128d565b500190565b6000600182016112cd576112cd61128d565b5060010190565b6000828210156112e6576112e661128d565b50039056fea26469706673582212205d074ee584238a5fb66873e3fc67d479c99eb1688b3ca2f77c22e4f97ce77b0064736f6c634300080f0033a264697066735822122060e4844ad9ce717086f4bd60b8f5fde908812219549ad06e1605773fdd681c4d64736f6c634300080f0033 \ No newline at end of file +608060405234801561001057600080fd5b50614d7f806100206000396000f3fe608060405260043610620001875760003560e01c80633e19704311620000db578063bab161bf1162000089578063dbc169761162000060578063dbc1697614620004b0578063ee25560b14620004c8578063fb57083414620004f957600080fd5b8063bab161bf1462000434578063d02103ca146200046e578063d96a15f7146200049957600080fd5b806381b1c17411620000be57806381b1c17414620003905780639e34070f14620003ca578063aaa13cc2146200040f57600080fd5b80633e1970431462000346578063647c576c146200036b57600080fd5b80632d2c9d941162000139578063318aee3d116200011c578063318aee3d146200029d57806334ac9cf2146200030c5780633ae05047146200032e57600080fd5b80632d2c9d9414620002515780632dfdf0b5146200027657600080fd5b80632072f6c5116200016e5780632072f6c514620001d657806322e95f2c14620001ee5780632cffd02e146200022c57600080fd5b80630871e971146200018c57806315064c9614620001a5575b600080fd5b620001a36200019d36600462002923565b6200051e565b005b348015620001b257600080fd5b50606854620001c19060ff1681565b60405190151581526020015b60405180910390f35b348015620001e357600080fd5b50620001a36200096c565b348015620001fb57600080fd5b50620002136200020d366004620029b0565b620009a4565b6040516001600160a01b039091168152602001620001cd565b3480156200023957600080fd5b50620001a36200024b366004620029ff565b62000a0f565b3480156200025e57600080fd5b50620001a362000270366004620029ff565b62000e69565b3480156200028357600080fd5b506200028e60535481565b604051908152602001620001cd565b348015620002aa57600080fd5b50620002e7620002bc36600462002ae5565b606b6020526000908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001cd565b3480156200031957600080fd5b50606c5462000213906001600160a01b031681565b3480156200033b57600080fd5b506200028e62001007565b3480156200035357600080fd5b506200028e6200036536600462002b15565b620010ed565b3480156200037857600080fd5b50620001a36200038a36600462002b9f565b62001197565b3480156200039d57600080fd5b5062000213620003af36600462002bef565b606a602052600090815260409020546001600160a01b031681565b348015620003d757600080fd5b50620001c1620003e936600462002bef565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200041c57600080fd5b50620002136200042e36600462002c09565b62001367565b3480156200044157600080fd5b506068546200045890610100900463ffffffff1681565b60405163ffffffff9091168152602001620001cd565b3480156200047b57600080fd5b5060685462000213906501000000000090046001600160a01b031681565b620001a3620004aa36600462002cbd565b620014bb565b348015620004bd57600080fd5b50620001a362001641565b348015620004d557600080fd5b506200028e620004e736600462002bef565b60696020526000908152604090205481565b3480156200050657600080fd5b50620001c16200051836600462002d28565b62001677565b60685460ff16156200054357604051630bc011ff60e21b815260040160405180910390fd5b6200054d6200175e565b60685463ffffffff868116610100909204161480620005735750600263ffffffff861610155b1562000592576040516302caf51760e11b815260040160405180910390fd5b6000806060856001600160a01b038a16620005eb57863414620005e1576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000925062000872565b341562000624576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03808b166000908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620006fa576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018990526001600160a01b038c1690639dc29fac90604401600060405180830381600087803b158015620006cd57600080fd5b505af1158015620006e2573d6000803e3d6000fd5b50505050806020015194508060000151935062000870565b85156200070f576200070f8b898989620017b9565b6040516370a0823160e01b81523060048201526000906001600160a01b038d16906370a0823190602401602060405180830381865afa15801562000757573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200077d919062002d75565b9050620007966001600160a01b038d1633308c62001b80565b6040516370a0823160e01b81523060048201526000906001600160a01b038e16906370a0823190602401602060405180830381865afa158015620007de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000804919062002d75565b905062000812828262002da5565b6068548e9850610100900463ffffffff1696509350620008328762001c06565b6200083d8e62001d04565b620008488f62001def565b6040516020016200085c9392919062002e0f565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868c8c8688605354604051620008b498979695949392919062002e4c565b60405180910390a1620008df620008d9600085878d8d878980519060200120620010ed565b62001ec9565b6068546501000000000090046001600160a01b03166333d6247d6200090362001007565b6040518263ffffffff1660e01b81526004016200092291815260200190565b600060405180830381600087803b1580156200093d57600080fd5b505af115801562000952573d6000803e3d6000fd5b50505050505050506200096460018055565b505050505050565b606c546001600160a01b03163314620009985760405163e2e8106b60e01b815260040160405180910390fd5b620009a262001fe6565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091206000908152606a90915220546001600160a01b03165b92915050565b60685460ff161562000a3457604051630bc011ff60e21b815260040160405180910390fd5b62000a4b8b8b8b8b8b8b8b8b8b8b8b600062002043565b6001600160a01b03861662000b0d57604080516000808252602082019092526001600160a01b03861690859060405162000a86919062002ece565b60006040518083038185875af1925050503d806000811462000ac5576040519150601f19603f3d011682016040523d82523d6000602084013e62000aca565b606091505b505090508062000b06576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000dfe565b60685463ffffffff61010090910481169088160362000b425762000b3c6001600160a01b03871685856200220e565b62000dfe565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b16602482015260009060380160408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b03168062000d96576000808062000bc18688018862002fa7565b92509250925060008584848460405162000bdb906200289b565b62000be99392919062002e0f565b8190604051809103906000f590508015801562000c0a573d6000803e3d6000fd5b506040516340c10f1960e01b81526001600160a01b038c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000c5a57600080fd5b505af115801562000c6f573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000d8495949392919062003046565b60405180910390a15050505062000dfb565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b15801562000de157600080fd5b505af115801562000df6573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c81168252891660208201526001600160a01b0388811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000e8e57604051630bc011ff60e21b815260040160405180910390fd5b62000ea58b8b8b8b8b8b8b8b8b8b8b600162002043565b6000846001600160a01b031684888a868660405160240162000ecb949392919062003081565b60408051601f198184030181529181526020820180516001600160e01b03167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162000f1b919062002ece565b60006040518083038185875af1925050503d806000811462000f5a576040519150601f19603f3d011682016040523d82523d6000602084013e62000f5f565b606091505b505090508062000f9b576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b6020811015620010e4578083901c600116600103620010755760338160208110620010415762001041620030bc565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620010a2565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620010db90620030d2565b91505062001012565b50919392505050565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b600054610100900460ff1615808015620011b85750600054600160ff909116105b80620011d45750303b158015620011d4575060005460ff166001145b6200124c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b6000805460ff19166001179055801562001270576000805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556200131a62002259565b801562001361576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620013d2906200289b565b601f1982820381018352601f909101166040819052620013ff908d908d908d908d908d90602001620030ee565b60408051601f19818403018152908290526200141f92916020016200312f565b604051602081830303815290604052805190602001206040516020016200149594939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60685460ff1615620014e057604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff858116610100909204161480620015065750600263ffffffff851610155b1562001525576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163387873488886053546040516200157b9998979695949392919062003162565b60405180910390a1620015c4620008d96001606860019054906101000a900463ffffffff16338888348989604051620015b6929190620031d0565b6040518091039020620010ed565b6068546501000000000090046001600160a01b03166333d6247d620015e862001007565b6040518263ffffffff1660e01b81526004016200160791815260200190565b600060405180830381600087803b1580156200162257600080fd5b505af115801562001637573d6000803e3d6000fd5b5050505050505050565b606c546001600160a01b031633146200166d5760405163e2e8106b60e01b815260040160405180910390fd5b620009a2620022d0565b600084815b60208110156200175257600163ffffffff8616821c81169003620016ee57858160208110620016af57620016af620030bc565b602002013582604051602001620016d0929190918252602082015260400190565b6040516020818303038152906040528051906020012091506200173d565b81868260208110620017045762001704620030bc565b602002013560405160200162001724929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806200174981620030d2565b9150506200167c565b50909114949350505050565b600260015403620017b25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001243565b6002600155565b6000620017ca6004828486620031e0565b620017d5916200320c565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b0319821601620019c157600080808080808062001820896004818d620031e0565b8101906200182f91906200323d565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620018705760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146200189a5760405163750643af60e01b815260040160405180910390fd5b8a8514620018d4576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e16916200196d919062002ece565b6000604051808303816000865af19150503d8060008114620019ac576040519150601f19603f3d011682016040523d82523d6000602084013e620019b1565b606091505b5050505050505050505062001b79565b6001600160e01b031981166323f2ebc360e21b1462001a0c576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080808080808062001a248a6004818e620031e0565b81019062001a339190620032a7565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001a765760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301462001aa05760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162001b29919062002ece565b6000604051808303816000865af19150503d806000811462001b68576040519150601f19603f3d011682016040523d82523d6000602084013e62001b6d565b606091505b50505050505050505050505b5050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620013619085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002342565b60408051600481526024810182526020810180516001600160e01b03167f06fdde0300000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b0386169162001c68919062002ece565b600060405180830381855afa9150503d806000811462001ca5576040519150601f19603f3d011682016040523d82523d6000602084013e62001caa565b606091505b50915091508162001cf1576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001cfc565b62001cfc816200242e565b949350505050565b60408051600481526024810182526020810180516001600160e01b03167f95d89b4100000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b0386169162001d66919062002ece565b600060405180830381855afa9150503d806000811462001da3576040519150601f19603f3d011682016040523d82523d6000602084013e62001da8565b606091505b50915091508162001cf1576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001cfc565b60408051600481526024810182526020810180516001600160e01b03167f313ce567000000000000000000000000000000000000000000000000000000001790529051600091829182916001600160a01b0386169162001e50919062002ece565b600060405180830381855afa9150503d806000811462001e8d576040519150601f19603f3d011682016040523d82523d6000602084013e62001e92565b606091505b509150915081801562001ea6575080516020145b62001eb357601262001cfc565b8080602001905181019062001cfc919062003333565b80600162001eda6020600262003450565b62001ee6919062002da5565b6053541062001f21576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001f3490620030d2565b9182905550905060005b602081101562001fd0578082901c60011660010362001f7657826033826020811062001f6e5762001f6e620030bc565b015550505050565b6033816020811062001f8c5762001f8c620030bc565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001fc790620030d2565b91505062001f3e565b5062001fdb6200345e565b505050565b60018055565b60685460ff16156200200b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b620020548b63ffffffff166200261e565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091526000916501000000000090046001600160a01b03169063257b3632906084016020604051808303816000875af1158015620020ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002110919062002d75565b9050806000036200214c576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff88811661010090920416146200217d576040516302caf51760e11b815260040160405180910390fd5b606854600090610100900463ffffffff166200219b5750896200219e565b508a5b620021c7620021be848c8c8c8c8c8c8c604051620015b6929190620031d0565b8f8f8462001677565b620021fe576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b6040516001600160a01b03831660248201526044810182905262001fdb9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640162001bce565b600054610100900460ff16620022c65760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001243565b620009a262002683565b60685460ff166200230d576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600062002399826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620026f09092919063ffffffff16565b80519091501562001fdb5780806020019051810190620023ba919062003474565b62001fdb5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001243565b6060604082511062002450578180602001905181019062000a09919062003494565b8151602003620025e05760005b602081108015620024a857508281815181106200247e576200247e620030bc565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620024c35780620024ba81620030d2565b9150506200245d565b806000036200250757505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562002525576200252562002eb8565b6040519080825280601f01601f19166020018201604052801562002550576020820181803683370190505b50905060005b82811015620025d857848181518110620025745762002574620030bc565b602001015160f81c60f81b828281518110620025945762002594620030bc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620025cf81620030d2565b91505062002556565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900362001b79576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1662001fe05760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001243565b60606200270184846000856200270b565b90505b9392505050565b606082471015620027855760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840162001243565b6001600160a01b0385163b620027de5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001243565b600080866001600160a01b03168587604051620027fc919062002ece565b60006040518083038185875af1925050503d80600081146200283b576040519150601f19603f3d011682016040523d82523d6000602084013e62002840565b606091505b5091509150620028528282866200285d565b979650505050505050565b606083156200286e57508162002704565b8251156200287f5782518084602001fd5b8160405162461bcd60e51b815260040162001243919062003514565b611820806200352a83390190565b6001600160a01b0381168114620028bf57600080fd5b50565b803563ffffffff811681146200261957600080fd5b60008083601f840112620028ea57600080fd5b50813567ffffffffffffffff8111156200290357600080fd5b6020830191508360208285010111156200291c57600080fd5b9250929050565b60008060008060008060a087890312156200293d57600080fd5b86356200294a81620028a9565b95506200295a60208801620028c2565b945060408701356200296c81620028a9565b935060608701359250608087013567ffffffffffffffff8111156200299057600080fd5b6200299e89828a01620028d7565b979a9699509497509295939492505050565b60008060408385031215620029c457600080fd5b620029cf83620028c2565b91506020830135620029e181620028a9565b809150509250929050565b80610400810183101562000a0957600080fd5b60008060008060008060008060008060006105208c8e03121562002a2257600080fd5b62002a2e8d8d620029ec565b9a5062002a3f6104008d01620028c2565b99506104208c013598506104408c0135975062002a606104608d01620028c2565b96506104808c013562002a7381620028a9565b955062002a846104a08d01620028c2565b94506104c08c013562002a9781620028a9565b93506104e08c013592506105008c013567ffffffffffffffff81111562002abd57600080fd5b62002acb8e828f01620028d7565b915080935050809150509295989b509295989b9093969950565b60006020828403121562002af857600080fd5b81356200270481620028a9565b60ff81168114620028bf57600080fd5b600080600080600080600060e0888a03121562002b3157600080fd5b873562002b3e8162002b05565b965062002b4e60208901620028c2565b9550604088013562002b6081620028a9565b945062002b7060608901620028c2565b9350608088013562002b8281620028a9565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121562002bb557600080fd5b62002bc084620028c2565b9250602084013562002bd281620028a9565b9150604084013562002be481620028a9565b809150509250925092565b60006020828403121562002c0257600080fd5b5035919050565b600080600080600080600060a0888a03121562002c2557600080fd5b62002c3088620028c2565b9650602088013562002c4281620028a9565b9550604088013567ffffffffffffffff8082111562002c6057600080fd5b62002c6e8b838c01620028d7565b909750955060608a013591508082111562002c8857600080fd5b5062002c978a828b01620028d7565b909450925050608088013562002cad8162002b05565b8091505092959891949750929550565b6000806000806060858703121562002cd457600080fd5b62002cdf85620028c2565b9350602085013562002cf181620028a9565b9250604085013567ffffffffffffffff81111562002d0e57600080fd5b62002d1c87828801620028d7565b95989497509550505050565b600080600080610460858703121562002d4057600080fd5b8435935062002d538660208701620029ec565b925062002d646104208601620028c2565b939692955092936104400135925050565b60006020828403121562002d8857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111562000a095762000a0962002d8f565b60005b8381101562002dd857818101518382015260200162002dbe565b50506000910152565b6000815180845262002dfb81602086016020860162002dbb565b601f01601f19169290920160200192915050565b60608152600062002e24606083018662002de1565b828103602084015262002e38818662002de1565b91505060ff83166040830152949350505050565b600061010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015262002e9f8285018762002de1565b925080851660e085015250509998505050505050505050565b634e487b7160e01b600052604160045260246000fd5b6000825162002ee281846020870162002dbb565b9190910192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171562002f185762002f1862002eb8565b604052919050565b600067ffffffffffffffff82111562002f3d5762002f3d62002eb8565b50601f01601f191660200190565b600082601f83011262002f5d57600080fd5b813562002f7462002f6e8262002f20565b62002eec565b81815284602083860101111562002f8a57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562002fbd57600080fd5b833567ffffffffffffffff8082111562002fd657600080fd5b62002fe48783880162002f4b565b9450602086013591508082111562002ffb57600080fd5b506200300a8682870162002f4b565b925050604084013562002be48162002b05565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff8616815260006001600160a01b03808716602084015280861660408401525060806060830152620028526080830184866200301d565b6001600160a01b038516815263ffffffff84166020820152606060408201526000620030b26060830184866200301d565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b600060018201620030e757620030e762002d8f565b5060010190565b606081526000620031046060830187896200301d565b8281036020840152620031198186886200301d565b91505060ff831660408301529695505050505050565b600083516200314381846020880162002dbb565b8351908301906200315981836020880162002dbb565b01949350505050565b600061010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620031b682850187896200301d565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b60008085851115620031f157600080fd5b83861115620031ff57600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015620032355780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200325957600080fd5b87356200326681620028a9565b965060208801356200327881620028a9565b95506040880135945060608801359350608088013562002b828162002b05565b8015158114620028bf57600080fd5b600080600080600080600080610100898b031215620032c557600080fd5b8835620032d281620028a9565b97506020890135620032e481620028a9565b965060408901359550606089013594506080890135620033048162003298565b935060a0890135620033168162002b05565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200334657600080fd5b8151620027048162002b05565b600181815b808511156200339457816000190482111562003378576200337862002d8f565b808516156200338657918102915b93841c939080029062003358565b509250929050565b600082620033ad5750600162000a09565b81620033bc5750600062000a09565b8160018114620033d55760028114620033e05762003400565b600191505062000a09565b60ff841115620033f457620033f462002d8f565b50506001821b62000a09565b5060208310610133831016604e8410600b841016171562003425575081810a62000a09565b62003431838362003353565b806000190482111562003448576200344862002d8f565b029392505050565b60006200270483836200339c565b634e487b7160e01b600052600160045260246000fd5b6000602082840312156200348757600080fd5b8151620027048162003298565b600060208284031215620034a757600080fd5b815167ffffffffffffffff811115620034bf57600080fd5b8201601f81018413620034d157600080fd5b8051620034e262002f6e8262002f20565b818152856020838501011115620034f857600080fd5b6200350b82602083016020860162002dbb565b95945050505050565b60208152600062002704602083018462002de156fe6101006040523480156200001257600080fd5b50604051620018203803806200182083398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e051611364620004bc60003960006102370152600081816102fa015281816105630152610623015260006104f701526000818161035f01526104c101526113646000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf14610381578063dd62ed3e14610394578063ffa1ad74146103cd57600080fd5b8063a457c2d714610334578063a9059cbb14610347578063cd0d00961461035a57600080fd5b806395d89b41116100bd57806395d89b41146102da5780639dc29fac146102e2578063a3c573eb146102f557600080fd5b806370a08231146102915780637ecebe00146102ba57600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b6101846103ed565b6040516101919190611107565b60405180910390f35b6101ad6101a8366004611171565b61047f565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad61020436600461119b565b610499565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c16104bd565b6101ad610277366004611171565b610519565b61028f61028a366004611171565b610558565b005b6101c161029f3660046111d7565b6001600160a01b031660009081526020819052604090205490565b6101c16102c83660046111d7565b60056020526000908152604090205481565b610184610609565b61028f6102f0366004611171565b610618565b61031c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610191565b6101ad610342366004611171565b6106c0565b6101ad610355366004611171565b61076a565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f61038f3660046111f9565b610778565b6101c16103a236600461126c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610184604051806040016040528060018152602001603160f81b81525081565b6060600380546103fc9061129f565b80601f01602080910402602001604051908101604052809291908181526020018280546104289061129f565b80156104755780601f1061044a57610100808354040283529160200191610475565b820191906000526020600020905b81548152906001019060200180831161045857829003601f168201915b5050505050905090565b60003361048d8185856109fd565b60019150505b92915050565b6000336104a7858285610b56565b6104b2858585610be8565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104f4576104ef46610dff565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061048d90829086906105539087906112ef565b6109fd565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105fb5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106058282610eab565b5050565b6060600480546103fc9061129f565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106b65760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084016105f2565b6106058282610f8a565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091908381101561075d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016105f2565b6104b282868684036109fd565b60003361048d818585610be8565b834211156107ed5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d69740000000000000000000000000000000000000000000000000000000060648201526084016105f2565b6001600160a01b038716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661083a83611302565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006108986104bd565b6040517f1901000000000000000000000000000000000000000000000000000000000000602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561093e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906109745750896001600160a01b0316816001600160a01b0316145b6109e65760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e61747572650000000000000000000000000000000000000000000000000060648201526084016105f2565b6109f18a8a8a6109fd565b50505050505050505050565b6001600160a01b038316610a785760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105f2565b6001600160a01b038216610af45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105f2565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610be25781811015610bd55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105f2565b610be284848484036109fd565b50505050565b6001600160a01b038316610c645760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105f2565b6001600160a01b038216610ce05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105f2565b6001600160a01b03831660009081526020819052604090205481811015610d6f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016105f2565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290610da69084906112ef565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610df291815260200190565b60405180910390a3610be2565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610e2a6103ed565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610f015760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105f2565b8060026000828254610f1391906112ef565b90915550506001600160a01b03821660009081526020819052604081208054839290610f409084906112ef565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166110065760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105f2565b6001600160a01b038216600090815260208190526040902054818110156110955760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016105f2565b6001600160a01b03831660009081526020819052604081208383039055600280548492906110c490849061131b565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610b49565b600060208083528351808285015260005b8181101561113457858101830151858201604001528201611118565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461116c57600080fd5b919050565b6000806040838503121561118457600080fd5b61118d83611155565b946020939093013593505050565b6000806000606084860312156111b057600080fd5b6111b984611155565b92506111c760208501611155565b9150604084013590509250925092565b6000602082840312156111e957600080fd5b6111f282611155565b9392505050565b600080600080600080600060e0888a03121561121457600080fd5b61121d88611155565b965061122b60208901611155565b95506040880135945060608801359350608088013560ff8116811461124f57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561127f57600080fd5b61128883611155565b915061129660208401611155565b90509250929050565b600181811c908216806112b357607f821691505b6020821081036112d357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610493576104936112d9565b600060018201611314576113146112d9565b5060010190565b81810381811115610493576104936112d956fea264697066735822122096b785fb92e9d4372a52fbc641ca1490dd9eca1990f97279973ebfb2e360d35264736f6c63430008110033a2646970667358221220023cdf6f59c48aad01ce56dd616f5f69b13eac334bef1d8757755c5483d3c50764736f6c63430008110033 \ No newline at end of file diff --git a/etherman/smartcontracts/bin/polygonzkevmglobalexitroot.bin b/etherman/smartcontracts/bin/polygonzkevmglobalexitroot.bin index 1c79cd036a..b78f030f12 100644 --- a/etherman/smartcontracts/bin/polygonzkevmglobalexitroot.bin +++ b/etherman/smartcontracts/bin/polygonzkevmglobalexitroot.bin @@ -1 +1 @@ -608060405234801561001057600080fd5b506104f3806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80633ed691ef1161005b5780633ed691ef146100e7578063485cc955146101205780635ec6a8df14610133578063a3c573eb1461015e57600080fd5b806301fd90441461008d578063257b3632146100a9578063319cf735146100c957806333d6247d146100d2575b600080fd5b61009660015481565b6040519081526020015b60405180910390f35b6100966100b7366004610455565b60036020526000908152604090205481565b61009660025481565b6100e56100e0366004610455565b610171565b005b61009660025460015460408051602081019390935282015260009060600160405160208183030381529060405280519060200120905090565b6100e561012e36600461048a565b6102f3565b600554610146906001600160a01b031681565b6040516001600160a01b0390911681526020016100a0565b600454610146906001600160a01b031681565b6005546001600160a01b031633148061019457506004546001600160a01b031633145b6102315760405162461bcd60e51b815260206004820152604260248201527f506f6c79676f6e5a6b45564d476c6f62616c45786974526f6f743a3a7570646160448201527f746545786974526f6f743a204f6e6c7920616c6c6f77656420636f6e7472616360648201527f7473000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b6005546001600160a01b031633036102495760018190555b6004546001600160a01b031633036102615760028190555b60025460015460408051602081019390935282015260009060600160405160208183030381529060405280519060200120905060036000828152602001908152602001600020546000036102ef57600081815260036020526040808220429055600154600254915190927f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce391a35b5050565b600054610100900460ff16158080156103135750600054600160ff909116105b8061032d5750303b15801561032d575060005460ff166001145b61039f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610228565b6000805460ff1916600117905580156103c2576000805461ff0019166101001790555b600580546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560048054928516929091169190911790558015610450576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006020828403121561046757600080fd5b5035919050565b80356001600160a01b038116811461048557600080fd5b919050565b6000806040838503121561049d57600080fd5b6104a68361046e565b91506104b46020840161046e565b9050925092905056fea26469706673582212204755a4cbf50d99cfafb99c5429e784137da120dba2e519fdf39654b3c4a8a5d864736f6c634300080f0033 \ No newline at end of file +60c060405234801561001057600080fd5b506040516103f83803806103f883398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516103316100c76000396000818160e901526101bd015260008181610135015261017401526103316000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806333d6247d1161005b57806333d6247d146100c75780633ed691ef146100dc5780635ec6a8df146100e4578063a3c573eb1461013057600080fd5b806301fd904414610082578063257b36321461009e578063319cf735146100be575b600080fd5b61008b60005481565b6040519081526020015b60405180910390f35b61008b6100ac3660046102e2565b60026020526000908152604090205481565b61008b60015481565b6100da6100d53660046102e2565b610157565b005b61008b6102a6565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610095565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101a65750600182905581610222565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101f0576000839055829150610222565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051602080820184905281830185905282518083038401815260609092019092528051910120600090600081815260026020526040812054919250036102a05760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b60006102dd600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b6000602082840312156102f457600080fd5b503591905056fea2646970667358221220e7dee8a420da2e0e8a9c8794bd77473a90d0da4f68ae0f3c0ca6c0994fea144d64736f6c63430008110033 \ No newline at end of file diff --git a/etherman/smartcontracts/mockverifier/mockverifier.go b/etherman/smartcontracts/mockverifier/mockverifier.go index a5f4f77612..c8c323f2a1 100644 --- a/etherman/smartcontracts/mockverifier/mockverifier.go +++ b/etherman/smartcontracts/mockverifier/mockverifier.go @@ -31,7 +31,7 @@ var ( // MockverifierMetaData contains all meta data concerning the Mockverifier contract. var MockverifierMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"a\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"b\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"c\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[1]\",\"name\":\"input\",\"type\":\"uint256[1]\"}],\"name\":\"verifyProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b50610101806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c806343753b4d14602d575b600080fd5b60426038366004606c565b6001949350505050565b604051901515815260200160405180910390f35b8060408101831015606657600080fd5b92915050565b600080600080610120808688031215608357600080fd5b608b87876056565b945060c0860187811115609d57600080fd5b60408701945060ab88826056565b93505086818701111560bc57600080fd5b5092959194509261010001915056fea2646970667358221220fd8a3c0f0aaf813f6cb0732c65b6c70c98673d54168129b4c058b08dac9751d564736f6c634300080f0033", + Bin: "0x608060405234801561001057600080fd5b50610101806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c806343753b4d14602d575b600080fd5b60426038366004606c565b6001949350505050565b604051901515815260200160405180910390f35b8060408101831015606657600080fd5b92915050565b600080600080610120808688031215608357600080fd5b608b87876056565b945060c0860187811115609d57600080fd5b60408701945060ab88826056565b93505086818701111560bc57600080fd5b5092959194509261010001915056fea2646970667358221220e4fded42456aefeafae525ecf0e782474df02f10c53f98f759d2ad7ab8489cc164736f6c63430008110033", } // MockverifierABI is the input ABI used to generate the binding from. diff --git a/etherman/smartcontracts/polygonzkevm/polygonzkevm.go b/etherman/smartcontracts/polygonzkevm/polygonzkevm.go index f371c1f769..8eea7a3fd2 100644 --- a/etherman/smartcontracts/polygonzkevm/polygonzkevm.go +++ b/etherman/smartcontracts/polygonzkevm/polygonzkevm.go @@ -46,18 +46,16 @@ type PolygonZkEVMForcedBatchData struct { // PolygonZkEVMInitializePackedParameters is an auto generated low-level Go binding around an user-defined struct. type PolygonZkEVMInitializePackedParameters struct { Admin common.Address - ChainID uint64 TrustedSequencer common.Address PendingStateTimeout uint64 - ForceBatchAllowed bool TrustedAggregator common.Address TrustedAggregatorTimeout uint64 } // PolygonzkevmMetaData contains all meta data concerning the Polygonzkevm contract. var PolygonzkevmMetaData = &bind.MetaData{ - ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"}],\"name\":\"ConsolidatePendingState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"forceBatchNum\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"lastGlobalExitRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sequencer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"transactions\",\"type\":\"bytes\"}],\"name\":\"ForceBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"OverridePendingState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"storedStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"provedStateRoot\",\"type\":\"bytes32\"}],\"name\":\"ProveNonDeterministicPendingState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"}],\"name\":\"SequenceBatches\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"}],\"name\":\"SequenceForceBatches\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"SetAdmin\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"newForceBatchAllowed\",\"type\":\"bool\"}],\"name\":\"SetForceBatchAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"newMultiplierBatchFee\",\"type\":\"uint16\"}],\"name\":\"SetMultiplierBatchFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newPendingStateTimeout\",\"type\":\"uint64\"}],\"name\":\"SetPendingStateTimeout\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTrustedAggregator\",\"type\":\"address\"}],\"name\":\"SetTrustedAggregator\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newTrustedAggregatorTimeout\",\"type\":\"uint64\"}],\"name\":\"SetTrustedAggregatorTimeout\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTrustedSequencer\",\"type\":\"address\"}],\"name\":\"SetTrustedSequencer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"newTrustedSequencerURL\",\"type\":\"string\"}],\"name\":\"SetTrustedSequencerURL\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newVeryBatchTimeTarget\",\"type\":\"uint64\"}],\"name\":\"SetVeryBatchTimeTarget\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"TrustedVerifyBatches\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"VerifyBatches\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"FORCE_BATCH_TIMEOUT\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HALT_AGGREGATION_TIMEOUT\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_BATCH_MULTIPLIER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_TRANSACTIONS_BYTE_LENGTH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_VERIFY_BATCHES\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequencedBatchNum\",\"type\":\"uint64\"}],\"name\":\"activateEmergencyState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"batchNumToStateRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridgeAddress\",\"outputs\":[{\"internalType\":\"contractIPolygonZkEVMBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"calculateRewardPerBatch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"chainID\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"}],\"name\":\"consolidatePendingState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deactivateEmergencyState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"transactions\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"maticAmount\",\"type\":\"uint256\"}],\"name\":\"forceBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forceBatchAllowed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"forcedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBatchFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"oldStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"}],\"name\":\"getInputSnarkBytes\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastVerifiedBatch\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalExitRootManager\",\"outputs\":[{\"internalType\":\"contractIPolygonZkEVMGlobalExitRoot\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIPolygonZkEVMGlobalExitRoot\",\"name\":\"_globalExitRootManager\",\"type\":\"address\"},{\"internalType\":\"contractIERC20Upgradeable\",\"name\":\"_matic\",\"type\":\"address\"},{\"internalType\":\"contractIVerifierRollup\",\"name\":\"_rollupVerifier\",\"type\":\"address\"},{\"internalType\":\"contractIPolygonZkEVMBridge\",\"name\":\"_bridgeAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainID\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"trustedSequencer\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"pendingStateTimeout\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"forceBatchAllowed\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"trustedAggregator\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"trustedAggregatorTimeout\",\"type\":\"uint64\"}],\"internalType\":\"structPolygonZkEVM.InitializePackedParameters\",\"name\":\"initializePackedParameters\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"genesisRoot\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"_trustedSequencerURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_networkName\",\"type\":\"string\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isEmergencyState\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"}],\"name\":\"isPendingStateConsolidable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastBatchSequenced\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastForceBatch\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastForceBatchSequenced\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastPendingState\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastPendingStateConsolidated\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimestamp\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastVerifiedBatch\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"matic\",\"outputs\":[{\"internalType\":\"contractIERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"multiplierBatchFee\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"networkName\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"initPendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalPendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[2]\",\"name\":\"proofA\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"proofB\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"proofC\",\"type\":\"uint256[2]\"}],\"name\":\"overridePendingState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingStateTimeout\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"pendingStateTransitions\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastVerifiedBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"exitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"initPendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalPendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[2]\",\"name\":\"proofA\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"proofB\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"proofC\",\"type\":\"uint256[2]\"}],\"name\":\"proveNonDeterministicPendingState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollupVerifier\",\"outputs\":[{\"internalType\":\"contractIVerifierRollup\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"transactions\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"globalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"minForcedTimestamp\",\"type\":\"uint64\"}],\"internalType\":\"structPolygonZkEVM.BatchData[]\",\"name\":\"batches\",\"type\":\"tuple[]\"}],\"name\":\"sequenceBatches\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"transactions\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"globalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"minForcedTimestamp\",\"type\":\"uint64\"}],\"internalType\":\"structPolygonZkEVM.ForcedBatchData[]\",\"name\":\"batches\",\"type\":\"tuple[]\"}],\"name\":\"sequenceForceBatches\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"sequencedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"accInputHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sequencedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"previousLastBatchSequenced\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"newForceBatchAllowed\",\"type\":\"bool\"}],\"name\":\"setForceBatchAllowed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"newMultiplierBatchFee\",\"type\":\"uint16\"}],\"name\":\"setMultiplierBatchFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newPendingStateTimeout\",\"type\":\"uint64\"}],\"name\":\"setPendingStateTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newTrustedAggregator\",\"type\":\"address\"}],\"name\":\"setTrustedAggregator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newTrustedAggregatorTimeout\",\"type\":\"uint64\"}],\"name\":\"setTrustedAggregatorTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newTrustedSequencer\",\"type\":\"address\"}],\"name\":\"setTrustedSequencer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"newTrustedSequencerURL\",\"type\":\"string\"}],\"name\":\"setTrustedSequencerURL\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newVeryBatchTimeTarget\",\"type\":\"uint64\"}],\"name\":\"setVeryBatchTimeTarget\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedAggregator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedAggregatorTimeout\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedSequencer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedSequencerURL\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[2]\",\"name\":\"proofA\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"proofB\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"proofC\",\"type\":\"uint256[2]\"}],\"name\":\"trustedVerifyBatches\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[2]\",\"name\":\"proofA\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"proofB\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"proofC\",\"type\":\"uint256[2]\"}],\"name\":\"verifyBatches\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"veryBatchTimeTarget\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b50615f3b80620000216000396000f3fe608060405234801561001057600080fd5b50600436106103af5760003560e01c80638da5cb5b116101f4578063cfa8ed471161011a578063e7a7ed02116100ad578063f14916d61161007c578063f14916d6146108f2578063f2fde38b14610905578063f851a44014610918578063f8b823e41461092b57600080fd5b8063e7a7ed021461089f578063e8bf92ed146108b9578063eaeb077b146108cc578063edc41121146108df57600080fd5b8063d939b315116100e9578063d939b31514610861578063dbc169761461087b578063e11f3f1814610883578063e217cfd61461089657600080fd5b8063cfa8ed471461080d578063d02103ca14610827578063d8d1091b1461083a578063d8f54db01461084d57600080fd5b8063ab9fc5ef11610192578063b6b0b09711610161578063b6b0b097146107c5578063c0ed84e0146107df578063c89e42df146107e7578063cf136306146107fa57600080fd5b8063ab9fc5ef14610713578063adc879e91461071d578063afd23cbe14610737578063b4d63f581461076557600080fd5b80639eb831b9116101ce5780639eb831b9146106d85780639f0d039d146106e0578063a3c573eb146106e8578063aa58bad6146106fb57600080fd5b80638da5cb5b146106ac57806399f5634e146106bd5780639c9f3dfe146106c557600080fd5b80634a910e6a116102d9578063715018a611610277578063837a473811610246578063837a473814610607578063841b24d7146106755780638b48931e1461068f5780638c4a0af71461069957600080fd5b8063715018a6146105c65780637215541a146105ce57806375c508b3146105e15780637fcb3653146105f457600080fd5b806360943d6a116102b357806360943d6a1461056d5780636b8616ce146105805780636ff512cc146105a0578063704b6c02146105b357600080fd5b80634a910e6a146105325780635392c5e014610545578063542028d51461056557600080fd5b8063383b3be811610351578063456052671161032057806345605267146104d8578063458c0477146104f25780634834a343146105055780634a1a89a71461051857600080fd5b8063383b3be814610485578063394218e9146104985780633c158267146104ab578063423fa856146104be57600080fd5b806319d8ac611161038d57806319d8ac6114610404578063220d78991461042f57806329878983146104425780632d0889d31461046d57600080fd5b8063107bf28c146103b457806315064c96146103d25780631816b7e5146103ef575b600080fd5b6103bc610934565b6040516103c99190615364565b60405180910390f35b6065546103df9060ff1681565b60405190151581526020016103c9565b6104026103fd366004615377565b6109c2565b005b606854610417906001600160401b031681565b6040516001600160401b0390911681526020016103c9565b6103bc61043d3660046153b7565b610b43565b606a54610455906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b610477620493e081565b6040519081526020016103c9565b6103df610493366004615404565b610ce9565b6104026104a6366004615404565b610d30565b6104026104b9366004615541565b610f61565b60685461041790600160401b90046001600160401b031681565b60685461041790600160801b90046001600160401b031681565b607254610417906001600160401b031681565b61040261051336600461567f565b611840565b60725461041790600160401b90046001600160401b031681565b610402610540366004615404565b611c16565b610477610553366004615404565b606d6020526000908152604090205481565b6103bc611cd5565b61040261057b366004615721565b611ce2565b61047761058e366004615404565b60666020526000908152604090205481565b6104026105ae3660046157f8565b61209b565b6104026105c13660046157f8565b612170565b610402612224565b6104026105dc366004615404565b612238565b6104026105ef366004615815565b612492565b606954610417906001600160401b031681565b61064a6106153660046158b3565b6071602052600090815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b0395861681529490931660208501529183015260608201526080016103c9565b60725461041790600160c01b90046001600160401b031681565b61041762093a8081565b6104026106a73660046158da565b612582565b6033546001600160a01b0316610455565b610477612635565b6104026106d3366004615404565b612731565b610477600c81565b607454610477565b607054610455906001600160a01b031681565b6065546104179061010090046001600160401b031681565b6104176206978081565b606c5461041790600160a81b90046001600160401b031681565b606554610752906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103c9565b6107a0610773366004615404565b606760205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b0392831660208501529116908201526060016103c9565b60655461045590600160581b90046001600160a01b031681565b61041761292f565b6104026107f53660046158f7565b61297c565b610402610808366004615404565b612a1e565b60695461045590600160401b90046001600160a01b031681565b606c54610455906001600160a01b031681565b610402610848366004615933565b612adb565b606c546103df90600160a01b900460ff1681565b60725461041790600160801b90046001600160401b031681565b610402613165565b610402610891366004615815565b6132b3565b6104176103e881565b60685461041790600160c01b90046001600160401b031681565b606b54610455906001600160a01b031681565b6104026108da366004615a25565b61347e565b6104026108ed36600461567f565b6138bc565b6104026109003660046157f8565b613a3b565b6104026109133660046157f8565b613aef565b607354610455906001600160a01b031681565b61047760745481565b606f805461094190615a69565b80601f016020809104026020016040519081016040528092919081815260200182805461096d90615a69565b80156109ba5780601f1061098f576101008083540402835291602001916109ba565b820191906000526020600020905b81548152906001019060200180831161099d57829003601f168201915b505050505081565b6073546001600160a01b03163314610a2d5760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b60648201526084015b60405180910390fd5b6103e88161ffff1610158015610a4857506104008161ffff16105b610ae05760405162461bcd60e51b815260206004820152604a60248201527f506f6c79676f6e5a6b45564d3a3a7365744d756c7469706c696572426174636860448201527f4665653a206e65774d756c7469706c696572426174636846656520696e636f7260648201527f726563742072616e676500000000000000000000000000000000000000000000608482015260a401610a24565b606580546affff0000000000000000001916690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b03808616600081815260676020526040808220549388168252902054606092911580610b7557508115155b610be9576040805162461bcd60e51b81526020600482015260248101919091527f506f6c79676f6e5a6b45564d3a3a676574496e707574536e61726b427974657360448201527f3a206f6c64416363496e7075744861736820646f6573206e6f742065786973746064820152608401610a24565b80610c5e576040805162461bcd60e51b81526020600482015260248101919091527f506f6c79676f6e5a6b45564d3a3a676574496e707574536e61726b427974657360448201527f3a206e6577416363496e7075744861736820646f6573206e6f742065786973746064820152608401610a24565b606c54604080516bffffffffffffffffffffffff193360601b166020820152603481019790975260548701939093526001600160c01b031960c0998a1b81166074880152600160a81b909104891b8116607c870152608486019490945260a485015260c4840194909452509290931b90911660e4830152805180830360cc01815260ec909201905290565b6072546001600160401b0382811660009081526071602052604081205490924292610d1f92600160801b90920481169116615ab9565b6001600160401b0316111592915050565b6073546001600160a01b03163314610d965760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b62093a806001600160401b0382161115610e3e5760405162461bcd60e51b815260206004820152604e60248201527f506f6c79676f6e5a6b45564d3a3a73657454727573746564416767726567617460448201527f6f7254696d656f75743a20457863656564206d61782068616c7420616767726560648201527f676174696f6e2074696d656f7574000000000000000000000000000000000000608482015260a401610a24565b60655460ff16610efa576072546001600160401b03600160c01b909104811690821610610efa5760405162461bcd60e51b8152602060048201526044602482018190527f506f6c79676f6e5a6b45564d3a3a736574547275737465644167677265676174908201527f6f7254696d656f75743a204e65772074696d656f7574206d757374206265206c60648201527f6f77657200000000000000000000000000000000000000000000000000000000608482015260a401610a24565b6072805477ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b6001600160401b038416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610b38565b60655460ff1615610fe55760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401610a24565b606954600160401b90046001600160a01b0316331461106c5760405162461bcd60e51b815260206004820152603a60248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c795472757374656453657175656e6360448201527f65723a204f6e6c7920747275737465642073657175656e6365720000000000006064820152608401610a24565b8051806110e15760405162461bcd60e51b815260206004820152603d60248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365426174636865733a204160448201527f74206c65617374206d7573742073657175656e636520312062617463680000006064820152608401610a24565b6103e8811061115a576040805162461bcd60e51b81526020600482015260248101919091527f506f6c79676f6e5a6b45564d3a3a73657175656e6365426174636865733a204360448201527f616e6e6f742073657175656e63652074686174206d616e7920626174636865736064820152608401610a24565b6068546001600160401b03600160401b82048116600081815260676020526040812054838516949293600160801b90930490921691905b858110156116535760008782815181106111ad576111ad615ae4565b60200260200101519050600081606001516001600160401b0316111561138457836111d781615afa565b94505060008160000151805190602001208260200151836060015160405160200161122293929190928352602083019190915260c01b6001600160c01b031916604082015260480190565b60408051601f1981840301815291815281516020928301206001600160401b0388166000908152606690935291205490915081146112c85760405162461bcd60e51b815260206004820152603d60248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365426174636865733a204660448201527f6f7263656420626174636865732064617461206d757374206d617463680000006064820152608401610a24565b81606001516001600160401b031682604001516001600160401b0316101561137e5760405162461bcd60e51b815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365426174636865733a204660448201527f6f7263656420626174636865732074696d657374616d70206d7573742062652060648201527f626967676572206f7220657175616c207468616e206d696e0000000000000000608482015260a401610a24565b50611512565b602081015115806114265750606c5460208201516040517f257b36320000000000000000000000000000000000000000000000000000000081526001600160a01b039092169163257b3632916113e09160040190815260200190565b6020604051808303816000875af11580156113ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114239190615b20565b15155b6114985760405162461bcd60e51b815260206004820152603a60248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365426174636865733a204760448201527f6c6f62616c206578697420726f6f74206d7573742065786973740000000000006064820152608401610a24565b805151620493e0116115125760405162461bcd60e51b815260206004820152603a60248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365426174636865733a205460448201527f72616e73616374696f6e73206279746573206f766572666c6f770000000000006064820152608401610a24565b856001600160401b031681604001516001600160401b03161015801561154557504281604001516001600160401b031611155b6115b75760405162461bcd60e51b815260206004820152603d60248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365426174636865733a205460448201527f696d657374616d70206d75737420626520696e736964652072616e67650000006064820152608401610a24565b805180516020918201208183015160408085015181519485018890529084019290925260608084019190915260c09190911b6001600160c01b031916608083015233901b6bffffffffffffffffffffffff19166088820152609c01604051602081830303815290604052805190602001209250848061163590615afa565b9550508060400151955050808061164b90615b39565b915050611191565b506068546001600160401b03600160c01b909104811690831611156116e05760405162461bcd60e51b815260206004820152603560248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365426174636865733a204660448201527f6f7263652062617463686573206f766572666c6f7700000000000000000000006064820152608401610a24565b60685460009061170090600160801b90046001600160401b031684615b52565b611713906001600160401b031687615b7a565b60408051606081018252848152426001600160401b03908116602080840191825260688054600160401b9081900485168688019081528c861660008181526067909552979093209551865592516001909501805492519585166fffffffffffffffffffffffffffffffff199384161795851684029590951790945583548b841691161793029290921767ffffffffffffffff60801b1916600160801b928716929092029190911790556074549091506117f1903390309084906117d69190615b91565b606554600160581b90046001600160a01b0316929190613b7c565b6117f9613c2d565b606854604051600160401b9091046001600160401b0316907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050565b60655460ff16156118c45760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401610a24565b6072546001600160401b0387811660009081526067602052604090206001015442926118fb92600160c01b90910481169116615ab9565b6001600160401b0316111561199e5760405162461bcd60e51b815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2054727560448201527f737465642061676772656761746f722074696d656f7574206e6f74206578706960648201527f7265640000000000000000000000000000000000000000000000000000000000608482015260a401610a24565b6103e86119ab8888615b52565b6001600160401b031610611a275760405162461bcd60e51b815260206004820152603c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2043616e60448201527f6e6f74207665726966792074686174206d616e792062617463686573000000006064820152608401610a24565b611a378888888888888888613cd1565b611a408661424e565b607254600160801b90046001600160401b0316600003611b11576069805467ffffffffffffffff19166001600160401b038881169182179092556000908152606d602052604090208590556072541615611aae57607280546fffffffffffffffffffffffffffffffff191690555b606c546040516333d6247d60e01b8152600481018790526001600160a01b03909116906333d6247d90602401600060405180830381600087803b158015611af457600080fd5b505af1158015611b08573d6000803e3d6000fd5b50505050611bcb565b611b19613c2d565b607280546001600160401b0316906000611b3283615afa565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b8152607254871660009081526071909352949091209251835492518616600160401b026fffffffffffffffffffffffffffffffff199093169516949094171781559151600183015551600290910155505b60405184815233906001600160401b038816907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966906020015b60405180910390a35050505050505050565b606a546001600160a01b03163314611cc957611c3181610ce9565b611cc95760405162461bcd60e51b815260206004820152605460248201527f506f6c79676f6e5a6b45564d3a3a636f6e736f6c696461746550656e64696e6760448201527f53746174653a2050656e64696e67207374617465206973206e6f74207265616460648201527f7920746f20626520636f6e736f6c696461746564000000000000000000000000608482015260a401610a24565b611cd281614440565b50565b606e805461094190615a69565b600054610100900460ff1615808015611d025750600054600160ff909116105b80611d1c5750303b158015611d1c575060005460ff166001145b611d8e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a24565b6000805460ff191660011790558015611db1576000805461ff0019166101001790555b606c80546001600160a01b03199081166001600160a01b038c811691909117909255606580547fff0000000000000000000000000000000000000000ffffffffffffffffffffff16600160581b8c851602179055606b805482168a841617905560708054909116918816919091179055611e2e60208601866157f8565b607380546001600160a01b0319166001600160a01b0392909216919091179055611e5e60608601604087016157f8565b606980546001600160a01b0392909216600160401b027fffffffff0000000000000000000000000000000000000000ffffffffffffffff909216919091179055611eae60c0860160a087016157f8565b606a80546001600160a01b0319166001600160a01b039290921691909117905560008052606d6020527fda90043ba5b4096ba14704bc227ab0d3167da15b887e62ab2e76e37daa711356849055611f0b60e0860160c08701615404565b607280546001600160401b0392909216600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff909216919091179055611f536040860160208701615404565b606c80546001600160401b0392909216600160a81b027fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff909216919091179055611fa36080860160608701615404565b607280546001600160401b0392909216600160801b0267ffffffffffffffff60801b19909216919091179055611fdf60a08601608087016158da565b606c8054911515600160a01b0260ff60a01b19909216919091179055606e6120078482615bf6565b50606f6120148382615bf6565b50670de0b6b3a7640000607455606580546affffffffffffffffffff0019166a03ea00000000000007080017905561204a61462a565b8015612090576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b6073546001600160a01b031633146121015760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b606980547fffffffff0000000000000000000000000000000000000000ffffffffffffffff16600160401b6001600160a01b038416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610b38565b6073546001600160a01b031633146121d65760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b607380546001600160a01b0319166001600160a01b0383169081179091556040519081527f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a190602001610b38565b61222c6146b0565b612236600061470a565b565b6033546001600160a01b0316331461248a57600061225461292f565b9050806001600160401b0316826001600160401b0316116122dd5760405162461bcd60e51b815260206004820152603c60248201527f506f6c79676f6e5a6b45564d3a3a6163746976617465456d657267656e63795360448201527f746174653a20426174636820616c7265616479207665726966696564000000006064820152608401610a24565b6068546001600160401b03600160401b90910481169083161180159061231f57506001600160401b038083166000908152606760205260409020600101541615155b6123b75760405162461bcd60e51b815260206004820152605060248201527f506f6c79676f6e5a6b45564d3a3a6163746976617465456d657267656e63795360448201527f746174653a204261746368206e6f742073657175656e636564206f72206e6f7460648201527f20656e64206f662073657175656e636500000000000000000000000000000000608482015260a401610a24565b6001600160401b0380831660009081526067602052604090206001015442916123e59162093a809116615ab9565b6001600160401b031611156124885760405162461bcd60e51b815260206004820152604d60248201527f506f6c79676f6e5a6b45564d3a3a6163746976617465456d657267656e63795360448201527f746174653a204167677265676174696f6e2068616c742074696d656f7574206960648201527f73206e6f74206578706972656400000000000000000000000000000000000000608482015260a401610a24565b505b611cd261475c565b60655460ff16156125165760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401610a24565b6125278989898989898989896147cc565b6001600160401b0386166000908152606d60209081526040918290205482519081529081018690527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161209061475c565b6073546001600160a01b031633146125e85760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b606c8054821515600160a01b0260ff60a01b199091161790556040517fbacda50a4a8575be1d91a7ebe29ee45056f3a94f12a2281eb6b43afa33bcefe690610b3890831515815260200190565b6065546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000918291600160581b9091046001600160a01b0316906370a0823190602401602060405180830381865afa1580156126a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c59190615b20565b905060006126d161292f565b6068546001600160401b03600160401b820481169161270191600160801b8204811691600160c01b900416615b52565b61270b9190615ab9565b6127159190615b52565b6001600160401b0316905061272a8183615ccb565b9250505090565b6073546001600160a01b031633146127975760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b62093a806001600160401b038216111561283f5760405162461bcd60e51b815260206004820152604960248201527f506f6c79676f6e5a6b45564d3a3a73657450656e64696e67537461746554696d60448201527f656f75743a20457863656564206d61782068616c74206167677265676174696f60648201527f6e2074696d656f75740000000000000000000000000000000000000000000000608482015260a401610a24565b60655460ff166128d4576072546001600160401b03600160801b9091048116908216106128d45760405162461bcd60e51b815260206004820152603f60248201527f506f6c79676f6e5a6b45564d3a3a73657450656e64696e67537461746554696d60448201527f656f75743a204e65772074696d656f7574206d757374206265206c6f776572006064820152608401610a24565b6072805467ffffffffffffffff60801b1916600160801b6001600160401b038416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610b38565b6072546000906001600160401b03161561296c57506072546001600160401b03908116600090815260716020526040902054600160401b90041690565b506069546001600160401b031690565b6073546001600160a01b031633146129e25760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b606e6129ee8282615bf6565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610b389190615364565b6073546001600160a01b03163314612a845760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b6065805468ffffffffffffffff0019166101006001600160401b038416908102919091179091556040519081527f03a12f7e53d2a9e31a9e913d85c12c4c38feb92abe003c111329298af088437f90602001610b38565b60655460ff1615612b5f5760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401610a24565b606c54600160a01b900460ff161515600114612bef5760405162461bcd60e51b815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a6973466f7263654261746368416c6c6f776560448201527f643a204f6e6c7920696620666f72636520626174636820697320617661696c61606482015262626c6560e81b608482015260a401610a24565b805180612c645760405162461bcd60e51b815260206004820152603f60248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365466f726365426174636860448201527f65733a204d75737420666f726365206174206c656173742031206261746368006064820152608401610a24565b6103e88110612d015760405162461bcd60e51b815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365466f726365426174636860448201527f65733a2043616e6e6f74207665726966792074686174206d616e79206261746360648201527f6865730000000000000000000000000000000000000000000000000000000000608482015260a401610a24565b6068546001600160401b03600160c01b8204811691612d29918491600160801b900416615cdf565b1115612d9d5760405162461bcd60e51b815260206004820152603760248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365466f726365426174636860448201527f65733a20466f72636520626174636820696e76616c69640000000000000000006064820152608401610a24565b6068546001600160401b03600160401b820481166000818152606760205260408120549193600160801b9004909216915b8481101561305e576000868281518110612dea57612dea615ae4565b602002602001015190508380612dff90615afa565b825180516020918201208185015160408087015181519485019390935283015260c01b6001600160c01b03191660608201529095506000915060680160408051601f1981840301815291815281516020928301206001600160401b038816600090815260669093529120549091508114612f075760405162461bcd60e51b815260206004820152604260248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365466f726365426174636860448201527f65733a20466f7263656420626174636865732064617461206d757374206d617460648201527f6368000000000000000000000000000000000000000000000000000000000000608482015260a401610a24565b612f12600188615b7a565b8303612fcf5742620697808360400151612f2c9190615ab9565b6001600160401b03161115612fcf5760405162461bcd60e51b815260206004820152604960248201527f506f6c79676f6e5a6b45564d3a3a73657175656e6365466f726365426174636860448201527f65733a20466f72636564206261746368206973206e6f7420696e2074696d656f60648201527f757420706572696f640000000000000000000000000000000000000000000000608482015260a401610a24565b8151805160209182012081840151604080519384018890528301919091526060808301919091524260c01b6001600160c01b031916608083015233901b6bffffffffffffffffffffffff19166088820152609c01604051602081830303815290604052805190602001209350858061304690615afa565b9650505050808061305690615b39565b915050612dce565b506068805467ffffffffffffffff1916426001600160401b03908116918217808455604080516060810182528681526020808201958652600160401b9384900485168284019081528a861660008181526067909352848320935184559651600193909301805491519387166fffffffffffffffffffffffffffffffff199092169190911792861685029290921790915585547fffffffffffffffff00000000000000000000000000000000ffffffffffffffff1694830267ffffffffffffffff60801b191694909417600160801b88851602179485905551930416917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a25050505050565b60655460ff166131dd5760405162461bcd60e51b815260206004820152603b60248201527f456d657267656e63794d616e616765723a3a6966456d657267656e637953746160448201527f74653a206f6e6c7920696620656d657267656e637920737461746500000000006064820152608401610a24565b6073546001600160a01b031633146132435760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b607060009054906101000a90046001600160a01b03166001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561329357600080fd5b505af11580156132a7573d6000803e3d6000fd5b50505050612236614ed6565b606a546001600160a01b031633146133335760405162461bcd60e51b815260206004820152603c60248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c79547275737465644167677265676160448201527f746f723a204f6e6c7920747275737465642061676772656761746f72000000006064820152608401610a24565b6133448989898989898989896147cc565b6069805467ffffffffffffffff19166001600160401b038881169182179092556000908152606d60205260409020859055607254161561339857607280546fffffffffffffffffffffffffffffffff191690555b606c546040516333d6247d60e01b8152600481018790526001600160a01b03909116906333d6247d90602401600060405180830381600087803b1580156133de57600080fd5b505af11580156133f2573d6000803e3d6000fd5b50506072805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a80000000000000000000000000000000000000000000000000179055505060405184815233906001600160401b038816907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a3505050505050505050565b60655460ff16156135025760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401610a24565b606c54600160a01b900460ff1615156001146135925760405162461bcd60e51b815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a6973466f7263654261746368416c6c6f776560448201527f643a204f6e6c7920696620666f72636520626174636820697320617661696c61606482015262626c6560e81b608482015260a401610a24565b600061359d60745490565b9050818111156136155760405162461bcd60e51b815260206004820152602a60248201527f506f6c79676f6e5a6b45564d3a3a666f72636542617463683a204e6f7420656e60448201527f6f756768206d61746963000000000000000000000000000000000000000000006064820152608401610a24565b620493e083511061368e5760405162461bcd60e51b815260206004820152603560248201527f506f6c79676f6e5a6b45564d3a3a666f72636542617463683a205472616e736160448201527f6374696f6e73206279746573206f766572666c6f7700000000000000000000006064820152608401610a24565b6065546136ad90600160581b90046001600160a01b0316333084613b7c565b606c54604080517f3ed691ef00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691633ed691ef9160048083019260209291908290030181865afa158015613710573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137349190615b20565b60688054919250600160c01b9091046001600160401b031690601861375883615afa565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555050838051906020012081426040516020016137b793929190928352602083019190915260c01b6001600160c01b031916604082015260480190565b60408051808303601f190181529181528151602092830120606854600160c01b90046001600160401b03166000908152606690935291205532330361385b57606854604080518381523360208201526060918101829052600091810191909152600160c01b9091046001600160401b0316907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26138b6565b606860189054906101000a90046001600160401b03166001600160401b03167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9318233876040516138ad93929190615cf7565b60405180910390a25b50505050565b606a546001600160a01b0316331461393c5760405162461bcd60e51b815260206004820152603c60248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c79547275737465644167677265676160448201527f746f723a204f6e6c7920747275737465642061676772656761746f72000000006064820152608401610a24565b61394c8888888888888888613cd1565b6069805467ffffffffffffffff19166001600160401b038881169182179092556000908152606d6020526040902085905560725416156139a057607280546fffffffffffffffffffffffffffffffff191690555b606c546040516333d6247d60e01b8152600481018790526001600160a01b03909116906333d6247d90602401600060405180830381600087803b1580156139e657600080fd5b505af11580156139fa573d6000803e3d6000fd5b50506040518681523392506001600160401b03891691507f0c0ce073a7d7b5850c04ccc4b20ee7d3179d5f57d0ac44399565792c0f72fce790602001611c04565b6073546001600160a01b03163314613aa15760405162461bcd60e51b815260206004820152602360248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c7941646d696e3a204f6e6c7920616460448201526236b4b760e91b6064820152608401610a24565b606a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610b38565b613af76146b0565b6001600160a01b038116613b735760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a24565b611cd28161470a565b6040516001600160a01b03808516602483015283166044820152606481018290526138b69085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614f83565b6072546001600160401b03600160401b820481169116111561223657607254600090613c6a90600160401b90046001600160401b03166001615ab9565b9050613c7581610ce9565b15611cd257607254600090600290613c979084906001600160401b0316615b52565b613ca19190615d28565b613cab9083615ab9565b9050613cb681610ce9565b15613cc857613cc481614440565b5050565b613cc482614440565b600080613cdc61292f565b90506001600160401b038a1615613e68576072546001600160401b03908116908b161115613d985760405162461bcd60e51b815260206004820152605960248201527f506f6c79676f6e5a6b45564d3a3a5f766572696679426174636865733a20706560448201527f6e64696e6753746174654e756d206d757374206265206c657373206f7220657160648201527f75616c207468616e206c61737450656e64696e67537461746500000000000000608482015260a401610a24565b6001600160401b03808b1660009081526071602052604090206002810154815490945090918b8116600160401b9092041614613e625760405162461bcd60e51b815260206004820152604d60248201527f506f6c79676f6e5a6b45564d3a3a5f766572696679426174636865733a20696e60448201527f69744e756d4261746368206d757374206d61746368207468652070656e64696e60648201527f6720737461746520626174636800000000000000000000000000000000000000608482015260a401610a24565b50613fcb565b6001600160401b0389166000908152606d6020526040902054915081613f1d5760405162461bcd60e51b8152602060048201526044602482018190527f506f6c79676f6e5a6b45564d3a3a5f766572696679426174636865733a20696e908201527f69744e756d426174636820737461746520726f6f7420646f6573206e6f74206560648201527f7869737400000000000000000000000000000000000000000000000000000000608482015260a401610a24565b806001600160401b0316896001600160401b03161115613fcb5760405162461bcd60e51b815260206004820152605e60248201527f506f6c79676f6e5a6b45564d3a3a5f766572696679426174636865733a20696e60448201527f69744e756d4261746368206d757374206265206c657373206f7220657175616c60648201527f207468616e2063757272656e744c617374566572696669656442617463680000608482015260a401610a24565b806001600160401b0316886001600160401b0316116140785760405162461bcd60e51b815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a5f766572696679426174636865733a20666960448201527f6e616c4e65774261746368206d75737420626520626967676572207468616e2060648201527f63757272656e744c617374566572696669656442617463680000000000000000608482015260a401610a24565b60006140878a8a8a868b610b43565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516140bc9190615d4e565b602060405180830381855afa1580156140d9573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906140fc9190615b20565b6141069190615d6a565b606b546040805160208101825283815290516343753b4d60e01b81529293506001600160a01b03909116916343753b4d9161414a918b918b918b9190600401615d7e565b602060405180830381865afa158015614167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061418b9190615df8565b6141fd5760405162461bcd60e51b815260206004820152602b60248201527f506f6c79676f6e5a6b45564d3a3a5f766572696679426174636865733a20496e60448201527f76616c69642070726f6f660000000000000000000000000000000000000000006064820152608401610a24565b6142403361420b858d615b52565b6001600160401b031661421c612635565b6142269190615b91565b606554600160581b90046001600160a01b0316919061506d565b505050505050505050505050565b600061425861292f565b9050816000806142688484615b52565b6001600160401b031690505b836001600160401b0316836001600160401b03161461431a576001600160401b038084166000908152606760205260409020606554600182015491926101009091048116916142c4911642615b7a565b11156142ff5760018101546142e990600160401b90046001600160401b031685615b52565b6142fc906001600160401b031684615cdf565b92505b60010154600160401b90046001600160401b03169250614274565b60006143268383615b7a565b9050828110156143a657600061433c8285615b7a565b9050600c811161434c578061434f565b600c5b905061435c816003615b91565b61436790600a615ef9565b6065546143869083906901000000000000000000900461ffff16615ef9565b6074546143939190615b91565b61439d9190615ccb565b60745550614438565b60006143b28483615b7a565b9050600c81116143c257806143c5565b600c5b905060006143d4826003615b91565b6143df90600a615ef9565b6065546143fe9084906901000000000000000000900461ffff16615ef9565b60745461440b9190615b91565b6144159190615ccb565b9050806074546074546144289190615b91565b6144329190615ccb565b60745550505b505050505050565b6001600160401b0381161580159061446d57506072546001600160401b03600160401b9091048116908216115b801561448857506072546001600160401b0390811690821611155b6144fa5760405162461bcd60e51b815260206004820152603f60248201527f506f6c79676f6e5a6b45564d3a3a5f636f6e736f6c696461746550656e64696e60448201527f6753746174653a2070656e64696e6753746174654e756d20696e76616c6964006064820152608401610a24565b6001600160401b038181166000818152607160209081526040808320805460698054600160401b9283900490981667ffffffffffffffff19909816881790556002820154878652606d9094529382902092909255607280546fffffffffffffffff000000000000000019169390940292909217909255606c54600183015491516333d6247d60e01b815260048101929092529192916001600160a01b0316906333d6247d90602401600060405180830381600087803b1580156145bc57600080fd5b505af11580156145d0573d6000803e3d6000fd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161461d91815260200190565b60405180910390a3505050565b600054610100900460ff166146a75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a24565b6122363361470a565b6033546001600160a01b031633146122365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a24565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b607060009054906101000a90046001600160a01b03166001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156147ac57600080fd5b505af11580156147c0573d6000803e3d6000fd5b505050506122366150b6565b60006001600160401b038a161561497c576072546001600160401b03908116908b1611156148ae5760405162461bcd60e51b815260206004820152606560248201527f506f6c79676f6e5a6b45564d3a3a5f70726f766544697374696e637450656e6460448201527f696e6753746174653a2070656e64696e6753746174654e756d206d757374206260648201527f65206c657373206f7220657175616c207468616e206c61737450656e64696e6760848201527f537461746500000000000000000000000000000000000000000000000000000060a482015260c401610a24565b506001600160401b03808a1660009081526071602052604090206002810154815490928a8116600160401b90920416146149765760405162461bcd60e51b815260206004820152605960248201527f506f6c79676f6e5a6b45564d3a3a5f70726f766544697374696e637450656e6460448201527f696e6753746174653a20696e69744e756d4261746368206d757374206d61746360648201527f68207468652070656e64696e6720737461746520626174636800000000000000608482015260a401610a24565b50614ae6565b506001600160401b0387166000908152606d602052604090205480614a2f5760405162461bcd60e51b815260206004820152605060248201527f506f6c79676f6e5a6b45564d3a3a5f70726f766544697374696e637450656e6460448201527f696e6753746174653a20696e69744e756d426174636820737461746520726f6f60648201527f7420646f6573206e6f7420657869737400000000000000000000000000000000608482015260a401610a24565b6069546001600160401b039081169089161115614ae65760405162461bcd60e51b815260206004820152606360248201527f506f6c79676f6e5a6b45564d3a3a5f70726f766544697374696e637450656e6460448201527f696e6753746174653a20696e69744e756d4261746368206d757374206265206c60648201527f657373206f7220657175616c207468616e206c617374566572696669656442616084820152620e8c6d60eb1b60a482015260c401610a24565b6072546001600160401b03908116908a1611801590614b165750896001600160401b0316896001600160401b0316115b8015614b3757506072546001600160401b03600160401b9091048116908a16115b614bcf5760405162461bcd60e51b815260206004820152604860248201527f506f6c79676f6e5a6b45564d3a3a5f70726f766544697374696e637450656e6460448201527f696e6753746174653a2066696e616c50656e64696e6753746174654e756d206960648201527f6e636f7272656374000000000000000000000000000000000000000000000000608482015260a401610a24565b6001600160401b03898116600090815260716020526040902054600160401b9004811690881614614c9a5760405162461bcd60e51b815260206004820152606360248201527f506f6c79676f6e5a6b45564d3a3a5f70726f766544697374696e637450656e6460448201527f696e6753746174653a2066696e616c4e65774261746368206d7573742062652060648201527f657175616c207468616e2063757272656e744c617374566572696669656442616084820152620e8c6d60eb1b60a482015260c401610a24565b6000614ca9898989858a610b43565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614cde9190615d4e565b602060405180830381855afa158015614cfb573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190614d1e9190615b20565b614d289190615d6a565b606b546040805160208101825283815290516343753b4d60e01b81529293506001600160a01b03909116916343753b4d91614d6c918a918a918a9190600401615d7e565b602060405180830381865afa158015614d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614dad9190615df8565b614e1f5760405162461bcd60e51b815260206004820152603760248201527f506f6c79676f6e5a6b45564d3a3a5f70726f766544697374696e637450656e6460448201527f696e6753746174653a20496e76616c69642070726f6f660000000000000000006064820152608401610a24565b6001600160401b038b166000908152607160205260409020600201548790036142405760405162461bcd60e51b815260206004820152605b60248201527f506f6c79676f6e5a6b45564d3a3a5f70726f766544697374696e637450656e6460448201527f696e6753746174653a2053746f72656420726f6f74206d75737420626520646960648201527f66666572656e74207468616e206e657720737461746520726f6f740000000000608482015260a401610a24565b60655460ff16614f4e5760405162461bcd60e51b815260206004820152603b60248201527f456d657267656e63794d616e616765723a3a6966456d657267656e637953746160448201527f74653a206f6e6c7920696620656d657267656e637920737461746500000000006064820152608401610a24565b6065805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6000614fd8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166151729092919063ffffffff16565b8051909150156150685780806020019051810190614ff69190615df8565b6150685760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a24565b505050565b6040516001600160a01b0383166024820152604481018290526150689084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401613bc9565b60655460ff161561513a5760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401610a24565b6065805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060615181848460008561518b565b90505b9392505050565b6060824710156152035760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a24565b6001600160a01b0385163b61525a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a24565b600080866001600160a01b031685876040516152769190615d4e565b60006040518083038185875af1925050503d80600081146152b3576040519150601f19603f3d011682016040523d82523d6000602084013e6152b8565b606091505b50915091506152c88282866152d3565b979650505050505050565b606083156152e2575081615184565b8251156152f25782518084602001fd5b8160405162461bcd60e51b8152600401610a249190615364565b60005b8381101561532757818101518382015260200161530f565b838111156138b65750506000910152565b6000815180845261535081602086016020860161530c565b601f01601f19169290920160200192915050565b6020815260006151846020830184615338565b60006020828403121561538957600080fd5b813561ffff8116811461518457600080fd5b80356001600160401b03811681146153b257600080fd5b919050565b600080600080600060a086880312156153cf57600080fd5b6153d88661539b565b94506153e66020870161539b565b94979496505050506040830135926060810135926080909101359150565b60006020828403121561541657600080fd5b6151848261539b565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156154575761545761541f565b60405290565b604051606081016001600160401b03811182821017156154575761545761541f565b604051601f8201601f191681016001600160401b03811182821017156154a7576154a761541f565b604052919050565b60006001600160401b038211156154c8576154c861541f565b5060051b60200190565b600082601f8301126154e357600080fd5b81356001600160401b038111156154fc576154fc61541f565b61550f601f8201601f191660200161547f565b81815284602083860101111561552457600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561555457600080fd5b82356001600160401b038082111561556b57600080fd5b818501915085601f83011261557f57600080fd5b813561559261558d826154af565b61547f565b81815260059190911b830184019084810190888311156155b157600080fd5b8585015b8381101561564a578035858111156155cd5760008081fd5b86016080818c03601f19018113156155e55760008081fd5b6155ed615435565b89830135888111156155ff5760008081fd5b61560d8e8c838701016154d2565b8252506040808401358b830152606061562781860161539b565b8284015261563684860161539b565b9083015250855250509186019186016155b5565b5098975050505050505050565b806040810183101561566857600080fd5b92915050565b806080810183101561566857600080fd5b6000806000806000806000806101a0898b03121561569c57600080fd5b6156a58961539b565b97506156b360208a0161539b565b96506156c160408a0161539b565b955060608901359450608089013593506156de8a60a08b01615657565b92506156ed8a60e08b0161566e565b91506156fd8a6101608b01615657565b90509295985092959890939650565b6001600160a01b0381168114611cd257600080fd5b600080600080600080600080888a036101c081121561573f57600080fd5b893561574a8161570c565b985060208a013561575a8161570c565b975060408a013561576a8161570c565b965060608a013561577a8161570c565b955060e0607f198201121561578e57600080fd5b5060808901935061016089013592506101808901356001600160401b03808211156157b857600080fd5b6157c48c838d016154d2565b93506101a08b01359150808211156157db57600080fd5b506157e88b828c016154d2565b9150509295985092959890939650565b60006020828403121561580a57600080fd5b81356151848161570c565b60008060008060008060008060006101c08a8c03121561583457600080fd5b61583d8a61539b565b985061584b60208b0161539b565b975061585960408b0161539b565b965061586760608b0161539b565b955060808a0135945060a08a013593506158848b60c08c01615657565b92506158948b6101008c0161566e565b91506158a48b6101808c01615657565b90509295985092959850929598565b6000602082840312156158c557600080fd5b5035919050565b8015158114611cd257600080fd5b6000602082840312156158ec57600080fd5b8135615184816158cc565b60006020828403121561590957600080fd5b81356001600160401b0381111561591f57600080fd5b61592b848285016154d2565b949350505050565b6000602080838503121561594657600080fd5b82356001600160401b038082111561595d57600080fd5b818501915085601f83011261597157600080fd5b813561597f61558d826154af565b81815260059190911b8301840190848101908883111561599e57600080fd5b8585015b8381101561564a578035858111156159ba5760008081fd5b86016060818c03601f19018113156159d25760008081fd5b6159da61545d565b89830135888111156159ec5760008081fd5b6159fa8e8c838701016154d2565b8252506040808401358b830152615a1283850161539b565b90820152855250509186019186016159a2565b60008060408385031215615a3857600080fd5b82356001600160401b03811115615a4e57600080fd5b615a5a858286016154d2565b95602094909401359450505050565b600181811c90821680615a7d57607f821691505b602082108103615a9d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60006001600160401b03808316818516808303821115615adb57615adb615aa3565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b60006001600160401b03808316818103615b1657615b16615aa3565b6001019392505050565b600060208284031215615b3257600080fd5b5051919050565b600060018201615b4b57615b4b615aa3565b5060010190565b60006001600160401b0383811690831681811015615b7257615b72615aa3565b039392505050565b600082821015615b8c57615b8c615aa3565b500390565b6000816000190483118215151615615bab57615bab615aa3565b500290565b601f82111561506857600081815260208120601f850160051c81016020861015615bd75750805b601f850160051c820191505b8181101561443857828155600101615be3565b81516001600160401b03811115615c0f57615c0f61541f565b615c2381615c1d8454615a69565b84615bb0565b602080601f831160018114615c585760008415615c405750858301515b600019600386901b1c1916600185901b178555614438565b600085815260208120601f198616915b82811015615c8757888601518255948401946001909101908401615c68565b5085821015615ca55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b600082615cda57615cda615cb5565b500490565b60008219821115615cf257615cf2615aa3565b500190565b8381526001600160a01b0383166020820152606060408201526000615d1f6060830184615338565b95945050505050565b60006001600160401b0380841680615d4257615d42615cb5565b92169190910492915050565b60008251615d6081846020870161530c565b9190910192915050565b600082615d7957615d79615cb5565b500690565b61012081016040808784376000838201818152879190815b6002811015615db657848483379084018281529284019290600101615d96565b5050828760c0870137610100850181815286935091505b6001811015615dec578251825260209283019290910190600101615dcd565b50505095945050505050565b600060208284031215615e0a57600080fd5b8151615184816158cc565b600181815b80851115615e50578160001904821115615e3657615e36615aa3565b80851615615e4357918102915b93841c9390800290615e1a565b509250929050565b600082615e6757506001615668565b81615e7457506000615668565b8160018114615e8a5760028114615e9457615eb0565b6001915050615668565b60ff841115615ea557615ea5615aa3565b50506001821b615668565b5060208310610133831016604e8410600b8410161715615ed3575081810a615668565b615edd8383615e15565b8060001904821115615ef157615ef1615aa3565b029392505050565b60006151848383615e5856fea2646970667358221220ea509bc505efc7dc646bd307099d94fdc965a048e39f3a02723bea443cbced3b64736f6c634300080f0033", + ABI: "[{\"inputs\":[{\"internalType\":\"contractIPolygonZkEVMGlobalExitRoot\",\"name\":\"_globalExitRootManager\",\"type\":\"address\"},{\"internalType\":\"contractIERC20Upgradeable\",\"name\":\"_matic\",\"type\":\"address\"},{\"internalType\":\"contractIVerifierRollup\",\"name\":\"_rollupVerifier\",\"type\":\"address\"},{\"internalType\":\"contractIPolygonZkEVMBridge\",\"name\":\"_bridgeAddress\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"_chainID\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"_forkID\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BatchAlreadyVerified\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BatchNotSequencedOrNotSequenceEnd\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExceedMaxVerifyBatches\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FinalNumBatchBelowLastVerifiedBatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FinalNumBatchDoesNotMatchPendingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FinalPendingStateNumInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ForceBatchTimeoutNotExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ForceBatchesOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ForcedDataDoesNotMatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GlobalExitRootNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HaltTimeoutNotExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InitNumBatchAboveLastVerifiedBatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InitNumBatchDoesNotMatchPendingState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRangeBatchTimeTarget\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRangeMultiplierBatchFee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NewAccInputHashDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NewPendingStateTimeoutMustBeLower\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NewTrustedAggregatorTimeoutMustBeLower\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotEnoughMaticAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OldAccInputHashDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OldStateRootDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyEmergencyState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyNotEmergencyState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyPendingAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyTrustedAggregator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyTrustedSequencer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingStateDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingStateInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingStateNotConsolidable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingStateTimeoutExceedHaltAggregationTimeout\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SequenceZeroBatches\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SequencedTimestampBelowForcedTimestamp\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SequencedTimestampInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StoredRootMustBeDifferentThanNewRoot\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransactionsLengthAboveMax\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TrustedAggregatorTimeoutExceedHaltAggregationTimeout\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TrustedAggregatorTimeoutNotExpired\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AcceptAdminRole\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"}],\"name\":\"ConsolidatePendingState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"forceBatchNum\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"lastGlobalExitRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sequencer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"transactions\",\"type\":\"bytes\"}],\"name\":\"ForceBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"OverridePendingState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"storedStateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"provedStateRoot\",\"type\":\"bytes32\"}],\"name\":\"ProveNonDeterministicPendingState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"}],\"name\":\"SequenceBatches\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"}],\"name\":\"SequenceForceBatches\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"newMultiplierBatchFee\",\"type\":\"uint16\"}],\"name\":\"SetMultiplierBatchFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newPendingStateTimeout\",\"type\":\"uint64\"}],\"name\":\"SetPendingStateTimeout\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTrustedAggregator\",\"type\":\"address\"}],\"name\":\"SetTrustedAggregator\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newTrustedAggregatorTimeout\",\"type\":\"uint64\"}],\"name\":\"SetTrustedAggregatorTimeout\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newTrustedSequencer\",\"type\":\"address\"}],\"name\":\"SetTrustedSequencer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"newTrustedSequencerURL\",\"type\":\"string\"}],\"name\":\"SetTrustedSequencerURL\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newVerifyBatchTimeTarget\",\"type\":\"uint64\"}],\"name\":\"SetVerifyBatchTimeTarget\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newPendingAdmin\",\"type\":\"address\"}],\"name\":\"TransferAdminRole\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"forkID\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"}],\"name\":\"UpdateZkEVMVersion\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"VerifyBatches\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"VerifyBatchesTrustedAggregator\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptAdminRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequencedBatchNum\",\"type\":\"uint64\"}],\"name\":\"activateEmergencyState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"batchNumToStateRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridgeAddress\",\"outputs\":[{\"internalType\":\"contractIPolygonZkEVMBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"calculateRewardPerBatch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"chainID\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"}],\"name\":\"consolidatePendingState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deactivateEmergencyState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"transactions\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"maticAmount\",\"type\":\"uint256\"}],\"name\":\"forceBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"forcedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"forkID\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBatchFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"oldStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"}],\"name\":\"getInputSnarkBytes\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastVerifiedBatch\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalExitRootManager\",\"outputs\":[{\"internalType\":\"contractIPolygonZkEVMGlobalExitRoot\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"trustedSequencer\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"pendingStateTimeout\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"trustedAggregator\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"trustedAggregatorTimeout\",\"type\":\"uint64\"}],\"internalType\":\"structPolygonZkEVM.InitializePackedParameters\",\"name\":\"initializePackedParameters\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"genesisRoot\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"_trustedSequencerURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_networkName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_version\",\"type\":\"string\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isEmergencyState\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"}],\"name\":\"isPendingStateConsolidable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastBatchSequenced\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastForceBatch\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastForceBatchSequenced\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastPendingState\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastPendingStateConsolidated\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimestamp\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastVerifiedBatch\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"matic\",\"outputs\":[{\"internalType\":\"contractIERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"multiplierBatchFee\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"networkName\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"initPendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalPendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[2]\",\"name\":\"proofA\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"proofB\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"proofC\",\"type\":\"uint256[2]\"}],\"name\":\"overridePendingState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingStateTimeout\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"pendingStateTransitions\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastVerifiedBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"exitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"initPendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalPendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[2]\",\"name\":\"proofA\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"proofB\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"proofC\",\"type\":\"uint256[2]\"}],\"name\":\"proveNonDeterministicPendingState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollupVerifier\",\"outputs\":[{\"internalType\":\"contractIVerifierRollup\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"transactions\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"globalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"minForcedTimestamp\",\"type\":\"uint64\"}],\"internalType\":\"structPolygonZkEVM.BatchData[]\",\"name\":\"batches\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"l2Coinbase\",\"type\":\"address\"}],\"name\":\"sequenceBatches\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"transactions\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"globalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"minForcedTimestamp\",\"type\":\"uint64\"}],\"internalType\":\"structPolygonZkEVM.ForcedBatchData[]\",\"name\":\"batches\",\"type\":\"tuple[]\"}],\"name\":\"sequenceForceBatches\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"sequencedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"accInputHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sequencedTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"previousLastBatchSequenced\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"newMultiplierBatchFee\",\"type\":\"uint16\"}],\"name\":\"setMultiplierBatchFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newPendingStateTimeout\",\"type\":\"uint64\"}],\"name\":\"setPendingStateTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newTrustedAggregator\",\"type\":\"address\"}],\"name\":\"setTrustedAggregator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newTrustedAggregatorTimeout\",\"type\":\"uint64\"}],\"name\":\"setTrustedAggregatorTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newTrustedSequencer\",\"type\":\"address\"}],\"name\":\"setTrustedSequencer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"newTrustedSequencerURL\",\"type\":\"string\"}],\"name\":\"setTrustedSequencerURL\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newVerifyBatchTimeTarget\",\"type\":\"uint64\"}],\"name\":\"setVerifyBatchTimeTarget\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newPendingAdmin\",\"type\":\"address\"}],\"name\":\"transferAdminRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedAggregator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedAggregatorTimeout\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedSequencer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"trustedSequencerURL\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifyBatchTimeTarget\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[2]\",\"name\":\"proofA\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"proofB\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"proofC\",\"type\":\"uint256[2]\"}],\"name\":\"verifyBatches\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"pendingStateNum\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initNumBatch\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[2]\",\"name\":\"proofA\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"proofB\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"proofC\",\"type\":\"uint256[2]\"}],\"name\":\"verifyBatchesTrustedAggregator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x6101406040523480156200001257600080fd5b5060405162004b7938038062004b798339810160408190526200003591620000a5565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b0391821661010052166101205262000131565b6001600160a01b03811681146200008557600080fd5b50565b80516001600160401b0381168114620000a057600080fd5b919050565b60008060008060008060c08789031215620000bf57600080fd5b8651620000cc816200006f565b6020880151909650620000df816200006f565b6040880151909550620000f2816200006f565b606088015190945062000105816200006f565b9250620001156080880162000088565b91506200012560a0880162000088565b90509295509295509295565b60805160a05160c05160e0516101005161012051614981620001f8600039600081816105de01528181610bc701526121bc0152600081816107160152610b9d0152600081816106dc0152818161263f015261366201526000818161082701528181610ef201528181611383015281816127650152818161291901528181612bd001526134360152600081816108c301528181612fa4015261396f0152600081816107cb0152818161168701528181611a7a015281816128ed015261306f01526149816000f3fe608060405234801561001057600080fd5b50600436106103835760003560e01c80638c3d7301116101de578063cfa8ed471161010f578063e7a7ed02116100ad578063f14916d61161007c578063f14916d61461090b578063f2fde38b1461091e578063f851a44014610931578063f8b823e41461094457600080fd5b8063e7a7ed02146108a4578063e8bf92ed146108be578063eaeb077b146108e5578063f020c93e146108f857600080fd5b8063d8d1091b116100e9578063d8d1091b1461085c578063d939b3151461086f578063dbc1697614610889578063e11f3f181461089157600080fd5b8063cfa8ed4714610808578063d02103ca14610822578063d2e129f91461084957600080fd5b8063ada8f9191161017c578063b4d63f5811610156578063b4d63f5814610766578063b6b0b097146107c6578063c0ed84e0146107ed578063c89e42df146107f557600080fd5b8063ada8f919146106fe578063adc879e914610711578063afd23cbe1461073857600080fd5b80639c9f3dfe116101b85780639c9f3dfe146106a95780639f0d039d146106bc578063a066215c146106c4578063a3c573eb146106d757600080fd5b80638c3d7301146106885780638da5cb5b1461069057806399f5634e146106a157600080fd5b80634a1a89a7116102b8578063715018a6116102565780637fcb3653116102305780637fcb3653146105c6578063831c7ead146105d9578063837a473814610600578063841b24d71461066e57600080fd5b8063715018a6146105985780637215541a146105a057806375c508b3146105b357600080fd5b8063542028d511610292578063542028d51461054a5780635e9145c9146105525780636b8616ce146105655780636ff512cc1461058557600080fd5b80634a1a89a7146104ef5780634a910e6a146105095780635392c5e01461051c57600080fd5b80632987898311610325578063423fa856116102ff578063423fa8561461049557806345605267146104af578063458c0477146104c95780634834a343146104dc57600080fd5b80632987898314610455578063383b3be81461046f578063394218e91461048257600080fd5b80631816b7e5116103615780631816b7e5146103ef57806319d8ac6114610404578063220d789914610417578063267822471461042a57600080fd5b80630a0d9fbe14610388578063107bf28c146103bd57806315064c96146103d2575b600080fd5b606f546103a09061010090046001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6103c561094d565b6040516103b49190613ecc565b606f546103df9060ff1681565b60405190151581526020016103b4565b6104026103fd366004613edf565b6109db565b005b6073546103a0906001600160401b031681565b6103c5610425366004613f1f565b610ab9565b607b5461043d906001600160a01b031681565b6040516001600160a01b0390911681526020016103b4565b60745461043d90600160401b90046001600160a01b031681565b6103df61047d366004613f6c565b610c25565b610402610490366004613f6c565b610c6c565b6073546103a090600160401b90046001600160401b031681565b6073546103a090600160801b90046001600160401b031681565b6079546103a0906001600160401b031681565b6104026104ea366004613faf565b610d84565b6079546103a090600160401b90046001600160401b031681565b610402610517366004613f6c565b611060565b61053c61052a366004613f6c565b60756020526000908152604090205481565b6040519081526020016103b4565b6103c56110e8565b61040261056036600461409e565b6110f5565b61053c610573366004613f6c565b60716020526000908152604090205481565b6104026105933660046140f1565b6116f7565b610402611791565b6104026105ae366004613f6c565b6117a5565b6104026105c136600461410c565b6118fd565b6074546103a0906001600160401b031681565b6103a07f000000000000000000000000000000000000000000000000000000000000000081565b61064361060e3660046141aa565b6078602052600090815260409020805460018201546002909201546001600160401b0380831693600160401b90930416919084565b604080516001600160401b0395861681529490931660208501529183015260608201526080016103b4565b6079546103a090600160c01b90046001600160401b031681565b610402611998565b6033546001600160a01b031661043d565b61053c611a3f565b6104026106b7366004613f6c565b611b62565b60705461053c565b6104026106d2366004613f6c565b611c6e565b61043d7f000000000000000000000000000000000000000000000000000000000000000081565b61040261070c3660046140f1565b611d36565b6103a07f000000000000000000000000000000000000000000000000000000000000000081565b606f54610753906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103b4565b6107a1610774366004613f6c565b607260205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b0392831660208501529116908201526060016103b4565b61043d7f000000000000000000000000000000000000000000000000000000000000000081565b6103a0611dbc565b610402610803366004614265565b611e09565b606f5461043d90600160581b90046001600160a01b031681565b61043d7f000000000000000000000000000000000000000000000000000000000000000081565b6104026108573660046142e2565b611e70565b61040261086a366004614394565b612244565b6079546103a090600160801b90046001600160401b031681565b610402612612565b61040261089f36600461410c565b6126b8565b6073546103a090600160c01b90046001600160401b031681565b61043d7f000000000000000000000000000000000000000000000000000000000000000081565b6104026108f33660046143d5565b612851565b610402610906366004613faf565b612b24565b6104026109193660046140f1565b612c71565b61040261092c3660046140f1565b612d0b565b607a5461043d906001600160a01b031681565b61053c60705481565b6077805461095a90614420565b80601f016020809104026020016040519081016040528092919081815260200182805461098690614420565b80156109d35780601f106109a8576101008083540402835291602001916109d3565b820191906000526020600020905b8154815290600101906020018083116109b657829003601f168201915b505050505081565b607a546001600160a01b03163314610a0657604051634755657960e01b815260040160405180910390fd5b6103e88161ffff161080610a1f57506103ff8161ffff16115b15610a56576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80546affff0000000000000000001916690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b6001600160401b038086166000818152607260205260408082205493881682529020546060929115801590610aec575081155b15610b23576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610b5a576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516bffffffffffffffffffffffff193360601b166020820152603481019690965260548601929092526001600160c01b031960c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b6079546001600160401b0382811660009081526078602052604081205490924292610c5b92600160801b90920481169116614470565b6001600160401b0316111592915050565b607a546001600160a01b03163314610c9757604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115610cc457604051631d06e87960e01b815260040160405180910390fd5b606f5460ff16610d1d576079546001600160401b03600160c01b909104811690821610610d1d576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b6001600160401b038416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610aae565b606f5460ff1615610da857604051630bc011ff60e21b815260040160405180910390fd5b6079546001600160401b038781166000908152607260205260409020600101544292610ddf92600160c01b90910481169116614470565b6001600160401b03161115610e20576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8610e2d8888614497565b6001600160401b03161115610e5557604051635acfba9d60e11b815260040160405180910390fd5b610e658888888888888888612d98565b610e6e866130a4565b607954600160801b90046001600160401b0316600003610f5b576074805467ffffffffffffffff19166001600160401b0388811691821790925560009081526075602052604090208590556079541615610edc57607980546fffffffffffffffffffffffffffffffff191690555b6040516333d6247d60e01b8152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015610f3e57600080fd5b505af1158015610f52573d6000803e3d6000fd5b50505050611015565b610f63613298565b607980546001600160401b0316906000610f7c836144b7565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b8152607954871660009081526078909352949091209251835492518616600160401b026fffffffffffffffffffffffffffffffff199093169516949094171781559151600183015551600290910155505b60405184815233906001600160401b038816907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966906020015b60405180910390a35050505050505050565b607454600160401b90046001600160a01b031633146110dc57606f5460ff161561109d57604051630bc011ff60e21b815260040160405180910390fd5b6110a681610c25565b6110dc576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110e581613338565b50565b6076805461095a90614420565b606f5460ff161561111957604051630bc011ff60e21b815260040160405180910390fd5b606f54600160581b90046001600160a01b03163314611164576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160008190036111875760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156111aa57604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160401b82048116600081815260726020526040812054838516949293600160801b909304909216919082905b868110156115415760008a8a838181106111ff576111ff6144dd565b905060200281019061121191906144f3565b61121a90614513565b805180516020909101206060820151919250906001600160401b0316156113405785611245816144b7565b9650506000818360200151846060015160405160200161128593929190928352602083019190915260c01b6001600160c01b031916604082015260480190565b60408051601f1981840301815291815281516020928301206001600160401b038a166000908152607190935291205490915081146112d65760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b03808816600090815260716020526040808220919091556060850151908501519082169116101561133a576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611457565b6020820151158015906113fa575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063257b3632906024016020604051808303816000875af11580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f8919061459f565b155b15611431576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815151620493e01015611457576040516328a69b1f60e21b815260040160405180910390fd5b876001600160401b031682604001516001600160401b0316108061148757504282604001516001600160401b0316115b156114be576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b6001600160c01b03191660808301528b901b6bffffffffffffffffffffffff19166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611539906145b8565b9150506111e3565b5061154c8685614470565b6073549094506001600160401b03600160c01b909104811690841611156115865760405163c630a00d60e01b815260040160405180910390fd5b60006115928285614497565b6115a5906001600160401b0316886145d1565b60408051606081018252858152426001600160401b03908116602080840191825260738054600160401b9081900485168688019081528d861660008181526072909552979093209551865592516001909501805492519585166fffffffffffffffffffffffffffffffff199384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611664576073805467ffffffffffffffff60801b1916600160801b6001600160401b038716021790555b6116af33308361167360705490565b61167d91906145e4565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169291906134f0565b6116b7613298565b6040516001600160401b038616907f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce90600090a250505050505050505050565b607a546001600160a01b0316331461172257604051634755657960e01b815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff16600160581b6001600160a01b038416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610aae565b6117996135a7565b6117a36000613601565b565b6033546001600160a01b031633146118f55760006117c1611dbc565b9050806001600160401b0316826001600160401b03161161180e576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6073546001600160401b03600160401b9091048116908316118061184d57506001600160401b0380831660009081526072602052604090206001015416155b15611884576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160401b0380831660009081526072602052604090206001015442916118b29162093a809116614470565b6001600160401b031611156118f3576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6110e5613660565b606f5460ff161561192157604051630bc011ff60e21b815260040160405180910390fd5b6119328989898989898989896136db565b6001600160401b0386166000908152607560209081526040918290205482519081529081018690527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161198d613660565b505050505050505050565b607b546001600160a01b031633146119dc576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0390921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae5919061459f565b90506000611af1611dbc565b6073546001600160401b03600160401b8204811691611b2191600160801b8204811691600160c01b900416614497565b611b2b9190614470565b611b359190614497565b6001600160401b0316905080600003611b515760009250505090565b611b5b8183614611565b9250505090565b607a546001600160a01b03163314611b8d57604051634755657960e01b815260040160405180910390fd5b62093a806001600160401b0382161115611bba57604051630cc9650760e41b815260040160405180910390fd5b606f5460ff16611c13576079546001600160401b03600160801b909104811690821610611c13576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805467ffffffffffffffff60801b1916600160801b6001600160401b038416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610aae565b607a546001600160a01b03163314611c9957604051634755657960e01b815260040160405180910390fd5b62015180816001600160401b03161115611cdf576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f805468ffffffffffffffff0019166101006001600160401b038416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610aae565b607a546001600160a01b03163314611d6157604051634755657960e01b815260040160405180910390fd5b607b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610aae565b6079546000906001600160401b031615611df957506079546001600160401b03908116600090815260786020526040902054600160401b90041690565b506074546001600160401b031690565b607a546001600160a01b03163314611e3457604051634755657960e01b815260040160405180910390fd5b6076611e408282614673565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610aae9190613ecc565b600054610100900460ff1615808015611e905750600054600160ff909116105b80611eaa5750303b158015611eaa575060005460ff166001145b611f215760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b6000805460ff191660011790558015611f44576000805461ff0019166101001790555b611f5160208801886140f1565b607a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055611f8e60408801602089016140f1565b606f80546001600160a01b0392909216600160581b027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055611fde60808801606089016140f1565b607480546001600160a01b0392909216600160401b027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790556000805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad86905560766120578682614673565b5060776120648582614673565b5062093a806120796060890160408a01613f6c565b6001600160401b031611156120a157604051630cc9650760e41b815260040160405180910390fd5b6120b16060880160408901613f6c565b607980546001600160401b0392909216600160801b0267ffffffffffffffff60801b1990921691909117905562093a806120f160a0890160808a01613f6c565b6001600160401b0316111561211957604051631d06e87960e01b815260040160405180910390fd5b61212960a0880160808901613f6c565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b6001600160401b039390931692909202919091179055670de0b6b3a7640000607055606f80546affffffffffffffffffff0019166a03ea000000000000070800179055612197613a5c565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd660007f000000000000000000000000000000000000000000000000000000000000000085856040516121ed949392919061475b565b60405180910390a1801561223b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b606f5460ff161561226857604051630bc011ff60e21b815260040160405180910390fd5b80600081900361228b5760405163cb591a5f60e01b815260040160405180910390fd5b6103e88111156122ae57604051635acfba9d60e11b815260040160405180910390fd5b6073546001600160401b03600160c01b82048116916122d6918491600160801b900416614792565b11156122f55760405163c630a00d60e01b815260040160405180910390fd5b6073546001600160401b03600160401b820481166000818152607260205260408120549193600160801b9004909216915b848110156124fc576000878783818110612342576123426144dd565b905060200281019061235491906147a5565b61235d906147bb565b905083612369816144b7565b825180516020918201208185015160408087015190519499509194506000936123b39386939101928352602083019190915260c01b6001600160c01b031916604082015260480190565b60408051601f1981840301815291815281516020928301206001600160401b0389166000908152607190935291205490915081146124045760405163671ebaaf60e11b815260040160405180910390fd5b6001600160401b0386166000908152607160205260408120556124286001896145d1565b840361248357426206978084604001516124429190614470565b6001600160401b03161115612483576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b6001600160c01b031916608083015233901b6bffffffffffffffffffffffff19166088820152609c0160405160208183030381529060405280519060200120945050505080806124f4906145b8565b915050612326565b506125078484614470565b607380546001600160401b0342811667ffffffffffffffff199092168217808455604080516060810182528781526020808201958652600160401b9384900485168284019081528589166000818152607290935284832093518455965160019390930180549151871686026fffffffffffffffffffffffffffffffff1990921693871693909317179091558554938916600160801b0267ffffffffffffffff60801b19938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a546001600160a01b0316331461263d57604051634755657960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dbc169766040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561269857600080fd5b505af11580156126ac573d6000803e3d6000fd5b505050506117a3613ae2565b607454600160401b90046001600160a01b031633146126ea5760405163bbcbbc0560e01b815260040160405180910390fd5b6126fb8989898989898989896136db565b6074805467ffffffffffffffff19166001600160401b038881169182179092556000908152607560205260409020859055607954161561274f57607980546fffffffffffffffffffffffffffffffff191690555b6040516333d6247d60e01b8152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b1580156127b157600080fd5b505af11580156127c5573d6000803e3d6000fd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a80000000000000000000000000000000000000000000000000179055505060405184815233906001600160401b038816907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a3505050505050505050565b606f5460ff161561287557604051630bc011ff60e21b815260040160405180910390fd5b600061288060705490565b9050818111156128bc576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620493e08311156128e0576040516328a69b1f60e21b815260040160405180910390fd5b6129156001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330846134f0565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612975573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612999919061459f565b60738054919250600160c01b9091046001600160401b03169060186129bd836144b7565b91906101000a8154816001600160401b0302191690836001600160401b031602179055505084846040516129f2929190614836565b60408051918290038220602083015281018290526001600160c01b03194260c01b16606082015260680160408051808303601f190181529181528151602092830120607354600160c01b90046001600160401b031660009081526071909352912055323303612ac057607354604080518381523360208201526060918101829052600091810191909152600160c01b9091046001600160401b0316907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2612b1d565b607360189054906101000a90046001600160401b03166001600160401b03167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051612b149493929190614846565b60405180910390a25b5050505050565b607454600160401b90046001600160a01b03163314612b565760405163bbcbbc0560e01b815260040160405180910390fd5b612b668888888888888888612d98565b6074805467ffffffffffffffff19166001600160401b0388811691821790925560009081526075602052604090208590556079541615612bba57607980546fffffffffffffffffffffffffffffffff191690555b6040516333d6247d60e01b8152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b158015612c1c57600080fd5b505af1158015612c30573d6000803e3d6000fd5b50506040518681523392506001600160401b03891691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200161104e565b607a546001600160a01b03163314612c9c57604051634755657960e01b815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff16600160401b6001600160a01b038416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610aae565b612d136135a7565b6001600160a01b038116612d8f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401611f18565b6110e581613601565b600080612da3611dbc565b90506001600160401b038a1615612e39576079546001600160401b03908116908b161115612de45760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808b1660009081526078602052604090206002810154815490945090918b8116600160401b9092041614612e3357604051632bd2e3e760e01b815260040160405180910390fd5b50612ea5565b6001600160401b038916600090815260756020526040902054915081612e72576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316896001600160401b03161115612ea557604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611612ef0576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612eff8a8a8a868b610ab9565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051612f34919061486f565b602060405180830381855afa158015612f51573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190612f74919061459f565b612f7e9190614881565b6040805160208101825282815290516343753b4d60e01b81529192506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916343753b4d91612fde918b918b918b9190600401614895565b602060405180830381865afa158015612ffb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061301f9190614903565b61303c576040516309bde33960e01b815260040160405180910390fd5b6130963361304a858d614497565b6001600160401b031661305b611a3f565b61306591906145e4565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190613b53565b505050505050505050505050565b60006130ae611dbc565b9050816000806130be8484614497565b606f546001600160401b0391821692506000916130e191610100900416426145d1565b90505b846001600160401b0316846001600160401b031614613181576001600160401b038085166000908152607260205260409020600181015490911682101561317557600181015461314490600160401b90046001600160401b031686614497565b613157906001600160401b031685614792565b6001820154600160401b90046001600160401b03169550935061317b565b50613181565b506130e4565b600061318d84846145d1565b9050808410156131e457838103600c81116131a857806131ab565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816131da576131da6145fb565b0460705550613254565b808403600c81116131f557806131f8565b600c5b90506000816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161322f5761322f6145fb565b04905080607054670de0b6b3a7640000028161324d5761324d6145fb565b0460705550505b683635c9adc5dea00000607054111561327957683635c9adc5dea0000060705561223b565b633b9aca00607054101561223b57633b9aca0060705550505050505050565b6079546001600160401b03600160401b82048116911611156117a3576079546000906132d590600160401b90046001600160401b03166001614470565b90506132e081610c25565b156110e5576079546000906002906133029084906001600160401b0316614497565b61330c9190614925565b6133169083614470565b905061332181610c25565b156133335761332f81613338565b5050565b61332f825b6079546001600160401b03600160401b909104811690821611158061336b57506079546001600160401b03908116908216115b156133a2576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160401b038181166000818152607860209081526040808320805460748054600160401b9283900490981667ffffffffffffffff1990981688179055600282015487865260759094529382902092909255607980546fffffffffffffffff000000000000000019169390940292909217909255600182015490516333d6247d60e01b815260048101919091529091907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333d6247d90602401600060405180830381600087803b15801561348257600080fd5b505af1158015613496573d6000803e3d6000fd5b50505050826001600160401b0316816001600160401b03167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516134e391815260200190565b60405180910390a3505050565b6040516001600160a01b03808516602483015283166044820152606481018290526135a19085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613ba1565b50505050565b6033546001600160a01b031633146117a35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611f18565b603380546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156136bb57600080fd5b505af11580156136cf573d6000803e3d6000fd5b505050506117a3613c86565b60006001600160401b038a161561376f576079546001600160401b03908116908b16111561371c5760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b03808a1660009081526078602052604090206002810154815490928a8116600160401b909204161461376957604051632bd2e3e760e01b815260040160405180910390fd5b506137d7565b506001600160401b038716600090815260756020526040902054806137a7576040516324cbdcc360e11b815260040160405180910390fd5b6074546001600160401b0390811690891611156137d757604051630f2b74f160e11b815260040160405180910390fd5b6079546001600160401b03908116908a1611806138065750896001600160401b0316896001600160401b031611155b8061382757506079546001600160401b03600160401b9091048116908a1611155b1561385e576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160401b03898116600090815260786020526040902054600160401b90048116908816146138bb576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006138ca898989858a610ab9565b905060007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516138ff919061486f565b602060405180830381855afa15801561391c573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061393f919061459f565b6139499190614881565b6040805160208101825282815290516343753b4d60e01b81529192506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916343753b4d916139a9918a918a918a9190600401614895565b602060405180830381865afa1580156139c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ea9190614903565b613a07576040516309bde33960e01b815260040160405180910390fd5b6001600160401b038b16600090815260786020526040902060020154879003613096576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff16613ad95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611f18565b6117a333613601565b606f5460ff16613b1e576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6040516001600160a01b038316602482015260448101829052613b9c9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161353d565b505050565b6000613bf6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613ce29092919063ffffffff16565b805190915015613b9c5780806020019051810190613c149190614903565b613b9c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611f18565b606f5460ff1615613caa57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b6060613cf18484600085613cfb565b90505b9392505050565b606082471015613d735760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401611f18565b6001600160a01b0385163b613dca5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611f18565b600080866001600160a01b03168587604051613de6919061486f565b60006040518083038185875af1925050503d8060008114613e23576040519150601f19603f3d011682016040523d82523d6000602084013e613e28565b606091505b5091509150613e38828286613e43565b979650505050505050565b60608315613e52575081613cf4565b825115613e625782518084602001fd5b8160405162461bcd60e51b8152600401611f189190613ecc565b60005b83811015613e97578181015183820152602001613e7f565b50506000910152565b60008151808452613eb8816020860160208601613e7c565b601f01601f19169290920160200192915050565b602081526000613cf46020830184613ea0565b600060208284031215613ef157600080fd5b813561ffff81168114613cf457600080fd5b80356001600160401b0381168114613f1a57600080fd5b919050565b600080600080600060a08688031215613f3757600080fd5b613f4086613f03565b9450613f4e60208701613f03565b94979496505050506040830135926060810135926080909101359150565b600060208284031215613f7e57600080fd5b613cf482613f03565b8060408101831015613f9857600080fd5b92915050565b8060808101831015613f9857600080fd5b6000806000806000806000806101a0898b031215613fcc57600080fd5b613fd589613f03565b9750613fe360208a01613f03565b9650613ff160408a01613f03565b9550606089013594506080890135935061400e8a60a08b01613f87565b925061401d8a60e08b01613f9e565b915061402d8a6101608b01613f87565b90509295985092959890939650565b60008083601f84011261404e57600080fd5b5081356001600160401b0381111561406557600080fd5b6020830191508360208260051b850101111561408057600080fd5b9250929050565b80356001600160a01b0381168114613f1a57600080fd5b6000806000604084860312156140b357600080fd5b83356001600160401b038111156140c957600080fd5b6140d58682870161403c565b90945092506140e8905060208501614087565b90509250925092565b60006020828403121561410357600080fd5b613cf482614087565b60008060008060008060008060006101c08a8c03121561412b57600080fd5b6141348a613f03565b985061414260208b01613f03565b975061415060408b01613f03565b965061415e60608b01613f03565b955060808a0135945060a08a0135935061417b8b60c08c01613f87565b925061418b8b6101008c01613f9e565b915061419b8b6101808c01613f87565b90509295985092959850929598565b6000602082840312156141bc57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126141ea57600080fd5b81356001600160401b0380821115614204576142046141c3565b604051601f8301601f19908116603f0116810190828211818310171561422c5761422c6141c3565b8160405283815286602085880101111561424557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561427757600080fd5b81356001600160401b0381111561428d57600080fd5b614299848285016141d9565b949350505050565b60008083601f8401126142b357600080fd5b5081356001600160401b038111156142ca57600080fd5b60208301915083602082850101111561408057600080fd5b6000806000806000808688036101208112156142fd57600080fd5b60a081121561430b57600080fd5b5086955060a0870135945060c08701356001600160401b038082111561433057600080fd5b61433c8a838b016141d9565b955060e089013591508082111561435257600080fd5b61435e8a838b016141d9565b945061010089013591508082111561437557600080fd5b5061438289828a016142a1565b979a9699509497509295939492505050565b600080602083850312156143a757600080fd5b82356001600160401b038111156143bd57600080fd5b6143c98582860161403c565b90969095509350505050565b6000806000604084860312156143ea57600080fd5b83356001600160401b0381111561440057600080fd5b61440c868287016142a1565b909790965060209590950135949350505050565b600181811c9082168061443457607f821691505b60208210810361445457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156144905761449061445a565b5092915050565b6001600160401b038281168282160390808211156144905761449061445a565b60006001600160401b038083168181036144d3576144d361445a565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b60008235607e1983360301811261450957600080fd5b9190910192915050565b60006080823603121561452557600080fd5b604051608081016001600160401b038282108183111715614548576145486141c3565b81604052843591508082111561455d57600080fd5b5061456a368286016141d9565b8252506020830135602082015261458360408401613f03565b604082015261459460608401613f03565b606082015292915050565b6000602082840312156145b157600080fd5b5051919050565b6000600182016145ca576145ca61445a565b5060010190565b81810381811115613f9857613f9861445a565b8082028115828204841417613f9857613f9861445a565b634e487b7160e01b600052601260045260246000fd5b600082614620576146206145fb565b500490565b601f821115613b9c57600081815260208120601f850160051c8101602086101561464c5750805b601f850160051c820191505b8181101561466b57828155600101614658565b505050505050565b81516001600160401b0381111561468c5761468c6141c3565b6146a08161469a8454614420565b84614625565b602080601f8311600181146146d557600084156146bd5750858301515b600019600386901b1c1916600185901b17855561466b565b600085815260208120601f198616915b82811015614704578886015182559484019460019091019084016146e5565b50858210156147225787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006001600160401b03808716835280861660208401525060606040830152614788606083018486614732565b9695505050505050565b80820180821115613f9857613f9861445a565b60008235605e1983360301811261450957600080fd5b6000606082360312156147cd57600080fd5b604051606081016001600160401b0382821081831117156147f0576147f06141c3565b81604052843591508082111561480557600080fd5b50614812368286016141d9565b8252506020830135602082015261482b60408401613f03565b604082015292915050565b8183823760009101908152919050565b8481526001600160a01b0384166020820152606060408201526000614788606083018486614732565b60008251614509818460208701613e7c565b600082614890576148906145fb565b500690565b61012081016040808784378083018660005b60028110156148c4578382843791830191908301906001016148a7565b505050808560c08501375061010082018360005b60018110156148f75781518352602092830192909101906001016148d8565b50505095945050505050565b60006020828403121561491557600080fd5b81518015158114613cf457600080fd5b60006001600160401b038084168061493f5761493f6145fb565b9216919091049291505056fea264697066735822122072ed050d1998118630bb876e7055794a22f8bedaec013380c1d9e72b528968db64736f6c63430008110033", } // PolygonzkevmABI is the input ABI used to generate the binding from. @@ -69,7 +67,7 @@ var PolygonzkevmABI = PolygonzkevmMetaData.ABI var PolygonzkevmBin = PolygonzkevmMetaData.Bin // DeployPolygonzkevm deploys a new Ethereum contract, binding an instance of Polygonzkevm to it. -func DeployPolygonzkevm(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Polygonzkevm, error) { +func DeployPolygonzkevm(auth *bind.TransactOpts, backend bind.ContractBackend, _globalExitRootManager common.Address, _matic common.Address, _rollupVerifier common.Address, _bridgeAddress common.Address, _chainID uint64, _forkID uint64) (common.Address, *types.Transaction, *Polygonzkevm, error) { parsed, err := PolygonzkevmMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -78,7 +76,7 @@ func DeployPolygonzkevm(auth *bind.TransactOpts, backend bind.ContractBackend) ( return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(PolygonzkevmBin), backend) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(PolygonzkevmBin), backend, _globalExitRootManager, _matic, _rollupVerifier, _bridgeAddress, _chainID, _forkID) if err != nil { return common.Address{}, nil, nil, err } @@ -227,161 +225,6 @@ func (_Polygonzkevm *PolygonzkevmTransactorRaw) Transact(opts *bind.TransactOpts return _Polygonzkevm.Contract.contract.Transact(opts, method, params...) } -// FORCEBATCHTIMEOUT is a free data retrieval call binding the contract method 0xab9fc5ef. -// -// Solidity: function FORCE_BATCH_TIMEOUT() view returns(uint64) -func (_Polygonzkevm *PolygonzkevmCaller) FORCEBATCHTIMEOUT(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _Polygonzkevm.contract.Call(opts, &out, "FORCE_BATCH_TIMEOUT") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// FORCEBATCHTIMEOUT is a free data retrieval call binding the contract method 0xab9fc5ef. -// -// Solidity: function FORCE_BATCH_TIMEOUT() view returns(uint64) -func (_Polygonzkevm *PolygonzkevmSession) FORCEBATCHTIMEOUT() (uint64, error) { - return _Polygonzkevm.Contract.FORCEBATCHTIMEOUT(&_Polygonzkevm.CallOpts) -} - -// FORCEBATCHTIMEOUT is a free data retrieval call binding the contract method 0xab9fc5ef. -// -// Solidity: function FORCE_BATCH_TIMEOUT() view returns(uint64) -func (_Polygonzkevm *PolygonzkevmCallerSession) FORCEBATCHTIMEOUT() (uint64, error) { - return _Polygonzkevm.Contract.FORCEBATCHTIMEOUT(&_Polygonzkevm.CallOpts) -} - -// HALTAGGREGATIONTIMEOUT is a free data retrieval call binding the contract method 0x8b48931e. -// -// Solidity: function HALT_AGGREGATION_TIMEOUT() view returns(uint64) -func (_Polygonzkevm *PolygonzkevmCaller) HALTAGGREGATIONTIMEOUT(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _Polygonzkevm.contract.Call(opts, &out, "HALT_AGGREGATION_TIMEOUT") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// HALTAGGREGATIONTIMEOUT is a free data retrieval call binding the contract method 0x8b48931e. -// -// Solidity: function HALT_AGGREGATION_TIMEOUT() view returns(uint64) -func (_Polygonzkevm *PolygonzkevmSession) HALTAGGREGATIONTIMEOUT() (uint64, error) { - return _Polygonzkevm.Contract.HALTAGGREGATIONTIMEOUT(&_Polygonzkevm.CallOpts) -} - -// HALTAGGREGATIONTIMEOUT is a free data retrieval call binding the contract method 0x8b48931e. -// -// Solidity: function HALT_AGGREGATION_TIMEOUT() view returns(uint64) -func (_Polygonzkevm *PolygonzkevmCallerSession) HALTAGGREGATIONTIMEOUT() (uint64, error) { - return _Polygonzkevm.Contract.HALTAGGREGATIONTIMEOUT(&_Polygonzkevm.CallOpts) -} - -// MAXBATCHMULTIPLIER is a free data retrieval call binding the contract method 0x9eb831b9. -// -// Solidity: function MAX_BATCH_MULTIPLIER() view returns(uint256) -func (_Polygonzkevm *PolygonzkevmCaller) MAXBATCHMULTIPLIER(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _Polygonzkevm.contract.Call(opts, &out, "MAX_BATCH_MULTIPLIER") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// MAXBATCHMULTIPLIER is a free data retrieval call binding the contract method 0x9eb831b9. -// -// Solidity: function MAX_BATCH_MULTIPLIER() view returns(uint256) -func (_Polygonzkevm *PolygonzkevmSession) MAXBATCHMULTIPLIER() (*big.Int, error) { - return _Polygonzkevm.Contract.MAXBATCHMULTIPLIER(&_Polygonzkevm.CallOpts) -} - -// MAXBATCHMULTIPLIER is a free data retrieval call binding the contract method 0x9eb831b9. -// -// Solidity: function MAX_BATCH_MULTIPLIER() view returns(uint256) -func (_Polygonzkevm *PolygonzkevmCallerSession) MAXBATCHMULTIPLIER() (*big.Int, error) { - return _Polygonzkevm.Contract.MAXBATCHMULTIPLIER(&_Polygonzkevm.CallOpts) -} - -// MAXTRANSACTIONSBYTELENGTH is a free data retrieval call binding the contract method 0x2d0889d3. -// -// Solidity: function MAX_TRANSACTIONS_BYTE_LENGTH() view returns(uint256) -func (_Polygonzkevm *PolygonzkevmCaller) MAXTRANSACTIONSBYTELENGTH(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _Polygonzkevm.contract.Call(opts, &out, "MAX_TRANSACTIONS_BYTE_LENGTH") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// MAXTRANSACTIONSBYTELENGTH is a free data retrieval call binding the contract method 0x2d0889d3. -// -// Solidity: function MAX_TRANSACTIONS_BYTE_LENGTH() view returns(uint256) -func (_Polygonzkevm *PolygonzkevmSession) MAXTRANSACTIONSBYTELENGTH() (*big.Int, error) { - return _Polygonzkevm.Contract.MAXTRANSACTIONSBYTELENGTH(&_Polygonzkevm.CallOpts) -} - -// MAXTRANSACTIONSBYTELENGTH is a free data retrieval call binding the contract method 0x2d0889d3. -// -// Solidity: function MAX_TRANSACTIONS_BYTE_LENGTH() view returns(uint256) -func (_Polygonzkevm *PolygonzkevmCallerSession) MAXTRANSACTIONSBYTELENGTH() (*big.Int, error) { - return _Polygonzkevm.Contract.MAXTRANSACTIONSBYTELENGTH(&_Polygonzkevm.CallOpts) -} - -// MAXVERIFYBATCHES is a free data retrieval call binding the contract method 0xe217cfd6. -// -// Solidity: function MAX_VERIFY_BATCHES() view returns(uint64) -func (_Polygonzkevm *PolygonzkevmCaller) MAXVERIFYBATCHES(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _Polygonzkevm.contract.Call(opts, &out, "MAX_VERIFY_BATCHES") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// MAXVERIFYBATCHES is a free data retrieval call binding the contract method 0xe217cfd6. -// -// Solidity: function MAX_VERIFY_BATCHES() view returns(uint64) -func (_Polygonzkevm *PolygonzkevmSession) MAXVERIFYBATCHES() (uint64, error) { - return _Polygonzkevm.Contract.MAXVERIFYBATCHES(&_Polygonzkevm.CallOpts) -} - -// MAXVERIFYBATCHES is a free data retrieval call binding the contract method 0xe217cfd6. -// -// Solidity: function MAX_VERIFY_BATCHES() view returns(uint64) -func (_Polygonzkevm *PolygonzkevmCallerSession) MAXVERIFYBATCHES() (uint64, error) { - return _Polygonzkevm.Contract.MAXVERIFYBATCHES(&_Polygonzkevm.CallOpts) -} - // Admin is a free data retrieval call binding the contract method 0xf851a440. // // Solidity: function admin() view returns(address) @@ -568,66 +411,66 @@ func (_Polygonzkevm *PolygonzkevmCallerSession) ChainID() (uint64, error) { return _Polygonzkevm.Contract.ChainID(&_Polygonzkevm.CallOpts) } -// ForceBatchAllowed is a free data retrieval call binding the contract method 0xd8f54db0. +// ForcedBatches is a free data retrieval call binding the contract method 0x6b8616ce. // -// Solidity: function forceBatchAllowed() view returns(bool) -func (_Polygonzkevm *PolygonzkevmCaller) ForceBatchAllowed(opts *bind.CallOpts) (bool, error) { +// Solidity: function forcedBatches(uint64 ) view returns(bytes32) +func (_Polygonzkevm *PolygonzkevmCaller) ForcedBatches(opts *bind.CallOpts, arg0 uint64) ([32]byte, error) { var out []interface{} - err := _Polygonzkevm.contract.Call(opts, &out, "forceBatchAllowed") + err := _Polygonzkevm.contract.Call(opts, &out, "forcedBatches", arg0) if err != nil { - return *new(bool), err + return *new([32]byte), err } - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) return out0, err } -// ForceBatchAllowed is a free data retrieval call binding the contract method 0xd8f54db0. +// ForcedBatches is a free data retrieval call binding the contract method 0x6b8616ce. // -// Solidity: function forceBatchAllowed() view returns(bool) -func (_Polygonzkevm *PolygonzkevmSession) ForceBatchAllowed() (bool, error) { - return _Polygonzkevm.Contract.ForceBatchAllowed(&_Polygonzkevm.CallOpts) +// Solidity: function forcedBatches(uint64 ) view returns(bytes32) +func (_Polygonzkevm *PolygonzkevmSession) ForcedBatches(arg0 uint64) ([32]byte, error) { + return _Polygonzkevm.Contract.ForcedBatches(&_Polygonzkevm.CallOpts, arg0) } -// ForceBatchAllowed is a free data retrieval call binding the contract method 0xd8f54db0. +// ForcedBatches is a free data retrieval call binding the contract method 0x6b8616ce. // -// Solidity: function forceBatchAllowed() view returns(bool) -func (_Polygonzkevm *PolygonzkevmCallerSession) ForceBatchAllowed() (bool, error) { - return _Polygonzkevm.Contract.ForceBatchAllowed(&_Polygonzkevm.CallOpts) +// Solidity: function forcedBatches(uint64 ) view returns(bytes32) +func (_Polygonzkevm *PolygonzkevmCallerSession) ForcedBatches(arg0 uint64) ([32]byte, error) { + return _Polygonzkevm.Contract.ForcedBatches(&_Polygonzkevm.CallOpts, arg0) } -// ForcedBatches is a free data retrieval call binding the contract method 0x6b8616ce. +// ForkID is a free data retrieval call binding the contract method 0x831c7ead. // -// Solidity: function forcedBatches(uint64 ) view returns(bytes32) -func (_Polygonzkevm *PolygonzkevmCaller) ForcedBatches(opts *bind.CallOpts, arg0 uint64) ([32]byte, error) { +// Solidity: function forkID() view returns(uint64) +func (_Polygonzkevm *PolygonzkevmCaller) ForkID(opts *bind.CallOpts) (uint64, error) { var out []interface{} - err := _Polygonzkevm.contract.Call(opts, &out, "forcedBatches", arg0) + err := _Polygonzkevm.contract.Call(opts, &out, "forkID") if err != nil { - return *new([32]byte), err + return *new(uint64), err } - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err } -// ForcedBatches is a free data retrieval call binding the contract method 0x6b8616ce. +// ForkID is a free data retrieval call binding the contract method 0x831c7ead. // -// Solidity: function forcedBatches(uint64 ) view returns(bytes32) -func (_Polygonzkevm *PolygonzkevmSession) ForcedBatches(arg0 uint64) ([32]byte, error) { - return _Polygonzkevm.Contract.ForcedBatches(&_Polygonzkevm.CallOpts, arg0) +// Solidity: function forkID() view returns(uint64) +func (_Polygonzkevm *PolygonzkevmSession) ForkID() (uint64, error) { + return _Polygonzkevm.Contract.ForkID(&_Polygonzkevm.CallOpts) } -// ForcedBatches is a free data retrieval call binding the contract method 0x6b8616ce. +// ForkID is a free data retrieval call binding the contract method 0x831c7ead. // -// Solidity: function forcedBatches(uint64 ) view returns(bytes32) -func (_Polygonzkevm *PolygonzkevmCallerSession) ForcedBatches(arg0 uint64) ([32]byte, error) { - return _Polygonzkevm.Contract.ForcedBatches(&_Polygonzkevm.CallOpts, arg0) +// Solidity: function forkID() view returns(uint64) +func (_Polygonzkevm *PolygonzkevmCallerSession) ForkID() (uint64, error) { + return _Polygonzkevm.Contract.ForkID(&_Polygonzkevm.CallOpts) } // GetCurrentBatchFee is a free data retrieval call binding the contract method 0x9f0d039d. @@ -1157,6 +1000,37 @@ func (_Polygonzkevm *PolygonzkevmCallerSession) Owner() (common.Address, error) return _Polygonzkevm.Contract.Owner(&_Polygonzkevm.CallOpts) } +// PendingAdmin is a free data retrieval call binding the contract method 0x26782247. +// +// Solidity: function pendingAdmin() view returns(address) +func (_Polygonzkevm *PolygonzkevmCaller) PendingAdmin(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Polygonzkevm.contract.Call(opts, &out, "pendingAdmin") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// PendingAdmin is a free data retrieval call binding the contract method 0x26782247. +// +// Solidity: function pendingAdmin() view returns(address) +func (_Polygonzkevm *PolygonzkevmSession) PendingAdmin() (common.Address, error) { + return _Polygonzkevm.Contract.PendingAdmin(&_Polygonzkevm.CallOpts) +} + +// PendingAdmin is a free data retrieval call binding the contract method 0x26782247. +// +// Solidity: function pendingAdmin() view returns(address) +func (_Polygonzkevm *PolygonzkevmCallerSession) PendingAdmin() (common.Address, error) { + return _Polygonzkevm.Contract.PendingAdmin(&_Polygonzkevm.CallOpts) +} + // PendingStateTimeout is a free data retrieval call binding the contract method 0xd939b315. // // Solidity: function pendingStateTimeout() view returns(uint64) @@ -1448,12 +1322,12 @@ func (_Polygonzkevm *PolygonzkevmCallerSession) TrustedSequencerURL() (string, e return _Polygonzkevm.Contract.TrustedSequencerURL(&_Polygonzkevm.CallOpts) } -// VeryBatchTimeTarget is a free data retrieval call binding the contract method 0xaa58bad6. +// VerifyBatchTimeTarget is a free data retrieval call binding the contract method 0x0a0d9fbe. // -// Solidity: function veryBatchTimeTarget() view returns(uint64) -func (_Polygonzkevm *PolygonzkevmCaller) VeryBatchTimeTarget(opts *bind.CallOpts) (uint64, error) { +// Solidity: function verifyBatchTimeTarget() view returns(uint64) +func (_Polygonzkevm *PolygonzkevmCaller) VerifyBatchTimeTarget(opts *bind.CallOpts) (uint64, error) { var out []interface{} - err := _Polygonzkevm.contract.Call(opts, &out, "veryBatchTimeTarget") + err := _Polygonzkevm.contract.Call(opts, &out, "verifyBatchTimeTarget") if err != nil { return *new(uint64), err @@ -1465,18 +1339,39 @@ func (_Polygonzkevm *PolygonzkevmCaller) VeryBatchTimeTarget(opts *bind.CallOpts } -// VeryBatchTimeTarget is a free data retrieval call binding the contract method 0xaa58bad6. +// VerifyBatchTimeTarget is a free data retrieval call binding the contract method 0x0a0d9fbe. +// +// Solidity: function verifyBatchTimeTarget() view returns(uint64) +func (_Polygonzkevm *PolygonzkevmSession) VerifyBatchTimeTarget() (uint64, error) { + return _Polygonzkevm.Contract.VerifyBatchTimeTarget(&_Polygonzkevm.CallOpts) +} + +// VerifyBatchTimeTarget is a free data retrieval call binding the contract method 0x0a0d9fbe. +// +// Solidity: function verifyBatchTimeTarget() view returns(uint64) +func (_Polygonzkevm *PolygonzkevmCallerSession) VerifyBatchTimeTarget() (uint64, error) { + return _Polygonzkevm.Contract.VerifyBatchTimeTarget(&_Polygonzkevm.CallOpts) +} + +// AcceptAdminRole is a paid mutator transaction binding the contract method 0x8c3d7301. +// +// Solidity: function acceptAdminRole() returns() +func (_Polygonzkevm *PolygonzkevmTransactor) AcceptAdminRole(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Polygonzkevm.contract.Transact(opts, "acceptAdminRole") +} + +// AcceptAdminRole is a paid mutator transaction binding the contract method 0x8c3d7301. // -// Solidity: function veryBatchTimeTarget() view returns(uint64) -func (_Polygonzkevm *PolygonzkevmSession) VeryBatchTimeTarget() (uint64, error) { - return _Polygonzkevm.Contract.VeryBatchTimeTarget(&_Polygonzkevm.CallOpts) +// Solidity: function acceptAdminRole() returns() +func (_Polygonzkevm *PolygonzkevmSession) AcceptAdminRole() (*types.Transaction, error) { + return _Polygonzkevm.Contract.AcceptAdminRole(&_Polygonzkevm.TransactOpts) } -// VeryBatchTimeTarget is a free data retrieval call binding the contract method 0xaa58bad6. +// AcceptAdminRole is a paid mutator transaction binding the contract method 0x8c3d7301. // -// Solidity: function veryBatchTimeTarget() view returns(uint64) -func (_Polygonzkevm *PolygonzkevmCallerSession) VeryBatchTimeTarget() (uint64, error) { - return _Polygonzkevm.Contract.VeryBatchTimeTarget(&_Polygonzkevm.CallOpts) +// Solidity: function acceptAdminRole() returns() +func (_Polygonzkevm *PolygonzkevmTransactorSession) AcceptAdminRole() (*types.Transaction, error) { + return _Polygonzkevm.Contract.AcceptAdminRole(&_Polygonzkevm.TransactOpts) } // ActivateEmergencyState is a paid mutator transaction binding the contract method 0x7215541a. @@ -1563,25 +1458,25 @@ func (_Polygonzkevm *PolygonzkevmTransactorSession) ForceBatch(transactions []by return _Polygonzkevm.Contract.ForceBatch(&_Polygonzkevm.TransactOpts, transactions, maticAmount) } -// Initialize is a paid mutator transaction binding the contract method 0x60943d6a. +// Initialize is a paid mutator transaction binding the contract method 0xd2e129f9. // -// Solidity: function initialize(address _globalExitRootManager, address _matic, address _rollupVerifier, address _bridgeAddress, (address,uint64,address,uint64,bool,address,uint64) initializePackedParameters, bytes32 genesisRoot, string _trustedSequencerURL, string _networkName) returns() -func (_Polygonzkevm *PolygonzkevmTransactor) Initialize(opts *bind.TransactOpts, _globalExitRootManager common.Address, _matic common.Address, _rollupVerifier common.Address, _bridgeAddress common.Address, initializePackedParameters PolygonZkEVMInitializePackedParameters, genesisRoot [32]byte, _trustedSequencerURL string, _networkName string) (*types.Transaction, error) { - return _Polygonzkevm.contract.Transact(opts, "initialize", _globalExitRootManager, _matic, _rollupVerifier, _bridgeAddress, initializePackedParameters, genesisRoot, _trustedSequencerURL, _networkName) +// Solidity: function initialize((address,address,uint64,address,uint64) initializePackedParameters, bytes32 genesisRoot, string _trustedSequencerURL, string _networkName, string _version) returns() +func (_Polygonzkevm *PolygonzkevmTransactor) Initialize(opts *bind.TransactOpts, initializePackedParameters PolygonZkEVMInitializePackedParameters, genesisRoot [32]byte, _trustedSequencerURL string, _networkName string, _version string) (*types.Transaction, error) { + return _Polygonzkevm.contract.Transact(opts, "initialize", initializePackedParameters, genesisRoot, _trustedSequencerURL, _networkName, _version) } -// Initialize is a paid mutator transaction binding the contract method 0x60943d6a. +// Initialize is a paid mutator transaction binding the contract method 0xd2e129f9. // -// Solidity: function initialize(address _globalExitRootManager, address _matic, address _rollupVerifier, address _bridgeAddress, (address,uint64,address,uint64,bool,address,uint64) initializePackedParameters, bytes32 genesisRoot, string _trustedSequencerURL, string _networkName) returns() -func (_Polygonzkevm *PolygonzkevmSession) Initialize(_globalExitRootManager common.Address, _matic common.Address, _rollupVerifier common.Address, _bridgeAddress common.Address, initializePackedParameters PolygonZkEVMInitializePackedParameters, genesisRoot [32]byte, _trustedSequencerURL string, _networkName string) (*types.Transaction, error) { - return _Polygonzkevm.Contract.Initialize(&_Polygonzkevm.TransactOpts, _globalExitRootManager, _matic, _rollupVerifier, _bridgeAddress, initializePackedParameters, genesisRoot, _trustedSequencerURL, _networkName) +// Solidity: function initialize((address,address,uint64,address,uint64) initializePackedParameters, bytes32 genesisRoot, string _trustedSequencerURL, string _networkName, string _version) returns() +func (_Polygonzkevm *PolygonzkevmSession) Initialize(initializePackedParameters PolygonZkEVMInitializePackedParameters, genesisRoot [32]byte, _trustedSequencerURL string, _networkName string, _version string) (*types.Transaction, error) { + return _Polygonzkevm.Contract.Initialize(&_Polygonzkevm.TransactOpts, initializePackedParameters, genesisRoot, _trustedSequencerURL, _networkName, _version) } -// Initialize is a paid mutator transaction binding the contract method 0x60943d6a. +// Initialize is a paid mutator transaction binding the contract method 0xd2e129f9. // -// Solidity: function initialize(address _globalExitRootManager, address _matic, address _rollupVerifier, address _bridgeAddress, (address,uint64,address,uint64,bool,address,uint64) initializePackedParameters, bytes32 genesisRoot, string _trustedSequencerURL, string _networkName) returns() -func (_Polygonzkevm *PolygonzkevmTransactorSession) Initialize(_globalExitRootManager common.Address, _matic common.Address, _rollupVerifier common.Address, _bridgeAddress common.Address, initializePackedParameters PolygonZkEVMInitializePackedParameters, genesisRoot [32]byte, _trustedSequencerURL string, _networkName string) (*types.Transaction, error) { - return _Polygonzkevm.Contract.Initialize(&_Polygonzkevm.TransactOpts, _globalExitRootManager, _matic, _rollupVerifier, _bridgeAddress, initializePackedParameters, genesisRoot, _trustedSequencerURL, _networkName) +// Solidity: function initialize((address,address,uint64,address,uint64) initializePackedParameters, bytes32 genesisRoot, string _trustedSequencerURL, string _networkName, string _version) returns() +func (_Polygonzkevm *PolygonzkevmTransactorSession) Initialize(initializePackedParameters PolygonZkEVMInitializePackedParameters, genesisRoot [32]byte, _trustedSequencerURL string, _networkName string, _version string) (*types.Transaction, error) { + return _Polygonzkevm.Contract.Initialize(&_Polygonzkevm.TransactOpts, initializePackedParameters, genesisRoot, _trustedSequencerURL, _networkName, _version) } // OverridePendingState is a paid mutator transaction binding the contract method 0xe11f3f18. @@ -1647,25 +1542,25 @@ func (_Polygonzkevm *PolygonzkevmTransactorSession) RenounceOwnership() (*types. return _Polygonzkevm.Contract.RenounceOwnership(&_Polygonzkevm.TransactOpts) } -// SequenceBatches is a paid mutator transaction binding the contract method 0x3c158267. +// SequenceBatches is a paid mutator transaction binding the contract method 0x5e9145c9. // -// Solidity: function sequenceBatches((bytes,bytes32,uint64,uint64)[] batches) returns() -func (_Polygonzkevm *PolygonzkevmTransactor) SequenceBatches(opts *bind.TransactOpts, batches []PolygonZkEVMBatchData) (*types.Transaction, error) { - return _Polygonzkevm.contract.Transact(opts, "sequenceBatches", batches) +// Solidity: function sequenceBatches((bytes,bytes32,uint64,uint64)[] batches, address l2Coinbase) returns() +func (_Polygonzkevm *PolygonzkevmTransactor) SequenceBatches(opts *bind.TransactOpts, batches []PolygonZkEVMBatchData, l2Coinbase common.Address) (*types.Transaction, error) { + return _Polygonzkevm.contract.Transact(opts, "sequenceBatches", batches, l2Coinbase) } -// SequenceBatches is a paid mutator transaction binding the contract method 0x3c158267. +// SequenceBatches is a paid mutator transaction binding the contract method 0x5e9145c9. // -// Solidity: function sequenceBatches((bytes,bytes32,uint64,uint64)[] batches) returns() -func (_Polygonzkevm *PolygonzkevmSession) SequenceBatches(batches []PolygonZkEVMBatchData) (*types.Transaction, error) { - return _Polygonzkevm.Contract.SequenceBatches(&_Polygonzkevm.TransactOpts, batches) +// Solidity: function sequenceBatches((bytes,bytes32,uint64,uint64)[] batches, address l2Coinbase) returns() +func (_Polygonzkevm *PolygonzkevmSession) SequenceBatches(batches []PolygonZkEVMBatchData, l2Coinbase common.Address) (*types.Transaction, error) { + return _Polygonzkevm.Contract.SequenceBatches(&_Polygonzkevm.TransactOpts, batches, l2Coinbase) } -// SequenceBatches is a paid mutator transaction binding the contract method 0x3c158267. +// SequenceBatches is a paid mutator transaction binding the contract method 0x5e9145c9. // -// Solidity: function sequenceBatches((bytes,bytes32,uint64,uint64)[] batches) returns() -func (_Polygonzkevm *PolygonzkevmTransactorSession) SequenceBatches(batches []PolygonZkEVMBatchData) (*types.Transaction, error) { - return _Polygonzkevm.Contract.SequenceBatches(&_Polygonzkevm.TransactOpts, batches) +// Solidity: function sequenceBatches((bytes,bytes32,uint64,uint64)[] batches, address l2Coinbase) returns() +func (_Polygonzkevm *PolygonzkevmTransactorSession) SequenceBatches(batches []PolygonZkEVMBatchData, l2Coinbase common.Address) (*types.Transaction, error) { + return _Polygonzkevm.Contract.SequenceBatches(&_Polygonzkevm.TransactOpts, batches, l2Coinbase) } // SequenceForceBatches is a paid mutator transaction binding the contract method 0xd8d1091b. @@ -1689,48 +1584,6 @@ func (_Polygonzkevm *PolygonzkevmTransactorSession) SequenceForceBatches(batches return _Polygonzkevm.Contract.SequenceForceBatches(&_Polygonzkevm.TransactOpts, batches) } -// SetAdmin is a paid mutator transaction binding the contract method 0x704b6c02. -// -// Solidity: function setAdmin(address newAdmin) returns() -func (_Polygonzkevm *PolygonzkevmTransactor) SetAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) { - return _Polygonzkevm.contract.Transact(opts, "setAdmin", newAdmin) -} - -// SetAdmin is a paid mutator transaction binding the contract method 0x704b6c02. -// -// Solidity: function setAdmin(address newAdmin) returns() -func (_Polygonzkevm *PolygonzkevmSession) SetAdmin(newAdmin common.Address) (*types.Transaction, error) { - return _Polygonzkevm.Contract.SetAdmin(&_Polygonzkevm.TransactOpts, newAdmin) -} - -// SetAdmin is a paid mutator transaction binding the contract method 0x704b6c02. -// -// Solidity: function setAdmin(address newAdmin) returns() -func (_Polygonzkevm *PolygonzkevmTransactorSession) SetAdmin(newAdmin common.Address) (*types.Transaction, error) { - return _Polygonzkevm.Contract.SetAdmin(&_Polygonzkevm.TransactOpts, newAdmin) -} - -// SetForceBatchAllowed is a paid mutator transaction binding the contract method 0x8c4a0af7. -// -// Solidity: function setForceBatchAllowed(bool newForceBatchAllowed) returns() -func (_Polygonzkevm *PolygonzkevmTransactor) SetForceBatchAllowed(opts *bind.TransactOpts, newForceBatchAllowed bool) (*types.Transaction, error) { - return _Polygonzkevm.contract.Transact(opts, "setForceBatchAllowed", newForceBatchAllowed) -} - -// SetForceBatchAllowed is a paid mutator transaction binding the contract method 0x8c4a0af7. -// -// Solidity: function setForceBatchAllowed(bool newForceBatchAllowed) returns() -func (_Polygonzkevm *PolygonzkevmSession) SetForceBatchAllowed(newForceBatchAllowed bool) (*types.Transaction, error) { - return _Polygonzkevm.Contract.SetForceBatchAllowed(&_Polygonzkevm.TransactOpts, newForceBatchAllowed) -} - -// SetForceBatchAllowed is a paid mutator transaction binding the contract method 0x8c4a0af7. -// -// Solidity: function setForceBatchAllowed(bool newForceBatchAllowed) returns() -func (_Polygonzkevm *PolygonzkevmTransactorSession) SetForceBatchAllowed(newForceBatchAllowed bool) (*types.Transaction, error) { - return _Polygonzkevm.Contract.SetForceBatchAllowed(&_Polygonzkevm.TransactOpts, newForceBatchAllowed) -} - // SetMultiplierBatchFee is a paid mutator transaction binding the contract method 0x1816b7e5. // // Solidity: function setMultiplierBatchFee(uint16 newMultiplierBatchFee) returns() @@ -1857,25 +1710,46 @@ func (_Polygonzkevm *PolygonzkevmTransactorSession) SetTrustedSequencerURL(newTr return _Polygonzkevm.Contract.SetTrustedSequencerURL(&_Polygonzkevm.TransactOpts, newTrustedSequencerURL) } -// SetVeryBatchTimeTarget is a paid mutator transaction binding the contract method 0xcf136306. +// SetVerifyBatchTimeTarget is a paid mutator transaction binding the contract method 0xa066215c. +// +// Solidity: function setVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) returns() +func (_Polygonzkevm *PolygonzkevmTransactor) SetVerifyBatchTimeTarget(opts *bind.TransactOpts, newVerifyBatchTimeTarget uint64) (*types.Transaction, error) { + return _Polygonzkevm.contract.Transact(opts, "setVerifyBatchTimeTarget", newVerifyBatchTimeTarget) +} + +// SetVerifyBatchTimeTarget is a paid mutator transaction binding the contract method 0xa066215c. // -// Solidity: function setVeryBatchTimeTarget(uint64 newVeryBatchTimeTarget) returns() -func (_Polygonzkevm *PolygonzkevmTransactor) SetVeryBatchTimeTarget(opts *bind.TransactOpts, newVeryBatchTimeTarget uint64) (*types.Transaction, error) { - return _Polygonzkevm.contract.Transact(opts, "setVeryBatchTimeTarget", newVeryBatchTimeTarget) +// Solidity: function setVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) returns() +func (_Polygonzkevm *PolygonzkevmSession) SetVerifyBatchTimeTarget(newVerifyBatchTimeTarget uint64) (*types.Transaction, error) { + return _Polygonzkevm.Contract.SetVerifyBatchTimeTarget(&_Polygonzkevm.TransactOpts, newVerifyBatchTimeTarget) } -// SetVeryBatchTimeTarget is a paid mutator transaction binding the contract method 0xcf136306. +// SetVerifyBatchTimeTarget is a paid mutator transaction binding the contract method 0xa066215c. // -// Solidity: function setVeryBatchTimeTarget(uint64 newVeryBatchTimeTarget) returns() -func (_Polygonzkevm *PolygonzkevmSession) SetVeryBatchTimeTarget(newVeryBatchTimeTarget uint64) (*types.Transaction, error) { - return _Polygonzkevm.Contract.SetVeryBatchTimeTarget(&_Polygonzkevm.TransactOpts, newVeryBatchTimeTarget) +// Solidity: function setVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) returns() +func (_Polygonzkevm *PolygonzkevmTransactorSession) SetVerifyBatchTimeTarget(newVerifyBatchTimeTarget uint64) (*types.Transaction, error) { + return _Polygonzkevm.Contract.SetVerifyBatchTimeTarget(&_Polygonzkevm.TransactOpts, newVerifyBatchTimeTarget) } -// SetVeryBatchTimeTarget is a paid mutator transaction binding the contract method 0xcf136306. +// TransferAdminRole is a paid mutator transaction binding the contract method 0xada8f919. // -// Solidity: function setVeryBatchTimeTarget(uint64 newVeryBatchTimeTarget) returns() -func (_Polygonzkevm *PolygonzkevmTransactorSession) SetVeryBatchTimeTarget(newVeryBatchTimeTarget uint64) (*types.Transaction, error) { - return _Polygonzkevm.Contract.SetVeryBatchTimeTarget(&_Polygonzkevm.TransactOpts, newVeryBatchTimeTarget) +// Solidity: function transferAdminRole(address newPendingAdmin) returns() +func (_Polygonzkevm *PolygonzkevmTransactor) TransferAdminRole(opts *bind.TransactOpts, newPendingAdmin common.Address) (*types.Transaction, error) { + return _Polygonzkevm.contract.Transact(opts, "transferAdminRole", newPendingAdmin) +} + +// TransferAdminRole is a paid mutator transaction binding the contract method 0xada8f919. +// +// Solidity: function transferAdminRole(address newPendingAdmin) returns() +func (_Polygonzkevm *PolygonzkevmSession) TransferAdminRole(newPendingAdmin common.Address) (*types.Transaction, error) { + return _Polygonzkevm.Contract.TransferAdminRole(&_Polygonzkevm.TransactOpts, newPendingAdmin) +} + +// TransferAdminRole is a paid mutator transaction binding the contract method 0xada8f919. +// +// Solidity: function transferAdminRole(address newPendingAdmin) returns() +func (_Polygonzkevm *PolygonzkevmTransactorSession) TransferAdminRole(newPendingAdmin common.Address) (*types.Transaction, error) { + return _Polygonzkevm.Contract.TransferAdminRole(&_Polygonzkevm.TransactOpts, newPendingAdmin) } // TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. @@ -1899,27 +1773,6 @@ func (_Polygonzkevm *PolygonzkevmTransactorSession) TransferOwnership(newOwner c return _Polygonzkevm.Contract.TransferOwnership(&_Polygonzkevm.TransactOpts, newOwner) } -// TrustedVerifyBatches is a paid mutator transaction binding the contract method 0xedc41121. -// -// Solidity: function trustedVerifyBatches(uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, uint256[2] proofA, uint256[2][2] proofB, uint256[2] proofC) returns() -func (_Polygonzkevm *PolygonzkevmTransactor) TrustedVerifyBatches(opts *bind.TransactOpts, pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proofA [2]*big.Int, proofB [2][2]*big.Int, proofC [2]*big.Int) (*types.Transaction, error) { - return _Polygonzkevm.contract.Transact(opts, "trustedVerifyBatches", pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proofA, proofB, proofC) -} - -// TrustedVerifyBatches is a paid mutator transaction binding the contract method 0xedc41121. -// -// Solidity: function trustedVerifyBatches(uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, uint256[2] proofA, uint256[2][2] proofB, uint256[2] proofC) returns() -func (_Polygonzkevm *PolygonzkevmSession) TrustedVerifyBatches(pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proofA [2]*big.Int, proofB [2][2]*big.Int, proofC [2]*big.Int) (*types.Transaction, error) { - return _Polygonzkevm.Contract.TrustedVerifyBatches(&_Polygonzkevm.TransactOpts, pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proofA, proofB, proofC) -} - -// TrustedVerifyBatches is a paid mutator transaction binding the contract method 0xedc41121. -// -// Solidity: function trustedVerifyBatches(uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, uint256[2] proofA, uint256[2][2] proofB, uint256[2] proofC) returns() -func (_Polygonzkevm *PolygonzkevmTransactorSession) TrustedVerifyBatches(pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proofA [2]*big.Int, proofB [2][2]*big.Int, proofC [2]*big.Int) (*types.Transaction, error) { - return _Polygonzkevm.Contract.TrustedVerifyBatches(&_Polygonzkevm.TransactOpts, pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proofA, proofB, proofC) -} - // VerifyBatches is a paid mutator transaction binding the contract method 0x4834a343. // // Solidity: function verifyBatches(uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, uint256[2] proofA, uint256[2][2] proofB, uint256[2] proofC) returns() @@ -1941,9 +1794,30 @@ func (_Polygonzkevm *PolygonzkevmTransactorSession) VerifyBatches(pendingStateNu return _Polygonzkevm.Contract.VerifyBatches(&_Polygonzkevm.TransactOpts, pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proofA, proofB, proofC) } -// PolygonzkevmConsolidatePendingStateIterator is returned from FilterConsolidatePendingState and is used to iterate over the raw logs and unpacked data for ConsolidatePendingState events raised by the Polygonzkevm contract. -type PolygonzkevmConsolidatePendingStateIterator struct { - Event *PolygonzkevmConsolidatePendingState // Event containing the contract specifics and raw log +// VerifyBatchesTrustedAggregator is a paid mutator transaction binding the contract method 0xf020c93e. +// +// Solidity: function verifyBatchesTrustedAggregator(uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, uint256[2] proofA, uint256[2][2] proofB, uint256[2] proofC) returns() +func (_Polygonzkevm *PolygonzkevmTransactor) VerifyBatchesTrustedAggregator(opts *bind.TransactOpts, pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proofA [2]*big.Int, proofB [2][2]*big.Int, proofC [2]*big.Int) (*types.Transaction, error) { + return _Polygonzkevm.contract.Transact(opts, "verifyBatchesTrustedAggregator", pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proofA, proofB, proofC) +} + +// VerifyBatchesTrustedAggregator is a paid mutator transaction binding the contract method 0xf020c93e. +// +// Solidity: function verifyBatchesTrustedAggregator(uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, uint256[2] proofA, uint256[2][2] proofB, uint256[2] proofC) returns() +func (_Polygonzkevm *PolygonzkevmSession) VerifyBatchesTrustedAggregator(pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proofA [2]*big.Int, proofB [2][2]*big.Int, proofC [2]*big.Int) (*types.Transaction, error) { + return _Polygonzkevm.Contract.VerifyBatchesTrustedAggregator(&_Polygonzkevm.TransactOpts, pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proofA, proofB, proofC) +} + +// VerifyBatchesTrustedAggregator is a paid mutator transaction binding the contract method 0xf020c93e. +// +// Solidity: function verifyBatchesTrustedAggregator(uint64 pendingStateNum, uint64 initNumBatch, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, uint256[2] proofA, uint256[2][2] proofB, uint256[2] proofC) returns() +func (_Polygonzkevm *PolygonzkevmTransactorSession) VerifyBatchesTrustedAggregator(pendingStateNum uint64, initNumBatch uint64, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, proofA [2]*big.Int, proofB [2][2]*big.Int, proofC [2]*big.Int) (*types.Transaction, error) { + return _Polygonzkevm.Contract.VerifyBatchesTrustedAggregator(&_Polygonzkevm.TransactOpts, pendingStateNum, initNumBatch, finalNewBatch, newLocalExitRoot, newStateRoot, proofA, proofB, proofC) +} + +// PolygonzkevmAcceptAdminRoleIterator is returned from FilterAcceptAdminRole and is used to iterate over the raw logs and unpacked data for AcceptAdminRole events raised by the Polygonzkevm contract. +type PolygonzkevmAcceptAdminRoleIterator struct { + Event *PolygonzkevmAcceptAdminRole // 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 @@ -1957,7 +1831,7 @@ type PolygonzkevmConsolidatePendingStateIterator struct { // 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 *PolygonzkevmConsolidatePendingStateIterator) Next() bool { +func (it *PolygonzkevmAcceptAdminRoleIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1966,7 +1840,7 @@ func (it *PolygonzkevmConsolidatePendingStateIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PolygonzkevmConsolidatePendingState) + it.Event = new(PolygonzkevmAcceptAdminRole) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1981,7 +1855,7 @@ func (it *PolygonzkevmConsolidatePendingStateIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PolygonzkevmConsolidatePendingState) + it.Event = new(PolygonzkevmAcceptAdminRole) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1997,63 +1871,41 @@ func (it *PolygonzkevmConsolidatePendingStateIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PolygonzkevmConsolidatePendingStateIterator) Error() error { +func (it *PolygonzkevmAcceptAdminRoleIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PolygonzkevmConsolidatePendingStateIterator) Close() error { +func (it *PolygonzkevmAcceptAdminRoleIterator) Close() error { it.sub.Unsubscribe() return nil } -// PolygonzkevmConsolidatePendingState represents a ConsolidatePendingState event raised by the Polygonzkevm contract. -type PolygonzkevmConsolidatePendingState struct { - NumBatch uint64 - StateRoot [32]byte - PendingStateNum uint64 - Raw types.Log // Blockchain specific contextual infos +// PolygonzkevmAcceptAdminRole represents a AcceptAdminRole event raised by the Polygonzkevm contract. +type PolygonzkevmAcceptAdminRole struct { + NewAdmin common.Address + Raw types.Log // Blockchain specific contextual infos } -// FilterConsolidatePendingState is a free log retrieval operation binding the contract event 0x328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e. +// FilterAcceptAdminRole is a free log retrieval operation binding the contract event 0x056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e. // -// Solidity: event ConsolidatePendingState(uint64 indexed numBatch, bytes32 stateRoot, uint64 indexed pendingStateNum) -func (_Polygonzkevm *PolygonzkevmFilterer) FilterConsolidatePendingState(opts *bind.FilterOpts, numBatch []uint64, pendingStateNum []uint64) (*PolygonzkevmConsolidatePendingStateIterator, error) { - - var numBatchRule []interface{} - for _, numBatchItem := range numBatch { - numBatchRule = append(numBatchRule, numBatchItem) - } +// Solidity: event AcceptAdminRole(address newAdmin) +func (_Polygonzkevm *PolygonzkevmFilterer) FilterAcceptAdminRole(opts *bind.FilterOpts) (*PolygonzkevmAcceptAdminRoleIterator, error) { - var pendingStateNumRule []interface{} - for _, pendingStateNumItem := range pendingStateNum { - pendingStateNumRule = append(pendingStateNumRule, pendingStateNumItem) - } - - logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "ConsolidatePendingState", numBatchRule, pendingStateNumRule) + logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "AcceptAdminRole") if err != nil { return nil, err } - return &PolygonzkevmConsolidatePendingStateIterator{contract: _Polygonzkevm.contract, event: "ConsolidatePendingState", logs: logs, sub: sub}, nil + return &PolygonzkevmAcceptAdminRoleIterator{contract: _Polygonzkevm.contract, event: "AcceptAdminRole", logs: logs, sub: sub}, nil } -// WatchConsolidatePendingState is a free log subscription operation binding the contract event 0x328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e. +// WatchAcceptAdminRole is a free log subscription operation binding the contract event 0x056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e. // -// Solidity: event ConsolidatePendingState(uint64 indexed numBatch, bytes32 stateRoot, uint64 indexed pendingStateNum) -func (_Polygonzkevm *PolygonzkevmFilterer) WatchConsolidatePendingState(opts *bind.WatchOpts, sink chan<- *PolygonzkevmConsolidatePendingState, numBatch []uint64, pendingStateNum []uint64) (event.Subscription, error) { - - var numBatchRule []interface{} - for _, numBatchItem := range numBatch { - numBatchRule = append(numBatchRule, numBatchItem) - } - - var pendingStateNumRule []interface{} - for _, pendingStateNumItem := range pendingStateNum { - pendingStateNumRule = append(pendingStateNumRule, pendingStateNumItem) - } +// Solidity: event AcceptAdminRole(address newAdmin) +func (_Polygonzkevm *PolygonzkevmFilterer) WatchAcceptAdminRole(opts *bind.WatchOpts, sink chan<- *PolygonzkevmAcceptAdminRole) (event.Subscription, error) { - logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "ConsolidatePendingState", numBatchRule, pendingStateNumRule) + logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "AcceptAdminRole") if err != nil { return nil, err } @@ -2063,8 +1915,8 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchConsolidatePendingState(opts *bi select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PolygonzkevmConsolidatePendingState) - if err := _Polygonzkevm.contract.UnpackLog(event, "ConsolidatePendingState", log); err != nil { + event := new(PolygonzkevmAcceptAdminRole) + if err := _Polygonzkevm.contract.UnpackLog(event, "AcceptAdminRole", log); err != nil { return err } event.Raw = log @@ -2085,22 +1937,178 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchConsolidatePendingState(opts *bi }), nil } -// ParseConsolidatePendingState is a log parse operation binding the contract event 0x328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e. +// ParseAcceptAdminRole is a log parse operation binding the contract event 0x056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e. // -// Solidity: event ConsolidatePendingState(uint64 indexed numBatch, bytes32 stateRoot, uint64 indexed pendingStateNum) -func (_Polygonzkevm *PolygonzkevmFilterer) ParseConsolidatePendingState(log types.Log) (*PolygonzkevmConsolidatePendingState, error) { - event := new(PolygonzkevmConsolidatePendingState) - if err := _Polygonzkevm.contract.UnpackLog(event, "ConsolidatePendingState", log); err != nil { +// Solidity: event AcceptAdminRole(address newAdmin) +func (_Polygonzkevm *PolygonzkevmFilterer) ParseAcceptAdminRole(log types.Log) (*PolygonzkevmAcceptAdminRole, error) { + event := new(PolygonzkevmAcceptAdminRole) + if err := _Polygonzkevm.contract.UnpackLog(event, "AcceptAdminRole", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PolygonzkevmEmergencyStateActivatedIterator is returned from FilterEmergencyStateActivated and is used to iterate over the raw logs and unpacked data for EmergencyStateActivated events raised by the Polygonzkevm contract. -type PolygonzkevmEmergencyStateActivatedIterator struct { - Event *PolygonzkevmEmergencyStateActivated // Event containing the contract specifics and raw log - +// PolygonzkevmConsolidatePendingStateIterator is returned from FilterConsolidatePendingState and is used to iterate over the raw logs and unpacked data for ConsolidatePendingState events raised by the Polygonzkevm contract. +type PolygonzkevmConsolidatePendingStateIterator struct { + Event *PolygonzkevmConsolidatePendingState // 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 *PolygonzkevmConsolidatePendingStateIterator) 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(PolygonzkevmConsolidatePendingState) + 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(PolygonzkevmConsolidatePendingState) + 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 *PolygonzkevmConsolidatePendingStateIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PolygonzkevmConsolidatePendingStateIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PolygonzkevmConsolidatePendingState represents a ConsolidatePendingState event raised by the Polygonzkevm contract. +type PolygonzkevmConsolidatePendingState struct { + NumBatch uint64 + StateRoot [32]byte + PendingStateNum uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterConsolidatePendingState is a free log retrieval operation binding the contract event 0x328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e. +// +// Solidity: event ConsolidatePendingState(uint64 indexed numBatch, bytes32 stateRoot, uint64 indexed pendingStateNum) +func (_Polygonzkevm *PolygonzkevmFilterer) FilterConsolidatePendingState(opts *bind.FilterOpts, numBatch []uint64, pendingStateNum []uint64) (*PolygonzkevmConsolidatePendingStateIterator, error) { + + var numBatchRule []interface{} + for _, numBatchItem := range numBatch { + numBatchRule = append(numBatchRule, numBatchItem) + } + + var pendingStateNumRule []interface{} + for _, pendingStateNumItem := range pendingStateNum { + pendingStateNumRule = append(pendingStateNumRule, pendingStateNumItem) + } + + logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "ConsolidatePendingState", numBatchRule, pendingStateNumRule) + if err != nil { + return nil, err + } + return &PolygonzkevmConsolidatePendingStateIterator{contract: _Polygonzkevm.contract, event: "ConsolidatePendingState", logs: logs, sub: sub}, nil +} + +// WatchConsolidatePendingState is a free log subscription operation binding the contract event 0x328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e. +// +// Solidity: event ConsolidatePendingState(uint64 indexed numBatch, bytes32 stateRoot, uint64 indexed pendingStateNum) +func (_Polygonzkevm *PolygonzkevmFilterer) WatchConsolidatePendingState(opts *bind.WatchOpts, sink chan<- *PolygonzkevmConsolidatePendingState, numBatch []uint64, pendingStateNum []uint64) (event.Subscription, error) { + + var numBatchRule []interface{} + for _, numBatchItem := range numBatch { + numBatchRule = append(numBatchRule, numBatchItem) + } + + var pendingStateNumRule []interface{} + for _, pendingStateNumItem := range pendingStateNum { + pendingStateNumRule = append(pendingStateNumRule, pendingStateNumItem) + } + + logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "ConsolidatePendingState", numBatchRule, pendingStateNumRule) + 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(PolygonzkevmConsolidatePendingState) + if err := _Polygonzkevm.contract.UnpackLog(event, "ConsolidatePendingState", 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 +} + +// ParseConsolidatePendingState is a log parse operation binding the contract event 0x328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e. +// +// Solidity: event ConsolidatePendingState(uint64 indexed numBatch, bytes32 stateRoot, uint64 indexed pendingStateNum) +func (_Polygonzkevm *PolygonzkevmFilterer) ParseConsolidatePendingState(log types.Log) (*PolygonzkevmConsolidatePendingState, error) { + event := new(PolygonzkevmConsolidatePendingState) + if err := _Polygonzkevm.contract.UnpackLog(event, "ConsolidatePendingState", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PolygonzkevmEmergencyStateActivatedIterator is returned from FilterEmergencyStateActivated and is used to iterate over the raw logs and unpacked data for EmergencyStateActivated events raised by the Polygonzkevm contract. +type PolygonzkevmEmergencyStateActivatedIterator struct { + Event *PolygonzkevmEmergencyStateActivated // 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 @@ -3376,9 +3384,9 @@ func (_Polygonzkevm *PolygonzkevmFilterer) ParseSequenceForceBatches(log types.L return event, nil } -// PolygonzkevmSetAdminIterator is returned from FilterSetAdmin and is used to iterate over the raw logs and unpacked data for SetAdmin events raised by the Polygonzkevm contract. -type PolygonzkevmSetAdminIterator struct { - Event *PolygonzkevmSetAdmin // Event containing the contract specifics and raw log +// PolygonzkevmSetMultiplierBatchFeeIterator is returned from FilterSetMultiplierBatchFee and is used to iterate over the raw logs and unpacked data for SetMultiplierBatchFee events raised by the Polygonzkevm contract. +type PolygonzkevmSetMultiplierBatchFeeIterator struct { + Event *PolygonzkevmSetMultiplierBatchFee // 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 @@ -3392,7 +3400,7 @@ type PolygonzkevmSetAdminIterator struct { // 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 *PolygonzkevmSetAdminIterator) Next() bool { +func (it *PolygonzkevmSetMultiplierBatchFeeIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -3401,7 +3409,7 @@ func (it *PolygonzkevmSetAdminIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetAdmin) + it.Event = new(PolygonzkevmSetMultiplierBatchFee) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3416,7 +3424,7 @@ func (it *PolygonzkevmSetAdminIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetAdmin) + it.Event = new(PolygonzkevmSetMultiplierBatchFee) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3432,41 +3440,41 @@ func (it *PolygonzkevmSetAdminIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PolygonzkevmSetAdminIterator) Error() error { +func (it *PolygonzkevmSetMultiplierBatchFeeIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PolygonzkevmSetAdminIterator) Close() error { +func (it *PolygonzkevmSetMultiplierBatchFeeIterator) Close() error { it.sub.Unsubscribe() return nil } -// PolygonzkevmSetAdmin represents a SetAdmin event raised by the Polygonzkevm contract. -type PolygonzkevmSetAdmin struct { - NewAdmin common.Address - Raw types.Log // Blockchain specific contextual infos +// PolygonzkevmSetMultiplierBatchFee represents a SetMultiplierBatchFee event raised by the Polygonzkevm contract. +type PolygonzkevmSetMultiplierBatchFee struct { + NewMultiplierBatchFee uint16 + Raw types.Log // Blockchain specific contextual infos } -// FilterSetAdmin is a free log retrieval operation binding the contract event 0x5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a1. +// FilterSetMultiplierBatchFee is a free log retrieval operation binding the contract event 0x7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5. // -// Solidity: event SetAdmin(address newAdmin) -func (_Polygonzkevm *PolygonzkevmFilterer) FilterSetAdmin(opts *bind.FilterOpts) (*PolygonzkevmSetAdminIterator, error) { +// Solidity: event SetMultiplierBatchFee(uint16 newMultiplierBatchFee) +func (_Polygonzkevm *PolygonzkevmFilterer) FilterSetMultiplierBatchFee(opts *bind.FilterOpts) (*PolygonzkevmSetMultiplierBatchFeeIterator, error) { - logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "SetAdmin") + logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "SetMultiplierBatchFee") if err != nil { return nil, err } - return &PolygonzkevmSetAdminIterator{contract: _Polygonzkevm.contract, event: "SetAdmin", logs: logs, sub: sub}, nil + return &PolygonzkevmSetMultiplierBatchFeeIterator{contract: _Polygonzkevm.contract, event: "SetMultiplierBatchFee", logs: logs, sub: sub}, nil } -// WatchSetAdmin is a free log subscription operation binding the contract event 0x5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a1. +// WatchSetMultiplierBatchFee is a free log subscription operation binding the contract event 0x7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5. // -// Solidity: event SetAdmin(address newAdmin) -func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetAdmin(opts *bind.WatchOpts, sink chan<- *PolygonzkevmSetAdmin) (event.Subscription, error) { +// Solidity: event SetMultiplierBatchFee(uint16 newMultiplierBatchFee) +func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetMultiplierBatchFee(opts *bind.WatchOpts, sink chan<- *PolygonzkevmSetMultiplierBatchFee) (event.Subscription, error) { - logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "SetAdmin") + logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "SetMultiplierBatchFee") if err != nil { return nil, err } @@ -3476,8 +3484,8 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetAdmin(opts *bind.WatchOpts, s select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PolygonzkevmSetAdmin) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetAdmin", log); err != nil { + event := new(PolygonzkevmSetMultiplierBatchFee) + if err := _Polygonzkevm.contract.UnpackLog(event, "SetMultiplierBatchFee", log); err != nil { return err } event.Raw = log @@ -3498,21 +3506,21 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetAdmin(opts *bind.WatchOpts, s }), nil } -// ParseSetAdmin is a log parse operation binding the contract event 0x5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a1. +// ParseSetMultiplierBatchFee is a log parse operation binding the contract event 0x7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5. // -// Solidity: event SetAdmin(address newAdmin) -func (_Polygonzkevm *PolygonzkevmFilterer) ParseSetAdmin(log types.Log) (*PolygonzkevmSetAdmin, error) { - event := new(PolygonzkevmSetAdmin) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetAdmin", log); err != nil { +// Solidity: event SetMultiplierBatchFee(uint16 newMultiplierBatchFee) +func (_Polygonzkevm *PolygonzkevmFilterer) ParseSetMultiplierBatchFee(log types.Log) (*PolygonzkevmSetMultiplierBatchFee, error) { + event := new(PolygonzkevmSetMultiplierBatchFee) + if err := _Polygonzkevm.contract.UnpackLog(event, "SetMultiplierBatchFee", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PolygonzkevmSetForceBatchAllowedIterator is returned from FilterSetForceBatchAllowed and is used to iterate over the raw logs and unpacked data for SetForceBatchAllowed events raised by the Polygonzkevm contract. -type PolygonzkevmSetForceBatchAllowedIterator struct { - Event *PolygonzkevmSetForceBatchAllowed // Event containing the contract specifics and raw log +// PolygonzkevmSetPendingStateTimeoutIterator is returned from FilterSetPendingStateTimeout and is used to iterate over the raw logs and unpacked data for SetPendingStateTimeout events raised by the Polygonzkevm contract. +type PolygonzkevmSetPendingStateTimeoutIterator struct { + Event *PolygonzkevmSetPendingStateTimeout // 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 @@ -3526,7 +3534,7 @@ type PolygonzkevmSetForceBatchAllowedIterator struct { // 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 *PolygonzkevmSetForceBatchAllowedIterator) Next() bool { +func (it *PolygonzkevmSetPendingStateTimeoutIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -3535,7 +3543,7 @@ func (it *PolygonzkevmSetForceBatchAllowedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetForceBatchAllowed) + it.Event = new(PolygonzkevmSetPendingStateTimeout) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3550,7 +3558,7 @@ func (it *PolygonzkevmSetForceBatchAllowedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetForceBatchAllowed) + it.Event = new(PolygonzkevmSetPendingStateTimeout) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3566,41 +3574,41 @@ func (it *PolygonzkevmSetForceBatchAllowedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PolygonzkevmSetForceBatchAllowedIterator) Error() error { +func (it *PolygonzkevmSetPendingStateTimeoutIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PolygonzkevmSetForceBatchAllowedIterator) Close() error { +func (it *PolygonzkevmSetPendingStateTimeoutIterator) Close() error { it.sub.Unsubscribe() return nil } -// PolygonzkevmSetForceBatchAllowed represents a SetForceBatchAllowed event raised by the Polygonzkevm contract. -type PolygonzkevmSetForceBatchAllowed struct { - NewForceBatchAllowed bool - Raw types.Log // Blockchain specific contextual infos +// PolygonzkevmSetPendingStateTimeout represents a SetPendingStateTimeout event raised by the Polygonzkevm contract. +type PolygonzkevmSetPendingStateTimeout struct { + NewPendingStateTimeout uint64 + Raw types.Log // Blockchain specific contextual infos } -// FilterSetForceBatchAllowed is a free log retrieval operation binding the contract event 0xbacda50a4a8575be1d91a7ebe29ee45056f3a94f12a2281eb6b43afa33bcefe6. +// FilterSetPendingStateTimeout is a free log retrieval operation binding the contract event 0xc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75. // -// Solidity: event SetForceBatchAllowed(bool newForceBatchAllowed) -func (_Polygonzkevm *PolygonzkevmFilterer) FilterSetForceBatchAllowed(opts *bind.FilterOpts) (*PolygonzkevmSetForceBatchAllowedIterator, error) { +// Solidity: event SetPendingStateTimeout(uint64 newPendingStateTimeout) +func (_Polygonzkevm *PolygonzkevmFilterer) FilterSetPendingStateTimeout(opts *bind.FilterOpts) (*PolygonzkevmSetPendingStateTimeoutIterator, error) { - logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "SetForceBatchAllowed") + logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "SetPendingStateTimeout") if err != nil { return nil, err } - return &PolygonzkevmSetForceBatchAllowedIterator{contract: _Polygonzkevm.contract, event: "SetForceBatchAllowed", logs: logs, sub: sub}, nil + return &PolygonzkevmSetPendingStateTimeoutIterator{contract: _Polygonzkevm.contract, event: "SetPendingStateTimeout", logs: logs, sub: sub}, nil } -// WatchSetForceBatchAllowed is a free log subscription operation binding the contract event 0xbacda50a4a8575be1d91a7ebe29ee45056f3a94f12a2281eb6b43afa33bcefe6. +// WatchSetPendingStateTimeout is a free log subscription operation binding the contract event 0xc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75. // -// Solidity: event SetForceBatchAllowed(bool newForceBatchAllowed) -func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetForceBatchAllowed(opts *bind.WatchOpts, sink chan<- *PolygonzkevmSetForceBatchAllowed) (event.Subscription, error) { +// Solidity: event SetPendingStateTimeout(uint64 newPendingStateTimeout) +func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetPendingStateTimeout(opts *bind.WatchOpts, sink chan<- *PolygonzkevmSetPendingStateTimeout) (event.Subscription, error) { - logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "SetForceBatchAllowed") + logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "SetPendingStateTimeout") if err != nil { return nil, err } @@ -3610,8 +3618,8 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetForceBatchAllowed(opts *bind. select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PolygonzkevmSetForceBatchAllowed) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetForceBatchAllowed", log); err != nil { + event := new(PolygonzkevmSetPendingStateTimeout) + if err := _Polygonzkevm.contract.UnpackLog(event, "SetPendingStateTimeout", log); err != nil { return err } event.Raw = log @@ -3632,21 +3640,21 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetForceBatchAllowed(opts *bind. }), nil } -// ParseSetForceBatchAllowed is a log parse operation binding the contract event 0xbacda50a4a8575be1d91a7ebe29ee45056f3a94f12a2281eb6b43afa33bcefe6. +// ParseSetPendingStateTimeout is a log parse operation binding the contract event 0xc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75. // -// Solidity: event SetForceBatchAllowed(bool newForceBatchAllowed) -func (_Polygonzkevm *PolygonzkevmFilterer) ParseSetForceBatchAllowed(log types.Log) (*PolygonzkevmSetForceBatchAllowed, error) { - event := new(PolygonzkevmSetForceBatchAllowed) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetForceBatchAllowed", log); err != nil { +// Solidity: event SetPendingStateTimeout(uint64 newPendingStateTimeout) +func (_Polygonzkevm *PolygonzkevmFilterer) ParseSetPendingStateTimeout(log types.Log) (*PolygonzkevmSetPendingStateTimeout, error) { + event := new(PolygonzkevmSetPendingStateTimeout) + if err := _Polygonzkevm.contract.UnpackLog(event, "SetPendingStateTimeout", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PolygonzkevmSetMultiplierBatchFeeIterator is returned from FilterSetMultiplierBatchFee and is used to iterate over the raw logs and unpacked data for SetMultiplierBatchFee events raised by the Polygonzkevm contract. -type PolygonzkevmSetMultiplierBatchFeeIterator struct { - Event *PolygonzkevmSetMultiplierBatchFee // Event containing the contract specifics and raw log +// PolygonzkevmSetTrustedAggregatorIterator is returned from FilterSetTrustedAggregator and is used to iterate over the raw logs and unpacked data for SetTrustedAggregator events raised by the Polygonzkevm contract. +type PolygonzkevmSetTrustedAggregatorIterator struct { + Event *PolygonzkevmSetTrustedAggregator // 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 @@ -3660,7 +3668,7 @@ type PolygonzkevmSetMultiplierBatchFeeIterator struct { // 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 *PolygonzkevmSetMultiplierBatchFeeIterator) Next() bool { +func (it *PolygonzkevmSetTrustedAggregatorIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -3669,7 +3677,7 @@ func (it *PolygonzkevmSetMultiplierBatchFeeIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetMultiplierBatchFee) + it.Event = new(PolygonzkevmSetTrustedAggregator) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3684,7 +3692,7 @@ func (it *PolygonzkevmSetMultiplierBatchFeeIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetMultiplierBatchFee) + it.Event = new(PolygonzkevmSetTrustedAggregator) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3700,41 +3708,41 @@ func (it *PolygonzkevmSetMultiplierBatchFeeIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PolygonzkevmSetMultiplierBatchFeeIterator) Error() error { +func (it *PolygonzkevmSetTrustedAggregatorIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PolygonzkevmSetMultiplierBatchFeeIterator) Close() error { +func (it *PolygonzkevmSetTrustedAggregatorIterator) Close() error { it.sub.Unsubscribe() return nil } -// PolygonzkevmSetMultiplierBatchFee represents a SetMultiplierBatchFee event raised by the Polygonzkevm contract. -type PolygonzkevmSetMultiplierBatchFee struct { - NewMultiplierBatchFee uint16 - Raw types.Log // Blockchain specific contextual infos +// PolygonzkevmSetTrustedAggregator represents a SetTrustedAggregator event raised by the Polygonzkevm contract. +type PolygonzkevmSetTrustedAggregator struct { + NewTrustedAggregator common.Address + Raw types.Log // Blockchain specific contextual infos } -// FilterSetMultiplierBatchFee is a free log retrieval operation binding the contract event 0x7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5. +// FilterSetTrustedAggregator is a free log retrieval operation binding the contract event 0x61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca. // -// Solidity: event SetMultiplierBatchFee(uint16 newMultiplierBatchFee) -func (_Polygonzkevm *PolygonzkevmFilterer) FilterSetMultiplierBatchFee(opts *bind.FilterOpts) (*PolygonzkevmSetMultiplierBatchFeeIterator, error) { +// Solidity: event SetTrustedAggregator(address newTrustedAggregator) +func (_Polygonzkevm *PolygonzkevmFilterer) FilterSetTrustedAggregator(opts *bind.FilterOpts) (*PolygonzkevmSetTrustedAggregatorIterator, error) { - logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "SetMultiplierBatchFee") + logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "SetTrustedAggregator") if err != nil { return nil, err } - return &PolygonzkevmSetMultiplierBatchFeeIterator{contract: _Polygonzkevm.contract, event: "SetMultiplierBatchFee", logs: logs, sub: sub}, nil + return &PolygonzkevmSetTrustedAggregatorIterator{contract: _Polygonzkevm.contract, event: "SetTrustedAggregator", logs: logs, sub: sub}, nil } -// WatchSetMultiplierBatchFee is a free log subscription operation binding the contract event 0x7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5. +// WatchSetTrustedAggregator is a free log subscription operation binding the contract event 0x61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca. // -// Solidity: event SetMultiplierBatchFee(uint16 newMultiplierBatchFee) -func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetMultiplierBatchFee(opts *bind.WatchOpts, sink chan<- *PolygonzkevmSetMultiplierBatchFee) (event.Subscription, error) { +// Solidity: event SetTrustedAggregator(address newTrustedAggregator) +func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetTrustedAggregator(opts *bind.WatchOpts, sink chan<- *PolygonzkevmSetTrustedAggregator) (event.Subscription, error) { - logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "SetMultiplierBatchFee") + logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "SetTrustedAggregator") if err != nil { return nil, err } @@ -3744,8 +3752,8 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetMultiplierBatchFee(opts *bind select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PolygonzkevmSetMultiplierBatchFee) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetMultiplierBatchFee", log); err != nil { + event := new(PolygonzkevmSetTrustedAggregator) + if err := _Polygonzkevm.contract.UnpackLog(event, "SetTrustedAggregator", log); err != nil { return err } event.Raw = log @@ -3766,21 +3774,21 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetMultiplierBatchFee(opts *bind }), nil } -// ParseSetMultiplierBatchFee is a log parse operation binding the contract event 0x7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5. +// ParseSetTrustedAggregator is a log parse operation binding the contract event 0x61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca. // -// Solidity: event SetMultiplierBatchFee(uint16 newMultiplierBatchFee) -func (_Polygonzkevm *PolygonzkevmFilterer) ParseSetMultiplierBatchFee(log types.Log) (*PolygonzkevmSetMultiplierBatchFee, error) { - event := new(PolygonzkevmSetMultiplierBatchFee) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetMultiplierBatchFee", log); err != nil { +// Solidity: event SetTrustedAggregator(address newTrustedAggregator) +func (_Polygonzkevm *PolygonzkevmFilterer) ParseSetTrustedAggregator(log types.Log) (*PolygonzkevmSetTrustedAggregator, error) { + event := new(PolygonzkevmSetTrustedAggregator) + if err := _Polygonzkevm.contract.UnpackLog(event, "SetTrustedAggregator", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PolygonzkevmSetPendingStateTimeoutIterator is returned from FilterSetPendingStateTimeout and is used to iterate over the raw logs and unpacked data for SetPendingStateTimeout events raised by the Polygonzkevm contract. -type PolygonzkevmSetPendingStateTimeoutIterator struct { - Event *PolygonzkevmSetPendingStateTimeout // Event containing the contract specifics and raw log +// PolygonzkevmSetTrustedAggregatorTimeoutIterator is returned from FilterSetTrustedAggregatorTimeout and is used to iterate over the raw logs and unpacked data for SetTrustedAggregatorTimeout events raised by the Polygonzkevm contract. +type PolygonzkevmSetTrustedAggregatorTimeoutIterator struct { + Event *PolygonzkevmSetTrustedAggregatorTimeout // 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 @@ -3794,7 +3802,7 @@ type PolygonzkevmSetPendingStateTimeoutIterator struct { // 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 *PolygonzkevmSetPendingStateTimeoutIterator) Next() bool { +func (it *PolygonzkevmSetTrustedAggregatorTimeoutIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -3803,7 +3811,7 @@ func (it *PolygonzkevmSetPendingStateTimeoutIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetPendingStateTimeout) + it.Event = new(PolygonzkevmSetTrustedAggregatorTimeout) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3818,7 +3826,7 @@ func (it *PolygonzkevmSetPendingStateTimeoutIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetPendingStateTimeout) + it.Event = new(PolygonzkevmSetTrustedAggregatorTimeout) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3834,41 +3842,41 @@ func (it *PolygonzkevmSetPendingStateTimeoutIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PolygonzkevmSetPendingStateTimeoutIterator) Error() error { +func (it *PolygonzkevmSetTrustedAggregatorTimeoutIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PolygonzkevmSetPendingStateTimeoutIterator) Close() error { +func (it *PolygonzkevmSetTrustedAggregatorTimeoutIterator) Close() error { it.sub.Unsubscribe() return nil } -// PolygonzkevmSetPendingStateTimeout represents a SetPendingStateTimeout event raised by the Polygonzkevm contract. -type PolygonzkevmSetPendingStateTimeout struct { - NewPendingStateTimeout uint64 - Raw types.Log // Blockchain specific contextual infos +// PolygonzkevmSetTrustedAggregatorTimeout represents a SetTrustedAggregatorTimeout event raised by the Polygonzkevm contract. +type PolygonzkevmSetTrustedAggregatorTimeout struct { + NewTrustedAggregatorTimeout uint64 + Raw types.Log // Blockchain specific contextual infos } -// FilterSetPendingStateTimeout is a free log retrieval operation binding the contract event 0xc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75. +// FilterSetTrustedAggregatorTimeout is a free log retrieval operation binding the contract event 0x1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1. // -// Solidity: event SetPendingStateTimeout(uint64 newPendingStateTimeout) -func (_Polygonzkevm *PolygonzkevmFilterer) FilterSetPendingStateTimeout(opts *bind.FilterOpts) (*PolygonzkevmSetPendingStateTimeoutIterator, error) { +// Solidity: event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) +func (_Polygonzkevm *PolygonzkevmFilterer) FilterSetTrustedAggregatorTimeout(opts *bind.FilterOpts) (*PolygonzkevmSetTrustedAggregatorTimeoutIterator, error) { - logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "SetPendingStateTimeout") + logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "SetTrustedAggregatorTimeout") if err != nil { return nil, err } - return &PolygonzkevmSetPendingStateTimeoutIterator{contract: _Polygonzkevm.contract, event: "SetPendingStateTimeout", logs: logs, sub: sub}, nil + return &PolygonzkevmSetTrustedAggregatorTimeoutIterator{contract: _Polygonzkevm.contract, event: "SetTrustedAggregatorTimeout", logs: logs, sub: sub}, nil } -// WatchSetPendingStateTimeout is a free log subscription operation binding the contract event 0xc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75. +// WatchSetTrustedAggregatorTimeout is a free log subscription operation binding the contract event 0x1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1. // -// Solidity: event SetPendingStateTimeout(uint64 newPendingStateTimeout) -func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetPendingStateTimeout(opts *bind.WatchOpts, sink chan<- *PolygonzkevmSetPendingStateTimeout) (event.Subscription, error) { +// Solidity: event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) +func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetTrustedAggregatorTimeout(opts *bind.WatchOpts, sink chan<- *PolygonzkevmSetTrustedAggregatorTimeout) (event.Subscription, error) { - logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "SetPendingStateTimeout") + logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "SetTrustedAggregatorTimeout") if err != nil { return nil, err } @@ -3878,8 +3886,8 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetPendingStateTimeout(opts *bin select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PolygonzkevmSetPendingStateTimeout) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetPendingStateTimeout", log); err != nil { + event := new(PolygonzkevmSetTrustedAggregatorTimeout) + if err := _Polygonzkevm.contract.UnpackLog(event, "SetTrustedAggregatorTimeout", log); err != nil { return err } event.Raw = log @@ -3900,21 +3908,21 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetPendingStateTimeout(opts *bin }), nil } -// ParseSetPendingStateTimeout is a log parse operation binding the contract event 0xc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75. +// ParseSetTrustedAggregatorTimeout is a log parse operation binding the contract event 0x1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1. // -// Solidity: event SetPendingStateTimeout(uint64 newPendingStateTimeout) -func (_Polygonzkevm *PolygonzkevmFilterer) ParseSetPendingStateTimeout(log types.Log) (*PolygonzkevmSetPendingStateTimeout, error) { - event := new(PolygonzkevmSetPendingStateTimeout) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetPendingStateTimeout", log); err != nil { +// Solidity: event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) +func (_Polygonzkevm *PolygonzkevmFilterer) ParseSetTrustedAggregatorTimeout(log types.Log) (*PolygonzkevmSetTrustedAggregatorTimeout, error) { + event := new(PolygonzkevmSetTrustedAggregatorTimeout) + if err := _Polygonzkevm.contract.UnpackLog(event, "SetTrustedAggregatorTimeout", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PolygonzkevmSetTrustedAggregatorIterator is returned from FilterSetTrustedAggregator and is used to iterate over the raw logs and unpacked data for SetTrustedAggregator events raised by the Polygonzkevm contract. -type PolygonzkevmSetTrustedAggregatorIterator struct { - Event *PolygonzkevmSetTrustedAggregator // Event containing the contract specifics and raw log +// PolygonzkevmSetTrustedSequencerIterator is returned from FilterSetTrustedSequencer and is used to iterate over the raw logs and unpacked data for SetTrustedSequencer events raised by the Polygonzkevm contract. +type PolygonzkevmSetTrustedSequencerIterator struct { + Event *PolygonzkevmSetTrustedSequencer // 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 @@ -3928,7 +3936,7 @@ type PolygonzkevmSetTrustedAggregatorIterator struct { // 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 *PolygonzkevmSetTrustedAggregatorIterator) Next() bool { +func (it *PolygonzkevmSetTrustedSequencerIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -3937,7 +3945,7 @@ func (it *PolygonzkevmSetTrustedAggregatorIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetTrustedAggregator) + it.Event = new(PolygonzkevmSetTrustedSequencer) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3952,7 +3960,7 @@ func (it *PolygonzkevmSetTrustedAggregatorIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetTrustedAggregator) + it.Event = new(PolygonzkevmSetTrustedSequencer) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -3968,41 +3976,41 @@ func (it *PolygonzkevmSetTrustedAggregatorIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PolygonzkevmSetTrustedAggregatorIterator) Error() error { +func (it *PolygonzkevmSetTrustedSequencerIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PolygonzkevmSetTrustedAggregatorIterator) Close() error { +func (it *PolygonzkevmSetTrustedSequencerIterator) Close() error { it.sub.Unsubscribe() return nil } -// PolygonzkevmSetTrustedAggregator represents a SetTrustedAggregator event raised by the Polygonzkevm contract. -type PolygonzkevmSetTrustedAggregator struct { - NewTrustedAggregator common.Address - Raw types.Log // Blockchain specific contextual infos +// PolygonzkevmSetTrustedSequencer represents a SetTrustedSequencer event raised by the Polygonzkevm contract. +type PolygonzkevmSetTrustedSequencer struct { + NewTrustedSequencer common.Address + Raw types.Log // Blockchain specific contextual infos } -// FilterSetTrustedAggregator is a free log retrieval operation binding the contract event 0x61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca. +// FilterSetTrustedSequencer is a free log retrieval operation binding the contract event 0xf54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0. // -// Solidity: event SetTrustedAggregator(address newTrustedAggregator) -func (_Polygonzkevm *PolygonzkevmFilterer) FilterSetTrustedAggregator(opts *bind.FilterOpts) (*PolygonzkevmSetTrustedAggregatorIterator, error) { +// Solidity: event SetTrustedSequencer(address newTrustedSequencer) +func (_Polygonzkevm *PolygonzkevmFilterer) FilterSetTrustedSequencer(opts *bind.FilterOpts) (*PolygonzkevmSetTrustedSequencerIterator, error) { - logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "SetTrustedAggregator") + logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "SetTrustedSequencer") if err != nil { return nil, err } - return &PolygonzkevmSetTrustedAggregatorIterator{contract: _Polygonzkevm.contract, event: "SetTrustedAggregator", logs: logs, sub: sub}, nil + return &PolygonzkevmSetTrustedSequencerIterator{contract: _Polygonzkevm.contract, event: "SetTrustedSequencer", logs: logs, sub: sub}, nil } -// WatchSetTrustedAggregator is a free log subscription operation binding the contract event 0x61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca. +// WatchSetTrustedSequencer is a free log subscription operation binding the contract event 0xf54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0. // -// Solidity: event SetTrustedAggregator(address newTrustedAggregator) -func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetTrustedAggregator(opts *bind.WatchOpts, sink chan<- *PolygonzkevmSetTrustedAggregator) (event.Subscription, error) { +// Solidity: event SetTrustedSequencer(address newTrustedSequencer) +func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetTrustedSequencer(opts *bind.WatchOpts, sink chan<- *PolygonzkevmSetTrustedSequencer) (event.Subscription, error) { - logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "SetTrustedAggregator") + logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "SetTrustedSequencer") if err != nil { return nil, err } @@ -4012,8 +4020,8 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetTrustedAggregator(opts *bind. select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PolygonzkevmSetTrustedAggregator) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetTrustedAggregator", log); err != nil { + event := new(PolygonzkevmSetTrustedSequencer) + if err := _Polygonzkevm.contract.UnpackLog(event, "SetTrustedSequencer", log); err != nil { return err } event.Raw = log @@ -4034,21 +4042,21 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetTrustedAggregator(opts *bind. }), nil } -// ParseSetTrustedAggregator is a log parse operation binding the contract event 0x61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca. +// ParseSetTrustedSequencer is a log parse operation binding the contract event 0xf54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0. // -// Solidity: event SetTrustedAggregator(address newTrustedAggregator) -func (_Polygonzkevm *PolygonzkevmFilterer) ParseSetTrustedAggregator(log types.Log) (*PolygonzkevmSetTrustedAggregator, error) { - event := new(PolygonzkevmSetTrustedAggregator) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetTrustedAggregator", log); err != nil { +// Solidity: event SetTrustedSequencer(address newTrustedSequencer) +func (_Polygonzkevm *PolygonzkevmFilterer) ParseSetTrustedSequencer(log types.Log) (*PolygonzkevmSetTrustedSequencer, error) { + event := new(PolygonzkevmSetTrustedSequencer) + if err := _Polygonzkevm.contract.UnpackLog(event, "SetTrustedSequencer", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PolygonzkevmSetTrustedAggregatorTimeoutIterator is returned from FilterSetTrustedAggregatorTimeout and is used to iterate over the raw logs and unpacked data for SetTrustedAggregatorTimeout events raised by the Polygonzkevm contract. -type PolygonzkevmSetTrustedAggregatorTimeoutIterator struct { - Event *PolygonzkevmSetTrustedAggregatorTimeout // Event containing the contract specifics and raw log +// PolygonzkevmSetTrustedSequencerURLIterator is returned from FilterSetTrustedSequencerURL and is used to iterate over the raw logs and unpacked data for SetTrustedSequencerURL events raised by the Polygonzkevm contract. +type PolygonzkevmSetTrustedSequencerURLIterator struct { + Event *PolygonzkevmSetTrustedSequencerURL // 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 @@ -4062,7 +4070,7 @@ type PolygonzkevmSetTrustedAggregatorTimeoutIterator struct { // 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 *PolygonzkevmSetTrustedAggregatorTimeoutIterator) Next() bool { +func (it *PolygonzkevmSetTrustedSequencerURLIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -4071,7 +4079,7 @@ func (it *PolygonzkevmSetTrustedAggregatorTimeoutIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetTrustedAggregatorTimeout) + it.Event = new(PolygonzkevmSetTrustedSequencerURL) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -4086,7 +4094,7 @@ func (it *PolygonzkevmSetTrustedAggregatorTimeoutIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetTrustedAggregatorTimeout) + it.Event = new(PolygonzkevmSetTrustedSequencerURL) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -4102,41 +4110,41 @@ func (it *PolygonzkevmSetTrustedAggregatorTimeoutIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PolygonzkevmSetTrustedAggregatorTimeoutIterator) Error() error { +func (it *PolygonzkevmSetTrustedSequencerURLIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PolygonzkevmSetTrustedAggregatorTimeoutIterator) Close() error { +func (it *PolygonzkevmSetTrustedSequencerURLIterator) Close() error { it.sub.Unsubscribe() return nil } -// PolygonzkevmSetTrustedAggregatorTimeout represents a SetTrustedAggregatorTimeout event raised by the Polygonzkevm contract. -type PolygonzkevmSetTrustedAggregatorTimeout struct { - NewTrustedAggregatorTimeout uint64 - Raw types.Log // Blockchain specific contextual infos +// PolygonzkevmSetTrustedSequencerURL represents a SetTrustedSequencerURL event raised by the Polygonzkevm contract. +type PolygonzkevmSetTrustedSequencerURL struct { + NewTrustedSequencerURL string + Raw types.Log // Blockchain specific contextual infos } -// FilterSetTrustedAggregatorTimeout is a free log retrieval operation binding the contract event 0x1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1. +// FilterSetTrustedSequencerURL is a free log retrieval operation binding the contract event 0x6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20. // -// Solidity: event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) -func (_Polygonzkevm *PolygonzkevmFilterer) FilterSetTrustedAggregatorTimeout(opts *bind.FilterOpts) (*PolygonzkevmSetTrustedAggregatorTimeoutIterator, error) { +// Solidity: event SetTrustedSequencerURL(string newTrustedSequencerURL) +func (_Polygonzkevm *PolygonzkevmFilterer) FilterSetTrustedSequencerURL(opts *bind.FilterOpts) (*PolygonzkevmSetTrustedSequencerURLIterator, error) { - logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "SetTrustedAggregatorTimeout") + logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "SetTrustedSequencerURL") if err != nil { return nil, err } - return &PolygonzkevmSetTrustedAggregatorTimeoutIterator{contract: _Polygonzkevm.contract, event: "SetTrustedAggregatorTimeout", logs: logs, sub: sub}, nil + return &PolygonzkevmSetTrustedSequencerURLIterator{contract: _Polygonzkevm.contract, event: "SetTrustedSequencerURL", logs: logs, sub: sub}, nil } -// WatchSetTrustedAggregatorTimeout is a free log subscription operation binding the contract event 0x1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1. +// WatchSetTrustedSequencerURL is a free log subscription operation binding the contract event 0x6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20. // -// Solidity: event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) -func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetTrustedAggregatorTimeout(opts *bind.WatchOpts, sink chan<- *PolygonzkevmSetTrustedAggregatorTimeout) (event.Subscription, error) { +// Solidity: event SetTrustedSequencerURL(string newTrustedSequencerURL) +func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetTrustedSequencerURL(opts *bind.WatchOpts, sink chan<- *PolygonzkevmSetTrustedSequencerURL) (event.Subscription, error) { - logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "SetTrustedAggregatorTimeout") + logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "SetTrustedSequencerURL") if err != nil { return nil, err } @@ -4146,8 +4154,8 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetTrustedAggregatorTimeout(opts select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PolygonzkevmSetTrustedAggregatorTimeout) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetTrustedAggregatorTimeout", log); err != nil { + event := new(PolygonzkevmSetTrustedSequencerURL) + if err := _Polygonzkevm.contract.UnpackLog(event, "SetTrustedSequencerURL", log); err != nil { return err } event.Raw = log @@ -4168,21 +4176,21 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetTrustedAggregatorTimeout(opts }), nil } -// ParseSetTrustedAggregatorTimeout is a log parse operation binding the contract event 0x1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1. +// ParseSetTrustedSequencerURL is a log parse operation binding the contract event 0x6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20. // -// Solidity: event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout) -func (_Polygonzkevm *PolygonzkevmFilterer) ParseSetTrustedAggregatorTimeout(log types.Log) (*PolygonzkevmSetTrustedAggregatorTimeout, error) { - event := new(PolygonzkevmSetTrustedAggregatorTimeout) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetTrustedAggregatorTimeout", log); err != nil { +// Solidity: event SetTrustedSequencerURL(string newTrustedSequencerURL) +func (_Polygonzkevm *PolygonzkevmFilterer) ParseSetTrustedSequencerURL(log types.Log) (*PolygonzkevmSetTrustedSequencerURL, error) { + event := new(PolygonzkevmSetTrustedSequencerURL) + if err := _Polygonzkevm.contract.UnpackLog(event, "SetTrustedSequencerURL", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PolygonzkevmSetTrustedSequencerIterator is returned from FilterSetTrustedSequencer and is used to iterate over the raw logs and unpacked data for SetTrustedSequencer events raised by the Polygonzkevm contract. -type PolygonzkevmSetTrustedSequencerIterator struct { - Event *PolygonzkevmSetTrustedSequencer // Event containing the contract specifics and raw log +// PolygonzkevmSetVerifyBatchTimeTargetIterator is returned from FilterSetVerifyBatchTimeTarget and is used to iterate over the raw logs and unpacked data for SetVerifyBatchTimeTarget events raised by the Polygonzkevm contract. +type PolygonzkevmSetVerifyBatchTimeTargetIterator struct { + Event *PolygonzkevmSetVerifyBatchTimeTarget // 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 @@ -4196,7 +4204,7 @@ type PolygonzkevmSetTrustedSequencerIterator struct { // 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 *PolygonzkevmSetTrustedSequencerIterator) Next() bool { +func (it *PolygonzkevmSetVerifyBatchTimeTargetIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -4205,7 +4213,7 @@ func (it *PolygonzkevmSetTrustedSequencerIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetTrustedSequencer) + it.Event = new(PolygonzkevmSetVerifyBatchTimeTarget) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -4220,7 +4228,7 @@ func (it *PolygonzkevmSetTrustedSequencerIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetTrustedSequencer) + it.Event = new(PolygonzkevmSetVerifyBatchTimeTarget) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -4236,41 +4244,41 @@ func (it *PolygonzkevmSetTrustedSequencerIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PolygonzkevmSetTrustedSequencerIterator) Error() error { +func (it *PolygonzkevmSetVerifyBatchTimeTargetIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PolygonzkevmSetTrustedSequencerIterator) Close() error { +func (it *PolygonzkevmSetVerifyBatchTimeTargetIterator) Close() error { it.sub.Unsubscribe() return nil } -// PolygonzkevmSetTrustedSequencer represents a SetTrustedSequencer event raised by the Polygonzkevm contract. -type PolygonzkevmSetTrustedSequencer struct { - NewTrustedSequencer common.Address - Raw types.Log // Blockchain specific contextual infos +// PolygonzkevmSetVerifyBatchTimeTarget represents a SetVerifyBatchTimeTarget event raised by the Polygonzkevm contract. +type PolygonzkevmSetVerifyBatchTimeTarget struct { + NewVerifyBatchTimeTarget uint64 + Raw types.Log // Blockchain specific contextual infos } -// FilterSetTrustedSequencer is a free log retrieval operation binding the contract event 0xf54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0. +// FilterSetVerifyBatchTimeTarget is a free log retrieval operation binding the contract event 0x1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28. // -// Solidity: event SetTrustedSequencer(address newTrustedSequencer) -func (_Polygonzkevm *PolygonzkevmFilterer) FilterSetTrustedSequencer(opts *bind.FilterOpts) (*PolygonzkevmSetTrustedSequencerIterator, error) { +// Solidity: event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) +func (_Polygonzkevm *PolygonzkevmFilterer) FilterSetVerifyBatchTimeTarget(opts *bind.FilterOpts) (*PolygonzkevmSetVerifyBatchTimeTargetIterator, error) { - logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "SetTrustedSequencer") + logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "SetVerifyBatchTimeTarget") if err != nil { return nil, err } - return &PolygonzkevmSetTrustedSequencerIterator{contract: _Polygonzkevm.contract, event: "SetTrustedSequencer", logs: logs, sub: sub}, nil + return &PolygonzkevmSetVerifyBatchTimeTargetIterator{contract: _Polygonzkevm.contract, event: "SetVerifyBatchTimeTarget", logs: logs, sub: sub}, nil } -// WatchSetTrustedSequencer is a free log subscription operation binding the contract event 0xf54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0. +// WatchSetVerifyBatchTimeTarget is a free log subscription operation binding the contract event 0x1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28. // -// Solidity: event SetTrustedSequencer(address newTrustedSequencer) -func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetTrustedSequencer(opts *bind.WatchOpts, sink chan<- *PolygonzkevmSetTrustedSequencer) (event.Subscription, error) { +// Solidity: event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) +func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetVerifyBatchTimeTarget(opts *bind.WatchOpts, sink chan<- *PolygonzkevmSetVerifyBatchTimeTarget) (event.Subscription, error) { - logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "SetTrustedSequencer") + logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "SetVerifyBatchTimeTarget") if err != nil { return nil, err } @@ -4280,8 +4288,8 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetTrustedSequencer(opts *bind.W select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PolygonzkevmSetTrustedSequencer) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetTrustedSequencer", log); err != nil { + event := new(PolygonzkevmSetVerifyBatchTimeTarget) + if err := _Polygonzkevm.contract.UnpackLog(event, "SetVerifyBatchTimeTarget", log); err != nil { return err } event.Raw = log @@ -4302,21 +4310,21 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetTrustedSequencer(opts *bind.W }), nil } -// ParseSetTrustedSequencer is a log parse operation binding the contract event 0xf54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0. +// ParseSetVerifyBatchTimeTarget is a log parse operation binding the contract event 0x1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28. // -// Solidity: event SetTrustedSequencer(address newTrustedSequencer) -func (_Polygonzkevm *PolygonzkevmFilterer) ParseSetTrustedSequencer(log types.Log) (*PolygonzkevmSetTrustedSequencer, error) { - event := new(PolygonzkevmSetTrustedSequencer) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetTrustedSequencer", log); err != nil { +// Solidity: event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget) +func (_Polygonzkevm *PolygonzkevmFilterer) ParseSetVerifyBatchTimeTarget(log types.Log) (*PolygonzkevmSetVerifyBatchTimeTarget, error) { + event := new(PolygonzkevmSetVerifyBatchTimeTarget) + if err := _Polygonzkevm.contract.UnpackLog(event, "SetVerifyBatchTimeTarget", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PolygonzkevmSetTrustedSequencerURLIterator is returned from FilterSetTrustedSequencerURL and is used to iterate over the raw logs and unpacked data for SetTrustedSequencerURL events raised by the Polygonzkevm contract. -type PolygonzkevmSetTrustedSequencerURLIterator struct { - Event *PolygonzkevmSetTrustedSequencerURL // Event containing the contract specifics and raw log +// PolygonzkevmTransferAdminRoleIterator is returned from FilterTransferAdminRole and is used to iterate over the raw logs and unpacked data for TransferAdminRole events raised by the Polygonzkevm contract. +type PolygonzkevmTransferAdminRoleIterator struct { + Event *PolygonzkevmTransferAdminRole // 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 @@ -4330,7 +4338,7 @@ type PolygonzkevmSetTrustedSequencerURLIterator struct { // 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 *PolygonzkevmSetTrustedSequencerURLIterator) Next() bool { +func (it *PolygonzkevmTransferAdminRoleIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -4339,7 +4347,7 @@ func (it *PolygonzkevmSetTrustedSequencerURLIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetTrustedSequencerURL) + it.Event = new(PolygonzkevmTransferAdminRole) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -4354,7 +4362,7 @@ func (it *PolygonzkevmSetTrustedSequencerURLIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetTrustedSequencerURL) + it.Event = new(PolygonzkevmTransferAdminRole) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -4370,41 +4378,41 @@ func (it *PolygonzkevmSetTrustedSequencerURLIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PolygonzkevmSetTrustedSequencerURLIterator) Error() error { +func (it *PolygonzkevmTransferAdminRoleIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PolygonzkevmSetTrustedSequencerURLIterator) Close() error { +func (it *PolygonzkevmTransferAdminRoleIterator) Close() error { it.sub.Unsubscribe() return nil } -// PolygonzkevmSetTrustedSequencerURL represents a SetTrustedSequencerURL event raised by the Polygonzkevm contract. -type PolygonzkevmSetTrustedSequencerURL struct { - NewTrustedSequencerURL string - Raw types.Log // Blockchain specific contextual infos +// PolygonzkevmTransferAdminRole represents a TransferAdminRole event raised by the Polygonzkevm contract. +type PolygonzkevmTransferAdminRole struct { + NewPendingAdmin common.Address + Raw types.Log // Blockchain specific contextual infos } -// FilterSetTrustedSequencerURL is a free log retrieval operation binding the contract event 0x6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20. +// FilterTransferAdminRole is a free log retrieval operation binding the contract event 0xa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6. // -// Solidity: event SetTrustedSequencerURL(string newTrustedSequencerURL) -func (_Polygonzkevm *PolygonzkevmFilterer) FilterSetTrustedSequencerURL(opts *bind.FilterOpts) (*PolygonzkevmSetTrustedSequencerURLIterator, error) { +// Solidity: event TransferAdminRole(address newPendingAdmin) +func (_Polygonzkevm *PolygonzkevmFilterer) FilterTransferAdminRole(opts *bind.FilterOpts) (*PolygonzkevmTransferAdminRoleIterator, error) { - logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "SetTrustedSequencerURL") + logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "TransferAdminRole") if err != nil { return nil, err } - return &PolygonzkevmSetTrustedSequencerURLIterator{contract: _Polygonzkevm.contract, event: "SetTrustedSequencerURL", logs: logs, sub: sub}, nil + return &PolygonzkevmTransferAdminRoleIterator{contract: _Polygonzkevm.contract, event: "TransferAdminRole", logs: logs, sub: sub}, nil } -// WatchSetTrustedSequencerURL is a free log subscription operation binding the contract event 0x6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20. +// WatchTransferAdminRole is a free log subscription operation binding the contract event 0xa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6. // -// Solidity: event SetTrustedSequencerURL(string newTrustedSequencerURL) -func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetTrustedSequencerURL(opts *bind.WatchOpts, sink chan<- *PolygonzkevmSetTrustedSequencerURL) (event.Subscription, error) { +// Solidity: event TransferAdminRole(address newPendingAdmin) +func (_Polygonzkevm *PolygonzkevmFilterer) WatchTransferAdminRole(opts *bind.WatchOpts, sink chan<- *PolygonzkevmTransferAdminRole) (event.Subscription, error) { - logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "SetTrustedSequencerURL") + logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "TransferAdminRole") if err != nil { return nil, err } @@ -4414,8 +4422,8 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetTrustedSequencerURL(opts *bin select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PolygonzkevmSetTrustedSequencerURL) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetTrustedSequencerURL", log); err != nil { + event := new(PolygonzkevmTransferAdminRole) + if err := _Polygonzkevm.contract.UnpackLog(event, "TransferAdminRole", log); err != nil { return err } event.Raw = log @@ -4436,21 +4444,21 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetTrustedSequencerURL(opts *bin }), nil } -// ParseSetTrustedSequencerURL is a log parse operation binding the contract event 0x6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20. +// ParseTransferAdminRole is a log parse operation binding the contract event 0xa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6. // -// Solidity: event SetTrustedSequencerURL(string newTrustedSequencerURL) -func (_Polygonzkevm *PolygonzkevmFilterer) ParseSetTrustedSequencerURL(log types.Log) (*PolygonzkevmSetTrustedSequencerURL, error) { - event := new(PolygonzkevmSetTrustedSequencerURL) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetTrustedSequencerURL", log); err != nil { +// Solidity: event TransferAdminRole(address newPendingAdmin) +func (_Polygonzkevm *PolygonzkevmFilterer) ParseTransferAdminRole(log types.Log) (*PolygonzkevmTransferAdminRole, error) { + event := new(PolygonzkevmTransferAdminRole) + if err := _Polygonzkevm.contract.UnpackLog(event, "TransferAdminRole", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PolygonzkevmSetVeryBatchTimeTargetIterator is returned from FilterSetVeryBatchTimeTarget and is used to iterate over the raw logs and unpacked data for SetVeryBatchTimeTarget events raised by the Polygonzkevm contract. -type PolygonzkevmSetVeryBatchTimeTargetIterator struct { - Event *PolygonzkevmSetVeryBatchTimeTarget // Event containing the contract specifics and raw log +// PolygonzkevmUpdateZkEVMVersionIterator is returned from FilterUpdateZkEVMVersion and is used to iterate over the raw logs and unpacked data for UpdateZkEVMVersion events raised by the Polygonzkevm contract. +type PolygonzkevmUpdateZkEVMVersionIterator struct { + Event *PolygonzkevmUpdateZkEVMVersion // 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 @@ -4464,7 +4472,7 @@ type PolygonzkevmSetVeryBatchTimeTargetIterator struct { // 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 *PolygonzkevmSetVeryBatchTimeTargetIterator) Next() bool { +func (it *PolygonzkevmUpdateZkEVMVersionIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -4473,7 +4481,7 @@ func (it *PolygonzkevmSetVeryBatchTimeTargetIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetVeryBatchTimeTarget) + it.Event = new(PolygonzkevmUpdateZkEVMVersion) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -4488,7 +4496,7 @@ func (it *PolygonzkevmSetVeryBatchTimeTargetIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PolygonzkevmSetVeryBatchTimeTarget) + it.Event = new(PolygonzkevmUpdateZkEVMVersion) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -4504,41 +4512,43 @@ func (it *PolygonzkevmSetVeryBatchTimeTargetIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PolygonzkevmSetVeryBatchTimeTargetIterator) Error() error { +func (it *PolygonzkevmUpdateZkEVMVersionIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PolygonzkevmSetVeryBatchTimeTargetIterator) Close() error { +func (it *PolygonzkevmUpdateZkEVMVersionIterator) Close() error { it.sub.Unsubscribe() return nil } -// PolygonzkevmSetVeryBatchTimeTarget represents a SetVeryBatchTimeTarget event raised by the Polygonzkevm contract. -type PolygonzkevmSetVeryBatchTimeTarget struct { - NewVeryBatchTimeTarget uint64 - Raw types.Log // Blockchain specific contextual infos +// PolygonzkevmUpdateZkEVMVersion represents a UpdateZkEVMVersion event raised by the Polygonzkevm contract. +type PolygonzkevmUpdateZkEVMVersion struct { + NumBatch uint64 + ForkID uint64 + Version string + Raw types.Log // Blockchain specific contextual infos } -// FilterSetVeryBatchTimeTarget is a free log retrieval operation binding the contract event 0x03a12f7e53d2a9e31a9e913d85c12c4c38feb92abe003c111329298af088437f. +// FilterUpdateZkEVMVersion is a free log retrieval operation binding the contract event 0xed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd6. // -// Solidity: event SetVeryBatchTimeTarget(uint64 newVeryBatchTimeTarget) -func (_Polygonzkevm *PolygonzkevmFilterer) FilterSetVeryBatchTimeTarget(opts *bind.FilterOpts) (*PolygonzkevmSetVeryBatchTimeTargetIterator, error) { +// Solidity: event UpdateZkEVMVersion(uint64 numBatch, uint64 forkID, string version) +func (_Polygonzkevm *PolygonzkevmFilterer) FilterUpdateZkEVMVersion(opts *bind.FilterOpts) (*PolygonzkevmUpdateZkEVMVersionIterator, error) { - logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "SetVeryBatchTimeTarget") + logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "UpdateZkEVMVersion") if err != nil { return nil, err } - return &PolygonzkevmSetVeryBatchTimeTargetIterator{contract: _Polygonzkevm.contract, event: "SetVeryBatchTimeTarget", logs: logs, sub: sub}, nil + return &PolygonzkevmUpdateZkEVMVersionIterator{contract: _Polygonzkevm.contract, event: "UpdateZkEVMVersion", logs: logs, sub: sub}, nil } -// WatchSetVeryBatchTimeTarget is a free log subscription operation binding the contract event 0x03a12f7e53d2a9e31a9e913d85c12c4c38feb92abe003c111329298af088437f. +// WatchUpdateZkEVMVersion is a free log subscription operation binding the contract event 0xed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd6. // -// Solidity: event SetVeryBatchTimeTarget(uint64 newVeryBatchTimeTarget) -func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetVeryBatchTimeTarget(opts *bind.WatchOpts, sink chan<- *PolygonzkevmSetVeryBatchTimeTarget) (event.Subscription, error) { +// Solidity: event UpdateZkEVMVersion(uint64 numBatch, uint64 forkID, string version) +func (_Polygonzkevm *PolygonzkevmFilterer) WatchUpdateZkEVMVersion(opts *bind.WatchOpts, sink chan<- *PolygonzkevmUpdateZkEVMVersion) (event.Subscription, error) { - logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "SetVeryBatchTimeTarget") + logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "UpdateZkEVMVersion") if err != nil { return nil, err } @@ -4548,8 +4558,8 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetVeryBatchTimeTarget(opts *bin select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PolygonzkevmSetVeryBatchTimeTarget) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetVeryBatchTimeTarget", log); err != nil { + event := new(PolygonzkevmUpdateZkEVMVersion) + if err := _Polygonzkevm.contract.UnpackLog(event, "UpdateZkEVMVersion", log); err != nil { return err } event.Raw = log @@ -4570,21 +4580,21 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchSetVeryBatchTimeTarget(opts *bin }), nil } -// ParseSetVeryBatchTimeTarget is a log parse operation binding the contract event 0x03a12f7e53d2a9e31a9e913d85c12c4c38feb92abe003c111329298af088437f. +// ParseUpdateZkEVMVersion is a log parse operation binding the contract event 0xed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd6. // -// Solidity: event SetVeryBatchTimeTarget(uint64 newVeryBatchTimeTarget) -func (_Polygonzkevm *PolygonzkevmFilterer) ParseSetVeryBatchTimeTarget(log types.Log) (*PolygonzkevmSetVeryBatchTimeTarget, error) { - event := new(PolygonzkevmSetVeryBatchTimeTarget) - if err := _Polygonzkevm.contract.UnpackLog(event, "SetVeryBatchTimeTarget", log); err != nil { +// Solidity: event UpdateZkEVMVersion(uint64 numBatch, uint64 forkID, string version) +func (_Polygonzkevm *PolygonzkevmFilterer) ParseUpdateZkEVMVersion(log types.Log) (*PolygonzkevmUpdateZkEVMVersion, error) { + event := new(PolygonzkevmUpdateZkEVMVersion) + if err := _Polygonzkevm.contract.UnpackLog(event, "UpdateZkEVMVersion", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PolygonzkevmTrustedVerifyBatchesIterator is returned from FilterTrustedVerifyBatches and is used to iterate over the raw logs and unpacked data for TrustedVerifyBatches events raised by the Polygonzkevm contract. -type PolygonzkevmTrustedVerifyBatchesIterator struct { - Event *PolygonzkevmTrustedVerifyBatches // Event containing the contract specifics and raw log +// PolygonzkevmVerifyBatchesIterator is returned from FilterVerifyBatches and is used to iterate over the raw logs and unpacked data for VerifyBatches events raised by the Polygonzkevm contract. +type PolygonzkevmVerifyBatchesIterator struct { + Event *PolygonzkevmVerifyBatches // 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 @@ -4598,7 +4608,7 @@ type PolygonzkevmTrustedVerifyBatchesIterator struct { // 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 *PolygonzkevmTrustedVerifyBatchesIterator) Next() bool { +func (it *PolygonzkevmVerifyBatchesIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -4607,7 +4617,7 @@ func (it *PolygonzkevmTrustedVerifyBatchesIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PolygonzkevmTrustedVerifyBatches) + it.Event = new(PolygonzkevmVerifyBatches) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -4622,7 +4632,7 @@ func (it *PolygonzkevmTrustedVerifyBatchesIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PolygonzkevmTrustedVerifyBatches) + it.Event = new(PolygonzkevmVerifyBatches) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -4638,29 +4648,29 @@ func (it *PolygonzkevmTrustedVerifyBatchesIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PolygonzkevmTrustedVerifyBatchesIterator) Error() error { +func (it *PolygonzkevmVerifyBatchesIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PolygonzkevmTrustedVerifyBatchesIterator) Close() error { +func (it *PolygonzkevmVerifyBatchesIterator) Close() error { it.sub.Unsubscribe() return nil } -// PolygonzkevmTrustedVerifyBatches represents a TrustedVerifyBatches event raised by the Polygonzkevm contract. -type PolygonzkevmTrustedVerifyBatches struct { +// PolygonzkevmVerifyBatches represents a VerifyBatches event raised by the Polygonzkevm contract. +type PolygonzkevmVerifyBatches struct { NumBatch uint64 StateRoot [32]byte Aggregator common.Address Raw types.Log // Blockchain specific contextual infos } -// FilterTrustedVerifyBatches is a free log retrieval operation binding the contract event 0x0c0ce073a7d7b5850c04ccc4b20ee7d3179d5f57d0ac44399565792c0f72fce7. +// FilterVerifyBatches is a free log retrieval operation binding the contract event 0x9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966. // -// Solidity: event TrustedVerifyBatches(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) -func (_Polygonzkevm *PolygonzkevmFilterer) FilterTrustedVerifyBatches(opts *bind.FilterOpts, numBatch []uint64, aggregator []common.Address) (*PolygonzkevmTrustedVerifyBatchesIterator, error) { +// Solidity: event VerifyBatches(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) +func (_Polygonzkevm *PolygonzkevmFilterer) FilterVerifyBatches(opts *bind.FilterOpts, numBatch []uint64, aggregator []common.Address) (*PolygonzkevmVerifyBatchesIterator, error) { var numBatchRule []interface{} for _, numBatchItem := range numBatch { @@ -4672,17 +4682,17 @@ func (_Polygonzkevm *PolygonzkevmFilterer) FilterTrustedVerifyBatches(opts *bind aggregatorRule = append(aggregatorRule, aggregatorItem) } - logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "TrustedVerifyBatches", numBatchRule, aggregatorRule) + logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "VerifyBatches", numBatchRule, aggregatorRule) if err != nil { return nil, err } - return &PolygonzkevmTrustedVerifyBatchesIterator{contract: _Polygonzkevm.contract, event: "TrustedVerifyBatches", logs: logs, sub: sub}, nil + return &PolygonzkevmVerifyBatchesIterator{contract: _Polygonzkevm.contract, event: "VerifyBatches", logs: logs, sub: sub}, nil } -// WatchTrustedVerifyBatches is a free log subscription operation binding the contract event 0x0c0ce073a7d7b5850c04ccc4b20ee7d3179d5f57d0ac44399565792c0f72fce7. +// WatchVerifyBatches is a free log subscription operation binding the contract event 0x9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966. // -// Solidity: event TrustedVerifyBatches(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) -func (_Polygonzkevm *PolygonzkevmFilterer) WatchTrustedVerifyBatches(opts *bind.WatchOpts, sink chan<- *PolygonzkevmTrustedVerifyBatches, numBatch []uint64, aggregator []common.Address) (event.Subscription, error) { +// Solidity: event VerifyBatches(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) +func (_Polygonzkevm *PolygonzkevmFilterer) WatchVerifyBatches(opts *bind.WatchOpts, sink chan<- *PolygonzkevmVerifyBatches, numBatch []uint64, aggregator []common.Address) (event.Subscription, error) { var numBatchRule []interface{} for _, numBatchItem := range numBatch { @@ -4694,7 +4704,7 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchTrustedVerifyBatches(opts *bind. aggregatorRule = append(aggregatorRule, aggregatorItem) } - logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "TrustedVerifyBatches", numBatchRule, aggregatorRule) + logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "VerifyBatches", numBatchRule, aggregatorRule) if err != nil { return nil, err } @@ -4704,8 +4714,8 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchTrustedVerifyBatches(opts *bind. select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PolygonzkevmTrustedVerifyBatches) - if err := _Polygonzkevm.contract.UnpackLog(event, "TrustedVerifyBatches", log); err != nil { + event := new(PolygonzkevmVerifyBatches) + if err := _Polygonzkevm.contract.UnpackLog(event, "VerifyBatches", log); err != nil { return err } event.Raw = log @@ -4726,21 +4736,21 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchTrustedVerifyBatches(opts *bind. }), nil } -// ParseTrustedVerifyBatches is a log parse operation binding the contract event 0x0c0ce073a7d7b5850c04ccc4b20ee7d3179d5f57d0ac44399565792c0f72fce7. +// ParseVerifyBatches is a log parse operation binding the contract event 0x9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966. // -// Solidity: event TrustedVerifyBatches(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) -func (_Polygonzkevm *PolygonzkevmFilterer) ParseTrustedVerifyBatches(log types.Log) (*PolygonzkevmTrustedVerifyBatches, error) { - event := new(PolygonzkevmTrustedVerifyBatches) - if err := _Polygonzkevm.contract.UnpackLog(event, "TrustedVerifyBatches", log); err != nil { +// Solidity: event VerifyBatches(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) +func (_Polygonzkevm *PolygonzkevmFilterer) ParseVerifyBatches(log types.Log) (*PolygonzkevmVerifyBatches, error) { + event := new(PolygonzkevmVerifyBatches) + if err := _Polygonzkevm.contract.UnpackLog(event, "VerifyBatches", log); err != nil { return nil, err } event.Raw = log return event, nil } -// PolygonzkevmVerifyBatchesIterator is returned from FilterVerifyBatches and is used to iterate over the raw logs and unpacked data for VerifyBatches events raised by the Polygonzkevm contract. -type PolygonzkevmVerifyBatchesIterator struct { - Event *PolygonzkevmVerifyBatches // Event containing the contract specifics and raw log +// PolygonzkevmVerifyBatchesTrustedAggregatorIterator is returned from FilterVerifyBatchesTrustedAggregator and is used to iterate over the raw logs and unpacked data for VerifyBatchesTrustedAggregator events raised by the Polygonzkevm contract. +type PolygonzkevmVerifyBatchesTrustedAggregatorIterator struct { + Event *PolygonzkevmVerifyBatchesTrustedAggregator // 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 @@ -4754,7 +4764,7 @@ type PolygonzkevmVerifyBatchesIterator struct { // 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 *PolygonzkevmVerifyBatchesIterator) Next() bool { +func (it *PolygonzkevmVerifyBatchesTrustedAggregatorIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -4763,7 +4773,7 @@ func (it *PolygonzkevmVerifyBatchesIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(PolygonzkevmVerifyBatches) + it.Event = new(PolygonzkevmVerifyBatchesTrustedAggregator) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -4778,7 +4788,7 @@ func (it *PolygonzkevmVerifyBatchesIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(PolygonzkevmVerifyBatches) + it.Event = new(PolygonzkevmVerifyBatchesTrustedAggregator) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -4794,29 +4804,29 @@ func (it *PolygonzkevmVerifyBatchesIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *PolygonzkevmVerifyBatchesIterator) Error() error { +func (it *PolygonzkevmVerifyBatchesTrustedAggregatorIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *PolygonzkevmVerifyBatchesIterator) Close() error { +func (it *PolygonzkevmVerifyBatchesTrustedAggregatorIterator) Close() error { it.sub.Unsubscribe() return nil } -// PolygonzkevmVerifyBatches represents a VerifyBatches event raised by the Polygonzkevm contract. -type PolygonzkevmVerifyBatches struct { +// PolygonzkevmVerifyBatchesTrustedAggregator represents a VerifyBatchesTrustedAggregator event raised by the Polygonzkevm contract. +type PolygonzkevmVerifyBatchesTrustedAggregator struct { NumBatch uint64 StateRoot [32]byte Aggregator common.Address Raw types.Log // Blockchain specific contextual infos } -// FilterVerifyBatches is a free log retrieval operation binding the contract event 0x9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966. +// FilterVerifyBatchesTrustedAggregator is a free log retrieval operation binding the contract event 0xcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe. // -// Solidity: event VerifyBatches(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) -func (_Polygonzkevm *PolygonzkevmFilterer) FilterVerifyBatches(opts *bind.FilterOpts, numBatch []uint64, aggregator []common.Address) (*PolygonzkevmVerifyBatchesIterator, error) { +// Solidity: event VerifyBatchesTrustedAggregator(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) +func (_Polygonzkevm *PolygonzkevmFilterer) FilterVerifyBatchesTrustedAggregator(opts *bind.FilterOpts, numBatch []uint64, aggregator []common.Address) (*PolygonzkevmVerifyBatchesTrustedAggregatorIterator, error) { var numBatchRule []interface{} for _, numBatchItem := range numBatch { @@ -4828,17 +4838,17 @@ func (_Polygonzkevm *PolygonzkevmFilterer) FilterVerifyBatches(opts *bind.Filter aggregatorRule = append(aggregatorRule, aggregatorItem) } - logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "VerifyBatches", numBatchRule, aggregatorRule) + logs, sub, err := _Polygonzkevm.contract.FilterLogs(opts, "VerifyBatchesTrustedAggregator", numBatchRule, aggregatorRule) if err != nil { return nil, err } - return &PolygonzkevmVerifyBatchesIterator{contract: _Polygonzkevm.contract, event: "VerifyBatches", logs: logs, sub: sub}, nil + return &PolygonzkevmVerifyBatchesTrustedAggregatorIterator{contract: _Polygonzkevm.contract, event: "VerifyBatchesTrustedAggregator", logs: logs, sub: sub}, nil } -// WatchVerifyBatches is a free log subscription operation binding the contract event 0x9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966. +// WatchVerifyBatchesTrustedAggregator is a free log subscription operation binding the contract event 0xcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe. // -// Solidity: event VerifyBatches(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) -func (_Polygonzkevm *PolygonzkevmFilterer) WatchVerifyBatches(opts *bind.WatchOpts, sink chan<- *PolygonzkevmVerifyBatches, numBatch []uint64, aggregator []common.Address) (event.Subscription, error) { +// Solidity: event VerifyBatchesTrustedAggregator(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) +func (_Polygonzkevm *PolygonzkevmFilterer) WatchVerifyBatchesTrustedAggregator(opts *bind.WatchOpts, sink chan<- *PolygonzkevmVerifyBatchesTrustedAggregator, numBatch []uint64, aggregator []common.Address) (event.Subscription, error) { var numBatchRule []interface{} for _, numBatchItem := range numBatch { @@ -4850,7 +4860,7 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchVerifyBatches(opts *bind.WatchOp aggregatorRule = append(aggregatorRule, aggregatorItem) } - logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "VerifyBatches", numBatchRule, aggregatorRule) + logs, sub, err := _Polygonzkevm.contract.WatchLogs(opts, "VerifyBatchesTrustedAggregator", numBatchRule, aggregatorRule) if err != nil { return nil, err } @@ -4860,8 +4870,8 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchVerifyBatches(opts *bind.WatchOp select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(PolygonzkevmVerifyBatches) - if err := _Polygonzkevm.contract.UnpackLog(event, "VerifyBatches", log); err != nil { + event := new(PolygonzkevmVerifyBatchesTrustedAggregator) + if err := _Polygonzkevm.contract.UnpackLog(event, "VerifyBatchesTrustedAggregator", log); err != nil { return err } event.Raw = log @@ -4882,12 +4892,12 @@ func (_Polygonzkevm *PolygonzkevmFilterer) WatchVerifyBatches(opts *bind.WatchOp }), nil } -// ParseVerifyBatches is a log parse operation binding the contract event 0x9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f5966. +// ParseVerifyBatchesTrustedAggregator is a log parse operation binding the contract event 0xcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe. // -// Solidity: event VerifyBatches(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) -func (_Polygonzkevm *PolygonzkevmFilterer) ParseVerifyBatches(log types.Log) (*PolygonzkevmVerifyBatches, error) { - event := new(PolygonzkevmVerifyBatches) - if err := _Polygonzkevm.contract.UnpackLog(event, "VerifyBatches", log); err != nil { +// Solidity: event VerifyBatchesTrustedAggregator(uint64 indexed numBatch, bytes32 stateRoot, address indexed aggregator) +func (_Polygonzkevm *PolygonzkevmFilterer) ParseVerifyBatchesTrustedAggregator(log types.Log) (*PolygonzkevmVerifyBatchesTrustedAggregator, error) { + event := new(PolygonzkevmVerifyBatchesTrustedAggregator) + if err := _Polygonzkevm.contract.UnpackLog(event, "VerifyBatchesTrustedAggregator", log); err != nil { return nil, err } event.Raw = log diff --git a/etherman/smartcontracts/polygonzkevmbridge/polygonzkevmbridge.go b/etherman/smartcontracts/polygonzkevmbridge/polygonzkevmbridge.go index e0120a4aa9..f5445005cc 100644 --- a/etherman/smartcontracts/polygonzkevmbridge/polygonzkevmbridge.go +++ b/etherman/smartcontracts/polygonzkevmbridge/polygonzkevmbridge.go @@ -30,8 +30,8 @@ var ( // PolygonzkevmbridgeMetaData contains all meta data concerning the Polygonzkevmbridge contract. var PolygonzkevmbridgeMetaData = &bind.MetaData{ - ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"leafType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"depositCount\",\"type\":\"uint32\"}],\"name\":\"BridgeEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"index\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ClaimEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"wrappedTokenAddress\",\"type\":\"address\"}],\"name\":\"NewWrappedToken\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"LEAF_TYPE_ASSET\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LEAF_TYPE_MESSAGE\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAINNET_NETWORK_ID\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activateEmergencyState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"permitData\",\"type\":\"bytes\"}],\"name\":\"bridgeAsset\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"bridgeMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"smtProof\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint32\",\"name\":\"index\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"mainnetExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"rollupExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"claimAsset\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"smtProof\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint32\",\"name\":\"index\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"mainnetExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"rollupExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"claimMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"claimedBitMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deactivateEmergencyState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDepositRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"leafType\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"name\":\"getLeafValue\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"}],\"name\":\"getTokenWrappedAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalExitRootManager\",\"outputs\":[{\"internalType\":\"contractIPolygonZkEVMGlobalExitRoot\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_networkID\",\"type\":\"uint32\"},{\"internalType\":\"contractIPolygonZkEVMGlobalExitRoot\",\"name\":\"_globalExitRootManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_polygonZkEVMaddress\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"isClaimed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isEmergencyState\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"networkID\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"polygonZkEVMaddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"name\":\"precalculatedWrapperAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"tokenInfoToWrappedToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"leafHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"smtProof\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint64\",\"name\":\"index\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"verifyMerkleProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"wrappedTokenToTokenInfo\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b50614f9c806100206000396000f3fe608060405260043610620001ab5760003560e01c80637b6323c111620000e7578063d02103ca1162000089578063ed6be5c91162000060578063ed6be5c91462000512578063ee25560b1462000529578063ff634ed7146200055a57600080fd5b8063d02103ca14620004c1578063d96a15f714620004e3578063dbc1697614620004fa57600080fd5b8063a08e8a0811620000be578063a08e8a081462000438578063aaa13cc21462000462578063bab161bf146200048757600080fd5b80637b6323c114620003b457806381b1c17414620003d95780639e34070f146200041357600080fd5b806334ac9cf211620001515780633e19704311620001285780633e197043146200034557806346385549146200036a578063647c576c146200038f57600080fd5b806334ac9cf214620002e65780633ae0504714620003085780633da81682146200032057600080fd5b806322e95f2c116200018657806322e95f2c14620002125780632dfdf0b51462000250578063318aee3d146200027757600080fd5b80630871e97114620001b057806315064c9614620001c95780632072f6c514620001fa575b600080fd5b620001c7620001c136600462002b6e565b62000571565b005b348015620001d657600080fd5b50602254620001e59060ff1681565b60405190151581526020015b60405180910390f35b3480156200020757600080fd5b50620001c762000a9e565b3480156200021f57600080fd5b50620002376200023136600462002bfb565b62000b2c565b6040516001600160a01b039091168152602001620001f1565b3480156200025d57600080fd5b506200026860215481565b604051908152602001620001f1565b3480156200028457600080fd5b50620002c16200029636600462002c37565b60256020526000908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001f1565b348015620002f357600080fd5b5060275462000237906001600160a01b031681565b3480156200031557600080fd5b506200026862000ba8565b3480156200032d57600080fd5b50620001e56200033f36600462002d1f565b62000c9b565b3480156200035257600080fd5b50620002686200036436600462002d9d565b62000d9b565b3480156200037757600080fd5b50620001c76200038936600462002eae565b62000e45565b3480156200039c57600080fd5b50620001c7620003ae36600462002f95565b6200108e565b348015620003c157600080fd5b50620001c7620003d336600462002eae565b62001214565b348015620003e657600080fd5b5062000237620003f836600462002fe5565b6024602052600090815260409020546001600160a01b031681565b3480156200042057600080fd5b50620001e56200043236600462002fe5565b62001741565b3480156200044557600080fd5b506200044f600081565b60405160ff9091168152602001620001f1565b3480156200046f57600080fd5b50620002376200048136600462002fff565b62001786565b3480156200049457600080fd5b50602254620004ab90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001f1565b348015620004ce57600080fd5b5060265462000237906001600160a01b031681565b620001c7620004f4366004620030b3565b620018da565b3480156200050757600080fd5b50620001c762001ae6565b3480156200051f57600080fd5b50620004ab600081565b3480156200053657600080fd5b50620002686200054836600462002fe5565b60236020526000908152604090205481565b3480156200056757600080fd5b506200044f600181565b60225460ff1615620005fb5760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a4015b60405180910390fd5b60225463ffffffff610100909104811690861603620006835760405162461bcd60e51b815260206004820152603d60248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2044657374696e6174696f6e2063616e6e6f7420626520697473656c660000006064820152608401620005f2565b60008060606001600160a01b0389166200073f57853414620007355760405162461bcd60e51b8152602060048201526044602482018190527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a908201527f20416d6f756e7420646f6573206e6f74206d61746368206d6573736167652e7660648201527f616c756500000000000000000000000000000000000000000000000000000000608482015260a401620005f2565b60009150620009b8565b6001600160a01b03808a1660009081526025602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901562000815576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018890526001600160a01b038b1690639dc29fac90604401600060405180830381600087803b158015620007e857600080fd5b505af1158015620007fd573d6000803e3d6000fd5b505050508060200151935080600001519250620009b6565b84156200082a576200082a8a88888862001b72565b620008416001600160a01b038b1633308a62002132565b899350602260019054906101000a900463ffffffff169250896001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000898573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620008c291908101906200319e565b8a6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000901573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200092b91908101906200319e565b8b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200096a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009909190620031d7565b604051602001620009a49392919062003225565b60405160208183030381529060405291505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600083858b8b8b87602154604051620009fa98979695949392919062003262565b60405180910390a162000a2562000a1f600084868c8c8c888051906020012062000d9b565b620021b8565b6026546001600160a01b03166333d6247d62000a4062000ba8565b6040518263ffffffff1660e01b815260040162000a5f91815260200190565b600060405180830381600087803b15801562000a7a57600080fd5b505af115801562000a8f573d6000803e3d6000fd5b50505050505050505050505050565b6027546001600160a01b0316331462000b205760405162461bcd60e51b815260206004820152603a60248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c79506f6c79676f6e5a6b45564d3a2060448201527f6f6e6c7920506f6c79676f6e5a6b45564d20636f6e74726163740000000000006064820152608401620005f2565b62000b2a6200231c565b565b600060246000848460405160200162000b7092919060e09290921b6001600160e01b031916825260601b6bffffffffffffffffffffffff1916600482015260180190565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b602154600090819081805b602081101562000c92578260011660010362000c13576001816020811062000bdf5762000bdf620032ce565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000c40565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b62000c4d60028462003310565b6040805160208101859052908101849052909350606001604051602081830303815290604052805190602001209150808062000c899062003327565b91505062000bb3565b50919392505050565b60008467ffffffffffffffff8416825b602081101562000d8e578160011660010362000d185786818151811062000cd65762000cd6620032ce565b60200260200101518360405160200162000cfa929190918252602082015260400190565b60405160208183030381529060405280519060200120925062000d6a565b8287828151811062000d2e5762000d2e620032ce565b602002602001015160405160200162000d51929190918252602082015260400190565b6040516020818303038152906040528051906020012092505b62000d7760028362003310565b91508062000d858162003327565b91505062000cab565b5050909114949350505050565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b60225460ff161562000ecb5760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401620005f2565b62000ee18a8a8a8a8a8a8a8a8a8a6001620023da565b62000ef28963ffffffff16620026fa565b6000836001600160a01b03168387898560405160240162000f169392919062003343565b60408051601f198184030181529181526020820180516001600160e01b03167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162000f6691906200337c565b60006040518083038185875af1925050503d806000811462000fa5576040519150601f19603f3d011682016040523d82523d6000602084013e62000faa565b606091505b5050905080620010235760405162461bcd60e51b815260206004820152603060248201527f506f6c79676f6e5a6b45564d4272696467653a3a636c61696d4d65737361676560448201527f3a204d657373616765206661696c6564000000000000000000000000000000006064820152608401620005f2565b6040805163ffffffff8c81168252891660208201526001600160a01b0388811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b600054610100900460ff1615808015620010af5750600054600160ff909116105b80620010cb5750303b158015620010cb575060005460ff166001145b6200113f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401620005f2565b6000805460ff19166001179055801562001163576000805461ff0019166101001790555b6022805463ffffffff86166101000264ffffffff0019909116179055602680546001600160a01b038086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255602780549285169290911691909117905580156200120e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60225460ff16156200129a5760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401620005f2565b620012b08a8a8a8a8a8a8a8a8a8a6000620023da565b620012c18963ffffffff16620026fa565b6001600160a01b038516620013c057604080516000808252602082019092526001600160a01b038516908490604051620012fc91906200337c565b60006040518083038185875af1925050503d80600081146200133b576040519150601f19603f3d011682016040523d82523d6000602084013e62001340565b606091505b5050905080620013b95760405162461bcd60e51b815260206004820152603560248201527f506f6c79676f6e5a6b45564d4272696467653a3a636c61696d41737365743a2060448201527f4574686572207472616e73666572206661696c656400000000000000000000006064820152608401620005f2565b50620016d7565b60225463ffffffff610100909104811690871603620013f557620013ef6001600160a01b03861684846200273c565b620016d7565b6040516001600160e01b031960e088901b1660208201526bffffffffffffffffffffffff19606087901b16602482015260009060380160408051601f198184030181529181528151602092830120600081815260249093529120549091506001600160a01b0316806200166f576000806000858060200190518101906200147d91906200339a565b925092509250600085848484604051620014979062002ad4565b620014a59392919062003225565b8190604051809103906000f5905080158015620014c6573d6000803e3d6000fd5b506040516340c10f1960e01b81526001600160a01b038b81166004830152602482018b9052919250908216906340c10f1990604401600060405180830381600087803b1580156200151657600080fd5b505af11580156200152b573d6000803e3d6000fd5b50505050806024600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808d63ffffffff1681526020018c6001600160a01b031681525060256000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507fccd7715648d1f2bb13e158f96b5b6c3aeda555d4cb87112e274a6f28bc571d598c8c836040516200165d9392919063ffffffff9390931683526001600160a01b03918216602084015216604082015260600190565b60405180910390a150505050620016d4565b6040516340c10f1960e01b81526001600160a01b038681166004830152602482018690528216906340c10f1990604401600060405180830381600087803b158015620016ba57600080fd5b505af1158015620016cf573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8b81168252881660208201526001600160a01b0387811682840152851660608201526080810184905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a150505050505050505050565b600080620017526101008462003310565b90506000620017646101008562003410565b60009283526023602052604090922054600190921b9182169091149392505050565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620017f19062002ad4565b601f1982820381018352601f9091011660408190526200181e908d908d908d908d908d9060200162003450565b60408051601f19818403018152908290526200183e929160200162003491565b60405160208183030381529060405280519060200120604051602001620018b494939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60225460ff1615620019605760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401620005f2565b60225463ffffffff610100909104811690841603620019e85760405162461bcd60e51b815260206004820152603f60248201527f506f6c79676f6e5a6b45564d4272696467653a3a6272696467654d657373616760448201527f653a2044657374696e6174696f6e2063616e6e6f7420626520697473656c66006064820152608401620005f2565b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001602260019054906101000a900463ffffffff16338686348760215460405162001a3c98979695949392919062003262565b60405180910390a162001a7362000a1f6001602260019054906101000a900463ffffffff1633878734888051906020012062000d9b565b6026546001600160a01b03166333d6247d62001a8e62000ba8565b6040518263ffffffff1660e01b815260040162001aad91815260200190565b600060405180830381600087803b15801562001ac857600080fd5b505af115801562001add573d6000803e3d6000fd5b50505050505050565b6027546001600160a01b0316331462001b685760405162461bcd60e51b815260206004820152603a60248201527f506f6c79676f6e5a6b45564d3a3a6f6e6c79506f6c79676f6e5a6b45564d3a2060448201527f6f6e6c7920506f6c79676f6e5a6b45564d20636f6e74726163740000000000006064820152608401620005f2565b62000b2a62002787565b600062001bb583838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506200283692505050565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b031982160162001e8a57600080808080808062001c00896004818d620034c4565b81019062001c0f9190620034f0565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161462001ca65760405162461bcd60e51b815260206004820152603c60248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2050657260448201527f6d6974206f776e6572206d757374206265207468652073656e646572000000006064820152608401620005f2565b6001600160a01b038616301462001d265760405162461bcd60e51b815260206004820152603360248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2053706560448201527f6e646572206d75737420626520277468697327000000000000000000000000006064820152608401620005f2565b8a851462001d9d5760405162461bcd60e51b815260206004820152603960248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2050657260448201527f6d697420616d6f756e7420646f6573206e6f74206d61746368000000000000006064820152608401620005f2565b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162001e3691906200337c565b6000604051808303816000865af19150503d806000811462001e75576040519150601f19603f3d011682016040523d82523d6000602084013e62001e7a565b606091505b505050505050505050506200212b565b6001600160e01b031981166323f2ebc360e21b1462001f125760405162461bcd60e51b815260206004820152602b60248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a204e6f7460448201527f2076616c69642063616c6c0000000000000000000000000000000000000000006064820152608401620005f2565b60008080808080808062001f2a8a6004818e620034c4565b81019062001f3991906200355a565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001fd25760405162461bcd60e51b815260206004820152603c60248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2050657260448201527f6d6974206f776e6572206d757374206265207468652073656e646572000000006064820152608401620005f2565b6001600160a01b0387163014620020525760405162461bcd60e51b815260206004820152603360248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2053706560448201527f6e646572206d75737420626520277468697327000000000000000000000000006064820152608401620005f2565b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691620020db91906200337c565b6000604051808303816000865af19150503d80600081146200211a576040519150601f19603f3d011682016040523d82523d6000602084013e6200211f565b606091505b50505050505050505050505b5050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526200120e9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526200283d565b806001620021c960206002620036e3565b620021d59190620036f1565b602154106200224d5760405162461bcd60e51b815260206004820152602a60248201527f4465706f736974436f6e74726163743a5f6465706f7369743a204d65726b6c6560448201527f20747265652066756c6c000000000000000000000000000000000000000000006064820152608401620005f2565b6001602160008282546200226291906200370b565b909155505060215460005b60208110156200230c5781600116600103620022a25782600182602081106200229a576200229a620032ce565b015550505050565b60018160208110620022b857620022b8620032ce565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250600282620022f5919062003310565b915080620023038162003327565b9150506200226d565b506200231762003726565b505050565b60225460ff1615620023a25760405162461bcd60e51b815260206004820152604260248201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960448201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606482015261746560f01b608482015260a401620005f2565b6022805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b620023eb8a63ffffffff1662001741565b15620024605760405162461bcd60e51b815260206004820152603060248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7665726966794c6561663a60448201527f20416c726561647920636c61696d6564000000000000000000000000000000006064820152608401620005f2565b6026546040805160208082018d90528183018c9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091526000916001600160a01b03169063257b3632906084016020604051808303816000875af1158015620024ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200251391906200373c565b9050806000036200258d5760405162461bcd60e51b815260206004820152603760248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7665726966794c6561663a60448201527f20476c6f62616c45786974526f6f7420696e76616c69640000000000000000006064820152608401620005f2565b60225463ffffffff87811661010090920416146200263a5760405162461bcd60e51b815260206004820152604360248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7665726966794c6561663a60448201527f2044657374696e6174696f6e206e6574776f726b20646f6573206e6f74206d6160648201527f7463680000000000000000000000000000000000000000000000000000000000608482015260a401620005f2565b602254600090610100900463ffffffff16620026585750886200265b565b50895b6200268662002677848b8b8b8b8b8b8051906020012062000d9b565b8e8e63ffffffff168462000c9b565b62000a8f5760405162461bcd60e51b815260206004820152603260248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7665726966794c6561663a60448201527f20496e76616c696420736d742070726f6f6600000000000000000000000000006064820152608401620005f2565b60006200270a6101008362003310565b905060006200271c6101008462003410565b6000928352602360205260409092208054600190931b9092179091555050565b6040516001600160a01b038316602482015260448101829052620023179084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640162002180565b60225460ff16620028015760405162461bcd60e51b815260206004820152603b60248201527f456d657267656e63794d616e616765723a3a6966456d657267656e637953746160448201527f74653a206f6e6c7920696620656d657267656e637920737461746500000000006064820152608401620005f2565b6022805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6020015190565b600062002894826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620029299092919063ffffffff16565b805190915015620023175780806020019051810190620028b5919062003756565b620023175760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620005f2565b60606200293a848460008562002944565b90505b9392505050565b606082471015620029be5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401620005f2565b6001600160a01b0385163b62002a175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620005f2565b600080866001600160a01b0316858760405162002a3591906200337c565b60006040518083038185875af1925050503d806000811462002a74576040519150601f19603f3d011682016040523d82523d6000602084013e62002a79565b606091505b509150915062002a8b82828662002a96565b979650505050505050565b6060831562002aa75750816200293d565b82511562002ab85782518084602001fd5b8160405162461bcd60e51b8152600401620005f2919062003776565b6117db806200378c83390190565b6001600160a01b038116811462002af857600080fd5b50565b803562002b088162002ae2565b919050565b803563ffffffff8116811462002b0857600080fd5b60008083601f84011262002b3557600080fd5b50813567ffffffffffffffff81111562002b4e57600080fd5b60208301915083602082850101111562002b6757600080fd5b9250929050565b60008060008060008060a0878903121562002b8857600080fd5b863562002b958162002ae2565b955062002ba56020880162002b0d565b9450604087013562002bb78162002ae2565b935060608701359250608087013567ffffffffffffffff81111562002bdb57600080fd5b62002be989828a0162002b22565b979a9699509497509295939492505050565b6000806040838503121562002c0f57600080fd5b62002c1a8362002b0d565b9150602083013562002c2c8162002ae2565b809150509250929050565b60006020828403121562002c4a57600080fd5b81356200293d8162002ae2565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171562002c995762002c9962002c57565b604052919050565b600082601f83011262002cb357600080fd5b8135602067ffffffffffffffff82111562002cd25762002cd262002c57565b8160051b62002ce382820162002c6d565b928352848101820192828101908785111562002cfe57600080fd5b83870192505b8483101562002a8b5782358252918301919083019062002d04565b6000806000806080858703121562002d3657600080fd5b84359350602085013567ffffffffffffffff8082111562002d5657600080fd5b62002d648883890162002ca1565b945060408701359150808216821462002d7c57600080fd5b509396929550929360600135925050565b60ff8116811462002af857600080fd5b600080600080600080600060e0888a03121562002db957600080fd5b873562002dc68162002d8d565b965062002dd66020890162002b0d565b9550604088013562002de88162002ae2565b945062002df86060890162002b0d565b9350608088013562002e0a8162002ae2565b9699959850939692959460a0840135945060c09093013592915050565b600067ffffffffffffffff82111562002e445762002e4462002c57565b50601f01601f191660200190565b600082601f83011262002e6457600080fd5b813562002e7b62002e758262002e27565b62002c6d565b81815284602083860101111562002e9157600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806000806000806000806101408b8d03121562002ecf57600080fd5b8a3567ffffffffffffffff8082111562002ee857600080fd5b62002ef68e838f0162002ca1565b9b5062002f0660208e0162002b0d565b9a5060408d0135995060608d0135985062002f2460808e0162002b0d565b975062002f3460a08e0162002afb565b965062002f4460c08e0162002b0d565b955062002f5460e08e0162002afb565b94506101008d013593506101208d013591508082111562002f7457600080fd5b5062002f838d828e0162002e52565b9150509295989b9194979a5092959850565b60008060006060848603121562002fab57600080fd5b62002fb68462002b0d565b9250602084013562002fc88162002ae2565b9150604084013562002fda8162002ae2565b809150509250925092565b60006020828403121562002ff857600080fd5b5035919050565b600080600080600080600060a0888a0312156200301b57600080fd5b620030268862002b0d565b96506020880135620030388162002ae2565b9550604088013567ffffffffffffffff808211156200305657600080fd5b620030648b838c0162002b22565b909750955060608a01359150808211156200307e57600080fd5b506200308d8a828b0162002b22565b9094509250506080880135620030a38162002d8d565b8091505092959891949750929550565b600080600060608486031215620030c957600080fd5b620030d48462002b0d565b92506020840135620030e68162002ae2565b9150604084013567ffffffffffffffff8111156200310357600080fd5b620031118682870162002e52565b9150509250925092565b60005b83811015620031385781810151838201526020016200311e565b838111156200120e5750506000910152565b600082601f8301126200315c57600080fd5b81516200316d62002e758262002e27565b8181528460208386010111156200318357600080fd5b620031968260208301602087016200311b565b949350505050565b600060208284031215620031b157600080fd5b815167ffffffffffffffff811115620031c957600080fd5b62003196848285016200314a565b600060208284031215620031ea57600080fd5b81516200293d8162002d8d565b60008151808452620032118160208601602086016200311b565b601f01601f19169290920160200192915050565b6060815260006200323a6060830186620031f7565b82810360208401526200324e8186620031f7565b91505060ff83166040830152949350505050565b600061010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620032b582850187620031f7565b925080851660e085015250509998505050505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082620033225762003322620032e4565b500490565b6000600182016200333c576200333c620032fa565b5060010190565b6001600160a01b038416815263ffffffff83166020820152606060408201526000620033736060830184620031f7565b95945050505050565b60008251620033908184602087016200311b565b9190910192915050565b600080600060608486031215620033b057600080fd5b835167ffffffffffffffff80821115620033c957600080fd5b620033d7878388016200314a565b94506020860151915080821115620033ee57600080fd5b50620033fd868287016200314a565b925050604084015162002fda8162002d8d565b600082620034225762003422620032e4565b500690565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006200346660608301878962003427565b82810360208401526200347b81868862003427565b91505060ff831660408301529695505050505050565b60008351620034a58184602088016200311b565b835190830190620034bb8183602088016200311b565b01949350505050565b60008085851115620034d557600080fd5b83861115620034e357600080fd5b5050820193919092039150565b600080600080600080600060e0888a0312156200350c57600080fd5b8735620035198162002ae2565b965060208801356200352b8162002ae2565b95506040880135945060608801359350608088013562002e0a8162002d8d565b801515811462002af857600080fd5b600080600080600080600080610100898b0312156200357857600080fd5b8835620035858162002ae2565b97506020890135620035978162002ae2565b965060408901359550606089013594506080890135620035b7816200354b565b935060a0890135620035c98162002d8d565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115620036275781600019048211156200360b576200360b620032fa565b808516156200361957918102915b93841c9390800290620035eb565b509250929050565b600082620036405750600162000ba2565b816200364f5750600062000ba2565b8160018114620036685760028114620036735762003693565b600191505062000ba2565b60ff841115620036875762003687620032fa565b50506001821b62000ba2565b5060208310610133831016604e8410600b8410161715620036b8575081810a62000ba2565b620036c48383620035e6565b8060001904821115620036db57620036db620032fa565b029392505050565b60006200293d83836200362f565b600082821015620037065762003706620032fa565b500390565b60008219821115620037215762003721620032fa565b500190565b634e487b7160e01b600052600160045260246000fd5b6000602082840312156200374f57600080fd5b5051919050565b6000602082840312156200376957600080fd5b81516200293d816200354b565b6020815260006200293d6020830184620031f756fe60c06040523480156200001157600080fd5b50604051620017db380380620017db8339810160408190526200003491620002ad565b82826003620000448382620003c1565b506004620000538282620003c1565b5050600580546001600160a81b0319163360ff60a01b191617600160a01b60ff851602179055504660808190526200008b9062000098565b60a052506200048d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000c562000146565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b606060038054620001579062000332565b80601f0160208091040260200160405190810160405280929190818152602001828054620001859062000332565b8015620001d65780601f10620001aa57610100808354040283529160200191620001d6565b820191906000526020600020905b815481529060010190602001808311620001b857829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200020857600080fd5b81516001600160401b0380821115620002255762000225620001e0565b604051601f8301601f19908116603f01168101908282118183101715620002505762000250620001e0565b816040528381526020925086838588010111156200026d57600080fd5b600091505b8382101562000291578582018301518183018401529082019062000272565b83821115620002a35760008385830101525b9695505050505050565b600080600060608486031215620002c357600080fd5b83516001600160401b0380821115620002db57600080fd5b620002e987838801620001f6565b945060208601519150808211156200030057600080fd5b506200030f86828701620001f6565b925050604084015160ff811681146200032757600080fd5b809150509250925092565b600181811c908216806200034757607f821691505b6020821081036200036857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003bc57600081815260208120601f850160051c81016020861015620003975750805b601f850160051c820191505b81811015620003b857828155600101620003a3565b5050505b505050565b81516001600160401b03811115620003dd57620003dd620001e0565b620003f581620003ee845462000332565b846200036e565b602080601f8311600181146200042d5760008415620004145750858301515b600019600386901b1c1916600185901b178555620003b8565b600085815260208120601f198616915b828110156200045e578886015182559484019460019091019084016200043d565b50858210156200047d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611321620004ba60003960006104e001526000818161034a01526104aa01526113216000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461036c578063dd62ed3e1461037f578063ffa1ad74146103b857600080fd5b8063a457c2d71461031f578063a9059cbb14610332578063cd0d00961461034557600080fd5b806395d89b41116100bd57806395d89b41146102d95780639dc29fac146102e1578063a3c573eb146102f457600080fd5b806370a08231146102905780637ecebe00146102b957600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610260578063395093511461026857806340c10f191461027b57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b6101846103d8565b60405161019191906110b4565b60405180910390f35b6101ad6101a8366004611125565b61046a565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad61020436600461114f565b610482565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60055474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610191565b6101c16104a6565b6101ad610276366004611125565b610502565b61028e610289366004611125565b610541565b005b6101c161029e36600461118b565b6001600160a01b031660009081526020819052604090205490565b6101c16102c736600461118b565b60066020526000908152604090205481565b6101846105d4565b61028e6102ef366004611125565b6105e3565b600554610307906001600160a01b031681565b6040516001600160a01b039091168152602001610191565b6101ad61032d366004611125565b61066d565b6101ad610340366004611125565b610717565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028e61037a3660046111ad565b610725565b6101c161038d366004611220565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610184604051806040016040528060018152602001603160f81b81525081565b6060600380546103e790611253565b80601f016020809104026020016040519081016040528092919081815260200182805461041390611253565b80156104605780601f1061043557610100808354040283529160200191610460565b820191906000526020600020905b81548152906001019060200180831161044357829003601f168201915b5050505050905090565b6000336104788185856109aa565b5060019392505050565b600033610490858285610b03565b61049b858585610b95565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104dd576104d846610dac565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610478908290869061053c9087906112a3565b6109aa565b6005546001600160a01b031633146105c65760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6105d08282610e58565b5050565b6060600480546103e790611253565b6005546001600160a01b031633146106635760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084016105bd565b6105d08282610f37565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091908381101561070a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016105bd565b61049b82868684036109aa565b600033610478818585610b95565b8342111561079a5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d69740000000000000000000000000000000000000000000000000000000060648201526084016105bd565b6001600160a01b038716600090815260066020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866107e7836112bb565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006108456104a6565b6040517f1901000000000000000000000000000000000000000000000000000000000000602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156108eb573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906109215750896001600160a01b0316816001600160a01b0316145b6109935760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e61747572650000000000000000000000000000000000000000000000000060648201526084016105bd565b61099e8a8a8a6109aa565b50505050505050505050565b6001600160a01b038316610a255760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105bd565b6001600160a01b038216610aa15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105bd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610b8f5781811015610b825760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105bd565b610b8f84848484036109aa565b50505050565b6001600160a01b038316610c115760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105bd565b6001600160a01b038216610c8d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105bd565b6001600160a01b03831660009081526020819052604090205481811015610d1c5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016105bd565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290610d539084906112a3565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610d9f91815260200190565b60405180910390a3610b8f565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610dd76103d8565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610eae5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105bd565b8060026000828254610ec091906112a3565b90915550506001600160a01b03821660009081526020819052604081208054839290610eed9084906112a3565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038216610fb35760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105bd565b6001600160a01b038216600090815260208190526040902054818110156110425760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016105bd565b6001600160a01b03831660009081526020819052604081208383039055600280548492906110719084906112d4565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610af6565b600060208083528351808285015260005b818110156110e1578581018301518582016040015282016110c5565b818111156110f3576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461112057600080fd5b919050565b6000806040838503121561113857600080fd5b61114183611109565b946020939093013593505050565b60008060006060848603121561116457600080fd5b61116d84611109565b925061117b60208501611109565b9150604084013590509250925092565b60006020828403121561119d57600080fd5b6111a682611109565b9392505050565b600080600080600080600060e0888a0312156111c857600080fd5b6111d188611109565b96506111df60208901611109565b95506040880135945060608801359350608088013560ff8116811461120357600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561123357600080fd5b61123c83611109565b915061124a60208401611109565b90509250929050565b600181811c9082168061126757607f821691505b60208210810361128757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156112b6576112b661128d565b500190565b6000600182016112cd576112cd61128d565b5060010190565b6000828210156112e6576112e661128d565b50039056fea26469706673582212205d074ee584238a5fb66873e3fc67d479c99eb1688b3ca2f77c22e4f97ce77b0064736f6c634300080f0033a264697066735822122060e4844ad9ce717086f4bd60b8f5fde908812219549ad06e1605773fdd681c4d64736f6c634300080f0033", + ABI: "[{\"inputs\":[],\"name\":\"AlreadyClaimed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AmountDoesNotMatchMsgValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DestinationNetworkInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EtherTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GlobalExitRootInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSmtProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MerkleTreeFull\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MsgValueNotZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotValidAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotValidOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotValidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotValidSpender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyEmergencyState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyNotEmergencyState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyPolygonZkEVM\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"leafType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"depositCount\",\"type\":\"uint32\"}],\"name\":\"BridgeEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"index\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ClaimEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EmergencyStateDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"wrappedTokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"NewWrappedToken\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"activateEmergencyState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"permitData\",\"type\":\"bytes\"}],\"name\":\"bridgeAsset\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"bridgeMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[32]\",\"name\":\"smtProof\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint32\",\"name\":\"index\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"mainnetExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"rollupExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"claimAsset\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[32]\",\"name\":\"smtProof\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint32\",\"name\":\"index\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"mainnetExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"rollupExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"claimMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"claimedBitMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deactivateEmergencyState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDepositRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"leafType\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"name\":\"getLeafValue\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"}],\"name\":\"getTokenWrappedAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalExitRootManager\",\"outputs\":[{\"internalType\":\"contractIBasePolygonZkEVMGlobalExitRoot\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_networkID\",\"type\":\"uint32\"},{\"internalType\":\"contractIBasePolygonZkEVMGlobalExitRoot\",\"name\":\"_globalExitRootManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_polygonZkEVMaddress\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"isClaimed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isEmergencyState\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"networkID\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"polygonZkEVMaddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"name\":\"precalculatedWrapperAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"tokenInfoToWrappedToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"leafHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProof\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint32\",\"name\":\"index\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"verifyMerkleProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"wrappedTokenToTokenInfo\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x608060405234801561001057600080fd5b50614d7f806100206000396000f3fe608060405260043610620001875760003560e01c80633e19704311620000db578063bab161bf1162000089578063dbc169761162000060578063dbc1697614620004b0578063ee25560b14620004c8578063fb57083414620004f957600080fd5b8063bab161bf1462000434578063d02103ca146200046e578063d96a15f7146200049957600080fd5b806381b1c17411620000be57806381b1c17414620003905780639e34070f14620003ca578063aaa13cc2146200040f57600080fd5b80633e1970431462000346578063647c576c146200036b57600080fd5b80632d2c9d941162000139578063318aee3d116200011c578063318aee3d146200029d57806334ac9cf2146200030c5780633ae05047146200032e57600080fd5b80632d2c9d9414620002515780632dfdf0b5146200027657600080fd5b80632072f6c5116200016e5780632072f6c514620001d657806322e95f2c14620001ee5780632cffd02e146200022c57600080fd5b80630871e971146200018c57806315064c9614620001a5575b600080fd5b620001a36200019d36600462002923565b6200051e565b005b348015620001b257600080fd5b50606854620001c19060ff1681565b60405190151581526020015b60405180910390f35b348015620001e357600080fd5b50620001a36200096c565b348015620001fb57600080fd5b50620002136200020d366004620029b0565b620009a4565b6040516001600160a01b039091168152602001620001cd565b3480156200023957600080fd5b50620001a36200024b366004620029ff565b62000a0f565b3480156200025e57600080fd5b50620001a362000270366004620029ff565b62000e69565b3480156200028357600080fd5b506200028e60535481565b604051908152602001620001cd565b348015620002aa57600080fd5b50620002e7620002bc36600462002ae5565b606b6020526000908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001cd565b3480156200031957600080fd5b50606c5462000213906001600160a01b031681565b3480156200033b57600080fd5b506200028e62001007565b3480156200035357600080fd5b506200028e6200036536600462002b15565b620010ed565b3480156200037857600080fd5b50620001a36200038a36600462002b9f565b62001197565b3480156200039d57600080fd5b5062000213620003af36600462002bef565b606a602052600090815260409020546001600160a01b031681565b348015620003d757600080fd5b50620001c1620003e936600462002bef565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b3480156200041c57600080fd5b50620002136200042e36600462002c09565b62001367565b3480156200044157600080fd5b506068546200045890610100900463ffffffff1681565b60405163ffffffff9091168152602001620001cd565b3480156200047b57600080fd5b5060685462000213906501000000000090046001600160a01b031681565b620001a3620004aa36600462002cbd565b620014bb565b348015620004bd57600080fd5b50620001a362001641565b348015620004d557600080fd5b506200028e620004e736600462002bef565b60696020526000908152604090205481565b3480156200050657600080fd5b50620001c16200051836600462002d28565b62001677565b60685460ff16156200054357604051630bc011ff60e21b815260040160405180910390fd5b6200054d6200175e565b60685463ffffffff868116610100909204161480620005735750600263ffffffff861610155b1562000592576040516302caf51760e11b815260040160405180910390fd5b6000806060856001600160a01b038a16620005eb57863414620005e1576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000925062000872565b341562000624576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03808b166000908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620006fa576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018990526001600160a01b038c1690639dc29fac90604401600060405180830381600087803b158015620006cd57600080fd5b505af1158015620006e2573d6000803e3d6000fd5b50505050806020015194508060000151935062000870565b85156200070f576200070f8b898989620017b9565b6040516370a0823160e01b81523060048201526000906001600160a01b038d16906370a0823190602401602060405180830381865afa15801562000757573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200077d919062002d75565b9050620007966001600160a01b038d1633308c62001b80565b6040516370a0823160e01b81523060048201526000906001600160a01b038e16906370a0823190602401602060405180830381865afa158015620007de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000804919062002d75565b905062000812828262002da5565b6068548e9850610100900463ffffffff1696509350620008328762001c06565b6200083d8e62001d04565b620008488f62001def565b6040516020016200085c9392919062002e0f565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868c8c8688605354604051620008b498979695949392919062002e4c565b60405180910390a1620008df620008d9600085878d8d878980519060200120620010ed565b62001ec9565b6068546501000000000090046001600160a01b03166333d6247d6200090362001007565b6040518263ffffffff1660e01b81526004016200092291815260200190565b600060405180830381600087803b1580156200093d57600080fd5b505af115801562000952573d6000803e3d6000fd5b50505050505050506200096460018055565b505050505050565b606c546001600160a01b03163314620009985760405163e2e8106b60e01b815260040160405180910390fd5b620009a262001fe6565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091206000908152606a90915220546001600160a01b03165b92915050565b60685460ff161562000a3457604051630bc011ff60e21b815260040160405180910390fd5b62000a4b8b8b8b8b8b8b8b8b8b8b8b600062002043565b6001600160a01b03861662000b0d57604080516000808252602082019092526001600160a01b03861690859060405162000a86919062002ece565b60006040518083038185875af1925050503d806000811462000ac5576040519150601f19603f3d011682016040523d82523d6000602084013e62000aca565b606091505b505090508062000b06576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000dfe565b60685463ffffffff61010090910481169088160362000b425762000b3c6001600160a01b03871685856200220e565b62000dfe565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b16602482015260009060380160408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b03168062000d96576000808062000bc18688018862002fa7565b92509250925060008584848460405162000bdb906200289b565b62000be99392919062002e0f565b8190604051809103906000f590508015801562000c0a573d6000803e3d6000fd5b506040516340c10f1960e01b81526001600160a01b038c81166004830152602482018c9052919250908216906340c10f1990604401600060405180830381600087803b15801562000c5a57600080fd5b505af115801562000c6f573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000d8495949392919062003046565b60405180910390a15050505062000dfb565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f1990604401600060405180830381600087803b15801562000de157600080fd5b505af115801562000df6573d6000803e3d6000fd5b505050505b50505b6040805163ffffffff8c81168252891660208201526001600160a01b0388811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000e8e57604051630bc011ff60e21b815260040160405180910390fd5b62000ea58b8b8b8b8b8b8b8b8b8b8b600162002043565b6000846001600160a01b031684888a868660405160240162000ecb949392919062003081565b60408051601f198184030181529181526020820180516001600160e01b03167f1806b5f2000000000000000000000000000000000000000000000000000000001790525162000f1b919062002ece565b60006040518083038185875af1925050503d806000811462000f5a576040519150601f19603f3d011682016040523d82523d6000602084013e62000f5f565b606091505b505090508062000f9b576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b605354600090819081805b6020811015620010e4578083901c600116600103620010755760338160208110620010415762001041620030bc565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620010a2565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620010db90620030d2565b91505062001012565b50919392505050565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b600054610100900460ff1615808015620011b85750600054600160ff909116105b80620011d45750303b158015620011d4575060005460ff166001145b6200124c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b6000805460ff19166001179055801562001270576000805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556200131a62002259565b801562001361576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201526000908190603801604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620013d2906200289b565b601f1982820381018352601f909101166040819052620013ff908d908d908d908d908d90602001620030ee565b60408051601f19818403018152908290526200141f92916020016200312f565b604051602081830303815290604052805190602001206040516020016200149594939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60685460ff1615620014e057604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff858116610100909204161480620015065750600263ffffffff851610155b1562001525576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163387873488886053546040516200157b9998979695949392919062003162565b60405180910390a1620015c4620008d96001606860019054906101000a900463ffffffff16338888348989604051620015b6929190620031d0565b6040518091039020620010ed565b6068546501000000000090046001600160a01b03166333d6247d620015e862001007565b6040518263ffffffff1660e01b81526004016200160791815260200190565b600060405180830381600087803b1580156200162257600080fd5b505af115801562001637573d6000803e3d6000fd5b5050505050505050565b606c546001600160a01b031633146200166d5760405163e2e8106b60e01b815260040160405180910390fd5b620009a2620022d0565b600084815b60208110156200175257600163ffffffff8616821c81169003620016ee57858160208110620016af57620016af620030bc565b602002013582604051602001620016d0929190918252602082015260400190565b6040516020818303038152906040528051906020012091506200173d565b81868260208110620017045762001704620030bc565b602002013560405160200162001724929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806200174981620030d2565b9150506200167c565b50909114949350505050565b600260015403620017b25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162001243565b6002600155565b6000620017ca6004828486620031e0565b620017d5916200320c565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b0319821601620019c157600080808080808062001820896004818d620031e0565b8101906200182f91906200323d565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620018705760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146200189a5760405163750643af60e01b815260040160405180910390fd5b8a8514620018d4576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e16916200196d919062002ece565b6000604051808303816000865af19150503d8060008114620019ac576040519150601f19603f3d011682016040523d82523d6000602084013e620019b1565b606091505b5050505050505050505062001b79565b6001600160e01b031981166323f2ebc360e21b1462001a0c576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080808080808062001a248a6004818e620031e0565b81019062001a339190620032a7565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001a765760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301462001aa05760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162001b29919062002ece565b6000604051808303816000865af19150503d806000811462001b68576040519150601f19603f3d011682016040523d82523d6000602084013e62001b6d565b606091505b50505050505050505050505b5050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620013619085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262002342565b60408051600481526024810182526020810180516001600160e01b03167f06fdde0300000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b0386169162001c68919062002ece565b600060405180830381855afa9150503d806000811462001ca5576040519150601f19603f3d011682016040523d82523d6000602084013e62001caa565b606091505b50915091508162001cf1576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001cfc565b62001cfc816200242e565b949350505050565b60408051600481526024810182526020810180516001600160e01b03167f95d89b4100000000000000000000000000000000000000000000000000000000179052905160609160009182916001600160a01b0386169162001d66919062002ece565b600060405180830381855afa9150503d806000811462001da3576040519150601f19603f3d011682016040523d82523d6000602084013e62001da8565b606091505b50915091508162001cf1576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001cfc565b60408051600481526024810182526020810180516001600160e01b03167f313ce567000000000000000000000000000000000000000000000000000000001790529051600091829182916001600160a01b0386169162001e50919062002ece565b600060405180830381855afa9150503d806000811462001e8d576040519150601f19603f3d011682016040523d82523d6000602084013e62001e92565b606091505b509150915081801562001ea6575080516020145b62001eb357601262001cfc565b8080602001905181019062001cfc919062003333565b80600162001eda6020600262003450565b62001ee6919062002da5565b6053541062001f21576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060536000815462001f3490620030d2565b9182905550905060005b602081101562001fd0578082901c60011660010362001f7657826033826020811062001f6e5762001f6e620030bc565b015550505050565b6033816020811062001f8c5762001f8c620030bc565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001fc790620030d2565b91505062001f3e565b5062001fdb6200345e565b505050565b60018055565b60685460ff16156200200b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b620020548b63ffffffff166200261e565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091526000916501000000000090046001600160a01b03169063257b3632906084016020604051808303816000875af1158015620020ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002110919062002d75565b9050806000036200214c576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff88811661010090920416146200217d576040516302caf51760e11b815260040160405180910390fd5b606854600090610100900463ffffffff166200219b5750896200219e565b508a5b620021c7620021be848c8c8c8c8c8c8c604051620015b6929190620031d0565b8f8f8462001677565b620021fe576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b6040516001600160a01b03831660248201526044810182905262001fdb9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640162001bce565b600054610100900460ff16620022c65760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001243565b620009a262002683565b60685460ff166200230d576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600062002399826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620026f09092919063ffffffff16565b80519091501562001fdb5780806020019051810190620023ba919062003474565b62001fdb5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162001243565b6060604082511062002450578180602001905181019062000a09919062003494565b8151602003620025e05760005b602081108015620024a857508281815181106200247e576200247e620030bc565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620024c35780620024ba81620030d2565b9150506200245d565b806000036200250757505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b60008167ffffffffffffffff81111562002525576200252562002eb8565b6040519080825280601f01601f19166020018201604052801562002550576020820181803683370190505b50905060005b82811015620025d857848181518110620025745762002574620030bc565b602001015160f81c60f81b828281518110620025945762002594620030bc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080620025cf81620030d2565b91505062002556565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900362001b79576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054610100900460ff1662001fe05760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162001243565b60606200270184846000856200270b565b90505b9392505050565b606082471015620027855760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840162001243565b6001600160a01b0385163b620027de5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162001243565b600080866001600160a01b03168587604051620027fc919062002ece565b60006040518083038185875af1925050503d80600081146200283b576040519150601f19603f3d011682016040523d82523d6000602084013e62002840565b606091505b5091509150620028528282866200285d565b979650505050505050565b606083156200286e57508162002704565b8251156200287f5782518084602001fd5b8160405162461bcd60e51b815260040162001243919062003514565b611820806200352a83390190565b6001600160a01b0381168114620028bf57600080fd5b50565b803563ffffffff811681146200261957600080fd5b60008083601f840112620028ea57600080fd5b50813567ffffffffffffffff8111156200290357600080fd5b6020830191508360208285010111156200291c57600080fd5b9250929050565b60008060008060008060a087890312156200293d57600080fd5b86356200294a81620028a9565b95506200295a60208801620028c2565b945060408701356200296c81620028a9565b935060608701359250608087013567ffffffffffffffff8111156200299057600080fd5b6200299e89828a01620028d7565b979a9699509497509295939492505050565b60008060408385031215620029c457600080fd5b620029cf83620028c2565b91506020830135620029e181620028a9565b809150509250929050565b80610400810183101562000a0957600080fd5b60008060008060008060008060008060006105208c8e03121562002a2257600080fd5b62002a2e8d8d620029ec565b9a5062002a3f6104008d01620028c2565b99506104208c013598506104408c0135975062002a606104608d01620028c2565b96506104808c013562002a7381620028a9565b955062002a846104a08d01620028c2565b94506104c08c013562002a9781620028a9565b93506104e08c013592506105008c013567ffffffffffffffff81111562002abd57600080fd5b62002acb8e828f01620028d7565b915080935050809150509295989b509295989b9093969950565b60006020828403121562002af857600080fd5b81356200270481620028a9565b60ff81168114620028bf57600080fd5b600080600080600080600060e0888a03121562002b3157600080fd5b873562002b3e8162002b05565b965062002b4e60208901620028c2565b9550604088013562002b6081620028a9565b945062002b7060608901620028c2565b9350608088013562002b8281620028a9565b9699959850939692959460a0840135945060c09093013592915050565b60008060006060848603121562002bb557600080fd5b62002bc084620028c2565b9250602084013562002bd281620028a9565b9150604084013562002be481620028a9565b809150509250925092565b60006020828403121562002c0257600080fd5b5035919050565b600080600080600080600060a0888a03121562002c2557600080fd5b62002c3088620028c2565b9650602088013562002c4281620028a9565b9550604088013567ffffffffffffffff8082111562002c6057600080fd5b62002c6e8b838c01620028d7565b909750955060608a013591508082111562002c8857600080fd5b5062002c978a828b01620028d7565b909450925050608088013562002cad8162002b05565b8091505092959891949750929550565b6000806000806060858703121562002cd457600080fd5b62002cdf85620028c2565b9350602085013562002cf181620028a9565b9250604085013567ffffffffffffffff81111562002d0e57600080fd5b62002d1c87828801620028d7565b95989497509550505050565b600080600080610460858703121562002d4057600080fd5b8435935062002d538660208701620029ec565b925062002d646104208601620028c2565b939692955092936104400135925050565b60006020828403121562002d8857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111562000a095762000a0962002d8f565b60005b8381101562002dd857818101518382015260200162002dbe565b50506000910152565b6000815180845262002dfb81602086016020860162002dbb565b601f01601f19169290920160200192915050565b60608152600062002e24606083018662002de1565b828103602084015262002e38818662002de1565b91505060ff83166040830152949350505050565b600061010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015262002e9f8285018762002de1565b925080851660e085015250509998505050505050505050565b634e487b7160e01b600052604160045260246000fd5b6000825162002ee281846020870162002dbb565b9190910192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171562002f185762002f1862002eb8565b604052919050565b600067ffffffffffffffff82111562002f3d5762002f3d62002eb8565b50601f01601f191660200190565b600082601f83011262002f5d57600080fd5b813562002f7462002f6e8262002f20565b62002eec565b81815284602083860101111562002f8a57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562002fbd57600080fd5b833567ffffffffffffffff8082111562002fd657600080fd5b62002fe48783880162002f4b565b9450602086013591508082111562002ffb57600080fd5b506200300a8682870162002f4b565b925050604084013562002be48162002b05565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff8616815260006001600160a01b03808716602084015280861660408401525060806060830152620028526080830184866200301d565b6001600160a01b038516815263ffffffff84166020820152606060408201526000620030b26060830184866200301d565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b600060018201620030e757620030e762002d8f565b5060010190565b606081526000620031046060830187896200301d565b8281036020840152620031198186886200301d565b91505060ff831660408301529695505050505050565b600083516200314381846020880162002dbb565b8351908301906200315981836020880162002dbb565b01949350505050565b600061010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620031b682850187896200301d565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b60008085851115620031f157600080fd5b83861115620031ff57600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015620032355780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156200325957600080fd5b87356200326681620028a9565b965060208801356200327881620028a9565b95506040880135945060608801359350608088013562002b828162002b05565b8015158114620028bf57600080fd5b600080600080600080600080610100898b031215620032c557600080fd5b8835620032d281620028a9565b97506020890135620032e481620028a9565b965060408901359550606089013594506080890135620033048162003298565b935060a0890135620033168162002b05565b979a969950949793969295929450505060c08201359160e0013590565b6000602082840312156200334657600080fd5b8151620027048162002b05565b600181815b808511156200339457816000190482111562003378576200337862002d8f565b808516156200338657918102915b93841c939080029062003358565b509250929050565b600082620033ad5750600162000a09565b81620033bc5750600062000a09565b8160018114620033d55760028114620033e05762003400565b600191505062000a09565b60ff841115620033f457620033f462002d8f565b50506001821b62000a09565b5060208310610133831016604e8410600b841016171562003425575081810a62000a09565b62003431838362003353565b806000190482111562003448576200344862002d8f565b029392505050565b60006200270483836200339c565b634e487b7160e01b600052600160045260246000fd5b6000602082840312156200348757600080fd5b8151620027048162003298565b600060208284031215620034a757600080fd5b815167ffffffffffffffff811115620034bf57600080fd5b8201601f81018413620034d157600080fd5b8051620034e262002f6e8262002f20565b818152856020838501011115620034f857600080fd5b6200350b82602083016020860162002dbb565b95945050505050565b60208152600062002704602083018462002de156fe6101006040523480156200001257600080fd5b50604051620018203803806200182083398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e051611364620004bc60003960006102370152600081816102fa015281816105630152610623015260006104f701526000818161035f01526104c101526113646000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf14610381578063dd62ed3e14610394578063ffa1ad74146103cd57600080fd5b8063a457c2d714610334578063a9059cbb14610347578063cd0d00961461035a57600080fd5b806395d89b41116100bd57806395d89b41146102da5780639dc29fac146102e2578063a3c573eb146102f557600080fd5b806370a08231146102915780637ecebe00146102ba57600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b6101846103ed565b6040516101919190611107565b60405180910390f35b6101ad6101a8366004611171565b61047f565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad61020436600461119b565b610499565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c16104bd565b6101ad610277366004611171565b610519565b61028f61028a366004611171565b610558565b005b6101c161029f3660046111d7565b6001600160a01b031660009081526020819052604090205490565b6101c16102c83660046111d7565b60056020526000908152604090205481565b610184610609565b61028f6102f0366004611171565b610618565b61031c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610191565b6101ad610342366004611171565b6106c0565b6101ad610355366004611171565b61076a565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f61038f3660046111f9565b610778565b6101c16103a236600461126c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610184604051806040016040528060018152602001603160f81b81525081565b6060600380546103fc9061129f565b80601f01602080910402602001604051908101604052809291908181526020018280546104289061129f565b80156104755780601f1061044a57610100808354040283529160200191610475565b820191906000526020600020905b81548152906001019060200180831161045857829003601f168201915b5050505050905090565b60003361048d8185856109fd565b60019150505b92915050565b6000336104a7858285610b56565b6104b2858585610be8565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104f4576104ef46610dff565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061048d90829086906105539087906112ef565b6109fd565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105fb5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106058282610eab565b5050565b6060600480546103fc9061129f565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106b65760405162461bcd60e51b815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084016105f2565b6106058282610f8a565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091908381101561075d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016105f2565b6104b282868684036109fd565b60003361048d818585610be8565b834211156107ed5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d69740000000000000000000000000000000000000000000000000000000060648201526084016105f2565b6001600160a01b038716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661083a83611302565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006108986104bd565b6040517f1901000000000000000000000000000000000000000000000000000000000000602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561093e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906109745750896001600160a01b0316816001600160a01b0316145b6109e65760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e61747572650000000000000000000000000000000000000000000000000060648201526084016105f2565b6109f18a8a8a6109fd565b50505050505050505050565b6001600160a01b038316610a785760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105f2565b6001600160a01b038216610af45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105f2565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610be25781811015610bd55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105f2565b610be284848484036109fd565b50505050565b6001600160a01b038316610c645760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105f2565b6001600160a01b038216610ce05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105f2565b6001600160a01b03831660009081526020819052604090205481811015610d6f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016105f2565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290610da69084906112ef565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610df291815260200190565b60405180910390a3610be2565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610e2a6103ed565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610f015760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105f2565b8060026000828254610f1391906112ef565b90915550506001600160a01b03821660009081526020819052604081208054839290610f409084906112ef565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166110065760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105f2565b6001600160a01b038216600090815260208190526040902054818110156110955760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016105f2565b6001600160a01b03831660009081526020819052604081208383039055600280548492906110c490849061131b565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610b49565b600060208083528351808285015260005b8181101561113457858101830151858201604001528201611118565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461116c57600080fd5b919050565b6000806040838503121561118457600080fd5b61118d83611155565b946020939093013593505050565b6000806000606084860312156111b057600080fd5b6111b984611155565b92506111c760208501611155565b9150604084013590509250925092565b6000602082840312156111e957600080fd5b6111f282611155565b9392505050565b600080600080600080600060e0888a03121561121457600080fd5b61121d88611155565b965061122b60208901611155565b95506040880135945060608801359350608088013560ff8116811461124f57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561127f57600080fd5b61128883611155565b915061129660208401611155565b90509250929050565b600181811c908216806112b357607f821691505b6020821081036112d357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610493576104936112d9565b600060018201611314576113146112d9565b5060010190565b81810381811115610493576104936112d956fea264697066735822122096b785fb92e9d4372a52fbc641ca1490dd9eca1990f97279973ebfb2e360d35264736f6c63430008110033a2646970667358221220023cdf6f59c48aad01ce56dd616f5f69b13eac334bef1d8757755c5483d3c50764736f6c63430008110033", } // PolygonzkevmbridgeABI is the input ABI used to generate the binding from. @@ -201,99 +201,6 @@ func (_Polygonzkevmbridge *PolygonzkevmbridgeTransactorRaw) Transact(opts *bind. return _Polygonzkevmbridge.Contract.contract.Transact(opts, method, params...) } -// LEAFTYPEASSET is a free data retrieval call binding the contract method 0xa08e8a08. -// -// Solidity: function LEAF_TYPE_ASSET() view returns(uint8) -func (_Polygonzkevmbridge *PolygonzkevmbridgeCaller) LEAFTYPEASSET(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _Polygonzkevmbridge.contract.Call(opts, &out, "LEAF_TYPE_ASSET") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// LEAFTYPEASSET is a free data retrieval call binding the contract method 0xa08e8a08. -// -// Solidity: function LEAF_TYPE_ASSET() view returns(uint8) -func (_Polygonzkevmbridge *PolygonzkevmbridgeSession) LEAFTYPEASSET() (uint8, error) { - return _Polygonzkevmbridge.Contract.LEAFTYPEASSET(&_Polygonzkevmbridge.CallOpts) -} - -// LEAFTYPEASSET is a free data retrieval call binding the contract method 0xa08e8a08. -// -// Solidity: function LEAF_TYPE_ASSET() view returns(uint8) -func (_Polygonzkevmbridge *PolygonzkevmbridgeCallerSession) LEAFTYPEASSET() (uint8, error) { - return _Polygonzkevmbridge.Contract.LEAFTYPEASSET(&_Polygonzkevmbridge.CallOpts) -} - -// LEAFTYPEMESSAGE is a free data retrieval call binding the contract method 0xff634ed7. -// -// Solidity: function LEAF_TYPE_MESSAGE() view returns(uint8) -func (_Polygonzkevmbridge *PolygonzkevmbridgeCaller) LEAFTYPEMESSAGE(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _Polygonzkevmbridge.contract.Call(opts, &out, "LEAF_TYPE_MESSAGE") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// LEAFTYPEMESSAGE is a free data retrieval call binding the contract method 0xff634ed7. -// -// Solidity: function LEAF_TYPE_MESSAGE() view returns(uint8) -func (_Polygonzkevmbridge *PolygonzkevmbridgeSession) LEAFTYPEMESSAGE() (uint8, error) { - return _Polygonzkevmbridge.Contract.LEAFTYPEMESSAGE(&_Polygonzkevmbridge.CallOpts) -} - -// LEAFTYPEMESSAGE is a free data retrieval call binding the contract method 0xff634ed7. -// -// Solidity: function LEAF_TYPE_MESSAGE() view returns(uint8) -func (_Polygonzkevmbridge *PolygonzkevmbridgeCallerSession) LEAFTYPEMESSAGE() (uint8, error) { - return _Polygonzkevmbridge.Contract.LEAFTYPEMESSAGE(&_Polygonzkevmbridge.CallOpts) -} - -// MAINNETNETWORKID is a free data retrieval call binding the contract method 0xed6be5c9. -// -// Solidity: function MAINNET_NETWORK_ID() view returns(uint32) -func (_Polygonzkevmbridge *PolygonzkevmbridgeCaller) MAINNETNETWORKID(opts *bind.CallOpts) (uint32, error) { - var out []interface{} - err := _Polygonzkevmbridge.contract.Call(opts, &out, "MAINNET_NETWORK_ID") - - if err != nil { - return *new(uint32), err - } - - out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) - - return out0, err - -} - -// MAINNETNETWORKID is a free data retrieval call binding the contract method 0xed6be5c9. -// -// Solidity: function MAINNET_NETWORK_ID() view returns(uint32) -func (_Polygonzkevmbridge *PolygonzkevmbridgeSession) MAINNETNETWORKID() (uint32, error) { - return _Polygonzkevmbridge.Contract.MAINNETNETWORKID(&_Polygonzkevmbridge.CallOpts) -} - -// MAINNETNETWORKID is a free data retrieval call binding the contract method 0xed6be5c9. -// -// Solidity: function MAINNET_NETWORK_ID() view returns(uint32) -func (_Polygonzkevmbridge *PolygonzkevmbridgeCallerSession) MAINNETNETWORKID() (uint32, error) { - return _Polygonzkevmbridge.Contract.MAINNETNETWORKID(&_Polygonzkevmbridge.CallOpts) -} - // ClaimedBitMap is a free data retrieval call binding the contract method 0xee25560b. // // Solidity: function claimedBitMap(uint256 ) view returns(uint256) @@ -666,10 +573,10 @@ func (_Polygonzkevmbridge *PolygonzkevmbridgeCallerSession) TokenInfoToWrappedTo return _Polygonzkevmbridge.Contract.TokenInfoToWrappedToken(&_Polygonzkevmbridge.CallOpts, arg0) } -// VerifyMerkleProof is a free data retrieval call binding the contract method 0x3da81682. +// VerifyMerkleProof is a free data retrieval call binding the contract method 0xfb570834. // -// Solidity: function verifyMerkleProof(bytes32 leafHash, bytes32[] smtProof, uint64 index, bytes32 root) pure returns(bool) -func (_Polygonzkevmbridge *PolygonzkevmbridgeCaller) VerifyMerkleProof(opts *bind.CallOpts, leafHash [32]byte, smtProof [][32]byte, index uint64, root [32]byte) (bool, error) { +// Solidity: function verifyMerkleProof(bytes32 leafHash, bytes32[32] smtProof, uint32 index, bytes32 root) pure returns(bool) +func (_Polygonzkevmbridge *PolygonzkevmbridgeCaller) VerifyMerkleProof(opts *bind.CallOpts, leafHash [32]byte, smtProof [32][32]byte, index uint32, root [32]byte) (bool, error) { var out []interface{} err := _Polygonzkevmbridge.contract.Call(opts, &out, "verifyMerkleProof", leafHash, smtProof, index, root) @@ -683,17 +590,17 @@ func (_Polygonzkevmbridge *PolygonzkevmbridgeCaller) VerifyMerkleProof(opts *bin } -// VerifyMerkleProof is a free data retrieval call binding the contract method 0x3da81682. +// VerifyMerkleProof is a free data retrieval call binding the contract method 0xfb570834. // -// Solidity: function verifyMerkleProof(bytes32 leafHash, bytes32[] smtProof, uint64 index, bytes32 root) pure returns(bool) -func (_Polygonzkevmbridge *PolygonzkevmbridgeSession) VerifyMerkleProof(leafHash [32]byte, smtProof [][32]byte, index uint64, root [32]byte) (bool, error) { +// Solidity: function verifyMerkleProof(bytes32 leafHash, bytes32[32] smtProof, uint32 index, bytes32 root) pure returns(bool) +func (_Polygonzkevmbridge *PolygonzkevmbridgeSession) VerifyMerkleProof(leafHash [32]byte, smtProof [32][32]byte, index uint32, root [32]byte) (bool, error) { return _Polygonzkevmbridge.Contract.VerifyMerkleProof(&_Polygonzkevmbridge.CallOpts, leafHash, smtProof, index, root) } -// VerifyMerkleProof is a free data retrieval call binding the contract method 0x3da81682. +// VerifyMerkleProof is a free data retrieval call binding the contract method 0xfb570834. // -// Solidity: function verifyMerkleProof(bytes32 leafHash, bytes32[] smtProof, uint64 index, bytes32 root) pure returns(bool) -func (_Polygonzkevmbridge *PolygonzkevmbridgeCallerSession) VerifyMerkleProof(leafHash [32]byte, smtProof [][32]byte, index uint64, root [32]byte) (bool, error) { +// Solidity: function verifyMerkleProof(bytes32 leafHash, bytes32[32] smtProof, uint32 index, bytes32 root) pure returns(bool) +func (_Polygonzkevmbridge *PolygonzkevmbridgeCallerSession) VerifyMerkleProof(leafHash [32]byte, smtProof [32][32]byte, index uint32, root [32]byte) (bool, error) { return _Polygonzkevmbridge.Contract.VerifyMerkleProof(&_Polygonzkevmbridge.CallOpts, leafHash, smtProof, index, root) } @@ -805,45 +712,45 @@ func (_Polygonzkevmbridge *PolygonzkevmbridgeTransactorSession) BridgeMessage(de return _Polygonzkevmbridge.Contract.BridgeMessage(&_Polygonzkevmbridge.TransactOpts, destinationNetwork, destinationAddress, metadata) } -// ClaimAsset is a paid mutator transaction binding the contract method 0x7b6323c1. +// ClaimAsset is a paid mutator transaction binding the contract method 0x2cffd02e. // -// Solidity: function claimAsset(bytes32[] smtProof, uint32 index, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originTokenAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() -func (_Polygonzkevmbridge *PolygonzkevmbridgeTransactor) ClaimAsset(opts *bind.TransactOpts, smtProof [][32]byte, index uint32, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originTokenAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { +// Solidity: function claimAsset(bytes32[32] smtProof, uint32 index, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originTokenAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() +func (_Polygonzkevmbridge *PolygonzkevmbridgeTransactor) ClaimAsset(opts *bind.TransactOpts, smtProof [32][32]byte, index uint32, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originTokenAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { return _Polygonzkevmbridge.contract.Transact(opts, "claimAsset", smtProof, index, mainnetExitRoot, rollupExitRoot, originNetwork, originTokenAddress, destinationNetwork, destinationAddress, amount, metadata) } -// ClaimAsset is a paid mutator transaction binding the contract method 0x7b6323c1. +// ClaimAsset is a paid mutator transaction binding the contract method 0x2cffd02e. // -// Solidity: function claimAsset(bytes32[] smtProof, uint32 index, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originTokenAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() -func (_Polygonzkevmbridge *PolygonzkevmbridgeSession) ClaimAsset(smtProof [][32]byte, index uint32, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originTokenAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { +// Solidity: function claimAsset(bytes32[32] smtProof, uint32 index, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originTokenAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() +func (_Polygonzkevmbridge *PolygonzkevmbridgeSession) ClaimAsset(smtProof [32][32]byte, index uint32, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originTokenAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { return _Polygonzkevmbridge.Contract.ClaimAsset(&_Polygonzkevmbridge.TransactOpts, smtProof, index, mainnetExitRoot, rollupExitRoot, originNetwork, originTokenAddress, destinationNetwork, destinationAddress, amount, metadata) } -// ClaimAsset is a paid mutator transaction binding the contract method 0x7b6323c1. +// ClaimAsset is a paid mutator transaction binding the contract method 0x2cffd02e. // -// Solidity: function claimAsset(bytes32[] smtProof, uint32 index, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originTokenAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() -func (_Polygonzkevmbridge *PolygonzkevmbridgeTransactorSession) ClaimAsset(smtProof [][32]byte, index uint32, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originTokenAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { +// Solidity: function claimAsset(bytes32[32] smtProof, uint32 index, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originTokenAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() +func (_Polygonzkevmbridge *PolygonzkevmbridgeTransactorSession) ClaimAsset(smtProof [32][32]byte, index uint32, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originTokenAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { return _Polygonzkevmbridge.Contract.ClaimAsset(&_Polygonzkevmbridge.TransactOpts, smtProof, index, mainnetExitRoot, rollupExitRoot, originNetwork, originTokenAddress, destinationNetwork, destinationAddress, amount, metadata) } -// ClaimMessage is a paid mutator transaction binding the contract method 0x46385549. +// ClaimMessage is a paid mutator transaction binding the contract method 0x2d2c9d94. // -// Solidity: function claimMessage(bytes32[] smtProof, uint32 index, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() -func (_Polygonzkevmbridge *PolygonzkevmbridgeTransactor) ClaimMessage(opts *bind.TransactOpts, smtProof [][32]byte, index uint32, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { +// Solidity: function claimMessage(bytes32[32] smtProof, uint32 index, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() +func (_Polygonzkevmbridge *PolygonzkevmbridgeTransactor) ClaimMessage(opts *bind.TransactOpts, smtProof [32][32]byte, index uint32, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { return _Polygonzkevmbridge.contract.Transact(opts, "claimMessage", smtProof, index, mainnetExitRoot, rollupExitRoot, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadata) } -// ClaimMessage is a paid mutator transaction binding the contract method 0x46385549. +// ClaimMessage is a paid mutator transaction binding the contract method 0x2d2c9d94. // -// Solidity: function claimMessage(bytes32[] smtProof, uint32 index, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() -func (_Polygonzkevmbridge *PolygonzkevmbridgeSession) ClaimMessage(smtProof [][32]byte, index uint32, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { +// Solidity: function claimMessage(bytes32[32] smtProof, uint32 index, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() +func (_Polygonzkevmbridge *PolygonzkevmbridgeSession) ClaimMessage(smtProof [32][32]byte, index uint32, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { return _Polygonzkevmbridge.Contract.ClaimMessage(&_Polygonzkevmbridge.TransactOpts, smtProof, index, mainnetExitRoot, rollupExitRoot, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadata) } -// ClaimMessage is a paid mutator transaction binding the contract method 0x46385549. +// ClaimMessage is a paid mutator transaction binding the contract method 0x2d2c9d94. // -// Solidity: function claimMessage(bytes32[] smtProof, uint32 index, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() -func (_Polygonzkevmbridge *PolygonzkevmbridgeTransactorSession) ClaimMessage(smtProof [][32]byte, index uint32, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { +// Solidity: function claimMessage(bytes32[32] smtProof, uint32 index, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) returns() +func (_Polygonzkevmbridge *PolygonzkevmbridgeTransactorSession) ClaimMessage(smtProof [32][32]byte, index uint32, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { return _Polygonzkevmbridge.Contract.ClaimMessage(&_Polygonzkevmbridge.TransactOpts, smtProof, index, mainnetExitRoot, rollupExitRoot, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadata) } @@ -1640,12 +1547,13 @@ type PolygonzkevmbridgeNewWrappedToken struct { OriginNetwork uint32 OriginTokenAddress common.Address WrappedTokenAddress common.Address + Metadata []byte Raw types.Log // Blockchain specific contextual infos } -// FilterNewWrappedToken is a free log retrieval operation binding the contract event 0xccd7715648d1f2bb13e158f96b5b6c3aeda555d4cb87112e274a6f28bc571d59. +// FilterNewWrappedToken is a free log retrieval operation binding the contract event 0x490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a39. // -// Solidity: event NewWrappedToken(uint32 originNetwork, address originTokenAddress, address wrappedTokenAddress) +// Solidity: event NewWrappedToken(uint32 originNetwork, address originTokenAddress, address wrappedTokenAddress, bytes metadata) func (_Polygonzkevmbridge *PolygonzkevmbridgeFilterer) FilterNewWrappedToken(opts *bind.FilterOpts) (*PolygonzkevmbridgeNewWrappedTokenIterator, error) { logs, sub, err := _Polygonzkevmbridge.contract.FilterLogs(opts, "NewWrappedToken") @@ -1655,9 +1563,9 @@ func (_Polygonzkevmbridge *PolygonzkevmbridgeFilterer) FilterNewWrappedToken(opt return &PolygonzkevmbridgeNewWrappedTokenIterator{contract: _Polygonzkevmbridge.contract, event: "NewWrappedToken", logs: logs, sub: sub}, nil } -// WatchNewWrappedToken is a free log subscription operation binding the contract event 0xccd7715648d1f2bb13e158f96b5b6c3aeda555d4cb87112e274a6f28bc571d59. +// WatchNewWrappedToken is a free log subscription operation binding the contract event 0x490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a39. // -// Solidity: event NewWrappedToken(uint32 originNetwork, address originTokenAddress, address wrappedTokenAddress) +// Solidity: event NewWrappedToken(uint32 originNetwork, address originTokenAddress, address wrappedTokenAddress, bytes metadata) func (_Polygonzkevmbridge *PolygonzkevmbridgeFilterer) WatchNewWrappedToken(opts *bind.WatchOpts, sink chan<- *PolygonzkevmbridgeNewWrappedToken) (event.Subscription, error) { logs, sub, err := _Polygonzkevmbridge.contract.WatchLogs(opts, "NewWrappedToken") @@ -1692,9 +1600,9 @@ func (_Polygonzkevmbridge *PolygonzkevmbridgeFilterer) WatchNewWrappedToken(opts }), nil } -// ParseNewWrappedToken is a log parse operation binding the contract event 0xccd7715648d1f2bb13e158f96b5b6c3aeda555d4cb87112e274a6f28bc571d59. +// ParseNewWrappedToken is a log parse operation binding the contract event 0x490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a39. // -// Solidity: event NewWrappedToken(uint32 originNetwork, address originTokenAddress, address wrappedTokenAddress) +// Solidity: event NewWrappedToken(uint32 originNetwork, address originTokenAddress, address wrappedTokenAddress, bytes metadata) func (_Polygonzkevmbridge *PolygonzkevmbridgeFilterer) ParseNewWrappedToken(log types.Log) (*PolygonzkevmbridgeNewWrappedToken, error) { event := new(PolygonzkevmbridgeNewWrappedToken) if err := _Polygonzkevmbridge.contract.UnpackLog(event, "NewWrappedToken", log); err != nil { diff --git a/etherman/smartcontracts/polygonzkevmglobalexitroot/polygonzkevmglobalexitroot.go b/etherman/smartcontracts/polygonzkevmglobalexitroot/polygonzkevmglobalexitroot.go index 9b1129b044..76cbf4ad9d 100644 --- a/etherman/smartcontracts/polygonzkevmglobalexitroot/polygonzkevmglobalexitroot.go +++ b/etherman/smartcontracts/polygonzkevmglobalexitroot/polygonzkevmglobalexitroot.go @@ -30,8 +30,8 @@ var ( // PolygonzkevmglobalexitrootMetaData contains all meta data concerning the Polygonzkevmglobalexitroot contract. var PolygonzkevmglobalexitrootMetaData = &bind.MetaData{ - ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"mainnetExitRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"rollupExitRoot\",\"type\":\"bytes32\"}],\"name\":\"UpdateGlobalExitRoot\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"bridgeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastGlobalExitRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"globalExitRootMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rollupAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_bridgeAddress\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastMainnetExitRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastRollupExitRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollupAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"newRoot\",\"type\":\"bytes32\"}],\"name\":\"updateExitRoot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b506104f3806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80633ed691ef1161005b5780633ed691ef146100e7578063485cc955146101205780635ec6a8df14610133578063a3c573eb1461015e57600080fd5b806301fd90441461008d578063257b3632146100a9578063319cf735146100c957806333d6247d146100d2575b600080fd5b61009660015481565b6040519081526020015b60405180910390f35b6100966100b7366004610455565b60036020526000908152604090205481565b61009660025481565b6100e56100e0366004610455565b610171565b005b61009660025460015460408051602081019390935282015260009060600160405160208183030381529060405280519060200120905090565b6100e561012e36600461048a565b6102f3565b600554610146906001600160a01b031681565b6040516001600160a01b0390911681526020016100a0565b600454610146906001600160a01b031681565b6005546001600160a01b031633148061019457506004546001600160a01b031633145b6102315760405162461bcd60e51b815260206004820152604260248201527f506f6c79676f6e5a6b45564d476c6f62616c45786974526f6f743a3a7570646160448201527f746545786974526f6f743a204f6e6c7920616c6c6f77656420636f6e7472616360648201527f7473000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b6005546001600160a01b031633036102495760018190555b6004546001600160a01b031633036102615760028190555b60025460015460408051602081019390935282015260009060600160405160208183030381529060405280519060200120905060036000828152602001908152602001600020546000036102ef57600081815260036020526040808220429055600154600254915190927f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce391a35b5050565b600054610100900460ff16158080156103135750600054600160ff909116105b8061032d5750303b15801561032d575060005460ff166001145b61039f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610228565b6000805460ff1916600117905580156103c2576000805461ff0019166101001790555b600580546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560048054928516929091169190911790558015610450576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006020828403121561046757600080fd5b5035919050565b80356001600160a01b038116811461048557600080fd5b919050565b6000806040838503121561049d57600080fd5b6104a68361046e565b91506104b46020840161046e565b9050925092905056fea26469706673582212204755a4cbf50d99cfafb99c5429e784137da120dba2e519fdf39654b3c4a8a5d864736f6c634300080f0033", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rollupAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_bridgeAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"OnlyAllowedContracts\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"mainnetExitRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"rollupExitRoot\",\"type\":\"bytes32\"}],\"name\":\"UpdateGlobalExitRoot\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"bridgeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastGlobalExitRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"globalExitRootMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastMainnetExitRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastRollupExitRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollupAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"newRoot\",\"type\":\"bytes32\"}],\"name\":\"updateExitRoot\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60c060405234801561001057600080fd5b506040516103f83803806103f883398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516103316100c76000396000818160e901526101bd015260008181610135015261017401526103316000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806333d6247d1161005b57806333d6247d146100c75780633ed691ef146100dc5780635ec6a8df146100e4578063a3c573eb1461013057600080fd5b806301fd904414610082578063257b36321461009e578063319cf735146100be575b600080fd5b61008b60005481565b6040519081526020015b60405180910390f35b61008b6100ac3660046102e2565b60026020526000908152604090205481565b61008b60015481565b6100da6100d53660046102e2565b610157565b005b61008b6102a6565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610095565b61010b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101a65750600182905581610222565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101f0576000839055829150610222565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051602080820184905281830185905282518083038401815260609092019092528051910120600090600081815260026020526040812054919250036102a05760008181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b60006102dd600154600054604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b6000602082840312156102f457600080fd5b503591905056fea2646970667358221220e7dee8a420da2e0e8a9c8794bd77473a90d0da4f68ae0f3c0ca6c0994fea144d64736f6c63430008110033", } // PolygonzkevmglobalexitrootABI is the input ABI used to generate the binding from. @@ -43,7 +43,7 @@ var PolygonzkevmglobalexitrootABI = PolygonzkevmglobalexitrootMetaData.ABI var PolygonzkevmglobalexitrootBin = PolygonzkevmglobalexitrootMetaData.Bin // DeployPolygonzkevmglobalexitroot deploys a new Ethereum contract, binding an instance of Polygonzkevmglobalexitroot to it. -func DeployPolygonzkevmglobalexitroot(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Polygonzkevmglobalexitroot, error) { +func DeployPolygonzkevmglobalexitroot(auth *bind.TransactOpts, backend bind.ContractBackend, _rollupAddress common.Address, _bridgeAddress common.Address) (common.Address, *types.Transaction, *Polygonzkevmglobalexitroot, error) { parsed, err := PolygonzkevmglobalexitrootMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -52,7 +52,7 @@ func DeployPolygonzkevmglobalexitroot(auth *bind.TransactOpts, backend bind.Cont return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(PolygonzkevmglobalexitrootBin), backend) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(PolygonzkevmglobalexitrootBin), backend, _rollupAddress, _bridgeAddress) if err != nil { return common.Address{}, nil, nil, err } @@ -387,27 +387,6 @@ func (_Polygonzkevmglobalexitroot *PolygonzkevmglobalexitrootCallerSession) Roll return _Polygonzkevmglobalexitroot.Contract.RollupAddress(&_Polygonzkevmglobalexitroot.CallOpts) } -// Initialize is a paid mutator transaction binding the contract method 0x485cc955. -// -// Solidity: function initialize(address _rollupAddress, address _bridgeAddress) returns() -func (_Polygonzkevmglobalexitroot *PolygonzkevmglobalexitrootTransactor) Initialize(opts *bind.TransactOpts, _rollupAddress common.Address, _bridgeAddress common.Address) (*types.Transaction, error) { - return _Polygonzkevmglobalexitroot.contract.Transact(opts, "initialize", _rollupAddress, _bridgeAddress) -} - -// Initialize is a paid mutator transaction binding the contract method 0x485cc955. -// -// Solidity: function initialize(address _rollupAddress, address _bridgeAddress) returns() -func (_Polygonzkevmglobalexitroot *PolygonzkevmglobalexitrootSession) Initialize(_rollupAddress common.Address, _bridgeAddress common.Address) (*types.Transaction, error) { - return _Polygonzkevmglobalexitroot.Contract.Initialize(&_Polygonzkevmglobalexitroot.TransactOpts, _rollupAddress, _bridgeAddress) -} - -// Initialize is a paid mutator transaction binding the contract method 0x485cc955. -// -// Solidity: function initialize(address _rollupAddress, address _bridgeAddress) returns() -func (_Polygonzkevmglobalexitroot *PolygonzkevmglobalexitrootTransactorSession) Initialize(_rollupAddress common.Address, _bridgeAddress common.Address) (*types.Transaction, error) { - return _Polygonzkevmglobalexitroot.Contract.Initialize(&_Polygonzkevmglobalexitroot.TransactOpts, _rollupAddress, _bridgeAddress) -} - // UpdateExitRoot is a paid mutator transaction binding the contract method 0x33d6247d. // // Solidity: function updateExitRoot(bytes32 newRoot) returns() @@ -429,140 +408,6 @@ func (_Polygonzkevmglobalexitroot *PolygonzkevmglobalexitrootTransactorSession) return _Polygonzkevmglobalexitroot.Contract.UpdateExitRoot(&_Polygonzkevmglobalexitroot.TransactOpts, newRoot) } -// PolygonzkevmglobalexitrootInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Polygonzkevmglobalexitroot contract. -type PolygonzkevmglobalexitrootInitializedIterator struct { - Event *PolygonzkevmglobalexitrootInitialized // 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 *PolygonzkevmglobalexitrootInitializedIterator) 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(PolygonzkevmglobalexitrootInitialized) - 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(PolygonzkevmglobalexitrootInitialized) - 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 *PolygonzkevmglobalexitrootInitializedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PolygonzkevmglobalexitrootInitializedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PolygonzkevmglobalexitrootInitialized represents a Initialized event raised by the Polygonzkevmglobalexitroot contract. -type PolygonzkevmglobalexitrootInitialized struct { - Version uint8 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_Polygonzkevmglobalexitroot *PolygonzkevmglobalexitrootFilterer) FilterInitialized(opts *bind.FilterOpts) (*PolygonzkevmglobalexitrootInitializedIterator, error) { - - logs, sub, err := _Polygonzkevmglobalexitroot.contract.FilterLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return &PolygonzkevmglobalexitrootInitializedIterator{contract: _Polygonzkevmglobalexitroot.contract, event: "Initialized", logs: logs, sub: sub}, nil -} - -// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_Polygonzkevmglobalexitroot *PolygonzkevmglobalexitrootFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *PolygonzkevmglobalexitrootInitialized) (event.Subscription, error) { - - logs, sub, err := _Polygonzkevmglobalexitroot.contract.WatchLogs(opts, "Initialized") - 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(PolygonzkevmglobalexitrootInitialized) - if err := _Polygonzkevmglobalexitroot.contract.UnpackLog(event, "Initialized", 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 -} - -// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_Polygonzkevmglobalexitroot *PolygonzkevmglobalexitrootFilterer) ParseInitialized(log types.Log) (*PolygonzkevmglobalexitrootInitialized, error) { - event := new(PolygonzkevmglobalexitrootInitialized) - if err := _Polygonzkevmglobalexitroot.contract.UnpackLog(event, "Initialized", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // PolygonzkevmglobalexitrootUpdateGlobalExitRootIterator is returned from FilterUpdateGlobalExitRoot and is used to iterate over the raw logs and unpacked data for UpdateGlobalExitRoot events raised by the Polygonzkevmglobalexitroot contract. type PolygonzkevmglobalexitrootUpdateGlobalExitRootIterator struct { Event *PolygonzkevmglobalexitrootUpdateGlobalExitRoot // Event containing the contract specifics and raw log diff --git a/etherman/types.go b/etherman/types.go index e9ed97a124..35afa371c8 100644 --- a/etherman/types.go +++ b/etherman/types.go @@ -30,10 +30,11 @@ type GlobalExitRoot struct { // SequencedBatch represents virtual batch type SequencedBatch struct { - BatchNumber uint64 - Coinbase common.Address - TxHash common.Hash - Nonce uint64 + BatchNumber uint64 + SequencerAddr common.Address + TxHash common.Hash + Nonce uint64 + Coinbase common.Address polygonzkevm.PolygonZkEVMBatchData } diff --git a/go.mod b/go.mod index 9831738448..af4fd80800 100644 --- a/go.mod +++ b/go.mod @@ -32,48 +32,43 @@ require ( gopkg.in/yaml.v3 v3.0.1 ) -require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 // indirect - github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect - github.com/jackc/pgtype v1.12.0 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/prometheus/procfs v0.8.0 // indirect - github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect -) - require ( github.com/Microsoft/go-winio v0.4.16 // indirect github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect github.com/VictoriaMetrics/fastcache v1.6.0 // indirect github.com/acomagu/bufpipe v1.0.3 // indirect + github.com/beorn7/perks v1.0.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set v1.8.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 // indirect github.com/edsrzf/mmap-go v1.0.0 // indirect github.com/emirpasic/gods v1.12.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-git/gcfg v1.5.0 // indirect + github.com/go-kit/kit v0.9.0 // indirect github.com/go-ole/go-ole v1.2.1 // indirect github.com/go-pkgz/expirable-cache v0.0.3 // indirect + github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect github.com/go-stack/stack v1.8.0 // indirect github.com/gobuffalo/logger v1.0.6 // indirect github.com/gobuffalo/packd v1.0.1 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/gorilla/websocket v1.5.0 + github.com/google/gofuzz v1.2.0 // indirect github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.1 github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgproto3/v2 v2.3.1 // indirect github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect + github.com/jackc/pgtype v1.12.0 // indirect github.com/jackc/puddle v1.3.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/karrick/godirwalk v1.16.1 // indirect @@ -84,11 +79,13 @@ require ( github.com/markbates/oncer v1.0.0 // indirect github.com/markbates/safe v1.0.1 // indirect github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/procfs v0.8.0 // indirect github.com/prometheus/tsdb v0.7.1 // indirect github.com/rjeczalik/notify v0.9.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect @@ -100,10 +97,13 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.5 // indirect github.com/tklauser/numcpus v0.2.2 // indirect + github.com/umbracle/fastrlp v0.0.0-20220527094140-59d5dd30e722 // indirect + github.com/valyala/fastjson v1.4.1 // indirect github.com/xanzy/ssh-agent v0.3.0 // indirect + github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect + go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.8.0 // indirect golang.org/x/net v0.5.0 // indirect golang.org/x/sys v0.4.0 // indirect @@ -118,13 +118,14 @@ require ( ) require ( - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect + github.com/gorilla/websocket v1.5.0 + github.com/holiman/uint256 v1.2.1 + github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect +) + +require ( github.com/imdario/mergo v0.3.13 // indirect github.com/lib/pq v1.10.7 // indirect github.com/prometheus/client_golang v1.14.0 - github.com/umbracle/fastrlp v0.0.0-20220527094140-59d5dd30e722 // indirect - github.com/valyala/fastjson v1.4.1 // indirect github.com/ziutek/mymysql v1.5.4 // indirect - go.uber.org/atomic v1.9.0 // indirect ) diff --git a/go.sum b/go.sum index 47dad1b7eb..a8ff4821bf 100644 --- a/go.sum +++ b/go.sum @@ -628,7 +628,6 @@ github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= diff --git a/jsonrpc/interfaces.go b/jsonrpc/interfaces.go index 9f49ff2121..23ea190026 100644 --- a/jsonrpc/interfaces.go +++ b/jsonrpc/interfaces.go @@ -42,7 +42,6 @@ type stateInterface interface { GetL2BlockTransactionCountByNumber(ctx context.Context, blockNumber uint64, dbTx pgx.Tx) (uint64, error) GetLastConsolidatedL2BlockNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) GetLastL2Block(ctx context.Context, dbTx pgx.Tx) (*types.Block, error) - GetLastL2BlockHeader(ctx context.Context, dbTx pgx.Tx) (*types.Header, error) GetLastL2BlockNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) GetLogs(ctx context.Context, fromBlock uint64, toBlock uint64, addresses []common.Address, topics [][]common.Hash, blockHash *common.Hash, since *time.Time, dbTx pgx.Tx) ([]*types.Log, error) GetNonce(ctx context.Context, address common.Address, blockNumber uint64, dbTx pgx.Tx) (uint64, error) diff --git a/jsonrpc/mock_state_test.go b/jsonrpc/mock_state_test.go index 1daa522424..342d80fa75 100644 --- a/jsonrpc/mock_state_test.go +++ b/jsonrpc/mock_state_test.go @@ -382,29 +382,6 @@ func (_m *stateMock) GetLastL2Block(ctx context.Context, dbTx pgx.Tx) (*types.Bl return r0, r1 } -// GetLastL2BlockHeader provides a mock function with given fields: ctx, dbTx -func (_m *stateMock) GetLastL2BlockHeader(ctx context.Context, dbTx pgx.Tx) (*types.Header, error) { - ret := _m.Called(ctx, dbTx) - - var r0 *types.Header - if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) *types.Header); ok { - r0 = rf(ctx, dbTx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Header) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { - r1 = rf(ctx, dbTx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // GetLastL2BlockNumber provides a mock function with given fields: ctx, dbTx func (_m *stateMock) GetLastL2BlockNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) { ret := _m.Called(ctx, dbTx) diff --git a/merkletree/pb/statedb.pb.go b/merkletree/pb/statedb.pb.go index a31b95584a..42ab46afdc 100644 --- a/merkletree/pb/statedb.pb.go +++ b/merkletree/pb/statedb.pb.go @@ -123,7 +123,7 @@ func (x *Version) GetV0_0_1() string { return "" } -// * +//* // @dev SetRequest // @param {old_root} - merkle-tree root // @param {key} - key to set @@ -209,7 +209,7 @@ func (x *SetRequest) GetDetails() bool { return false } -// * +//* // @dev GetRequest // @param {root} - merkle-tree root // @param {key} - key to look for @@ -277,7 +277,7 @@ func (x *GetRequest) GetDetails() bool { return false } -// * +//* // @dev SetProgramRequest // @param {key} - hash to set // @param {data} - Program data to store @@ -345,7 +345,7 @@ func (x *SetProgramRequest) GetPersistent() bool { return false } -// * +//* // @dev GetProgramRequest // @param {key} - hash to get program data type GetProgramRequest struct { @@ -395,7 +395,7 @@ func (x *GetProgramRequest) GetKey() *Fea { return nil } -// * +//* // @dev SetResponse // @param {old_root} - merkle-tree root // @param {new_root} - merkle-tree new root @@ -535,7 +535,7 @@ func (x *SetResponse) GetResult() *ResultCode { return nil } -// * +//* // @dev GetResponse // @param {root} - merkle-tree root // @param {key} - key to look for @@ -648,7 +648,7 @@ func (x *GetResponse) GetResult() *ResultCode { return nil } -// * +//* // @dev SetProgramResponse // @param {result} - result code type SetProgramResponse struct { @@ -698,7 +698,7 @@ func (x *SetProgramResponse) GetResult() *ResultCode { return nil } -// * +//* // @dev GetProgramResponse // @param {data} - program data retrieved // @param {result} - result code @@ -757,7 +757,7 @@ func (x *GetProgramResponse) GetResult() *ResultCode { return nil } -// * +//* // @dev Array of 4 FE // @param {fe0} - Field Element value for pos 0 // @param {fe1} - Field Element value for pos 1 @@ -834,7 +834,7 @@ func (x *Fea) GetFe3() uint64 { return 0 } -// * +//* // @dev Siblings List // @param {sibling} - sibling type SiblingList struct { @@ -884,7 +884,7 @@ func (x *SiblingList) GetSibling() []uint64 { return nil } -// * +//* // @dev Result code // @param {code} - result code type ResultCode struct { diff --git a/metrics/api.go b/metrics/api.go index 64429c50c7..c21e2cca50 100644 --- a/metrics/api.go +++ b/metrics/api.go @@ -3,4 +3,14 @@ package metrics const ( //Endpoint the endpoint for exposing the metrics Endpoint = "/metrics" + // ProfilingIndexEndpoint the endpoint for exposing the profiling metrics + ProfilingIndexEndpoint = "/debug/pprof/" + // ProfileEndpoint the endpoint for exposing the profile of the profiling metrics + ProfileEndpoint = "/debug/pprof/profile" + // ProfilingCmdEndpoint the endpoint for exposing the command-line of profiling metrics + ProfilingCmdEndpoint = "/debug/pprof/cmdline" + // ProfilingSymbolEndpoint the endpoint for exposing the symbol of profiling metrics + ProfilingSymbolEndpoint = "/debug/pprof/symbol" + // ProfilingTraceEndpoint the endpoint for exposing the trace of profiling metrics + ProfilingTraceEndpoint = "/debug/pprof/trace" ) diff --git a/metrics/config.go b/metrics/config.go index 3d6de1758d..742e54aae5 100644 --- a/metrics/config.go +++ b/metrics/config.go @@ -2,7 +2,10 @@ package metrics // Config represents the configuration of the metrics type Config struct { - Host string `mapstructure:"Host"` - Port int `mapstructure:"Port"` - Enabled bool `mapstructure:"Enabled"` + Host string `mapstructure:"Host"` + Port int `mapstructure:"Port"` + Enabled bool `mapstructure:"Enabled"` + ProfilingHost string `mapstructure:"ProfilingHost"` + ProfilingPort int `mapstructure:"ProfilingPort"` + ProfilingEnabled bool `mapstructure:"ProfilingEnabled"` } diff --git a/pool/interfaces.go b/pool/interfaces.go index ce268f2c81..82eaccd804 100644 --- a/pool/interfaces.go +++ b/pool/interfaces.go @@ -5,6 +5,7 @@ import ( "math/big" "time" + "github.com/0xPolygonHermez/zkevm-node/state" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/jackc/pgx/v4" @@ -27,6 +28,9 @@ type storage interface { GetTxFromAddressFromByHash(ctx context.Context, hash common.Hash) (common.Address, uint64, error) GetTxByHash(ctx context.Context, hash common.Hash) (*Transaction, error) IncrementFailedCounter(ctx context.Context, hashes []string) error + GetTxZkCountersByHash(ctx context.Context, hash common.Hash) (*state.ZKCounters, error) + DeleteTransactionByHash(ctx context.Context, hash common.Hash) error + MarkWIPTxsAsPending(ctx context.Context) error } type stateInterface interface { diff --git a/pool/pgpoolstorage/pgpoolstorage.go b/pool/pgpoolstorage/pgpoolstorage.go index 7095eded16..eac04316ce 100644 --- a/pool/pgpoolstorage/pgpoolstorage.go +++ b/pool/pgpoolstorage/pgpoolstorage.go @@ -58,7 +58,7 @@ func (p *PostgresPoolStorage) AddTx(ctx context.Context, tx pool.Transaction) er gasPrice := tx.GasPrice().Uint64() nonce := tx.Nonce() sql := ` - INSERT INTO pool.txs + INSERT INTO pool.transaction ( hash, encoded, @@ -122,10 +122,10 @@ func (p *PostgresPoolStorage) GetTxsByStatus(ctx context.Context, status pool.Tx sql string ) if limit == 0 { - sql = "SELECT encoded, status, received_at FROM pool.txs WHERE status = $1 ORDER BY gas_price DESC" + sql = "SELECT encoded, status, received_at FROM pool.transaction WHERE status = $1 ORDER BY gas_price DESC" rows, err = p.db.Query(ctx, sql, status.String()) } else { - sql = "SELECT encoded, status, received_at FROM pool.txs WHERE status = $1 AND is_claims = $2 ORDER BY gas_price DESC LIMIT $3" + sql = "SELECT encoded, status, received_at FROM pool.transaction WHERE status = $1 AND is_claims = $2 ORDER BY gas_price DESC LIMIT $3" rows, err = p.db.Query(ctx, sql, status.String(), isClaims, limit) } if err != nil { @@ -147,7 +147,7 @@ func (p *PostgresPoolStorage) GetTxsByStatus(ctx context.Context, status pool.Tx // GetPendingTxHashesSince returns the pending tx since the given time. func (p *PostgresPoolStorage) GetPendingTxHashesSince(ctx context.Context, since time.Time) ([]common.Hash, error) { - sql := "SELECT hash FROM pool.txs WHERE status = $1 AND received_at >= $2" + sql := "SELECT hash FROM pool.transaction WHERE status = $1 AND received_at >= $2" rows, err := p.db.Query(ctx, sql, pool.TxStatusPending, since) if err != nil { return nil, err @@ -184,7 +184,7 @@ func (p *PostgresPoolStorage) GetTxs(ctx context.Context, filterStatus pool.TxSt nonce, failed_counter FROM - pool.txs p1 + pool.transaction p1 WHERE status = $1 AND gas_price >= $2 AND @@ -212,7 +212,7 @@ func (p *PostgresPoolStorage) GetTxs(ctx context.Context, filterStatus pool.TxSt nonce, failed_counter FROM - pool.txs p1 + pool.transaction p1 WHERE status = $1 AND gas_price >= $2 AND @@ -228,10 +228,10 @@ func (p *PostgresPoolStorage) GetTxs(ctx context.Context, filterStatus pool.TxSt var ( encoded, status string receivedAt time.Time - cumulativeGasUsed int64 + cumulativeGasUsed uint64 usedKeccakHashes, usedPoseidonHashes, usedPoseidonPaddings, - usedMemAligns, usedArithmetics, usedBinaries, usedSteps int32 + usedMemAligns, usedArithmetics, usedBinaries, usedSteps uint32 nonce, failedCounter uint64 ) @@ -276,7 +276,7 @@ func (p *PostgresPoolStorage) GetTxs(ctx context.Context, filterStatus pool.TxSt tx.Status = pool.TxStatus(status) tx.ReceivedAt = receivedAt - tx.ZkCounters = pool.ZkCounters{ + tx.ZKCounters = state.ZKCounters{ CumulativeGasUsed: cumulativeGasUsed, UsedKeccakHashes: usedKeccakHashes, UsedPoseidonHashes: usedPoseidonHashes, @@ -297,7 +297,7 @@ func (p *PostgresPoolStorage) GetTxs(ctx context.Context, filterStatus pool.TxSt // CountTransactionsByStatus get number of transactions // accordingly to the provided status func (p *PostgresPoolStorage) CountTransactionsByStatus(ctx context.Context, status pool.TxStatus) (uint64, error) { - sql := "SELECT COUNT(*) FROM pool.txs WHERE status = $1" + sql := "SELECT COUNT(*) FROM pool.transaction WHERE status = $1" var counter uint64 err := p.db.QueryRow(ctx, sql, status.String()).Scan(&counter) if err != nil { @@ -309,7 +309,7 @@ func (p *PostgresPoolStorage) CountTransactionsByStatus(ctx context.Context, sta // UpdateTxStatus updates a transaction status accordingly to the // provided status and hash func (p *PostgresPoolStorage) UpdateTxStatus(ctx context.Context, hash common.Hash, newStatus pool.TxStatus) error { - sql := "UPDATE pool.txs SET status = $1 WHERE hash = $2" + sql := "UPDATE pool.transaction SET status = $1 WHERE hash = $2" if _, err := p.db.Exec(ctx, sql, newStatus, hash.Hex()); err != nil { return err } @@ -318,7 +318,7 @@ func (p *PostgresPoolStorage) UpdateTxStatus(ctx context.Context, hash common.Ha // UpdateTxsStatus updates transactions status accordingly to the provided status and hashes func (p *PostgresPoolStorage) UpdateTxsStatus(ctx context.Context, hashes []string, newStatus pool.TxStatus) error { - sql := "UPDATE pool.txs SET status = $1 WHERE hash = ANY ($2)" + sql := "UPDATE pool.transaction SET status = $1 WHERE hash = ANY ($2)" if _, err := p.db.Exec(ctx, sql, newStatus, hashes); err != nil { return err } @@ -332,7 +332,7 @@ func (p *PostgresPoolStorage) DeleteTxsByHashes(ctx context.Context, hashes []co hh = append(hh, h.Hex()) } - query := "DELETE FROM pool.txs WHERE hash = ANY ($1)" + query := "DELETE FROM pool.transaction WHERE hash = ANY ($1)" if _, err := p.db.Exec(ctx, query, hh); err != nil { return err } @@ -376,7 +376,7 @@ func (p *PostgresPoolStorage) GetGasPrice(ctx context.Context) (uint64, error) { // not. func (p *PostgresPoolStorage) IsTxPending(ctx context.Context, hash common.Hash) (bool, error) { var exists bool - req := "SELECT exists (SELECT 1 FROM pool.txs WHERE hash = $1 AND status = $2)" + req := "SELECT exists (SELECT 1 FROM pool.transaction WHERE hash = $1 AND status = $2)" err := p.db.QueryRow(ctx, req, hash.Hex(), pool.TxStatusPending).Scan(&exists) if err != nil && err != sql.ErrNoRows { return false, err @@ -388,7 +388,7 @@ func (p *PostgresPoolStorage) IsTxPending(ctx context.Context, hash common.Hash) // GetTxsByFromAndNonce get all the transactions from the pool with the same from and nonce func (p *PostgresPoolStorage) GetTxsByFromAndNonce(ctx context.Context, from common.Address, nonce uint64) ([]pool.Transaction, error) { sql := `SELECT encoded, status, received_at - FROM pool.txs + FROM pool.transaction WHERE from_address = $1 AND nonce = $2` rows, err := p.db.Query(ctx, sql, from.String(), nonce) @@ -414,7 +414,7 @@ func (p *PostgresPoolStorage) GetTxsByFromAndNonce(ctx context.Context, from com // GetTxFromAddressFromByHash gets tx from address by hash func (p *PostgresPoolStorage) GetTxFromAddressFromByHash(ctx context.Context, hash common.Hash) (common.Address, uint64, error) { query := `SELECT from_address, nonce - FROM pool.txs + FROM pool.transaction WHERE hash = $1 ` @@ -432,7 +432,7 @@ func (p *PostgresPoolStorage) GetTxFromAddressFromByHash(ctx context.Context, ha // IncrementFailedCounter increment for failed txs failed counter func (p *PostgresPoolStorage) IncrementFailedCounter(ctx context.Context, hashes []string) error { - sql := "UPDATE pool.txs SET failed_counter = failed_counter + 1 WHERE hash = ANY ($1)" + sql := "UPDATE pool.transaction SET failed_counter = failed_counter + 1 WHERE hash = ANY ($1)" if _, err := p.db.Exec(ctx, sql, hashes); err != nil { return err } @@ -442,7 +442,7 @@ func (p *PostgresPoolStorage) IncrementFailedCounter(ctx context.Context, hashes // GetNonce gets the nonce to the provided address accordingly to the txs in the pool func (p *PostgresPoolStorage) GetNonce(ctx context.Context, address common.Address) (uint64, error) { sql := `SELECT MAX(nonce) - FROM pool.txs + FROM pool.transaction WHERE from_address = $1 AND (status = $2 OR status = $3)` rows, err := p.db.Query(ctx, sql, address.String(), pool.TxStatusPending, pool.TxStatusSelected) @@ -482,7 +482,7 @@ func (p *PostgresPoolStorage) GetTxByHash(ctx context.Context, hash common.Hash) ) sql := `SELECT encoded, status, received_at - FROM pool.txs + FROM pool.transaction WHERE hash = $1` err := p.db.QueryRow(ctx, sql, hash.String()).Scan(&encoded, &status, &receivedAt) if errors.Is(err, pgx.ErrNoRows) { @@ -533,3 +533,39 @@ func scanTx(rows pgx.Rows) (*pool.Transaction, error) { return tx, nil } + +// DeleteTransactionByHash deletes tx by its hash +func (p *PostgresPoolStorage) DeleteTransactionByHash(ctx context.Context, hash common.Hash) error { + query := "DELETE FROM pool.transaction WHERE hash = $1" + if _, err := p.db.Exec(ctx, query, hash); err != nil { + return err + } + return nil +} + +// GetTxZkCountersByHash gets a transaction zkcounters by its hash +func (p *PostgresPoolStorage) GetTxZkCountersByHash(ctx context.Context, hash common.Hash) (*state.ZKCounters, error) { + var zkCounters state.ZKCounters + + sql := `SELECT cumulative_gas_used, used_keccak_hashes, used_poseidon_hashes, used_poseidon_paddings, used_mem_aligns, + used_arithmetics, used_binaries, used_steps FROM pool.transaction WHERE hash = $1` + err := p.db.QueryRow(ctx, sql, hash.String()).Scan(&zkCounters.CumulativeGasUsed, &zkCounters.UsedKeccakHashes, + &zkCounters.UsedPoseidonHashes, &zkCounters.UsedPoseidonPaddings, + &zkCounters.UsedMemAligns, &zkCounters.UsedArithmetics, &zkCounters.UsedBinaries, &zkCounters.UsedSteps) + if errors.Is(err, pgx.ErrNoRows) { + return nil, ErrNotFound + } else if err != nil { + return nil, err + } + + return &zkCounters, nil +} + +// MarkWIPTxsAsPending updates WIP txs status to pending +func (p *PostgresPoolStorage) MarkWIPTxsAsPending(ctx context.Context) error { + const query = `UPDATE pool.transaction SET status = $1 WHERE status = $2` + if _, err := p.db.Exec(ctx, query, pool.TxStatusPending, pool.TxStatusWIP); err != nil { + return err + } + return nil +} diff --git a/pool/pool.go b/pool/pool.go index fc8bed2282..ff112fe030 100644 --- a/pool/pool.go +++ b/pool/pool.go @@ -27,7 +27,7 @@ const ( txMaxSize = 4 * txSlotSize // 128KB // bridgeClaimMethodSignature for tracking bridgeClaimMethodSignature method - bridgeClaimMethodSignature = "0x7b6323c1" + bridgeClaimMethodSignature = "0x2cffd02e" ) var ( @@ -248,6 +248,8 @@ func (p *Pool) checkTxFieldCompatibilityWithExecutor(ctx context.Context, tx typ // MarkReorgedTxsAsPending updated reorged txs status from selected to pending func (p *Pool) MarkReorgedTxsAsPending(ctx context.Context) error { + // TODO: Change status to "reorged" + // get selected transactions from pool selectedTxs, err := p.GetSelectedTxs(ctx, 0) if err != nil { @@ -274,3 +276,5 @@ func (p *Pool) MarkReorgedTxsAsPending(ctx context.Context) error { return nil } + +// TODO: Create a method for the synchronizer to update Tx Statuses to "pending" or "reorged" diff --git a/pool/pool_test.go b/pool/pool_test.go index eef67b4f37..1589fd1933 100644 --- a/pool/pool_test.go +++ b/pool/pool_test.go @@ -124,7 +124,7 @@ func Test_AddTx(t *testing.T) { t.Error(err) } - rows, err := poolSqlDB.Query(ctx, "SELECT hash, encoded, decoded, status FROM pool.txs") + rows, err := poolSqlDB.Query(ctx, "SELECT hash, encoded, decoded, status FROM pool.transaction") defer rows.Close() // nolint:staticcheck if err != nil { t.Error(err) @@ -215,7 +215,7 @@ func Test_AddPreEIP155Tx(t *testing.T) { err = p.AddTx(ctx, tx) require.NoError(t, err) - rows, err := poolSqlDB.Query(ctx, "SELECT hash, encoded, decoded, status FROM pool.txs") + rows, err := poolSqlDB.Query(ctx, "SELECT hash, encoded, decoded, status FROM pool.transaction") defer rows.Close() // nolint:staticcheck require.NoError(t, err) @@ -556,7 +556,7 @@ func Test_UpdateTxsStatus(t *testing.T) { } var count int - err = poolSqlDB.QueryRow(ctx, "SELECT COUNT(*) FROM pool.txs WHERE status = $1", pool.TxStatusInvalid).Scan(&count) + err = poolSqlDB.QueryRow(ctx, "SELECT COUNT(*) FROM pool.transaction WHERE status = $1", pool.TxStatusInvalid).Scan(&count) if err != nil { t.Error(err) } @@ -621,7 +621,7 @@ func Test_UpdateTxStatus(t *testing.T) { t.Error(err) } - rows, err := poolSqlDB.Query(ctx, "SELECT status FROM pool.txs WHERE hash = $1", signedTx.Hash().Hex()) + rows, err := poolSqlDB.Query(ctx, "SELECT status FROM pool.transaction WHERE hash = $1", signedTx.Hash().Hex()) defer rows.Close() // nolint:staticcheck if err != nil { t.Error(err) @@ -898,7 +898,7 @@ func Test_DeleteTxsByHashes(t *testing.T) { } var count int - err = poolSqlDB.QueryRow(ctx, "SELECT COUNT(*) FROM pool.txs").Scan(&count) + err = poolSqlDB.QueryRow(ctx, "SELECT COUNT(*) FROM pool.transaction").Scan(&count) if err != nil { t.Error(err) } diff --git a/pool/transaction.go b/pool/transaction.go index 8f4c480616..b585d4e79c 100644 --- a/pool/transaction.go +++ b/pool/transaction.go @@ -4,6 +4,7 @@ import ( "strings" "time" + "github.com/0xPolygonHermez/zkevm-node/state" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" ) @@ -13,10 +14,12 @@ const ( TxStatusPending TxStatus = "pending" // TxStatusInvalid represents an invalid tx TxStatusInvalid TxStatus = "invalid" - // TxStatusSelected represents a tx that has been selected + // TxStatusSelected represents a tx that has been selected TxStatusSelected TxStatus = "selected" // TxStatusFailed represents a tx that has been failed after processing, but can be processed in the future TxStatusFailed TxStatus = "failed" + // TxStatusWIP represents a tx that is in a sequencer worker memory + TxStatusWIP TxStatus = "wip" ) // TxStatus represents the state of a tx @@ -32,47 +35,11 @@ type Transaction struct { types.Transaction Status TxStatus IsClaims bool - ZkCounters + state.ZKCounters FailedCounter uint64 ReceivedAt time.Time } -// ZkCounters counters for the tx -type ZkCounters struct { - CumulativeGasUsed int64 - UsedKeccakHashes int32 - UsedPoseidonHashes int32 - UsedPoseidonPaddings int32 - UsedMemAligns int32 - UsedArithmetics int32 - UsedBinaries int32 - UsedSteps int32 -} - -// IsZkCountersBelowZero checks if any of the counters are below zero -func (zkc *ZkCounters) IsZkCountersBelowZero() bool { - return zkc.CumulativeGasUsed < 0 || - zkc.UsedArithmetics < 0 || - zkc.UsedSteps < 0 || - zkc.UsedBinaries < 0 || - zkc.UsedMemAligns < 0 || - zkc.UsedPoseidonPaddings < 0 || - zkc.UsedPoseidonHashes < 0 || - zkc.UsedKeccakHashes < 0 -} - -// SumUpZkCounters sum ups zk counters with passed tx zk counters -func (zkc *ZkCounters) SumUpZkCounters(txZkCounters ZkCounters) { - zkc.CumulativeGasUsed += txZkCounters.CumulativeGasUsed - zkc.UsedKeccakHashes += txZkCounters.UsedKeccakHashes - zkc.UsedPoseidonHashes += txZkCounters.UsedPoseidonHashes - zkc.UsedPoseidonPaddings += txZkCounters.UsedPoseidonPaddings - zkc.UsedMemAligns += txZkCounters.UsedMemAligns - zkc.UsedArithmetics += txZkCounters.UsedArithmetics - zkc.UsedBinaries += txZkCounters.UsedBinaries - zkc.UsedSteps += txZkCounters.UsedSteps -} - // IsClaimTx checks, if tx is a claim tx func (tx *Transaction) IsClaimTx(l2BridgeAddr common.Address, freeClaimGasLimit uint64) bool { if tx.To() == nil { diff --git a/sequencer/addrqueue.go b/sequencer/addrqueue.go new file mode 100644 index 0000000000..fe2afa133b --- /dev/null +++ b/sequencer/addrqueue.go @@ -0,0 +1,156 @@ +package sequencer + +import ( + "math/big" + + "github.com/0xPolygonHermez/zkevm-node/state" + "github.com/ethereum/go-ethereum/common" +) + +// addrQueue is a struct that stores the ready and notReady txs for a specific from address +type addrQueue struct { + from common.Address + fromStr string + currentNonce uint64 + currentBalance *big.Int + readyTx *TxTracker + notReadyTxs map[uint64]*TxTracker +} + +// newAddrQueue creates and init a addrQueue +func newAddrQueue(addr common.Address, nonce uint64, balance *big.Int) *addrQueue { + return &addrQueue{ + from: addr, + fromStr: addr.String(), + currentNonce: nonce, + currentBalance: balance, + readyTx: nil, + notReadyTxs: make(map[uint64]*TxTracker), + } +} + +// addTx adds a tx to the addrQueue and updates the ready a notReady Txs +func (a *addrQueue) addTx(tx *TxTracker) (newReadyTx, prevReadyTx *TxTracker) { + if a.currentNonce == tx.Nonce { // Is a possible readyTx + // We set the tx as readyTx if we do not have one assigned or if the gasPrice is better or equal than the current readyTx + if a.readyTx == nil || ((a.readyTx != nil) && (tx.GasPrice.Cmp(a.readyTx.GasPrice) >= 0)) { + oldReadyTx := a.readyTx + if a.currentBalance.Cmp(tx.Cost) >= 0 { // + a.readyTx = tx + return tx, oldReadyTx + } else { // If there is not enought balance we set the new tx as notReadyTxs + a.readyTx = nil + a.notReadyTxs[tx.Nonce] = tx + return nil, oldReadyTx + } + } + } else { + // TODO: how to manage if the tx.Nonce < currentNonce, we add it to notReady? if not, we need to update in DB? + // We add the tx to the notReadyTxs list if it does not exists or if it already exists but has a better gasPrice + nrTx, found := a.notReadyTxs[tx.Nonce] + if !found || ((found) && (tx.GasPrice.Cmp(nrTx.GasPrice) >= 0)) { + a.notReadyTxs[tx.Nonce] = tx + } + } + + return nil, nil +} + +// deleteTx deletes the tx from the addrQueue +func (a *addrQueue) deleteTx(txHash common.Hash) (deletedReadyTx *TxTracker) { + txHashStr := txHash.String() + + if (a.readyTx != nil) && (a.readyTx.HashStr == txHashStr) { + prevReadyTx := a.readyTx + a.readyTx = nil + return prevReadyTx + } else { + for _, txTracker := range a.notReadyTxs { + if txTracker.HashStr == txHashStr { + delete(a.notReadyTxs, txTracker.Nonce) + break + } + } + return nil + } +} + +// updateCurrentNonceBalance updates the nonce and balance of the addrQueue and updates the ready and notReady txs +func (a *addrQueue) updateCurrentNonceBalance(nonce *uint64, balance *big.Int) (newReadyTx, prevReadyTx *TxTracker) { + var oldReadyTx *TxTracker = nil + + if balance != nil { + a.currentBalance = balance + } + + if nonce != nil { + if a.currentNonce != *nonce { + a.currentNonce = *nonce + + //TODO: we need to update in the DB the deleted txs? + txToDelete := []uint64{} + for _, txTracker := range a.notReadyTxs { + if txTracker.Nonce < a.currentNonce { + txToDelete = append(txToDelete, txTracker.Nonce) + } + } + for _, delTxNonce := range txToDelete { + delete(a.notReadyTxs, delTxNonce) + } + } + } + + if a.readyTx != nil { + // If readyTX.nonce is not the currentNonce or currentBalance is less that the readyTx.Cost + // set readyTx=nil. Later we will move the tx to notReadyTxs + if (a.readyTx.Nonce != a.currentNonce) || (a.currentBalance.Cmp(a.readyTx.Cost) < 0) { + oldReadyTx = a.readyTx + a.readyTx = nil + } + } + + // We check if we have a new readyTx from the notReadyTxs (at this point, to optmize the code, + // we are not including the oldReadyTx in notReadyTxs, as it can match again if the nonce has not changed) + if a.readyTx == nil { + nrTx, found := a.notReadyTxs[a.currentNonce] + if found { + if a.currentBalance.Cmp(nrTx.Cost) >= 0 { + a.readyTx = nrTx + delete(a.notReadyTxs, a.currentNonce) + } + } + } + + // We add the oldReadyTx to notReadyTxs (if it has a valid nonce) at this point to avoid check it again in the previous if statement + if oldReadyTx != nil && oldReadyTx.Nonce > a.currentNonce { + a.notReadyTxs[oldReadyTx.Nonce] = oldReadyTx + } + + return a.readyTx, oldReadyTx +} + +// UpdateTxZKCounters updates the ZKCounters for the given tx (txHash) +// If the updated tx is the readyTx it returns a copy of the previous readyTx, nil otherwise +func (a *addrQueue) UpdateTxZKCounters(txHash common.Hash, counters state.ZKCounters, constraints batchConstraints, weights batchResourceWeights) (newReadyTx, prevReadyTx *TxTracker) { + txHashStr := txHash.String() + + if (a.readyTx != nil) && (a.readyTx.HashStr == txHashStr) { + // We need to assign the new readyTx as a new TxTracker copy of the previous one with the updated efficiency + // We need to do in this way because the efficiency value is changed and we use this value as key field to + // add/delete TxTrackers in the efficiencyList + prevReadyTx := a.readyTx + newReadyTx := *a.readyTx + newReadyTx.updateZKCounters(counters, constraints, weights) + a.readyTx = &newReadyTx + return a.readyTx, prevReadyTx + } else { // TODO: This makes sense or we need only to check the readyTx + txHashStr := txHash.String() + for _, txTracker := range a.notReadyTxs { + if txTracker.HashStr == txHashStr { + txTracker.updateZKCounters(counters, constraints, weights) + break + } + } + return nil, nil + } +} diff --git a/sequencer/addrqueue_test.go b/sequencer/addrqueue_test.go new file mode 100644 index 0000000000..6e02d22827 --- /dev/null +++ b/sequencer/addrqueue_test.go @@ -0,0 +1,153 @@ +package sequencer + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" +) + +type notReadyTx struct { + nonce uint64 + hash common.Hash +} + +type addrQueueAddTxTestCase struct { + name string + hash common.Hash + nonce uint64 + gasPrice *big.Int + cost *big.Int + expectedReadyTx common.Hash + expectedNotReadyTx []notReadyTx +} + +var addr addrQueue + +func newTestTxTracker(hash common.Hash, nonce uint64, gasPrice *big.Int, cost *big.Int) *TxTracker { + tx := TxTracker{Hash: hash, Nonce: nonce, GasPrice: gasPrice, Cost: cost} + tx.HashStr = tx.Hash.String() + return &tx +} + +func processAddTxTestCases(t *testing.T, testCases []addrQueueAddTxTestCase) { + var emptyHash common.Hash = common.Hash{} + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + tx := newTestTxTracker(tc.hash, tc.nonce, tc.gasPrice, tc.cost) + newReadyTx, _ := addr.addTx(tx) + if tc.expectedReadyTx.String() == emptyHash.String() { + if !(addr.readyTx == nil) { + t.Fatalf("Error readyTx. Expected=%s, Actual=%s", tc.expectedReadyTx, "") + } + if !(newReadyTx == nil) { + t.Fatalf("Error newReadyTx. Expected=nil, Actual=%s", newReadyTx.HashStr) + } + } else { + if !(addr.readyTx.Hash == tc.expectedReadyTx) { + t.Fatalf("Error readyTx. Expected=%s, Actual=%s", tc.expectedReadyTx, addr.readyTx.HashStr) + } + } + + for _, nr := range tc.expectedNotReadyTx { + txTmp, found := addr.notReadyTxs[nr.nonce] + if !(found) { + t.Fatalf("Error notReadyTx nonce=%d don't exists", nr.nonce) + } + if !(txTmp.Hash == nr.hash) { + t.Fatalf("Error notReadyTx nonce=%d. Expected=%s, Actual=%s", nr.nonce, nr.hash.String(), txTmp.HashStr) + } + } + }) + } +} + +func TestAddrQueue(t *testing.T) { + addr = addrQueue{fromStr: "0x99999", currentNonce: 1, currentBalance: new(big.Int).SetInt64(10), notReadyTxs: make(map[uint64]*TxTracker)} + + addTxTestCases := []addrQueueAddTxTestCase{ + { + name: "Add not ready tx 0x02", hash: common.Hash{0x2}, nonce: 2, gasPrice: new(big.Int).SetInt64(2), cost: new(big.Int).SetInt64(5), + expectedReadyTx: common.Hash{}, + expectedNotReadyTx: []notReadyTx{ + {nonce: 2, hash: common.Hash{0x2}}, + }, + }, + { + name: "Add ready tx 0x01", hash: common.Hash{0x1}, nonce: 1, gasPrice: new(big.Int).SetInt64(2), cost: new(big.Int).SetInt64(5), + expectedReadyTx: common.Hash{1}, + expectedNotReadyTx: []notReadyTx{ + {nonce: 2, hash: common.Hash{0x2}}, + }, + }, + { + name: "Add not ready tx 0x04", hash: common.Hash{0x4}, nonce: 4, gasPrice: new(big.Int).SetInt64(2), cost: new(big.Int).SetInt64(5), + expectedReadyTx: common.Hash{1}, + expectedNotReadyTx: []notReadyTx{ + {nonce: 2, hash: common.Hash{0x2}}, + {nonce: 4, hash: common.Hash{0x4}}, + }, + }, + { + name: "Replace tx with nonce 4 for tx 0x44 with best GasPrice", hash: common.Hash{0x44}, nonce: 4, gasPrice: new(big.Int).SetInt64(3), cost: new(big.Int).SetInt64(5), + expectedReadyTx: common.Hash{1}, + expectedNotReadyTx: []notReadyTx{ + {nonce: 2, hash: common.Hash{0x2}}, + {nonce: 4, hash: common.Hash{0x44}}, + }, + }, + } + + processAddTxTestCases(t, addTxTestCases) + + t.Run("Delete readyTx 0x01", func(t *testing.T) { + tc := addTxTestCases[1] + tx := newTestTxTracker(tc.hash, tc.nonce, tc.gasPrice, tc.cost) + deltx := addr.deleteTx(tx.Hash) + if !(addr.readyTx == nil) { + t.Fatalf("Error readyTx not nil. Expected=%s, Actual=%s", "", addr.readyTx.HashStr) + } + if !(deltx.HashStr == tx.HashStr) { + t.Fatalf("Error returning deletedReadyTx. Expected=%s, Actual=%s", tx.HashStr, deltx.HashStr) + } + }) + + processAddTxTestCases(t, []addrQueueAddTxTestCase{ + { + name: "Add tx with nonce = currentNonce but with cost > currentBalance", hash: common.Hash{0x11}, nonce: 1, gasPrice: new(big.Int).SetInt64(2), cost: new(big.Int).SetInt64(15), + expectedReadyTx: common.Hash{}, + expectedNotReadyTx: []notReadyTx{ + {nonce: 1, hash: common.Hash{0x11}}, + {nonce: 2, hash: common.Hash{0x2}}, + {nonce: 4, hash: common.Hash{0x44}}, + }, + }, + }) + + t.Run("Update currentBalance = 15, set tx 0x11 as ready", func(t *testing.T) { + tmpHash := common.Hash{0x11} + addr.updateCurrentNonceBalance(&addr.currentNonce, new(big.Int).SetInt64(15)) + if !(addr.readyTx != nil && addr.readyTx.Hash.String() == tmpHash.String()) { + t.Fatalf("Error readyTx. Expected=%s, Actual=%s", tmpHash, "") + } + + tx, found := addr.notReadyTxs[1] + + if found { + t.Fatalf("Error notReadyTx nonce=%d. Expected=%s, Actual=%s", addr.currentNonce, "", tx.Hash.String()) + } + }) + + t.Run("Update currentNonce = 4, set tx 0x04 as ready", func(t *testing.T) { + tmpHash := common.Hash{0x44} + newNonce := uint64(4) + addr.updateCurrentNonceBalance(&newNonce, new(big.Int).SetInt64(15)) + if !(addr.readyTx != nil && addr.readyTx.Hash.String() == tmpHash.String()) { + t.Fatalf("Error readyTx. Expected=%s, Actual=%s", tmpHash, addr.readyTx.Hash.String()) + } + + if len(addr.notReadyTxs) > 0 { + t.Fatalf("Error notReadyTx not empty. Expected=%d, Actual=%d", 0, len(addr.notReadyTxs)) + } + }) +} diff --git a/sequencer/batchbuilder.go b/sequencer/batchbuilder.go deleted file mode 100644 index 24b1fda937..0000000000 --- a/sequencer/batchbuilder.go +++ /dev/null @@ -1,560 +0,0 @@ -package sequencer - -import ( - "context" - "errors" - "fmt" - "math" - "time" - - "github.com/0xPolygonHermez/zkevm-node/etherman/types" - "github.com/0xPolygonHermez/zkevm-node/log" - "github.com/0xPolygonHermez/zkevm-node/pool" - "github.com/0xPolygonHermez/zkevm-node/pool/pgpoolstorage" - "github.com/0xPolygonHermez/zkevm-node/sequencer/metrics" - "github.com/0xPolygonHermez/zkevm-node/state" - "github.com/ethereum/go-ethereum/common" - ethTypes "github.com/ethereum/go-ethereum/core/types" - "github.com/jackc/pgx/v4" -) - -type processTxResponse struct { - processedTxs []*state.ProcessTransactionResponse - processedTxsHashes []string - unprocessedTxs map[string]*state.ProcessTransactionResponse - unprocessedTxsHashes []string - isBatchProcessed bool -} - -func (s *Sequencer) tryToProcessTx(ctx context.Context, ticker *time.Ticker) { - start := time.Now() - defer s.observeProcessingTime(start) - - // Check if synchronizer is up to date - if !s.isSynced(ctx) { - log.Info("wait for synchronizer to sync last batch") - waitTick(ctx, ticker) - return - } - log.Info("synchronizer has synced last batch, checking if current sequence should be closed") - - // Check if sequence should be close - log.Infof("checking if current sequence should be closed") - if s.shouldCloseSequenceInProgress(ctx) { - log.Infof("current sequence should be closed") - err := s.closeSequence(ctx) - if err != nil { - log.Errorf("error closing sequence: %w", err) - log.Info("resetting sequence in progress") - if err = s.loadSequenceFromState(ctx); err != nil { - log.Errorf("error loading sequence from state: %w", err) - } - return - } - } - - // backup current sequence - sequenceBeforeTryingToProcessNewTxs := s.backupSequence() - - getTxsLimit := s.cfg.MaxTxsPerBatch - uint64(len(s.sequenceInProgress.Txs)) - - minGasPrice, err := s.pool.GetGasPrice(ctx) - metrics.AverageGasPrice(float64(minGasPrice)) - if err != nil { - log.Errorf("failed to get avg gas price, err: %w", err) - return - } - - // get txs from the pool - appendedClaimsTxsAmount := s.appendPendingTxs(ctx, true, 0, getTxsLimit, ticker) - appendedTxsAmount := s.appendPendingTxs(ctx, false, minGasPrice, getTxsLimit-appendedClaimsTxsAmount, ticker) + appendedClaimsTxsAmount - - if appendedTxsAmount == 0 { - return - } - // clear txs if it bigger than expected - err = s.cleanTxsIfTxsDataIsBiggerThanExpected(ctx, ticker) - if err != nil { - return - } - // process batch - log.Infof("processing batch with %d txs. %d txs are new from this iteration", len(s.sequenceInProgress.Txs), appendedTxsAmount) - processResponse, err := s.processTxs(ctx) - if err != nil { - s.sequenceInProgress = sequenceBeforeTryingToProcessNewTxs - log.Errorf("failed to process txs, err: %w", err) - return - } - - // reprocess the batch until: - // - all the txs in it are processed, so the batch doesn't include invalid txs - // - the batch is processed (certain situations may cause the entire batch to not have effect on the state) - unprocessedTxs, err := s.reprocessBatch(ctx, processResponse, sequenceBeforeTryingToProcessNewTxs) - if err != nil { - return - } - - log.Infof("%d txs processed successfully", len(processResponse.processedTxsHashes)) - - // If after processing new txs the sequence is equal or smaller, revert changes and close sequence - if len(s.sequenceInProgress.Txs) <= len(sequenceBeforeTryingToProcessNewTxs.Txs) && len(s.sequenceInProgress.Txs) > 0 { - log.Infof( - "current sequence should be closed because after trying to add txs to it, it went from having %d valid txs to %d", - len(sequenceBeforeTryingToProcessNewTxs.Txs), len(s.sequenceInProgress.Txs), - ) - s.sequenceInProgress = sequenceBeforeTryingToProcessNewTxs - if err := s.closeSequence(ctx); err != nil { - log.Errorf("error closing sequence: %w", err) - } - return - } - - // only save in DB processed transactions. - err = s.storeProcessedTransactions(ctx, processResponse.processedTxs) - if err != nil { - s.sequenceInProgress = sequenceBeforeTryingToProcessNewTxs - log.Errorf("failed to store processed txs, err: %w", err) - return - } - log.Infof("%d txs stored and added into the trusted state", len(processResponse.processedTxs)) - - s.updateTxsInPool(ctx, ticker, processResponse, unprocessedTxs) -} - -func (s *Sequencer) observeProcessingTime(start time.Time) { - elapsed := time.Since(start) - metrics.ProcessingTime(elapsed) -} - -func (s *Sequencer) updateTxsInPool( - ctx context.Context, - ticker *time.Ticker, - processResponse processTxResponse, - unprocessedTxs map[string]*state.ProcessTransactionResponse, -) { - invalidTxsHashes, failedTxsHashes := s.splitInvalidAndFailedTxs(ctx, unprocessedTxs, ticker) - - metrics.TxProcessed(metrics.TxProcessedLabelSuccessful, float64(len(processResponse.processedTxsHashes))) - metrics.TxProcessed(metrics.TxProcessedLabelInvalid, float64(len(invalidTxsHashes))) - metrics.TxProcessed(metrics.TxProcessedLabelFailed, float64(len(failedTxsHashes))) - - // update processed txs - s.updateTxsStatus(ctx, ticker, processResponse.processedTxsHashes, pool.TxStatusSelected) - // update invalid txs - s.updateTxsStatus(ctx, ticker, invalidTxsHashes, pool.TxStatusInvalid) - // update failed txs - s.updateTxsStatus(ctx, ticker, failedTxsHashes, pool.TxStatusFailed) - // increment counter for failed txs - s.incrementFailedCounter(ctx, ticker, failedTxsHashes) -} - -func (s *Sequencer) reprocessBatch(ctx context.Context, processResponse processTxResponse, sequenceBeforeTryingToProcessNewTxs types.Sequence) (map[string]*state.ProcessTransactionResponse, error) { - unprocessedTxs := processResponse.unprocessedTxs - var err error - for !processResponse.isBatchProcessed || len(processResponse.unprocessedTxs) > 0 { - // include only processed txs in the sequence - s.sequenceInProgress.Txs = make([]ethTypes.Transaction, 0, len(processResponse.processedTxs)) - for i := 0; i < len(processResponse.processedTxs); i++ { - s.sequenceInProgress.Txs = append(s.sequenceInProgress.Txs, processResponse.processedTxs[i].Tx) - } - - if len(s.sequenceInProgress.Txs) == 0 { - log.Infof("sequence in progress doesn't have txs, no need to send a batch") - break - } - log.Infof("failed to process batch or invalid txs. Retrying with %d txs", len(s.sequenceInProgress.Txs)) - // reprocess - processResponse, err = s.processTxs(ctx) - if err != nil { - s.sequenceInProgress = sequenceBeforeTryingToProcessNewTxs - log.Errorf("failed to reprocess txs, err: %w", err) - return unprocessedTxs, err - } - if len(processResponse.processedTxsHashes) != 0 { - for _, hash := range processResponse.processedTxsHashes { - delete(unprocessedTxs, hash) - } - } - for _, txHash := range processResponse.unprocessedTxsHashes { - if _, ok := unprocessedTxs[txHash]; !ok { - unprocessedTxs[txHash] = processResponse.unprocessedTxs[txHash] - } - } - } - - return unprocessedTxs, nil -} - -func (s *Sequencer) cleanTxsIfTxsDataIsBiggerThanExpected(ctx context.Context, ticker *time.Ticker) error { - encodedTxsBytesSize := math.MaxInt - numberOfTxsInProcess := len(s.sequenceInProgress.Txs) - for encodedTxsBytesSize > s.cfg.MaxBatchBytesSize && numberOfTxsInProcess > 0 { - encodedTxs, err := state.EncodeTransactions(s.sequenceInProgress.Txs) - if err != nil { - log.Errorf("failed to encode txs, err: %w", err) - return err - } - encodedTxsBytesSize = len(encodedTxs) - if encodedTxsBytesSize > s.cfg.MaxBatchBytesSize && numberOfTxsInProcess > 0 { - // if only one tx overflows, that it means, tx is invalid - if numberOfTxsInProcess == 1 { - err = s.pool.UpdateTxStatus(ctx, s.sequenceInProgress.Txs[0].Hash(), pool.TxStatusInvalid) - for err != nil { - log.Errorf("failed to update tx with hash: %s to status: %s", - s.sequenceInProgress.Txs[0].Hash().String(), pool.TxStatusInvalid) - err = s.pool.UpdateTxStatus(ctx, s.sequenceInProgress.Txs[0].Hash(), pool.TxStatusInvalid) - waitTick(ctx, ticker) - } - } - log.Infof("decreasing amount of sent txs, bcs encodedTxsBytesSize > maxBatchBytesSize, encodedTxsBytesSize: %d, maxBatchBytesSize: %d", - encodedTxsBytesSize, s.cfg.MaxBatchBytesSize) - s.sequenceInProgress.Txs = s.sequenceInProgress.Txs[:numberOfTxsInProcess-1] - updatedNumberTxsInProgress := len(s.sequenceInProgress.Txs) - if updatedNumberTxsInProgress != 0 { - s.sequenceInProgress.IsSequenceTooBig = true - } - numberOfTxsInProcess = updatedNumberTxsInProgress - } - } - return nil -} - -func (s *Sequencer) splitInvalidAndFailedTxs(ctx context.Context, unprocessedTxs map[string]*state.ProcessTransactionResponse, ticker *time.Ticker) ([]string, []string) { - invalidTxsHashes := []string{} - failedTxsHashes := []string{} - for _, tx := range unprocessedTxs { - isTxNonceLessThanAccountNonce, err := s.isTxNonceLessThanAccountNonce(ctx, tx) - for err != nil { - log.Errorf("failed to compare account nonce and tx nonce, err: %w", err) - isTxNonceLessThanAccountNonce, err = s.isTxNonceLessThanAccountNonce(ctx, tx) - waitTick(ctx, ticker) - } - if isTxNonceLessThanAccountNonce { - log.Infof("tx with hash %s is invalid, account nonce > tx nonce") - invalidTxsHashes = append(invalidTxsHashes, tx.Tx.Hash().String()) - } else { - failedTxsHashes = append(failedTxsHashes, tx.Tx.Hash().String()) - } - } - - return invalidTxsHashes, failedTxsHashes -} - -func (s *Sequencer) updateTxsStatus(ctx context.Context, ticker *time.Ticker, hashes []string, status pool.TxStatus) { - if len(hashes) == 0 { - return - } - err := s.pool.UpdateTxsStatus(ctx, hashes, status) - for err != nil { - log.Errorf("failed to update txs status to %s, err: %w", status, err) - waitTick(ctx, ticker) - err = s.pool.UpdateTxsStatus(ctx, hashes, status) - } -} - -func (s *Sequencer) incrementFailedCounter(ctx context.Context, ticker *time.Ticker, hashes []string) { - if len(hashes) == 0 { - return - } - err := s.pool.IncrementFailedCounter(ctx, hashes) - for err != nil { - log.Errorf("failed to increment failed tx counter, err: %w", err) - waitTick(ctx, ticker) - err = s.pool.IncrementFailedCounter(ctx, hashes) - } -} - -func (s *Sequencer) isTxNonceLessThanAccountNonce(ctx context.Context, tx *state.ProcessTransactionResponse) (bool, error) { - fromAddr, txNonce, err := s.pool.GetTxFromAddressFromByHash(ctx, tx.Tx.Hash()) - if err != nil { - return false, fmt.Errorf("failed to get from addr, err: %w", err) - } - - lastL2BlockNumber, err := s.state.GetLastL2BlockNumber(ctx, nil) - if err != nil { - return false, fmt.Errorf("failed to get last l2 block number, err: %w", err) - } - - accNonce, err := s.state.GetNonce(ctx, fromAddr, lastL2BlockNumber, nil) - if err != nil { - return false, fmt.Errorf("failed to get nonce for the account, err: %w", err) - } - - return txNonce < accNonce, nil -} - -func (s *Sequencer) newSequence(ctx context.Context) (types.Sequence, error) { - var ( - dbTx pgx.Tx - err error - ) - - // It is necessary to pass the batch without txs to the executor in order to update the State - if len(s.sequenceInProgress.Txs) == 0 { - // backup current sequence - sequenceBeforeTryingToProcessNewTxs := s.backupSequence() - _, err = s.processTxs(ctx) - for err != nil { - s.sequenceInProgress = sequenceBeforeTryingToProcessNewTxs - log.Errorf("failed to process txs, err: %w", err) - _, err = s.processTxs(ctx) - } - } - - if s.sequenceInProgress.StateRoot.String() == "" || s.sequenceInProgress.LocalExitRoot.String() == "" { - return types.Sequence{}, errors.New("state root and local exit root must have value to close batch") - } - dbTx, err = s.state.BeginStateTransaction(ctx) - if err != nil { - return types.Sequence{}, fmt.Errorf("failed to begin state transaction to close batch, err: %w", err) - } - - lastBatchNumber, err := s.state.GetLastBatchNumber(ctx, dbTx) - if err != nil { - return types.Sequence{}, fmt.Errorf("failed to get last batch number, err: %w", err) - } - err = s.closeBatch(ctx, lastBatchNumber, dbTx) - if err != nil { - if rollbackErr := dbTx.Rollback(ctx); rollbackErr != nil { - return types.Sequence{}, fmt.Errorf( - "failed to rollback dbTx when closing batch that gave err: %s. Rollback err: %w", - rollbackErr.Error(), err, - ) - } - return types.Sequence{}, err - } - // open next batch - gerHash, _, err := s.getLatestGer(ctx, dbTx) - if err != nil { - if rollbackErr := dbTx.Rollback(ctx); rollbackErr != nil { - return types.Sequence{}, fmt.Errorf( - "failed to rollback dbTx when getting last GER that gave err: %s. Rollback err: %s", - rollbackErr.Error(), err.Error(), - ) - } - return types.Sequence{}, err - } - - processingCtx, err := s.openBatch(ctx, gerHash.GlobalExitRoot, dbTx) - if err != nil { - if rollbackErr := dbTx.Rollback(ctx); rollbackErr != nil { - return types.Sequence{}, fmt.Errorf( - "failed to rollback dbTx when getting last batch num that gave err: %s. Rollback err: %s", - rollbackErr.Error(), err.Error(), - ) - } - return types.Sequence{}, err - } - if err := dbTx.Commit(ctx); err != nil { - return types.Sequence{}, err - } - return types.Sequence{ - GlobalExitRoot: processingCtx.GlobalExitRoot, - Timestamp: processingCtx.Timestamp.Unix(), - Txs: []ethTypes.Transaction{}, - BatchNumber: processingCtx.BatchNumber, - }, nil -} - -func (s *Sequencer) closeSequence(ctx context.Context) error { - newSequence, err := s.newSequence(ctx) - if err != nil { - return fmt.Errorf("failed to create new sequence, err: %w", err) - } - s.sequenceInProgress = newSequence - return nil -} - -func (s *Sequencer) processTxs(ctx context.Context) (processTxResponse, error) { - dbTx, err := s.state.BeginStateTransaction(ctx) - if err != nil { - log.Errorf("failed to begin state transaction for processing tx, err: %w", err) - return processTxResponse{}, err - } - - lastBatchNumber, err := s.state.GetLastBatchNumber(ctx, dbTx) - if err != nil { - log.Errorf("failed to get last batch number, err: %w", err) - return processTxResponse{}, err - } - - processBatchResp, err := s.state.ProcessSequencerBatch(ctx, lastBatchNumber, s.sequenceInProgress.Txs, dbTx, state.SequencerCallerLabel) - if err != nil { - if err == state.ErrBatchAlreadyClosed || err == state.ErrInvalidBatchNumber { - log.Warnf("unexpected state local vs DB: %w", err) - log.Info("reloading local sequence") - errLoadSeq := s.loadSequenceFromState(ctx) - if errLoadSeq != nil { - log.Errorf("error loading sequence from state: %w", errLoadSeq) - } - } - if rollbackErr := dbTx.Rollback(ctx); rollbackErr != nil { - log.Errorf( - "failed to rollback dbTx when processing tx that gave err: %w. Rollback err: %v", - rollbackErr, err, - ) - return processTxResponse{}, err - } - log.Errorf("failed processing batch, err: %v", err) - return processTxResponse{}, err - } - - if err := dbTx.Commit(ctx); err != nil { - log.Errorf("failed to commit dbTx when processing tx, err: %w", err) - return processTxResponse{}, err - } - - s.sequenceInProgress.StateRoot = processBatchResp.NewStateRoot - s.sequenceInProgress.LocalExitRoot = processBatchResp.NewLocalExitRoot - s.sequenceInProgress.AccInputHash = processBatchResp.NewAccInputHash - - processedTxs, processedTxsHashes, unprocessedTxs, unprocessedTxsHashes := state.DetermineProcessedTransactions(processBatchResp.Responses) - - response := processTxResponse{ - processedTxs: processedTxs, - processedTxsHashes: processedTxsHashes, - unprocessedTxs: unprocessedTxs, - unprocessedTxsHashes: unprocessedTxsHashes, - isBatchProcessed: processBatchResp.IsBatchProcessed, - } - - return response, nil -} - -func (s *Sequencer) storeProcessedTransactions(ctx context.Context, processedTxs []*state.ProcessTransactionResponse) error { - dbTx, err := s.state.BeginStateTransaction(ctx) - if err != nil { - log.Errorf("failed to begin state transaction for StoreTransactions, err: %w", err) - return err - } - - lastBatchNumber, err := s.state.GetLastBatchNumber(ctx, dbTx) - if err != nil { - log.Errorf("failed to get last batch number, err: %w", err) - return err - } - - err = s.state.StoreTransactions(ctx, lastBatchNumber, processedTxs, dbTx) - if err != nil { - s.sequenceInProgress.Txs = s.sequenceInProgress.Txs[:len(s.sequenceInProgress.Txs)-len(processedTxs)] - if rollbackErr := dbTx.Rollback(ctx); rollbackErr != nil { - log.Errorf( - "failed to rollback dbTx when StoreTransactions that gave err: %w. Rollback err: %w", - rollbackErr, err, - ) - return err - } - log.Errorf("failed to store transactions, err: %w", err) - if err == state.ErrOutOfOrderProcessedTx || err == state.ErrExistingTxGreaterThanProcessedTx { - err = s.loadSequenceFromState(ctx) - if err != nil { - log.Errorf("failed to load sequence from state, err: %w", err) - } - } - return err - } - - if err := dbTx.Commit(ctx); err != nil { - log.Errorf("failed to commit dbTx when StoreTransactions, err: %w", err) - return err - } - - return nil -} - -func (s *Sequencer) closeBatch(ctx context.Context, lastBatchNumber uint64, dbTx pgx.Tx) error { - receipt := state.ProcessingReceipt{ - BatchNumber: lastBatchNumber, - AccInputHash: s.sequenceInProgress.AccInputHash, - StateRoot: s.sequenceInProgress.StateRoot, - LocalExitRoot: s.sequenceInProgress.LocalExitRoot, - Txs: s.sequenceInProgress.Txs, - } - err := s.state.CloseBatch(ctx, receipt, dbTx) - if err != nil { - return fmt.Errorf("failed to close batch, err: %w", err) - } - - return nil -} - -func (s *Sequencer) getLatestGer(ctx context.Context, dbTx pgx.Tx) (state.GlobalExitRoot, time.Time, error) { - lastBlockNumber, err := s.etherman.GetLatestBlockNumber(ctx) - if err != nil { - return state.GlobalExitRoot{}, time.Time{}, fmt.Errorf("failed to get latest eth block number, err: %w", err) - } - maxBlockNumber := lastBlockNumber - s.cfg.WaitBlocksToConsiderGerFinal - ger, receivedAt, err := s.state.GetLatestGlobalExitRoot(ctx, maxBlockNumber, dbTx) - if err != nil && errors.Is(err, state.ErrNotFound) { - return state.GlobalExitRoot{}, time.Time{}, nil - } else if err != nil { - return state.GlobalExitRoot{}, time.Time{}, fmt.Errorf("failed to get latest global exit root, err: %w", err) - } else { - return ger, receivedAt, nil - } -} - -func (s *Sequencer) openBatch(ctx context.Context, gerHash common.Hash, dbTx pgx.Tx) (state.ProcessingContext, error) { - lastBatchNum, err := s.state.GetLastBatchNumber(ctx, nil) - if err != nil { - return state.ProcessingContext{}, fmt.Errorf("failed to get last batch number, err: %w", err) - } - newBatchNum := lastBatchNum + 1 - processingCtx := state.ProcessingContext{ - BatchNumber: newBatchNum, - Coinbase: s.address, - Timestamp: time.Now(), - GlobalExitRoot: gerHash, - } - err = s.state.OpenBatch(ctx, processingCtx, dbTx) - if err != nil { - return state.ProcessingContext{}, fmt.Errorf("failed to open new batch, err: %w", err) - } - - return processingCtx, nil -} - -func (s *Sequencer) appendPendingTxs(ctx context.Context, isClaims bool, minGasPrice, getTxsLimit uint64, ticker *time.Ticker) uint64 { - pendTxs, err := s.pool.GetTxs(ctx, pool.TxStatusPending, isClaims, minGasPrice, getTxsLimit) - if err == pgpoolstorage.ErrNotFound || len(pendTxs) == 0 { - pendTxs, err = s.pool.GetTxs(ctx, pool.TxStatusFailed, isClaims, minGasPrice, getTxsLimit) - if err == pgpoolstorage.ErrNotFound || len(pendTxs) == 0 { - log.Infof("there is no suitable pending or failed txs in the pool, isClaims: %t, minGasPrice: %d, waiting...", isClaims, minGasPrice) - if !isClaims { - waitTick(ctx, ticker) - } - return 0 - } - } else if err != nil { - log.Errorf("failed to get pending tx, err: %w", err) - return 0 - } - var invalidTxsCounter int - for i := 0; i < len(pendTxs); i++ { - if pendTxs[i].FailedCounter > s.cfg.MaxAllowedFailedCounter { - hash := pendTxs[i].Transaction.Hash().String() - log.Warnf("mark tx with hash %s as invalid, failed counter %d exceeded max %d from config", - hash, pendTxs[i].FailedCounter, s.cfg.MaxAllowedFailedCounter) - s.updateTxsStatus(ctx, ticker, []string{hash}, pool.TxStatusInvalid) - invalidTxsCounter++ - continue - } - s.sequenceInProgress.Txs = append(s.sequenceInProgress.Txs, pendTxs[i].Transaction) - } - - return uint64(len(pendTxs) - invalidTxsCounter) -} - -func (s *Sequencer) backupSequence() types.Sequence { - backupSequence := types.Sequence{ - GlobalExitRoot: s.sequenceInProgress.GlobalExitRoot, - StateRoot: s.sequenceInProgress.StateRoot, - LocalExitRoot: s.sequenceInProgress.LocalExitRoot, - Timestamp: s.sequenceInProgress.Timestamp, - BatchNumber: s.sequenceInProgress.BatchNumber, - } - - copy(backupSequence.Txs, s.sequenceInProgress.Txs) - - return backupSequence -} diff --git a/sequencer/batchresources.go b/sequencer/batchresources.go new file mode 100644 index 0000000000..bb7bcad2ef --- /dev/null +++ b/sequencer/batchresources.go @@ -0,0 +1,28 @@ +package sequencer + +import ( + "github.com/0xPolygonHermez/zkevm-node/state" +) + +// batchResources is a struct that contains the ZKEVM resources used by a batch/tx +type batchResources struct { + zKCounters state.ZKCounters + bytes uint64 +} + +// sub subtracts the batch resources from other +func (r *batchResources) sub(other batchResources) error { + // Bytes + if other.bytes > r.bytes { + return ErrBatchResourceBytesUnderflow + } + bytesBackup := r.bytes + r.bytes -= other.bytes + err := r.zKCounters.Sub(other.zKCounters) + if err != nil { + return NewBatchRemainingResourcesUnderflowError(err, err.Error()) + } + r.bytes = bytesBackup + + return err +} diff --git a/sequencer/closingchecker.go b/sequencer/closingchecker.go deleted file mode 100644 index 651bf02e3b..0000000000 --- a/sequencer/closingchecker.go +++ /dev/null @@ -1,93 +0,0 @@ -package sequencer - -import ( - "context" - "time" - - "github.com/0xPolygonHermez/zkevm-node/log" - "github.com/0xPolygonHermez/zkevm-node/state" -) - -// shouldCloseSequenceInProgress checks if sequence should be closed or not -// in case it's enough blocks since last GER update, long time since last batch and sequence is profitable -func (s *Sequencer) shouldCloseSequenceInProgress(ctx context.Context) bool { - // Check if sequence is full - if s.sequenceInProgress.IsSequenceTooBig { - log.Infof("current sequence should be closed because it has reached the maximum data size") - s.sequenceInProgress.IsSequenceTooBig = false - return true - } - if len(s.sequenceInProgress.Txs) >= int(s.cfg.MaxTxsPerBatch) { - log.Infof("current sequence should be closed because it has reached the maximum capacity (%d txs)", s.cfg.MaxTxsPerBatch) - return true - } - // Check if there are any deposits or GER needs to be updated - if isThereAnyDeposits, err := s.shouldCloseDueToNewDeposits(ctx); err != nil || isThereAnyDeposits { - return err == nil - } - // Check if it has been too long since a previous batch was virtualized - if isBatchVirtualized, err := s.shouldCloseTooLongSinceLastVirtualized(ctx); err != nil || isBatchVirtualized { - return err == nil - } - - return false -} - -// shouldCloseDueToNewDeposits return true if there has been new deposits on L1 -// for more than WaitBlocksToUpdateGER, enough time has passed since the -// sequence was opened and the sequence is profitable (if profitability check -// is enabled). -func (s *Sequencer) shouldCloseDueToNewDeposits(ctx context.Context) (bool, error) { - lastGer, gerReceivedAt, err := s.getLatestGer(ctx, nil) - if err != nil && err != state.ErrNotFound { - log.Errorf("failed to get latest global exit root, err: %w", err) - return false, err - } - - // get current ger and compare it with the last ger - blockNum, mainnetExitRoot, err := s.state.GetBlockNumAndMainnetExitRootByGER(ctx, s.sequenceInProgress.GlobalExitRoot, nil) - if err != nil && err != state.ErrNotFound { - log.Errorf("failed to get mainnetExitRoot and blockNum by ger, err: %w", err) - return false, err - } - - if lastGer.MainnetExitRoot != mainnetExitRoot { - latestBlockNumber, err := s.etherman.GetLatestBlockNumber(ctx) - if err != nil { - log.Errorf("failed to get latest batch number from ethereum, err: %w", err) - return false, err - } - - sequenceInProgressTimestamp := time.Unix(s.sequenceInProgress.Timestamp, 0) - - if latestBlockNumber-blockNum > s.cfg.WaitBlocksToUpdateGER && - gerReceivedAt.Before(time.Now().Add(-s.cfg.ElapsedTimeToCloseBatchWithoutTxsDueToNewGER.Duration)) && - sequenceInProgressTimestamp.Before(time.Now().Add(-s.cfg.MinTimeToCloseBatch.Duration)) { - log.Info("current sequence should be closed because blocks have been mined since last GER and enough time has passed") - return true, nil - } - } - - return false, nil -} - -// shouldCloseTooLongSinceLastVirtualized returns true if last batch virtualization happened -// more than MaxTimeForBatchToBeOpen ago and there are transactions in the current sequence -func (s *Sequencer) shouldCloseTooLongSinceLastVirtualized(ctx context.Context) (bool, error) { - lastBatchNumber, err := s.state.GetLastBatchNumber(ctx, nil) - if err != nil { - log.Errorf("failed to get last batch number, err: %w", err) - return false, err - } - isPreviousBatchVirtualized, err := s.state.IsBatchVirtualized(ctx, lastBatchNumber-1, nil) - if err != nil { - log.Errorf("failed to get last virtual batch num, err: %w", err) - return false, err - } - if time.Unix(s.sequenceInProgress.Timestamp, 0).Add(s.cfg.MaxTimeForBatchToBeOpen.Duration).Before(time.Now()) && - isPreviousBatchVirtualized && len(s.sequenceInProgress.Txs) > 0 { - log.Info("current sequence should be closed because because there are enough time to close a batch, previous batch is virtualized and batch has txs") - return true, nil - } - return false, nil -} diff --git a/sequencer/closingsignalsmanager.go b/sequencer/closingsignalsmanager.go new file mode 100644 index 0000000000..3bf4377e91 --- /dev/null +++ b/sequencer/closingsignalsmanager.go @@ -0,0 +1,94 @@ +package sequencer + +import ( + "context" + "time" + + "github.com/0xPolygonHermez/zkevm-node/log" + "github.com/ethereum/go-ethereum/common" +) + +type closingSignalsManager struct { + ctx context.Context + dbManager dbManagerInterface + closingSignalCh ClosingSignalCh + cfg FinalizerCfg + lastForcedBatchNumSent uint64 +} + +func newClosingSignalsManager(ctx context.Context, dbManager dbManagerInterface, closingSignalCh ClosingSignalCh, cfg FinalizerCfg) *closingSignalsManager { + return &closingSignalsManager{ctx: ctx, dbManager: dbManager, closingSignalCh: closingSignalCh, cfg: cfg} +} + +func (c *closingSignalsManager) Start() { + go c.checkForcedBatches() + go c.checkGERUpdate() + go c.checkSendToL1Timeout() +} + +func (c *closingSignalsManager) checkSendToL1Timeout() { + for { + timestamp, err := c.dbManager.GetLatestVirtualBatchTimestamp(c.ctx, nil) + if err != nil { + log.Errorf("error checking latest virtual batch timestamp: %v", err) + time.Sleep(c.cfg.ClosingSignalsManagerWaitForL1OperationsInSec.Duration) + } else { + limit := time.Now().Unix() - int64(c.cfg.SendingToL1DeadlineTimeoutInSec.Duration.Seconds()) + + if timestamp.Unix() < limit { + c.closingSignalCh.SendingToL1TimeoutCh <- true + time.Sleep(c.cfg.ClosingSignalsManagerWaitForL1OperationsInSec.Duration) + } else { + time.Sleep(time.Duration(limit-timestamp.Unix()) * time.Second) + } + } + } +} + +func (c *closingSignalsManager) checkGERUpdate() { + var lastGERSent common.Hash + + for { + time.Sleep(c.cfg.ClosingSignalsManagerWaitForL1OperationsInSec.Duration) + + ger, _, err := c.dbManager.GetLatestGer(c.ctx, c.cfg.GERFinalityNumberOfBlocks) + if err != nil { + log.Errorf("error checking GER update: %v", err) + continue + } + + if ger.GlobalExitRoot != lastGERSent { + c.closingSignalCh.GERCh <- ger.GlobalExitRoot + lastGERSent = ger.GlobalExitRoot + } + } +} + +func (c *closingSignalsManager) checkForcedBatches() { + for { + time.Sleep(c.cfg.ClosingSignalsManagerWaitForL1OperationsInSec.Duration) + log.Debug(time.Now()) + + if c.lastForcedBatchNumSent == 0 { // TODO: reset c.lastForcedBatchNumSent = 0 on L2 Reorg + lastTrustedForcedBatchNum, err := c.dbManager.GetLastTrustedForcedBatchNumber(c.ctx, nil) + if err != nil { + log.Errorf("error getting last trusted forced batch number: %v", err) + continue + } + if lastTrustedForcedBatchNum > 0 { + c.lastForcedBatchNumSent = lastTrustedForcedBatchNum + } + } + + forcedBatches, err := c.dbManager.GetForcedBatchesSince(c.ctx, c.lastForcedBatchNumSent, nil) + if err != nil { + log.Errorf("error checking forced batches: %v", err) + continue + } + + for _, forcedBatch := range forcedBatches { + c.closingSignalCh.ForcedBatchCh <- *forcedBatch + c.lastForcedBatchNumSent = forcedBatch.ForcedBatchNumber + } + } +} diff --git a/sequencer/closingsignalsmanager_test.go b/sequencer/closingsignalsmanager_test.go new file mode 100644 index 0000000000..2edecc62e1 --- /dev/null +++ b/sequencer/closingsignalsmanager_test.go @@ -0,0 +1,121 @@ +package sequencer + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/0xPolygonHermez/zkevm-node/db" + "github.com/0xPolygonHermez/zkevm-node/log" + "github.com/0xPolygonHermez/zkevm-node/merkletree" + "github.com/0xPolygonHermez/zkevm-node/state" + "github.com/0xPolygonHermez/zkevm-node/test/testutils" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +const numberOfForcesBatches = 10 + +var ( + testGER = common.HexToAddress("0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D") + testAddr = common.HexToAddress("0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D") + testRawData = common.Hex2Bytes("0xee80843b9aca00830186a0944d5cf5032b2a844602278b01199ed191a86c93ff88016345785d8a0000808203e880801cee7e01dc62f69a12c3510c6d64de04ee6346d84b6a017f3e786c7d87f963e75d8cc91fa983cd6d9cf55fff80d73bd26cd333b0f098acc1e58edb1fd484ad731b") +) + +func setupTest(t *testing.T) { + initOrResetDB() + + ctx = context.Background() + + stateDb, err = db.NewSQLDB(stateDBCfg) + if err != nil { + panic(err) + } + + zkProverURI := testutils.GetEnv("ZKPROVER_URI", "localhost") + mtDBServerConfig := merkletree.Config{URI: fmt.Sprintf("%s:50061", zkProverURI)} + var mtDBCancel context.CancelFunc + mtDBServiceClient, mtDBClientConn, mtDBCancel = merkletree.NewMTDBServiceClient(ctx, mtDBServerConfig) + s := mtDBClientConn.GetState() + log.Infof("stateDbClientConn state: %s", s.String()) + defer func() { + mtDBCancel() + mtDBClientConn.Close() + }() + + stateTree = merkletree.NewStateTree(mtDBServiceClient) + testState = state.NewState(stateCfg, state.NewPostgresStorage(stateDb), executorClient, stateTree) + + batchConstraints := batchConstraints{ + MaxTxsPerBatch: 150, + MaxBatchBytesSize: 150000, + MaxCumulativeGasUsed: 30000000, + MaxKeccakHashes: 468, + MaxPoseidonHashes: 279620, + MaxPoseidonPaddings: 149796, + MaxMemAligns: 262144, + MaxArithmetics: 262144, + MaxBinaries: 262144, + MaxSteps: 8388608, + } + + testDbManager = newDBManager(ctx, nil, testState, nil, closingSignalCh, txsStore, batchConstraints) + + // Set genesis batch + dbTx, err := testState.BeginStateTransaction(ctx) + require.NoError(t, err) + _, err = testState.SetGenesis(ctx, state.Block{}, state.Genesis{}, dbTx) + require.NoError(t, err) + require.NoError(t, dbTx.Commit(ctx)) +} + +func prepareForcedBatches(t *testing.T) { + // Create block + const sql = `INSERT INTO state.forced_batch (forced_batch_num, global_exit_root, timestamp, raw_txs_data, coinbase, block_num) VALUES ($1, $2, $3, $4, $5, $6)` + + for x := 0; x < numberOfForcesBatches; x++ { + forcedBatchNum := int64(x) + _, err := testState.PostgresStorage.Exec(ctx, sql, forcedBatchNum, testGER.String(), time.Now(), testRawData, testAddr.String(), 0) + assert.NoError(t, err) + } +} + +func TestClosingSignalsManager(t *testing.T) { + setupTest(t) + channels := ClosingSignalCh{ + ForcedBatchCh: make(chan state.ForcedBatch), + } + + prepareForcedBatches(t) + closingSignalsManager := newClosingSignalsManager(ctx, testDbManager, channels, cfg) + closingSignalsManager.Start() + + newCtx, cancelFunc := context.WithTimeout(ctx, time.Second*3) + defer cancelFunc() + + var fb *state.ForcedBatch + + for { + select { + case <-newCtx.Done(): + log.Infof("received context done, Err: %s", ctx.Err()) + return + // Forced batch ch + case fb := <-channels.ForcedBatchCh: + log.Debug("Forced batch received", "forced batch", fb) + } + + if fb != nil { + break + } + } + + require.NotEqual(t, (*state.ForcedBatch)(nil), fb) + require.Equal(t, nil, fb.BlockNumber) + require.Equal(t, int64(1), fb.ForcedBatchNumber) + require.Equal(t, testGER, fb.GlobalExitRoot) + require.Equal(t, testAddr, fb.Sequencer) + require.Equal(t, testRawData, fb.RawTxsData) +} diff --git a/sequencer/config.go b/sequencer/config.go index 75aa47947e..aac9bf5b02 100644 --- a/sequencer/config.go +++ b/sequencer/config.go @@ -6,7 +6,6 @@ import ( "github.com/0xPolygonHermez/zkevm-node/config/types" base "github.com/0xPolygonHermez/zkevm-node/encoding" - "github.com/0xPolygonHermez/zkevm-node/sequencer/profitabilitychecker" ) // Config represents the configuration of a sequencer @@ -14,6 +13,7 @@ type Config struct { // WaitPeriodSendSequence is the time the sequencer waits until // trying to send a sequence to L1 WaitPeriodSendSequence types.Duration `mapstructure:"WaitPeriodSendSequence"` + // WaitPeriodPoolIsEmpty is the time the sequencer waits until // trying to add new txs to the state WaitPeriodPoolIsEmpty types.Duration `mapstructure:"WaitPeriodPoolIsEmpty"` @@ -21,21 +21,6 @@ type Config struct { // LastBatchVirtualizationTimeMaxWaitPeriod is time since sequences should be sent LastBatchVirtualizationTimeMaxWaitPeriod types.Duration `mapstructure:"LastBatchVirtualizationTimeMaxWaitPeriod"` - // WaitBlocksToUpdateGER is number of blocks for sequencer to wait - WaitBlocksToUpdateGER uint64 `mapstructure:"WaitBlocksToUpdateGER"` - - // WaitBlocksToConsiderGerFinal is number of blocks for sequencer to consider GER final - WaitBlocksToConsiderGerFinal uint64 `mapstructure:"WaitBlocksToConsiderGerFinal"` - - // ElapsedTimeToCloseBatchWithoutTxsDueToNewGER it's time to close a batch bcs new GER appeared - ElapsedTimeToCloseBatchWithoutTxsDueToNewGER types.Duration `mapstructure:"ElapsedTimeToCloseBatchWithoutTxsDueToNewGER"` - - // MinTimeToCloseBatch enough time passed to close a batch. - MinTimeToCloseBatch types.Duration `mapstructure:"MinTimeToCloseBatch"` - - // MaxTimeForBatchToBeOpen is time after which new batch should be closed - MaxTimeForBatchToBeOpen types.Duration `mapstructure:"MaxTimeForBatchToBeOpen"` - // BlocksAmountForTxsToBeDeleted is blocks amount after which txs will be deleted from the pool BlocksAmountForTxsToBeDeleted uint64 `mapstructure:"BlocksAmountForTxsToBeDeleted"` @@ -46,34 +31,31 @@ type Config struct { MaxTxsPerBatch uint64 `mapstructure:"MaxTxsPerBatch"` // MaxBatchBytesSize is the maximum batch size in bytes - MaxBatchBytesSize int `mapstructure:"MaxBatchBytesSize"` + MaxBatchBytesSize uint64 `mapstructure:"MaxBatchBytesSize"` // MaxCumulativeGasUsed is max gas amount used by batch MaxCumulativeGasUsed uint64 `mapstructure:"MaxCumulativeGasUsed"` // MaxKeccakHashes is max keccak hashes used by batch - MaxKeccakHashes int32 `mapstructure:"MaxKeccakHashes"` + MaxKeccakHashes uint32 `mapstructure:"MaxKeccakHashes"` // MaxPoseidonHashes is max poseidon hashes batch can handle - MaxPoseidonHashes int32 `mapstructure:"MaxPoseidonHashes"` + MaxPoseidonHashes uint32 `mapstructure:"MaxPoseidonHashes"` // MaxPoseidonPaddings is max poseidon paddings batch can handle - MaxPoseidonPaddings int32 `mapstructure:"MaxPoseidonPaddings"` + MaxPoseidonPaddings uint32 `mapstructure:"MaxPoseidonPaddings"` // MaxMemAligns is max mem aligns batch can handle - MaxMemAligns int32 `mapstructure:"MaxMemAligns"` + MaxMemAligns uint32 `mapstructure:"MaxMemAligns"` // MaxArithmetics is max arithmetics batch can handle - MaxArithmetics int32 `mapstructure:"MaxArithmetics"` + MaxArithmetics uint32 `mapstructure:"MaxArithmetics"` // MaxBinaries is max binaries batch can handle - MaxBinaries int32 `mapstructure:"MaxBinaries"` + MaxBinaries uint32 `mapstructure:"MaxBinaries"` // MaxSteps is max steps batch can handle - MaxSteps int32 `mapstructure:"MaxSteps"` - - // ProfitabilityChecker configuration - ProfitabilityChecker profitabilitychecker.Config `mapstructure:"ProfitabilityChecker"` + MaxSteps uint32 `mapstructure:"MaxSteps"` // Maximum size, in gas size, a sequence can reach MaxSequenceSize MaxSequenceSize `mapstructure:"MaxSequenceSize"` @@ -81,6 +63,59 @@ type Config struct { // Maximum allowed failed counter for the tx before it becomes invalid MaxAllowedFailedCounter uint64 `mapstructure:"MaxAllowedFailedCounter"` + // WeightBatchBytesSize is the cost weight for the BatchBytesSize batch resource + WeightBatchBytesSize int `mapstructure:"WeightBatchBytesSize"` + + // WeightCumulativeGasUsed is the cost weight for the CumulativeGasUsed batch resource + WeightCumulativeGasUsed int `mapstructure:"WeightCumulativeGasUsed"` + + // WeightKeccakHashes is the cost weight for the KeccakHashes batch resource + WeightKeccakHashes int `mapstructure:"WeightKeccakHashes"` + + // WeightPoseidonHashes is the cost weight for the PoseidonHashes batch resource + WeightPoseidonHashes int `mapstructure:"WeightPoseidonHashes"` + + // WeightPoseidonPaddings is the cost weight for the PoseidonPaddings batch resource + WeightPoseidonPaddings int `mapstructure:"WeightPoseidonPaddings"` + + // WeightMemAligns is the cost weight for the MemAligns batch resource + WeightMemAligns int `mapstructure:"WeightMemAligns"` + + // WeightArithmetics is the cost weight for the Arithmetics batch resource + WeightArithmetics int `mapstructure:"WeightArithmetics"` + + // WeightBinaries is the cost weight for the Binaries batch resource + WeightBinaries int `mapstructure:"WeightBinaries"` + + // WeightSteps is the cost weight for the Steps batch resource + WeightSteps int `mapstructure:"WeightSteps"` + + // Finalizer's specific config properties + Finalizer FinalizerCfg `mapstructure:"Finalizer"` +} + +// FinalizerCfg contains the finalizer's configuration properties +type FinalizerCfg struct { + // GERDeadlineTimeoutInSec is the time the finalizer waits after receiving closing signal to update Global Exit Root + GERDeadlineTimeoutInSec types.Duration `mapstructure:"GERDeadlineTimeoutInSec"` + + // SendingToL1DeadlineTimeoutInSec is the time the finalizer waits after receiving closing signal to process Forced Batches + ForcedBatchDeadlineTimeoutInSec types.Duration `mapstructure:"ForcedBatchDeadlineTimeoutInSec"` + + // SendingToL1DeadlineTimeoutInSec is the time the finalizer waits after receiving closing signal to sends a batch to L1 + SendingToL1DeadlineTimeoutInSec types.Duration `mapstructure:"SendingToL1DeadlineTimeoutInSec"` + + // SleepDurationInMs is the time the finalizer sleeps between each iteration, if there are no transactions to be processed + SleepDurationInMs types.Duration `mapstructure:"SleepDurationInMs"` + + // ResourcePercentageToCloseBatch is the percentage window of the resource left out for the batch to be closed + ResourcePercentageToCloseBatch uint32 `mapstructure:"ResourcePercentageToCloseBatch"` + + // GERFinalityNumberOfBlocks is number of blocks to consider GER final + GERFinalityNumberOfBlocks uint64 `mapstructure:"GERFinalityNumberOfBlocks"` + + // ClosingSignalsManagerWaitForL1OperationsInSec is used by the closing signals manager to wait for its operation + ClosingSignalsManagerWaitForL1OperationsInSec types.Duration `mapstructure:"ClosingSignalsManagerWaitForL1OperationsInSec"` // SenderAddress defines which private key the eth tx manager needs to use // to sign the L1 txs SenderAddress string `mapstructure:"SenderAddress"` diff --git a/sequencer/dbmanager.go b/sequencer/dbmanager.go new file mode 100644 index 0000000000..0c69b50f82 --- /dev/null +++ b/sequencer/dbmanager.go @@ -0,0 +1,588 @@ +package sequencer + +import ( + "context" + "errors" + "fmt" + "math/big" + "time" + + "github.com/0xPolygonHermez/zkevm-node/log" + "github.com/0xPolygonHermez/zkevm-node/pool" + "github.com/0xPolygonHermez/zkevm-node/pool/pgpoolstorage" + "github.com/0xPolygonHermez/zkevm-node/state" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/jackc/pgx/v4" +) + +const ( + wait time.Duration = 5 +) + +// Pool Loader and DB Updater +type dbManager struct { + txPool txPool + state dbManagerStateInterface + worker workerInterface + txsStore TxsStore + l2ReorgCh chan L2ReorgEvent + ctx context.Context + batchConstraints batchConstraints +} + +func (d *dbManager) GetBatchByNumber(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) (*state.Batch, error) { + return d.state.GetBatchByNumber(ctx, batchNumber, dbTx) +} + +// ClosingBatchParameters contains the necessary parameters to close a batch +type ClosingBatchParameters struct { + BatchNumber uint64 + StateRoot common.Hash + LocalExitRoot common.Hash + AccInputHash common.Hash + Txs []types.Transaction +} + +func newDBManager(ctx context.Context, txPool txPool, state dbManagerStateInterface, worker *Worker, closingSignalCh ClosingSignalCh, txsStore TxsStore, batchConstraints batchConstraints) *dbManager { + return &dbManager{ctx: ctx, txPool: txPool, state: state, worker: worker, txsStore: txsStore, l2ReorgCh: closingSignalCh.L2ReorgCh, batchConstraints: batchConstraints} +} + +// Start stars the dbManager routines +func (d *dbManager) Start() { + go d.loadFromPool() + go d.storeProcessedTxAndDeleteFromPool() +} + +// GetLastBatchNumber get the latest batch number from state +func (d *dbManager) GetLastBatchNumber(ctx context.Context) (uint64, error) { + return d.state.GetLastBatchNumber(ctx, nil) +} + +// OpenBatch opens a new batch to star processing transactions +func (d *dbManager) OpenBatch(ctx context.Context, processingContext state.ProcessingContext, dbTx pgx.Tx) error { + return d.state.OpenBatch(ctx, processingContext, dbTx) +} + +// CreateFirstBatch is using during genesis +func (d *dbManager) CreateFirstBatch(ctx context.Context, sequencerAddress common.Address) state.ProcessingContext { + processingCtx := state.ProcessingContext{ + BatchNumber: 1, + Coinbase: sequencerAddress, + Timestamp: time.Now(), + GlobalExitRoot: state.ZeroHash, + } + dbTx, err := d.state.BeginStateTransaction(ctx) + if err != nil { + log.Errorf("failed to begin state transaction for opening a batch, err: %v", err) + return processingCtx + } + err = d.state.OpenBatch(ctx, processingCtx, dbTx) + if err != nil { + if rollbackErr := dbTx.Rollback(ctx); rollbackErr != nil { + log.Errorf( + "failed to rollback dbTx when opening batch that gave err: %v. Rollback err: %v", + rollbackErr, err, + ) + } + log.Errorf("failed to open a batch, err: %v", err) + return processingCtx + } + if err := dbTx.Commit(ctx); err != nil { + log.Errorf("failed to commit dbTx when opening batch, err: %v", err) + return processingCtx + } + return processingCtx +} + +// loadFromPool keeps loading transactions from the pool +func (d *dbManager) loadFromPool() { + for { + // TODO: Move this to a config parameter + time.Sleep(wait * time.Second) + + poolTransactions, err := d.txPool.GetPendingTxs(d.ctx, false, 0) + if err != nil && err != pgpoolstorage.ErrNotFound { + log.Errorf("load tx from pool: %v", err) + } + + for _, tx := range poolTransactions { + err := d.addTxToWorker(tx, false) + if err != nil { + log.Errorf("error adding transaction to worker: %v", err) + } + } + + poolClaims, err := d.txPool.GetPendingTxs(d.ctx, true, 0) + if err != nil && err != pgpoolstorage.ErrNotFound { + log.Errorf("load claims from pool: %v", err) + } + + for _, tx := range poolClaims { + err := d.addTxToWorker(tx, true) + if err != nil { + log.Errorf("error adding claim to worker: %v", err) + } + } + } +} + +func (d *dbManager) addTxToWorker(tx pool.Transaction, isClaim bool) error { + txTracker, err := d.worker.NewTxTracker(tx.Transaction, isClaim, tx.ZKCounters) + if err != nil { + return err + } + d.worker.AddTx(d.ctx, txTracker) + return d.txPool.UpdateTxStatus(d.ctx, tx.Hash(), pool.TxStatusWIP) +} + +// BeginStateTransaction starts a db transaction in the state +func (d *dbManager) BeginStateTransaction(ctx context.Context) (pgx.Tx, error) { + return d.state.BeginStateTransaction(ctx) +} + +// StoreProcessedTransaction stores a transaction in the state +func (d *dbManager) StoreProcessedTransaction(ctx context.Context, batchNumber uint64, processedTx *state.ProcessTransactionResponse, coinbase common.Address, timestamp uint64, dbTx pgx.Tx) error { + return d.state.StoreTransaction(ctx, batchNumber, processedTx, coinbase, timestamp, dbTx) +} + +// DeleteTransactionFromPool deletes a transaction from the pool +func (d *dbManager) DeleteTransactionFromPool(ctx context.Context, txHash common.Hash) error { + return d.txPool.DeleteTransactionByHash(ctx, txHash) +} + +// storeProcessedTxAndDeleteFromPool stores a tx into the state and changes it status in the pool +func (d *dbManager) storeProcessedTxAndDeleteFromPool() { + // TODO: Finish the retry mechanism and error handling + for { + txToStore := <-d.txsStore.Ch + log.Debugf("Storing tx %v", txToStore.txResponse.TxHash) + dbTx, err := d.BeginStateTransaction(d.ctx) + if err != nil { + log.Errorf("StoreProcessedTxAndDeleteFromPool: %v", err) + } + + // TODO: Update this check to have in not check for OldStateRoot only the last L2 Block as the StateRoot could + // be updated on new GER even without any txs/l2blocksgit sdt + //// Check if the Tx is still valid in the state to detect reorgs + //lastStateRoot, err := d.state.GetLastStateRoot(d.ctx, dbTx) + //if err != nil { + // err = dbTx.Rollback(d.ctx) + // if err != nil { + // log.Errorf("StoreProcessedTxAndDeleteFromPool: %v", err) + // } + // d.txsStore.Wg.Done() + // continue + //} + + //if txToStore.previousL2BlockStateRoot != state.ZeroHash && lastStateRoot != txToStore.previousL2BlockStateRoot { + // log.Warnf("L2 reorg detected. Expected OldStateRoot: %v actual OldStateRoot: %v", lastStateRoot, txToStore.previousL2BlockStateRoot) + // d.l2ReorgCh <- L2ReorgEvent{} + // d.txsStore.Wg.Done() + // continue + //} + + err = d.StoreProcessedTransaction(d.ctx, txToStore.batchNumber, txToStore.txResponse, txToStore.coinbase, txToStore.timestamp, dbTx) + if err != nil { + err = dbTx.Rollback(d.ctx) + if err != nil { + log.Errorf("StoreProcessedTxAndDeleteFromPool: %v", err) + } + d.txsStore.Wg.Done() + continue + } + + // Update batch l2 data + batch, err := d.state.GetBatchByNumber(d.ctx, txToStore.batchNumber, dbTx) + if err != nil { + err = dbTx.Rollback(d.ctx) + if err != nil { + log.Errorf("StoreProcessedTxAndDeleteFromPool: %v", err) + } + d.txsStore.Wg.Done() + continue + } + + txData, err := state.EncodeTransaction(txToStore.txResponse.Tx) + if err != nil { + err = dbTx.Rollback(d.ctx) + if err != nil { + log.Errorf("StoreProcessedTxAndDeleteFromPool: %v", err) + } + d.txsStore.Wg.Done() + continue + } + batch.BatchL2Data = append(batch.BatchL2Data, txData...) + + err = d.state.UpdateBatchL2Data(d.ctx, txToStore.batchNumber, batch.BatchL2Data, dbTx) + if err != nil { + err = dbTx.Rollback(d.ctx) + if err != nil { + log.Errorf("StoreProcessedTxAndDeleteFromPool: %v", err) + } + d.txsStore.Wg.Done() + continue + } + + // Change Tx status to selected + err = d.txPool.UpdateTxStatus(d.ctx, txToStore.txResponse.TxHash, pool.TxStatusSelected) + if err != nil { + err = dbTx.Rollback(d.ctx) + if err != nil { + log.Errorf("StoreProcessedTxAndDeleteFromPool: %v", err) + } + d.txsStore.Wg.Done() + continue + } + + err = dbTx.Commit(d.ctx) + if err != nil { + log.Errorf("StoreProcessedTxAndDeleteFromPool error committing : %v", err) + } + + d.txsStore.Wg.Done() + } +} + +// GetWIPBatch returns ready WIP batch +func (d *dbManager) GetWIPBatch(ctx context.Context) (*WipBatch, error) { + const two = 2 + var lastBatch, previousLastBatch *state.Batch + dbTx, err := d.BeginStateTransaction(ctx) + if err != nil { + return nil, err + } + defer func() { + err := dbTx.Commit(ctx) + if err != nil { + log.Errorf("failed to commit GetWIPBatch: %v", err) + } + }() + + lastBatches, err := d.state.GetLastNBatches(ctx, two, dbTx) + if err != nil { + return nil, err + } + + lastBatch = lastBatches[0] + if len(lastBatches) > 1 { + previousLastBatch = lastBatches[1] + } + + lastBatchTxs, _, err := state.DecodeTxs(lastBatch.BatchL2Data) + if err != nil { + return nil, err + } + + lastBatch.Transactions = lastBatchTxs + + lastStateRoot, err := d.state.GetLastStateRoot(ctx, dbTx) + if err != nil { + return nil, err + } + + wipBatch := &WipBatch{ + batchNumber: lastBatch.BatchNumber, + coinbase: lastBatch.Coinbase, + localExitRoot: lastBatch.LocalExitRoot, + timestamp: uint64(lastBatch.Timestamp.Unix()), + globalExitRoot: lastBatch.GlobalExitRoot, + countOfTxs: len(lastBatch.Transactions), + } + + // Init counters to MAX values + var totalBytes uint64 = d.batchConstraints.MaxBatchBytesSize + var batchZkCounters state.ZKCounters = state.ZKCounters{ + CumulativeGasUsed: d.batchConstraints.MaxCumulativeGasUsed, + UsedKeccakHashes: d.batchConstraints.MaxKeccakHashes, + UsedPoseidonHashes: d.batchConstraints.MaxPoseidonHashes, + UsedPoseidonPaddings: d.batchConstraints.MaxPoseidonPaddings, + UsedMemAligns: d.batchConstraints.MaxMemAligns, + UsedArithmetics: d.batchConstraints.MaxArithmetics, + UsedBinaries: d.batchConstraints.MaxBinaries, + UsedSteps: d.batchConstraints.MaxSteps, + } + + isClosed, err := d.IsBatchClosed(ctx, lastBatch.BatchNumber) + if err != nil { + return nil, err + } + + if isClosed { + wipBatch.batchNumber = lastBatch.BatchNumber + 1 + wipBatch.stateRoot = lastBatch.StateRoot + wipBatch.initialStateRoot = lastBatch.StateRoot + + processingContext := &state.ProcessingContext{ + BatchNumber: wipBatch.batchNumber, + Coinbase: wipBatch.coinbase, + Timestamp: time.Unix(int64(wipBatch.timestamp), 0), + GlobalExitRoot: wipBatch.globalExitRoot, + } + err = d.state.OpenBatch(ctx, *processingContext, dbTx) + if err != nil { + if rollbackErr := dbTx.Rollback(ctx); rollbackErr != nil { + log.Errorf( + "failed to rollback dbTx when opening batch that gave err: %v. Rollback err: %v", + rollbackErr, err, + ) + } + log.Errorf("failed to open a batch, err: %v", err) + return nil, err + } + if err := dbTx.Commit(ctx); err != nil { + log.Errorf("failed to commit dbTx when opening batch, err: %v", err) + return nil, err + } + } else { + wipBatch.stateRoot = lastStateRoot + wipBatch.initialStateRoot = previousLastBatch.StateRoot + batchL2DataLen := len(lastBatch.BatchL2Data) + + if batchL2DataLen > 0 { + wipBatch.countOfTxs = len(lastBatch.Transactions) + batchToExecute := *lastBatch + batchToExecute.BatchNumber = wipBatch.batchNumber + batchResponse, err := d.state.ExecuteBatch(ctx, batchToExecute, dbTx) + if err != nil { + return nil, err + } + + zkCounters := &state.ZKCounters{ + CumulativeGasUsed: batchResponse.GetCumulativeGasUsed(), + UsedKeccakHashes: batchResponse.CntKeccakHashes, + UsedPoseidonHashes: batchResponse.CntPoseidonHashes, + UsedPoseidonPaddings: batchResponse.CntPoseidonPaddings, + UsedMemAligns: batchResponse.CntMemAligns, + UsedArithmetics: batchResponse.CntArithmetics, + UsedBinaries: batchResponse.CntBinaries, + UsedSteps: batchResponse.CntSteps, + } + + err = batchZkCounters.Sub(*zkCounters) + if err != nil { + return nil, err + } + + totalBytes -= uint64(batchL2DataLen) + } else { + wipBatch.countOfTxs = 0 + } + } + + wipBatch.remainingResources = batchResources{zKCounters: batchZkCounters, bytes: totalBytes} + return wipBatch, nil +} + +// GetLastClosedBatch gets the latest closed batch from state +func (d *dbManager) GetLastClosedBatch(ctx context.Context) (*state.Batch, error) { + return d.state.GetLastClosedBatch(ctx, nil) +} + +// GetLastBatch gets the latest batch from state +func (d *dbManager) GetLastBatch(ctx context.Context) (*state.Batch, error) { + batch, err := d.state.GetLastBatch(d.ctx, nil) + if err != nil { + return nil, err + } + return batch, nil +} + +// IsBatchClosed checks if a batch is closed +func (d *dbManager) IsBatchClosed(ctx context.Context, batchNum uint64) (bool, error) { + return d.state.IsBatchClosed(ctx, batchNum, nil) +} + +// GetLastNBatches gets the latest N batches from state +func (d *dbManager) GetLastNBatches(ctx context.Context, numBatches uint) ([]*state.Batch, error) { + return d.state.GetLastNBatches(ctx, numBatches, nil) +} + +// GetLatestGer gets the latest global exit root +func (d *dbManager) GetLatestGer(ctx context.Context, gerFinalityNumberOfBlocks uint64) (state.GlobalExitRoot, time.Time, error) { + lastBlock, err := d.state.GetLastBlock(ctx, nil) + if err != nil { + return state.GlobalExitRoot{}, time.Time{}, fmt.Errorf("failed to get latest eth block number, err: %w", err) + } + + blockNumber := lastBlock.BlockNumber + + maxBlockNumber := uint64(0) + if gerFinalityNumberOfBlocks <= blockNumber { + maxBlockNumber = blockNumber - gerFinalityNumberOfBlocks + } + ger, receivedAt, err := d.state.GetLatestGlobalExitRoot(ctx, maxBlockNumber, nil) + if err != nil && errors.Is(err, state.ErrNotFound) { + return state.GlobalExitRoot{}, time.Time{}, nil + } else if err != nil { + return state.GlobalExitRoot{}, time.Time{}, fmt.Errorf("failed to get latest global exit root, err: %w", err) + } else { + return ger, receivedAt, nil + } +} + +// CloseBatch closes a batch in the state +func (d *dbManager) CloseBatch(ctx context.Context, params ClosingBatchParameters) error { + processingReceipt := state.ProcessingReceipt{ + BatchNumber: params.BatchNumber, + StateRoot: params.StateRoot, + LocalExitRoot: params.LocalExitRoot, + AccInputHash: params.AccInputHash, + } + + batchL2Data, err := state.EncodeTransactions(params.Txs) + if err != nil { + return err + } + + processingReceipt.BatchL2Data = batchL2Data + + dbTx, err := d.BeginStateTransaction(ctx) + if err != nil { + return err + } + + err = d.state.CloseBatch(ctx, processingReceipt, dbTx) + if err != nil { + err2 := dbTx.Rollback(ctx) + if err2 != nil { + log.Errorf("CloseBatch error rolling back: %v", err2) + } + return err + } else { + err := dbTx.Commit(ctx) + if err != nil { + log.Errorf("CloseBatch error committing: %v", err) + return err + } + } + + return nil +} + +// MarkReorgedTxsAsPending marks all reorged tx as pending in the pool +func (d *dbManager) MarkReorgedTxsAsPending(ctx context.Context) { + err := d.txPool.MarkReorgedTxsAsPending(ctx) + if err != nil { + log.Errorf("error marking reorged txs as pending: %v", err) + } +} + +// ProcessForcedBatch process a forced batch +func (d *dbManager) ProcessForcedBatch(forcedBatchNum uint64, request state.ProcessRequest) (*state.ProcessBatchResponse, error) { + // Open Batch + processingCtx := state.ProcessingContext{ + BatchNumber: request.BatchNumber, + Coinbase: request.Coinbase, + Timestamp: time.Unix(int64(request.Timestamp), 0), + GlobalExitRoot: request.GlobalExitRoot, + ForcedBatchNum: &forcedBatchNum, + } + dbTx, err := d.state.BeginStateTransaction(d.ctx) + if err != nil { + log.Errorf("failed to begin state transaction for opening a batch, err: %v", err) + return nil, err + } + + err = d.state.OpenBatch(d.ctx, processingCtx, dbTx) + if err != nil { + if rollbackErr := dbTx.Rollback(d.ctx); rollbackErr != nil { + log.Errorf( + "failed to rollback dbTx when opening batch that gave err: %v. Rollback err: %v", + rollbackErr, err, + ) + } + log.Errorf("failed to open a batch, err: %v", err) + return nil, err + } + + // Fetch Forced Batch + forcedBatch, err := d.state.GetForcedBatch(d.ctx, forcedBatchNum, dbTx) + if err != nil { + if rollbackErr := dbTx.Rollback(d.ctx); rollbackErr != nil { + log.Errorf( + "failed to rollback dbTx when getting forced batch err: %v. Rollback err: %v", + rollbackErr, err, + ) + } + log.Errorf("failed to get a forced batch, err: %v", err) + return nil, err + } + + // Process Batch + processBatchResponse, err := d.state.ProcessSequencerBatch(d.ctx, request.BatchNumber, forcedBatch.RawTxsData, request.Caller, dbTx) + if err != nil { + if rollbackErr := dbTx.Rollback(d.ctx); rollbackErr != nil { + log.Errorf( + "failed to rollback dbTx processing forced batch err: %v. Rollback err: %v", + rollbackErr, err, + ) + } + log.Errorf("failed to process a batch, err: %v", err) + return nil, err + } + + // Close Batch + processingReceipt := state.ProcessingReceipt{ + BatchNumber: request.BatchNumber, + StateRoot: processBatchResponse.NewStateRoot, + LocalExitRoot: processBatchResponse.NewLocalExitRoot, + AccInputHash: processBatchResponse.NewAccInputHash, + BatchL2Data: forcedBatch.RawTxsData, + } + + err = d.state.CloseBatch(d.ctx, processingReceipt, dbTx) + if err != nil { + if rollbackErr := dbTx.Rollback(d.ctx); rollbackErr != nil { + log.Errorf( + "failed to rollback dbTx when closing batch that gave err: %v. Rollback err: %v", + rollbackErr, err, + ) + } + log.Errorf("failed to close a batch, err: %v", err) + return nil, err + } + + // All done + if err := dbTx.Commit(d.ctx); err != nil { + log.Errorf("failed to commit dbTx when opening batch, err: %v", err) + return nil, err + } + + return processBatchResponse, nil +} + +// GetForcedBatchesSince gets L1 forced batches since timestamp +func (d *dbManager) GetForcedBatchesSince(ctx context.Context, forcedBatchNumber uint64, dbTx pgx.Tx) ([]*state.ForcedBatch, error) { + return d.state.GetForcedBatchesSince(ctx, forcedBatchNumber, dbTx) +} + +// GetLastL2BlockHeader gets the last l2 block number +func (d *dbManager) GetLastL2BlockHeader(ctx context.Context, dbTx pgx.Tx) (*types.Header, error) { + return d.state.GetLastL2BlockHeader(ctx, dbTx) +} + +func (d *dbManager) GetLastBlock(ctx context.Context, dbTx pgx.Tx) (*state.Block, error) { + return d.state.GetLastBlock(ctx, dbTx) +} + +func (d *dbManager) GetLastTrustedForcedBatchNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) { + return d.state.GetLastTrustedForcedBatchNumber(ctx, dbTx) +} + +func (d *dbManager) GetBalanceByStateRoot(ctx context.Context, address common.Address, root common.Hash) (*big.Int, error) { + return d.state.GetBalanceByStateRoot(ctx, address, root) +} + +func (d *dbManager) GetTransactionsByBatchNumber(ctx context.Context, batchNumber uint64) (txs []types.Transaction, err error) { + return d.state.GetTransactionsByBatchNumber(ctx, batchNumber, nil) +} + +func (d *dbManager) UpdateTxStatus(ctx context.Context, hash common.Hash, newStatus pool.TxStatus) error { + return d.txPool.UpdateTxStatus(ctx, hash, newStatus) +} + +// GetLatestVirtualBatchTimestamp gets last virtual batch timestamp +func (d *dbManager) GetLatestVirtualBatchTimestamp(ctx context.Context, dbTx pgx.Tx) (time.Time, error) { + return d.state.GetLatestVirtualBatchTimestamp(ctx, dbTx) +} diff --git a/sequencer/dbmanager_test.go b/sequencer/dbmanager_test.go new file mode 100644 index 0000000000..9f0c64aaae --- /dev/null +++ b/sequencer/dbmanager_test.go @@ -0,0 +1,162 @@ +package sequencer + +import ( + "context" + "fmt" + "sync" + "testing" + "time" + + "github.com/0xPolygonHermez/zkevm-node/db" + "github.com/0xPolygonHermez/zkevm-node/log" + "github.com/0xPolygonHermez/zkevm-node/merkletree" + mtDBclientpb "github.com/0xPolygonHermez/zkevm-node/merkletree/pb" + "github.com/0xPolygonHermez/zkevm-node/state" + executorclientpb "github.com/0xPolygonHermez/zkevm-node/state/runtime/executor/pb" + "github.com/0xPolygonHermez/zkevm-node/test/dbutils" + "github.com/0xPolygonHermez/zkevm-node/test/testutils" + "github.com/ethereum/go-ethereum/common" + "github.com/jackc/pgx/v4/pgxpool" + "github.com/stretchr/testify/require" + "google.golang.org/grpc" +) + +var ( + ctx context.Context + testState *state.State + stateTree *merkletree.StateTree + stateDb *pgxpool.Pool + err error + stateDBCfg = dbutils.NewStateConfigFromEnv() + stateCfg = state.Config{ + MaxCumulativeGasUsed: 800000, + ChainID: 1000, + } + executorClient executorclientpb.ExecutorServiceClient + mtDBServiceClient mtDBclientpb.StateDBServiceClient + mtDBClientConn *grpc.ClientConn + testDbManager *dbManager +) + +func setupDBManager() { + initOrResetDB() + ctx = context.Background() + + stateDb, err = db.NewSQLDB(stateDBCfg) + if err != nil { + panic(err) + } + + zkProverURI := testutils.GetEnv("ZKPROVER_URI", "localhost") + mtDBServerConfig := merkletree.Config{URI: fmt.Sprintf("%s:50061", zkProverURI)} + var mtDBCancel context.CancelFunc + mtDBServiceClient, mtDBClientConn, mtDBCancel = merkletree.NewMTDBServiceClient(ctx, mtDBServerConfig) + s := mtDBClientConn.GetState() + log.Infof("stateDbClientConn state: %s", s.String()) + defer func() { + mtDBCancel() + mtDBClientConn.Close() + }() + + stateTree = merkletree.NewStateTree(mtDBServiceClient) + testState = state.NewState(stateCfg, state.NewPostgresStorage(stateDb), executorClient, stateTree) + + // DBManager + closingSignalCh := ClosingSignalCh{ + ForcedBatchCh: make(chan state.ForcedBatch), + GERCh: make(chan common.Hash), + L2ReorgCh: make(chan L2ReorgEvent), + SendingToL1TimeoutCh: make(chan bool), + } + + txsStore := TxsStore{ + Ch: make(chan *txToStore), + Wg: new(sync.WaitGroup), + } + + batchConstraints := batchConstraints{ + MaxTxsPerBatch: 150, + MaxBatchBytesSize: 150000, + MaxCumulativeGasUsed: 30000000, + MaxKeccakHashes: 468, + MaxPoseidonHashes: 279620, + MaxPoseidonPaddings: 149796, + MaxMemAligns: 262144, + MaxArithmetics: 262144, + MaxBinaries: 262144, + MaxSteps: 8388608, + } + + testDbManager = newDBManager(ctx, nil, testState, nil, closingSignalCh, txsStore, batchConstraints) +} + +func initOrResetDB() { + if err := dbutils.InitOrResetState(stateDBCfg); err != nil { + panic(err) + } +} + +func TestOpenBatch(t *testing.T) { + setupDBManager() + defer stateDb.Close() + + dbTx, err := testState.BeginStateTransaction(ctx) + require.NoError(t, err) + + _, err = testState.SetGenesis(ctx, state.Block{}, state.Genesis{}, dbTx) + require.NoError(t, err) + + processingContext := state.ProcessingContext{ + BatchNumber: 1, + Coinbase: common.Address{}, + Timestamp: time.Now().UTC(), + GlobalExitRoot: common.Hash{}, + } + + err = testDbManager.OpenBatch(ctx, processingContext, dbTx) + require.NoError(t, err) + err = dbTx.Commit(ctx) + require.NoError(t, err) +} + +func TestGetLastBatchNumber(t *testing.T) { + setupDBManager() + defer stateDb.Close() + + dbTx, err := testState.BeginStateTransaction(ctx) + require.NoError(t, err) + + _, err = testState.SetGenesis(ctx, state.Block{}, state.Genesis{}, dbTx) + require.NoError(t, err) + + processingContext := state.ProcessingContext{ + BatchNumber: 1, + Coinbase: common.Address{}, + Timestamp: time.Now().UTC(), + GlobalExitRoot: common.Hash{}, + } + + err = testDbManager.OpenBatch(ctx, processingContext, dbTx) + require.NoError(t, err) + err = dbTx.Commit(ctx) + require.NoError(t, err) + + lastBatchNum, err := testDbManager.GetLastBatchNumber(ctx) + require.NoError(t, err) + require.Equal(t, uint64(1), lastBatchNum) +} + +func TestCreateFirstBatch(t *testing.T) { + setupDBManager() + defer stateDb.Close() + + dbTx, err := testState.BeginStateTransaction(ctx) + require.NoError(t, err) + _, err = testState.SetGenesis(ctx, state.Block{}, state.Genesis{}, dbTx) + require.NoError(t, err) + err = dbTx.Commit(ctx) + require.NoError(t, err) + + processingContext := testDbManager.CreateFirstBatch(ctx, common.Address{}) + require.Equal(t, uint64(1), processingContext.BatchNumber) +} diff --git a/sequencer/efficiencylist.go b/sequencer/efficiencylist.go new file mode 100644 index 0000000000..f22e5ff81a --- /dev/null +++ b/sequencer/efficiencylist.go @@ -0,0 +1,114 @@ +package sequencer + +import ( + "fmt" + "sort" + "sync" +) + +// efficiencyList represents a list of tx sorted by efficiency +type efficiencyList struct { + list map[string]*TxTracker + sorted []*TxTracker + mutex sync.Mutex +} + +// newEfficiencyList creates and init an efficiencyList +func newEfficiencyList() *efficiencyList { + return &efficiencyList{ + list: make(map[string]*TxTracker), + sorted: []*TxTracker{}, + } +} + +// add adds a tx to the efficiencyList +func (e *efficiencyList) add(tx *TxTracker) bool { + e.mutex.Lock() + defer e.mutex.Unlock() + + if _, found := e.list[tx.HashStr]; !found { + e.list[tx.HashStr] = tx + e.addSort(tx) + return true + } + return false +} + +// delete deletes the tx from the efficiencyList +func (e *efficiencyList) delete(tx *TxTracker) bool { + e.mutex.Lock() + defer e.mutex.Unlock() + + if tx, found := e.list[tx.HashStr]; found { + sLen := len(e.sorted) + i := sort.Search(sLen, func(i int) bool { + return e.isGreaterThan(tx, e.list[e.sorted[i].HashStr]) + }) + + if (e.sorted[i].HashStr != tx.HashStr) || i == sLen { + return false + } + + delete(e.list, tx.HashStr) + + copy(e.sorted[i:], e.sorted[i+1:]) + e.sorted[sLen-1] = nil + e.sorted = e.sorted[:sLen-1] + + return true + } + return false +} + +// getByIndex retrieves the tx at the i position in the sorted EfficiencyList +func (e *efficiencyList) getByIndex(i int) *TxTracker { + e.mutex.Lock() + defer e.mutex.Unlock() + + tx := e.sorted[i] + + return tx +} + +// len returns the length of the EfficiencyList +func (e *efficiencyList) len() int { + e.mutex.Lock() + defer e.mutex.Unlock() + + l := len(e.sorted) + + return l +} + +// print prints the contents of the EfficiencyList +func (e *efficiencyList) Print() { + e.mutex.Lock() + defer e.mutex.Unlock() + + fmt.Println("Len: ", len(e.sorted)) + for _, txi := range e.sorted { + fmt.Printf("Hash=%s, efficiency=%f\n", txi.HashStr, txi.Efficiency) + } +} + +// addSort adds the tx to the EfficiencyList in a sorted way +func (e *efficiencyList) addSort(tx *TxTracker) { + i := sort.Search(len(e.sorted), func(i int) bool { + return e.isGreaterThan(tx, e.list[e.sorted[i].HashStr]) + }) + + e.sorted = append(e.sorted, nil) + copy(e.sorted[i+1:], e.sorted[i:]) + e.sorted[i] = tx +} + +// isGreaterThan returns true if the tx1 has best efficiency than tx2 +func (e *efficiencyList) isGreaterThan(tx1 *TxTracker, tx2 *TxTracker) bool { + if tx1.Efficiency > tx2.Efficiency { + return true + } else if tx1.Efficiency == tx2.Efficiency { + return tx1.HashStr >= tx2.HashStr + } else { + return false + } +} diff --git a/sequencer/efficiencylist_test.go b/sequencer/efficiencylist_test.go new file mode 100644 index 0000000000..cd566edba8 --- /dev/null +++ b/sequencer/efficiencylist_test.go @@ -0,0 +1,94 @@ +package sequencer + +import ( + "crypto/rand" + "fmt" + "math/big" + "testing" + "time" +) + +// randomFloat64 is a shortcut for generating a random float between 0 and 1 using crypto/rand. +func randomFloat64() float64 { + nBig, err := rand.Int(rand.Reader, big.NewInt(1<<53)) + if err != nil { + panic(err) + } + return float64(nBig.Int64()) / (1 << 53) +} + +func TestEfficiencyListSort(t *testing.T) { + el := newEfficiencyList() + nItems := 100 + + for i := 0; i < nItems; i++ { + el.add(&TxTracker{HashStr: fmt.Sprintf("0x%d", i), Efficiency: randomFloat64()}) + } + + for i := 0; i < nItems-1; i++ { + if !(el.getByIndex(i).Efficiency > el.getByIndex(i+1).Efficiency) { + t.Fatalf("Sort error. [%d].Efficiency(%f) < [%d].Efficiency(%f)", i, el.getByIndex(i).Efficiency, i+1, el.getByIndex(i+1).Efficiency) + } + } + + // el.print() + + if el.len() != nItems { + t.Fatalf("Length error. Length %d. Expected %d", el.len(), nItems) + } +} + +func TestEfficiencyListDelete(t *testing.T) { + el := newEfficiencyList() + + el.add(&TxTracker{HashStr: "0x01", Efficiency: 1}) + el.add(&TxTracker{HashStr: "0x02", Efficiency: 2}) + el.add(&TxTracker{HashStr: "0x03", Efficiency: 2}) + el.add(&TxTracker{HashStr: "0x04", Efficiency: 3}) + el.add(&TxTracker{HashStr: "0x05", Efficiency: 10}) + el.add(&TxTracker{HashStr: "0x06", Efficiency: 1.5}) + el.add(&TxTracker{HashStr: "0x07", Efficiency: 1.5}) + + deltxs := []string{"0x03", "0x07", "0x01", "0x05"} + + for _, deltx := range deltxs { + count := el.len() + el.delete(&TxTracker{HashStr: deltx}) + + for i := 0; i < el.len(); i++ { + if el.getByIndex(i).HashStr == deltx { + t.Fatalf("Delete error. %s tx was not deleted", deltx) + } + } + + if el.len() != count-1 { + t.Fatalf("Length error. Length %d. Expected %d", el.len(), count) + } + } +} + +func TestEfficiencyListBench(t *testing.T) { + el := newEfficiencyList() + + start := time.Now() + for i := 0; i < 10000; i++ { + el.add(&TxTracker{HashStr: fmt.Sprintf("0x%d", i), Efficiency: randomFloat64()}) + } + elapsed := time.Since(start) + t.Logf("EfficiencyList adding 10000 items took %s", elapsed) + + start = time.Now() + el.add(&TxTracker{HashStr: fmt.Sprintf("0x%d", 10001), Efficiency: randomFloat64()}) + elapsed = time.Since(start) + t.Logf("EfficiencyList adding the 10001 item (efficiency=random) took %s", elapsed) + + start = time.Now() + el.add(&TxTracker{HashStr: fmt.Sprintf("0x%d", 10002), Efficiency: 0}) + elapsed = time.Since(start) + t.Logf("EfficiencyList adding the 10002 item (efficiency=0) took %s", elapsed) + + start = time.Now() + el.add(&TxTracker{HashStr: fmt.Sprintf("0x%d", 10003), Efficiency: 1000}) + elapsed = time.Since(start) + t.Logf("EfficiencyList adding the 10003 item (efficiency=1000) took %s", elapsed) +} diff --git a/sequencer/errors.go b/sequencer/errors.go new file mode 100644 index 0000000000..00f81f1ef9 --- /dev/null +++ b/sequencer/errors.go @@ -0,0 +1,37 @@ +package sequencer + +import ( + "fmt" +) + +var ( + // ErrBatchResourceBytesUnderflow happens when the batch runs out of bytes + ErrBatchResourceBytesUnderflow = NewBatchRemainingResourcesUnderflowError(nil, "Bytes") +) + +// BatchRemainingResourcesUnderflowError happens when the execution of a batch runs out of counters +type BatchRemainingResourcesUnderflowError struct { + Message string + Code int + Err error + ResourceName string +} + +// Error returns the error message +func (b BatchRemainingResourcesUnderflowError) Error() string { + return constructErrorMsg(b.ResourceName) +} + +// NewBatchRemainingResourcesUnderflowError creates a new BatchRemainingResourcesUnderflowError +func NewBatchRemainingResourcesUnderflowError(err error, resourceName string) error { + return &BatchRemainingResourcesUnderflowError{ + Message: constructErrorMsg(resourceName), + Code: 1, + Err: err, + ResourceName: resourceName, + } +} + +func constructErrorMsg(resourceName string) string { + return fmt.Sprintf("underflow of remaining resources for current batch. Resource %s", resourceName) +} diff --git a/sequencer/finalizer.go b/sequencer/finalizer.go new file mode 100644 index 0000000000..71cfa9ad81 --- /dev/null +++ b/sequencer/finalizer.go @@ -0,0 +1,844 @@ +package sequencer + +import ( + "context" + "errors" + "fmt" + "math/big" + "sync" + "time" + + "github.com/0xPolygonHermez/zkevm-node/log" + "github.com/0xPolygonHermez/zkevm-node/pool" + "github.com/0xPolygonHermez/zkevm-node/sequencer/metrics" + "github.com/0xPolygonHermez/zkevm-node/state" + "github.com/0xPolygonHermez/zkevm-node/state/runtime/executor" + "github.com/ethereum/go-ethereum/common" + "github.com/jackc/pgx/v4" +) + +const oneHundred = 100 + +var ( + now = time.Now +) + +// finalizer represents the finalizer component of the sequencer. +type finalizer struct { + cfg FinalizerCfg + txsStore TxsStore + closingSignalCh ClosingSignalCh + isSynced func(ctx context.Context) bool + sequencerAddress common.Address + worker workerInterface + dbManager dbManagerInterface + executor stateInterface + batch *WipBatch + batchConstraints batchConstraints + processRequest state.ProcessRequest + sharedResourcesMux *sync.RWMutex + lastGERHash common.Hash + // closing signals + nextGER common.Hash + nextGERDeadline int64 + nextGERMux *sync.RWMutex + nextForcedBatches []state.ForcedBatch + nextForcedBatchDeadline int64 + nextForcedBatchesMux *sync.RWMutex + nextSendingToL1Deadline int64 + nextSendingToL1TimeoutMux *sync.RWMutex + handlingL2Reorg bool +} + +// WipBatch represents a work-in-progress batch. +type WipBatch struct { + batchNumber uint64 + coinbase common.Address + initialStateRoot common.Hash + stateRoot common.Hash + localExitRoot common.Hash + timestamp uint64 + globalExitRoot common.Hash // 0x000...0 (ZeroHash) means to not update + remainingResources batchResources + countOfTxs int +} + +func (w *WipBatch) isEmpty() bool { + return w.countOfTxs == 0 +} + +// newFinalizer returns a new instance of Finalizer. +func newFinalizer( + cfg FinalizerCfg, + worker workerInterface, + dbManager dbManagerInterface, + executor stateInterface, + sequencerAddr common.Address, + isSynced func(ctx context.Context) bool, + closingSignalCh ClosingSignalCh, + txsStore TxsStore, + batchConstraints batchConstraints, +) *finalizer { + return &finalizer{ + cfg: cfg, + txsStore: txsStore, + closingSignalCh: closingSignalCh, + isSynced: isSynced, + sequencerAddress: sequencerAddr, + worker: worker, + dbManager: dbManager, + executor: executor, + batch: new(WipBatch), + batchConstraints: batchConstraints, + processRequest: state.ProcessRequest{}, + sharedResourcesMux: new(sync.RWMutex), + lastGERHash: state.ZeroHash, + // closing signals + nextGER: common.Hash{}, + nextGERDeadline: 0, + nextGERMux: new(sync.RWMutex), + nextForcedBatches: make([]state.ForcedBatch, 0), + nextForcedBatchDeadline: 0, + nextForcedBatchesMux: new(sync.RWMutex), + nextSendingToL1Deadline: 0, + nextSendingToL1TimeoutMux: new(sync.RWMutex), + } +} + +// Start starts the finalizer. +func (f *finalizer) Start(ctx context.Context, batch *WipBatch, processingReq *state.ProcessRequest) { + var err error + if batch != nil { + f.batch = batch + } else { + f.batch, err = f.dbManager.GetWIPBatch(ctx) + if err != nil { + log.Fatalf("failed to get work-in-progress batch from DB, Err: %s", err) + } + } + + if processingReq != nil { + f.processRequest = *processingReq + } else { + f.processRequest, err = f.prepareProcessRequestFromState(ctx, false) + if err != nil { + log.Errorf("failed to prepare process request from state, Err: %s", err) + } + } + + // Closing signals receiver + go f.listenForClosingSignals(ctx) + + // Processing transactions and finalizing batches + f.finalizeBatches(ctx) +} + +func (f *finalizer) SortForcedBatches(fb []state.ForcedBatch) []state.ForcedBatch { + if len(fb) == 0 { + return fb + } + // Sort by ForcedBatchNumber + for i := 0; i < len(fb)-1; i++ { + for j := i + 1; j < len(fb); j++ { + if fb[i].ForcedBatchNumber > fb[j].ForcedBatchNumber { + fb[i], fb[j] = fb[j], fb[i] + } + } + } + + return fb +} + +// listenForClosingSignals listens for signals for the batch and sets the deadline for when they need to be closed. +func (f *finalizer) listenForClosingSignals(ctx context.Context) { + for { + select { + case <-ctx.Done(): + log.Infof("finalizer closing signal listener received context done, Err: %s", ctx.Err()) + return + // ForcedBatch ch + case fb := <-f.closingSignalCh.ForcedBatchCh: + f.nextForcedBatchesMux.Lock() + f.nextForcedBatches = f.SortForcedBatches(append(f.nextForcedBatches, fb)) + if f.nextForcedBatchDeadline == 0 { + f.setNextForcedBatchDeadline() + } + f.nextForcedBatchesMux.Unlock() + // GlobalExitRoot ch + case ger := <-f.closingSignalCh.GERCh: + f.nextGERMux.Lock() + f.nextGER = ger + if f.nextGERDeadline == 0 { + f.setNextGERDeadline() + } + f.nextGERMux.Unlock() + // L2Reorg ch + case l2ReorgEvent := <-f.closingSignalCh.L2ReorgCh: + f.handlingL2Reorg = true + start := now() + go f.worker.HandleL2Reorg(l2ReorgEvent.TxHashes) + metrics.WorkerProcessingTime(time.Since(start)) + err := f.syncWithState(ctx, nil) + if err != nil { + log.Errorf("failed to sync with state, Err: %s", err) + } + f.handlingL2Reorg = false + // Too much time without batches in L1 ch + case <-f.closingSignalCh.SendingToL1TimeoutCh: + f.nextSendingToL1TimeoutMux.Lock() + if f.nextSendingToL1Deadline == 0 { + f.setNextSendingToL1Deadline() + } + f.nextSendingToL1TimeoutMux.Unlock() + } + } +} + +// finalizeBatches runs the endless loop for processing transactions finalizing batches. +func (f *finalizer) finalizeBatches(ctx context.Context) { + for { + start := now() + tx := f.worker.GetBestFittingTx(f.batch.remainingResources) + metrics.WorkerProcessingTime(time.Since(start)) + if tx != nil { + f.sharedResourcesMux.Lock() + _ = f.processTransaction(ctx, tx) + f.sharedResourcesMux.Unlock() + } else { + if f.isBatchAlmostFull() { + // Wait for all transactions to be stored in the DB + log.Infof("Closing batch: %d, because it's almost full.", f.batch.batchNumber) + // The perfect moment to finalize the batch + f.finalizeBatch(ctx) + } else { + // wait for new txs + if f.cfg.SleepDurationInMs.Duration > 0 { + time.Sleep(f.cfg.SleepDurationInMs.Duration) + } + } + } + + if f.isDeadlineEncountered() || f.isBatchFull() { + f.finalizeBatch(ctx) + } + + if err := ctx.Err(); err != nil { + log.Infof("Stopping finalizer because of context, err: %s", err) + return + } + } +} + +func (f *finalizer) isBatchFull() bool { + if f.batch.countOfTxs >= int(f.batchConstraints.MaxTxsPerBatch) { + log.Infof("Closing batch: %d, because it's full.", f.batch.batchNumber) + return true + } + return false +} + +// finalizeBatch retries to until successful closes the current batch and opens a new one, potentially processing forced batches between the batch is closed and the resulting new empty batch +func (f *finalizer) finalizeBatch(ctx context.Context) { + start := time.Now() + defer func() { + metrics.ProcessingTime(time.Since(start)) + }() + f.txsStore.Wg.Wait() + var err error + f.batch, err = f.newWIPBatch(ctx) + for err != nil { + log.Errorf("failed to create new work-in-progress batch, Err: %s", err) + f.batch, err = f.newWIPBatch(ctx) + } +} + +// newWIPBatch closes the current batch and opens a new one, potentially processing forced batches between the batch is closed and the resulting new empty batch +func (f *finalizer) newWIPBatch(ctx context.Context) (*WipBatch, error) { + f.sharedResourcesMux.Lock() + defer f.sharedResourcesMux.Unlock() + + var err error + // Passing the batch without txs to the executor in order to update the State + if f.batch.countOfTxs == 0 { + // backup current sequence + err = f.processTransaction(ctx, nil) + for err != nil { + log.Errorf("failed to process tx, err: %w", err) + err = f.processTransaction(ctx, nil) + } + } + + if f.batch.stateRoot.String() == "" || f.batch.localExitRoot.String() == "" { + return nil, errors.New("state root and local exit root must have value to close batch") + } + err = f.closeBatch(ctx) + if err != nil { + return nil, fmt.Errorf("failed to close batch, err: %w", err) + } + + // Reprocessing batch as sanity check + go func() { + err := f.reprocessBatch(ctx, f.batch.batchNumber) + if err != nil { + // TODO: design error handling for reprocessing + log.Errorf("failed to reprocess batch, err: %s", err) + return + } + }() + + // Metadata for the next batch + stateRoot := f.batch.stateRoot + lastBatchNumber := f.batch.batchNumber + + // Process Forced Batches + if len(f.nextForcedBatches) > 0 { + lastBatchNumber, stateRoot, err = f.processForcedBatches(ctx, lastBatchNumber, stateRoot) + if err != nil { + log.Errorf("failed to process forced batch, err: %s", err) + } + } + + // Take into consideration the GER + f.nextGERMux.Lock() + if f.nextGER != state.ZeroHash { + f.lastGERHash = f.nextGER + } + f.nextGER = state.ZeroHash + f.nextGERDeadline = 0 + f.nextGERMux.Unlock() + + // Reset nextSendingToL1Deadline + f.nextSendingToL1TimeoutMux.Lock() + f.nextSendingToL1Deadline = 0 + f.nextSendingToL1TimeoutMux.Unlock() + + batch, err := f.openWIPBatch(ctx, lastBatchNumber+1, f.lastGERHash, stateRoot) + if err == nil { + f.processRequest.Timestamp = batch.timestamp + f.processRequest.BatchNumber = batch.batchNumber + f.processRequest.OldStateRoot = stateRoot + f.processRequest.GlobalExitRoot = batch.globalExitRoot + f.processRequest.Transactions = make([]byte, 0, 1) + } + + return batch, err +} + +// processTransaction processes a single transaction. +func (f *finalizer) processTransaction(ctx context.Context, tx *TxTracker) error { + var txHash string + if tx != nil { + txHash = tx.Hash.String() + } + log := log.WithFields("txHash", txHash, "batchNumber", f.processRequest.BatchNumber) + start := time.Now() + defer func() { + metrics.ProcessingTime(time.Since(start)) + }() + + var ger common.Hash + if f.batch.isEmpty() { + ger = f.batch.globalExitRoot + } else { + ger = state.ZeroHash + } + + f.processRequest.GlobalExitRoot = ger + if tx != nil { + f.processRequest.Transactions = tx.RawTx + } else { + f.processRequest.Transactions = []byte{} + } + result, err := f.executor.ProcessBatch(ctx, f.processRequest) + if err != nil { + log.Errorf("failed to process transaction, err: %s", err) + return err + } + + err = f.handleSuccessfulTxProcessResp(ctx, tx, result) + if err != nil { + return err + } + + return nil +} + +// handleSuccessfulTxProcessResp handles the response of a successful transaction processing. +func (f *finalizer) handleSuccessfulTxProcessResp(ctx context.Context, tx *TxTracker, result *state.ProcessBatchResponse) error { + if len(result.Responses) > 0 { + // Handle Transaction Error + if result.Responses[0].RomError != nil { + f.handleTransactionError(ctx, result, tx) + return result.Responses[0].RomError + } + } + + // Check remaining resources + err := f.checkRemainingResources(result, tx) + if err != nil { + return err + } + + previousL2BlockStateRoot := f.batch.stateRoot + // Store the processed transaction, add it to the batch and update status in the pool atomically + f.storeProcessedTx(previousL2BlockStateRoot, tx, result) + f.processRequest.OldStateRoot = result.NewStateRoot + f.batch.stateRoot = result.NewStateRoot + f.batch.localExitRoot = result.NewLocalExitRoot + + return nil +} + +func (f *finalizer) storeProcessedTx(previousL2BlockStateRoot common.Hash, tx *TxTracker, result *state.ProcessBatchResponse) { + if tx == nil || len(result.Responses) == 0 { + return + } + + f.txsStore.Wg.Wait() + txResponse := result.Responses[0] + f.txsStore.Wg.Add(1) + f.txsStore.Ch <- &txToStore{ + batchNumber: f.batch.batchNumber, + txResponse: txResponse, + previousL2BlockStateRoot: previousL2BlockStateRoot, + } + + start := time.Now() + f.worker.UpdateAfterSingleSuccessfulTxExecution(tx.From, result.ReadWriteAddresses) + metrics.WorkerProcessingTime(time.Since(start)) + f.batch.countOfTxs += 1 +} + +// handleTransactionError handles the error of a transaction +func (f *finalizer) handleTransactionError(ctx context.Context, result *state.ProcessBatchResponse, tx *TxTracker) { + txResponse := result.Responses[0] + errorCode := executor.RomErrorCode(txResponse.RomError) + addressInfo := result.ReadWriteAddresses[tx.From] + + if executor.IsROMOutOfCountersError(errorCode) { + log.Errorf("ROM out of counters error, marking tx with Hash: %s as INVALID, errorCode: %s", tx.Hash.String(), errorCode.String()) + start := time.Now() + f.worker.DeleteTx(tx.Hash, tx.From) + metrics.WorkerProcessingTime(time.Since(start)) + go func() { + err := f.dbManager.UpdateTxStatus(ctx, tx.Hash, pool.TxStatusInvalid) + if err != nil { + log.Errorf("failed to update tx status, err: %s", err) + } + }() + } else if executor.IsIntrinsicError(errorCode) { + log.Errorf("intrinsic error, moving tx with Hash: %s to NOT READY, to not ready, err: %s", tx.Hash, txResponse.RomError) + var ( + nonce *uint64 + balance *big.Int + ) + if addressInfo != nil { + nonce = addressInfo.Nonce + balance = addressInfo.Balance + } + start := time.Now() + f.worker.MoveTxToNotReady(tx.Hash, tx.From, nonce, balance) + metrics.WorkerProcessingTime(time.Since(start)) + } +} + +// syncWithState syncs the WIP batch and processRequest with the state +func (f *finalizer) syncWithState(ctx context.Context, lastBatchNum *uint64) error { + f.sharedResourcesMux.Lock() + defer f.sharedResourcesMux.Unlock() + f.txsStore.Wg.Wait() + + var err error + for !f.isSynced(ctx) { + log.Info("wait for synchronizer to sync last batch") + time.Sleep(time.Second) + } + if lastBatchNum == nil { + batchNum, err := f.dbManager.GetLastBatchNumber(ctx) + for err != nil { + return fmt.Errorf("failed to get last batch number, err: %w", err) + } + lastBatchNum = &batchNum + } + + isClosed, err := f.dbManager.IsBatchClosed(ctx, *lastBatchNum) + if err != nil { + return fmt.Errorf("failed to check if batch is closed, err: %w", err) + } + if isClosed { + ger, _, err := f.dbManager.GetLatestGer(ctx, f.cfg.GERFinalityNumberOfBlocks) + if err != nil { + return fmt.Errorf("failed to get latest ger, err: %w", err) + } + _, oldStateRoot, err := f.getLastBatchNumAndOldStateRoot(ctx) + if err != nil { + return fmt.Errorf("failed to get old state root, err: %w", err) + } + f.batch, err = f.openWIPBatch(ctx, *lastBatchNum+1, ger.GlobalExitRoot, oldStateRoot) + if err != nil { + return err + } + } else { + f.batch, err = f.dbManager.GetWIPBatch(ctx) + if err != nil { + return fmt.Errorf("failed to get work-in-progress batch, err: %w", err) + } + } + + f.processRequest = state.ProcessRequest{ + BatchNumber: *lastBatchNum, + OldStateRoot: f.batch.initialStateRoot, + GlobalExitRoot: f.batch.globalExitRoot, + Coinbase: f.sequencerAddress, + Timestamp: f.batch.timestamp, + Transactions: make([]byte, 0, 1), + Caller: state.SequencerCallerLabel, + } + + return nil +} + +// processForcedBatches processes all the forced batches that are pending to be processed +func (f *finalizer) processForcedBatches(ctx context.Context, lastBatchNumberInState uint64, stateRoot common.Hash) (uint64, common.Hash, error) { + f.nextForcedBatchesMux.Lock() + defer f.nextForcedBatchesMux.Unlock() + f.nextForcedBatchDeadline = 0 + + dbTx, err := f.dbManager.BeginStateTransaction(ctx) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("failed to begin state transaction, err: %w", err) + } + lastTrustedForcedBatchNumber, err := f.dbManager.GetLastTrustedForcedBatchNumber(ctx, dbTx) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("failed to get last trusted forced batch number, err: %w", err) + } + nextForcedBatchNum := lastTrustedForcedBatchNumber + 1 + + for _, forcedBatch := range f.nextForcedBatches { + // Skip already processed forced batches + if forcedBatch.ForcedBatchNumber < nextForcedBatchNum { + continue + } + // Process in-between unprocessed forced batches + for forcedBatch.ForcedBatchNumber > nextForcedBatchNum { + lastBatchNumberInState, stateRoot = f.processForcedBatch(lastBatchNumberInState, stateRoot, forcedBatch) + nextForcedBatchNum += 1 + } + // Process the current forced batch from the channel queue + lastBatchNumberInState, stateRoot = f.processForcedBatch(lastBatchNumberInState, stateRoot, forcedBatch) + nextForcedBatchNum += 1 + } + f.nextForcedBatches = make([]state.ForcedBatch, 0) + + return lastBatchNumberInState, stateRoot, nil +} + +func (f *finalizer) processForcedBatch(lastBatchNumberInState uint64, stateRoot common.Hash, forcedBatch state.ForcedBatch) (uint64, common.Hash) { + processRequest := state.ProcessRequest{ + BatchNumber: lastBatchNumberInState + 1, + OldStateRoot: stateRoot, + GlobalExitRoot: forcedBatch.GlobalExitRoot, + Transactions: forcedBatch.RawTxsData, + Coinbase: f.sequencerAddress, + Timestamp: uint64(now().Unix()), + Caller: state.SequencerCallerLabel, + } + response, err := f.dbManager.ProcessForcedBatch(forcedBatch.ForcedBatchNumber, processRequest) + if err != nil { + // TODO: Think if need to design error handling for forced batches + log.Errorf("failed to process forced batch, err: %s", err) + } else { + stateRoot = response.NewStateRoot + lastBatchNumberInState += 1 + } + return lastBatchNumberInState, stateRoot +} + +// openWIPBatch opens a new batch in the state and returns it as WipBatch +func (f *finalizer) openWIPBatch(ctx context.Context, batchNum uint64, ger, stateRoot common.Hash) (*WipBatch, error) { + dbTx, err := f.dbManager.BeginStateTransaction(ctx) + if err != nil { + return nil, fmt.Errorf("failed to begin state transaction to open batch, err: %w", err) + } + + // open next batch + openBatchResp, err := f.openBatch(ctx, batchNum, ger, dbTx) + if err != nil { + if rollbackErr := dbTx.Rollback(ctx); rollbackErr != nil { + return nil, fmt.Errorf( + "failed to rollback dbTx: %s. Rollback err: %w", + rollbackErr.Error(), err, + ) + } + return nil, err + } + if err := dbTx.Commit(ctx); err != nil { + return nil, fmt.Errorf("failed to commit database transaction for opening a batch, err: %w", err) + } + + // Check if synchronizer is up-to-date + for !f.isSynced(ctx) { + log.Info("wait for synchronizer to sync last batch") + time.Sleep(time.Second) + } + + return &WipBatch{ + batchNumber: batchNum, + coinbase: f.sequencerAddress, + initialStateRoot: stateRoot, + stateRoot: stateRoot, + timestamp: uint64(openBatchResp.Timestamp.Unix()), + globalExitRoot: ger, + remainingResources: getMaxRemainingResources(f.batchConstraints), + }, err +} + +// closeBatch closes the current batch in the state +func (f *finalizer) closeBatch(ctx context.Context) error { + // We need to process the batch to update the state root before closing the batch + if f.batch.initialStateRoot == f.batch.stateRoot { + err := f.processTransaction(ctx, nil) + if err != nil { + return err + } + } + + transactions, err := f.dbManager.GetTransactionsByBatchNumber(ctx, f.batch.batchNumber) + if err != nil { + return fmt.Errorf("failed to get transactions from transactions, err: %w", err) + } + receipt := ClosingBatchParameters{ + BatchNumber: f.batch.batchNumber, + StateRoot: f.batch.stateRoot, + LocalExitRoot: f.batch.localExitRoot, + Txs: transactions, + } + return f.dbManager.CloseBatch(ctx, receipt) +} + +// openBatch opens a new batch in the state +func (f *finalizer) openBatch(ctx context.Context, num uint64, ger common.Hash, dbTx pgx.Tx) (state.ProcessingContext, error) { + processingCtx := state.ProcessingContext{ + BatchNumber: num, + Coinbase: f.sequencerAddress, + Timestamp: now(), + GlobalExitRoot: ger, + } + err := f.dbManager.OpenBatch(ctx, processingCtx, dbTx) + if err != nil { + return state.ProcessingContext{}, fmt.Errorf("failed to open new batch, err: %w", err) + } + + return processingCtx, nil +} + +// reprocessBatch reprocesses a batch used as sanity check +func (f *finalizer) reprocessBatch(ctx context.Context, batchNum uint64) error { + _, oldStateRoot, err := f.getLastBatchNumAndOldStateRoot(ctx) + if err != nil { + return fmt.Errorf("failed to get old state root, err: %w", err) + } + batch, err := f.dbManager.GetBatchByNumber(ctx, batchNum, nil) + if err != nil { + return fmt.Errorf("failed to get batch by number, err: %w", err) + } + processRequest := state.ProcessRequest{ + BatchNumber: batch.BatchNumber, + GlobalExitRoot: batch.GlobalExitRoot, + OldStateRoot: oldStateRoot, + Transactions: batch.BatchL2Data, + Coinbase: batch.Coinbase, + Timestamp: uint64(batch.Timestamp.Unix()), + Caller: state.DiscardCallerLabel, + } + result, err := f.executor.ProcessBatch(ctx, processRequest) + if err != nil { + log.Errorf("failed to process batch, err: %s", err) + return err + } + + if !result.IsBatchProcessed { + return fmt.Errorf("failed to process batch because OutOfCounters error") + } + + if result.NewStateRoot != batch.StateRoot { + log.Errorf("reprocessed batch has different state root, expected: %s, got: %s", batch.StateRoot.Hex(), result.NewStateRoot.Hex()) + } + + return nil +} + +// prepareProcessRequestFromState prepares process request from state +func (f *finalizer) prepareProcessRequestFromState(ctx context.Context, fetchTxs bool) (state.ProcessRequest, error) { + const two = 2 + + var ( + txs []byte + batchNum uint64 + oldStateRoot common.Hash + err error + ) + + if fetchTxs { + var lastClosedBatch *state.Batch + batches, err := f.dbManager.GetLastNBatches(ctx, two) + if err != nil { + return state.ProcessRequest{}, fmt.Errorf("failed to get last %d batches, err: %w", two, err) + } + + if len(batches) == two { + lastClosedBatch = batches[1] + } else { + lastClosedBatch = batches[0] + } + + batchNum = lastClosedBatch.BatchNumber + oldStateRoot = f.getOldStateRootFromBatches(batches) + txs = lastClosedBatch.BatchL2Data + if err != nil { + return state.ProcessRequest{}, err + } + } else { + txs = make([]byte, 0, 1) + batchNum, oldStateRoot, err = f.getLastBatchNumAndOldStateRoot(ctx) + if err != nil { + return state.ProcessRequest{}, err + } + } + + return state.ProcessRequest{ + BatchNumber: batchNum, + OldStateRoot: oldStateRoot, + GlobalExitRoot: f.batch.globalExitRoot, + Coinbase: f.sequencerAddress, + Timestamp: f.batch.timestamp, + Transactions: txs, + Caller: state.SequencerCallerLabel, + }, nil +} + +func (f *finalizer) getLastBatchNumAndOldStateRoot(ctx context.Context) (uint64, common.Hash, error) { + const two = 2 + var oldStateRoot common.Hash + batches, err := f.dbManager.GetLastNBatches(ctx, two) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("failed to get last %d batches, err: %w", two, err) + } + lastBatch := batches[0] + + oldStateRoot = f.getOldStateRootFromBatches(batches) + return lastBatch.BatchNumber, oldStateRoot, nil +} + +func (f *finalizer) getOldStateRootFromBatches(batches []*state.Batch) common.Hash { + const one = 1 + const two = 2 + var oldStateRoot common.Hash + if len(batches) == one { + oldStateRoot = batches[0].StateRoot + } else if len(batches) == two { + oldStateRoot = batches[1].StateRoot + } + + return oldStateRoot +} + +// isDeadlineEncountered returns true if any closing signal deadline is encountered +func (f *finalizer) isDeadlineEncountered() bool { + // Forced batch deadline + if f.nextForcedBatchDeadline != 0 && now().Unix() >= f.nextForcedBatchDeadline { + log.Infof("Closing batch: %d, forced batch deadline encountered.", f.batch.batchNumber) + return true + } + // Global Exit Root deadline + if f.nextGERDeadline != 0 && now().Unix() >= f.nextGERDeadline { + log.Infof("Closing batch: %d, Global Exit Root deadline encountered.", f.batch.batchNumber) + return true + } + // Delayed batch deadline + if f.nextSendingToL1Deadline != 0 && now().Unix() >= f.nextSendingToL1Deadline { + if f.batch.isEmpty() { + f.setNextSendingToL1Deadline() + } else { + log.Infof("Closing batch: %d, Sending to L1 deadline encountered.", f.batch.batchNumber) + } + + return true + } + + return false +} + +// checkRemainingResources checks if the transaction uses less resources than the remaining ones in the batch. +func (f *finalizer) checkRemainingResources(result *state.ProcessBatchResponse, tx *TxTracker) error { + if len(result.Responses) == 0 { + return nil + } + + usedResources := batchResources{ + zKCounters: result.UsedZkCounters, + bytes: uint64(len(tx.RawTx)), + } + + err := f.batch.remainingResources.sub(usedResources) + if err != nil { + log.Infof("current transaction exceeds the batch limit, updating metadata for tx in worker and continuing") + start := time.Now() + f.worker.UpdateTx(result.Responses[0].TxHash, tx.From, usedResources.zKCounters) + metrics.WorkerProcessingTime(time.Since(start)) + return err + } + + return nil +} + +// isBatchAlmostFull checks if the current batch remaining resources are under the constraints threshold for most efficient moment to close a batch +func (f *finalizer) isBatchAlmostFull() bool { + resources := f.batch.remainingResources + zkCounters := resources.zKCounters + if resources.bytes <= f.getConstraintThresholdUint64(f.batchConstraints.MaxBatchBytesSize) { + return true + } + if zkCounters.UsedSteps <= f.getConstraintThresholdUint32(f.batchConstraints.MaxSteps) { + return true + } + if zkCounters.UsedPoseidonPaddings <= f.getConstraintThresholdUint32(f.batchConstraints.MaxPoseidonPaddings) { + return true + } + if zkCounters.UsedBinaries <= f.getConstraintThresholdUint32(f.batchConstraints.MaxBinaries) { + return true + } + if zkCounters.UsedKeccakHashes <= f.getConstraintThresholdUint32(f.batchConstraints.MaxKeccakHashes) { + return true + } + if zkCounters.UsedArithmetics <= f.getConstraintThresholdUint32(f.batchConstraints.MaxArithmetics) { + return true + } + if zkCounters.UsedMemAligns <= f.getConstraintThresholdUint32(f.batchConstraints.MaxMemAligns) { + return true + } + if zkCounters.CumulativeGasUsed <= f.getConstraintThresholdUint64(f.batchConstraints.MaxCumulativeGasUsed) { + return true + } + return false +} + +func (f *finalizer) setNextForcedBatchDeadline() { + f.nextForcedBatchDeadline = now().Unix() + int64(f.cfg.ForcedBatchDeadlineTimeoutInSec.Duration.Seconds()) +} + +func (f *finalizer) setNextGERDeadline() { + f.nextGERDeadline = now().Unix() + int64(f.cfg.GERDeadlineTimeoutInSec.Duration.Seconds()) +} + +func (f *finalizer) setNextSendingToL1Deadline() { + f.nextSendingToL1Deadline = now().Unix() + int64(f.cfg.SendingToL1DeadlineTimeoutInSec.Duration.Seconds()) +} + +func (f *finalizer) getConstraintThresholdUint64(input uint64) uint64 { + return input * uint64(f.cfg.ResourcePercentageToCloseBatch) / oneHundred +} + +func (f *finalizer) getConstraintThresholdUint32(input uint32) uint32 { + return uint32(input*f.cfg.ResourcePercentageToCloseBatch) / oneHundred +} diff --git a/sequencer/finalizer_test.go b/sequencer/finalizer_test.go new file mode 100644 index 0000000000..2509685560 --- /dev/null +++ b/sequencer/finalizer_test.go @@ -0,0 +1,1217 @@ +package sequencer + +import ( + "context" + "fmt" + "math/big" + "sync" + "testing" + "time" + + cfgTypes "github.com/0xPolygonHermez/zkevm-node/config/types" + "github.com/0xPolygonHermez/zkevm-node/pool" + "github.com/0xPolygonHermez/zkevm-node/state" + "github.com/0xPolygonHermez/zkevm-node/state/runtime/executor" + "github.com/0xPolygonHermez/zkevm-node/state/runtime/executor/pb" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +var ( + f *finalizer + nilErr error + dbManagerMock = new(DbManagerMock) + executorMock = new(StateMock) + workerMock = new(WorkerMock) + dbTxMock = new(DbTxMock) + bc = batchConstraints{ + MaxTxsPerBatch: 150, + MaxBatchBytesSize: 150000, + MaxCumulativeGasUsed: 30000000, + MaxKeccakHashes: 468, + MaxPoseidonHashes: 279620, + MaxPoseidonPaddings: 149796, + MaxMemAligns: 262144, + MaxArithmetics: 262144, + MaxBinaries: 262144, + MaxSteps: 8388608, + } + txsStore = TxsStore{ + Ch: make(chan *txToStore, 1), + Wg: new(sync.WaitGroup), + } + closingSignalCh = ClosingSignalCh{ + ForcedBatchCh: make(chan state.ForcedBatch), + GERCh: make(chan common.Hash), + L2ReorgCh: make(chan L2ReorgEvent), + SendingToL1TimeoutCh: make(chan bool), + } + cfg = FinalizerCfg{ + GERDeadlineTimeoutInSec: cfgTypes.Duration{ + Duration: 60, + }, + ForcedBatchDeadlineTimeoutInSec: cfgTypes.Duration{ + Duration: 60, + }, + SendingToL1DeadlineTimeoutInSec: cfgTypes.Duration{ + Duration: 60, + }, + SleepDurationInMs: cfgTypes.Duration{ + Duration: 60, + }, + ResourcePercentageToCloseBatch: 10, + GERFinalityNumberOfBlocks: 64, + } + seqAddr = common.Address{} + oldHash = common.HexToHash("0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f2") + newHash = common.HexToHash("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855") + sender = common.HexToAddress("0x3445324") + isSynced = func(ctx context.Context) bool { + return true + } + // tx1 = ethTypes.NewTransaction(0, common.HexToAddress("0"), big.NewInt(0), 0, big.NewInt(0), []byte("aaa")) + // tx2 = ethTypes.NewTransaction(1, common.HexToAddress("1"), big.NewInt(1), 0, big.NewInt(1), []byte("bbb")) + + testErr = fmt.Errorf("some error") + testErr2 = fmt.Errorf("some error2") + openBatchError = fmt.Errorf("failed to open new batch, err: %w", testErr) + cumulativeGasErr = state.GetZKCounterError("CumulativeGasUsed") +) + +func testNow() time.Time { + return time.Unix(0, 0) +} + +func TestNewFinalizer(t *testing.T) { + // arrange and act + f = newFinalizer(cfg, workerMock, dbManagerMock, executorMock, seqAddr, isSynced, closingSignalCh, txsStore, bc) + + // assert + assert.NotNil(t, f) + assert.Equal(t, f.cfg, cfg) + assert.Equal(t, f.worker, workerMock) + assert.Equal(t, f.dbManager, dbManagerMock) + assert.Equal(t, f.executor, executorMock) + assert.Equal(t, f.sequencerAddress, seqAddr) + assert.Equal(t, f.closingSignalCh, closingSignalCh) + assert.Equal(t, f.txsStore, txsStore) + assert.Equal(t, f.batchConstraints, bc) +} + +// +//func TestFinalizer_newWIPBatch(t *testing.T) { +// // arrange +// f = setupFinalizer(true) +// now = testNow +// defer func() { +// now = time.Now +// }() +// +// txs := make([]types.Transaction, 0) +// batchNum := f.batch.batchNumber + 1 +// f.processRequest.GlobalExitRoot = oldHash +// f.processRequest.OldStateRoot = oldHash +// f.processRequest.Transactions = []byte{} +// expectedWipBatch := &WipBatch{ +// batchNumber: batchNum, +// coinbase: f.sequencerAddress, +// initialStateRoot: newHash, +// stateRoot: newHash, +// timestamp: uint64(now().Unix()), +// remainingResources: getMaxRemainingResources(f.batchConstraints), +// } +// closeBatchParams := ClosingBatchParameters{ +// BatchNumber: f.batch.batchNumber, +// StateRoot: f.batch.stateRoot, +// LocalExitRoot: f.batch.localExitRoot, +// Txs: txs, +// } +// batches := []*state.Batch{ +// { +// BatchNumber: 0, +// StateRoot: oldHash, +// }, +// } +// testCases := []struct { +// name string +// batches []*state.Batch +// closeBatchErr error +// closeBatchParams ClosingBatchParameters +// openBatchErr error +// expectedWip *WipBatch +// expectedErr error +// }{ +// { +// name: "Success", +// expectedWip: expectedWipBatch, +// closeBatchParams: closeBatchParams, +// batches: batches, +// }, +// { +// name: "Close Batch Error", +// expectedWip: expectedWipBatch, +// closeBatchParams: closeBatchParams, +// batches: batches, +// closeBatchErr: testErr, +// expectedErr: fmt.Errorf("failed to close batch, err: %w", testErr), +// }, +// { +// name: "Open Batch Error", +// expectedWip: expectedWipBatch, +// closeBatchParams: closeBatchParams, +// batches: batches, +// openBatchErr: testErr, +// expectedErr: fmt.Errorf("failed to open new batch, err: %w", testErr), +// }, +// } +// for _, tc := range testCases { +// t.Run(tc.name, func(t *testing.T) { +// // arrange +// dbManagerMock.On("CloseBatch", ctx, tc.closeBatchParams).Return(tc.closeBatchErr).Once() +// executorMock.On("ProcessBatch", ctx, f.processRequest).Return(&state.ProcessBatchResponse{ +// IsBatchProcessed: true, +// }, nilErr).Once() +// +// if tc.expectedErr == nil { +// dbManagerMock.On("GetTransactionsByBatchNumber", ctx, f.batch.batchNumber).Return(txs, nilErr).Once() +// } +// +// if tc.closeBatchErr == nil { +// dbManagerMock.On("BeginStateTransaction", ctx).Return(dbTxMock, nilErr).Once() +// dbManagerMock.On("OpenBatch", ctx, mock.Anything, dbTxMock).Return(tc.openBatchErr).Once() +// +// // Async Calls from reprocessBatch +// dbManagerMock.On("GetLastNBatches", ctx, uint(2)).Return(tc.batches, nilErr).Maybe() +// dbManagerMock.On("GetTransactionsByBatchNumber", ctx, f.batch.batchNumber).Return(txs, nilErr).Maybe() +// processRequest := f.processRequest +// processRequest.Caller = state.DiscardCallerLabel +// processRequest.Timestamp = f.batch.timestamp +// executorMock.On("ProcessBatch", ctx, processRequest).Return(&state.ProcessBatchResponse{ +// NewStateRoot: f.batch.stateRoot, +// NewLocalExitRoot: f.batch.localExitRoot, +// +// IsBatchProcessed: true, +// }, nilErr).Maybe() +// +// if tc.openBatchErr == nil { +// dbTxMock.On("Commit", ctx).Return(nilErr).Once() +// } else { +// dbTxMock.On("Rollback", ctx).Return(nilErr).Once() +// } +// } +// +// // act +// wipBatch, err := f.newWIPBatch(ctx) +// +// // assert +// if tc.expectedErr != nil { +// assert.Error(t, err) +// assert.EqualError(t, err, tc.expectedErr.Error()) +// assert.Nil(t, wipBatch) +// } else { +// assert.NoError(t, err) +// assert.Equal(t, tc.expectedWip, wipBatch) +// } +// dbManagerMock.AssertExpectations(t) +// dbTxMock.AssertExpectations(t) +// }) +// } +//} + +func TestFinalizer_handleTransactionError(t *testing.T) { + // arrange + f = setupFinalizer(true) + nonce := uint64(0) + tx := &TxTracker{Hash: oldHash, From: sender} + testCases := []struct { + name string + error pb.RomError + expectedDeleteCall bool + expectedMoveCall bool + }{ + { + name: "OutOfCountersError", + error: pb.RomError(executor.ROM_ERROR_OUT_OF_COUNTERS_STEP), + expectedDeleteCall: true, + }, + { + name: "IntrinsicError", + error: pb.RomError(executor.ROM_ERROR_INTRINSIC_INVALID_SIGNATURE), + expectedMoveCall: true, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // arrange + if tc.expectedDeleteCall { + workerMock.On("DeleteTx", oldHash, sender).Return().Once() + dbManagerMock.On("UpdateTxStatus", ctx, oldHash, pool.TxStatusInvalid).Return(nil).Once() + } + if tc.expectedMoveCall { + workerMock.On("MoveTxToNotReady", oldHash, sender, &nonce, big.NewInt(0)).Return().Once() + } + + result := &state.ProcessBatchResponse{ + ReadWriteAddresses: map[common.Address]*state.InfoReadWrite{ + sender: {Nonce: &nonce, Balance: big.NewInt(0)}, + }, + Responses: []*state.ProcessTransactionResponse{{ + RomError: executor.RomErr(tc.error), + }, + }, + } + + // act + f.handleTransactionError(ctx, result, tx) + + // assert + workerMock.AssertExpectations(t) + }) + } +} + +func TestFinalizer_syncWithState(t *testing.T) { + // arrange + f = setupFinalizer(true) + now = testNow + defer func() { + now = time.Now + }() + one := uint64(1) + batches := []*state.Batch{ + { + BatchNumber: 1, + StateRoot: oldHash, + GlobalExitRoot: oldHash, + }, + } + testCases := []struct { + name string + batches []*state.Batch + lastBatchNum *uint64 + isBatchClosed bool + ger common.Hash + getWIPBatchErr error + openBatchErr error + isBatchClosedErr error + getLastBatchNumErr error + expectedProcessingCtx state.ProcessingContext + expectedBatch *WipBatch + expectedErr error + }{ + { + name: "Success-Closed Batch", + lastBatchNum: &one, + isBatchClosed: true, + ger: oldHash, + batches: batches, + expectedBatch: &WipBatch{ + batchNumber: one + 1, + coinbase: f.sequencerAddress, + initialStateRoot: oldHash, + stateRoot: oldHash, + timestamp: uint64(testNow().Unix()), + globalExitRoot: oldHash, + remainingResources: getMaxRemainingResources(f.batchConstraints), + }, + expectedProcessingCtx: state.ProcessingContext{ + BatchNumber: one + 1, + Coinbase: f.sequencerAddress, + Timestamp: testNow(), + GlobalExitRoot: oldHash, + }, + expectedErr: nil, + }, + { + name: "Success-Open Batch", + lastBatchNum: &one, + isBatchClosed: false, + ger: common.Hash{}, + expectedBatch: &WipBatch{ + batchNumber: one, + coinbase: f.sequencerAddress, + initialStateRoot: oldHash, + stateRoot: oldHash, + timestamp: uint64(testNow().Unix()), + globalExitRoot: oldHash, + remainingResources: getMaxRemainingResources(f.batchConstraints), + }, + expectedProcessingCtx: state.ProcessingContext{ + BatchNumber: one, + Coinbase: f.sequencerAddress, + Timestamp: testNow(), + GlobalExitRoot: oldHash, + }, + }, + { + name: "Error-Failed to get last batch number", + lastBatchNum: nil, + batches: batches, + isBatchClosed: true, + ger: oldHash, + getLastBatchNumErr: testErr, + expectedErr: fmt.Errorf("failed to get last batch number, err: %w", testErr), + }, + { + name: "Error-Failed to check if batch is closed", + lastBatchNum: &one, + batches: batches, + isBatchClosed: true, + ger: oldHash, + isBatchClosedErr: testErr, + expectedErr: fmt.Errorf("failed to check if batch is closed, err: %w", testErr), + }, + { + name: "Error-Failed to get work-in-progress batch", + lastBatchNum: &one, + batches: batches, + isBatchClosed: false, + ger: common.Hash{}, + getWIPBatchErr: testErr, + expectedErr: fmt.Errorf("failed to get work-in-progress batch, err: %w", testErr), + }, + { + name: "Error-Failed to open new batch", + lastBatchNum: &one, + batches: batches, + isBatchClosed: true, + ger: oldHash, + openBatchErr: testErr, + expectedProcessingCtx: state.ProcessingContext{ + BatchNumber: one + 1, + Coinbase: f.sequencerAddress, + Timestamp: testNow(), + GlobalExitRoot: oldHash, + }, + expectedErr: fmt.Errorf("failed to open new batch, err: %w", testErr), + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // arrange + if tc.lastBatchNum == nil { + dbManagerMock.Mock.On("GetLastBatchNumber", ctx).Return(one, tc.getLastBatchNumErr).Once() + } + + if tc.getLastBatchNumErr == nil { + dbManagerMock.Mock.On("IsBatchClosed", ctx, *tc.lastBatchNum).Return(tc.isBatchClosed, tc.isBatchClosedErr).Once() + } + + if tc.isBatchClosed { + if tc.getLastBatchNumErr == nil && tc.isBatchClosedErr == nil { + dbManagerMock.On("GetLastNBatches", ctx, uint(2)).Return(tc.batches, nilErr).Once() + dbManagerMock.On("OpenBatch", ctx, tc.expectedProcessingCtx, dbTxMock).Return(tc.openBatchErr).Once() + } + + if tc.getLastBatchNumErr == nil && tc.isBatchClosedErr == nil { + dbManagerMock.Mock.On("GetLatestGer", ctx, f.cfg.GERFinalityNumberOfBlocks).Return(state.GlobalExitRoot{GlobalExitRoot: tc.ger}, testNow(), nil).Once() + dbManagerMock.On("BeginStateTransaction", ctx).Return(dbTxMock, nil).Once() + if tc.openBatchErr == nil { + dbTxMock.On("Commit", ctx).Return(nil).Once() + } + } + if tc.expectedErr != nil && tc.openBatchErr != nil { + dbTxMock.On("Rollback", ctx).Return(nil).Once() + } + } else { + dbManagerMock.Mock.On("GetWIPBatch", ctx).Return(tc.expectedBatch, tc.getWIPBatchErr).Once() + } + + // act + err := f.syncWithState(ctx, tc.lastBatchNum) + + // assert + if tc.expectedErr != nil { + assert.Error(t, err) + assert.EqualError(t, err, tc.expectedErr.Error()) + } else { + assert.NoError(t, err) + assert.Equal(t, tc.expectedBatch, f.batch) + } + dbManagerMock.AssertExpectations(t) + }) + } +} + +func TestFinalizer_processForcedBatches(t *testing.T) { + // arrange + var err error + f = setupFinalizer(false) + now = testNow + defer func() { + now = time.Now + }() + RawTxsData1 := make([]byte, 0, 2) + RawTxsData1 = append(RawTxsData1, []byte("forced tx 1")...) + RawTxsData1 = append(RawTxsData1, []byte("forced tx 2")...) + RawTxsData2 := make([]byte, 0, 2) + RawTxsData2 = append(RawTxsData2, []byte("forced tx 3")...) + RawTxsData2 = append(RawTxsData2, []byte("forced tx 4")...) + batchNumber := f.batch.batchNumber + stateRoot := oldHash + forcedBatch1 := state.ForcedBatch{ + ForcedBatchNumber: 2, + GlobalExitRoot: oldHash, + RawTxsData: RawTxsData1, + } + forcedBatch2 := state.ForcedBatch{ + ForcedBatchNumber: 3, + GlobalExitRoot: oldHash, + RawTxsData: RawTxsData2, + } + testCases := []struct { + name string + forcedBatch []state.ForcedBatch + getLastTrustedForcedBatchNumErr error + expectedErr error + }{ + { + name: "Success", + forcedBatch: []state.ForcedBatch{forcedBatch1, forcedBatch2}, + }, + { + name: "GetLastTrustedForcedBatchNumber_Error", + forcedBatch: []state.ForcedBatch{forcedBatch1}, + getLastTrustedForcedBatchNumErr: testErr, + expectedErr: fmt.Errorf("failed to get last trusted forced batch number, err: %s", testErr), + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // arrange + f.nextForcedBatches = tc.forcedBatch + internalBatchNumber := batchNumber + dbManagerMock.On("BeginStateTransaction", ctx).Return(dbTxMock, nil).Once() + dbManagerMock.On("GetLastTrustedForcedBatchNumber", ctx, dbTxMock).Return(uint64(1), tc.getLastTrustedForcedBatchNumErr).Once() + + for _, forcedBatch := range tc.forcedBatch { + internalBatchNumber += 1 + processRequest := state.ProcessRequest{ + BatchNumber: internalBatchNumber, + OldStateRoot: stateRoot, + GlobalExitRoot: forcedBatch.GlobalExitRoot, + Transactions: forcedBatch.RawTxsData, + Coinbase: f.sequencerAddress, + Timestamp: uint64(now().Unix()), + Caller: state.SequencerCallerLabel, + } + dbManagerMock.On("ProcessForcedBatch", forcedBatch.ForcedBatchNumber, processRequest).Return(&state.ProcessBatchResponse{ + NewStateRoot: stateRoot, + NewBatchNumber: internalBatchNumber, + }, nilErr).Once() + } + + // act + batchNumber, stateRoot, err = f.processForcedBatches(ctx, batchNumber, stateRoot) + + // assert + if tc.expectedErr != nil { + assert.EqualError(t, err, tc.expectedErr.Error()) + } else { + assert.NoError(t, tc.expectedErr) + dbManagerMock.AssertExpectations(t) + } + }) + } +} + +func TestFinalizer_openWIPBatch(t *testing.T) { + // arrange + f = setupFinalizer(true) + now = testNow + defer func() { + now = time.Now + }() + batchNum := f.batch.batchNumber + 1 + expectedWipBatch := &WipBatch{ + batchNumber: batchNum, + coinbase: f.sequencerAddress, + initialStateRoot: oldHash, + stateRoot: oldHash, + timestamp: uint64(now().Unix()), + globalExitRoot: oldHash, + remainingResources: getMaxRemainingResources(f.batchConstraints), + } + testCases := []struct { + name string + openBatchErr error + beginTxErr error + commitErr error + rollbackErr error + expectedWip *WipBatch + expectedErr error + }{ + { + name: "Success", + expectedWip: expectedWipBatch, + }, + { + name: "BeginTransaction Error", + beginTxErr: testErr, + expectedErr: fmt.Errorf("failed to begin state transaction to open batch, err: %w", testErr), + }, + { + name: "OpenBatch Error", + openBatchErr: testErr, + expectedErr: fmt.Errorf("failed to open new batch, err: %w", testErr), + }, + { + name: "Commit Error", + commitErr: testErr, + expectedErr: fmt.Errorf("failed to commit database transaction for opening a batch, err: %w", testErr), + }, + { + name: "Rollback Error", + openBatchErr: testErr, + rollbackErr: testErr, + expectedErr: fmt.Errorf( + "failed to rollback dbTx: %s. Rollback err: %w", + testErr.Error(), openBatchError, + ), + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // arrange + dbManagerMock.On("BeginStateTransaction", ctx).Return(dbTxMock, tc.beginTxErr).Once() + if tc.beginTxErr == nil { + dbManagerMock.On("OpenBatch", ctx, mock.Anything, dbTxMock).Return(tc.openBatchErr).Once() + } + + if tc.expectedErr != nil && (tc.rollbackErr != nil || tc.openBatchErr != nil) { + dbTxMock.On("Rollback", ctx).Return(tc.rollbackErr).Once() + } + + if tc.expectedErr == nil || tc.commitErr != nil { + dbTxMock.On("Commit", ctx).Return(tc.commitErr).Once() + } + + // act + wipBatch, err := f.openWIPBatch(ctx, batchNum, oldHash, oldHash) + + // assert + if tc.expectedErr != nil { + assert.Error(t, err) + assert.EqualError(t, err, tc.expectedErr.Error()) + assert.Nil(t, wipBatch) + } else { + assert.NoError(t, err) + assert.Equal(t, tc.expectedWip, wipBatch) + } + dbManagerMock.AssertExpectations(t) + dbTxMock.AssertExpectations(t) + }) + } +} + +// TestFinalizer_closeBatch tests the closeBatch method. +func TestFinalizer_closeBatch(t *testing.T) { + // arrange + f = setupFinalizer(true) + txs := make([]types.Transaction, 0) + receipt := ClosingBatchParameters{ + BatchNumber: f.batch.batchNumber, + StateRoot: f.batch.stateRoot, + LocalExitRoot: f.processRequest.GlobalExitRoot, + Txs: txs, + } + managerErr := fmt.Errorf("some error") + testCases := []struct { + name string + managerErr error + expectedErr error + }{ + { + name: "Success", + managerErr: nil, + expectedErr: nil, + }, + { + name: "Manager Error", + managerErr: managerErr, + expectedErr: fmt.Errorf("failed to get transactions from transactions, err: %w", managerErr), + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // arrange + dbManagerMock.Mock.On("CloseBatch", ctx, receipt).Return(tc.managerErr).Once() + dbManagerMock.Mock.On("GetTransactionsByBatchNumber", ctx, receipt.BatchNumber).Return(txs, tc.managerErr).Once() + + // act + err := f.closeBatch(ctx) + + // assert + if tc.expectedErr != nil { + assert.Error(t, err) + assert.EqualError(t, err, tc.expectedErr.Error()) + assert.ErrorIs(t, err, tc.managerErr) + } else { + assert.NoError(t, err) + } + }) + } +} + +func TestFinalizer_openBatch(t *testing.T) { + // arrange + f = setupFinalizer(true) + now = testNow + defer func() { + now = time.Now + }() + batchNum := f.batch.batchNumber + 1 + testCases := []struct { + name string + batchNum uint64 + managerErr error + expectedCtx state.ProcessingContext + expectedErr error + }{ + { + name: "Success", + batchNum: batchNum, + managerErr: nil, + expectedCtx: state.ProcessingContext{ + BatchNumber: batchNum, + Coinbase: f.sequencerAddress, + Timestamp: now(), + GlobalExitRoot: oldHash, + }, + expectedErr: nil, + }, + { + name: "Manager Error", + batchNum: batchNum, + managerErr: testErr, + expectedCtx: state.ProcessingContext{}, + expectedErr: openBatchError, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // arrange + dbManagerMock.Mock.On("OpenBatch", mock.Anything, mock.Anything, mock.Anything).Return(tc.managerErr).Once() + + // act + actualCtx, err := f.openBatch(ctx, tc.batchNum, oldHash, nil) + + // assert + if tc.expectedErr != nil { + assert.Error(t, err) + assert.EqualError(t, err, tc.expectedErr.Error()) + assert.ErrorIs(t, err, tc.managerErr) + assert.Empty(t, actualCtx) + } else { + assert.NoError(t, err) + assert.Equal(t, tc.expectedCtx, actualCtx) + } + dbManagerMock.AssertExpectations(t) + }) + } +} + +// TestFinalizer_reprocessBatch is a test for reprocessBatch which tests all possible cases of reprocessBatch +func TestFinalizer_reprocessBatch(t *testing.T) { + // arrange + now = testNow + defer func() { + now = time.Now + }() + + f = setupFinalizer(true) + n := uint(2) + expectedProcessBatchRequest := state.ProcessRequest{ + BatchNumber: f.batch.batchNumber, + OldStateRoot: oldHash, + Coinbase: f.sequencerAddress, + Timestamp: f.batch.timestamp, + Caller: state.DiscardCallerLabel, + } + batches := []*state.Batch{ + { + BatchNumber: f.batch.batchNumber, + StateRoot: newHash, + Timestamp: testNow(), + }, + { + BatchNumber: f.batch.batchNumber - 1, + GlobalExitRoot: oldHash, + StateRoot: oldHash, + Timestamp: testNow(), + }, + } + + // TODO: Add missing cases for this test + testCases := []struct { + name string + getLastNBatchesErr error + processBatchErr error + batches []*state.Batch + expectedErr error + internalErr error + expectedProcessRequest state.ProcessRequest + expectedProcessBatchResult *state.ProcessBatchResponse + }{ + { + name: "Success", + batches: batches, + expectedProcessRequest: expectedProcessBatchRequest, + expectedProcessBatchResult: &state.ProcessBatchResponse{ + NewStateRoot: newHash, + IsBatchProcessed: true, + }, + }, + { + name: "GetLastNBatches Error", + getLastNBatchesErr: testErr, + internalErr: testErr, + expectedErr: fmt.Errorf("failed to get old state root, err: failed to get last %d batches, err: %w", n, testErr), + }, + { + name: "ProcessBatch Error", + processBatchErr: testErr, + internalErr: testErr, + expectedErr: testErr, + expectedProcessRequest: expectedProcessBatchRequest, + batches: batches, + }, + { + name: "ProcessBatch Result Error", + processBatchErr: testErr, + internalErr: testErr, + expectedProcessRequest: expectedProcessBatchRequest, + expectedErr: testErr, + batches: batches, + expectedProcessBatchResult: &state.ProcessBatchResponse{ + IsBatchProcessed: false, + ExecutorError: testErr2, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // arrange + f.processRequest = tc.expectedProcessRequest + dbManagerMock.On("GetLastNBatches", ctx, n).Return(tc.batches, tc.getLastNBatchesErr).Once() + if tc.getLastNBatchesErr == nil { + executorMock.Mock.On("ProcessBatch", ctx, f.processRequest).Return(tc.expectedProcessBatchResult, tc.processBatchErr).Once() + dbManagerMock.On("GetBatchByNumber", ctx, f.batch.batchNumber, nil).Return(tc.batches[0], nil).Once() + } + + // act + err := f.reprocessBatch(ctx, f.batch.batchNumber) + + // assert + if tc.expectedErr != nil { + assert.Error(t, err) + assert.EqualError(t, err, tc.expectedErr.Error()) + assert.ErrorIs(t, err, tc.internalErr) + } else { + assert.NoError(t, err) + } + }) + } +} + +func TestFinalizer_prepareProcessRequestFromState(t *testing.T) { + // arrange + f = setupFinalizer(true) + n := uint(2) + batchL2Data := []byte("test") + testCases := []struct { + name string + batches []*state.Batch + fetchTxs bool + expectedReq state.ProcessRequest + expectedErr error + }{ + { + name: "Success with 1 batch with txs", + batches: []*state.Batch{ + { + StateRoot: oldHash, + BatchNumber: f.batch.batchNumber, + BatchL2Data: batchL2Data, + }, + }, + fetchTxs: true, + expectedReq: state.ProcessRequest{ + BatchNumber: f.batch.batchNumber, + OldStateRoot: oldHash, + GlobalExitRoot: f.batch.globalExitRoot, + Coinbase: f.sequencerAddress, + Timestamp: f.batch.timestamp, + Caller: state.SequencerCallerLabel, + Transactions: batchL2Data, + }, + expectedErr: nil, + }, + { + name: "Success with 2 batches", + batches: []*state.Batch{ + { + StateRoot: oldHash, + BatchNumber: f.batch.batchNumber, + }, + { + StateRoot: oldHash, + BatchNumber: f.batch.batchNumber + 1, + }, + }, + expectedReq: state.ProcessRequest{ + BatchNumber: f.batch.batchNumber, + OldStateRoot: oldHash, + GlobalExitRoot: f.batch.globalExitRoot, + Coinbase: f.sequencerAddress, + Timestamp: f.batch.timestamp, + Caller: state.SequencerCallerLabel, + Transactions: make([]byte, 0), + }, + expectedErr: nil, + }, + { + name: "Error", + batches: nil, + expectedReq: state.ProcessRequest{}, + expectedErr: fmt.Errorf("failed to get last %d batches, err: %w", n, testErr), + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // arrange + if tc.expectedErr != nil { + dbManagerMock.On("GetLastNBatches", ctx, n).Return(tc.batches, testErr).Once() + } else { + dbManagerMock.On("GetLastNBatches", ctx, n).Return(tc.batches, nil).Once() + } + + // act + actualReq, err := f.prepareProcessRequestFromState(ctx, tc.fetchTxs) + + // assert + if tc.expectedErr != nil { + assert.Error(t, err) + assert.EqualError(t, err, tc.expectedErr.Error()) + assert.Empty(t, actualReq) + } else { + assert.NoError(t, err) + assert.Equal(t, tc.expectedReq, actualReq) + } + dbManagerMock.AssertExpectations(t) + }) + } +} + +func TestFinalizer_isDeadlineEncountered(t *testing.T) { + // arrange + f = setupFinalizer(true) + now = testNow + defer func() { + now = time.Now + }() + testCases := []struct { + name string + nextForcedBatch int64 + nextGER int64 + nextDelayedBatch int64 + expected bool + }{ + { + name: "No deadlines", + nextForcedBatch: 0, + nextGER: 0, + nextDelayedBatch: 0, + expected: false, + }, + { + name: "Forced batch deadline", + nextForcedBatch: now().Add(time.Second).Unix(), + nextGER: 0, + nextDelayedBatch: 0, + expected: true, + }, + { + name: "Global Exit Root deadline", + nextForcedBatch: 0, + nextGER: now().Add(time.Second).Unix(), + nextDelayedBatch: 0, + expected: true, + }, + { + name: "Delayed batch deadline", + nextForcedBatch: 0, + nextGER: 0, + nextDelayedBatch: now().Add(time.Second).Unix(), + expected: true, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // arrange + f.nextForcedBatchDeadline = tc.nextForcedBatch + f.nextGERDeadline = tc.nextGER + f.nextSendingToL1Deadline = tc.nextDelayedBatch + if tc.expected == true { + now = func() time.Time { + return testNow().Add(time.Second * 2) + } + } + + // act + actual := f.isDeadlineEncountered() + + // assert + assert.Equal(t, tc.expected, actual) + }) + } +} + +func TestFinalizer_checkRemainingResources(t *testing.T) { + // arrange + f = setupFinalizer(true) + txResponse := &state.ProcessTransactionResponse{TxHash: oldHash} + result := &state.ProcessBatchResponse{ + UsedZkCounters: state.ZKCounters{CumulativeGasUsed: 1000}, + Responses: []*state.ProcessTransactionResponse{txResponse}, + } + remainingResources := batchResources{ + zKCounters: state.ZKCounters{CumulativeGasUsed: 9000}, + bytes: 10000, + } + f.batch.remainingResources = remainingResources + testCases := []struct { + name string + remaining batchResources + expectedErr error + expectedWorkerUpdate bool + expectedTxTracker *TxTracker + }{ + { + name: "Success", + remaining: remainingResources, + expectedErr: nil, + expectedWorkerUpdate: false, + expectedTxTracker: &TxTracker{RawTx: []byte("test")}, + }, + { + name: "Bytes Resource Exceeded", + remaining: batchResources{ + bytes: 0, + }, + expectedErr: ErrBatchResourceBytesUnderflow, + expectedWorkerUpdate: true, + expectedTxTracker: &TxTracker{RawTx: []byte("test")}, + }, + { + name: "ZkCounter Resource Exceeded", + remaining: batchResources{ + zKCounters: state.ZKCounters{CumulativeGasUsed: 0}, + }, + expectedErr: NewBatchRemainingResourcesUnderflowError(cumulativeGasErr, cumulativeGasErr.Error()), + expectedWorkerUpdate: true, + expectedTxTracker: &TxTracker{RawTx: make([]byte, 0)}, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // arrange + f.batch.remainingResources = tc.remaining + if tc.expectedWorkerUpdate { + workerMock.On("UpdateTx", txResponse.TxHash, tc.expectedTxTracker.From, result.UsedZkCounters).Return().Once() + } + + // act + err := f.checkRemainingResources(result, tc.expectedTxTracker) + + // assert + if tc.expectedErr != nil { + assert.Error(t, err) + assert.EqualError(t, err, tc.expectedErr.Error()) + } else { + assert.NoError(t, err) + } + if tc.expectedWorkerUpdate { + workerMock.AssertCalled(t, "UpdateTx", txResponse.TxHash, tc.expectedTxTracker.From, result.UsedZkCounters) + } else { + workerMock.AssertNotCalled(t, "UpdateTx", mock.Anything, mock.Anything, mock.Anything) + } + }) + } +} + +func TestFinalizer_isBatchReadyToClose(t *testing.T) { + // arrange + f = setupFinalizer(true) + maxRemainingResource := getMaxRemainingResources(bc) + testCases := []struct { + name string + cumulativeGasUsed uint64 + expectedResult bool + }{ + { + name: "Is ready", + cumulativeGasUsed: f.getConstraintThresholdUint64(bc.MaxCumulativeGasUsed) - 1, + expectedResult: true, + }, { + name: "Is NOT ready", + cumulativeGasUsed: f.getConstraintThresholdUint64(bc.MaxCumulativeGasUsed) + 1, + expectedResult: false, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + maxRemainingResource.zKCounters.CumulativeGasUsed = tc.cumulativeGasUsed + f.batch.remainingResources = maxRemainingResource + // act + result := f.isBatchAlmostFull() + + // assert + assert.Equal(t, tc.expectedResult, result) + }) + } +} + +func TestFinalizer_setNextForcedBatchDeadline(t *testing.T) { + // arrange + f = setupFinalizer(false) + now = testNow + defer func() { + now = time.Now + }() + expected := now().Unix() + int64(f.cfg.ForcedBatchDeadlineTimeoutInSec.Duration.Seconds()) + + // act + f.setNextForcedBatchDeadline() + + // assert + assert.Equal(t, expected, f.nextForcedBatchDeadline) +} + +func TestFinalizer_setNextGERDeadline(t *testing.T) { + // arrange + f = setupFinalizer(false) + now = testNow + defer func() { + now = time.Now + }() + expected := now().Unix() + int64(f.cfg.GERDeadlineTimeoutInSec.Duration.Seconds()) + + // act + f.setNextGERDeadline() + + // assert + assert.Equal(t, expected, f.nextGERDeadline) +} + +func TestFinalizer_setNextSendingToL1Deadline(t *testing.T) { + // arrange + f = setupFinalizer(false) + now = testNow + defer func() { + now = time.Now + }() + expected := now().Unix() + int64(f.cfg.SendingToL1DeadlineTimeoutInSec.Duration.Seconds()) + + // act + f.setNextSendingToL1Deadline() + + // assert + assert.Equal(t, expected, f.nextSendingToL1Deadline) +} + +func TestFinalizer_getConstraintThresholdUint64(t *testing.T) { + // arrange + f = setupFinalizer(false) + input := uint64(100) + expect := input * uint64(f.cfg.ResourcePercentageToCloseBatch) / 100 + + // act + result := f.getConstraintThresholdUint64(input) + + // assert + assert.Equal(t, result, expect) +} + +func TestFinalizer_getConstraintThresholdUint32(t *testing.T) { + // arrange + f = setupFinalizer(false) + input := uint32(100) + expect := uint32(input * f.cfg.ResourcePercentageToCloseBatch / 100) + + // act + result := f.getConstraintThresholdUint32(input) + + // assert + assert.Equal(t, result, expect) +} + +func TestFinalizer_getRemainingResources(t *testing.T) { + // act + remainingResources := getMaxRemainingResources(bc) + + // assert + assert.Equal(t, remainingResources.zKCounters.CumulativeGasUsed, bc.MaxCumulativeGasUsed) + assert.Equal(t, remainingResources.zKCounters.UsedKeccakHashes, bc.MaxKeccakHashes) + assert.Equal(t, remainingResources.zKCounters.UsedPoseidonHashes, bc.MaxPoseidonHashes) + assert.Equal(t, remainingResources.zKCounters.UsedPoseidonPaddings, bc.MaxPoseidonPaddings) + assert.Equal(t, remainingResources.zKCounters.UsedMemAligns, bc.MaxMemAligns) + assert.Equal(t, remainingResources.zKCounters.UsedArithmetics, bc.MaxArithmetics) + assert.Equal(t, remainingResources.zKCounters.UsedBinaries, bc.MaxBinaries) + assert.Equal(t, remainingResources.zKCounters.UsedSteps, bc.MaxSteps) + assert.Equal(t, remainingResources.bytes, bc.MaxBatchBytesSize) +} + +func setupFinalizer(withWipBatch bool) *finalizer { + wipBatch := new(WipBatch) + dbManagerMock = new(DbManagerMock) + executorMock = new(StateMock) + workerMock = new(WorkerMock) + dbTxMock = new(DbTxMock) + if withWipBatch { + wipBatch = &WipBatch{ + batchNumber: 1, + coinbase: seqAddr, + initialStateRoot: oldHash, + stateRoot: newHash, + timestamp: uint64(now().Unix()), + globalExitRoot: oldHash, + remainingResources: getMaxRemainingResources(bc), + } + } + return &finalizer{ + cfg: cfg, + txsStore: txsStore, + closingSignalCh: closingSignalCh, + isSynced: isSynced, + sequencerAddress: seqAddr, + worker: workerMock, + dbManager: dbManagerMock, + executor: executorMock, + sharedResourcesMux: new(sync.RWMutex), + batch: wipBatch, + batchConstraints: bc, + processRequest: state.ProcessRequest{}, + // closing signals + nextGER: common.Hash{}, + nextGERDeadline: 0, + nextGERMux: new(sync.RWMutex), + nextForcedBatches: make([]state.ForcedBatch, 0), + nextForcedBatchDeadline: 0, + nextForcedBatchesMux: new(sync.RWMutex), + nextSendingToL1Deadline: 0, + nextSendingToL1TimeoutMux: new(sync.RWMutex), + } +} diff --git a/sequencer/interfaces.go b/sequencer/interfaces.go index e3e7f16a09..45ee3eb9e1 100644 --- a/sequencer/interfaces.go +++ b/sequencer/interfaces.go @@ -9,6 +9,7 @@ import ( "github.com/0xPolygonHermez/zkevm-node/ethtxmanager" "github.com/0xPolygonHermez/zkevm-node/pool" "github.com/0xPolygonHermez/zkevm-node/state" + "github.com/0xPolygonHermez/zkevm-node/state/runtime/executor/pb" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/jackc/pgx/v4" @@ -18,16 +19,13 @@ import ( // txPool contains the methods required to interact with the tx pool. type txPool interface { - GetPendingTxs(ctx context.Context, isClaims bool, limit uint64) ([]pool.Transaction, error) - UpdateTxStatus(ctx context.Context, hash common.Hash, newStatus pool.TxStatus) error - UpdateTxsStatus(ctx context.Context, hashes []string, newStatus pool.TxStatus) error - IsTxPending(ctx context.Context, hash common.Hash) (bool, error) DeleteTxsByHashes(ctx context.Context, hashes []common.Hash) error + DeleteTransactionByHash(ctx context.Context, hash common.Hash) error MarkReorgedTxsAsPending(ctx context.Context) error - GetTxs(ctx context.Context, filterStatus pool.TxStatus, isClaims bool, minGasPrice, limit uint64) ([]*pool.Transaction, error) - GetTxFromAddressFromByHash(ctx context.Context, hash common.Hash) (common.Address, uint64, error) - IncrementFailedCounter(ctx context.Context, hashes []string) error - GetGasPrice(ctx context.Context) (uint64, error) + MarkWIPTxsAsPending(ctx context.Context) error + GetPendingTxs(ctx context.Context, isClaims bool, limit uint64) ([]pool.Transaction, error) + UpdateTxStatus(ctx context.Context, hash common.Hash, newStatus pool.TxStatus) error + GetTxZkCountersByHash(ctx context.Context, hash common.Hash) (*state.ZKCounters, error) } // etherman contains the methods required to interact with ethereum. @@ -36,7 +34,6 @@ type etherman interface { GetSendSequenceFee(numBatches uint64) (*big.Int, error) TrustedSequencer() (common.Address, error) GetLatestBatchNumber() (uint64, error) - GetLatestBlockNumber(ctx context.Context) (uint64, error) GetLastBatchTimestamp() (uint64, error) GetLatestBlockTimestamp(ctx context.Context) (uint64, error) BuildSequenceBatchesTxData(sender common.Address, sequences []ethmanTypes.Sequence) (to *common.Address, data []byte, err error) @@ -44,31 +41,103 @@ type etherman interface { // stateInterface gathers the methods required to interact with the state. type stateInterface interface { - GetLastVirtualBatchNum(ctx context.Context, dbTx pgx.Tx) (uint64, error) - GetLatestGlobalExitRoot(ctx context.Context, maxBlockNumber uint64, dbTx pgx.Tx) (state.GlobalExitRoot, time.Time, error) GetTimeForLatestBatchVirtualization(ctx context.Context, dbTx pgx.Tx) (time.Time, error) GetTxsOlderThanNL1Blocks(ctx context.Context, nL1Blocks uint64, dbTx pgx.Tx) ([]common.Hash, error) GetBatchByNumber(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) (*state.Batch, error) GetTransactionsByBatchNumber(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) (txs []types.Transaction, err error) + BeginStateTransaction(ctx context.Context) (pgx.Tx, error) + GetLastVirtualBatchNum(ctx context.Context, dbTx pgx.Tx) (uint64, error) IsBatchClosed(ctx context.Context, batchNum uint64, dbTx pgx.Tx) (bool, error) - IsBatchVirtualized(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) (bool, error) - + Begin(ctx context.Context) (pgx.Tx, error) + GetBalanceByStateRoot(ctx context.Context, address common.Address, root common.Hash) (*big.Int, error) + GetNonceByStateRoot(ctx context.Context, address common.Address, root common.Hash) (*big.Int, error) + GetLastStateRoot(ctx context.Context, dbTx pgx.Tx) (common.Hash, error) + ProcessBatch(ctx context.Context, request state.ProcessRequest) (*state.ProcessBatchResponse, error) + CloseBatch(ctx context.Context, receipt state.ProcessingReceipt, dbTx pgx.Tx) error + ExecuteBatch(ctx context.Context, batch state.Batch, dbTx pgx.Tx) (*pb.ProcessBatchResponse, error) + GetForcedBatch(ctx context.Context, forcedBatchNumber uint64, dbTx pgx.Tx) (*state.ForcedBatch, error) GetLastBatch(ctx context.Context, dbTx pgx.Tx) (*state.Batch, error) GetLastBatchNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) - - StoreTransactions(ctx context.Context, batchNum uint64, processedTxs []*state.ProcessTransactionResponse, dbTx pgx.Tx) error - CloseBatch(ctx context.Context, receipt state.ProcessingReceipt, dbTx pgx.Tx) error OpenBatch(ctx context.Context, processingContext state.ProcessingContext, dbTx pgx.Tx) error - ProcessSequencerBatch(ctx context.Context, batchNumber uint64, txs []types.Transaction, dbTx pgx.Tx, caller state.CallerLabel) (*state.ProcessBatchResponse, error) + GetLastNBatches(ctx context.Context, numBatches uint, dbTx pgx.Tx) ([]*state.Batch, error) + StoreTransaction(ctx context.Context, batchNumber uint64, processedTx *state.ProcessTransactionResponse, coinbase common.Address, timestamp uint64, dbTx pgx.Tx) error + GetLastClosedBatch(ctx context.Context, dbTx pgx.Tx) (*state.Batch, error) + GetLastL2Block(ctx context.Context, dbTx pgx.Tx) (*types.Block, error) + GetLastBlock(ctx context.Context, dbTx pgx.Tx) (*state.Block, error) + GetLatestGlobalExitRoot(ctx context.Context, maxBlockNumber uint64, dbTx pgx.Tx) (state.GlobalExitRoot, time.Time, error) + GetLastL2BlockHeader(ctx context.Context, dbTx pgx.Tx) (*types.Header, error) + UpdateBatchL2Data(ctx context.Context, batchNumber uint64, batchL2Data []byte, dbTx pgx.Tx) error + ProcessSequencerBatch(ctx context.Context, batchNumber uint64, batchL2Data []byte, caller state.CallerLabel, dbTx pgx.Tx) (*state.ProcessBatchResponse, error) + GetForcedBatchesSince(ctx context.Context, forcedBatchNumber uint64, dbTx pgx.Tx) ([]*state.ForcedBatch, error) + GetLastTrustedForcedBatchNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) + GetLatestVirtualBatchTimestamp(ctx context.Context, dbTx pgx.Tx) (time.Time, error) +} - UpdateGERInOpenBatch(ctx context.Context, ger common.Hash, dbTx pgx.Tx) error - GetBlockNumAndMainnetExitRootByGER(ctx context.Context, ger common.Hash, dbTx pgx.Tx) (uint64, common.Hash, error) - GetStateRootByBatchNumber(ctx context.Context, batchNum uint64, dbTx pgx.Tx) (common.Hash, error) +type workerInterface interface { + GetBestFittingTx(resources batchResources) *TxTracker + UpdateAfterSingleSuccessfulTxExecution(from common.Address, touchedAddresses map[common.Address]*state.InfoReadWrite) + UpdateTx(txHash common.Hash, from common.Address, ZKCounters state.ZKCounters) + AddTx(ctx context.Context, txTracker *TxTracker) + MoveTxToNotReady(txHash common.Hash, from common.Address, actualNonce *uint64, actualBalance *big.Int) + DeleteTx(txHash common.Hash, from common.Address) + HandleL2Reorg(txHashes []common.Hash) + NewTxTracker(tx types.Transaction, isClaim bool, counters state.ZKCounters) (*TxTracker, error) +} +// The dbManager will need to handle the errors inside the functions which don't return error as they will be used async in the other abstractions. +// Also if dbTx is missing this needs also to be handled in the dbManager +type dbManagerInterface interface { + OpenBatch(ctx context.Context, processingContext state.ProcessingContext, dbTx pgx.Tx) error BeginStateTransaction(ctx context.Context) (pgx.Tx, error) + CreateFirstBatch(ctx context.Context, sequencerAddress common.Address) state.ProcessingContext + GetLastBatchNumber(ctx context.Context) (uint64, error) + StoreProcessedTransaction(ctx context.Context, batchNumber uint64, processedTx *state.ProcessTransactionResponse, coinbase common.Address, timestamp uint64, dbTx pgx.Tx) error + DeleteTransactionFromPool(ctx context.Context, txHash common.Hash) error + CloseBatch(ctx context.Context, params ClosingBatchParameters) error + GetWIPBatch(ctx context.Context) (*WipBatch, error) + GetTransactionsByBatchNumber(ctx context.Context, batchNumber uint64) (txs []types.Transaction, err error) + GetLastBatch(ctx context.Context) (*state.Batch, error) + GetLastNBatches(ctx context.Context, numBatches uint) ([]*state.Batch, error) + GetLastClosedBatch(ctx context.Context) (*state.Batch, error) + GetBatchByNumber(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) (*state.Batch, error) + IsBatchClosed(ctx context.Context, batchNum uint64) (bool, error) + MarkReorgedTxsAsPending(ctx context.Context) + GetLatestGer(ctx context.Context, gerFinalityNumberOfBlocks uint64) (state.GlobalExitRoot, time.Time, error) + ProcessForcedBatch(forcedBatchNum uint64, request state.ProcessRequest) (*state.ProcessBatchResponse, error) + GetForcedBatchesSince(ctx context.Context, forcedBatchNumber uint64, dbTx pgx.Tx) ([]*state.ForcedBatch, error) + GetLastL2BlockHeader(ctx context.Context, dbTx pgx.Tx) (*types.Header, error) + GetLastBlock(ctx context.Context, dbTx pgx.Tx) (*state.Block, error) + GetLastTrustedForcedBatchNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) + GetBalanceByStateRoot(ctx context.Context, address common.Address, root common.Hash) (*big.Int, error) + UpdateTxStatus(ctx context.Context, hash common.Hash, newStatus pool.TxStatus) error + GetLatestVirtualBatchTimestamp(ctx context.Context, dbTx pgx.Tx) (time.Time, error) +} - GetNonce(ctx context.Context, address common.Address, blockNumber uint64, dbTx pgx.Tx) (uint64, error) - GetLastL2BlockNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) +type dbManagerStateInterface interface { + BeginStateTransaction(ctx context.Context) (pgx.Tx, error) + OpenBatch(ctx context.Context, processingContext state.ProcessingContext, dbTx pgx.Tx) error + GetLastVirtualBatchNum(ctx context.Context, dbTx pgx.Tx) (uint64, error) + GetLastNBatches(ctx context.Context, numBatches uint, dbTx pgx.Tx) ([]*state.Batch, error) + StoreTransaction(ctx context.Context, batchNumber uint64, processedTx *state.ProcessTransactionResponse, coinbase common.Address, timestamp uint64, dbTx pgx.Tx) error + CloseBatch(ctx context.Context, receipt state.ProcessingReceipt, dbTx pgx.Tx) error + IsBatchClosed(ctx context.Context, batchNum uint64, dbTx pgx.Tx) (bool, error) + GetTransactionsByBatchNumber(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) (txs []types.Transaction, err error) + GetLastClosedBatch(ctx context.Context, dbTx pgx.Tx) (*state.Batch, error) + GetLastBatchNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) + GetLastBatch(ctx context.Context, dbTx pgx.Tx) (*state.Batch, error) + GetLatestGlobalExitRoot(ctx context.Context, maxBlockNumber uint64, dbTx pgx.Tx) (state.GlobalExitRoot, time.Time, error) + GetLastStateRoot(ctx context.Context, dbTx pgx.Tx) (common.Hash, error) + GetLastL2BlockHeader(ctx context.Context, dbTx pgx.Tx) (*types.Header, error) + GetLastBlock(ctx context.Context, dbTx pgx.Tx) (*state.Block, error) + ExecuteBatch(ctx context.Context, batch state.Batch, dbTx pgx.Tx) (*pb.ProcessBatchResponse, error) + GetBatchByNumber(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) (*state.Batch, error) + UpdateBatchL2Data(ctx context.Context, batchNumber uint64, batchL2Data []byte, dbTx pgx.Tx) error + GetForcedBatch(ctx context.Context, forcedBatchNumber uint64, dbTx pgx.Tx) (*state.ForcedBatch, error) + ProcessSequencerBatch(ctx context.Context, batchNumber uint64, batchL2Data []byte, caller state.CallerLabel, dbTx pgx.Tx) (*state.ProcessBatchResponse, error) + GetForcedBatchesSince(ctx context.Context, forcedBatchNumber uint64, dbTx pgx.Tx) ([]*state.ForcedBatch, error) + GetLastTrustedForcedBatchNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) + GetBalanceByStateRoot(ctx context.Context, address common.Address, root common.Hash) (*big.Int, error) + GetLatestVirtualBatchTimestamp(ctx context.Context, dbTx pgx.Tx) (time.Time, error) } type ethTxManager interface { @@ -77,9 +146,3 @@ type ethTxManager interface { ResultsByStatus(ctx context.Context, owner string, statuses []ethtxmanager.MonitoredTxStatus, dbTx pgx.Tx) ([]ethtxmanager.MonitoredTxResult, error) ProcessPendingMonitoredTxs(ctx context.Context, owner string, failedResultHandler ethtxmanager.ResultHandler, dbTx pgx.Tx) } - -// priceGetter is for getting eth/matic price, used for the tx profitability checker -type priceGetter interface { - Start(ctx context.Context) - GetEthToMaticPrice(ctx context.Context) (*big.Float, error) -} diff --git a/sequencer/metrics/metrics.go b/sequencer/metrics/metrics.go index 11e044bbea..df82049a99 100644 --- a/sequencer/metrics/metrics.go +++ b/sequencer/metrics/metrics.go @@ -8,16 +8,28 @@ import ( ) const ( - prefix = "sequencer_" - sequencesSentToL1CountName = prefix + "sequences_sent_to_L1_count" - gasPriceEstimatedAverageName = prefix + "gas_price_estimated_average" - txProcessed = prefix + "transaction_processed" - sequencesOvesizedDataErrorName = prefix + "sequences_oversized_data_error" - ethToMaticPriceName = prefix + "eth_to_matic_price" - sequenceRewardInMaticName = prefix + "sequence_reward_in_matic" - processingTime = prefix + "processing_time" - - txProcessedLabelName = "status" + // Prefix for the metrics of the sequencer package. + Prefix = "sequencer_" + // SequencesSentToL1CountName is the name of the metric that counts the sequences sent to L1. + SequencesSentToL1CountName = Prefix + "sequences_sent_to_L1_count" + // GasPriceEstimatedAverageName is the name of the metric that shows the average estimated gas price. + GasPriceEstimatedAverageName = Prefix + "gas_price_estimated_average" + // TxProcessedName is the name of the metric that counts the processed transactions. + TxProcessedName = Prefix + "transaction_processed" + // SequencesOversizedDataErrorName is the name of the metric that counts the sequences with oversized data error. + SequencesOversizedDataErrorName = Prefix + "sequences_oversized_data_error" + // EthToMaticPriceName is the name of the metric that shows the Ethereum to Matic price. + EthToMaticPriceName = Prefix + "eth_to_matic_price" + // SequenceRewardInMaticName is the name of the metric that shows the reward in Matic of a sequence. + SequenceRewardInMaticName = Prefix + "sequence_reward_in_matic" + // ProcessingTimeName is the name of the metric that shows the processing time. + ProcessingTimeName = Prefix + "processing_time" + // WorkerPrefix is the prefix for the metrics of the worker. + WorkerPrefix = Prefix + "worker_" + // WorkerProcessingTimeName is the name of the metric that shows the worker processing time. + WorkerProcessingTimeName = WorkerPrefix + "processing_time" + // TxProcessedLabelName is the name of the label for the processed transactions. + TxProcessedLabelName = "status" ) // TxProcessedLabel represents the possible values for the @@ -44,11 +56,11 @@ func Register() { counters = []prometheus.CounterOpts{ { - Name: sequencesSentToL1CountName, + Name: SequencesSentToL1CountName, Help: "[SEQUENCER] total count of sequences sent to L1", }, { - Name: sequencesOvesizedDataErrorName, + Name: SequencesOversizedDataErrorName, Help: "[SEQUENCER] total count of sequences with oversized data error", }, } @@ -56,33 +68,37 @@ func Register() { counterVecs = []metrics.CounterVecOpts{ { CounterOpts: prometheus.CounterOpts{ - Name: txProcessed, + Name: TxProcessedName, Help: "[SEQUENCER] number of transactions processed", }, - Labels: []string{txProcessedLabelName}, + Labels: []string{TxProcessedLabelName}, }, } gauges = []prometheus.GaugeOpts{ { - Name: gasPriceEstimatedAverageName, + Name: GasPriceEstimatedAverageName, Help: "[SEQUENCER] average gas price estimated", }, { - Name: ethToMaticPriceName, + Name: EthToMaticPriceName, Help: "[SEQUENCER] eth to matic price", }, { - Name: sequenceRewardInMaticName, + Name: SequenceRewardInMaticName, Help: "[SEQUENCER] reward for a sequence in Matic", }, } histograms = []prometheus.HistogramOpts{ { - Name: processingTime, + Name: ProcessingTimeName, Help: "[SEQUENCER] processing time", }, + { + Name: WorkerProcessingTimeName, + Help: "[SEQUENCER] worker processing time", + }, } metrics.RegisterCounters(counters...) @@ -93,39 +109,45 @@ func Register() { // AverageGasPrice sets the gauge to the given average gas price. func AverageGasPrice(price float64) { - metrics.GaugeSet(gasPriceEstimatedAverageName, price) + metrics.GaugeSet(GasPriceEstimatedAverageName, price) } // SequencesSentToL1 increases the counter by the provided number of sequences // sent to L1. func SequencesSentToL1(numSequences float64) { - metrics.CounterAdd(sequencesSentToL1CountName, numSequences) + metrics.CounterAdd(SequencesSentToL1CountName, numSequences) } // TxProcessed increases the counter vector by the provided transactions count // and for the given label. func TxProcessed(status TxProcessedLabel, count float64) { - metrics.CounterVecAdd(txProcessed, string(status), count) + metrics.CounterVecAdd(TxProcessedName, string(status), count) } // SequencesOvesizedDataError increases the counter for sequences that // encounter a OversizedData error. func SequencesOvesizedDataError() { - metrics.CounterInc(sequencesOvesizedDataErrorName) + metrics.CounterInc(SequencesOversizedDataErrorName) } // EthToMaticPrice sets the gauge for the Ethereum to Matic price. func EthToMaticPrice(price float64) { - metrics.GaugeSet(ethToMaticPriceName, price) + metrics.GaugeSet(EthToMaticPriceName, price) } // SequenceRewardInMatic sets the gauge for the reward in Matic of a sequence. func SequenceRewardInMatic(reward float64) { - metrics.GaugeSet(sequenceRewardInMaticName, reward) + metrics.GaugeSet(SequenceRewardInMaticName, reward) } -// ProcessingTime observes the last iteration processing time on the histogram. +// ProcessingTime observes the last processing time on the histogram. func ProcessingTime(lastProcessTime time.Duration) { execTimeInSeconds := float64(lastProcessTime) / float64(time.Second) - metrics.HistogramObserve(processingTime, execTimeInSeconds) + metrics.HistogramObserve(ProcessingTimeName, execTimeInSeconds) +} + +// WorkerProcessingTime observes the last processing time on the histogram. +func WorkerProcessingTime(lastProcessTime time.Duration) { + execTimeInSeconds := float64(lastProcessTime) / float64(time.Second) + metrics.HistogramObserve(WorkerProcessingTimeName, execTimeInSeconds) } diff --git a/sequencer/mock_db_manager.go b/sequencer/mock_db_manager.go new file mode 100644 index 0000000000..10d8b7b4bf --- /dev/null +++ b/sequencer/mock_db_manager.go @@ -0,0 +1,519 @@ +// Code generated by mockery v2.16.0. DO NOT EDIT. + +package sequencer + +import ( + context "context" + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + pgx "github.com/jackc/pgx/v4" + + pool "github.com/0xPolygonHermez/zkevm-node/pool" + + state "github.com/0xPolygonHermez/zkevm-node/state" + + time "time" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// DbManagerMock is an autogenerated mock type for the dbManagerInterface type +type DbManagerMock struct { + mock.Mock +} + +// BeginStateTransaction provides a mock function with given fields: ctx +func (_m *DbManagerMock) BeginStateTransaction(ctx context.Context) (pgx.Tx, error) { + ret := _m.Called(ctx) + + var r0 pgx.Tx + if rf, ok := ret.Get(0).(func(context.Context) pgx.Tx); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(pgx.Tx) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CloseBatch provides a mock function with given fields: ctx, params +func (_m *DbManagerMock) CloseBatch(ctx context.Context, params ClosingBatchParameters) error { + ret := _m.Called(ctx, params) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, ClosingBatchParameters) error); ok { + r0 = rf(ctx, params) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// CreateFirstBatch provides a mock function with given fields: ctx, sequencerAddress +func (_m *DbManagerMock) CreateFirstBatch(ctx context.Context, sequencerAddress common.Address) state.ProcessingContext { + ret := _m.Called(ctx, sequencerAddress) + + var r0 state.ProcessingContext + if rf, ok := ret.Get(0).(func(context.Context, common.Address) state.ProcessingContext); ok { + r0 = rf(ctx, sequencerAddress) + } else { + r0 = ret.Get(0).(state.ProcessingContext) + } + + return r0 +} + +// DeleteTransactionFromPool provides a mock function with given fields: ctx, txHash +func (_m *DbManagerMock) DeleteTransactionFromPool(ctx context.Context, txHash common.Hash) error { + ret := _m.Called(ctx, txHash) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) error); ok { + r0 = rf(ctx, txHash) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetBalanceByStateRoot provides a mock function with given fields: ctx, address, root +func (_m *DbManagerMock) GetBalanceByStateRoot(ctx context.Context, address common.Address, root common.Hash) (*big.Int, error) { + ret := _m.Called(ctx, address, root) + + var r0 *big.Int + if rf, ok := ret.Get(0).(func(context.Context, common.Address, common.Hash) *big.Int); ok { + r0 = rf(ctx, address, root) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, common.Address, common.Hash) error); ok { + r1 = rf(ctx, address, root) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetBatchByNumber provides a mock function with given fields: ctx, batchNumber, dbTx +func (_m *DbManagerMock) GetBatchByNumber(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) (*state.Batch, error) { + ret := _m.Called(ctx, batchNumber, dbTx) + + var r0 *state.Batch + if rf, ok := ret.Get(0).(func(context.Context, uint64, pgx.Tx) *state.Batch); ok { + r0 = rf(ctx, batchNumber, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*state.Batch) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, uint64, pgx.Tx) error); ok { + r1 = rf(ctx, batchNumber, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetForcedBatchesSince provides a mock function with given fields: ctx, forcedBatchNumber, dbTx +func (_m *DbManagerMock) GetForcedBatchesSince(ctx context.Context, forcedBatchNumber uint64, dbTx pgx.Tx) ([]*state.ForcedBatch, error) { + ret := _m.Called(ctx, forcedBatchNumber, dbTx) + + var r0 []*state.ForcedBatch + if rf, ok := ret.Get(0).(func(context.Context, uint64, pgx.Tx) []*state.ForcedBatch); ok { + r0 = rf(ctx, forcedBatchNumber, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*state.ForcedBatch) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, uint64, pgx.Tx) error); ok { + r1 = rf(ctx, forcedBatchNumber, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastBatch provides a mock function with given fields: ctx +func (_m *DbManagerMock) GetLastBatch(ctx context.Context) (*state.Batch, error) { + ret := _m.Called(ctx) + + var r0 *state.Batch + if rf, ok := ret.Get(0).(func(context.Context) *state.Batch); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*state.Batch) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastBatchNumber provides a mock function with given fields: ctx +func (_m *DbManagerMock) GetLastBatchNumber(ctx context.Context) (uint64, error) { + ret := _m.Called(ctx) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(context.Context) uint64); ok { + r0 = rf(ctx) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastBlock provides a mock function with given fields: ctx, dbTx +func (_m *DbManagerMock) GetLastBlock(ctx context.Context, dbTx pgx.Tx) (*state.Block, error) { + ret := _m.Called(ctx, dbTx) + + var r0 *state.Block + if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) *state.Block); ok { + r0 = rf(ctx, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*state.Block) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { + r1 = rf(ctx, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastClosedBatch provides a mock function with given fields: ctx +func (_m *DbManagerMock) GetLastClosedBatch(ctx context.Context) (*state.Batch, error) { + ret := _m.Called(ctx) + + var r0 *state.Batch + if rf, ok := ret.Get(0).(func(context.Context) *state.Batch); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*state.Batch) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastL2BlockHeader provides a mock function with given fields: ctx, dbTx +func (_m *DbManagerMock) GetLastL2BlockHeader(ctx context.Context, dbTx pgx.Tx) (*types.Header, error) { + ret := _m.Called(ctx, dbTx) + + var r0 *types.Header + if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) *types.Header); ok { + r0 = rf(ctx, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Header) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { + r1 = rf(ctx, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastNBatches provides a mock function with given fields: ctx, numBatches +func (_m *DbManagerMock) GetLastNBatches(ctx context.Context, numBatches uint) ([]*state.Batch, error) { + ret := _m.Called(ctx, numBatches) + + var r0 []*state.Batch + if rf, ok := ret.Get(0).(func(context.Context, uint) []*state.Batch); ok { + r0 = rf(ctx, numBatches) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*state.Batch) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, uint) error); ok { + r1 = rf(ctx, numBatches) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastTrustedForcedBatchNumber provides a mock function with given fields: ctx, dbTx +func (_m *DbManagerMock) GetLastTrustedForcedBatchNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) { + ret := _m.Called(ctx, dbTx) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) uint64); ok { + r0 = rf(ctx, dbTx) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { + r1 = rf(ctx, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLatestGer provides a mock function with given fields: ctx, gerFinalityNumberOfBlocks +func (_m *DbManagerMock) GetLatestGer(ctx context.Context, gerFinalityNumberOfBlocks uint64) (state.GlobalExitRoot, time.Time, error) { + ret := _m.Called(ctx, gerFinalityNumberOfBlocks) + + var r0 state.GlobalExitRoot + if rf, ok := ret.Get(0).(func(context.Context, uint64) state.GlobalExitRoot); ok { + r0 = rf(ctx, gerFinalityNumberOfBlocks) + } else { + r0 = ret.Get(0).(state.GlobalExitRoot) + } + + var r1 time.Time + if rf, ok := ret.Get(1).(func(context.Context, uint64) time.Time); ok { + r1 = rf(ctx, gerFinalityNumberOfBlocks) + } else { + r1 = ret.Get(1).(time.Time) + } + + var r2 error + if rf, ok := ret.Get(2).(func(context.Context, uint64) error); ok { + r2 = rf(ctx, gerFinalityNumberOfBlocks) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetLatestVirtualBatchTimestamp provides a mock function with given fields: ctx, dbTx +func (_m *DbManagerMock) GetLatestVirtualBatchTimestamp(ctx context.Context, dbTx pgx.Tx) (time.Time, error) { + ret := _m.Called(ctx, dbTx) + + var r0 time.Time + if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) time.Time); ok { + r0 = rf(ctx, dbTx) + } else { + r0 = ret.Get(0).(time.Time) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { + r1 = rf(ctx, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetTransactionsByBatchNumber provides a mock function with given fields: ctx, batchNumber +func (_m *DbManagerMock) GetTransactionsByBatchNumber(ctx context.Context, batchNumber uint64) ([]types.Transaction, error) { + ret := _m.Called(ctx, batchNumber) + + var r0 []types.Transaction + if rf, ok := ret.Get(0).(func(context.Context, uint64) []types.Transaction); ok { + r0 = rf(ctx, batchNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]types.Transaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, uint64) error); ok { + r1 = rf(ctx, batchNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetWIPBatch provides a mock function with given fields: ctx +func (_m *DbManagerMock) GetWIPBatch(ctx context.Context) (*WipBatch, error) { + ret := _m.Called(ctx) + + var r0 *WipBatch + if rf, ok := ret.Get(0).(func(context.Context) *WipBatch); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*WipBatch) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// IsBatchClosed provides a mock function with given fields: ctx, batchNum +func (_m *DbManagerMock) IsBatchClosed(ctx context.Context, batchNum uint64) (bool, error) { + ret := _m.Called(ctx, batchNum) + + var r0 bool + if rf, ok := ret.Get(0).(func(context.Context, uint64) bool); ok { + r0 = rf(ctx, batchNum) + } else { + r0 = ret.Get(0).(bool) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, uint64) error); ok { + r1 = rf(ctx, batchNum) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MarkReorgedTxsAsPending provides a mock function with given fields: ctx +func (_m *DbManagerMock) MarkReorgedTxsAsPending(ctx context.Context) { + _m.Called(ctx) +} + +// OpenBatch provides a mock function with given fields: ctx, processingContext, dbTx +func (_m *DbManagerMock) OpenBatch(ctx context.Context, processingContext state.ProcessingContext, dbTx pgx.Tx) error { + ret := _m.Called(ctx, processingContext, dbTx) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, state.ProcessingContext, pgx.Tx) error); ok { + r0 = rf(ctx, processingContext, dbTx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ProcessForcedBatch provides a mock function with given fields: forcedBatchNum, request +func (_m *DbManagerMock) ProcessForcedBatch(forcedBatchNum uint64, request state.ProcessRequest) (*state.ProcessBatchResponse, error) { + ret := _m.Called(forcedBatchNum, request) + + var r0 *state.ProcessBatchResponse + if rf, ok := ret.Get(0).(func(uint64, state.ProcessRequest) *state.ProcessBatchResponse); ok { + r0 = rf(forcedBatchNum, request) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*state.ProcessBatchResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint64, state.ProcessRequest) error); ok { + r1 = rf(forcedBatchNum, request) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// StoreProcessedTransaction provides a mock function with given fields: ctx, batchNumber, processedTx, coinbase, timestamp, dbTx +func (_m *DbManagerMock) StoreProcessedTransaction(ctx context.Context, batchNumber uint64, processedTx *state.ProcessTransactionResponse, coinbase common.Address, timestamp uint64, dbTx pgx.Tx) error { + ret := _m.Called(ctx, batchNumber, processedTx, coinbase, timestamp, dbTx) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, uint64, *state.ProcessTransactionResponse, common.Address, uint64, pgx.Tx) error); ok { + r0 = rf(ctx, batchNumber, processedTx, coinbase, timestamp, dbTx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// UpdateTxStatus provides a mock function with given fields: ctx, hash, newStatus +func (_m *DbManagerMock) UpdateTxStatus(ctx context.Context, hash common.Hash, newStatus pool.TxStatus) error { + ret := _m.Called(ctx, hash, newStatus) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash, pool.TxStatus) error); ok { + r0 = rf(ctx, hash, newStatus) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +type mockConstructorTestingTNewDbManagerMock interface { + mock.TestingT + Cleanup(func()) +} + +// NewDbManagerMock creates a new instance of DbManagerMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewDbManagerMock(t mockConstructorTestingTNewDbManagerMock) *DbManagerMock { + mock := &DbManagerMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencer/mocks/mock_dbtx.go b/sequencer/mock_dbtx.go similarity index 99% rename from sequencer/mocks/mock_dbtx.go rename to sequencer/mock_dbtx.go index a71023a193..fa16827b43 100644 --- a/sequencer/mocks/mock_dbtx.go +++ b/sequencer/mock_dbtx.go @@ -1,6 +1,6 @@ // Code generated by mockery v2.16.0. DO NOT EDIT. -package mocks +package sequencer import ( context "context" diff --git a/sequencer/mocks/mock_pool.go b/sequencer/mock_pool.go similarity index 51% rename from sequencer/mocks/mock_pool.go rename to sequencer/mock_pool.go index 43e745c464..1be00c090c 100644 --- a/sequencer/mocks/mock_pool.go +++ b/sequencer/mock_pool.go @@ -1,6 +1,6 @@ // Code generated by mockery v2.16.0. DO NOT EDIT. -package mocks +package sequencer import ( context "context" @@ -10,6 +10,8 @@ import ( mock "github.com/stretchr/testify/mock" pool "github.com/0xPolygonHermez/zkevm-node/pool" + + state "github.com/0xPolygonHermez/zkevm-node/state" ) // PoolMock is an autogenerated mock type for the txPool type @@ -17,13 +19,13 @@ type PoolMock struct { mock.Mock } -// DeleteTxsByHashes provides a mock function with given fields: ctx, hashes -func (_m *PoolMock) DeleteTxsByHashes(ctx context.Context, hashes []common.Hash) error { - ret := _m.Called(ctx, hashes) +// DeleteTransactionByHash provides a mock function with given fields: ctx, hash +func (_m *PoolMock) DeleteTransactionByHash(ctx context.Context, hash common.Hash) error { + ret := _m.Called(ctx, hash) var r0 error - if rf, ok := ret.Get(0).(func(context.Context, []common.Hash) error); ok { - r0 = rf(ctx, hashes) + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) error); ok { + r0 = rf(ctx, hash) } else { r0 = ret.Error(0) } @@ -31,25 +33,18 @@ func (_m *PoolMock) DeleteTxsByHashes(ctx context.Context, hashes []common.Hash) return r0 } -// GetGasPrice provides a mock function with given fields: ctx -func (_m *PoolMock) GetGasPrice(ctx context.Context) (uint64, error) { - ret := _m.Called(ctx) - - var r0 uint64 - if rf, ok := ret.Get(0).(func(context.Context) uint64); ok { - r0 = rf(ctx) - } else { - r0 = ret.Get(0).(uint64) - } +// DeleteTxsByHashes provides a mock function with given fields: ctx, hashes +func (_m *PoolMock) DeleteTxsByHashes(ctx context.Context, hashes []common.Hash) error { + ret := _m.Called(ctx, hashes) - var r1 error - if rf, ok := ret.Get(1).(func(context.Context) error); ok { - r1 = rf(ctx) + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, []common.Hash) error); ok { + r0 = rf(ctx, hashes) } else { - r1 = ret.Error(1) + r0 = ret.Error(0) } - return r0, r1 + return r0 } // GetPendingTxs provides a mock function with given fields: ctx, isClaims, limit @@ -75,52 +70,22 @@ func (_m *PoolMock) GetPendingTxs(ctx context.Context, isClaims bool, limit uint return r0, r1 } -// GetTxFromAddressFromByHash provides a mock function with given fields: ctx, hash -func (_m *PoolMock) GetTxFromAddressFromByHash(ctx context.Context, hash common.Hash) (common.Address, uint64, error) { +// GetTxZkCountersByHash provides a mock function with given fields: ctx, hash +func (_m *PoolMock) GetTxZkCountersByHash(ctx context.Context, hash common.Hash) (*state.ZKCounters, error) { ret := _m.Called(ctx, hash) - var r0 common.Address - if rf, ok := ret.Get(0).(func(context.Context, common.Hash) common.Address); ok { + var r0 *state.ZKCounters + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) *state.ZKCounters); ok { r0 = rf(ctx, hash) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(common.Address) - } - } - - var r1 uint64 - if rf, ok := ret.Get(1).(func(context.Context, common.Hash) uint64); ok { - r1 = rf(ctx, hash) - } else { - r1 = ret.Get(1).(uint64) - } - - var r2 error - if rf, ok := ret.Get(2).(func(context.Context, common.Hash) error); ok { - r2 = rf(ctx, hash) - } else { - r2 = ret.Error(2) - } - - return r0, r1, r2 -} - -// GetTxs provides a mock function with given fields: ctx, filterStatus, isClaims, minGasPrice, limit -func (_m *PoolMock) GetTxs(ctx context.Context, filterStatus pool.TxStatus, isClaims bool, minGasPrice uint64, limit uint64) ([]*pool.Transaction, error) { - ret := _m.Called(ctx, filterStatus, isClaims, minGasPrice, limit) - - var r0 []*pool.Transaction - if rf, ok := ret.Get(0).(func(context.Context, pool.TxStatus, bool, uint64, uint64) []*pool.Transaction); ok { - r0 = rf(ctx, filterStatus, isClaims, minGasPrice, limit) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]*pool.Transaction) + r0 = ret.Get(0).(*state.ZKCounters) } } var r1 error - if rf, ok := ret.Get(1).(func(context.Context, pool.TxStatus, bool, uint64, uint64) error); ok { - r1 = rf(ctx, filterStatus, isClaims, minGasPrice, limit) + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, hash) } else { r1 = ret.Error(1) } @@ -128,13 +93,13 @@ func (_m *PoolMock) GetTxs(ctx context.Context, filterStatus pool.TxStatus, isCl return r0, r1 } -// IncrementFailedCounter provides a mock function with given fields: ctx, hashes -func (_m *PoolMock) IncrementFailedCounter(ctx context.Context, hashes []string) error { - ret := _m.Called(ctx, hashes) +// MarkReorgedTxsAsPending provides a mock function with given fields: ctx +func (_m *PoolMock) MarkReorgedTxsAsPending(ctx context.Context) error { + ret := _m.Called(ctx) var r0 error - if rf, ok := ret.Get(0).(func(context.Context, []string) error); ok { - r0 = rf(ctx, hashes) + if rf, ok := ret.Get(0).(func(context.Context) error); ok { + r0 = rf(ctx) } else { r0 = ret.Error(0) } @@ -142,29 +107,8 @@ func (_m *PoolMock) IncrementFailedCounter(ctx context.Context, hashes []string) return r0 } -// IsTxPending provides a mock function with given fields: ctx, hash -func (_m *PoolMock) IsTxPending(ctx context.Context, hash common.Hash) (bool, error) { - ret := _m.Called(ctx, hash) - - var r0 bool - if rf, ok := ret.Get(0).(func(context.Context, common.Hash) bool); ok { - r0 = rf(ctx, hash) - } else { - r0 = ret.Get(0).(bool) - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { - r1 = rf(ctx, hash) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MarkReorgedTxsAsPending provides a mock function with given fields: ctx -func (_m *PoolMock) MarkReorgedTxsAsPending(ctx context.Context) error { +// MarkWIPTxsAsPending provides a mock function with given fields: ctx +func (_m *PoolMock) MarkWIPTxsAsPending(ctx context.Context) error { ret := _m.Called(ctx) var r0 error @@ -191,20 +135,6 @@ func (_m *PoolMock) UpdateTxStatus(ctx context.Context, hash common.Hash, newSta return r0 } -// UpdateTxsStatus provides a mock function with given fields: ctx, hashes, newStatus -func (_m *PoolMock) UpdateTxsStatus(ctx context.Context, hashes []string, newStatus pool.TxStatus) error { - ret := _m.Called(ctx, hashes, newStatus) - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, []string, pool.TxStatus) error); ok { - r0 = rf(ctx, hashes, newStatus) - } else { - r0 = ret.Error(0) - } - - return r0 -} - type mockConstructorTestingTNewPoolMock interface { mock.TestingT Cleanup(func()) diff --git a/sequencer/mock_state.go b/sequencer/mock_state.go new file mode 100644 index 0000000000..8114d445ed --- /dev/null +++ b/sequencer/mock_state.go @@ -0,0 +1,689 @@ +// Code generated by mockery v2.16.0. DO NOT EDIT. + +package sequencer + +import ( + context "context" + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + pb "github.com/0xPolygonHermez/zkevm-node/state/runtime/executor/pb" + + pgx "github.com/jackc/pgx/v4" + + state "github.com/0xPolygonHermez/zkevm-node/state" + + time "time" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// StateMock is an autogenerated mock type for the stateInterface type +type StateMock struct { + mock.Mock +} + +// Begin provides a mock function with given fields: ctx +func (_m *StateMock) Begin(ctx context.Context) (pgx.Tx, error) { + ret := _m.Called(ctx) + + var r0 pgx.Tx + if rf, ok := ret.Get(0).(func(context.Context) pgx.Tx); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(pgx.Tx) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BeginStateTransaction provides a mock function with given fields: ctx +func (_m *StateMock) BeginStateTransaction(ctx context.Context) (pgx.Tx, error) { + ret := _m.Called(ctx) + + var r0 pgx.Tx + if rf, ok := ret.Get(0).(func(context.Context) pgx.Tx); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(pgx.Tx) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CloseBatch provides a mock function with given fields: ctx, receipt, dbTx +func (_m *StateMock) CloseBatch(ctx context.Context, receipt state.ProcessingReceipt, dbTx pgx.Tx) error { + ret := _m.Called(ctx, receipt, dbTx) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, state.ProcessingReceipt, pgx.Tx) error); ok { + r0 = rf(ctx, receipt, dbTx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ExecuteBatch provides a mock function with given fields: ctx, batch, dbTx +func (_m *StateMock) ExecuteBatch(ctx context.Context, batch state.Batch, dbTx pgx.Tx) (*pb.ProcessBatchResponse, error) { + ret := _m.Called(ctx, batch, dbTx) + + var r0 *pb.ProcessBatchResponse + if rf, ok := ret.Get(0).(func(context.Context, state.Batch, pgx.Tx) *pb.ProcessBatchResponse); ok { + r0 = rf(ctx, batch, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*pb.ProcessBatchResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, state.Batch, pgx.Tx) error); ok { + r1 = rf(ctx, batch, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetBalanceByStateRoot provides a mock function with given fields: ctx, address, root +func (_m *StateMock) GetBalanceByStateRoot(ctx context.Context, address common.Address, root common.Hash) (*big.Int, error) { + ret := _m.Called(ctx, address, root) + + var r0 *big.Int + if rf, ok := ret.Get(0).(func(context.Context, common.Address, common.Hash) *big.Int); ok { + r0 = rf(ctx, address, root) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, common.Address, common.Hash) error); ok { + r1 = rf(ctx, address, root) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetBatchByNumber provides a mock function with given fields: ctx, batchNumber, dbTx +func (_m *StateMock) GetBatchByNumber(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) (*state.Batch, error) { + ret := _m.Called(ctx, batchNumber, dbTx) + + var r0 *state.Batch + if rf, ok := ret.Get(0).(func(context.Context, uint64, pgx.Tx) *state.Batch); ok { + r0 = rf(ctx, batchNumber, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*state.Batch) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, uint64, pgx.Tx) error); ok { + r1 = rf(ctx, batchNumber, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetForcedBatch provides a mock function with given fields: ctx, forcedBatchNumber, dbTx +func (_m *StateMock) GetForcedBatch(ctx context.Context, forcedBatchNumber uint64, dbTx pgx.Tx) (*state.ForcedBatch, error) { + ret := _m.Called(ctx, forcedBatchNumber, dbTx) + + var r0 *state.ForcedBatch + if rf, ok := ret.Get(0).(func(context.Context, uint64, pgx.Tx) *state.ForcedBatch); ok { + r0 = rf(ctx, forcedBatchNumber, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*state.ForcedBatch) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, uint64, pgx.Tx) error); ok { + r1 = rf(ctx, forcedBatchNumber, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetForcedBatchesSince provides a mock function with given fields: ctx, forcedBatchNumber, dbTx +func (_m *StateMock) GetForcedBatchesSince(ctx context.Context, forcedBatchNumber uint64, dbTx pgx.Tx) ([]*state.ForcedBatch, error) { + ret := _m.Called(ctx, forcedBatchNumber, dbTx) + + var r0 []*state.ForcedBatch + if rf, ok := ret.Get(0).(func(context.Context, uint64, pgx.Tx) []*state.ForcedBatch); ok { + r0 = rf(ctx, forcedBatchNumber, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*state.ForcedBatch) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, uint64, pgx.Tx) error); ok { + r1 = rf(ctx, forcedBatchNumber, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastBatch provides a mock function with given fields: ctx, dbTx +func (_m *StateMock) GetLastBatch(ctx context.Context, dbTx pgx.Tx) (*state.Batch, error) { + ret := _m.Called(ctx, dbTx) + + var r0 *state.Batch + if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) *state.Batch); ok { + r0 = rf(ctx, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*state.Batch) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { + r1 = rf(ctx, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastBatchNumber provides a mock function with given fields: ctx, dbTx +func (_m *StateMock) GetLastBatchNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) { + ret := _m.Called(ctx, dbTx) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) uint64); ok { + r0 = rf(ctx, dbTx) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { + r1 = rf(ctx, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastBlock provides a mock function with given fields: ctx, dbTx +func (_m *StateMock) GetLastBlock(ctx context.Context, dbTx pgx.Tx) (*state.Block, error) { + ret := _m.Called(ctx, dbTx) + + var r0 *state.Block + if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) *state.Block); ok { + r0 = rf(ctx, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*state.Block) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { + r1 = rf(ctx, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastClosedBatch provides a mock function with given fields: ctx, dbTx +func (_m *StateMock) GetLastClosedBatch(ctx context.Context, dbTx pgx.Tx) (*state.Batch, error) { + ret := _m.Called(ctx, dbTx) + + var r0 *state.Batch + if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) *state.Batch); ok { + r0 = rf(ctx, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*state.Batch) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { + r1 = rf(ctx, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastL2Block provides a mock function with given fields: ctx, dbTx +func (_m *StateMock) GetLastL2Block(ctx context.Context, dbTx pgx.Tx) (*types.Block, error) { + ret := _m.Called(ctx, dbTx) + + var r0 *types.Block + if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) *types.Block); ok { + r0 = rf(ctx, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Block) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { + r1 = rf(ctx, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastL2BlockHeader provides a mock function with given fields: ctx, dbTx +func (_m *StateMock) GetLastL2BlockHeader(ctx context.Context, dbTx pgx.Tx) (*types.Header, error) { + ret := _m.Called(ctx, dbTx) + + var r0 *types.Header + if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) *types.Header); ok { + r0 = rf(ctx, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Header) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { + r1 = rf(ctx, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastNBatches provides a mock function with given fields: ctx, numBatches, dbTx +func (_m *StateMock) GetLastNBatches(ctx context.Context, numBatches uint, dbTx pgx.Tx) ([]*state.Batch, error) { + ret := _m.Called(ctx, numBatches, dbTx) + + var r0 []*state.Batch + if rf, ok := ret.Get(0).(func(context.Context, uint, pgx.Tx) []*state.Batch); ok { + r0 = rf(ctx, numBatches, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*state.Batch) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, uint, pgx.Tx) error); ok { + r1 = rf(ctx, numBatches, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastStateRoot provides a mock function with given fields: ctx, dbTx +func (_m *StateMock) GetLastStateRoot(ctx context.Context, dbTx pgx.Tx) (common.Hash, error) { + ret := _m.Called(ctx, dbTx) + + var r0 common.Hash + if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) common.Hash); ok { + r0 = rf(ctx, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { + r1 = rf(ctx, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastTrustedForcedBatchNumber provides a mock function with given fields: ctx, dbTx +func (_m *StateMock) GetLastTrustedForcedBatchNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) { + ret := _m.Called(ctx, dbTx) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) uint64); ok { + r0 = rf(ctx, dbTx) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { + r1 = rf(ctx, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastVirtualBatchNum provides a mock function with given fields: ctx, dbTx +func (_m *StateMock) GetLastVirtualBatchNum(ctx context.Context, dbTx pgx.Tx) (uint64, error) { + ret := _m.Called(ctx, dbTx) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) uint64); ok { + r0 = rf(ctx, dbTx) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { + r1 = rf(ctx, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLatestGlobalExitRoot provides a mock function with given fields: ctx, maxBlockNumber, dbTx +func (_m *StateMock) GetLatestGlobalExitRoot(ctx context.Context, maxBlockNumber uint64, dbTx pgx.Tx) (state.GlobalExitRoot, time.Time, error) { + ret := _m.Called(ctx, maxBlockNumber, dbTx) + + var r0 state.GlobalExitRoot + if rf, ok := ret.Get(0).(func(context.Context, uint64, pgx.Tx) state.GlobalExitRoot); ok { + r0 = rf(ctx, maxBlockNumber, dbTx) + } else { + r0 = ret.Get(0).(state.GlobalExitRoot) + } + + var r1 time.Time + if rf, ok := ret.Get(1).(func(context.Context, uint64, pgx.Tx) time.Time); ok { + r1 = rf(ctx, maxBlockNumber, dbTx) + } else { + r1 = ret.Get(1).(time.Time) + } + + var r2 error + if rf, ok := ret.Get(2).(func(context.Context, uint64, pgx.Tx) error); ok { + r2 = rf(ctx, maxBlockNumber, dbTx) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetLatestVirtualBatchTimestamp provides a mock function with given fields: ctx, dbTx +func (_m *StateMock) GetLatestVirtualBatchTimestamp(ctx context.Context, dbTx pgx.Tx) (time.Time, error) { + ret := _m.Called(ctx, dbTx) + + var r0 time.Time + if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) time.Time); ok { + r0 = rf(ctx, dbTx) + } else { + r0 = ret.Get(0).(time.Time) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { + r1 = rf(ctx, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetNonceByStateRoot provides a mock function with given fields: ctx, address, root +func (_m *StateMock) GetNonceByStateRoot(ctx context.Context, address common.Address, root common.Hash) (*big.Int, error) { + ret := _m.Called(ctx, address, root) + + var r0 *big.Int + if rf, ok := ret.Get(0).(func(context.Context, common.Address, common.Hash) *big.Int); ok { + r0 = rf(ctx, address, root) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, common.Address, common.Hash) error); ok { + r1 = rf(ctx, address, root) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetTimeForLatestBatchVirtualization provides a mock function with given fields: ctx, dbTx +func (_m *StateMock) GetTimeForLatestBatchVirtualization(ctx context.Context, dbTx pgx.Tx) (time.Time, error) { + ret := _m.Called(ctx, dbTx) + + var r0 time.Time + if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) time.Time); ok { + r0 = rf(ctx, dbTx) + } else { + r0 = ret.Get(0).(time.Time) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { + r1 = rf(ctx, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetTransactionsByBatchNumber provides a mock function with given fields: ctx, batchNumber, dbTx +func (_m *StateMock) GetTransactionsByBatchNumber(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) ([]types.Transaction, error) { + ret := _m.Called(ctx, batchNumber, dbTx) + + var r0 []types.Transaction + if rf, ok := ret.Get(0).(func(context.Context, uint64, pgx.Tx) []types.Transaction); ok { + r0 = rf(ctx, batchNumber, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]types.Transaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, uint64, pgx.Tx) error); ok { + r1 = rf(ctx, batchNumber, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetTxsOlderThanNL1Blocks provides a mock function with given fields: ctx, nL1Blocks, dbTx +func (_m *StateMock) GetTxsOlderThanNL1Blocks(ctx context.Context, nL1Blocks uint64, dbTx pgx.Tx) ([]common.Hash, error) { + ret := _m.Called(ctx, nL1Blocks, dbTx) + + var r0 []common.Hash + if rf, ok := ret.Get(0).(func(context.Context, uint64, pgx.Tx) []common.Hash); ok { + r0 = rf(ctx, nL1Blocks, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]common.Hash) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, uint64, pgx.Tx) error); ok { + r1 = rf(ctx, nL1Blocks, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// IsBatchClosed provides a mock function with given fields: ctx, batchNum, dbTx +func (_m *StateMock) IsBatchClosed(ctx context.Context, batchNum uint64, dbTx pgx.Tx) (bool, error) { + ret := _m.Called(ctx, batchNum, dbTx) + + var r0 bool + if rf, ok := ret.Get(0).(func(context.Context, uint64, pgx.Tx) bool); ok { + r0 = rf(ctx, batchNum, dbTx) + } else { + r0 = ret.Get(0).(bool) + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, uint64, pgx.Tx) error); ok { + r1 = rf(ctx, batchNum, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// OpenBatch provides a mock function with given fields: ctx, processingContext, dbTx +func (_m *StateMock) OpenBatch(ctx context.Context, processingContext state.ProcessingContext, dbTx pgx.Tx) error { + ret := _m.Called(ctx, processingContext, dbTx) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, state.ProcessingContext, pgx.Tx) error); ok { + r0 = rf(ctx, processingContext, dbTx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ProcessBatch provides a mock function with given fields: ctx, request +func (_m *StateMock) ProcessBatch(ctx context.Context, request state.ProcessRequest) (*state.ProcessBatchResponse, error) { + ret := _m.Called(ctx, request) + + var r0 *state.ProcessBatchResponse + if rf, ok := ret.Get(0).(func(context.Context, state.ProcessRequest) *state.ProcessBatchResponse); ok { + r0 = rf(ctx, request) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*state.ProcessBatchResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, state.ProcessRequest) error); ok { + r1 = rf(ctx, request) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProcessSequencerBatch provides a mock function with given fields: ctx, batchNumber, batchL2Data, caller, dbTx +func (_m *StateMock) ProcessSequencerBatch(ctx context.Context, batchNumber uint64, batchL2Data []byte, caller state.CallerLabel, dbTx pgx.Tx) (*state.ProcessBatchResponse, error) { + ret := _m.Called(ctx, batchNumber, batchL2Data, caller, dbTx) + + var r0 *state.ProcessBatchResponse + if rf, ok := ret.Get(0).(func(context.Context, uint64, []byte, state.CallerLabel, pgx.Tx) *state.ProcessBatchResponse); ok { + r0 = rf(ctx, batchNumber, batchL2Data, caller, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*state.ProcessBatchResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, uint64, []byte, state.CallerLabel, pgx.Tx) error); ok { + r1 = rf(ctx, batchNumber, batchL2Data, caller, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// StoreTransaction provides a mock function with given fields: ctx, batchNumber, processedTx, coinbase, timestamp, dbTx +func (_m *StateMock) StoreTransaction(ctx context.Context, batchNumber uint64, processedTx *state.ProcessTransactionResponse, coinbase common.Address, timestamp uint64, dbTx pgx.Tx) error { + ret := _m.Called(ctx, batchNumber, processedTx, coinbase, timestamp, dbTx) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, uint64, *state.ProcessTransactionResponse, common.Address, uint64, pgx.Tx) error); ok { + r0 = rf(ctx, batchNumber, processedTx, coinbase, timestamp, dbTx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// UpdateBatchL2Data provides a mock function with given fields: ctx, batchNumber, batchL2Data, dbTx +func (_m *StateMock) UpdateBatchL2Data(ctx context.Context, batchNumber uint64, batchL2Data []byte, dbTx pgx.Tx) error { + ret := _m.Called(ctx, batchNumber, batchL2Data, dbTx) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, uint64, []byte, pgx.Tx) error); ok { + r0 = rf(ctx, batchNumber, batchL2Data, dbTx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +type mockConstructorTestingTNewStateMock interface { + mock.TestingT + Cleanup(func()) +} + +// NewStateMock creates a new instance of StateMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewStateMock(t mockConstructorTestingTNewStateMock) *StateMock { + mock := &StateMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencer/mock_worker.go b/sequencer/mock_worker.go new file mode 100644 index 0000000000..e72e69affe --- /dev/null +++ b/sequencer/mock_worker.go @@ -0,0 +1,105 @@ +// Code generated by mockery v2.16.0. DO NOT EDIT. + +package sequencer + +import ( + context "context" + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + state "github.com/0xPolygonHermez/zkevm-node/state" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// WorkerMock is an autogenerated mock type for the workerInterface type +type WorkerMock struct { + mock.Mock +} + +// AddTx provides a mock function with given fields: ctx, txTracker +func (_m *WorkerMock) AddTx(ctx context.Context, txTracker *TxTracker) { + _m.Called(ctx, txTracker) +} + +// DeleteTx provides a mock function with given fields: txHash, from +func (_m *WorkerMock) DeleteTx(txHash common.Hash, from common.Address) { + _m.Called(txHash, from) +} + +// GetBestFittingTx provides a mock function with given fields: resources +func (_m *WorkerMock) GetBestFittingTx(resources batchResources) *TxTracker { + ret := _m.Called(resources) + + var r0 *TxTracker + if rf, ok := ret.Get(0).(func(batchResources) *TxTracker); ok { + r0 = rf(resources) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*TxTracker) + } + } + + return r0 +} + +// HandleL2Reorg provides a mock function with given fields: txHashes +func (_m *WorkerMock) HandleL2Reorg(txHashes []common.Hash) { + _m.Called(txHashes) +} + +// MoveTxToNotReady provides a mock function with given fields: txHash, from, actualNonce, actualBalance +func (_m *WorkerMock) MoveTxToNotReady(txHash common.Hash, from common.Address, actualNonce *uint64, actualBalance *big.Int) { + _m.Called(txHash, from, actualNonce, actualBalance) +} + +// NewTxTracker provides a mock function with given fields: tx, isClaim, counters +func (_m *WorkerMock) NewTxTracker(tx types.Transaction, isClaim bool, counters state.ZKCounters) (*TxTracker, error) { + ret := _m.Called(tx, isClaim, counters) + + var r0 *TxTracker + if rf, ok := ret.Get(0).(func(types.Transaction, bool, state.ZKCounters) *TxTracker); ok { + r0 = rf(tx, isClaim, counters) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*TxTracker) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(types.Transaction, bool, state.ZKCounters) error); ok { + r1 = rf(tx, isClaim, counters) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// UpdateAfterSingleSuccessfulTxExecution provides a mock function with given fields: from, touchedAddresses +func (_m *WorkerMock) UpdateAfterSingleSuccessfulTxExecution(from common.Address, touchedAddresses map[common.Address]*state.InfoReadWrite) { + _m.Called(from, touchedAddresses) +} + +// UpdateTx provides a mock function with given fields: txHash, from, ZKCounters +func (_m *WorkerMock) UpdateTx(txHash common.Hash, from common.Address, ZKCounters state.ZKCounters) { + _m.Called(txHash, from, ZKCounters) +} + +type mockConstructorTestingTNewWorkerMock interface { + mock.TestingT + Cleanup(func()) +} + +// NewWorkerMock creates a new instance of WorkerMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewWorkerMock(t mockConstructorTestingTNewWorkerMock) *WorkerMock { + mock := &WorkerMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencer/mocks/mock_etherman.go b/sequencer/mocks/mock_etherman.go deleted file mode 100644 index 802cdcb1ff..0000000000 --- a/sequencer/mocks/mock_etherman.go +++ /dev/null @@ -1,221 +0,0 @@ -// Code generated by mockery v2.16.0. DO NOT EDIT. - -package mocks - -import ( - context "context" - big "math/big" - - common "github.com/ethereum/go-ethereum/common" - - coretypes "github.com/ethereum/go-ethereum/core/types" - - mock "github.com/stretchr/testify/mock" - - types "github.com/0xPolygonHermez/zkevm-node/etherman/types" -) - -// EthermanMock is an autogenerated mock type for the etherman type -type EthermanMock struct { - mock.Mock -} - -// BuildSequenceBatchesTxData provides a mock function with given fields: sender, sequences -func (_m *EthermanMock) BuildSequenceBatchesTxData(sender common.Address, sequences []types.Sequence) (*common.Address, []byte, error) { - ret := _m.Called(sender, sequences) - - var r0 *common.Address - if rf, ok := ret.Get(0).(func(common.Address, []types.Sequence) *common.Address); ok { - r0 = rf(sender, sequences) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*common.Address) - } - } - - var r1 []byte - if rf, ok := ret.Get(1).(func(common.Address, []types.Sequence) []byte); ok { - r1 = rf(sender, sequences) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).([]byte) - } - } - - var r2 error - if rf, ok := ret.Get(2).(func(common.Address, []types.Sequence) error); ok { - r2 = rf(sender, sequences) - } else { - r2 = ret.Error(2) - } - - return r0, r1, r2 -} - -// EstimateGasSequenceBatches provides a mock function with given fields: sender, sequences -func (_m *EthermanMock) EstimateGasSequenceBatches(sender common.Address, sequences []types.Sequence) (*coretypes.Transaction, error) { - ret := _m.Called(sender, sequences) - - var r0 *coretypes.Transaction - if rf, ok := ret.Get(0).(func(common.Address, []types.Sequence) *coretypes.Transaction); ok { - r0 = rf(sender, sequences) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*coretypes.Transaction) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(common.Address, []types.Sequence) error); ok { - r1 = rf(sender, sequences) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetLastBatchTimestamp provides a mock function with given fields: -func (_m *EthermanMock) GetLastBatchTimestamp() (uint64, error) { - ret := _m.Called() - - var r0 uint64 - if rf, ok := ret.Get(0).(func() uint64); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(uint64) - } - - var r1 error - if rf, ok := ret.Get(1).(func() error); ok { - r1 = rf() - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetLatestBatchNumber provides a mock function with given fields: -func (_m *EthermanMock) GetLatestBatchNumber() (uint64, error) { - ret := _m.Called() - - var r0 uint64 - if rf, ok := ret.Get(0).(func() uint64); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(uint64) - } - - var r1 error - if rf, ok := ret.Get(1).(func() error); ok { - r1 = rf() - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetLatestBlockNumber provides a mock function with given fields: ctx -func (_m *EthermanMock) GetLatestBlockNumber(ctx context.Context) (uint64, error) { - ret := _m.Called(ctx) - - var r0 uint64 - if rf, ok := ret.Get(0).(func(context.Context) uint64); ok { - r0 = rf(ctx) - } else { - r0 = ret.Get(0).(uint64) - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context) error); ok { - r1 = rf(ctx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetLatestBlockTimestamp provides a mock function with given fields: ctx -func (_m *EthermanMock) GetLatestBlockTimestamp(ctx context.Context) (uint64, error) { - ret := _m.Called(ctx) - - var r0 uint64 - if rf, ok := ret.Get(0).(func(context.Context) uint64); ok { - r0 = rf(ctx) - } else { - r0 = ret.Get(0).(uint64) - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context) error); ok { - r1 = rf(ctx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetSendSequenceFee provides a mock function with given fields: numBatches -func (_m *EthermanMock) GetSendSequenceFee(numBatches uint64) (*big.Int, error) { - ret := _m.Called(numBatches) - - var r0 *big.Int - if rf, ok := ret.Get(0).(func(uint64) *big.Int); ok { - r0 = rf(numBatches) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*big.Int) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(uint64) error); ok { - r1 = rf(numBatches) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// TrustedSequencer provides a mock function with given fields: -func (_m *EthermanMock) TrustedSequencer() (common.Address, error) { - ret := _m.Called() - - var r0 common.Address - if rf, ok := ret.Get(0).(func() common.Address); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(common.Address) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func() error); ok { - r1 = rf() - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -type mockConstructorTestingTNewEthermanMock interface { - mock.TestingT - Cleanup(func()) -} - -// NewEthermanMock creates a new instance of EthermanMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewEthermanMock(t mockConstructorTestingTNewEthermanMock) *EthermanMock { - mock := &EthermanMock{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/sequencer/mocks/mock_ethtxmanager.go b/sequencer/mocks/mock_ethtxmanager.go deleted file mode 100644 index 048e8e5cc6..0000000000 --- a/sequencer/mocks/mock_ethtxmanager.go +++ /dev/null @@ -1,99 +0,0 @@ -// Code generated by mockery v2.16.0. DO NOT EDIT. - -package mocks - -import ( - context "context" - big "math/big" - - common "github.com/ethereum/go-ethereum/common" - - ethtxmanager "github.com/0xPolygonHermez/zkevm-node/ethtxmanager" - - mock "github.com/stretchr/testify/mock" - - pgx "github.com/jackc/pgx/v4" -) - -// EthTxManager is an autogenerated mock type for the ethTxManager type -type EthTxManager struct { - mock.Mock -} - -// Add provides a mock function with given fields: ctx, owner, id, from, to, value, data, dbTx -func (_m *EthTxManager) Add(ctx context.Context, owner string, id string, from common.Address, to *common.Address, value *big.Int, data []byte, dbTx pgx.Tx) error { - ret := _m.Called(ctx, owner, id, from, to, value, data, dbTx) - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, string, string, common.Address, *common.Address, *big.Int, []byte, pgx.Tx) error); ok { - r0 = rf(ctx, owner, id, from, to, value, data, dbTx) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// ProcessPendingMonitoredTxs provides a mock function with given fields: ctx, owner, failedResultHandler, dbTx -func (_m *EthTxManager) ProcessPendingMonitoredTxs(ctx context.Context, owner string, failedResultHandler ethtxmanager.ResultHandler, dbTx pgx.Tx) { - _m.Called(ctx, owner, failedResultHandler, dbTx) -} - -// Result provides a mock function with given fields: ctx, owner, id, dbTx -func (_m *EthTxManager) Result(ctx context.Context, owner string, id string, dbTx pgx.Tx) (ethtxmanager.MonitoredTxResult, error) { - ret := _m.Called(ctx, owner, id, dbTx) - - var r0 ethtxmanager.MonitoredTxResult - if rf, ok := ret.Get(0).(func(context.Context, string, string, pgx.Tx) ethtxmanager.MonitoredTxResult); ok { - r0 = rf(ctx, owner, id, dbTx) - } else { - r0 = ret.Get(0).(ethtxmanager.MonitoredTxResult) - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, string, string, pgx.Tx) error); ok { - r1 = rf(ctx, owner, id, dbTx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// ResultsByStatus provides a mock function with given fields: ctx, owner, statuses, dbTx -func (_m *EthTxManager) ResultsByStatus(ctx context.Context, owner string, statuses []ethtxmanager.MonitoredTxStatus, dbTx pgx.Tx) ([]ethtxmanager.MonitoredTxResult, error) { - ret := _m.Called(ctx, owner, statuses, dbTx) - - var r0 []ethtxmanager.MonitoredTxResult - if rf, ok := ret.Get(0).(func(context.Context, string, []ethtxmanager.MonitoredTxStatus, pgx.Tx) []ethtxmanager.MonitoredTxResult); ok { - r0 = rf(ctx, owner, statuses, dbTx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]ethtxmanager.MonitoredTxResult) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, string, []ethtxmanager.MonitoredTxStatus, pgx.Tx) error); ok { - r1 = rf(ctx, owner, statuses, dbTx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -type mockConstructorTestingTNewEthTxManager interface { - mock.TestingT - Cleanup(func()) -} - -// NewEthTxManager creates a new instance of EthTxManager. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewEthTxManager(t mockConstructorTestingTNewEthTxManager) *EthTxManager { - mock := &EthTxManager{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/sequencer/mocks/mock_state.go b/sequencer/mocks/mock_state.go deleted file mode 100644 index ac2c76d5fc..0000000000 --- a/sequencer/mocks/mock_state.go +++ /dev/null @@ -1,461 +0,0 @@ -// Code generated by mockery v2.16.0. DO NOT EDIT. - -package mocks - -import ( - context "context" - - common "github.com/ethereum/go-ethereum/common" - - mock "github.com/stretchr/testify/mock" - - pgx "github.com/jackc/pgx/v4" - - state "github.com/0xPolygonHermez/zkevm-node/state" - - time "time" - - types "github.com/ethereum/go-ethereum/core/types" -) - -// StateMock is an autogenerated mock type for the stateInterface type -type StateMock struct { - mock.Mock -} - -// BeginStateTransaction provides a mock function with given fields: ctx -func (_m *StateMock) BeginStateTransaction(ctx context.Context) (pgx.Tx, error) { - ret := _m.Called(ctx) - - var r0 pgx.Tx - if rf, ok := ret.Get(0).(func(context.Context) pgx.Tx); ok { - r0 = rf(ctx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(pgx.Tx) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context) error); ok { - r1 = rf(ctx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// CloseBatch provides a mock function with given fields: ctx, receipt, dbTx -func (_m *StateMock) CloseBatch(ctx context.Context, receipt state.ProcessingReceipt, dbTx pgx.Tx) error { - ret := _m.Called(ctx, receipt, dbTx) - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, state.ProcessingReceipt, pgx.Tx) error); ok { - r0 = rf(ctx, receipt, dbTx) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// GetBatchByNumber provides a mock function with given fields: ctx, batchNumber, dbTx -func (_m *StateMock) GetBatchByNumber(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) (*state.Batch, error) { - ret := _m.Called(ctx, batchNumber, dbTx) - - var r0 *state.Batch - if rf, ok := ret.Get(0).(func(context.Context, uint64, pgx.Tx) *state.Batch); ok { - r0 = rf(ctx, batchNumber, dbTx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*state.Batch) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, uint64, pgx.Tx) error); ok { - r1 = rf(ctx, batchNumber, dbTx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetBlockNumAndMainnetExitRootByGER provides a mock function with given fields: ctx, ger, dbTx -func (_m *StateMock) GetBlockNumAndMainnetExitRootByGER(ctx context.Context, ger common.Hash, dbTx pgx.Tx) (uint64, common.Hash, error) { - ret := _m.Called(ctx, ger, dbTx) - - var r0 uint64 - if rf, ok := ret.Get(0).(func(context.Context, common.Hash, pgx.Tx) uint64); ok { - r0 = rf(ctx, ger, dbTx) - } else { - r0 = ret.Get(0).(uint64) - } - - var r1 common.Hash - if rf, ok := ret.Get(1).(func(context.Context, common.Hash, pgx.Tx) common.Hash); ok { - r1 = rf(ctx, ger, dbTx) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(common.Hash) - } - } - - var r2 error - if rf, ok := ret.Get(2).(func(context.Context, common.Hash, pgx.Tx) error); ok { - r2 = rf(ctx, ger, dbTx) - } else { - r2 = ret.Error(2) - } - - return r0, r1, r2 -} - -// GetLastBatch provides a mock function with given fields: ctx, dbTx -func (_m *StateMock) GetLastBatch(ctx context.Context, dbTx pgx.Tx) (*state.Batch, error) { - ret := _m.Called(ctx, dbTx) - - var r0 *state.Batch - if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) *state.Batch); ok { - r0 = rf(ctx, dbTx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*state.Batch) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { - r1 = rf(ctx, dbTx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetLastBatchNumber provides a mock function with given fields: ctx, dbTx -func (_m *StateMock) GetLastBatchNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) { - ret := _m.Called(ctx, dbTx) - - var r0 uint64 - if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) uint64); ok { - r0 = rf(ctx, dbTx) - } else { - r0 = ret.Get(0).(uint64) - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { - r1 = rf(ctx, dbTx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetLastL2BlockNumber provides a mock function with given fields: ctx, dbTx -func (_m *StateMock) GetLastL2BlockNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) { - ret := _m.Called(ctx, dbTx) - - var r0 uint64 - if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) uint64); ok { - r0 = rf(ctx, dbTx) - } else { - r0 = ret.Get(0).(uint64) - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { - r1 = rf(ctx, dbTx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetLastVirtualBatchNum provides a mock function with given fields: ctx, dbTx -func (_m *StateMock) GetLastVirtualBatchNum(ctx context.Context, dbTx pgx.Tx) (uint64, error) { - ret := _m.Called(ctx, dbTx) - - var r0 uint64 - if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) uint64); ok { - r0 = rf(ctx, dbTx) - } else { - r0 = ret.Get(0).(uint64) - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { - r1 = rf(ctx, dbTx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetLatestGlobalExitRoot provides a mock function with given fields: ctx, maxBlockNumber, dbTx -func (_m *StateMock) GetLatestGlobalExitRoot(ctx context.Context, maxBlockNumber uint64, dbTx pgx.Tx) (state.GlobalExitRoot, time.Time, error) { - ret := _m.Called(ctx, maxBlockNumber, dbTx) - - var r0 state.GlobalExitRoot - if rf, ok := ret.Get(0).(func(context.Context, uint64, pgx.Tx) state.GlobalExitRoot); ok { - r0 = rf(ctx, maxBlockNumber, dbTx) - } else { - r0 = ret.Get(0).(state.GlobalExitRoot) - } - - var r1 time.Time - if rf, ok := ret.Get(1).(func(context.Context, uint64, pgx.Tx) time.Time); ok { - r1 = rf(ctx, maxBlockNumber, dbTx) - } else { - r1 = ret.Get(1).(time.Time) - } - - var r2 error - if rf, ok := ret.Get(2).(func(context.Context, uint64, pgx.Tx) error); ok { - r2 = rf(ctx, maxBlockNumber, dbTx) - } else { - r2 = ret.Error(2) - } - - return r0, r1, r2 -} - -// GetNonce provides a mock function with given fields: ctx, address, blockNumber, dbTx -func (_m *StateMock) GetNonce(ctx context.Context, address common.Address, blockNumber uint64, dbTx pgx.Tx) (uint64, error) { - ret := _m.Called(ctx, address, blockNumber, dbTx) - - var r0 uint64 - if rf, ok := ret.Get(0).(func(context.Context, common.Address, uint64, pgx.Tx) uint64); ok { - r0 = rf(ctx, address, blockNumber, dbTx) - } else { - r0 = ret.Get(0).(uint64) - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, common.Address, uint64, pgx.Tx) error); ok { - r1 = rf(ctx, address, blockNumber, dbTx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetStateRootByBatchNumber provides a mock function with given fields: ctx, batchNum, dbTx -func (_m *StateMock) GetStateRootByBatchNumber(ctx context.Context, batchNum uint64, dbTx pgx.Tx) (common.Hash, error) { - ret := _m.Called(ctx, batchNum, dbTx) - - var r0 common.Hash - if rf, ok := ret.Get(0).(func(context.Context, uint64, pgx.Tx) common.Hash); ok { - r0 = rf(ctx, batchNum, dbTx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(common.Hash) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, uint64, pgx.Tx) error); ok { - r1 = rf(ctx, batchNum, dbTx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetTimeForLatestBatchVirtualization provides a mock function with given fields: ctx, dbTx -func (_m *StateMock) GetTimeForLatestBatchVirtualization(ctx context.Context, dbTx pgx.Tx) (time.Time, error) { - ret := _m.Called(ctx, dbTx) - - var r0 time.Time - if rf, ok := ret.Get(0).(func(context.Context, pgx.Tx) time.Time); ok { - r0 = rf(ctx, dbTx) - } else { - r0 = ret.Get(0).(time.Time) - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, pgx.Tx) error); ok { - r1 = rf(ctx, dbTx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetTransactionsByBatchNumber provides a mock function with given fields: ctx, batchNumber, dbTx -func (_m *StateMock) GetTransactionsByBatchNumber(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) ([]types.Transaction, error) { - ret := _m.Called(ctx, batchNumber, dbTx) - - var r0 []types.Transaction - if rf, ok := ret.Get(0).(func(context.Context, uint64, pgx.Tx) []types.Transaction); ok { - r0 = rf(ctx, batchNumber, dbTx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]types.Transaction) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, uint64, pgx.Tx) error); ok { - r1 = rf(ctx, batchNumber, dbTx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetTxsOlderThanNL1Blocks provides a mock function with given fields: ctx, nL1Blocks, dbTx -func (_m *StateMock) GetTxsOlderThanNL1Blocks(ctx context.Context, nL1Blocks uint64, dbTx pgx.Tx) ([]common.Hash, error) { - ret := _m.Called(ctx, nL1Blocks, dbTx) - - var r0 []common.Hash - if rf, ok := ret.Get(0).(func(context.Context, uint64, pgx.Tx) []common.Hash); ok { - r0 = rf(ctx, nL1Blocks, dbTx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]common.Hash) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, uint64, pgx.Tx) error); ok { - r1 = rf(ctx, nL1Blocks, dbTx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// IsBatchClosed provides a mock function with given fields: ctx, batchNum, dbTx -func (_m *StateMock) IsBatchClosed(ctx context.Context, batchNum uint64, dbTx pgx.Tx) (bool, error) { - ret := _m.Called(ctx, batchNum, dbTx) - - var r0 bool - if rf, ok := ret.Get(0).(func(context.Context, uint64, pgx.Tx) bool); ok { - r0 = rf(ctx, batchNum, dbTx) - } else { - r0 = ret.Get(0).(bool) - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, uint64, pgx.Tx) error); ok { - r1 = rf(ctx, batchNum, dbTx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// IsBatchVirtualized provides a mock function with given fields: ctx, batchNumber, dbTx -func (_m *StateMock) IsBatchVirtualized(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) (bool, error) { - ret := _m.Called(ctx, batchNumber, dbTx) - - var r0 bool - if rf, ok := ret.Get(0).(func(context.Context, uint64, pgx.Tx) bool); ok { - r0 = rf(ctx, batchNumber, dbTx) - } else { - r0 = ret.Get(0).(bool) - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, uint64, pgx.Tx) error); ok { - r1 = rf(ctx, batchNumber, dbTx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// OpenBatch provides a mock function with given fields: ctx, processingContext, dbTx -func (_m *StateMock) OpenBatch(ctx context.Context, processingContext state.ProcessingContext, dbTx pgx.Tx) error { - ret := _m.Called(ctx, processingContext, dbTx) - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, state.ProcessingContext, pgx.Tx) error); ok { - r0 = rf(ctx, processingContext, dbTx) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// ProcessSequencerBatch provides a mock function with given fields: ctx, batchNumber, txs, dbTx, caller -func (_m *StateMock) ProcessSequencerBatch(ctx context.Context, batchNumber uint64, txs []types.Transaction, dbTx pgx.Tx, caller state.CallerLabel) (*state.ProcessBatchResponse, error) { - ret := _m.Called(ctx, batchNumber, txs, dbTx, caller) - - var r0 *state.ProcessBatchResponse - if rf, ok := ret.Get(0).(func(context.Context, uint64, []types.Transaction, pgx.Tx, state.CallerLabel) *state.ProcessBatchResponse); ok { - r0 = rf(ctx, batchNumber, txs, dbTx, caller) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*state.ProcessBatchResponse) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, uint64, []types.Transaction, pgx.Tx, state.CallerLabel) error); ok { - r1 = rf(ctx, batchNumber, txs, dbTx, caller) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// StoreTransactions provides a mock function with given fields: ctx, batchNum, processedTxs, dbTx -func (_m *StateMock) StoreTransactions(ctx context.Context, batchNum uint64, processedTxs []*state.ProcessTransactionResponse, dbTx pgx.Tx) error { - ret := _m.Called(ctx, batchNum, processedTxs, dbTx) - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, uint64, []*state.ProcessTransactionResponse, pgx.Tx) error); ok { - r0 = rf(ctx, batchNum, processedTxs, dbTx) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// UpdateGERInOpenBatch provides a mock function with given fields: ctx, ger, dbTx -func (_m *StateMock) UpdateGERInOpenBatch(ctx context.Context, ger common.Hash, dbTx pgx.Tx) error { - ret := _m.Called(ctx, ger, dbTx) - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, common.Hash, pgx.Tx) error); ok { - r0 = rf(ctx, ger, dbTx) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -type mockConstructorTestingTNewStateMock interface { - mock.TestingT - Cleanup(func()) -} - -// NewStateMock creates a new instance of StateMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewStateMock(t mockConstructorTestingTNewStateMock) *StateMock { - mock := &StateMock{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/sequencer/mocks/mock_txmanager.go b/sequencer/mocks/mock_txmanager.go deleted file mode 100644 index dfaa0298c6..0000000000 --- a/sequencer/mocks/mock_txmanager.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by mockery v2.16.0. DO NOT EDIT. - -package mocks - -import ( - context "context" - - mock "github.com/stretchr/testify/mock" - - types "github.com/0xPolygonHermez/zkevm-node/etherman/types" -) - -// TxmanagerMock is an autogenerated mock type for the txManager type -type TxmanagerMock struct { - mock.Mock -} - -// SequenceBatches provides a mock function with given fields: ctx, sequences -func (_m *TxmanagerMock) SequenceBatches(ctx context.Context, sequences []types.Sequence) error { - ret := _m.Called(ctx, sequences) - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, []types.Sequence) error); ok { - r0 = rf(ctx, sequences) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -type mockConstructorTestingTNewTxmanagerMock interface { - mock.TestingT - Cleanup(func()) -} - -// NewTxmanagerMock creates a new instance of TxmanagerMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewTxmanagerMock(t mockConstructorTestingTNewTxmanagerMock) *TxmanagerMock { - mock := &TxmanagerMock{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/sequencer/pendingtxsqueue.go b/sequencer/pendingtxsqueue.go deleted file mode 100644 index 9df3a3a5ff..0000000000 --- a/sequencer/pendingtxsqueue.go +++ /dev/null @@ -1,208 +0,0 @@ -package sequencer - -import ( - "context" - "sync" - "time" - - "github.com/0xPolygonHermez/zkevm-node/config/types" - "github.com/0xPolygonHermez/zkevm-node/log" - "github.com/0xPolygonHermez/zkevm-node/pool" - "github.com/ethereum/go-ethereum/common" -) - -const amountOfPendingTxsRequested = 1000 - -// PendingTxsQueueConfig config for pending tx queue data structure -type PendingTxsQueueConfig struct { - TxPendingInQueueCheckingFrequency types.Duration `mapstructure:"TxPendingInQueueCheckingFrequency"` - GetPendingTxsFrequency types.Duration `mapstructure:"GetPendingTxsFrequency"` -} - -// PendingTxsQueue keeps pending tx queue and gives tx with the highest gas price by request -type PendingTxsQueue struct { - cfg PendingTxsQueueConfig - - poppedTxsHashesChan chan common.Hash - poppedTxsHashesMap map[string]bool - poppedTxsHashesMutex sync.RWMutex - - pendingTxs []pool.Transaction - pendingTxsMutex sync.RWMutex - pendingTxsMap map[string]bool - - txPool txPool -} - -// NewPendingTxsQueue inits new pending tx queue -func NewPendingTxsQueue(cfg PendingTxsQueueConfig, pool txPool) *PendingTxsQueue { - poppedTxsChan := make(chan common.Hash, amountOfPendingTxsRequested) - poppedTxsHashesMap := make(map[string]bool) - pendingTxMap := make(map[string]bool) - return &PendingTxsQueue{ - cfg: cfg, - txPool: pool, - pendingTxsMap: pendingTxMap, - poppedTxsHashesChan: poppedTxsChan, - poppedTxsHashesMap: poppedTxsHashesMap, - } -} - -// PopPendingTx pops top pending tx from the queue -func (q *PendingTxsQueue) PopPendingTx() *pool.Transaction { - var tx *pool.Transaction - - q.pendingTxsMutex.Lock() - if len(q.pendingTxs) > 1 { - tx, q.pendingTxs = &q.pendingTxs[0], q.pendingTxs[1:] - } else if len(q.pendingTxs) == 1 { - tx = &q.pendingTxs[0] - q.pendingTxs = []pool.Transaction{} - } else { - q.pendingTxsMutex.Unlock() - return nil - } - txHash := tx.Hash().Hex() - delete(q.pendingTxsMap, txHash) - q.pendingTxsMutex.Unlock() - - q.poppedTxsHashesMutex.Lock() - q.poppedTxsHashesMap[txHash] = true - q.poppedTxsHashesMutex.Unlock() - - q.poppedTxsHashesChan <- tx.Hash() - - return tx -} - -// findPlaceInSlice finds place where to insert tx to the queue according to gas amount -func (q *PendingTxsQueue) findPlaceInSlice(pendingTx pool.Transaction) int { - q.pendingTxsMutex.RLock() - defer q.pendingTxsMutex.RUnlock() - low := 0 - high := len(q.pendingTxs) - 1 - for low <= high { - median := low + (high-low)/2 // nolint:gomnd - if q.pendingTxs[median].Gas() == pendingTx.Gas() { - return median - } else if q.pendingTxs[median].Gas() < pendingTx.Gas() { - low = median + 1 - } else { - high = median - 1 - } - } - return high + 1 -} - -// InsertPendingTx insert pending tx from the pool to the queue -func (q *PendingTxsQueue) InsertPendingTx(tx pool.Transaction) { - index := q.findPlaceInSlice(tx) - q.pendingTxsMutex.Lock() - defer q.pendingTxsMutex.Unlock() - q.pendingTxsMap[tx.Hash().Hex()] = true - if index <= 1 { - q.pendingTxs = append(q.pendingTxs, tx) - } else { - q.pendingTxs = append(q.pendingTxs[:index+1], q.pendingTxs[index:]...) - q.pendingTxs[index] = tx - } -} - -// CleanPendTxsChan cleans pending tx that is already popped from the queue and selected/rejected -func (q *PendingTxsQueue) CleanPendTxsChan(ctx context.Context) { - for { - select { - case hash := <-q.poppedTxsHashesChan: - q.waitForTxToBeProcessed(ctx, hash) - case <-ctx.Done(): - return - } - } -} - -// waitForTxToBeProcessed for the tx to change it's status from pending to invalid or selected -func (q *PendingTxsQueue) waitForTxToBeProcessed(ctx context.Context, hash common.Hash) { - var err error - tickerIsTxPending := time.NewTicker(q.cfg.TxPendingInQueueCheckingFrequency.Duration) - isPending := true - for isPending { - isPending, err = q.txPool.IsTxPending(ctx, hash) - if err != nil { - log.Warnf("failed to check if tx is still pending, txHash: %s, err: %v", hash.Hex(), err) - } - - if !isPending { - q.poppedTxsHashesMutex.Lock() - delete(q.poppedTxsHashesMap, hash.Hex()) - q.poppedTxsHashesMutex.Unlock() - return - } - select { - case <-tickerIsTxPending.C: - // nothing - case <-ctx.Done(): - return - } - } -} - -// KeepPendingTxsQueue keeps pending txs queue full -func (q *PendingTxsQueue) KeepPendingTxsQueue(ctx context.Context) { - var err error - q.pendingTxsMutex.Lock() - for len(q.pendingTxs) == 0 { - q.pendingTxs, err = q.txPool.GetPendingTxs(ctx, false, amountOfPendingTxsRequested) - if err != nil { - log.Errorf("failed to get pending txs, err: %v", err) - } - if len(q.pendingTxs) == 0 { - time.Sleep(q.cfg.GetPendingTxsFrequency.Duration) - } - } - - for _, tx := range q.pendingTxs { - q.pendingTxsMap[tx.Hash().Hex()] = true - } - - q.pendingTxsMutex.Unlock() - - for { - time.Sleep(q.cfg.GetPendingTxsFrequency.Duration) - lenPendingTxs := q.GetPendingTxsQueueLength() - if lenPendingTxs >= amountOfPendingTxsRequested { - continue - } - pendTx, err := q.txPool.GetPendingTxs(ctx, false, 1) - if err != nil { - log.Errorf("failed to get pending tx, err: %v", err) - continue - } - if len(pendTx) == 0 { - continue - } - pendTxHash := pendTx[0].Hash().Hex() - if lenPendingTxs == 0 || - !(q.isTxPopped(pendTxHash) || q.isTxInPendingQueue(pendTxHash)) { - q.InsertPendingTx(pendTx[0]) - } - } -} - -// GetPendingTxsQueueLength get length -func (q *PendingTxsQueue) GetPendingTxsQueueLength() int { - q.pendingTxsMutex.RLock() - defer q.pendingTxsMutex.RUnlock() - return len(q.pendingTxs) -} - -func (q *PendingTxsQueue) isTxInPendingQueue(txHash string) bool { - q.pendingTxsMutex.RLock() - defer q.pendingTxsMutex.RUnlock() - return q.pendingTxsMap[txHash] -} - -func (q *PendingTxsQueue) isTxPopped(txHash string) bool { - q.poppedTxsHashesMutex.RLock() - defer q.poppedTxsHashesMutex.RUnlock() - return q.poppedTxsHashesMap[txHash] -} diff --git a/sequencer/pendingtxsqueue_test.go b/sequencer/pendingtxsqueue_test.go deleted file mode 100644 index 84dbe71f70..0000000000 --- a/sequencer/pendingtxsqueue_test.go +++ /dev/null @@ -1,231 +0,0 @@ -package sequencer_test - -import ( - "context" - "fmt" - "math/big" - "strings" - "testing" - "time" - - cfgTypes "github.com/0xPolygonHermez/zkevm-node/config/types" - "github.com/0xPolygonHermez/zkevm-node/db" - "github.com/0xPolygonHermez/zkevm-node/merkletree" - "github.com/0xPolygonHermez/zkevm-node/pool" - "github.com/0xPolygonHermez/zkevm-node/pool/pgpoolstorage" - "github.com/0xPolygonHermez/zkevm-node/sequencer" - "github.com/0xPolygonHermez/zkevm-node/state" - "github.com/0xPolygonHermez/zkevm-node/state/runtime/executor" - "github.com/0xPolygonHermez/zkevm-node/test/dbutils" - "github.com/0xPolygonHermez/zkevm-node/test/testutils" - "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/crypto" - "github.com/jackc/pgx/v4/pgxpool" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -var ( - senderPrivateKey = "0x28b2b0318721be8c8339199172cd7cc8f5e273800a35616ec893083a4b32c02e" - - stateDBCfg = dbutils.NewStateConfigFromEnv() - poolDBCfg = dbutils.NewPoolConfigFromEnv() - - queueCfg = sequencer.PendingTxsQueueConfig{ - TxPendingInQueueCheckingFrequency: cfgTypes.NewDuration(1 * time.Second), - GetPendingTxsFrequency: cfgTypes.NewDuration(1 * time.Second), - } - - genesis = state.Genesis{ - Actions: []*state.GenesisAction{ - { - Address: "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", - Type: int(merkletree.LeafTypeBalance), - Value: "1000000000000000000000", - }, - }, - } - - chainID = big.NewInt(1337) -) - -func TestQueue_AddAndPopTx(t *testing.T) { - initOrResetDB() - - sqlDB, err := db.NewSQLDB(stateDBCfg) - if err != nil { - panic(err) - } - defer sqlDB.Close() //nolint:gosec,errcheck - - st := newState(sqlDB) - - genesisBlock := state.Block{ - BlockNumber: 0, - BlockHash: state.ZeroHash, - ParentHash: state.ZeroHash, - ReceivedAt: time.Now(), - } - ctx := context.Background() - dbTx, err := st.BeginStateTransaction(ctx) - require.NoError(t, err) - _, err = st.SetGenesis(ctx, genesisBlock, genesis, dbTx) - require.NoError(t, err) - require.NoError(t, dbTx.Commit(ctx)) - - s, err := pgpoolstorage.NewPostgresPoolStorage(poolDBCfg) - if err != nil { - panic(err) - } - cfgPool := pool.Config{ - FreeClaimGasLimit: 150000, - } - p := pool.NewPool(cfgPool, s, st, common.Address{}, chainID.Uint64()) - - const txsCount = 10 - - privateKey, err := crypto.HexToECDSA(strings.TrimPrefix(senderPrivateKey, "0x")) - if err != nil { - panic(err) - } - - auth, err := bind.NewKeyedTransactorWithChainID(privateKey, chainID) - if err != nil { - panic(err) - } - - pendQueue := sequencer.NewPendingTxsQueue(queueCfg, p) - go pendQueue.KeepPendingTxsQueue(ctx) - go pendQueue.CleanPendTxsChan(ctx) - // insert pending transactions - for i := 0; i < txsCount; i++ { - tx := types.NewTransaction(uint64(i), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10+int64(i)), []byte{}) - signedTx, err := auth.Signer(auth.From, tx) - if err != nil { - panic(err) - } - if err := p.AddTx(ctx, *signedTx); err != nil { - panic(err) - } - } - tx := pendQueue.PopPendingTx() - assert.Equal(t, uint64(19), tx.GasPrice().Uint64()) - assert.Equal(t, 9, pendQueue.GetPendingTxsQueueLength()) - tx = pendQueue.PopPendingTx() - assert.Equal(t, uint64(18), tx.GasPrice().Uint64()) - assert.Equal(t, 8, pendQueue.GetPendingTxsQueueLength()) - - newTx := types.NewTransaction(uint64(txsCount), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10+int64(txsCount)), []byte{}) - signedTx, err := auth.Signer(auth.From, newTx) - if err != nil { - panic(err) - } - if err := p.AddTx(ctx, *signedTx); err != nil { - panic(err) - } - - time.Sleep(queueCfg.TxPendingInQueueCheckingFrequency.Duration * 2) - assert.Equal(t, 9, pendQueue.GetPendingTxsQueueLength()) -} - -func TestQueue_AddOneTx(t *testing.T) { - initOrResetDB() - - sqlDB, err := db.NewSQLDB(stateDBCfg) - if err != nil { - panic(err) - } - defer sqlDB.Close() //nolint:gosec,errcheck - - st := newState(sqlDB) - - genesisBlock := state.Block{ - BlockNumber: 0, - BlockHash: state.ZeroHash, - ParentHash: state.ZeroHash, - ReceivedAt: time.Now(), - } - ctx := context.Background() - dbTx, err := st.BeginStateTransaction(ctx) - require.NoError(t, err) - _, err = st.SetGenesis(ctx, genesisBlock, genesis, dbTx) - require.NoError(t, err) - require.NoError(t, dbTx.Commit(ctx)) - - s, err := pgpoolstorage.NewPostgresPoolStorage(poolDBCfg) - if err != nil { - panic(err) - } - cfgPool := pool.Config{ - FreeClaimGasLimit: 150000, - } - p := pool.NewPool(cfgPool, s, st, common.Address{}, chainID.Uint64()) - - const txsCount = 1 - - privateKey, err := crypto.HexToECDSA(strings.TrimPrefix(senderPrivateKey, "0x")) - if err != nil { - panic(err) - } - - auth, err := bind.NewKeyedTransactorWithChainID(privateKey, chainID) - if err != nil { - panic(err) - } - - pendQueue := sequencer.NewPendingTxsQueue(queueCfg, p) - go pendQueue.KeepPendingTxsQueue(ctx) - go pendQueue.CleanPendTxsChan(ctx) - // insert pending transactions - for i := 0; i < txsCount; i++ { - tx := types.NewTransaction(uint64(i), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10+int64(i)), []byte{}) - signedTx, err := auth.Signer(auth.From, tx) - if err != nil { - panic(err) - } - if err := p.AddTx(ctx, *signedTx); err != nil { - panic(err) - } - } - tx := pendQueue.PopPendingTx() - assert.Equal(t, uint64(10), tx.GasPrice().Uint64()) - assert.Equal(t, 0, pendQueue.GetPendingTxsQueueLength()) - tx = pendQueue.PopPendingTx() - assert.Nil(t, tx) - - newTx := types.NewTransaction(uint64(txsCount), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10+int64(txsCount)), []byte{}) - signedTx, err := auth.Signer(auth.From, newTx) - if err != nil { - panic(err) - } - if err := p.AddTx(ctx, *signedTx); err != nil { - panic(err) - } - time.Sleep(queueCfg.TxPendingInQueueCheckingFrequency.Duration * 2) - assert.Equal(t, 1, pendQueue.GetPendingTxsQueueLength()) -} - -func newState(sqlDB *pgxpool.Pool) *state.State { - ctx := context.Background() - stateDb := state.NewPostgresStorage(sqlDB) - zkProverURI := testutils.GetEnv("ZKPROVER_URI", "localhost") - - executorServerConfig := executor.Config{URI: fmt.Sprintf("%s:50071", zkProverURI)} - mtDBServerConfig := merkletree.Config{URI: fmt.Sprintf("%s:50061", zkProverURI)} - executorClient, _, _ := executor.NewExecutorClient(ctx, executorServerConfig) - stateDBClient, _, _ := merkletree.NewMTDBServiceClient(ctx, mtDBServerConfig) - stateTree := merkletree.NewStateTree(stateDBClient) - st := state.NewState(state.Config{MaxCumulativeGasUsed: 800000}, stateDb, executorClient, stateTree) - return st -} - -func initOrResetDB() { - if err := dbutils.InitOrResetState(stateDBCfg); err != nil { - panic(err) - } - if err := dbutils.InitOrResetPool(poolDBCfg); err != nil { - panic(err) - } -} diff --git a/sequencer/profitabilitychecker/config.go b/sequencer/profitabilitychecker/config.go deleted file mode 100644 index 24c8d1dec5..0000000000 --- a/sequencer/profitabilitychecker/config.go +++ /dev/null @@ -1,7 +0,0 @@ -package profitabilitychecker - -// Config for profitability checker -type Config struct { - // SendBatchesEvenWhenNotProfitable if true -> send unprofitable batch - SendBatchesEvenWhenNotProfitable bool `mapstructure:"SendBatchesEvenWhenNotProfitable"` -} diff --git a/sequencer/profitabilitychecker/interfaces.go b/sequencer/profitabilitychecker/interfaces.go deleted file mode 100644 index 7ae3fe6042..0000000000 --- a/sequencer/profitabilitychecker/interfaces.go +++ /dev/null @@ -1,19 +0,0 @@ -package profitabilitychecker - -import ( - "context" - "math/big" -) - -// Consumer interfaces required by the package. - -// etherman contains the methods required to interact with ethereum. -type etherman interface { - GetSendSequenceFee(numBatches uint64) (*big.Int, error) -} - -// priceGetter is for getting eth/matic price, used for the base tx profitability checker -type priceGetter interface { - Start(ctx context.Context) - GetEthToMaticPrice(ctx context.Context) (*big.Float, error) -} diff --git a/sequencer/profitabilitychecker/mocks/mock_etherman.go b/sequencer/profitabilitychecker/mocks/mock_etherman.go deleted file mode 100644 index e91fb0f5e2..0000000000 --- a/sequencer/profitabilitychecker/mocks/mock_etherman.go +++ /dev/null @@ -1,52 +0,0 @@ -// Code generated by mockery v2.16.0. DO NOT EDIT. - -package mocks - -import ( - big "math/big" - - mock "github.com/stretchr/testify/mock" -) - -// EthermanMock is an autogenerated mock type for the etherman type -type EthermanMock struct { - mock.Mock -} - -// GetSendSequenceFee provides a mock function with given fields: numBatches -func (_m *EthermanMock) GetSendSequenceFee(numBatches uint64) (*big.Int, error) { - ret := _m.Called(numBatches) - - var r0 *big.Int - if rf, ok := ret.Get(0).(func(uint64) *big.Int); ok { - r0 = rf(numBatches) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*big.Int) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(uint64) error); ok { - r1 = rf(numBatches) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -type mockConstructorTestingTNewEthermanMock interface { - mock.TestingT - Cleanup(func()) -} - -// NewEthermanMock creates a new instance of EthermanMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewEthermanMock(t mockConstructorTestingTNewEthermanMock) *EthermanMock { - mock := &EthermanMock{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/sequencer/profitabilitychecker/profitabilitychecker.go b/sequencer/profitabilitychecker/profitabilitychecker.go deleted file mode 100644 index 611c1cb3c4..0000000000 --- a/sequencer/profitabilitychecker/profitabilitychecker.go +++ /dev/null @@ -1,92 +0,0 @@ -package profitabilitychecker - -import ( - "context" - "math/big" - - "github.com/0xPolygonHermez/zkevm-node/etherman/types" - "github.com/0xPolygonHermez/zkevm-node/pricegetter" - "github.com/0xPolygonHermez/zkevm-node/sequencer/metrics" -) - -// Checker checks profitability to send sequences -type Checker struct { - Config Config - EthMan etherman - PriceGetter pricegetter.Client -} - -// New creates new profitability checker -func New( - cfg Config, - etherMan etherman, - priceGetter priceGetter) *Checker { - return &Checker{ - Config: cfg, - EthMan: etherMan, - PriceGetter: priceGetter, - } -} - -// IsSequenceProfitable check if sequence is profitable by comparing L1 tx gas cost and collateral with fee rewards -func (c *Checker) IsSequenceProfitable(ctx context.Context, sequence types.Sequence) (bool, error) { - if c.Config.SendBatchesEvenWhenNotProfitable { - return true, nil - } - // fee - it's collateral for batch, get from SC in matic - fee, err := c.EthMan.GetSendSequenceFee(1) - if err != nil { - return false, err - } - - // this reward is in ethereum wei - reward := big.NewInt(0) - for _, tx := range sequence.Txs { - reward.Add(reward, new(big.Int).Mul(tx.GasPrice(), new(big.Int).SetUint64(tx.Gas()))) - } - - metrics.SequenceRewardInMatic(float64(reward.Int64())) - - // get price of matic (1 eth = x matic) - price, err := c.PriceGetter.GetEthToMaticPrice(ctx) - if err != nil { - return false, err - } - - // convert reward in eth to reward in matic - priceInt := new(big.Int) - price.Int(priceInt) - reward.Mul(reward, priceInt) - - if reward.Cmp(fee) < 0 { - return false, nil - } - - metrics.EthToMaticPrice(float64(priceInt.Int64())) - - return true, nil -} - -// IsSendSequencesProfitable checks profitability to send sequences to the ethereum -func (c *Checker) IsSendSequencesProfitable(estimatedGas *big.Int, sequences []types.Sequence) bool { - if len(sequences) == 0 { - return false - } - if c.Config.SendBatchesEvenWhenNotProfitable { - return true - } - - gasCostSequences := big.NewInt(0) - for _, seq := range sequences { - for _, tx := range seq.Txs { - gasCostSequences.Add(gasCostSequences, new(big.Int).Mul(tx.GasPrice(), new(big.Int).SetUint64(tx.Gas()))) - if gasCostSequences.Cmp(estimatedGas) > 0 { - return true - } - } - } - - // TODO: consider MATIC fee - - return false -} diff --git a/sequencer/profitabilitychecker/profitabilitychecker_test.go b/sequencer/profitabilitychecker/profitabilitychecker_test.go deleted file mode 100644 index 0c1968fcdd..0000000000 --- a/sequencer/profitabilitychecker/profitabilitychecker_test.go +++ /dev/null @@ -1,115 +0,0 @@ -package profitabilitychecker_test - -import ( - "context" - "math/big" - "testing" - - ethmanTypes "github.com/0xPolygonHermez/zkevm-node/etherman/types" - "github.com/0xPolygonHermez/zkevm-node/pricegetter" - "github.com/0xPolygonHermez/zkevm-node/sequencer/profitabilitychecker" - "github.com/0xPolygonHermez/zkevm-node/sequencer/profitabilitychecker/mocks" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/stretchr/testify/require" -) - -func Test_IsSequenceProfitable(t *testing.T) { - ethman := new(mocks.EthermanMock) - ethman.On("GetSendSequenceFee", uint64(1)).Return(big.NewInt(0), nil) - - pg, err := pricegetter.NewClient(pricegetter.Config{ - Type: "default", - DefaultPrice: pricegetter.TokenPrice{Float: big.NewFloat(2000)}, - }) - require.NoError(t, err) - - pc := profitabilitychecker.New(profitabilitychecker.Config{SendBatchesEvenWhenNotProfitable: false}, ethman, pg) - - tx1 := types.NewTransaction(uint64(0), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - tx2 := types.NewTransaction(uint64(1), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - tx3 := types.NewTransaction(uint64(2), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - - sequence := ethmanTypes.Sequence{ - Txs: []types.Transaction{*tx1, *tx2, *tx3}, - } - ctx := context.Background() - isProfitable, err := pc.IsSequenceProfitable(ctx, sequence) - require.NoError(t, err) - require.True(t, isProfitable) -} - -func Test_IsSequenceProfitableFalse(t *testing.T) { - ethman := new(mocks.EthermanMock) - ethman.On("GetSendSequenceFee", uint64(1)).Return(big.NewInt(10000000), nil) - - pg, err := pricegetter.NewClient(pricegetter.Config{ - Type: "default", - DefaultPrice: pricegetter.TokenPrice{Float: big.NewFloat(2000)}, - }) - require.NoError(t, err) - - pc := profitabilitychecker.New(profitabilitychecker.Config{SendBatchesEvenWhenNotProfitable: false}, ethman, pg) - - tx1 := types.NewTransaction(uint64(0), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - tx2 := types.NewTransaction(uint64(1), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - tx3 := types.NewTransaction(uint64(2), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - - sequence := ethmanTypes.Sequence{ - Txs: []types.Transaction{*tx1, *tx2, *tx3}, - } - ctx := context.Background() - isProfitable, err := pc.IsSequenceProfitable(ctx, sequence) - require.NoError(t, err) - require.False(t, isProfitable) -} - -func Test_IsSendSequencesProfitable(t *testing.T) { - ethman := new(mocks.EthermanMock) - - pg, err := pricegetter.NewClient(pricegetter.Config{ - Type: "default", - DefaultPrice: pricegetter.TokenPrice{Float: big.NewFloat(2000)}, - }) - require.NoError(t, err) - - pc := profitabilitychecker.New(profitabilitychecker.Config{SendBatchesEvenWhenNotProfitable: false}, ethman, pg) - - tx1 := types.NewTransaction(uint64(0), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(1000), []byte{}) - tx2 := types.NewTransaction(uint64(1), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(1000), []byte{}) - tx3 := types.NewTransaction(uint64(2), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(1000), []byte{}) - - sequence := ethmanTypes.Sequence{ - Txs: []types.Transaction{*tx1, *tx2, *tx3}, - } - - estGas := big.NewInt(100) - isProfitable := pc.IsSendSequencesProfitable(estGas, []ethmanTypes.Sequence{sequence}) - - require.True(t, isProfitable) -} - -func Test_IsSendSequencesFalse(t *testing.T) { - ethman := new(mocks.EthermanMock) - - pg, err := pricegetter.NewClient(pricegetter.Config{ - Type: "default", - DefaultPrice: pricegetter.TokenPrice{Float: big.NewFloat(2000)}, - }) - require.NoError(t, err) - - pc := profitabilitychecker.New(profitabilitychecker.Config{SendBatchesEvenWhenNotProfitable: false}, ethman, pg) - - tx1 := types.NewTransaction(uint64(0), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - tx2 := types.NewTransaction(uint64(1), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - tx3 := types.NewTransaction(uint64(2), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - - sequence := ethmanTypes.Sequence{ - Txs: []types.Transaction{*tx1, *tx2, *tx3}, - } - - estGas := big.NewInt(100) - isProfitable := pc.IsSendSequencesProfitable(estGas, []ethmanTypes.Sequence{sequence}) - - require.False(t, isProfitable) -} diff --git a/sequencer/sequencer.go b/sequencer/sequencer.go index ad260892c9..328b3a80c3 100644 --- a/sequencer/sequencer.go +++ b/sequencer/sequencer.go @@ -4,54 +4,95 @@ import ( "context" "errors" "fmt" + "sync" "time" - "github.com/0xPolygonHermez/zkevm-node/etherman/types" "github.com/0xPolygonHermez/zkevm-node/log" "github.com/0xPolygonHermez/zkevm-node/sequencer/metrics" - "github.com/0xPolygonHermez/zkevm-node/sequencer/profitabilitychecker" "github.com/0xPolygonHermez/zkevm-node/state" "github.com/ethereum/go-ethereum/common" - ethTypes "github.com/ethereum/go-ethereum/core/types" ) // Sequencer represents a sequencer type Sequencer struct { cfg Config - pool txPool - state stateInterface + pool txPool + state stateInterface + // dbManager dbManagerInterface ethTxManager ethTxManager etherman etherman - checker *profitabilitychecker.Checker address common.Address +} - sequenceInProgress types.Sequence +// batchConstraints represents the constraints for a batch +type batchConstraints struct { + MaxTxsPerBatch uint64 + MaxBatchBytesSize uint64 + MaxCumulativeGasUsed uint64 + MaxKeccakHashes uint32 + MaxPoseidonHashes uint32 + MaxPoseidonPaddings uint32 + MaxMemAligns uint32 + MaxArithmetics uint32 + MaxBinaries uint32 + MaxSteps uint32 } -// New init sequencer -func New( - cfg Config, - txPool txPool, - state stateInterface, - etherman etherman, - priceGetter priceGetter, - manager ethTxManager) (*Sequencer, error) { - checker := profitabilitychecker.New(cfg.ProfitabilityChecker, etherman, priceGetter) +// TODO: Add tests to config_test.go +type batchResourceWeights struct { + WeightBatchBytesSize int + WeightCumulativeGasUsed int + WeightKeccakHashes int + WeightPoseidonHashes int + WeightPoseidonPaddings int + WeightMemAligns int + WeightArithmetics int + WeightBinaries int + WeightSteps int +} + +// L2ReorgEvent is the event that is triggered when a reorg happens in the L2 +type L2ReorgEvent struct { + TxHashes []common.Hash +} + +// ClosingSignalCh is a struct that contains all the channels that are used to receive batch closing signals +type ClosingSignalCh struct { + ForcedBatchCh chan state.ForcedBatch + GERCh chan common.Hash + L2ReorgCh chan L2ReorgEvent + SendingToL1TimeoutCh chan bool +} + +// TxsStore is a struct that contains the channel and the wait group for the txs to be stored in order +type TxsStore struct { + Ch chan *txToStore + Wg *sync.WaitGroup +} +// txToStore represents a transaction to store. +type txToStore struct { + txResponse *state.ProcessTransactionResponse + batchNumber uint64 + coinbase common.Address + timestamp uint64 + previousL2BlockStateRoot common.Hash +} + +// New init sequencer +func New(cfg Config, txPool txPool, state stateInterface, etherman etherman, manager ethTxManager) (*Sequencer, error) { addr, err := etherman.TrustedSequencer() if err != nil { return nil, fmt.Errorf("failed to get trusted sequencer address, err: %v", err) } - // TODO: check that private key used in etherman matches addr return &Sequencer{ cfg: cfg, pool: txPool, state: state, etherman: etherman, - checker: checker, ethTxManager: manager, address: addr, }, nil @@ -63,39 +104,66 @@ func (s *Sequencer) Start(ctx context.Context) { log.Infof("waiting for synchronizer to sync...") time.Sleep(s.cfg.WaitPeriodPoolIsEmpty.Duration) } - metrics.Register() - // initialize sequence - batchNum, err := s.state.GetLastBatchNumber(ctx, nil) - for err != nil { - if errors.Is(err, state.ErrStateNotSynchronized) { - log.Warnf("state is not synchronized, trying to get last batch num once again...") - time.Sleep(s.cfg.WaitPeriodPoolIsEmpty.Duration) - batchNum, err = s.state.GetLastBatchNumber(ctx, nil) - } else { - log.Fatalf("failed to get last batch number, err: %v", err) - } + + closingSignalCh := ClosingSignalCh{ + ForcedBatchCh: make(chan state.ForcedBatch), + GERCh: make(chan common.Hash), + L2ReorgCh: make(chan L2ReorgEvent), + SendingToL1TimeoutCh: make(chan bool), } - // case A: genesis - if batchNum == 0 { - s.createFirstBatch(ctx) - } else { - err = s.loadSequenceFromState(ctx) - if err != nil { - log.Fatalf("failed to load sequence from the state, err: %v", err) - } + + txsStore := TxsStore{ + Ch: make(chan *txToStore), + Wg: new(sync.WaitGroup), + } + + batchConstraints := batchConstraints{ + MaxTxsPerBatch: s.cfg.MaxTxsPerBatch, + MaxBatchBytesSize: s.cfg.MaxBatchBytesSize, + MaxCumulativeGasUsed: s.cfg.MaxCumulativeGasUsed, + MaxKeccakHashes: s.cfg.MaxKeccakHashes, + MaxPoseidonHashes: s.cfg.MaxPoseidonHashes, + MaxPoseidonPaddings: s.cfg.MaxPoseidonPaddings, + MaxMemAligns: s.cfg.MaxMemAligns, + MaxArithmetics: s.cfg.MaxArithmetics, + MaxBinaries: s.cfg.MaxBinaries, + MaxSteps: s.cfg.MaxSteps, + } + batchResourceWeights := batchResourceWeights{ + WeightBatchBytesSize: s.cfg.WeightBatchBytesSize, + WeightCumulativeGasUsed: s.cfg.WeightCumulativeGasUsed, + WeightKeccakHashes: s.cfg.WeightKeccakHashes, + WeightPoseidonHashes: s.cfg.WeightPoseidonHashes, + WeightPoseidonPaddings: s.cfg.WeightPoseidonPaddings, + WeightMemAligns: s.cfg.WeightMemAligns, + WeightArithmetics: s.cfg.WeightArithmetics, + WeightBinaries: s.cfg.WeightBinaries, + WeightSteps: s.cfg.WeightSteps, + } + + err := s.pool.MarkWIPTxsAsPending(ctx) + if err != nil { + log.Fatalf("failed to mark WIP txs as pending, err: %v", err) } + worker := NewWorker(s.state, batchConstraints, batchResourceWeights) + dbManager := newDBManager(ctx, s.pool, s.state, worker, closingSignalCh, txsStore, batchConstraints) + go dbManager.Start() + + finalizer := newFinalizer(s.cfg.Finalizer, worker, dbManager, s.state, s.address, s.isSynced, closingSignalCh, txsStore, batchConstraints) + currBatch, processingReq := s.bootstrap(ctx, dbManager, finalizer) + go finalizer.Start(ctx, currBatch, processingReq) + + closingSignalsManager := newClosingSignalsManager(ctx, finalizer.dbManager, closingSignalCh, finalizer.cfg) + go closingSignalsManager.Start() + go s.trackOldTxs(ctx) tickerProcessTxs := time.NewTicker(s.cfg.WaitPeriodPoolIsEmpty.Duration) tickerSendSequence := time.NewTicker(s.cfg.WaitPeriodSendSequence.Duration) defer tickerProcessTxs.Stop() defer tickerSendSequence.Stop() - go func() { - for { - s.tryToProcessTx(ctx, tickerProcessTxs) - } - }() + go func() { for { s.tryToSendSequence(ctx, tickerSendSequence) @@ -105,6 +173,61 @@ func (s *Sequencer) Start(ctx context.Context) { <-ctx.Done() } +func (s *Sequencer) bootstrap(ctx context.Context, dbManager *dbManager, finalizer *finalizer) (*WipBatch, *state.ProcessRequest) { + var ( + currBatch *WipBatch + processRequest *state.ProcessRequest + ) + + batchNum, err := dbManager.GetLastBatchNumber(ctx) + for err != nil { + if errors.Is(err, state.ErrStateNotSynchronized) { + log.Warnf("state is not synchronized, trying to get last batch num once again...") + time.Sleep(s.cfg.WaitPeriodPoolIsEmpty.Duration) + batchNum, err = dbManager.GetLastBatchNumber(ctx) + } else { + log.Fatalf("failed to get last batch number, err: %v", err) + } + } + if batchNum == 0 { + /////////////////// + // GENESIS Batch // + /////////////////// + processingCtx := dbManager.CreateFirstBatch(ctx, s.address) + timestamp := uint64(processingCtx.Timestamp.Unix()) + _, oldStateRoot, err := finalizer.getLastBatchNumAndOldStateRoot(ctx) + if err != nil { + log.Fatalf("failed to get old state root, err: %v", err) + } + processRequest = &state.ProcessRequest{ + BatchNumber: processingCtx.BatchNumber, + OldStateRoot: oldStateRoot, + GlobalExitRoot: processingCtx.GlobalExitRoot, + Coinbase: processingCtx.Coinbase, + Timestamp: timestamp, + Caller: state.SequencerCallerLabel, + } + currBatch = &WipBatch{ + globalExitRoot: processingCtx.GlobalExitRoot, + initialStateRoot: oldStateRoot, + stateRoot: oldStateRoot, + batchNumber: processingCtx.BatchNumber, + coinbase: processingCtx.Coinbase, + timestamp: timestamp, + remainingResources: getMaxRemainingResources(finalizer.batchConstraints), + } + } else { + err := finalizer.syncWithState(ctx, &batchNum) + if err != nil { + log.Fatalf("failed to sync with state, err: %v", err) + } + currBatch = finalizer.batch + processRequest = &finalizer.processRequest + } + + return currBatch, processRequest +} + func (s *Sequencer) trackOldTxs(ctx context.Context) { ticker := time.NewTicker(s.cfg.FrequencyToCheckTxsForDelete.Duration) for { @@ -137,7 +260,7 @@ func waitTick(ctx context.Context, ticker *time.Ticker) { func (s *Sequencer) isSynced(ctx context.Context) bool { lastSyncedBatchNum, err := s.state.GetLastVirtualBatchNum(ctx, nil) if err != nil && err != state.ErrNotFound { - log.Errorf("failed to get last synced batch, err: %v", err) + log.Errorf("failed to get last isSynced batch, err: %v", err) return false } lastEthBatchNum, err := s.etherman.GetLatestBatchNumber() @@ -146,118 +269,25 @@ func (s *Sequencer) isSynced(ctx context.Context) bool { return false } if lastSyncedBatchNum < lastEthBatchNum { - log.Infof("waiting for the state to be synced, lastSyncedBatchNum: %d, lastEthBatchNum: %d", lastSyncedBatchNum, lastEthBatchNum) + log.Infof("waiting for the state to be isSynced, lastSyncedBatchNum: %d, lastEthBatchNum: %d", lastSyncedBatchNum, lastEthBatchNum) return false } return true } -func (s *Sequencer) loadSequenceFromState(ctx context.Context) error { - // Check if synchronizer is up to date - for !s.isSynced(ctx) { - log.Info("wait for synchronizer to sync last batch") - time.Sleep(time.Second) - } - // Revert reorged txs to pending - if err := s.pool.MarkReorgedTxsAsPending(ctx); err != nil { - return fmt.Errorf("failed to mark reorged txs as pending, err: %w", err) - } - // Get latest info from the state - lastBatch, err := s.state.GetLastBatch(ctx, nil) - if err != nil { - return fmt.Errorf("failed to get last batch, err: %w", err) - } - isClosed, err := s.state.IsBatchClosed(ctx, lastBatch.BatchNumber, nil) - if err != nil { - return fmt.Errorf("failed to check is batch closed or not, err: %w", err) - } - if isClosed { - dbTx, err := s.state.BeginStateTransaction(ctx) - if err != nil { - return fmt.Errorf("failed to begin state tx to open a batch, err: %w", err) - } - ger, _, err := s.getLatestGer(ctx, dbTx) - if err != nil { - if rollbackErr := dbTx.Rollback(ctx); rollbackErr != nil { - return fmt.Errorf( - "failed to rollback dbTx when getting last GER that gave err: %s. Rollback err: %s", - rollbackErr.Error(), err.Error(), - ) - } - return fmt.Errorf("failed to get latest global exit root, err: %w", err) - } - processingCtx := state.ProcessingContext{ - BatchNumber: lastBatch.BatchNumber + 1, - Coinbase: s.address, - Timestamp: time.Now(), - GlobalExitRoot: ger.GlobalExitRoot, - } - err = s.state.OpenBatch(ctx, processingCtx, dbTx) - if err != nil { - rollErr := dbTx.Rollback(ctx) - if rollErr != nil { - err = fmt.Errorf("failed to open a batch, err: %w. Rollback err: %v", err, rollErr) - } - return err - } - if err = dbTx.Commit(ctx); err != nil { - return fmt.Errorf("failed to commit a state tx to open a batch, err: %w", err) - } - s.sequenceInProgress = types.Sequence{ - GlobalExitRoot: processingCtx.GlobalExitRoot, - Timestamp: processingCtx.Timestamp.Unix(), - BatchNumber: processingCtx.BatchNumber, - } - } else { - txs, err := s.state.GetTransactionsByBatchNumber(ctx, lastBatch.BatchNumber, nil) - if err != nil { - return fmt.Errorf("failed to get tx by batch number, err: %w", err) - } - s.sequenceInProgress = types.Sequence{ - GlobalExitRoot: lastBatch.GlobalExitRoot, - Timestamp: lastBatch.Timestamp.Unix(), - Txs: txs, - BatchNumber: lastBatch.BatchNumber, - } - // TODO: execute to get state root and LER or change open/closed logic so we always store state root and LER and add an open flag - } - - return nil - /* - TODO: deal with ongoing L1 txs - */ -} - -func (s *Sequencer) createFirstBatch(ctx context.Context) { - log.Infof("starting sequencer with genesis batch") - processingCtx := state.ProcessingContext{ - BatchNumber: 1, - Coinbase: s.address, - Timestamp: time.Now(), - GlobalExitRoot: state.ZeroHash, - } - dbTx, err := s.state.BeginStateTransaction(ctx) - if err != nil { - log.Fatalf("failed to begin state transaction for opening a batch, err: %v", err) - } - err = s.state.OpenBatch(ctx, processingCtx, dbTx) - if err != nil { - if rollbackErr := dbTx.Rollback(ctx); rollbackErr != nil { - log.Fatalf( - "failed to rollback dbTx when opening batch that gave err: %v. Rollback err: %v", - rollbackErr, err, - ) - } - log.Fatalf("failed to open a batch, err: %v", err) - } - if err := dbTx.Commit(ctx); err != nil { - log.Fatalf("failed to commit dbTx when opening batch, err: %v", err) - } - s.sequenceInProgress = types.Sequence{ - GlobalExitRoot: processingCtx.GlobalExitRoot, - Timestamp: processingCtx.Timestamp.Unix(), - Txs: []ethTypes.Transaction{}, - BatchNumber: processingCtx.BatchNumber, +func getMaxRemainingResources(constraints batchConstraints) batchResources { + return batchResources{ + zKCounters: state.ZKCounters{ + CumulativeGasUsed: constraints.MaxCumulativeGasUsed, + UsedKeccakHashes: constraints.MaxKeccakHashes, + UsedPoseidonHashes: constraints.MaxPoseidonHashes, + UsedPoseidonPaddings: constraints.MaxPoseidonPaddings, + UsedMemAligns: constraints.MaxMemAligns, + UsedArithmetics: constraints.MaxArithmetics, + UsedBinaries: constraints.MaxBinaries, + UsedSteps: constraints.MaxSteps, + }, + bytes: constraints.MaxBatchBytesSize, } } diff --git a/sequencer/sequencer_internal_test.go b/sequencer/sequencer_internal_test.go deleted file mode 100644 index 63f4f7c8c7..0000000000 --- a/sequencer/sequencer_internal_test.go +++ /dev/null @@ -1,434 +0,0 @@ -package sequencer - -import ( - "context" - "math/big" - "testing" - "time" - - cfgTypes "github.com/0xPolygonHermez/zkevm-node/config/types" - ethManTypes "github.com/0xPolygonHermez/zkevm-node/etherman/types" - "github.com/0xPolygonHermez/zkevm-node/pool" - sequencerMocks "github.com/0xPolygonHermez/zkevm-node/sequencer/mocks" - "github.com/0xPolygonHermez/zkevm-node/state" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/stretchr/testify/require" -) - -func TestIsSynced(t *testing.T) { - st := new(sequencerMocks.StateMock) - eth := new(sequencerMocks.EthermanMock) - s := Sequencer{state: st, etherman: eth} - ctx := context.Background() - st.On("GetLastVirtualBatchNum", ctx, nil).Return(uint64(1), nil) - eth.On("GetLatestBatchNumber").Return(uint64(1), nil) - isSynced := s.isSynced(ctx) - require.Equal(t, true, isSynced) - st.AssertExpectations(t) - eth.AssertExpectations(t) -} - -func TestIsNotSynced(t *testing.T) { - st := new(sequencerMocks.StateMock) - eth := new(sequencerMocks.EthermanMock) - s := Sequencer{state: st, etherman: eth} - ctx := context.Background() - st.On("GetLastVirtualBatchNum", ctx, nil).Return(uint64(1), nil) - eth.On("GetLatestBatchNumber").Return(uint64(2), nil) - isSynced := s.isSynced(ctx) - require.Equal(t, false, isSynced) - st.AssertExpectations(t) - eth.AssertExpectations(t) -} - -func TestShouldCloseSequenceTooBig(t *testing.T) { - s := Sequencer{} - s.sequenceInProgress = ethManTypes.Sequence{IsSequenceTooBig: true} - ctx := context.Background() - shouldClose := s.shouldCloseSequenceInProgress(ctx) - require.False(t, s.sequenceInProgress.IsSequenceTooBig) - require.True(t, shouldClose) -} - -func TestShouldCloseSequenceReachedMaxAmountOfTxs(t *testing.T) { - s := Sequencer{cfg: Config{MaxTxsPerBatch: 150}} - txs := make([]types.Transaction, 0, s.cfg.MaxTxsPerBatch) - for i := uint64(0); i < s.cfg.MaxTxsPerBatch; i++ { - tx := types.NewTransaction(i, common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - txs = append(txs, *tx) - } - s.sequenceInProgress = ethManTypes.Sequence{Txs: txs} - ctx := context.Background() - shouldClose := s.shouldCloseSequenceInProgress(ctx) - require.True(t, shouldClose) -} - -func TestShouldCloseDueToNewDeposits(t *testing.T) { - st := new(sequencerMocks.StateMock) - eth := new(sequencerMocks.EthermanMock) - dbTx := new(sequencerMocks.DbTxMock) - s := Sequencer{cfg: Config{WaitBlocksToUpdateGER: 10, WaitBlocksToConsiderGerFinal: 6}, state: st, etherman: eth} - ctx := context.Background() - mainnetExitRoot := common.HexToHash("0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a53cf2d7d9f1") - lastGer := state.GlobalExitRoot{ - BlockNumber: 1, - MainnetExitRoot: common.HexToHash("0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1"), - RollupExitRoot: common.HexToHash("0x30a885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9a0"), - GlobalExitRoot: common.HexToHash("0x40a885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9a0"), - } - s.sequenceInProgress.GlobalExitRoot = lastGer.GlobalExitRoot - st.On("GetBlockNumAndMainnetExitRootByGER", ctx, s.sequenceInProgress.GlobalExitRoot, nil).Return(lastGer.BlockNumber, mainnetExitRoot, nil) - st.On("GetLatestGlobalExitRoot", ctx, uint64(6), nil).Return(lastGer, time.Now(), nil) - eth.On("GetLatestBlockNumber", ctx).Return(uint64(12), nil) - isShouldCloseDueToNewDeposits, err := s.shouldCloseDueToNewDeposits(ctx) - require.NoError(t, err) - require.Equal(t, true, isShouldCloseDueToNewDeposits) - st.AssertExpectations(t) - eth.AssertExpectations(t) - dbTx.AssertExpectations(t) -} - -func TestShouldCloseTooLongSinceLastVirtualized(t *testing.T) { - st := new(sequencerMocks.StateMock) - s := Sequencer{cfg: Config{MaxTimeForBatchToBeOpen: cfgTypes.NewDuration(1 * time.Second)}, state: st} - tx := types.NewTransaction(uint64(0), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - s.sequenceInProgress.Txs = []types.Transaction{*tx} - s.sequenceInProgress.Timestamp = time.Now().Add(-s.cfg.MaxTimeForBatchToBeOpen.Duration).Unix() - ctx := context.Background() - lastBatchNumber := uint64(10) - st.On("GetLastBatchNumber", ctx, nil).Return(lastBatchNumber, nil) - st.On("IsBatchVirtualized", ctx, lastBatchNumber-1, nil).Return(true, nil) - isShouldCloseTooLongSinceLastVirtualized, err := s.shouldCloseTooLongSinceLastVirtualized(ctx) - require.NoError(t, err) - require.True(t, isShouldCloseTooLongSinceLastVirtualized) - st.AssertExpectations(t) -} - -func TestCleanTxsIfTxsDataIsBiggerThanExpected(t *testing.T) { - s := &Sequencer{cfg: Config{MaxTxsPerBatch: 150, MaxBatchBytesSize: 30000}} - tx := types.NewTransaction(uint64(0), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - for i := 0; i < 300; i++ { - s.sequenceInProgress.Txs = append(s.sequenceInProgress.Txs, *tx) - } - ctx := context.Background() - ticker := time.NewTicker(1 * time.Second) - err := s.cleanTxsIfTxsDataIsBiggerThanExpected(ctx, ticker) - require.NoError(t, err) - require.True(t, s.sequenceInProgress.IsSequenceTooBig) - // 1 transfer equals ~103 bytes, so 291 txs ~= 30000 bytes, what is maximum - require.Equal(t, 291, len(s.sequenceInProgress.Txs)) -} - -func TestCleanTxsIfTxsDataIsBiggerThanExpectedTxIsTooBig(t *testing.T) { - pl := new(sequencerMocks.PoolMock) - s := &Sequencer{pool: pl} - tx := types.NewTransaction(uint64(0), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - txs := []types.Transaction{} - for i := 0; i < 300; i++ { - txs = append(txs, *tx) - } - data, err := state.EncodeTransactions(txs) - tx1 := types.NewTransaction(uint64(0), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), data) - s.sequenceInProgress.Txs = []types.Transaction{*tx1} - require.NoError(t, err) - ctx := context.Background() - ticker := time.NewTicker(1 * time.Second) - pl.On("UpdateTxStatus", ctx, s.sequenceInProgress.Txs[0].Hash(), pool.TxStatusInvalid).Return(nil) - err = s.cleanTxsIfTxsDataIsBiggerThanExpected(ctx, ticker) - require.NoError(t, err) - require.False(t, s.sequenceInProgress.IsSequenceTooBig) - // 1 transfer equals ~103 bytes, so 291 txs ~= 30000 bytes, what is maximum - require.Equal(t, 0, len(s.sequenceInProgress.Txs)) - pl.AssertExpectations(t) -} - -func TestAppendPendingTxs(t *testing.T) { - pl := new(sequencerMocks.PoolMock) - ctx := context.Background() - s := &Sequencer{pool: pl} - minGasPrice := big.NewInt(1) - ticker := time.NewTicker(1 * time.Second) - - poolTx := types.NewTransaction(uint64(1), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - var poolTxs []*pool.Transaction - poolTxs = append(poolTxs, &pool.Transaction{Transaction: *poolTx}) - - pl.On("GetTxs", ctx, pool.TxStatusPending, false, minGasPrice.Uint64(), uint64(150)).Return(poolTxs, nil) - pendTxsAmount := s.appendPendingTxs(ctx, false, minGasPrice.Uint64(), 150, ticker) - require.Equal(t, uint64(1), pendTxsAmount) - require.Equal(t, 1, len(s.sequenceInProgress.Txs)) - pl.AssertExpectations(t) -} - -func TestAppendPendingTxsFailedCounter(t *testing.T) { - pl := new(sequencerMocks.PoolMock) - ctx := context.Background() - s := &Sequencer{cfg: Config{MaxAllowedFailedCounter: 5}, pool: pl} - minGasPrice := big.NewInt(1) - ticker := time.NewTicker(1 * time.Second) - - poolTx := types.NewTransaction(uint64(1), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - var poolTxs []*pool.Transaction - poolTxs = append(poolTxs, &pool.Transaction{Transaction: *poolTx, FailedCounter: 55}) - - pl.On("GetTxs", ctx, pool.TxStatusPending, false, minGasPrice.Uint64(), uint64(150)).Return(poolTxs, nil) - pl.On("UpdateTxsStatus", ctx, []string{poolTxs[0].Hash().String()}, pool.TxStatusInvalid).Return(nil) - pendTxsAmount := s.appendPendingTxs(ctx, false, minGasPrice.Uint64(), 150, ticker) - require.Equal(t, uint64(0), pendTxsAmount) - require.Equal(t, 0, len(s.sequenceInProgress.Txs)) - pl.AssertExpectations(t) -} - -func TestProcessBatch(t *testing.T) { - st := new(sequencerMocks.StateMock) - s := &Sequencer{state: st} - dbTx := new(sequencerMocks.DbTxMock) - ctx := context.Background() - st.On("BeginStateTransaction", ctx).Return(dbTx, nil) - dbTx.On("Commit", ctx).Return(nil) - lastBatchNumber := uint64(10) - tx1 := *types.NewTransaction(0, common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - tx2 := *types.NewTransaction(1, common.HexToAddress("1"), big.NewInt(1), 0, big.NewInt(1), []byte("bbb")) - - s.sequenceInProgress.Txs = []types.Transaction{tx1, tx2} - - txsBatch1 := []*state.ProcessTransactionResponse{ - { - TxHash: tx1.Hash(), - Tx: tx1, - IsProcessed: true, - }, - { - TxHash: tx2.Hash(), - Tx: tx2, - IsProcessed: true, - }, - } - - processBatchResponse := &state.ProcessBatchResponse{ - UsedZkCounters: state.ZKCounters{CumulativeGasUsed: 100000}, - IsBatchProcessed: true, - Responses: txsBatch1, - NewStateRoot: common.HexToHash("0x123"), - NewLocalExitRoot: common.HexToHash("0x123"), - } - st.On("GetLastBatchNumber", ctx, dbTx).Return(lastBatchNumber, nil) - st.On("ProcessSequencerBatch", ctx, lastBatchNumber, s.sequenceInProgress.Txs, dbTx, state.SequencerCallerLabel).Return(processBatchResponse, nil) - procResponse, err := s.processTxs(ctx) - require.NoError(t, err) - require.True(t, procResponse.isBatchProcessed) - require.Equal(t, 2, len(procResponse.processedTxs)) - st.AssertExpectations(t) -} - -func TestReprocessBatch(t *testing.T) { - st := new(sequencerMocks.StateMock) - s := &Sequencer{state: st} - dbTx := new(sequencerMocks.DbTxMock) - ctx := context.Background() - st.On("BeginStateTransaction", ctx).Return(dbTx, nil) - dbTx.On("Commit", ctx).Return(nil) - tx1 := *types.NewTransaction(0, common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - tx2 := *types.NewTransaction(1, common.HexToAddress("1"), big.NewInt(1), 0, big.NewInt(1), []byte("bbb")) - txs := []types.Transaction{tx1, tx2} - s.sequenceInProgress.Txs = txs - - txsBatch1 := []*state.ProcessTransactionResponse{ - { - TxHash: txs[0].Hash(), - Tx: txs[0], - IsProcessed: true, - }, - { - TxHash: txs[1].Hash(), - Tx: txs[1], - IsProcessed: true, - }, - } - - processBatchResponse := &state.ProcessBatchResponse{ - UsedZkCounters: state.ZKCounters{CumulativeGasUsed: 100000}, - IsBatchProcessed: true, - Responses: txsBatch1, - NewStateRoot: common.HexToHash("0x123"), - NewLocalExitRoot: common.HexToHash("0x123"), - } - - processedTxs, processedTxsHashes, unprocessedTxs, unprocessedTxsHashes := state.DetermineProcessedTransactions(processBatchResponse.Responses) - - txsResponse := processTxResponse{ - processedTxs: processedTxs, - processedTxsHashes: processedTxsHashes, - unprocessedTxs: unprocessedTxs, - unprocessedTxsHashes: unprocessedTxsHashes, - isBatchProcessed: false, - } - txsResponseToReturn := txsResponse - txsResponseToReturn.isBatchProcessed = true - lastBatchNumber := uint64(10) - st.On("GetLastBatchNumber", ctx, dbTx).Return(lastBatchNumber, nil) - st.On("ProcessSequencerBatch", ctx, lastBatchNumber, txs, dbTx, state.SequencerCallerLabel).Return(processBatchResponse, nil) - - unprocessedTxsAfterReprocess, err := s.reprocessBatch(ctx, txsResponse, ethManTypes.Sequence{}) - require.NoError(t, err) - require.Equal(t, 0, len(unprocessedTxsAfterReprocess)) - require.Equal(t, 2, len(s.sequenceInProgress.Txs)) - st.AssertExpectations(t) -} - -func TestUpdateTxsInPool(t *testing.T) { - st := new(sequencerMocks.StateMock) - pl := new(sequencerMocks.PoolMock) - s := &Sequencer{state: st, pool: pl} - ctx := context.Background() - ticker := time.NewTicker(1 * time.Second) - - tx1 := *types.NewTransaction(0, common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - tx2 := *types.NewTransaction(1, common.HexToAddress("0x1"), big.NewInt(1), 0, big.NewInt(1), []byte("bbb")) - tx3 := *types.NewTransaction(3, common.HexToAddress("0x2"), big.NewInt(1), 0, big.NewInt(1), []byte("ddd")) - - txs := []types.Transaction{tx1, tx2, tx3} - s.sequenceInProgress.Txs = txs - - txsBatch1 := []*state.ProcessTransactionResponse{ - { - TxHash: txs[0].Hash(), - Tx: txs[0], - IsProcessed: true, - }, - { - TxHash: txs[1].Hash(), - Tx: txs[1], - IsProcessed: true, - }, - { - TxHash: txs[2].Hash(), - Tx: txs[2], - IsProcessed: false, - }, - } - - processBatchResponse := &state.ProcessBatchResponse{ - UsedZkCounters: state.ZKCounters{CumulativeGasUsed: 100000}, - IsBatchProcessed: true, - Responses: txsBatch1, - NewStateRoot: common.HexToHash("0x123"), - NewLocalExitRoot: common.HexToHash("0x123"), - } - - processedTxs, processedTxsHashes, unprocessedTxs, unprocessedTxsHashes := state.DetermineProcessedTransactions(processBatchResponse.Responses) - - txsResponse := processTxResponse{ - processedTxs: processedTxs, - processedTxsHashes: processedTxsHashes, - unprocessedTxs: unprocessedTxs, - unprocessedTxsHashes: unprocessedTxsHashes, - isBatchProcessed: false, - } - - pl.On("UpdateTxsStatus", ctx, processedTxsHashes, pool.TxStatusSelected).Return(nil) - - fromAddress := common.HexToAddress("0x123") - pl.On("GetTxFromAddressFromByHash", ctx, txs[2].Hash()).Return(fromAddress, txs[2].Nonce(), nil) - l2BlockNumber := uint64(3) - st.On("GetLastL2BlockNumber", ctx, nil).Return(l2BlockNumber, nil) - accNonce := uint64(2) - st.On("GetNonce", ctx, fromAddress, l2BlockNumber, nil).Return(accNonce, nil) - pl.On("UpdateTxsStatus", ctx, unprocessedTxsHashes, pool.TxStatusFailed).Return(nil) - pl.On("IncrementFailedCounter", ctx, unprocessedTxsHashes).Return(nil) - s.updateTxsInPool(ctx, ticker, txsResponse, unprocessedTxs) - st.AssertExpectations(t) - pl.AssertExpectations(t) -} - -func TestTryToProcessTxs(t *testing.T) { - st := new(sequencerMocks.StateMock) - eth := new(sequencerMocks.EthermanMock) - dbTx := new(sequencerMocks.DbTxMock) - pl := new(sequencerMocks.PoolMock) - - s := Sequencer{cfg: Config{ - MaxTimeForBatchToBeOpen: cfgTypes.NewDuration(5 * time.Second), - MaxBatchBytesSize: 150000, - MaxTxsPerBatch: 150, - }, state: st, etherman: eth, pool: pl} - ctx := context.Background() - // Check if synchronizer is up to date - st.On("GetLastVirtualBatchNum", ctx, nil).Return(uint64(1), nil) - eth.On("GetLatestBatchNumber").Return(uint64(1), nil) - - isSynced := s.isSynced(ctx) - require.Equal(t, true, isSynced) - - mainnetExitRoot := common.HexToHash("0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a53cf2d7d9f1") - lastGer := state.GlobalExitRoot{ - BlockNumber: 1, - MainnetExitRoot: common.HexToHash("0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a53cf2d7d9f1"), - RollupExitRoot: common.HexToHash("0x30a885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9a0"), - GlobalExitRoot: common.HexToHash("0x40a885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9a0"), - } - s.sequenceInProgress.GlobalExitRoot = lastGer.GlobalExitRoot - eth.On("GetLatestBlockNumber", ctx).Return(uint64(1), nil) - st.On("GetBlockNumAndMainnetExitRootByGER", ctx, s.sequenceInProgress.GlobalExitRoot, nil).Return(lastGer.BlockNumber, mainnetExitRoot, nil) - st.On("GetLatestGlobalExitRoot", ctx, uint64(1), nil).Return(lastGer, time.Now(), nil) - st.On("BeginStateTransaction", ctx).Return(dbTx, nil) - dbTx.On("Commit", ctx).Return(nil) - - tx := types.NewTransaction(uint64(0), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - s.sequenceInProgress.Txs = []types.Transaction{*tx} - s.sequenceInProgress.Timestamp = time.Now().Unix() - - lastBatchNumber := uint64(10) - st.On("GetLastBatchNumber", ctx, nil).Return(lastBatchNumber, nil) - st.On("GetLastBatchNumber", ctx, dbTx).Return(lastBatchNumber, nil) - - st.On("IsBatchVirtualized", ctx, lastBatchNumber-1, nil).Return(true, nil) - - minGasPrice := uint64(1) - pl.On("GetGasPrice", ctx).Return(minGasPrice, nil) - - ticker := time.NewTicker(1 * time.Second) - poolTx := types.NewTransaction(uint64(1), common.Address{}, big.NewInt(10), uint64(1), big.NewInt(10), []byte{}) - var poolTxs []*pool.Transaction - poolTxs = append(poolTxs, &pool.Transaction{Transaction: *poolTx}) - pl.On("GetTxs", ctx, pool.TxStatusPending, true, uint64(0), uint64(149)).Return([]*pool.Transaction{}, nil) - pl.On("GetTxs", ctx, pool.TxStatusFailed, true, uint64(0), uint64(149)).Return([]*pool.Transaction{}, nil) - - pl.On("GetTxs", ctx, pool.TxStatusPending, false, minGasPrice, uint64(149)).Return(poolTxs, nil) - - txsBatch1 := []*state.ProcessTransactionResponse{ - { - TxHash: s.sequenceInProgress.Txs[0].Hash(), - Tx: s.sequenceInProgress.Txs[0], - IsProcessed: true, - }, - { - TxHash: poolTxs[0].Transaction.Hash(), - Tx: poolTxs[0].Transaction, - IsProcessed: true, - }, - } - - processBatchResponse := &state.ProcessBatchResponse{ - UsedZkCounters: state.ZKCounters{CumulativeGasUsed: 100000}, - IsBatchProcessed: true, - Responses: txsBatch1, - NewStateRoot: common.HexToHash("0x123"), - NewLocalExitRoot: common.HexToHash("0x123"), - } - var txs = s.sequenceInProgress.Txs - txs = append(txs, poolTxs[0].Transaction) - st.On("ProcessSequencerBatch", ctx, lastBatchNumber, txs, dbTx, state.SequencerCallerLabel).Return(processBatchResponse, nil) - - processedTxs, processedTxsHashes, _, _ := state.DetermineProcessedTransactions(processBatchResponse.Responses) - - st.On("StoreTransactions", ctx, lastBatchNumber, processedTxs, dbTx).Return(nil) - pl.On("UpdateTxsStatus", ctx, processedTxsHashes, pool.TxStatusSelected).Return(nil) - - s.tryToProcessTx(ctx, ticker) - - st.AssertExpectations(t) - pl.AssertExpectations(t) - eth.AssertExpectations(t) -} diff --git a/sequencer/sequencer_test.go b/sequencer/sequencer_test.go deleted file mode 100644 index 0e199ab093..0000000000 --- a/sequencer/sequencer_test.go +++ /dev/null @@ -1,265 +0,0 @@ -package sequencer - -// import ( -// "context" -// "fmt" -// "io/ioutil" -// "math/big" -// "testing" -// "time" - -// "github.com/0xPolygonHermez/zkevm-node/config/types" -// "github.com/0xPolygonHermez/zkevm-node/db" -// ethman "github.com/0xPolygonHermez/zkevm-node/etherman" -// "github.com/0xPolygonHermez/zkevm-node/ethtxmanager" -// "github.com/0xPolygonHermez/zkevm-node/gasprice" -// "github.com/0xPolygonHermez/zkevm-node/merkletree" -// "github.com/0xPolygonHermez/zkevm-node/pool" -// "github.com/0xPolygonHermez/zkevm-node/pool/pgpoolstorage" -// "github.com/0xPolygonHermez/zkevm-node/pricegetter" -// "github.com/0xPolygonHermez/zkevm-node/sequencer/profitabilitychecker" -// st "github.com/0xPolygonHermez/zkevm-node/state" -// "github.com/0xPolygonHermez/zkevm-node/state/runtime/executor" -// "github.com/0xPolygonHermez/zkevm-node/test/dbutils" -// "github.com/0xPolygonHermez/zkevm-node/test/testutils" -// "github.com/ethereum/go-ethereum/accounts/abi/bind" -// "github.com/ethereum/go-ethereum/accounts/keystore" -// "github.com/ethereum/go-ethereum/common" -// "github.com/stretchr/testify/require" -// ) - -// func TestSequenceTooBig(t *testing.T) { -// // before running: -// // make run-db -// // make run-network -// // make run-zkprover - -// const ( -// CONFIG_MAX_GAS_PER_SEQUENCE = 135000 -// CONFIG_CHAIN_ID = 1337 -// CONFIG_ETH_URL = "http://localhost:8545" - -// CONFIG_NAME_POE = "poe" -// CONFIG_NAME_MATIC = "matic" -// CONFIG_NAME_GER = "ger" -// ) - -// var ( -// CONFIG_ADDRESSES = map[string]common.Address{ -// CONFIG_NAME_POE: common.HexToAddress("0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6"), // <= PoE -// CONFIG_NAME_MATIC: common.HexToAddress("0x5FbDB2315678afecb367f032d93F642f64180aa3"), // <= Matic -// CONFIG_NAME_GER: common.HexToAddress("0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9"), // <= GER -// } -// CONFIG_DB_STATE = db.Config{ -// User: "state_user", -// Password: "state_password", -// Name: "state_db", -// Host: "localhost", -// Port: "5432", -// EnableLog: false, -// MaxConns: 200, -// } -// CONFIG_DB_POOL = db.Config{ -// User: "pool_user", -// Password: "pool_password", -// Name: "pool_db", -// Host: "localhost", -// Port: "5433", -// EnableLog: false, -// MaxConns: 200, -// } -// CONFIG_EXECUTOR_URL = fmt.Sprintf("%s:50071", testutils.GetEnv("ZKPROVER_URI", "localhost")) -// ) -// type TestCase struct { -// Input []int // slice of batch sizes -// Output int // split into N sequences - -// } - -// var testcases = []TestCase{ -// { -// Input: []int{ -// 1000, -// 500, -// }, -// Output: 2, // two sequences (of 1 batch each) fit inside -// }, - -// { -// Input: []int{ -// 1, -// }, -// Output: 1, // only one sequence fits -// }, -// { -// Input: []int{ -// 100000000, -// 1000000, -// 1000, -// 100, -// 1, -// }, -// Output: 3, // only three sequences fit inside -// }, -// { -// Input: []int{ -// 1, 1, 1, 1, -// }, -// Output: 3, // only three sequences fit inside -// }, -// } -// ctx := context.Background() - -// keystoreEncrypted, err := ioutil.ReadFile(CONFIG_ENCRYPTION_KEY_FILE_PATH) -// require.NoError(t, err) -// key, err := keystore.DecryptKey(keystoreEncrypted, CONFIG_ENCRYPTION_KEY_PASSWORD) -// require.NoError(t, err) - -// auth, err := bind.NewKeyedTransactorWithChainID(key.PrivateKey, big.NewInt(CONFIG_CHAIN_ID)) -// require.NoError(t, err) -// // eth_man, _, _, _, err := ethman.NewSimulatedEtherman(ethman.Config{}, auth) -// eth_man, err := ethman.NewClient(ethman.Config{ -// URL: CONFIG_ETH_URL, -// L1ChainID: CONFIG_CHAIN_ID, -// PoEAddr: CONFIG_ADDRESSES[CONFIG_NAME_POE], -// MaticAddr: CONFIG_ADDRESSES[CONFIG_NAME_MATIC], -// GlobalExitRootManagerAddr: CONFIG_ADDRESSES[CONFIG_NAME_GER], -// }, auth) - -// require.NoError(t, err) - -// const decimals = 1000000000000000000 -// amount := big.NewFloat(10000000000000000) -// amountInWei := new(big.Float).Mul(amount, big.NewFloat(decimals)) -// amountB := new(big.Int) -// amountInWei.Int(amountB) - -// _, err = eth_man.ApproveMatic(ctx, amountB, CONFIG_ADDRESSES[CONFIG_NAME_POE]) -// require.NoError(t, err) - -// pg, err := pricegetter.NewClient(pricegetter.Config{ -// Type: "default", -// }) -// require.NoError(t, err) - -// err = dbutils.InitOrResetState(CONFIG_DB_STATE) -// require.NoError(t, err) - -// err = dbutils.InitOrResetPool(CONFIG_DB_POOL) -// require.NoError(t, err) - -// poolDb, err := pgpoolstorage.NewPostgresPoolStorage(CONFIG_DB_POOL) -// require.NoError(t, err) - -// sqlStateDB, err := db.NewSQLDB(CONFIG_DB_STATE) -// require.NoError(t, err) - -// stateDb := st.NewPostgresStorage(sqlStateDB) -// executorClient, _, _ := executor.NewExecutorClient(ctx, executor.Config{ -// URI: CONFIG_EXECUTOR_URL, -// }) -// stateDBClient, _, _ := merkletree.NewMTDBServiceClient(ctx, merkletree.Config{ -// URI: CONFIG_EXECUTOR_URL, -// }) -// stateTree := merkletree.NewStateTree(stateDBClient) - -// stateCfg := st.Config{ -// MaxCumulativeGasUsed: 30000000, -// ChainID: CONFIG_CHAIN_ID, -// } - -// state := st.NewState(stateCfg, stateDb, executorClient, stateTree) - -// pool := pool.NewPool(poolDb, state, CONFIG_ADDRESSES[CONFIG_NAME_GER], big.NewInt(CONFIG_CHAIN_ID).Uint64()) -// ethtxmanager := ethtxmanager.New(ethtxmanager.Config{}, eth_man, state) -// gpe := gasprice.NewDefaultEstimator(gasprice.Config{ -// Type: gasprice.DefaultType, -// DefaultGasPriceWei: 1000000000, -// }, pool) -// seq, err := New(Config{ -// MaxSequenceSize: MaxSequenceSize{Int: big.NewInt(CONFIG_MAX_GAS_PER_SEQUENCE)}, -// LastBatchVirtualizationTimeMaxWaitPeriod: types.NewDuration(1 * time.Second), -// ProfitabilityChecker: profitabilitychecker.Config{ -// SendBatchesEvenWhenNotProfitable: true, -// }, -// }, pool, state, eth_man, pg, ethtxmanager, gpe) -// require.NoError(t, err) - -// // generate fake data - -// mainnetExitRoot := common.HexToHash("caffe") -// rollupExitRoot := common.HexToHash("bead") - -// if _, err := stateDb.Exec(ctx, "DELETE FROM state.block"); err != nil { -// t.Fail() -// } -// if _, err := stateDb.Exec(ctx, "DELETE FROM state.batch"); err != nil { -// t.Fail() -// } -// if _, err := stateDb.Exec(ctx, "DELETE FROM state.exit_root"); err != nil { -// t.Fail() -// } - -// const sqlAddBlock = "INSERT INTO state.block (block_num, received_at, block_hash) VALUES ($1, $2, $3)" -// _, err = stateDb.Exec(ctx, sqlAddBlock, 1, time.Now(), "") -// require.NoError(t, err) - -// _, err = stateDb.Exec(ctx, sqlAddBlock, 2, time.Now(), "") // for use in lastVirtualized time -// require.NoError(t, err) - -// const sqlAddExitRoots = "INSERT INTO state.exit_root (block_num, global_exit_root, mainnet_exit_root, rollup_exit_root) VALUES ($1, $2, $3, $4)" -// _, err = stateDb.Exec(ctx, sqlAddExitRoots, 1, common.Address{}, mainnetExitRoot, rollupExitRoot) -// require.NoError(t, err) - -// for _, testCase := range testcases { -// innerDbTx, err := state.BeginStateTransaction(ctx) -// require.NoError(t, err) -// err = dbutils.InitOrResetState(CONFIG_DB_STATE) -// require.NoError(t, err) - -// err = dbutils.InitOrResetPool(CONFIG_DB_POOL) -// require.NoError(t, err) - -// if _, err := stateDb.Exec(ctx, "DELETE FROM state.block"); err != nil { -// t.Fail() -// } -// if _, err := stateDb.Exec(ctx, "DELETE FROM state.batch"); err != nil { -// t.Fail() -// } - -// for i := 0; i < len(testCase.Input); i++ { -// fmt.Printf("\niteration: [%d]: %d\n", testCase.Output, testCase.Input[i]) - -// payload := make([]byte, testCase.Input[i]) // 10mb - -// _, err = stateDb.Exec(ctx, "INSERT INTO state.batch (batch_num, global_exit_root, local_exit_root, state_root, timestamp, coinbase, raw_txs_data) VALUES ($1, $2, $3, $4, $5, $6, $7)", -// i+1, -// common.Address{}.String(), -// common.Hash{}.String(), -// common.Hash{}.String(), -// time.Unix(9, 0).UTC(), -// common.HexToAddress("").String(), -// payload, -// ) -// require.NoError(t, err) -// } - -// //needed for completion: wip batch - -// _, err = stateDb.Exec(ctx, "INSERT INTO state.batch (batch_num) VALUES ($1)", -// len(testCase.Input)+1, -// ) - -// require.NoError(t, err) - -// // make L2 equivalences - -// err = innerDbTx.Commit(ctx) -// require.NoError(t, err) - -// sequences, err := seq.getSequencesToSend(ctx) -// require.NoError(t, err) - -// require.Equal(t, testCase.Output, len(sequences)) -// } -// } diff --git a/sequencer/sequencesender.go b/sequencer/sequencesender.go index 0355e3f469..b7e6d8366e 100644 --- a/sequencer/sequencesender.go +++ b/sequencer/sequencesender.go @@ -68,7 +68,7 @@ func (s *Sequencer) tryToSendSequence(ctx context.Context, ticker *time.Ticker) metrics.SequencesSentToL1(float64(sequenceCount)) // add sequence to be monitored - sender := common.HexToAddress(s.cfg.SenderAddress) + sender := common.HexToAddress(s.cfg.Finalizer.SenderAddress) to, data, err := s.etherman.BuildSequenceBatchesTxData(sender, sequences) if err != nil { log.Error("error estimating new sequenceBatches to add to eth tx manager: ", err) @@ -95,7 +95,7 @@ func (s *Sequencer) getSequencesToSend(ctx context.Context) ([]types.Sequence, e currentBatchNumToSequence := lastVirtualBatchNum + 1 sequences := []types.Sequence{} - var estimatedGas uint64 + // var estimatedGas uint64 var tx *ethTypes.Transaction @@ -128,12 +128,12 @@ func (s *Sequencer) getSequencesToSend(ctx context.Context) ([]types.Sequence, e }) // Check if can be send - sender := common.HexToAddress(s.cfg.SenderAddress) + sender := common.HexToAddress(s.cfg.Finalizer.SenderAddress) tx, err = s.etherman.EstimateGasSequenceBatches(sender, sequences) if err == nil && new(big.Int).SetUint64(tx.Gas()).Cmp(s.cfg.MaxSequenceSize.Int) >= 1 { metrics.SequencesOvesizedDataError() - log.Infof("oversized Data on TX hash %s (%d > %d)", tx.Hash(), tx.Gas(), s.cfg.MaxSequenceSize) + log.Infof("oversized Data on TX oldHash %s (%d > %d)", tx.Hash(), tx.Gas(), s.cfg.MaxSequenceSize) err = core.ErrOversizedData } @@ -146,7 +146,7 @@ func (s *Sequencer) getSequencesToSend(ctx context.Context) ([]types.Sequence, e } return sequences, err } - estimatedGas = tx.Gas() + // estimatedGas = tx.Gas() // Increase batch num for next iteration currentBatchNumToSequence++ @@ -164,11 +164,11 @@ func (s *Sequencer) getSequencesToSend(ctx context.Context) ([]types.Sequence, e return sequences, nil } if lastBatchVirtualizationTime.Before(time.Now().Add(-s.cfg.LastBatchVirtualizationTimeMaxWaitPeriod.Duration)) { - // check profitability - if s.checker.IsSendSequencesProfitable(new(big.Int).SetUint64(estimatedGas), sequences) { - log.Info("sequence should be sent to L1, because too long since didn't send anything to L1") - return sequences, nil - } + // TODO: implement check profitability + // if s.checker.IsSendSequencesProfitable(new(big.Int).SetUint64(estimatedGas), sequences) { + log.Info("sequence should be sent to L1, because too long since didn't send anything to L1") + return sequences, nil + //} } log.Info("not enough time has passed since last batch was virtualized, and the sequence could be bigger") diff --git a/sequencer/txtracker.go b/sequencer/txtracker.go new file mode 100644 index 0000000000..c799618801 --- /dev/null +++ b/sequencer/txtracker.go @@ -0,0 +1,98 @@ +package sequencer + +import ( + "math/big" + + "github.com/0xPolygonHermez/zkevm-node/log" + "github.com/0xPolygonHermez/zkevm-node/state" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +// TxTracker is a struct that contains all the tx data needed to be managed by the worker +type TxTracker struct { + Hash common.Hash + HashStr string + From common.Address + FromStr string + Nonce uint64 + Gas uint64 // To check if it fits into a batch + GasPrice *big.Int + Cost *big.Int // Cost = Amount + Benefit + Benefit *big.Int // GasLimit * GasPrice + IsClaim bool // Needed to calculate efficiency + BatchResources batchResources // To check if it fits into a batch + Efficiency float64 + RawTx []byte +} + +// newTxTracker creates and inti a TxTracker +func newTxTracker(tx types.Transaction, isClaim bool, counters state.ZKCounters, constraints batchConstraints, weights batchResourceWeights) (*TxTracker, error) { + addr, err := state.GetSender(tx) + if err != nil { + return nil, err + } + + //TODO: Review the initialization is correct + txTracker := &TxTracker{ + Hash: tx.Hash(), + From: addr, + Nonce: tx.Nonce(), + Gas: tx.Gas(), + GasPrice: tx.GasPrice(), + Cost: tx.Cost(), + } + + txTracker.IsClaim = isClaim + txTracker.BatchResources.zKCounters = counters + txTracker.BatchResources.bytes = uint64(tx.Size()) + txTracker.HashStr = txTracker.Hash.String() + txTracker.FromStr = txTracker.From.String() + txTracker.Benefit = new(big.Int).Mul(new(big.Int).SetUint64(txTracker.Gas), txTracker.GasPrice) + txTracker.calculateEfficiency(constraints, weights) + txTracker.RawTx, err = state.EncodeTransactions([]types.Transaction{tx}) + if err != nil { + return nil, err + } + + return txTracker, nil +} + +// updateZKCounters updates the counters of the tx and recalculates the tx efficiency +func (tx *TxTracker) updateZKCounters(counters state.ZKCounters, constraints batchConstraints, weights batchResourceWeights) { + tx.BatchResources.zKCounters = counters + tx.calculateEfficiency(constraints, weights) +} + +// calculateEfficiency calculates the tx efficiency +func (tx *TxTracker) calculateEfficiency(constraints batchConstraints, weights batchResourceWeights) { + const perThousand = 1000 // TODO: Add this as config parameter + + totalWeight := float64(weights.WeightArithmetics + weights.WeightBatchBytesSize + weights.WeightBinaries + weights.WeightCumulativeGasUsed + + weights.WeightKeccakHashes + weights.WeightMemAligns + weights.WeightPoseidonHashes + weights.WeightPoseidonPaddings + weights.WeightSteps) + + // TODO: Which efficiency assign to isClaim txs? + // TODO: Optmize tx.Efficiency calculation (precalculate constansts values) + // TODO: Evaluate avoid type conversion (performance impact?) + resourceCost := (float64(tx.BatchResources.zKCounters.CumulativeGasUsed)/float64(constraints.MaxCumulativeGasUsed))*float64(weights.WeightCumulativeGasUsed)/totalWeight + + (float64(tx.BatchResources.zKCounters.UsedArithmetics)/float64(constraints.MaxArithmetics))*float64(weights.WeightArithmetics)/totalWeight + + (float64(tx.BatchResources.zKCounters.UsedBinaries)/float64(constraints.MaxBinaries))*float64(weights.WeightBinaries)/totalWeight + + (float64(tx.BatchResources.zKCounters.UsedKeccakHashes)/float64(constraints.MaxKeccakHashes))*float64(weights.WeightKeccakHashes)/totalWeight + + (float64(tx.BatchResources.zKCounters.UsedMemAligns)/float64(constraints.MaxMemAligns))*float64(weights.WeightMemAligns)/totalWeight + + (float64(tx.BatchResources.zKCounters.UsedPoseidonHashes)/float64(constraints.MaxPoseidonHashes))*float64(weights.WeightPoseidonHashes)/totalWeight + + (float64(tx.BatchResources.zKCounters.UsedPoseidonPaddings)/float64(constraints.MaxPoseidonPaddings))*float64(weights.WeightPoseidonPaddings)/totalWeight + + (float64(tx.BatchResources.zKCounters.UsedSteps)/float64(constraints.MaxSteps))*float64(weights.WeightSteps)/totalWeight + + (float64(tx.BatchResources.bytes)/float64(constraints.MaxBatchBytesSize))*float64(weights.WeightBatchBytesSize)/totalWeight //Meto config + + resourceCost = resourceCost * perThousand + + ben := big.NewFloat(0).SetInt(tx.Benefit) + rc := big.NewFloat(0).SetFloat64(float64(resourceCost)) + eff := big.NewFloat(0).Quo(ben, rc) + + var accuracy big.Accuracy + tx.Efficiency, accuracy = eff.Float64() + if accuracy != big.Exact { + log.Errorf("CalculateEfficiency accuracy warning (%s). Calculated=%s Assigned=%f", accuracy.String(), eff.String(), tx.Efficiency) + } +} diff --git a/sequencer/txtracker_test.go b/sequencer/txtracker_test.go new file mode 100644 index 0000000000..bcc4e92d0e --- /dev/null +++ b/sequencer/txtracker_test.go @@ -0,0 +1,93 @@ +package sequencer + +import ( + "fmt" + "math/big" + "testing" + + "github.com/0xPolygonHermez/zkevm-node/state" + "github.com/stretchr/testify/assert" +) + +type efficiencyCalcTestCase struct { + Name string + benefit int64 + counters state.ZKCounters + usedBytes uint64 + expectedResult float64 +} + +func TestTxTrackerEfficiencyCalculation(t *testing.T) { + // Init ZKEVM resourceCostWeight values + rcWeigth := batchResourceWeights{} + rcWeigth.WeightCumulativeGasUsed = 1 + rcWeigth.WeightArithmetics = 1 + rcWeigth.WeightBinaries = 1 + rcWeigth.WeightKeccakHashes = 1 + rcWeigth.WeightMemAligns = 1 + rcWeigth.WeightPoseidonHashes = 1 + rcWeigth.WeightPoseidonPaddings = 1 + rcWeigth.WeightSteps = 1 + rcWeigth.WeightBatchBytesSize = 2 + + // Init ZKEVM resourceCostMax values + rcMax := batchConstraints{} + rcMax.MaxCumulativeGasUsed = 10 + rcMax.MaxArithmetics = 10 + rcMax.MaxBinaries = 10 + rcMax.MaxKeccakHashes = 10 + rcMax.MaxMemAligns = 10 + rcMax.MaxPoseidonHashes = 10 + rcMax.MaxPoseidonPaddings = 10 + rcMax.MaxSteps = 10 + rcMax.MaxBatchBytesSize = 10 + + testCases := []efficiencyCalcTestCase{ + { + Name: "Using all of the resources", + benefit: 1000000, + counters: state.ZKCounters{CumulativeGasUsed: 10, UsedKeccakHashes: 10, UsedPoseidonHashes: 10, UsedPoseidonPaddings: 10, UsedMemAligns: 10, UsedArithmetics: 10, UsedBinaries: 10, UsedSteps: 10}, + usedBytes: 10, + expectedResult: 1000.00, + }, + { + Name: "Using half of the resources", + benefit: 1000000, + counters: state.ZKCounters{CumulativeGasUsed: 5, UsedKeccakHashes: 5, UsedPoseidonHashes: 5, UsedPoseidonPaddings: 5, UsedMemAligns: 5, UsedArithmetics: 5, UsedBinaries: 5, UsedSteps: 5}, + usedBytes: 5, + expectedResult: 2000.00, + }, + { + Name: "Using all the bytes and half of the remain resources", + benefit: 1000000, + counters: state.ZKCounters{CumulativeGasUsed: 5, UsedKeccakHashes: 5, UsedPoseidonHashes: 5, UsedPoseidonPaddings: 5, UsedMemAligns: 5, UsedArithmetics: 5, UsedBinaries: 5, UsedSteps: 5}, + usedBytes: 10, + expectedResult: 1666.67, + }, + { + Name: "Using all the steps and half of the remain resources", + benefit: 1000000, + counters: state.ZKCounters{CumulativeGasUsed: 5, UsedKeccakHashes: 5, UsedPoseidonHashes: 5, UsedPoseidonPaddings: 5, UsedMemAligns: 5, UsedArithmetics: 5, UsedBinaries: 5, UsedSteps: 10}, + usedBytes: 5, + expectedResult: 1818.18, + }, + { + Name: "Using 10% of all the resources", + benefit: 1000000, + counters: state.ZKCounters{CumulativeGasUsed: 1, UsedKeccakHashes: 1, UsedPoseidonHashes: 1, UsedPoseidonPaddings: 1, UsedMemAligns: 1, UsedArithmetics: 1, UsedBinaries: 1, UsedSteps: 1}, + usedBytes: 1, + expectedResult: 10000.00, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.Name, func(t *testing.T) { + tx := TxTracker{} + tx.Benefit = new(big.Int).SetInt64(testCase.benefit) + tx.BatchResources.bytes = testCase.usedBytes + tx.updateZKCounters(testCase.counters, rcMax, rcWeigth) + t.Logf("%s=%s", testCase.Name, fmt.Sprintf("%.2f", tx.Efficiency)) + assert.Equal(t, fmt.Sprintf("%.2f", testCase.expectedResult), fmt.Sprintf("%.2f", tx.Efficiency), "Efficiency calculation error. Expected=%s, Actual=%s", fmt.Sprintf("%.2f", testCase.expectedResult), fmt.Sprintf("%.2f", tx.Efficiency)) + }) + } +} diff --git a/sequencer/worker.go b/sequencer/worker.go new file mode 100644 index 0000000000..0dd04f5ee5 --- /dev/null +++ b/sequencer/worker.go @@ -0,0 +1,253 @@ +package sequencer + +import ( + "context" + "math/big" + "runtime" + "sync" + + "github.com/0xPolygonHermez/zkevm-node/log" + "github.com/0xPolygonHermez/zkevm-node/state" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +// Worker represents the worker component of the sequencer +type Worker struct { + pool map[string]*addrQueue + efficiencyList *efficiencyList + workerMutex sync.Mutex + // dbManager dbManagerInterface + state stateInterface + batchConstraints batchConstraints + batchResourceWeights batchResourceWeights +} + +// NewWorker creates an init a worker +func NewWorker(state stateInterface, constraints batchConstraints, weights batchResourceWeights) *Worker { + w := Worker{ + pool: make(map[string]*addrQueue), + efficiencyList: newEfficiencyList(), + state: state, + batchConstraints: constraints, + batchResourceWeights: weights, + } + + return &w +} + +// NewTxTracker creates and inits a TxTracker +func (w *Worker) NewTxTracker(tx types.Transaction, isClaim bool, counters state.ZKCounters) (*TxTracker, error) { + return newTxTracker(tx, isClaim, counters, w.batchConstraints, w.batchResourceWeights) +} + +// AddTx adds a new Tx to the Worker +// TODO: Rename to AddTxTracker? +func (w *Worker) AddTx(ctx context.Context, tx *TxTracker) { + // TODO: Review if additional mutex is needed to lock GetBestFittingTx + w.workerMutex.Lock() + defer w.workerMutex.Unlock() + + addr, found := w.pool[tx.FromStr] + + if !found { + // Unlock the worker to let execute other worker functions while creating the new AddrQueue + w.workerMutex.Unlock() + + root, err := w.state.GetLastStateRoot(ctx, nil) + if err != nil { + // TODO: How to manage this + return + } + nonce, err := w.state.GetNonceByStateRoot(ctx, tx.From, root) + if err != nil { + // TODO: How to manage this + return + } + balance, err := w.state.GetBalanceByStateRoot(ctx, tx.From, root) + if err != nil { + // TODO: How to manage this + return + } + + addr = newAddrQueue(tx.From, nonce.Uint64(), balance) + + // Lock again the worker + w.workerMutex.Lock() + + w.pool[tx.FromStr] = addr + } + + // Add the txTracker to Addr and get the newReadyTx and prevReadyTx + newReadyTx, prevReadyTx := addr.addTx(tx) + + // Update the EfficiencyList (if needed) + if prevReadyTx != nil { + w.efficiencyList.delete(prevReadyTx) + } + if newReadyTx != nil { + w.efficiencyList.add(newReadyTx) + } +} + +func (w *Worker) applyAddressUpdate(from common.Address, fromNonce *uint64, fromBalance *big.Int) (*TxTracker, *TxTracker) { + addrQueue, found := w.pool[from.String()] + + // TODO: What happens if addr no found. Could it be possible if addrQueue has not been yet created for this from addr (touchedAddresses) + if found { + newReadyTx, prevReadyTx := addrQueue.updateCurrentNonceBalance(fromNonce, fromBalance) + + // Update the EfficiencyList (if needed) + if prevReadyTx != nil { + w.efficiencyList.delete(prevReadyTx) + } + if newReadyTx != nil { + w.efficiencyList.add(newReadyTx) + } + + return newReadyTx, prevReadyTx + } + + return nil, nil +} + +// UpdateAfterSingleSuccessfulTxExecution updates the touched addresses after execute on Executor a successfully tx +func (w *Worker) UpdateAfterSingleSuccessfulTxExecution(from common.Address, touchedAddresses map[common.Address]*state.InfoReadWrite) { + w.workerMutex.Lock() + defer w.workerMutex.Unlock() + if len(touchedAddresses) == 0 { + log.Errorf("UpdateAfterSingleSuccessfulTxExecution touchedAddresses is nil or empty") + } + + touchedFrom, found := touchedAddresses[from] + if found { + fromNonce, fromBalance := touchedFrom.Nonce, touchedFrom.Balance + w.applyAddressUpdate(from, fromNonce, fromBalance) + } else { + log.Errorf("UpdateAfterSingleSuccessfulTxExecution from(%s) not found in touchedAddresses", from.String()) + } + + for addr, addressInfo := range touchedAddresses { + if addr != from { + w.applyAddressUpdate(addr, nil, addressInfo.Balance) + } + } +} + +// MoveTxToNotReady move a tx to not ready after it fails to execute +func (w *Worker) MoveTxToNotReady(txHash common.Hash, from common.Address, actualNonce *uint64, actualBalance *big.Int) { + w.workerMutex.Lock() + defer w.workerMutex.Unlock() + + addrQueue, found := w.pool[from.String()] + + if found { + // Sanity check. The txHash must be the readyTx + if addrQueue.readyTx == nil || txHash.String() != addrQueue.readyTx.HashStr { + readyHashStr := "" + if addrQueue.readyTx != nil { + readyHashStr = addrQueue.readyTx.HashStr + } + log.Errorf("MoveTxToNotReady txHash(s) is not the readyTx(%s)", txHash.String(), readyHashStr) + // TODO: how to manage this? + } + } + + w.applyAddressUpdate(from, actualNonce, actualBalance) +} + +// DeleteTx delete the tx after it fails to execute +func (w *Worker) DeleteTx(txHash common.Hash, addr common.Address) { + w.workerMutex.Lock() + defer w.workerMutex.Unlock() + + addrQueue, found := w.pool[addr.String()] + if found { + deletedReadyTx := addrQueue.deleteTx(txHash) + if deletedReadyTx != nil { + w.efficiencyList.delete(deletedReadyTx) + } + } else { + log.Errorf("DeleteTx addrQueue(%s) not found", addr.String()) + } +} + +// UpdateTx updates the ZKCounter of a tx and resort the tx in the efficiency list if needed +func (w *Worker) UpdateTx(txHash common.Hash, addr common.Address, counters state.ZKCounters) { + w.workerMutex.Lock() + defer w.workerMutex.Unlock() + + addrQueue, found := w.pool[addr.String()] + + if found { + newReadyTx, prevReadyTx := addrQueue.UpdateTxZKCounters(txHash, counters, w.batchConstraints, w.batchResourceWeights) + + // Resort the newReadyTx in efficiencyList + if prevReadyTx != nil { + w.efficiencyList.delete(prevReadyTx) + } + if newReadyTx != nil { + w.efficiencyList.add(newReadyTx) + } + } else { + log.Errorf("UpdateTx addrQueue(%s) not found", addr.String()) + } +} + +// GetBestFittingTx gets the most efficient tx that fits in the available batch resources +func (w *Worker) GetBestFittingTx(resources batchResources) *TxTracker { + w.workerMutex.Lock() + defer w.workerMutex.Unlock() + + var ( + tx *TxTracker + foundMutex sync.RWMutex + ) + + nGoRoutines := runtime.NumCPU() + foundAt := -1 + + wg := sync.WaitGroup{} + wg.Add(nGoRoutines) + + // Each go routine looks for a fitting tx + for i := 0; i < nGoRoutines; i++ { + go func(n int, bresources batchResources) { + defer wg.Done() + for i := n; i < w.efficiencyList.len(); i += nGoRoutines { + foundMutex.RLock() + if foundAt != -1 && i > foundAt { + foundMutex.RUnlock() + return + } + foundMutex.RUnlock() + + txCandidate := w.efficiencyList.getByIndex(i) + err := bresources.sub(txCandidate.BatchResources) + if err != nil { + // We don't add this Tx + continue + } + + foundMutex.Lock() + if foundAt == -1 || foundAt > i { + foundAt = i + tx = txCandidate + } + foundMutex.Unlock() + + return + } + }(i, resources) + } + wg.Wait() + + return tx +} + +// HandleL2Reorg handles the L2 reorg signal +func (w *Worker) HandleL2Reorg(txHashes []common.Hash) { + // 1. Delete related txs from w.efficiencyList + // 2. Mark the affected addresses as "reorged" in w.Pool + // 3. Update these addresses (go to MT, update nonce and balance into w.Pool) +} diff --git a/sequencer/worker_test.go b/sequencer/worker_test.go new file mode 100644 index 0000000000..97543cb57b --- /dev/null +++ b/sequencer/worker_test.go @@ -0,0 +1,288 @@ +package sequencer + +import ( + "context" + "fmt" + "math/big" + "testing" + + "github.com/0xPolygonHermez/zkevm-node/state" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/assert" +) + +type workerAddTxTestCase struct { + name string + from common.Address + txHash common.Hash + nonce uint64 + // isClaim bool + benefit int64 + cost *big.Int + counters state.ZKCounters + usedBytes uint64 + expectedEfficiencyList []common.Hash +} + +type workerAddrQueueInfo struct { + from common.Address + nonce *big.Int + balance *big.Int +} + +func processWrokerAddTxTestCases(t *testing.T, worker *Worker, testCases []workerAddTxTestCase) { + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + tx := TxTracker{} + tx.Hash = testCase.txHash + tx.HashStr = testCase.txHash.String() + tx.From = testCase.from + tx.FromStr = testCase.from.String() + tx.Nonce = testCase.nonce + tx.Benefit = new(big.Int).SetInt64(testCase.benefit) + tx.Cost = testCase.cost + tx.BatchResources.bytes = testCase.usedBytes + tx.updateZKCounters(testCase.counters, worker.batchConstraints, worker.batchResourceWeights) + t.Logf("%s=%s", testCase.name, fmt.Sprintf("%.2f", tx.Efficiency)) + + worker.AddTx(ctx, &tx) + + el := worker.efficiencyList + if el.len() != len(testCase.expectedEfficiencyList) { + t.Fatalf("Error efficiencylist.len(%d) != expectedEfficiencyList.len(%d)", el.len(), len(testCase.expectedEfficiencyList)) + } + for i := 0; i < el.len(); i++ { + if el.getByIndex(i).HashStr != string(testCase.expectedEfficiencyList[i].String()) { + t.Fatalf("Error efficiencylist(%d). Expected=%s, Actual=%s", i, testCase.expectedEfficiencyList[i].String(), el.getByIndex(i).HashStr) + } + } + }) + } +} + +func TestWorkerAddTx(t *testing.T) { + var nilErr error + + // Init ZKEVM resourceCostWeight values + rcWeigth := batchResourceWeights{} + rcWeigth.WeightCumulativeGasUsed = 1 + rcWeigth.WeightArithmetics = 1 + rcWeigth.WeightBinaries = 1 + rcWeigth.WeightKeccakHashes = 1 + rcWeigth.WeightMemAligns = 1 + rcWeigth.WeightPoseidonHashes = 1 + rcWeigth.WeightPoseidonPaddings = 1 + rcWeigth.WeightSteps = 1 + rcWeigth.WeightBatchBytesSize = 2 + + // Init ZKEVM resourceCostMax values + rcMax := batchConstraints{} + rcMax.MaxCumulativeGasUsed = 10 + rcMax.MaxArithmetics = 10 + rcMax.MaxBinaries = 10 + rcMax.MaxKeccakHashes = 10 + rcMax.MaxMemAligns = 10 + rcMax.MaxPoseidonHashes = 10 + rcMax.MaxPoseidonPaddings = 10 + rcMax.MaxSteps = 10 + rcMax.MaxBatchBytesSize = 10 + + stateMock := NewStateMock(t) + worker := NewWorker(stateMock, rcMax, rcWeigth) + + ctx := context.Background() + + stateMock.On("GetLastStateRoot", ctx, nil).Return(common.Hash{0}, nilErr) + + addrQueueInfo := []workerAddrQueueInfo{ + {from: common.Address{1}, nonce: new(big.Int).SetInt64(1), balance: new(big.Int).SetInt64(10)}, + {from: common.Address{2}, nonce: new(big.Int).SetInt64(1), balance: new(big.Int).SetInt64(10)}, + {from: common.Address{3}, nonce: new(big.Int).SetInt64(1), balance: new(big.Int).SetInt64(10)}, + {from: common.Address{4}, nonce: new(big.Int).SetInt64(1), balance: new(big.Int).SetInt64(10)}, + } + + for _, aq := range addrQueueInfo { + stateMock.On("GetNonceByStateRoot", ctx, aq.from, common.Hash{0}).Return(aq.nonce, nilErr) + stateMock.On("GetBalanceByStateRoot", ctx, aq.from, common.Hash{0}).Return(aq.balance, nilErr) + } + + addTxsTC := []workerAddTxTestCase{ + { + name: "Adding from:0x01, tx:0x01/ef:10", from: common.Address{1}, txHash: common.Hash{1}, nonce: 1, + benefit: 1000, cost: new(big.Int).SetInt64(5), + counters: state.ZKCounters{CumulativeGasUsed: 1, UsedKeccakHashes: 1, UsedPoseidonHashes: 1, UsedPoseidonPaddings: 1, UsedMemAligns: 1, UsedArithmetics: 1, UsedBinaries: 1, UsedSteps: 1}, + usedBytes: 1, + expectedEfficiencyList: []common.Hash{ + {1}, + }, + }, + { + name: "Adding from:0x02, tx:0x02/ef:20", from: common.Address{2}, txHash: common.Hash{2}, nonce: 1, + benefit: 2000, cost: new(big.Int).SetInt64(5), + counters: state.ZKCounters{CumulativeGasUsed: 1, UsedKeccakHashes: 1, UsedPoseidonHashes: 1, UsedPoseidonPaddings: 1, UsedMemAligns: 1, UsedArithmetics: 1, UsedBinaries: 1, UsedSteps: 1}, + usedBytes: 1, + expectedEfficiencyList: []common.Hash{ + {2}, {1}, + }, + }, + { + name: "Readding from:0x02, tx:0x02/ef:4", from: common.Address{2}, txHash: common.Hash{2}, nonce: 1, + benefit: 2000, cost: new(big.Int).SetInt64(5), + counters: state.ZKCounters{CumulativeGasUsed: 5, UsedKeccakHashes: 5, UsedPoseidonHashes: 5, UsedPoseidonPaddings: 5, UsedMemAligns: 5, UsedArithmetics: 5, UsedBinaries: 5, UsedSteps: 5}, + usedBytes: 5, + expectedEfficiencyList: []common.Hash{ + {1}, {2}, + }, + }, + { + name: "Readding from:0x03, tx:0x03/ef:25", from: common.Address{3}, txHash: common.Hash{3}, nonce: 1, + benefit: 5000, cost: new(big.Int).SetInt64(5), + counters: state.ZKCounters{CumulativeGasUsed: 2, UsedKeccakHashes: 2, UsedPoseidonHashes: 2, UsedPoseidonPaddings: 2, UsedMemAligns: 2, UsedArithmetics: 2, UsedBinaries: 2, UsedSteps: 2}, + usedBytes: 2, + expectedEfficiencyList: []common.Hash{ + {3}, {1}, {2}, + }, + }, + } + + processWrokerAddTxTestCases(t, worker, addTxsTC) + + // Change counters fpr tx:0x03/ef:9.61 + counters := state.ZKCounters{CumulativeGasUsed: 6, UsedKeccakHashes: 6, UsedPoseidonHashes: 6, UsedPoseidonPaddings: 6, UsedMemAligns: 6, UsedArithmetics: 6, UsedBinaries: 6, UsedSteps: 6} + worker.UpdateTx(common.Hash{3}, common.Address{3}, counters) + + addTxsTC = []workerAddTxTestCase{ + { + name: "Adding from:0x04, tx:0x04/ef:100", from: common.Address{4}, txHash: common.Hash{4}, nonce: 1, + benefit: 10000, cost: new(big.Int).SetInt64(5), + counters: state.ZKCounters{CumulativeGasUsed: 1, UsedKeccakHashes: 1, UsedPoseidonHashes: 1, UsedPoseidonPaddings: 1, UsedMemAligns: 1, UsedArithmetics: 1, UsedBinaries: 1, UsedSteps: 1}, + usedBytes: 1, + expectedEfficiencyList: []common.Hash{ + {4}, {1}, {3}, {2}, + }, + }, + } + + processWrokerAddTxTestCases(t, worker, addTxsTC) +} + +func TestWorkerGetBestTx(t *testing.T) { + var nilErr error + + // Init ZKEVM resourceCostWeight values + rcWeigth := batchResourceWeights{} + rcWeigth.WeightCumulativeGasUsed = 1 + rcWeigth.WeightArithmetics = 1 + rcWeigth.WeightBinaries = 1 + rcWeigth.WeightKeccakHashes = 1 + rcWeigth.WeightMemAligns = 1 + rcWeigth.WeightPoseidonHashes = 1 + rcWeigth.WeightPoseidonPaddings = 1 + rcWeigth.WeightSteps = 1 + rcWeigth.WeightBatchBytesSize = 2 + + // Init ZKEVM resourceCostMax values + rcMax := batchConstraints{} + rcMax.MaxCumulativeGasUsed = 10 + rcMax.MaxArithmetics = 10 + rcMax.MaxBinaries = 10 + rcMax.MaxKeccakHashes = 10 + rcMax.MaxMemAligns = 10 + rcMax.MaxPoseidonHashes = 10 + rcMax.MaxPoseidonPaddings = 10 + rcMax.MaxSteps = 10 + rcMax.MaxBatchBytesSize = 10 + + rc := batchResources{ + zKCounters: state.ZKCounters{CumulativeGasUsed: 10, UsedKeccakHashes: 10, UsedPoseidonHashes: 10, UsedPoseidonPaddings: 10, UsedMemAligns: 10, UsedArithmetics: 10, UsedBinaries: 10, UsedSteps: 10}, + bytes: 10, + } + + stateMock := NewStateMock(t) + worker := NewWorker(stateMock, rcMax, rcWeigth) + + ctx := context.Background() + + stateMock.On("GetLastStateRoot", ctx, nil).Return(common.Hash{0}, nilErr) + + addrQueueInfo := []workerAddrQueueInfo{ + {from: common.Address{1}, nonce: new(big.Int).SetInt64(1), balance: new(big.Int).SetInt64(10)}, + {from: common.Address{2}, nonce: new(big.Int).SetInt64(1), balance: new(big.Int).SetInt64(10)}, + {from: common.Address{3}, nonce: new(big.Int).SetInt64(1), balance: new(big.Int).SetInt64(10)}, + {from: common.Address{4}, nonce: new(big.Int).SetInt64(1), balance: new(big.Int).SetInt64(10)}, + } + + for _, aq := range addrQueueInfo { + stateMock.On("GetNonceByStateRoot", ctx, aq.from, common.Hash{0}).Return(aq.nonce, nilErr) + stateMock.On("GetBalanceByStateRoot", ctx, aq.from, common.Hash{0}).Return(aq.balance, nilErr) + } + + addTxsTC := []workerAddTxTestCase{ + { + name: "Adding from:0x01, tx:0x01/ef:10", from: common.Address{1}, txHash: common.Hash{1}, nonce: 1, + benefit: 1000, cost: new(big.Int).SetInt64(5), + counters: state.ZKCounters{CumulativeGasUsed: 1, UsedKeccakHashes: 1, UsedPoseidonHashes: 1, UsedPoseidonPaddings: 1, UsedMemAligns: 1, UsedArithmetics: 1, UsedBinaries: 1, UsedSteps: 1}, + usedBytes: 1, + expectedEfficiencyList: []common.Hash{ + {1}, + }, + }, + { + name: "Adding from:0x02, tx:0x02/ef:12", from: common.Address{2}, txHash: common.Hash{2}, nonce: 1, + benefit: 6000, cost: new(big.Int).SetInt64(5), + counters: state.ZKCounters{CumulativeGasUsed: 5, UsedKeccakHashes: 5, UsedPoseidonHashes: 5, UsedPoseidonPaddings: 5, UsedMemAligns: 5, UsedArithmetics: 5, UsedBinaries: 5, UsedSteps: 5}, + usedBytes: 5, + expectedEfficiencyList: []common.Hash{ + {2}, {1}, + }, + }, + { + name: "Readding from:0x03, tx:0x03/ef:25", from: common.Address{3}, txHash: common.Hash{3}, nonce: 1, + benefit: 5000, cost: new(big.Int).SetInt64(5), + counters: state.ZKCounters{CumulativeGasUsed: 2, UsedKeccakHashes: 2, UsedPoseidonHashes: 2, UsedPoseidonPaddings: 2, UsedMemAligns: 2, UsedArithmetics: 2, UsedBinaries: 2, UsedSteps: 2}, + usedBytes: 2, + expectedEfficiencyList: []common.Hash{ + {3}, {2}, {1}, + }, + }, + { + name: "Adding from:0x04, tx:0x04/ef:100", from: common.Address{4}, txHash: common.Hash{4}, nonce: 1, + benefit: 40000, cost: new(big.Int).SetInt64(5), + counters: state.ZKCounters{CumulativeGasUsed: 4, UsedKeccakHashes: 4, UsedPoseidonHashes: 4, UsedPoseidonPaddings: 4, UsedMemAligns: 4, UsedArithmetics: 4, UsedBinaries: 4, UsedSteps: 4}, + usedBytes: 4, + expectedEfficiencyList: []common.Hash{ + {4}, {3}, {2}, {1}, + }, + }, + } + + processWrokerAddTxTestCases(t, worker, addTxsTC) + + expectedGetBestTx := []common.Hash{{4}, {3}, {1}} + ct := 0 + + for { + tx := worker.GetBestFittingTx(rc) + if tx != nil { + if ct >= len(expectedGetBestTx) { + t.Fatalf("Error getting more best tx than expected. Expected=%d, Actual=%d", len(expectedGetBestTx), ct+1) + } + if tx.HashStr != string(expectedGetBestTx[ct].String()) { + t.Fatalf("Error GetBestFittingTx(%d). Expected=%s, Actual=%s", ct, expectedGetBestTx[ct].String(), tx.HashStr) + } + err := rc.sub(tx.BatchResources) + assert.NoError(t, err) + + touch := make(map[common.Address]*state.InfoReadWrite) + var newNonce uint64 = tx.Nonce + 1 + touch[tx.From] = &state.InfoReadWrite{Address: tx.From, Nonce: &newNonce, Balance: new(big.Int).SetInt64(10)} + worker.UpdateAfterSingleSuccessfulTxExecution(tx.From, touch) + ct++ + } else { + if ct < len(expectedGetBestTx) { + t.Fatalf("Error expecting more best tx. Expected=%d, Actual=%d", len(expectedGetBestTx), ct) + } + break + } + } +} diff --git a/state/batch.go b/state/batch.go index 839edfbf1a..82c1f5de22 100644 --- a/state/batch.go +++ b/state/batch.go @@ -37,7 +37,8 @@ type ProcessingReceipt struct { StateRoot common.Hash LocalExitRoot common.Hash AccInputHash common.Hash - Txs []types.Transaction + // Txs []types.Transaction + BatchL2Data []byte } // VerifiedBatch represents a VerifiedBatch @@ -52,10 +53,11 @@ type VerifiedBatch struct { // VirtualBatch represents a VirtualBatch type VirtualBatch struct { - BatchNumber uint64 - TxHash common.Hash - Coinbase common.Address - BlockNumber uint64 + BatchNumber uint64 + TxHash common.Hash + Coinbase common.Address + SequencerAddr common.Address + BlockNumber uint64 } // Sequence represents the sequence interval diff --git a/state/converters.go b/state/converters.go index 1f2f9aa806..c7cd9b8b74 100644 --- a/state/converters.go +++ b/state/converters.go @@ -17,6 +17,20 @@ import ( "github.com/ethereum/go-ethereum/core/types" ) +// ConvertToCounters extracts ZKCounters from a ProcessBatchResponse +func ConvertToCounters(resp *pb.ProcessBatchResponse) ZKCounters { + return ZKCounters{ + CumulativeGasUsed: resp.CumulativeGasUsed, + UsedKeccakHashes: resp.CntKeccakHashes, + UsedPoseidonHashes: resp.CntPoseidonHashes, + UsedPoseidonPaddings: resp.CntPoseidonPaddings, + UsedMemAligns: resp.CntMemAligns, + UsedArithmetics: resp.CntArithmetics, + UsedBinaries: resp.CntBinaries, + UsedSteps: resp.CntSteps, + } +} + // TestConvertToProcessBatchResponse for test purposes func (s *State) TestConvertToProcessBatchResponse(txs []types.Transaction, response *pb.ProcessBatchResponse) (*ProcessBatchResponse, error) { return s.convertToProcessBatchResponse(txs, response) @@ -57,8 +71,8 @@ func isProcessed(err pb.RomError) bool { return !executor.IsIntrinsicError(err) && !executor.IsROMOutOfCountersError(err) } -func convertToReadWriteAddresses(addresses map[string]*pb.InfoReadWrite) ([]*InfoReadWrite, error) { - results := make([]*InfoReadWrite, 0, len(addresses)) +func convertToReadWriteAddresses(addresses map[string]*pb.InfoReadWrite) (map[common.Address]*InfoReadWrite, error) { + results := make(map[common.Address]*InfoReadWrite, len(addresses)) for addr, addrInfo := range addresses { var nonce *uint64 = nil @@ -85,8 +99,7 @@ func convertToReadWriteAddresses(addresses map[string]*pb.InfoReadWrite) ([]*Inf } } - result := &InfoReadWrite{Address: address, Nonce: nonce, Balance: balance} - results = append(results, result) + results[address] = &InfoReadWrite{Address: address, Nonce: nonce, Balance: balance} } return results, nil @@ -133,8 +146,8 @@ func (s *State) convertToProcessTransactionResponse(txs []types.Transaction, res results = append(results, result) - log.Debugf("ProcessTransactionResponse[TxHash]: %v", txs[i].Hash().String()) - log.Debugf("ProcessTransactionResponse[Nonce]: %v", txs[i].Nonce()) + log.Debugf("ProcessTransactionResponse[TxHash]: %v", result.TxHash) + log.Debugf("ProcessTransactionResponse[Nonce]: %v", result.Tx.Nonce()) log.Debugf("ProcessTransactionResponse[StateRoot]: %v", result.StateRoot.String()) log.Debugf("ProcessTransactionResponse[Error]: %v", result.RomError) log.Debugf("ProcessTransactionResponse[GasUsed]: %v", result.GasUsed) diff --git a/state/errors.go b/state/errors.go index f0d7b37348..31f2b4323d 100644 --- a/state/errors.go +++ b/state/errors.go @@ -46,6 +46,8 @@ var ( // ErrInsufficientFunds is returned if the total cost of executing a transaction // is higher than the balance of the user's account. ErrInsufficientFunds = errors.New("insufficient funds for gas * price + value") + + zkCounterErrPrefix = "ZKCounter: " // ErrUnsupportedDuration is returned if the provided unit for a time // interval is not supported by our conversion mechanism. ErrUnsupportedDuration = errors.New("unsupported time duration") @@ -59,3 +61,8 @@ func constructErrorFromRevert(err error, returnValue []byte) error { return fmt.Errorf("%w: %s", err, revertErrMsg) } + +// GetZKCounterError returns the error associated with the zkCounter +func GetZKCounterError(name string) error { + return errors.New(zkCounterErrPrefix + name) +} diff --git a/state/forkid.go b/state/forkid.go index 985615a05c..ee492af5e4 100644 --- a/state/forkid.go +++ b/state/forkid.go @@ -5,6 +5,7 @@ type ForkIDInterval struct { FromBatchNumber uint64 ToBatchNumber uint64 ForkId uint64 + Version string } // GetForkIDByBatchNumber returns the fork id for a given batch number diff --git a/state/genesis.go b/state/genesis.go index ed509438a1..311a444e2e 100644 --- a/state/genesis.go +++ b/state/genesis.go @@ -4,9 +4,8 @@ import "github.com/ethereum/go-ethereum/common" // Genesis contains the information to populate state on creation type Genesis struct { - Root common.Hash - Actions []*GenesisAction - Transactions []GenesisTx + Root common.Hash + Actions []*GenesisAction } // GenesisAction represents one of the values set on the SMT during genesis. @@ -19,17 +18,3 @@ type GenesisAction struct { Value string `json:"value"` Root string `json:"root"` } - -// GenesisTx represents the txs of the genesis -type GenesisTx struct { - RawTx string `json:"rawTx"` - Receipt GenesisReceipt `json:"receipt"` - CreateAddress common.Address `json:"createAddress"` -} - -// GenesisReceipt represents the genesis receipt -type GenesisReceipt struct { - Status uint8 `json:"status"` - GasUsed uint64 `json:"gasUsed"` - Logs [][]interface{} `json:"logs"` -} diff --git a/state/globalexitroot.go b/state/globalexitroot.go index f050aaf89e..f22160e57c 100644 --- a/state/globalexitroot.go +++ b/state/globalexitroot.go @@ -1,12 +1,15 @@ package state import ( + "time" + "github.com/ethereum/go-ethereum/common" ) // GlobalExitRoot struct type GlobalExitRoot struct { BlockNumber uint64 + Timestamp time.Time MainnetExitRoot common.Hash RollupExitRoot common.Hash GlobalExitRoot common.Hash diff --git a/state/helper.go b/state/helper.go index 6141bbc59b..8300748b9e 100644 --- a/state/helper.go +++ b/state/helper.go @@ -18,7 +18,7 @@ const ( etherPre155V = 35 ) -// EncodeTransactions RLP encodes the given transactions. +// EncodeTransactions RLP encodes the given transactions func EncodeTransactions(txs []types.Transaction) ([]byte, error) { var batchL2Data []byte @@ -65,6 +65,40 @@ func EncodeTransactions(txs []types.Transaction) ([]byte, error) { return batchL2Data, nil } +// EncodeTransaction RLP encodes the given transaction +func EncodeTransaction(tx types.Transaction) ([]byte, error) { + v, r, s := tx.RawSignatureValues() + sign := 1 - (v.Uint64() & 1) + + nonce, gasPrice, gas, to, value, data, chainID := tx.Nonce(), tx.GasPrice(), tx.Gas(), tx.To(), tx.Value(), tx.Data(), tx.ChainId() + log.Debug(nonce, " ", gasPrice, " ", gas, " ", to, " ", value, " ", len(data), " ", chainID) + + txCodedRlp, err := rlp.EncodeToBytes([]interface{}{ + nonce, + gasPrice, + gas, + to, + value, + data, + chainID, uint(0), uint(0), + }) + + if err != nil { + return nil, err + } + + newV := new(big.Int).Add(big.NewInt(ether155V), big.NewInt(int64(sign))) + newRPadded := fmt.Sprintf("%064s", r.Text(hex.Base)) + newSPadded := fmt.Sprintf("%064s", s.Text(hex.Base)) + newVPadded := fmt.Sprintf("%02s", newV.Text(hex.Base)) + txData, err := hex.DecodeString(hex.EncodeToString(txCodedRlp) + newRPadded + newSPadded + newVPadded) + if err != nil { + return nil, err + } + + return txData, nil +} + // EncodeUnsignedTransaction RLP encodes the given unsigned transaction func EncodeUnsignedTransaction(tx types.Transaction, chainID uint64) ([]byte, error) { v, _ := new(big.Int).SetString("0x1c", 0) @@ -116,7 +150,6 @@ func DecodeTxs(txsData []byte) ([]types.Transaction, []byte, error) { ff = 255 // max value of rlp header shortRlp = 55 // length of the short rlp codification f7 = 247 // 192 + 55 = c0 + shortRlp - mul2 = 2 ) txDataLength := len(txsData) if txDataLength == 0 { @@ -156,21 +189,12 @@ func DecodeTxs(txsData []byte) ([]types.Transaction, []byte, error) { return []types.Transaction{}, []byte{}, err } - legacyTx, chainID, err := RlpFieldsToLegacyTx(rlpFields) + legacyTx, err := RlpFieldsToLegacyTx(rlpFields, vData, rData, sData) if err != nil { log.Debug("error creating tx from rlp fields: ", err, ". fullDataTx: ", hex.EncodeToString(fullDataTx), "\n tx: ", hex.EncodeToString(txInfo), "\n Txs received: ", hex.EncodeToString(txsData)) return []types.Transaction{}, []byte{}, err } - if chainID != nil { - //v = v-27+chainId*2+35 - legacyTx.V = new(big.Int).Add(new(big.Int).Sub(new(big.Int).SetBytes(vData), big.NewInt(ether155V)), new(big.Int).Add(new(big.Int).Mul(chainID, big.NewInt(mul2)), big.NewInt(etherPre155V))) - } else { - legacyTx.V = new(big.Int).SetBytes(vData) - } - legacyTx.R = new(big.Int).SetBytes(rData) - legacyTx.S = new(big.Int).SetBytes(sData) - tx := types.NewTx(legacyTx) txs = append(txs, *tx) } diff --git a/state/metrics/metrics.go b/state/metrics/metrics.go index 94142b8356..890c8051f1 100644 --- a/state/metrics/metrics.go +++ b/state/metrics/metrics.go @@ -8,10 +8,12 @@ import ( ) const ( - prefix = "state_" - executorProcessingTime = prefix + "executor_processing_time" - - callerLabelName = "caller" + // Prefix for the metrics of the state package. + Prefix = "state_" + // ExecutorProcessingTimeName is the name of the metric that shows the processing time in the executor. + ExecutorProcessingTimeName = Prefix + "executor_processing_time" + // CallerLabelName is the name of the label for the caller. + CallerLabelName = "caller" ) // Register the metrics for the sequencer package. @@ -19,10 +21,10 @@ func Register() { histogramVecs := []metrics.HistogramVecOpts{ { HistogramOpts: prometheus.HistogramOpts{ - Name: executorProcessingTime, + Name: ExecutorProcessingTimeName, Help: "[STATE] processing time in executor", }, - Labels: []string{callerLabelName}, + Labels: []string{CallerLabelName}, }, } @@ -33,5 +35,5 @@ func Register() { // and for the given label. func ExecutorProcessingTime(caller string, lastExecutionTime time.Duration) { execTimeInSeconds := float64(lastExecutionTime) / float64(time.Second) - metrics.HistogramVecObserve(executorProcessingTime, string(caller), execTimeInSeconds) + metrics.HistogramVecObserve(ExecutorProcessingTimeName, string(caller), execTimeInSeconds) } diff --git a/state/pgstatestorage.go b/state/pgstatestorage.go index f2b745844d..d478117dee 100644 --- a/state/pgstatestorage.go +++ b/state/pgstatestorage.go @@ -18,9 +18,8 @@ import ( const maxTopics = 4 const ( - addGlobalExitRootSQL = "INSERT INTO state.exit_root (block_num, mainnet_exit_root, rollup_exit_root, global_exit_root) VALUES ($1, $2, $3, $4)" + addGlobalExitRootSQL = "INSERT INTO state.exit_root (block_num, timestamp, mainnet_exit_root, rollup_exit_root, global_exit_root) VALUES ($1, $2, $3, $4, $5)" getLatestExitRootBlockNumSQL = "SELECT block_num FROM state.exit_root ORDER BY id DESC LIMIT 1" - addVirtualBatchSQL = "INSERT INTO state.virtual_batch (batch_num, tx_hash, coinbase, block_num) VALUES ($1, $2, $3, $4)" addBlockSQL = "INSERT INTO state.block (block_num, block_hash, parent_hash, received_at) VALUES ($1, $2, $3, $4)" getLastBlockSQL = "SELECT block_num, block_hash, parent_hash, received_at FROM state.block ORDER BY block_num DESC LIMIT 1" getPreviousBlockSQL = "SELECT block_num, block_hash, parent_hash, received_at FROM state.block ORDER BY block_num DESC LIMIT 1 OFFSET $1" @@ -39,8 +38,6 @@ const ( updateLastBatchSeenSQL = "UPDATE state.sync_info SET last_batch_num_seen = $1" isBatchClosedSQL = "SELECT global_exit_root IS NOT NULL AND state_root IS NOT NULL FROM state.batch WHERE batch_num = $1 LIMIT 1" addGenesisBatchSQL = "INSERT INTO state.batch (batch_num, global_exit_root, local_exit_root, acc_input_hash, state_root, timestamp, coinbase, raw_txs_data, forced_batch_num) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)" - openBatchSQL = "INSERT INTO state.batch (batch_num, global_exit_root, timestamp, coinbase, forced_batch_num) VALUES ($1, $2, $3, $4, $5)" - closeBatchSQL = "UPDATE state.batch SET state_root = $1, local_exit_root = $2, acc_input_hash = $3, raw_txs_data = $4 WHERE batch_num = $5" getL2BlockByNumberSQL = "SELECT header, uncles, received_at FROM state.l2block b WHERE b.block_num = $1" getL2BlockHeaderByNumberSQL = "SELECT header FROM state.l2block b WHERE b.block_num = $1" getTransactionByHashSQL = "SELECT transaction.encoded FROM state.transaction WHERE hash = $1" @@ -49,9 +46,7 @@ const ( getL2BlockTransactionCountByHashSQL = "SELECT COUNT(*) FROM state.transaction t INNER JOIN state.l2block b ON b.block_num = t.l2_block_num WHERE b.block_hash = $1" getL2BlockTransactionCountByNumberSQL = "SELECT COUNT(*) FROM state.transaction t WHERE t.l2_block_num = $1" getLastConsolidatedBlockNumberSQL = "SELECT b.block_num FROM state.l2block b INNER JOIN state.verified_batch vb ON vb.batch_num = b.batch_num ORDER BY b.block_num DESC LIMIT 1" - getLastVirtualBlockHeaderSQL = "SELECT b.header FROM state.l2block b INNER JOIN state.virtual_batch vb ON vb.batch_num = b.batch_num ORDER BY b.block_num DESC LIMIT 1" getL2BlockByHashSQL = "SELECT header, uncles, received_at FROM state.l2block b WHERE b.block_hash = $1" - getLastL2BlockSQL = "SELECT header, uncles, received_at FROM state.l2block b ORDER BY b.block_num DESC LIMIT 1" getL2BlockHeaderByHashSQL = "SELECT header FROM state.l2block b WHERE b.block_hash = $1" getTxsByBlockNumSQL = "SELECT encoded FROM state.transaction WHERE l2_block_num = $1" getL2BlockHashesSinceSQL = "SELECT block_hash FROM state.l2block WHERE created_at >= $1" @@ -210,7 +205,7 @@ func (p *PostgresStorage) GetPreviousBlock(ctx context.Context, offset uint64, d // AddGlobalExitRoot adds a new ExitRoot to the db func (p *PostgresStorage) AddGlobalExitRoot(ctx context.Context, exitRoot *GlobalExitRoot, dbTx pgx.Tx) error { e := p.getExecQuerier(dbTx) - _, err := e.Exec(ctx, addGlobalExitRootSQL, exitRoot.BlockNumber, exitRoot.MainnetExitRoot, exitRoot.RollupExitRoot, exitRoot.GlobalExitRoot) + _, err := e.Exec(ctx, addGlobalExitRootSQL, exitRoot.BlockNumber, exitRoot.Timestamp, exitRoot.MainnetExitRoot, exitRoot.RollupExitRoot, exitRoot.GlobalExitRoot) return err } @@ -315,7 +310,7 @@ func (p *PostgresStorage) GetTimeForLatestBatchVirtualization(ctx context.Contex // AddForcedBatch adds a new ForcedBatch to the db func (p *PostgresStorage) AddForcedBatch(ctx context.Context, forcedBatch *ForcedBatch, tx pgx.Tx) error { const addForcedBatchSQL = "INSERT INTO state.forced_batch (forced_batch_num, global_exit_root, timestamp, raw_txs_data, coinbase, block_num) VALUES ($1, $2, $3, $4, $5, $6)" - _, err := tx.Exec(ctx, addForcedBatchSQL, forcedBatch.ForcedBatchNumber, forcedBatch.GlobalExitRoot.String(), forcedBatch.ForcedAt, forcedBatch.RawTxsData, forcedBatch.Sequencer.String(), forcedBatch.BlockNumber) + _, err := tx.Exec(ctx, addForcedBatchSQL, forcedBatch.ForcedBatchNumber, forcedBatch.GlobalExitRoot.String(), forcedBatch.ForcedAt, hex.EncodeToString(forcedBatch.RawTxsData), forcedBatch.Sequencer.String(), forcedBatch.BlockNumber) return err } @@ -344,6 +339,32 @@ func (p *PostgresStorage) GetForcedBatch(ctx context.Context, forcedBatchNumber return &forcedBatch, nil } +// GetForcedBatchesSince gets L1 forced batches since forcedBatchNumber +func (p *PostgresStorage) GetForcedBatchesSince(ctx context.Context, forcedBatchNumber uint64, dbTx pgx.Tx) ([]*ForcedBatch, error) { + const getForcedBatchesSQL = "SELECT forced_batch_num, global_exit_root, timestamp, raw_txs_data, coinbase, block_num FROM state.forced_batch WHERE forced_batch_num > $1" + q := p.getExecQuerier(dbTx) + rows, err := q.Query(ctx, getForcedBatchesSQL, forcedBatchNumber) + if errors.Is(err, pgx.ErrNoRows) { + return []*ForcedBatch{}, nil + } else if err != nil { + return nil, err + } + defer rows.Close() + + forcesBatches := make([]*ForcedBatch, 0, len(rows.RawValues())) + + for rows.Next() { + forcedBatch, err := scanForcedBatch(rows) + if err != nil { + return nil, err + } + + forcesBatches = append(forcesBatches, &forcedBatch) + } + + return forcesBatches, nil +} + // AddVerifiedBatch adds a new VerifiedBatch to the db func (p *PostgresStorage) AddVerifiedBatch(ctx context.Context, verifiedBatch *VerifiedBatch, dbTx pgx.Tx) error { e := p.getExecQuerier(dbTx) @@ -429,7 +450,7 @@ func (p *PostgresStorage) GetLastNBatchesByL2BlockNumber(ctx context.Context, l2 WHERE l2b.block_num = $1)) /* OR if $1 is null, this means we want to get the most updated information from state, so it considers all the batches. * this is generally used by estimate gas, process unsigned transactions and it is required by claim transactions to add - * the open batch to the result and get the most updated GER synced from L1 and stored in the current open batch when + * the open batch to the result and get the most updated globalExitRoot synced from L1 and stored in the current open batch when * there was not transactions yet to create a l2 block with it */ OR $1 IS NULL ORDER BY b.batch_num DESC @@ -507,6 +528,21 @@ func (p *PostgresStorage) GetLastVirtualBatchNum(ctx context.Context, dbTx pgx.T return batchNum, nil } +// GetLatestVirtualBatchTimestamp gets last virtual batch timestamp +func (p *PostgresStorage) GetLatestVirtualBatchTimestamp(ctx context.Context, dbTx pgx.Tx) (time.Time, error) { + const getLastVirtualBatchTimestampSQL = `SELECT COALESCE(MAX(block.received_at), NOW()) FROM state.virtual_batch INNER JOIN state.block ON state.block.block_num = virtual_batch.block_num` + var timestamp time.Time + e := p.getExecQuerier(dbTx) + err := e.QueryRow(ctx, getLastVirtualBatchTimestampSQL).Scan(×tamp) + + if errors.Is(err, pgx.ErrNoRows) { + return time.Unix(0, 0), ErrNotFound + } else if err != nil { + return time.Unix(0, 0), err + } + return timestamp, nil +} + // SetLastBatchNumberSeenOnEthereum sets the last batch number that affected // the roll-up in order to allow the components to know if the state // is synchronized or not @@ -592,6 +628,37 @@ func (p *PostgresStorage) GetBatchByL2BlockNumber(ctx context.Context, l2BlockNu return &batch, nil } +// GetVirtualBatchByNumber gets batch from batch table that exists on virtual batch +func (p *PostgresStorage) GetVirtualBatchByNumber(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) (*Batch, error) { + const query = ` + SELECT + batch_num, + global_exit_root, + local_exit_root, + acc_input_hash, + state_root, + timestamp, + coinbase, + raw_txs_data, + forced_batch_num + FROM + state.batch + WHERE + batch_num = $1 AND + EXISTS (SELECT batch_num FROM state.virtual_batch WHERE batch_num = $1) + ` + e := p.getExecQuerier(dbTx) + row := e.QueryRow(ctx, query, batchNumber) + batch, err := scanBatch(row) + + if errors.Is(err, pgx.ErrNoRows) { + return nil, ErrNotFound + } else if err != nil { + return nil, err + } + return &batch, nil +} + // IsBatchVirtualized checks if batch is virtualized func (p *PostgresStorage) IsBatchVirtualized(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) (bool, error) { const query = `SELECT EXISTS (SELECT 1 FROM state.virtual_batch WHERE batch_num = $1)` @@ -722,6 +789,27 @@ func scanBatchWithL2BlockStateRoot(row pgx.Row) (Batch, *common.Hash, error) { return batch, l2BlockStateRoot, nil } +func scanForcedBatch(row pgx.Row) (ForcedBatch, error) { + forcedBatch := ForcedBatch{} + var ( + gerStr string + coinbaseStr string + ) + if err := row.Scan( + &forcedBatch.ForcedBatchNumber, + &gerStr, + &forcedBatch.ForcedAt, + &forcedBatch.RawTxsData, + &coinbaseStr, + &forcedBatch.BlockNumber, + ); err != nil { + return forcedBatch, err + } + forcedBatch.GlobalExitRoot = common.HexToHash(gerStr) + forcedBatch.Sequencer = common.HexToAddress(coinbaseStr) + return forcedBatch, nil +} + // GetEncodedTransactionsByBatchNumber returns the encoded field of all // transactions in the given batch. func (p *PostgresStorage) GetEncodedTransactionsByBatchNumber(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) (encoded []string, err error) { @@ -788,32 +876,35 @@ func (p *PostgresStorage) GetTxsHashesByBatchNumber(ctx context.Context, batchNu // AddVirtualBatch adds a new virtual batch to the storage. func (p *PostgresStorage) AddVirtualBatch(ctx context.Context, virtualBatch *VirtualBatch, dbTx pgx.Tx) error { + const addVirtualBatchSQL = "INSERT INTO state.virtual_batch (batch_num, tx_hash, coinbase, block_num, sequencer_addr) VALUES ($1, $2, $3, $4, $5)" e := p.getExecQuerier(dbTx) - _, err := e.Exec(ctx, addVirtualBatchSQL, virtualBatch.BatchNumber, virtualBatch.TxHash.String(), virtualBatch.Coinbase.String(), virtualBatch.BlockNumber) + _, err := e.Exec(ctx, addVirtualBatchSQL, virtualBatch.BatchNumber, virtualBatch.TxHash.String(), virtualBatch.Coinbase.String(), virtualBatch.BlockNumber, virtualBatch.SequencerAddr.String()) return err } // GetVirtualBatch get an L1 virtualBatch. func (p *PostgresStorage) GetVirtualBatch(ctx context.Context, batchNumber uint64, dbTx pgx.Tx) (*VirtualBatch, error) { var ( - virtualBatch VirtualBatch - txHash string - coinbase string + virtualBatch VirtualBatch + txHash string + coinbase string + sequencerAddr string ) const getVirtualBatchSQL = ` - SELECT block_num, batch_num, tx_hash, coinbase + SELECT block_num, batch_num, tx_hash, coinbase, sequencer_addr FROM state.virtual_batch WHERE batch_num = $1` e := p.getExecQuerier(dbTx) - err := e.QueryRow(ctx, getVirtualBatchSQL, batchNumber).Scan(&virtualBatch.BlockNumber, &virtualBatch.BatchNumber, &txHash, &coinbase) + err := e.QueryRow(ctx, getVirtualBatchSQL, batchNumber).Scan(&virtualBatch.BlockNumber, &virtualBatch.BatchNumber, &txHash, &coinbase, &sequencerAddr) if errors.Is(err, pgx.ErrNoRows) { return nil, ErrNotFound } else if err != nil { return nil, err } virtualBatch.Coinbase = common.HexToAddress(coinbase) + virtualBatch.SequencerAddr = common.HexToAddress(sequencerAddr) virtualBatch.TxHash = common.HexToHash(txHash) return &virtualBatch, nil } @@ -841,10 +932,12 @@ func (p *PostgresStorage) storeGenesisBatch(ctx context.Context, batch Batch, db } // openBatch adds a new batch into the state, with the necessary data to start processing transactions within it. -// It's meant to be used by sequencers, since they don't necessarely know what transactions are going to be added +// It's meant to be used by sequencers, since they don't necessarily know what transactions are going to be added // in this batch yet. In other words it's the creation of a WIP batch. -// Note that this will add a batch with batch number N + 1, where N it's the greates batch number on the state. +// Note that this will add a batch with batch number N + 1, where N it's the greatest batch number on the state. func (p *PostgresStorage) openBatch(ctx context.Context, batchContext ProcessingContext, dbTx pgx.Tx) error { + const openBatchSQL = "INSERT INTO state.batch (batch_num, global_exit_root, timestamp, coinbase, forced_batch_num) VALUES ($1, $2, $3, $4, $5)" + e := p.getExecQuerier(dbTx) _, err := e.Exec( ctx, openBatchSQL, @@ -857,9 +950,11 @@ func (p *PostgresStorage) openBatch(ctx context.Context, batchContext Processing return err } -func (p *PostgresStorage) closeBatch(ctx context.Context, receipt ProcessingReceipt, rawTxs []byte, dbTx pgx.Tx) error { +func (p *PostgresStorage) closeBatch(ctx context.Context, receipt ProcessingReceipt, dbTx pgx.Tx) error { + const closeBatchSQL = "UPDATE state.batch SET state_root = $1, local_exit_root = $2, acc_input_hash = $3, raw_txs_data = $4 WHERE batch_num = $5" + e := p.getExecQuerier(dbTx) - _, err := e.Exec(ctx, closeBatchSQL, receipt.StateRoot.String(), receipt.LocalExitRoot.String(), receipt.AccInputHash.String(), rawTxs, receipt.BatchNumber) + _, err := e.Exec(ctx, closeBatchSQL, receipt.StateRoot.String(), receipt.LocalExitRoot.String(), receipt.AccInputHash.String(), receipt.BatchL2Data, receipt.BatchNumber) return err } @@ -886,7 +981,7 @@ func (p *PostgresStorage) UpdateGERInOpenBatch(ctx context.Context, ger common.H } if isBatchHasTxs { - return errors.New("batch has txs, can't change GER") + return errors.New("batch has txs, can't change globalExitRoot") } const updateGER = ` @@ -951,6 +1046,22 @@ func (p *PostgresStorage) GetNextForcedBatches(ctx context.Context, nextForcedBa return batches, nil } +// GetBatchNumberOfL2Block gets a batch number for l2 block by its number +func (p *PostgresStorage) GetBatchNumberOfL2Block(ctx context.Context, blockNumber uint64, dbTx pgx.Tx) (uint64, error) { + getBatchNumByBlockNum := "SELECT batch_num FROM state.l2block WHERE block_num = $1" + batchNumber := uint64(0) + q := p.getExecQuerier(dbTx) + err := q.QueryRow(ctx, getBatchNumByBlockNum, blockNumber). + Scan(&batchNumber) + + if errors.Is(err, pgx.ErrNoRows) { + return batchNumber, ErrNotFound + } else if err != nil { + return batchNumber, err + } + return batchNumber, nil +} + // BatchNumberByL2BlockNumber gets a batch number by a l2 block number func (p *PostgresStorage) BatchNumberByL2BlockNumber(ctx context.Context, blockNumber uint64, dbTx pgx.Tx) (uint64, error) { getBatchNumByBlockNum := "SELECT batch_num FROM state.l2block WHERE block_num = $1" @@ -1309,9 +1420,10 @@ func (p *PostgresStorage) GetLastL2BlockNumber(ctx context.Context, dbTx pgx.Tx) // GetLastL2BlockHeader gets the last l2 block number func (p *PostgresStorage) GetLastL2BlockHeader(ctx context.Context, dbTx pgx.Tx) (*types.Header, error) { + const query = "SELECT b.header FROM state.l2block b ORDER BY b.block_num DESC LIMIT 1" header := &types.Header{} q := p.getExecQuerier(dbTx) - err := q.QueryRow(ctx, getLastVirtualBlockHeaderSQL).Scan(&header) + err := q.QueryRow(ctx, query).Scan(&header) if errors.Is(err, pgx.ErrNoRows) { return nil, ErrStateNotSynchronized @@ -1324,6 +1436,7 @@ func (p *PostgresStorage) GetLastL2BlockHeader(ctx context.Context, dbTx pgx.Tx) // GetLastL2Block retrieves the latest L2 Block from the State data base func (p *PostgresStorage) GetLastL2Block(ctx context.Context, dbTx pgx.Tx) (*types.Block, error) { + const getLastL2BlockSQL = "SELECT header, uncles, received_at FROM state.l2block b ORDER BY b.block_num DESC LIMIT 1" var ( headerStr string unclesStr string @@ -2017,6 +2130,57 @@ func (p *PostgresStorage) DeleteUngeneratedProofs(ctx context.Context, dbTx pgx. return err } +// GetLastClosedBatch returns the latest closed batch +func (p *PostgresStorage) GetLastClosedBatch(ctx context.Context, dbTx pgx.Tx) (*Batch, error) { + const getLastClosedBatchSQL = ` + SELECT bt.batch_num, bt.global_exit_root, bt.local_exit_root, bt.acc_input_hash, bt.state_root, bt.timestamp, bt.coinbase, bt.raw_txs_data + FROM state.batch bt + WHERE global_exit_root IS NOT NULL AND state_root IS NOT NULL + ORDER BY bt.batch_num DESC + LIMIT 1;` + + e := p.getExecQuerier(dbTx) + row := e.QueryRow(ctx, getLastClosedBatchSQL) + batch, err := scanBatch(row) + + if errors.Is(err, pgx.ErrNoRows) { + return nil, ErrStateNotSynchronized + } else if err != nil { + return nil, err + } + return &batch, nil +} + +// UpdateBatchL2Data updates data tx data in a batch +func (p *PostgresStorage) UpdateBatchL2Data(ctx context.Context, batchNumber uint64, batchL2Data []byte, dbTx pgx.Tx) error { + const updateL2DataSQL = "UPDATE state.batch SET raw_txs_data = $2 WHERE batch_num = $1" + + e := p.getExecQuerier(dbTx) + _, err := e.Exec(ctx, updateL2DataSQL, batchNumber, batchL2Data) + return err +} + +// AddAccumulatedInputHash adds the accumulated input hash +func (p *PostgresStorage) AddAccumulatedInputHash(ctx context.Context, batchNum uint64, accInputHash common.Hash, dbTx pgx.Tx) error { + const addAccInputHashBatchSQL = "UPDATE state.batch SET acc_input_hash = $1 WHERE batch_num = $2" + e := p.getExecQuerier(dbTx) + _, err := e.Exec(ctx, addAccInputHashBatchSQL, accInputHash.String(), batchNum) + return err +} + +// GetLastTrustedForcedBatchNumber get last trusted forced batch number +func (p *PostgresStorage) GetLastTrustedForcedBatchNumber(ctx context.Context, dbTx pgx.Tx) (uint64, error) { + const getLastTrustedForcedBatchNumberSQL = "SELECT COALESCE(MAX(forced_batch_num), 0) FROM state.batch" + var forcedBatchNumber uint64 + q := p.getExecQuerier(dbTx) + + err := q.QueryRow(ctx, getLastTrustedForcedBatchNumberSQL).Scan(&forcedBatchNumber) + if errors.Is(err, pgx.ErrNoRows) { + return 0, ErrStateNotSynchronized + } + return forcedBatchNumber, err +} + // AddDebugInfo is used to store debug info useful during runtime func (p *PostgresStorage) AddDebugInfo(ctx context.Context, info *DebugInfo, dbTx pgx.Tx) error { const insertDebugInfoSQL = "INSERT INTO state.debug (error_type, timestamp, payload) VALUES ($1, $2, $3)" diff --git a/state/pgstatestorage_test.go b/state/pgstatestorage_test.go index 10496f0733..c1bd8197e1 100644 --- a/state/pgstatestorage_test.go +++ b/state/pgstatestorage_test.go @@ -7,6 +7,7 @@ import ( "testing" "time" + "github.com/0xPolygonHermez/zkevm-node/hex" "github.com/0xPolygonHermez/zkevm-node/state" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" @@ -249,6 +250,80 @@ func TestVerifiedBatch(t *testing.T) { require.NoError(t, dbTx.Commit(ctx)) } +func TestAddAccumulatedInputHash(t *testing.T) { + initOrResetDB() + + ctx := context.Background() + dbTx, err := testState.BeginStateTransaction(ctx) + require.NoError(t, err) + + block := &state.Block{ + BlockNumber: 1, + BlockHash: common.HexToHash("0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1"), + ParentHash: common.HexToHash("0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1"), + ReceivedAt: time.Now(), + } + err = testState.AddBlock(ctx, block, dbTx) + assert.NoError(t, err) + + _, err = testState.PostgresStorage.Exec(ctx, `INSERT INTO state.batch + (batch_num, global_exit_root, local_exit_root, state_root, timestamp, coinbase, raw_txs_data) + VALUES(1, '0x0000000000000000000000000000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000000000000000000000000000', '0xbf34f9a52a63229e90d1016011655bc12140bba5b771817b88cbf340d08dcbde', '2022-12-19 08:17:45.000', '0x0000000000000000000000000000000000000000', NULL); + `) + require.NoError(t, err) + + accInputHash := common.HexToHash("0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f2") + batchNum := uint64(1) + err = testState.AddAccumulatedInputHash(ctx, batchNum, accInputHash, dbTx) + require.NoError(t, err) + + b, err := testState.GetBatchByNumber(ctx, batchNum, dbTx) + require.NoError(t, err) + assert.Equal(t, b.BatchNumber, batchNum) + assert.Equal(t, b.AccInputHash, accInputHash) + require.NoError(t, dbTx.Commit(ctx)) +} + +func TestForcedBatch(t *testing.T) { + // Init database instance + initOrResetDB() + + ctx := context.Background() + tx, err := testState.BeginStateTransaction(ctx) + require.NoError(t, err) + block := &state.Block{ + BlockNumber: 1, + BlockHash: common.HexToHash("0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1"), + ParentHash: common.HexToHash("0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1"), + ReceivedAt: time.Now(), + } + err = testState.AddBlock(ctx, block, tx) + assert.NoError(t, err) + rtx := "29e885edaf8e4b51e1d2e05f9da28000000000000000000000000000000000000000000000000000000161d2fb4f6b1d53827d9b80a23cf2d7d9f1" + raw, err := hex.DecodeString(rtx) + assert.NoError(t, err) + forcedBatch := state.ForcedBatch{ + BlockNumber: 1, + ForcedBatchNumber: 1, + Sequencer: common.HexToAddress("0x2536C2745Ac4A584656A830f7bdCd329c94e8F30"), + RawTxsData: raw, + ForcedAt: time.Now(), + GlobalExitRoot: common.HexToHash("0x40a885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9a0"), + } + err = testState.AddForcedBatch(ctx, &forcedBatch, tx) + require.NoError(t, err) + fb, err := testState.GetForcedBatch(ctx, 1, tx) + require.NoError(t, err) + err = tx.Commit(ctx) + require.NoError(t, err) + assert.Equal(t, forcedBatch.BlockNumber, fb.BlockNumber) + assert.Equal(t, forcedBatch.ForcedBatchNumber, fb.ForcedBatchNumber) + assert.Equal(t, forcedBatch.Sequencer, fb.Sequencer) + assert.Equal(t, forcedBatch.RawTxsData, fb.RawTxsData) + assert.Equal(t, rtx, common.Bytes2Hex(fb.RawTxsData)) + assert.Equal(t, forcedBatch.ForcedAt.Unix(), fb.ForcedAt.Unix()) + assert.Equal(t, forcedBatch.GlobalExitRoot, fb.GlobalExitRoot) +} func TestCleanupLockedProofs(t *testing.T) { require := require.New(t) assert := assert.New(t) @@ -321,3 +396,44 @@ func TestCleanupLockedProofs(t *testing.T) { assert.Contains(proofs, olderNotGenProof) assert.Contains(proofs, newerProof) } + +func TestVirtualBatch(t *testing.T) { + initOrResetDB() + + ctx := context.Background() + dbTx, err := testState.BeginStateTransaction(ctx) + require.NoError(t, err) + + block := &state.Block{ + BlockNumber: 1, + BlockHash: common.HexToHash("0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1"), + ParentHash: common.HexToHash("0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1"), + ReceivedAt: time.Now(), + } + err = testState.AddBlock(ctx, block, dbTx) + assert.NoError(t, err) + //require.NoError(t, tx.Commit(ctx)) + + lastBlock, err := testState.GetLastBlock(ctx, dbTx) + assert.NoError(t, err) + assert.Equal(t, uint64(1), lastBlock.BlockNumber) + + _, err = testState.PostgresStorage.Exec(ctx, "INSERT INTO state.batch (batch_num) VALUES (1)") + + require.NoError(t, err) + addr := common.HexToAddress("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266") + virtualBatch := state.VirtualBatch{ + BlockNumber: 1, + BatchNumber: 1, + Coinbase: addr, + SequencerAddr: addr, + TxHash: common.HexToHash("0x29e885edaf8e4b51e1d2e05f9da28161d2fb4f6b1d53827d9b80a23cf2d7d9f1"), + } + err = testState.AddVirtualBatch(ctx, &virtualBatch, dbTx) + require.NoError(t, err) + + actualVirtualBatch, err := testState.GetVirtualBatch(ctx, 1, dbTx) + require.NoError(t, err) + require.Equal(t, virtualBatch, *actualVirtualBatch) + require.NoError(t, dbTx.Commit(ctx)) +} diff --git a/state/runtime/executor/pb/executor.pb.go b/state/runtime/executor/pb/executor.pb.go index 3651d7e756..5cc2cd3b4f 100644 --- a/state/runtime/executor/pb/executor.pb.go +++ b/state/runtime/executor/pb/executor.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.8 +// protoc v3.21.12 // source: executor.proto package pb diff --git a/state/runtime/executor/pb/executor_grpc.pb.go b/state/runtime/executor/pb/executor_grpc.pb.go index 475a5c7fdd..78ac0c2df9 100644 --- a/state/runtime/executor/pb/executor_grpc.pb.go +++ b/state/runtime/executor/pb/executor_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.21.12 +// source: executor.proto package pb diff --git a/state/state.go b/state/state.go index 976dfc062a..ed69b27c47 100644 --- a/state/state.go +++ b/state/state.go @@ -53,6 +53,8 @@ const ( SequencerCallerLabel CallerLabel = "sequencer" // SynchronizerCallerLabel is used when synchronizer is calling the function SynchronizerCallerLabel CallerLabel = "synchronizer" + // DiscardCallerLabel is used we want to skip measuring the execution time + DiscardCallerLabel CallerLabel = "discard" ) var ( @@ -148,6 +150,15 @@ func (s *State) GetNonce(ctx context.Context, address common.Address, blockNumbe return nonce.Uint64(), nil } +// GetLastStateRoot returns the latest state root +func (s *State) GetLastStateRoot(ctx context.Context, dbTx pgx.Tx) (common.Hash, error) { + lastBlockHeader, err := s.GetLastL2BlockHeader(ctx, dbTx) + if err != nil { + return common.Hash{}, err + } + return lastBlockHeader.Root, nil +} + // GetStorageAt from a given address func (s *State) GetStorageAt(ctx context.Context, address common.Address, position *big.Int, blockNumber uint64, dbTx pgx.Tx) (*big.Int, error) { l2Block, err := s.GetL2BlockByNumber(ctx, blockNumber, dbTx) @@ -172,7 +183,7 @@ func (s *State) EstimateGas(transaction *types.Transaction, senderAddress common return 0, err } - // Get latest batch from the database to get GER and Timestamp + // Get latest batch from the database to get globalExitRoot and Timestamp lastBatch := lastBatches[0] // Get batch before latest to get state root and local exit root @@ -274,7 +285,7 @@ func (s *State) EstimateGas(transaction *types.Transaction, senderAddress common // log.Debugf("EstimateGas[processBatchRequest.BatchL2Data]: %v", hex.EncodeToHex(processBatchRequest.BatchL2Data)) log.Debugf("EstimateGas[processBatchRequest.From]: %v", processBatchRequest.From) log.Debugf("EstimateGas[processBatchRequest.OldStateRoot]: %v", hex.EncodeToHex(processBatchRequest.OldStateRoot)) - log.Debugf("EstimateGas[processBatchRequest.GlobalExitRoot]: %v", hex.EncodeToHex(processBatchRequest.GlobalExitRoot)) + log.Debugf("EstimateGas[processBatchRequest.globalExitRoot]: %v", hex.EncodeToHex(processBatchRequest.GlobalExitRoot)) log.Debugf("EstimateGas[processBatchRequest.OldAccInputHash]: %v", hex.EncodeToHex(processBatchRequest.OldAccInputHash)) log.Debugf("EstimateGas[processBatchRequest.EthTimestamp]: %v", processBatchRequest.EthTimestamp) log.Debugf("EstimateGas[processBatchRequest.Coinbase]: %v", processBatchRequest.Coinbase) @@ -394,9 +405,9 @@ func isEVMRevertError(err error) bool { } // OpenBatch adds a new batch into the state, with the necessary data to start processing transactions within it. -// It's meant to be used by sequencers, since they don't necessarely know what transactions are going to be added +// It's meant to be used by sequencers, since they don't necessarily know what transactions are going to be added // in this batch yet. In other words it's the creation of a WIP batch. -// Note that this will add a batch with batch number N + 1, where N it's the greates batch number on the state. +// Note that this will add a batch with batch number N + 1, where N it's the greatest batch number on the state. func (s *State) OpenBatch(ctx context.Context, processingContext ProcessingContext, dbTx pgx.Tx) error { if dbTx == nil { return ErrDBTxNil @@ -429,23 +440,20 @@ func (s *State) OpenBatch(ctx context.Context, processingContext ProcessingConte } // ProcessSequencerBatch is used by the sequencers to process transactions into an open batch -func (s *State) ProcessSequencerBatch( - ctx context.Context, - batchNumber uint64, - txs []types.Transaction, - dbTx pgx.Tx, - caller CallerLabel, -) (*ProcessBatchResponse, error) { +func (s *State) ProcessSequencerBatch(ctx context.Context, batchNumber uint64, batchL2Data []byte, caller CallerLabel, dbTx pgx.Tx) (*ProcessBatchResponse, error) { log.Debugf("*******************************************") log.Debugf("ProcessSequencerBatch start") - batchL2Data, err := EncodeTransactions(txs) + + processBatchResponse, err := s.processBatch(ctx, batchNumber, batchL2Data, caller, dbTx) if err != nil { return nil, err } - processBatchResponse, err := s.processBatch(ctx, batchNumber, batchL2Data, dbTx, caller) + + txs, _, err := DecodeTxs(batchL2Data) if err != nil { return nil, err } + result, err := s.convertToProcessBatchResponse(txs, processBatchResponse) if err != nil { return nil, err @@ -455,42 +463,89 @@ func (s *State) ProcessSequencerBatch( return result, nil } -// ExecuteBatch is used by the synchronizer to reprocess batches to compare generated state root vs stored one -func (s *State) ExecuteBatch(ctx context.Context, batchNumber uint64, batchL2Data []byte, dbTx pgx.Tx) (*pb.ProcessBatchResponse, error) { - if dbTx == nil { - return nil, ErrDBTxNil +// ProcessBatch processes a batch +func (s *State) ProcessBatch(ctx context.Context, request ProcessRequest) (*ProcessBatchResponse, error) { + log.Debugf("*******************************************") + log.Debugf("ProcessBatch start") + + // Create Batch + processBatchRequest := &pb.ProcessBatchRequest{ + OldBatchNum: request.BatchNumber - 1, + Coinbase: request.Coinbase.String(), + BatchL2Data: request.Transactions, + OldStateRoot: request.OldStateRoot.Bytes(), + GlobalExitRoot: request.GlobalExitRoot.Bytes(), + OldAccInputHash: request.OldAccInputHash.Bytes(), + EthTimestamp: request.Timestamp, + UpdateMerkleTree: cTrue, + ChainId: s.cfg.ChainID, + ForkId: s.cfg.CurrentForkID, + } + res, err := s.sendBatchRequestToExecutor(ctx, processBatchRequest, request.Caller) + if err != nil { + return nil, err + } + + txs, _, err := DecodeTxs(request.Transactions) + if err != nil { + return nil, err } - // Get batch from the database to get GER and Timestamp - lastBatch, err := s.PostgresStorage.GetBatchByNumber(ctx, batchNumber, dbTx) + var result *ProcessBatchResponse + result, err = s.convertToProcessBatchResponse(txs, res) if err != nil { return nil, err } + log.Debugf("ProcessBatch end") + log.Debugf("*******************************************") + + return result, nil +} + +// ExecuteBatch is used by the synchronizer to reprocess batches to compare generated state root vs stored one +// It is also used by the sequencer in order to calculate used zkCounter of a WIPBatch +func (s *State) ExecuteBatch(ctx context.Context, batch Batch, dbTx pgx.Tx) (*pb.ProcessBatchResponse, error) { + if dbTx == nil { + return nil, ErrDBTxNil + } + // Get previous batch to get state root and local exit root - previousBatch, err := s.PostgresStorage.GetBatchByNumber(ctx, batchNumber-1, dbTx) + previousBatch, err := s.PostgresStorage.GetBatchByNumber(ctx, batch.BatchNumber-1, dbTx) if err != nil { return nil, err } - forkId := s.GetForkIdByBatchNumber(batchNumber) + forkId := s.GetForkIdByBatchNumber(batch.BatchNumber) // Create Batch processBatchRequest := &pb.ProcessBatchRequest{ - OldBatchNum: lastBatch.BatchNumber - 1, - Coinbase: lastBatch.Coinbase.String(), - BatchL2Data: batchL2Data, + OldBatchNum: batch.BatchNumber - 1, + Coinbase: batch.Coinbase.String(), + BatchL2Data: batch.BatchL2Data, OldStateRoot: previousBatch.StateRoot.Bytes(), - GlobalExitRoot: lastBatch.GlobalExitRoot.Bytes(), + GlobalExitRoot: batch.GlobalExitRoot.Bytes(), OldAccInputHash: previousBatch.AccInputHash.Bytes(), - EthTimestamp: uint64(lastBatch.Timestamp.Unix()), + EthTimestamp: uint64(batch.Timestamp.Unix()), UpdateMerkleTree: cFalse, ChainId: s.cfg.ChainID, ForkId: forkId, } - processBatchResponse, err := s.executorClient.ProcessBatch(ctx, processBatchRequest) + // Send Batch to the Executor + log.Debugf("ExecuteBatch[processBatchRequest.OldBatchNum]: %v", processBatchRequest.OldBatchNum) + log.Debugf("ExecuteBatch[processBatchRequest.BatchL2Data]: %v", hex.EncodeToHex(processBatchRequest.BatchL2Data)) + log.Debugf("ExecuteBatch[processBatchRequest.From]: %v", processBatchRequest.From) + log.Debugf("ExecuteBatch[processBatchRequest.OldStateRoot]: %v", hex.EncodeToHex(processBatchRequest.OldStateRoot)) + log.Debugf("ExecuteBatch[processBatchRequest.GlobalExitRoot]: %v", hex.EncodeToHex(processBatchRequest.GlobalExitRoot)) + log.Debugf("ExecuteBatch[processBatchRequest.OldAccInputHash]: %v", hex.EncodeToHex(processBatchRequest.OldAccInputHash)) + log.Debugf("ExecuteBatch[processBatchRequest.EthTimestamp]: %v", processBatchRequest.EthTimestamp) + log.Debugf("ExecuteBatch[processBatchRequest.Coinbase]: %v", processBatchRequest.Coinbase) + log.Debugf("ExecuteBatch[processBatchRequest.UpdateMerkleTree]: %v", processBatchRequest.UpdateMerkleTree) + log.Debugf("ExecuteBatch[processBatchRequest.ChainId]: %v", processBatchRequest.ChainId) + log.Debugf("ExecuteBatch[processBatchRequest.ForkId]: %v", processBatchRequest.ForkId) + processBatchResponse, err := s.executorClient.ProcessBatch(ctx, processBatchRequest) if err != nil { if processBatchResponse.Error != executor.EXECUTOR_ERROR_NO_ERROR { err = executor.ExecutorErr(processBatchResponse.Error) @@ -505,8 +560,8 @@ func (s *State) processBatch( ctx context.Context, batchNumber uint64, batchL2Data []byte, - dbTx pgx.Tx, caller CallerLabel, + dbTx pgx.Tx, ) (*pb.ProcessBatchResponse, error) { if dbTx == nil { return nil, ErrDBTxNil @@ -516,7 +571,7 @@ func (s *State) processBatch( return nil, err } - // Get latest batch from the database to get GER and Timestamp + // Get latest batch from the database to get globalExitRoot and Timestamp lastBatch := lastBatches[0] // Get batch before latest to get state root and local exit root @@ -551,18 +606,26 @@ func (s *State) processBatch( ForkId: s.cfg.CurrentForkID, } + res, err := s.sendBatchRequestToExecutor(ctx, processBatchRequest, caller) + + return res, err +} + +func (s *State) sendBatchRequestToExecutor(ctx context.Context, processBatchRequest *pb.ProcessBatchRequest, caller CallerLabel) (*pb.ProcessBatchResponse, error) { // Send Batch to the Executor - log.Debugf("processBatch[processBatchRequest.OldBatchNum]: %v", processBatchRequest.OldBatchNum) - // log.Debugf("processBatch[processBatchRequest.BatchL2Data]: %v", hex.EncodeToHex(processBatchRequest.BatchL2Data)) - log.Debugf("processBatch[processBatchRequest.From]: %v", processBatchRequest.From) - log.Debugf("processBatch[processBatchRequest.OldStateRoot]: %v", hex.EncodeToHex(processBatchRequest.OldStateRoot)) - log.Debugf("processBatch[processBatchRequest.GlobalExitRoot]: %v", hex.EncodeToHex(processBatchRequest.GlobalExitRoot)) - log.Debugf("processBatch[processBatchRequest.OldAccInputHash]: %v", hex.EncodeToHex(processBatchRequest.OldAccInputHash)) - log.Debugf("processBatch[processBatchRequest.EthTimestamp]: %v", processBatchRequest.EthTimestamp) - log.Debugf("processBatch[processBatchRequest.Coinbase]: %v", processBatchRequest.Coinbase) - log.Debugf("processBatch[processBatchRequest.UpdateMerkleTree]: %v", processBatchRequest.UpdateMerkleTree) - log.Debugf("processBatch[processBatchRequest.ChainId]: %v", processBatchRequest.ChainId) - log.Debugf("processBatch[processBatchRequest.ForkId]: %v", processBatchRequest.ForkId) + if caller != DiscardCallerLabel { + log.Debugf("processBatch[processBatchRequest.OldBatchNum]: %v", processBatchRequest.OldBatchNum) + log.Debugf("processBatch[processBatchRequest.BatchL2Data]: %v", hex.EncodeToHex(processBatchRequest.BatchL2Data)) + log.Debugf("processBatch[processBatchRequest.From]: %v", processBatchRequest.From) + log.Debugf("processBatch[processBatchRequest.OldStateRoot]: %v", hex.EncodeToHex(processBatchRequest.OldStateRoot)) + log.Debugf("processBatch[processBatchRequest.GlobalExitRoot]: %v", hex.EncodeToHex(processBatchRequest.GlobalExitRoot)) + log.Debugf("processBatch[processBatchRequest.OldAccInputHash]: %v", hex.EncodeToHex(processBatchRequest.OldAccInputHash)) + log.Debugf("processBatch[processBatchRequest.EthTimestamp]: %v", processBatchRequest.EthTimestamp) + log.Debugf("processBatch[processBatchRequest.Coinbase]: %v", processBatchRequest.Coinbase) + log.Debugf("processBatch[processBatchRequest.UpdateMerkleTree]: %v", processBatchRequest.UpdateMerkleTree) + log.Debugf("processBatch[processBatchRequest.ChainId]: %v", processBatchRequest.ChainId) + log.Debugf("processBatch[processBatchRequest.ForkId]: %v", processBatchRequest.ForkId) + } now := time.Now() res, err := s.executorClient.ProcessBatch(ctx, processBatchRequest) if err != nil { @@ -573,8 +636,12 @@ func (s *State) processBatch( err = executor.ExecutorErr(res.Error) s.LogExecutorError(res.Error, processBatchRequest) } + elapsed := time.Since(now) + if caller != DiscardCallerLabel { + metrics.ExecutorProcessingTime(string(caller), elapsed) + } + log.Infof("It took %v for the executor to process the request", elapsed) - log.Infof("Batch: %d. It took %v for the executor to process the request", batchNumber, time.Since(now)) return res, err } @@ -674,38 +741,8 @@ func (s *State) isBatchClosable(ctx context.Context, receipt ProcessingReceipt, return nil } -// closeSynchronizedBatch is used by Synchronizer to close the current batch. -func (s *State) closeSynchronizedBatch(ctx context.Context, receipt ProcessingReceipt, batchL2Data []byte, dbTx pgx.Tx) error { - if dbTx == nil { - return ErrDBTxNil - } - - err := s.isBatchClosable(ctx, receipt, dbTx) - if err != nil { - return err - } - - // TODO: Modification done to bypass situation detected during testnet testing - // Further analysis is needed - /* - if len(txs) == 0 { - return ErrClosingBatchWithoutTxs - } - */ - - // batchL2Data, err := EncodeTransactions(txs) - // if err != nil { - // return err - // } - - return s.PostgresStorage.closeBatch(ctx, receipt, batchL2Data, dbTx) -} - -// CloseBatch is used by sequencer to close the current batch. It will set the processing receipt and -// the raw txs data based on the txs included on that batch that are already in the state +// CloseBatch is used by sequencer to close the current batch func (s *State) CloseBatch(ctx context.Context, receipt ProcessingReceipt, dbTx pgx.Tx) error { - // TODO: differentiate the case where sequencer / sync calls the function so it's possible - // to use L2BatchData from L1 rather than from stored txs if dbTx == nil { return ErrDBTxNil } @@ -715,43 +752,7 @@ func (s *State) CloseBatch(ctx context.Context, receipt ProcessingReceipt, dbTx return err } - // Generate raw txs data - encodedTxsArray, err := s.GetEncodedTransactionsByBatchNumber(ctx, receipt.BatchNumber, dbTx) - if err != nil { - return err - } - txs := []types.Transaction{} - for i := 0; i < len(encodedTxsArray); i++ { - tx, err := DecodeTx(encodedTxsArray[i]) - if err != nil { - return err - } - txs = append(txs, *tx) - } - - // todo: temporary check, remove if don't face this error anymore https://github.com/0xPolygonHermez/zkevm-node/issues/1303 - // check the order of the txs - if len(receipt.Txs) != len(txs) { - log.Warnf("when closing a batch amount of txs in memory: %d is differs from amount in db: %d", - len(receipt.Txs), len(txs)) - } - var isOrderNotCorrect bool - for i, tx := range receipt.Txs { - if tx.Hash().Hex() != txs[i].Hash().Hex() { - isOrderNotCorrect = true - } - } - if isOrderNotCorrect { - log.Warnf("order in memory of the sequence and order in data from request database is different," + - " change to the order in memory") - txs = receipt.Txs - } - batchL2Data, err := EncodeTransactions(txs) - if err != nil { - return err - } - - return s.PostgresStorage.closeBatch(ctx, receipt, batchL2Data, dbTx) + return s.PostgresStorage.closeBatch(ctx, receipt, dbTx) } // ProcessAndStoreClosedBatch is used by the Synchronizer to add a closed batch into the data base @@ -776,7 +777,7 @@ func (s *State) ProcessAndStoreClosedBatch( if err := s.OpenBatch(ctx, processingCtx, dbTx); err != nil { return err } - processed, err := s.processBatch(ctx, processingCtx.BatchNumber, encodedTxs, dbTx, caller) + processed, err := s.processBatch(ctx, processingCtx.BatchNumber, encodedTxs, caller, dbTx) if err != nil { return err } @@ -821,12 +822,13 @@ func (s *State) ProcessAndStoreClosedBatch( } // Close batch - return s.closeSynchronizedBatch(ctx, ProcessingReceipt{ + return s.closeBatch(ctx, ProcessingReceipt{ BatchNumber: processingCtx.BatchNumber, StateRoot: processedBatch.NewStateRoot, LocalExitRoot: processedBatch.NewLocalExitRoot, AccInputHash: processedBatch.NewAccInputHash, - }, encodedTxs, dbTx) + BatchL2Data: encodedTxs, + }, dbTx) } // GetLastBatch gets latest batch (closed or not) on the data base @@ -857,7 +859,7 @@ func (s *State) DebugTransaction(ctx context.Context, transactionHash common.Has return nil, err } - // The previous batch to get OldStateRoot and GlobalExitRoot + // The previous batch to get OldStateRoot and globalExitRoot pBatch, err := s.GetBatchByNumber(ctx, batch.BatchNumber-1, dbTx) if err != nil { return nil, err @@ -910,6 +912,10 @@ func (s *State) DebugTransaction(ctx context.Context, transactionHash common.Has } endTime := time.Now() + for _, response := range processBatchResponse.Responses { + log.Debugf(string(response.TxHash)) + } + txs, _, err := DecodeTxs(batchL2Data) if err != nil { return nil, err @@ -1155,7 +1161,7 @@ func (s *State) ProcessUnsignedTransaction(ctx context.Context, tx *types.Transa return result } - // Get latest batch from the database to get GER and Timestamp + // Get latest batch from the database to get globalExitRoot and Timestamp lastBatch := lastBatches[0] // Get batch before latest to get state root and local exit root @@ -1194,7 +1200,7 @@ func (s *State) ProcessUnsignedTransaction(ctx context.Context, tx *types.Transa // log.Debugf("ProcessUnsignedTransaction[processBatchRequest.BatchL2Data]: %v", hex.EncodeToHex(processBatchRequest.BatchL2Data)) log.Debugf("ProcessUnsignedTransaction[processBatchRequest.From]: %v", processBatchRequest.From) log.Debugf("ProcessUnsignedTransaction[processBatchRequest.OldStateRoot]: %v", hex.EncodeToHex(processBatchRequest.OldStateRoot)) - log.Debugf("ProcessUnsignedTransaction[processBatchRequest.GlobalExitRoot]: %v", hex.EncodeToHex(processBatchRequest.GlobalExitRoot)) + log.Debugf("ProcessUnsignedTransaction[processBatchRequest.globalExitRoot]: %v", hex.EncodeToHex(processBatchRequest.GlobalExitRoot)) log.Debugf("ProcessUnsignedTransaction[processBatchRequest.OldAccInputHash]: %v", hex.EncodeToHex(processBatchRequest.OldAccInputHash)) log.Debugf("ProcessUnsignedTransaction[processBatchRequest.EthTimestamp]: %v", processBatchRequest.EthTimestamp) log.Debugf("ProcessUnsignedTransaction[processBatchRequest.Coinbase]: %v", processBatchRequest.Coinbase) @@ -1220,7 +1226,7 @@ func (s *State) ProcessUnsignedTransaction(ctx context.Context, tx *types.Transa result.Err = err return result } - // Todo populate result + r := response.Responses[0] result.ReturnValue = r.ReturnValue result.GasLeft = r.GasLeft @@ -1368,62 +1374,13 @@ func (s *State) SetGenesis(ctx context.Context, block Block, genesis Genesis, db rootHex := root.Hex() log.Info("Genesis root ", rootHex) - // Decode txs and generate receipts - txs, receipts, err := generateGenesisTxsAndReceipts(genesis.Transactions) - if err != nil { - log.Error("error generating genesis txs and receipts. Error: ", err) - return newRoot, err - } - - l2Block := types.NewBlock(header, txs, []*types.Header{}, receipts, &trie.StackTrie{}) + receipts := []*types.Receipt{} + l2Block := types.NewBlock(header, []*types.Transaction{}, []*types.Header{}, receipts, &trie.StackTrie{}) l2Block.ReceivedAt = block.ReceivedAt return newRoot, s.AddL2Block(ctx, batch.BatchNumber, l2Block, receipts, dbTx) } -func generateGenesisTxsAndReceipts(transactions []GenesisTx) ([]*types.Transaction, []*types.Receipt, error) { - //Decode genesis raw txs - txs := []*types.Transaction{} - var receipts []*types.Receipt - var cumulativeGasUsed uint64 - for i, tx := range transactions { - rawBytes, err := hex.DecodeHex(tx.RawTx) - if err != nil { - log.Error("error decoding string rawTxs. Error: ", err) - return []*types.Transaction{}, []*types.Receipt{}, err - } - txsAux, _, err := DecodeTxs(rawBytes) - if err != nil { - log.Error("error decoding rawBytes. Error: ", err) - return []*types.Transaction{}, []*types.Receipt{}, err - } - for _, tx := range txsAux { - t := tx - txs = append(txs, &t) - } - - // Generate receipts - cumulativeGasUsed += tx.Receipt.GasUsed - txHash := txsAux[0].Hash() - receipt := types.Receipt{ - Type: 0, - PostState: []byte{}, - Status: uint64(tx.Receipt.Status), - CumulativeGasUsed: cumulativeGasUsed, - //Bloom - //Logs - TxHash: txHash, - ContractAddress: tx.CreateAddress, - GasUsed: tx.Receipt.GasUsed, - BlockNumber: big.NewInt(0), - TransactionIndex: uint(i), - } - receipts = append(receipts, &receipt) - } - - return txs, receipts, nil -} - // CheckSupersetBatchTransactions verifies that processedTransactions is a // superset of existingTxs and that the existing txs have the same order, // returns a non-nil error if that is not the case. @@ -1600,6 +1557,80 @@ func (s *State) RegisterNewL2BlockEventHandler(h NewL2BlockEventHandler) { s.newL2BlockEventHandlers = append(s.newL2BlockEventHandlers, h) } +// StoreTransaction is used by the sequencer to add process a transaction +func (s *State) StoreTransaction(ctx context.Context, batchNumber uint64, processedTx *ProcessTransactionResponse, coinbase common.Address, timestamp uint64, dbTx pgx.Tx) error { + if dbTx == nil { + return ErrDBTxNil + } + + // Check if last batch is closed. Note that it's assumed that only the latest batch can be open + /* + isBatchClosed, err := s.PostgresStorage.IsBatchClosed(ctx, batchNumber, dbTx) + if err != nil { + return err + } + if isBatchClosed { + return ErrBatchAlreadyClosed + } + + processingContext, err := s.GetProcessingContext(ctx, batchNumber, dbTx) + if err != nil { + return err + } + */ + // if the transaction has an intrinsic invalid tx error it means + // the transaction has not changed the state, so we don't store it + if executor.IsIntrinsicError(executor.RomErrorCode(processedTx.RomError)) { + return nil + } + + lastL2Block, err := s.GetLastL2Block(ctx, dbTx) + if err != nil { + return err + } + + header := &types.Header{ + Number: new(big.Int).SetUint64(lastL2Block.Number().Uint64() + 1), + ParentHash: lastL2Block.Hash(), + Coinbase: coinbase, + Root: processedTx.StateRoot, + GasUsed: processedTx.GasUsed, + GasLimit: s.cfg.MaxCumulativeGasUsed, + Time: timestamp, + } + transactions := []*types.Transaction{&processedTx.Tx} + + receipt := generateReceipt(header.Number, processedTx) + receipts := []*types.Receipt{receipt} + + // Create block to be able to calculate its hash + block := types.NewBlock(header, transactions, []*types.Header{}, receipts, &trie.StackTrie{}) + block.ReceivedAt = time.Unix(int64(timestamp), 0) + + receipt.BlockHash = block.Hash() + + // Store L2 block and its transaction + if err := s.AddL2Block(ctx, batchNumber, block, receipts, dbTx); err != nil { + return err + } + + return nil +} + +// GetBalanceByStateRoot gets balance from the MT Service using the provided state root +func (s *State) GetBalanceByStateRoot(ctx context.Context, address common.Address, root common.Hash) (*big.Int, error) { + balance, err := s.tree.GetBalance(ctx, address, root.Bytes()) + if err != nil && balance == nil { + balance = big.NewInt(0) + } + return balance, err +} + +// GetNonceByStateRoot gets nonce from the MT Service using the provided state root +func (s *State) GetNonceByStateRoot(ctx context.Context, address common.Address, root common.Hash) (*big.Int, error) { + return s.tree.GetNonce(ctx, address, root.Bytes()) +} + // LogExecutorError is used to store Executor error for runtime debugging func (s *State) LogExecutorError(responseError pb.ExecutorError, processBatchRequest *pb.ProcessBatchRequest) { timestamp := time.Now() diff --git a/state/state_test.go b/state/state_test.go index 99233b2866..ded9a05c36 100644 --- a/state/state_test.go +++ b/state/state_test.go @@ -50,6 +50,7 @@ var ( stateCfg = state.Config{ MaxCumulativeGasUsed: 800000, ChainID: 1000, + CurrentForkID: 1, } executorClient executorclientpb.ExecutorServiceClient mtDBServiceClient mtDBclientpb.StateDBServiceClient @@ -145,7 +146,7 @@ func TestProcessCloseBatch(t *testing.T) { // BatchNumber: 1, // Coinbase: common.HexToAddress("1"), // Timestamp: time.Now().UTC(), - // GlobalExitRoot: common.HexToHash("a"), + // globalExitRoot: common.HexToHash("a"), // } // Txs for batch #1 // rawTxs := "f84901843b9aca00827b0c945fbdb2315678afecb367f032d93f642f64180aa380a46057361d00000000000000000000000000000000000000000000000000000000000000048203e9808073efe1fa2d3e27f26f32208550ea9b0274d49050b816cadab05a771f4275d0242fd5d92b3fb89575c070e6c930587c520ee65a3aa8cfe382fcad20421bf51d621c" @@ -210,6 +211,11 @@ func TestOpenCloseBatch(t *testing.T) { Tx: tx2, }, } + + data, err := state.EncodeTransactions([]types.Transaction{tx1, tx2}) + require.NoError(t, err) + receipt1.BatchL2Data = data + err = testState.StoreTransactions(ctx, 1, txsBatch1, dbTx) require.NoError(t, err) // Close batch #1 @@ -484,6 +490,7 @@ func TestExecuteTransaction(t *testing.T) { EthTimestamp: uint64(time.Now().Unix()), UpdateMerkleTree: 1, ChainId: stateCfg.ChainID, + ForkId: stateCfg.CurrentForkID, } log.Debugf("%v", processBatchRequest) @@ -848,7 +855,7 @@ func TestGenesis(t *testing.T) { } func TestExecutor(t *testing.T) { - var expectedNewRoot = "0x7dac9a0f9e7acd336c079f20e28e99da8d9e36afec969a424fb30edffb4ab238" + var expectedNewRoot = "0xa2b0ad9cc19e2a4aa9a6d7e14b15e5e951e319ed17b619878bec201b4d064c3e" db := map[string]string{ "2dc4db4293af236cb329700be43f08ace740a05088f8c7654736871709687e90": "00000000000000000000000000000000000000000000000000000000000000000d1f0da5a7b620c843fd1e18e59fd724d428d25da0cb1888e31f5542ac227c060000000000000000000000000000000000000000000000000000000000000000", @@ -870,6 +877,7 @@ func TestExecutor(t *testing.T) { UpdateMerkleTree: 0, Db: db, ChainId: stateCfg.ChainID, + ForkId: stateCfg.CurrentForkID, } processBatchResponse, err := executorClient.ProcessBatch(ctx, processBatchRequest) @@ -924,6 +932,7 @@ func TestExecutorRevert(t *testing.T) { EthTimestamp: uint64(time.Now().Unix()), UpdateMerkleTree: 0, ChainId: stateCfg.ChainID, + ForkId: stateCfg.CurrentForkID, } processBatchResponse, err := executorClient.ProcessBatch(ctx, processBatchRequest) @@ -987,6 +996,7 @@ func TestExecutorLogs(t *testing.T) { UpdateMerkleTree: 0, Db: genesisDB, ChainId: stateCfg.ChainID, + ForkId: stateCfg.CurrentForkID, } processBatchResponse, err := executorClient.ProcessBatch(ctx, processBatchRequest) @@ -1065,6 +1075,7 @@ func TestExecutorTransfer(t *testing.T) { EthTimestamp: uint64(0), UpdateMerkleTree: 1, ChainId: stateCfg.ChainID, + ForkId: stateCfg.CurrentForkID, } // Read Sender Balance before execution @@ -1090,6 +1101,20 @@ func TestExecutorTransfer(t *testing.T) { balance, err = stateTree.GetBalance(ctx, receiverAddress, processBatchResponse.Responses[0].StateRoot) require.NoError(t, err) require.Equal(t, uint64(21002), balance.Uint64()) + + // Read Modified Addresses directly from response + readWriteAddresses := processBatchResponse.ReadWriteAddresses + log.Debug(receiverAddress.String()) + data := readWriteAddresses[strings.ToLower(receiverAddress.String())] + require.Equal(t, "21002", data.Balance) + + // Read Modified Addresses from converted response + converted, err := testState.TestConvertToProcessBatchResponse([]types.Transaction{*signedTx}, processBatchResponse) + require.NoError(t, err) + convertedData := converted.ReadWriteAddresses[receiverAddress] + require.Equal(t, uint64(21002), convertedData.Balance.Uint64()) + require.Equal(t, receiverAddress, convertedData.Address) + require.Equal(t, (*uint64)(nil), convertedData.Nonce) } func TestExecutorTxHashAndRLP(t *testing.T) { @@ -1197,6 +1222,7 @@ func TestExecutorTxHashAndRLP(t *testing.T) { EthTimestamp: uint64(0), UpdateMerkleTree: 1, ChainId: stateCfg.ChainID, + ForkId: stateCfg.CurrentForkID, } // Process batch @@ -1305,6 +1331,7 @@ func TestExecutorInvalidNonce(t *testing.T) { EthTimestamp: uint64(0), UpdateMerkleTree: 1, ChainId: stateCfg.ChainID, + ForkId: stateCfg.CurrentForkID, } // Process batch @@ -1524,7 +1551,7 @@ func TestGenesisNewLeafType(t *testing.T) { // BatchNumber: tv.Traces.NumBatch, // Coinbase: common.HexToAddress(tv.Traces.SequencerAddr), // Timestamp: time.Unix(int64(tv.Traces.Timestamp), 0), -// GlobalExitRoot: common.HexToHash(tv.GlobalExitRoot), +// globalExitRoot: common.HexToHash(tv.globalExitRoot), // } // if strings.HasPrefix(tv.BatchL2Data, "0x") { // nolint @@ -1624,7 +1651,11 @@ func TestExecutorUnsignedTransactions(t *testing.T) { *signedTxFirstIncrement, *signedTxFirstRetrieve, } - processBatchResponse, err := testState.ProcessSequencerBatch(context.Background(), 1, signedTxs, dbTx, state.SequencerCallerLabel) + + batchL2Data, err := state.EncodeTransactions(signedTxs) + require.NoError(t, err) + + processBatchResponse, err := testState.ProcessSequencerBatch(context.Background(), 1, batchL2Data, state.SequencerCallerLabel, dbTx) require.NoError(t, err) // assert signed tx do deploy sc assert.Nil(t, processBatchResponse.Responses[0].RomError) @@ -1819,7 +1850,7 @@ func TestExecutorUniswapOutOfCounters(t *testing.T) { Coinbase: common.Address{}.String(), BatchL2Data: batchL2Data, OldStateRoot: stateRoot, - GlobalExitRoot: common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000"), + globalExitRoot: common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000"), OldLocalExitRoot: common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000"), EthTimestamp: uint64(0), UpdateMerkleTree: 1, @@ -1892,11 +1923,12 @@ func TestExecutorUniswapOutOfCounters(t *testing.T) { Coinbase: common.Address{}.String(), BatchL2Data: batchL2Data, OldStateRoot: stateRoot, - GlobalExitRoot: common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000"), + globalExitRoot: common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000"), OldLocalExitRoot: common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000"), EthTimestamp: uint64(0), UpdateMerkleTree: 1, ChainId: stateCfg.ChainID, + ForkId: stateCfg.CurrentForkID, } // Process batch @@ -1918,7 +1950,7 @@ func TestExecutorUniswapOutOfCounters(t *testing.T) { Coinbase: common.Address{}.String(), BatchL2Data: batchL2Data, OldStateRoot: processBatchResponse.NewStateRoot, - GlobalExitRoot: common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000"), + globalExitRoot: common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000"), OldLocalExitRoot: common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000"), EthTimestamp: uint64(0), UpdateMerkleTree: 1, @@ -2033,6 +2065,7 @@ func TestExecutorEstimateGas(t *testing.T) { EthTimestamp: uint64(time.Now().Unix()), UpdateMerkleTree: 0, ChainId: stateCfg.ChainID, + ForkId: stateCfg.CurrentForkID, } processBatchResponse, err := executorClient.ProcessBatch(ctx, processBatchRequest) @@ -2174,11 +2207,12 @@ func TestExecutorGasRefund(t *testing.T) { Coinbase: sequencerAddress.String(), BatchL2Data: batchL2Data, OldStateRoot: stateRoot, - GlobalExitRoot: common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000"), + globalExitRoot: common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000"), OldLocalExitRoot: common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000"), EthTimestamp: uint64(time.Now().Unix()), UpdateMerkleTree: 1, ChainId: stateCfg.ChainID, + ForkId: stateCfg.CurrentForkID, } processBatchResponse, err := executorClient.ProcessBatch(ctx, processBatchRequest) @@ -2199,7 +2233,7 @@ func TestExecutorGasRefund(t *testing.T) { BatchNumber: processBatchRequest.BatchNum, Coinbase: common.Address{}, Timestamp: time.Now(), - GlobalExitRoot: common.BytesToHash(processBatchRequest.GlobalExitRoot), + globalExitRoot: common.BytesToHash(processBatchRequest.globalExitRoot), } err = testState.OpenBatch(ctx, processingContext, dbTx) @@ -2239,11 +2273,12 @@ func TestExecutorGasRefund(t *testing.T) { Coinbase: sequencerAddress.String(), BatchL2Data: batchL2Data, OldStateRoot: processBatchResponse.NewStateRoot, - GlobalExitRoot: common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000"), + globalExitRoot: common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000"), OldLocalExitRoot: common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000"), EthTimestamp: uint64(time.Now().Unix()), UpdateMerkleTree: 1, ChainId: stateCfg.ChainID, + ForkId: stateCfg.CurrentForkID, } processBatchResponse, err = executorClient.ProcessBatch(ctx, processBatchRequest) @@ -2378,6 +2413,7 @@ func TestExecutorGasEstimationMultisig(t *testing.T) { EthTimestamp: uint64(time.Now().Unix()), UpdateMerkleTree: 1, ChainId: stateCfg.ChainID, + ForkId: stateCfg.CurrentForkID, } processBatchResponse, err := executorClient.ProcessBatch(ctx, processBatchRequest) @@ -2461,6 +2497,7 @@ func TestExecutorGasEstimationMultisig(t *testing.T) { EthTimestamp: uint64(time.Now().Unix()), UpdateMerkleTree: 1, ChainId: stateCfg.ChainID, + ForkId: stateCfg.CurrentForkID, } processBatchResponse, err = executorClient.ProcessBatch(ctx, processBatchRequest) @@ -2601,6 +2638,7 @@ func TestStoreDebugInfo(t *testing.T) { UpdateMerkleTree: 0, Db: db, ChainId: stateCfg.ChainID, + ForkId: stateCfg.CurrentForkID, } _, err := executorClient.ProcessBatch(ctx, processBatchRequest) diff --git a/state/transaction.go b/state/transaction.go index 616ef27175..90c7467737 100644 --- a/state/transaction.go +++ b/state/transaction.go @@ -32,45 +32,47 @@ func GetSender(tx types.Transaction) (common.Address, error) { // [6] V *big.Int // [7] R *big.Int // [8] S *big.Int -func RlpFieldsToLegacyTx(fields [][]byte) (tx *types.LegacyTx, chainID *big.Int, err error) { +func RlpFieldsToLegacyTx(fields [][]byte, v, r, s []byte) (tx *types.LegacyTx, err error) { const ( fieldsSizeWithoutChainID = 6 - fieldsSizeWithV = 7 - fieldsSizeWithVR = 8 - fieldsSizeWithVRS = 9 + fieldsSizeWithChainID = 7 ) - if len(fields) != fieldsSizeWithoutChainID && len(fields) != fieldsSizeWithV && len(fields) != fieldsSizeWithVRS { - return nil, nil, types.ErrTxTypeNotSupported + if len(fields) < fieldsSizeWithoutChainID { + return nil, types.ErrTxTypeNotSupported } nonce := big.NewInt(0).SetBytes(fields[0]).Uint64() gasPrice := big.NewInt(0).SetBytes(fields[1]) gas := big.NewInt(0).SetBytes(fields[2]).Uint64() var to *common.Address - if fields[3] != nil { + + if fields[3] != nil && len(fields[3]) != 0 { tmp := common.BytesToAddress(fields[3]) to = &tmp } value := big.NewInt(0).SetBytes(fields[4]) data := fields[5] - v := big.NewInt(0) - if len(fields) >= fieldsSizeWithV { - v = big.NewInt(0).SetBytes(fields[6]) - chainID = big.NewInt(0).Sub(v, big.NewInt(0).SetUint64(etherPre155V)) - chainID = big.NewInt(0).Quo(chainID, big.NewInt(double)) - } + txV := big.NewInt(0).SetBytes(v) + if len(fields) >= fieldsSizeWithChainID { + chainID := big.NewInt(0).SetBytes(fields[6]) - r := big.NewInt(0) - if len(fields) >= fieldsSizeWithVR { - r = big.NewInt(0).SetBytes(fields[7]) + // a = chainId * 2 + // b = v - 27 + // c = a + 35 + // v = b + c + // + // same as: + // v = v-27+chainId*2+35 + a := new(big.Int).Mul(chainID, big.NewInt(double)) + b := new(big.Int).Sub(new(big.Int).SetBytes(v), big.NewInt(ether155V)) + c := new(big.Int).Add(a, big.NewInt(etherPre155V)) + txV = new(big.Int).Add(b, c) } - s := big.NewInt(0) - if len(fields) >= fieldsSizeWithVRS { - s = big.NewInt(0).SetBytes(fields[8]) - } + txR := big.NewInt(0).SetBytes(r) + txS := big.NewInt(0).SetBytes(s) return &types.LegacyTx{ Nonce: nonce, @@ -79,8 +81,8 @@ func RlpFieldsToLegacyTx(fields [][]byte) (tx *types.LegacyTx, chainID *big.Int, To: to, Value: value, Data: data, - V: v, - R: r, - S: s, - }, chainID, nil + V: txV, + R: txR, + S: txS, + }, nil } diff --git a/state/types.go b/state/types.go index 4c394b02d5..39ffe975b6 100644 --- a/state/types.go +++ b/state/types.go @@ -1,6 +1,7 @@ package state import ( + "fmt" "math/big" "time" @@ -9,6 +10,18 @@ import ( "github.com/ethereum/go-ethereum/core/types" ) +// ProcessRequest represents the request of a batch process. +type ProcessRequest struct { + BatchNumber uint64 + GlobalExitRoot common.Hash + OldStateRoot common.Hash + OldAccInputHash common.Hash + Transactions []byte + Coinbase common.Address + Timestamp uint64 + Caller CallerLabel +} + // ProcessBatchResponse represents the response of a batch process. type ProcessBatchResponse struct { NewStateRoot common.Hash @@ -19,7 +32,7 @@ type ProcessBatchResponse struct { Responses []*ProcessTransactionResponse ExecutorError error IsBatchProcessed bool - ReadWriteAddresses []*InfoReadWrite + ReadWriteAddresses map[common.Address]*InfoReadWrite } // ProcessTransactionResponse represents the response of a tx process. @@ -67,6 +80,58 @@ type ZKCounters struct { UsedSteps uint32 } +// SumUp sum ups zk counters with passed tx zk counters +func (z *ZKCounters) SumUp(other ZKCounters) { + z.CumulativeGasUsed += other.CumulativeGasUsed + z.UsedKeccakHashes += other.UsedKeccakHashes + z.UsedPoseidonHashes += other.UsedPoseidonHashes + z.UsedPoseidonPaddings += other.UsedPoseidonPaddings + z.UsedMemAligns += other.UsedMemAligns + z.UsedArithmetics += other.UsedArithmetics + z.UsedBinaries += other.UsedBinaries + z.UsedSteps += other.UsedSteps +} + +// Sub subtract zk counters with passed zk counters (not safe) +func (z *ZKCounters) Sub(other ZKCounters) error { + // ZKCounters + if other.CumulativeGasUsed > z.CumulativeGasUsed { + return GetZKCounterError("CumulativeGasUsed") + } + if other.UsedKeccakHashes > z.UsedKeccakHashes { + return GetZKCounterError("UsedKeccakHashes") + } + if other.UsedPoseidonHashes > z.UsedPoseidonHashes { + return GetZKCounterError("UsedPoseidonHashes") + } + if other.UsedPoseidonPaddings > z.UsedPoseidonPaddings { + return fmt.Errorf("underflow ZKCounter: UsedPoseidonPaddings") + } + if other.UsedMemAligns > z.UsedMemAligns { + return GetZKCounterError("UsedMemAligns") + } + if other.UsedArithmetics > z.UsedArithmetics { + return GetZKCounterError("UsedArithmetics") + } + if other.UsedBinaries > z.UsedBinaries { + return GetZKCounterError("UsedBinaries") + } + if other.UsedSteps > z.UsedSteps { + return GetZKCounterError("UsedSteps") + } + + z.CumulativeGasUsed -= other.CumulativeGasUsed + z.UsedKeccakHashes -= other.UsedKeccakHashes + z.UsedPoseidonHashes -= other.UsedPoseidonHashes + z.UsedPoseidonPaddings -= other.UsedPoseidonPaddings + z.UsedMemAligns -= other.UsedMemAligns + z.UsedArithmetics -= other.UsedArithmetics + z.UsedBinaries -= other.UsedBinaries + z.UsedSteps -= other.UsedSteps + + return nil +} + // InfoReadWrite has information about modified addresses during the execution type InfoReadWrite struct { Address common.Address diff --git a/synchronizer/interfaces.go b/synchronizer/interfaces.go index a428793d15..a288ac8a8c 100644 --- a/synchronizer/interfaces.go +++ b/synchronizer/interfaces.go @@ -41,13 +41,14 @@ type stateInterface interface { SetGenesis(ctx context.Context, block state.Block, genesis state.Genesis, dbTx pgx.Tx) ([]byte, error) OpenBatch(ctx context.Context, processingContext state.ProcessingContext, dbTx pgx.Tx) error CloseBatch(ctx context.Context, receipt state.ProcessingReceipt, dbTx pgx.Tx) error - ProcessSequencerBatch(ctx context.Context, batchNumber uint64, txs []types.Transaction, dbTx pgx.Tx, caller state.CallerLabel) (*state.ProcessBatchResponse, error) + ProcessSequencerBatch(ctx context.Context, batchNumber uint64, batchL2Data []byte, caller state.CallerLabel, dbTx pgx.Tx) (*state.ProcessBatchResponse, error) StoreTransactions(ctx context.Context, batchNum uint64, processedTxs []*state.ProcessTransactionResponse, dbTx pgx.Tx) error GetStateRootByBatchNumber(ctx context.Context, batchNum uint64, dbTx pgx.Tx) (common.Hash, error) - ExecuteBatch(ctx context.Context, batchNumber uint64, batchL2Data []byte, dbTx pgx.Tx) (*pb.ProcessBatchResponse, error) + ExecuteBatch(ctx context.Context, batch state.Batch, dbTx pgx.Tx) (*pb.ProcessBatchResponse, error) GetLastVerifiedBatch(ctx context.Context, dbTx pgx.Tx) (*state.VerifiedBatch, error) GetLastVirtualBatchNum(ctx context.Context, dbTx pgx.Tx) (uint64, error) AddSequence(ctx context.Context, sequence state.Sequence, dbTx pgx.Tx) error + AddAccumulatedInputHash(ctx context.Context, batchNum uint64, accInputHash common.Hash, dbTx pgx.Tx) error BeginStateTransaction(ctx context.Context) (pgx.Tx, error) } diff --git a/synchronizer/mock_state.go b/synchronizer/mock_state.go index d857362cd7..8ac833d0fc 100644 --- a/synchronizer/mock_state.go +++ b/synchronizer/mock_state.go @@ -14,8 +14,6 @@ import ( pgx "github.com/jackc/pgx/v4" state "github.com/0xPolygonHermez/zkevm-node/state" - - types "github.com/ethereum/go-ethereum/core/types" ) // stateMock is an autogenerated mock type for the stateInterface type @@ -23,6 +21,20 @@ type stateMock struct { mock.Mock } +// AddAccumulatedInputHash provides a mock function with given fields: ctx, batchNum, accInputHash, dbTx +func (_m *stateMock) AddAccumulatedInputHash(ctx context.Context, batchNum uint64, accInputHash common.Hash, dbTx pgx.Tx) error { + ret := _m.Called(ctx, batchNum, accInputHash, dbTx) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, uint64, common.Hash, pgx.Tx) error); ok { + r0 = rf(ctx, batchNum, accInputHash, dbTx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + // AddBlock provides a mock function with given fields: ctx, block, dbTx func (_m *stateMock) AddBlock(ctx context.Context, block *state.Block, dbTx pgx.Tx) error { ret := _m.Called(ctx, block, dbTx) @@ -144,13 +156,13 @@ func (_m *stateMock) CloseBatch(ctx context.Context, receipt state.ProcessingRec return r0 } -// ExecuteBatch provides a mock function with given fields: ctx, batchNumber, batchL2Data, dbTx -func (_m *stateMock) ExecuteBatch(ctx context.Context, batchNumber uint64, batchL2Data []byte, dbTx pgx.Tx) (*pb.ProcessBatchResponse, error) { - ret := _m.Called(ctx, batchNumber, batchL2Data, dbTx) +// ExecuteBatch provides a mock function with given fields: ctx, batch, dbTx +func (_m *stateMock) ExecuteBatch(ctx context.Context, batch state.Batch, dbTx pgx.Tx) (*pb.ProcessBatchResponse, error) { + ret := _m.Called(ctx, batch, dbTx) var r0 *pb.ProcessBatchResponse - if rf, ok := ret.Get(0).(func(context.Context, uint64, []byte, pgx.Tx) *pb.ProcessBatchResponse); ok { - r0 = rf(ctx, batchNumber, batchL2Data, dbTx) + if rf, ok := ret.Get(0).(func(context.Context, state.Batch, pgx.Tx) *pb.ProcessBatchResponse); ok { + r0 = rf(ctx, batch, dbTx) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*pb.ProcessBatchResponse) @@ -158,8 +170,8 @@ func (_m *stateMock) ExecuteBatch(ctx context.Context, batchNumber uint64, batch } var r1 error - if rf, ok := ret.Get(1).(func(context.Context, uint64, []byte, pgx.Tx) error); ok { - r1 = rf(ctx, batchNumber, batchL2Data, dbTx) + if rf, ok := ret.Get(1).(func(context.Context, state.Batch, pgx.Tx) error); ok { + r1 = rf(ctx, batch, dbTx) } else { r1 = ret.Error(1) } @@ -375,13 +387,13 @@ func (_m *stateMock) ProcessAndStoreClosedBatch(ctx context.Context, processingC return r0 } -// ProcessSequencerBatch provides a mock function with given fields: ctx, batchNumber, txs, dbTx, caller -func (_m *stateMock) ProcessSequencerBatch(ctx context.Context, batchNumber uint64, txs []types.Transaction, dbTx pgx.Tx, caller state.CallerLabel) (*state.ProcessBatchResponse, error) { - ret := _m.Called(ctx, batchNumber, txs, dbTx, caller) +// ProcessSequencerBatch provides a mock function with given fields: ctx, batchNumber, batchL2Data, caller, dbTx +func (_m *stateMock) ProcessSequencerBatch(ctx context.Context, batchNumber uint64, batchL2Data []byte, caller state.CallerLabel, dbTx pgx.Tx) (*state.ProcessBatchResponse, error) { + ret := _m.Called(ctx, batchNumber, batchL2Data, caller, dbTx) var r0 *state.ProcessBatchResponse - if rf, ok := ret.Get(0).(func(context.Context, uint64, []types.Transaction, pgx.Tx, state.CallerLabel) *state.ProcessBatchResponse); ok { - r0 = rf(ctx, batchNumber, txs, dbTx, caller) + if rf, ok := ret.Get(0).(func(context.Context, uint64, []byte, state.CallerLabel, pgx.Tx) *state.ProcessBatchResponse); ok { + r0 = rf(ctx, batchNumber, batchL2Data, caller, dbTx) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*state.ProcessBatchResponse) @@ -389,8 +401,8 @@ func (_m *stateMock) ProcessSequencerBatch(ctx context.Context, batchNumber uint } var r1 error - if rf, ok := ret.Get(1).(func(context.Context, uint64, []types.Transaction, pgx.Tx, state.CallerLabel) error); ok { - r1 = rf(ctx, batchNumber, txs, dbTx, caller) + if rf, ok := ret.Get(1).(func(context.Context, uint64, []byte, state.CallerLabel, pgx.Tx) error); ok { + r1 = rf(ctx, batchNumber, batchL2Data, caller, dbTx) } else { r1 = ret.Error(1) } diff --git a/synchronizer/synchronizer.go b/synchronizer/synchronizer.go index 8e47c06c3a..5714b0b823 100644 --- a/synchronizer/synchronizer.go +++ b/synchronizer/synchronizer.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "math/big" + "strings" "time" "github.com/0xPolygonHermez/zkevm-node/etherman" @@ -527,41 +528,31 @@ func (s *ClientSynchronizer) Stop() { s.cancelCtx() } -func (s *ClientSynchronizer) checkTrustedState(batch state.Batch, dbTx pgx.Tx) (bool, error) { - // First get trusted batch from db - tBatch, err := s.state.GetBatchByNumber(s.ctx, batch.BatchNumber, dbTx) - if err != nil { - return false, err +func (s *ClientSynchronizer) checkTrustedState(batch state.Batch, tBatch *state.Batch, newRoot common.Hash, dbTx pgx.Tx) bool { + //Compare virtual state with trusted state + var reorgReasons strings.Builder + if hex.EncodeToString(batch.BatchL2Data) != hex.EncodeToString(tBatch.BatchL2Data) { + reorgReasons.WriteString(fmt.Sprintf("Different field BatchL2Data. Virtual: %s, Trusted: %s\n", hex.EncodeToString(batch.BatchL2Data), hex.EncodeToString(tBatch.BatchL2Data))) } - - // Reprocess batch and compare the stateRoot with tBatch.StateRoot - p, err := s.state.ExecuteBatch(s.ctx, batch.BatchNumber, batch.BatchL2Data, dbTx) - if err != nil { - log.Errorf("error executing L1 batch: %+v, error: %w", batch, err) - return false, err + if batch.GlobalExitRoot.String() != tBatch.GlobalExitRoot.String() { + reorgReasons.WriteString(fmt.Sprintf("Different field GlobalExitRoot. Virtual: %s, Trusted: %s\n", batch.GlobalExitRoot.String(), tBatch.GlobalExitRoot.String())) + } + if batch.Timestamp.Unix() != tBatch.Timestamp.Unix() { + reorgReasons.WriteString(fmt.Sprintf("Different field Timestamp. Virtual: %d, Trusted: %d\n", batch.Timestamp.Unix(), tBatch.Timestamp.Unix())) + } + if batch.Coinbase.String() != tBatch.Coinbase.String() { + reorgReasons.WriteString(fmt.Sprintf("Different field Coinbase. Virtual: %s, Trusted: %s\n", batch.Coinbase.String(), tBatch.Coinbase.String())) + } + if newRoot != tBatch.StateRoot { + reorgReasons.WriteString(fmt.Sprintf("Different field StateRoot. Virtual: %s, Trusted: %s\n", newRoot.String(), tBatch.StateRoot.String())) } - newRoot := common.BytesToHash(p.NewStateRoot) - //Compare virtual state with trusted state - if hex.EncodeToString(batch.BatchL2Data) == hex.EncodeToString(tBatch.BatchL2Data) && - batch.GlobalExitRoot.String() == tBatch.GlobalExitRoot.String() && - batch.Timestamp.Unix() == tBatch.Timestamp.Unix() && - batch.Coinbase.String() == tBatch.Coinbase.String() && - newRoot == tBatch.StateRoot { - return true, nil + if reorgReasons.Len() > 0 { + log.Warnf("Trusted Reorg detected for Batch Number: %d.\nReasons: %s", tBatch.BatchNumber, reorgReasons.String()) + return true } - log.Warn("Trusted Reorg detected") - log.Debug("batch.BatchL2Data: ", hex.EncodeToString(batch.BatchL2Data)) - log.Debug("batch.GlobalExitRoot: ", batch.GlobalExitRoot) - log.Debug("batch.Timestamp: ", batch.Timestamp) - log.Debug("batch.Coinbase: ", batch.Coinbase) - log.Debug("newRoot: ", newRoot) - log.Debug("tBatch.BatchL2Data: ", hex.EncodeToString(tBatch.BatchL2Data)) - log.Debug("tBatch.GlobalExitRoot: ", tBatch.GlobalExitRoot) - log.Debug("tBatch.Timestamp: ", tBatch.Timestamp) - log.Debug("tBatch.Coinbase: ", tBatch.Coinbase) - log.Debug("tBatch.StateRoot: ", tBatch.StateRoot) - return false, nil + + return false } func (s *ClientSynchronizer) processSequenceBatches(sequencedBatches []etherman.SequencedBatch, blockNumber uint64, dbTx pgx.Tx) error { @@ -571,10 +562,11 @@ func (s *ClientSynchronizer) processSequenceBatches(sequencedBatches []etherman. } for _, sbatch := range sequencedBatches { virtualBatch := state.VirtualBatch{ - BatchNumber: sbatch.BatchNumber, - TxHash: sbatch.TxHash, - Coinbase: sbatch.Coinbase, - BlockNumber: blockNumber, + BatchNumber: sbatch.BatchNumber, + TxHash: sbatch.TxHash, + Coinbase: sbatch.Coinbase, + BlockNumber: blockNumber, + SequencerAddr: sbatch.SequencerAddr, } batch := state.Batch{ BatchNumber: sbatch.BatchNumber, @@ -629,8 +621,22 @@ func (s *ClientSynchronizer) processSequenceBatches(sequencedBatches []etherman. GlobalExitRoot: batch.GlobalExitRoot, ForcedBatchNum: batch.ForcedBatchNum, } - // Call the check trusted state method to compare trusted and virtual state - status, err := s.checkTrustedState(batch, dbTx) + + // Reprocess batch to compare the stateRoot with tBatch.StateRoot and get accInputHash + p, err := s.state.ExecuteBatch(s.ctx, batch, dbTx) + if err != nil { + log.Errorf("error executing L1 batch: %+v, error: %w", batch, err) + rollbackErr := dbTx.Rollback(s.ctx) + if rollbackErr != nil { + log.Fatalf("error rolling back state. BatchNumber: %d, BlockNumber: %d, rollbackErr: %s, error : %w", batch.BatchNumber, blockNumber, rollbackErr.Error(), err) + } + log.Fatalf("error executing L1 batch: %+v, error: %w", batch, err) + } + newRoot := common.BytesToHash(p.NewStateRoot) + accumulatedInputHash := common.BytesToHash(p.NewAccInputHash) + + // First get trusted batch from db + tBatch, err := s.state.GetBatchByNumber(s.ctx, batch.BatchNumber, dbTx) if err != nil { if errors.Is(err, state.ErrNotFound) || errors.Is(err, state.ErrStateNotSynchronized) { log.Debugf("BatchNumber: %d, not found in trusted state. Storing it...", batch.BatchNumber) @@ -646,7 +652,7 @@ func (s *ClientSynchronizer) processSequenceBatches(sequencedBatches []etherman. log.Errorf("error storing batch. BatchNumber: %d, BlockNumber: %d, error: %w", batch.BatchNumber, blockNumber, err) return err } - status = true + tBatch = &batch } else { log.Error("error checking trusted state: ", err) rollbackErr := dbTx.Rollback(s.ctx) @@ -656,8 +662,23 @@ func (s *ClientSynchronizer) processSequenceBatches(sequencedBatches []etherman. } return err } + } else { + //AddAccumulatedInputHash + err = s.state.AddAccumulatedInputHash(s.ctx, batch.BatchNumber, accumulatedInputHash, dbTx) + if err != nil { + log.Errorf("error adding accumulatedInputHash for batch: %d. Error; %w", batch.BatchNumber, err) + rollbackErr := dbTx.Rollback(s.ctx) + if rollbackErr != nil { + log.Errorf("error rolling back state. BatchNumber: %d, BlockNumber: %d, rollbackErr: %w", batch.BatchNumber, blockNumber, rollbackErr) + return rollbackErr + } + return err + } } - if !status { + + // Call the check trusted state method to compare trusted and virtual state + status := s.checkTrustedState(batch, tBatch, newRoot, dbTx) + if status { // Reset trusted state previousBatchNumber := batch.BatchNumber - 1 log.Warnf("Trusted reorg detected, discarding batches until batchNum %d", previousBatchNumber) @@ -684,6 +705,7 @@ func (s *ClientSynchronizer) processSequenceBatches(sequencedBatches []etherman. return err } } + // Store virtualBatch err = s.state.AddVirtualBatch(s.ctx, &virtualBatch, dbTx) if err != nil { @@ -781,10 +803,11 @@ func (s *ClientSynchronizer) processSequenceForceBatch(sequenceForceBatch []ethe return fmt.Errorf("error: forcedBatch received doesn't match with the next expected forcedBatch stored in db. Expected: %+v, Synced: %+v", forcedBatches[i], fbatch) } virtualBatch := state.VirtualBatch{ - BatchNumber: fbatch.BatchNumber, - TxHash: fbatch.TxHash, - Coinbase: fbatch.Coinbase, - BlockNumber: block.BlockNumber, + BatchNumber: fbatch.BatchNumber, + TxHash: fbatch.TxHash, + Coinbase: fbatch.Coinbase, + SequencerAddr: fbatch.Coinbase, + BlockNumber: block.BlockNumber, } batch := state.ProcessingContext{ BatchNumber: fbatch.BatchNumber, @@ -871,7 +894,7 @@ func (s *ClientSynchronizer) processGlobalExitRoot(globalExitRoot etherman.Globa } err := s.state.AddGlobalExitRoot(s.ctx, &ger, dbTx) if err != nil { - log.Errorf("error storing the GlobalExitRoot in processGlobalExitRoot. BlockNumber: %d", globalExitRoot.BlockNumber) + log.Errorf("error storing the globalExitRoot in processGlobalExitRoot. BlockNumber: %d", globalExitRoot.BlockNumber) rollbackErr := dbTx.Rollback(s.ctx) if rollbackErr != nil { log.Errorf("error rolling back state. BlockNumber: %d, rollbackErr: %s, error : %w", globalExitRoot.BlockNumber, rollbackErr.Error(), err) @@ -1009,7 +1032,7 @@ func (s *ClientSynchronizer) processTrustedBatch(trustedBatch *pb.GetBatchRespon log.Debugf("processing sequencer for batch %v", trustedBatch.BatchNumber) - processBatchResp, err := s.state.ProcessSequencerBatch(s.ctx, trustedBatch.BatchNumber, txs, dbTx, state.SynchronizerCallerLabel) + processBatchResp, err := s.state.ProcessSequencerBatch(s.ctx, trustedBatch.BatchNumber, trustedBatchL2Data, state.SynchronizerCallerLabel, dbTx) if err != nil { log.Errorf("error processing sequencer batch for batch: %d", trustedBatch.BatchNumber) return err diff --git a/synchronizer/synchronizer_test.go b/synchronizer/synchronizer_test.go index 88306d3c09..1bc99473a3 100644 --- a/synchronizer/synchronizer_test.go +++ b/synchronizer/synchronizer_test.go @@ -73,6 +73,7 @@ func TestTrustedStateReorg(t *testing.T) { Return(ethHeader, nil). Once() + t := time.Now() sequencedBatch := etherman.SequencedBatch{ BatchNumber: uint64(1), Coinbase: common.HexToAddress("0x222"), @@ -80,7 +81,7 @@ func TestTrustedStateReorg(t *testing.T) { PolygonZkEVMBatchData: polygonzkevm.PolygonZkEVMBatchData{ Transactions: []byte{}, GlobalExitRoot: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, - Timestamp: uint64(time.Now().Unix()), + Timestamp: uint64(t.Unix()), MinForcedTimestamp: 0, }, } @@ -131,10 +132,19 @@ func TestTrustedStateReorg(t *testing.T) { Return(trustedBatch, nil). Once() - m.State. //ExecuteBatch(s.ctx, batch.BatchNumber, batch.BatchL2Data, dbTx - On("ExecuteBatch", ctx, sequencedBatch.BatchNumber, sequencedBatch.Transactions, m.DbTx). - Return(&pb.ProcessBatchResponse{NewStateRoot: trustedBatch.StateRoot.Bytes()}, nil). - Once() + sbatch := state.Batch{ + BatchNumber: sequencedBatch.BatchNumber, + Coinbase: common.HexToAddress("0x222"), + BatchL2Data: []byte{}, + Timestamp: time.Unix(int64(t.Unix()), 0), + Transactions: nil, + GlobalExitRoot: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, + ForcedBatchNum: nil, + } + m.State. + On("ExecuteBatch", ctx, sbatch, m.DbTx). + Return(&pb.ProcessBatchResponse{NewStateRoot: trustedBatch.StateRoot.Bytes()}, nil). + Once() seq := state.Sequence{ FromBatchNumber: 1, @@ -145,6 +155,11 @@ func TestTrustedStateReorg(t *testing.T) { Return(nil). Once() + m.State. + On("AddAccumulatedInputHash", ctx, sequencedBatch.BatchNumber, common.Hash{}, m.DbTx). + Return(nil). + Once() + m.State. On("ResetTrustedState", ctx, sequencedBatch.BatchNumber-1, m.DbTx). Return(nil). @@ -311,14 +326,16 @@ func TestForcedBatch(t *testing.T) { Return(ethHeader, nil). Once() + t := time.Now() sequencedBatch := etherman.SequencedBatch{ - BatchNumber: uint64(2), - Coinbase: common.HexToAddress("0x222"), - TxHash: common.HexToHash("0x333"), + BatchNumber: uint64(2), + Coinbase: common.HexToAddress("0x222"), + SequencerAddr: common.HexToAddress("0x00"), + TxHash: common.HexToHash("0x333"), PolygonZkEVMBatchData: polygonzkevm.PolygonZkEVMBatchData{ Transactions: []byte{}, GlobalExitRoot: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, - Timestamp: uint64(time.Now().Unix()), + Timestamp: uint64(t.Unix()), MinForcedTimestamp: 1000, //ForcedBatch }, } @@ -407,8 +424,18 @@ func TestForcedBatch(t *testing.T) { Return(trustedBatch, nil). Once() + var forced uint64 = 1 + sbatch := state.Batch{ + BatchNumber: sequencedBatch.BatchNumber, + Coinbase: common.HexToAddress("0x222"), + BatchL2Data: []byte{}, + Timestamp: time.Unix(int64(t.Unix()), 0), + Transactions: nil, + GlobalExitRoot: [32]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, + ForcedBatchNum: &forced, + } m.State. //ExecuteBatch(s.ctx, batch.BatchNumber, batch.BatchL2Data, dbTx - On("ExecuteBatch", ctx, sequencedBatch.BatchNumber, sequencedBatch.Transactions, m.DbTx). + On("ExecuteBatch", ctx, sbatch, m.DbTx). Return(&pb.ProcessBatchResponse{NewStateRoot: trustedBatch.StateRoot.Bytes()}, nil). Once() @@ -433,6 +460,11 @@ func TestForcedBatch(t *testing.T) { Return(nil). Once() + m.State. + On("AddAccumulatedInputHash", ctx, sequencedBatch.BatchNumber, common.Hash{}, m.DbTx). + Return(nil). + Once() + m.DbTx. On("Commit", ctx). Run(func(args mock.Arguments) { sync.Stop() }). @@ -614,10 +646,11 @@ func TestSequenceForcedBatch(t *testing.T) { Once() virtualBatch := &state.VirtualBatch{ - BatchNumber: sequencedForceBatch.BatchNumber, - TxHash: sequencedForceBatch.TxHash, - Coinbase: sequencedForceBatch.Coinbase, - BlockNumber: ethermanBlock.BlockNumber, + BatchNumber: sequencedForceBatch.BatchNumber, + TxHash: sequencedForceBatch.TxHash, + Coinbase: sequencedForceBatch.Coinbase, + SequencerAddr: sequencedForceBatch.Coinbase, + BlockNumber: ethermanBlock.BlockNumber, } m.State. diff --git a/test/Makefile b/test/Makefile index 6412b28a69..760da5aa93 100644 --- a/test/Makefile +++ b/test/Makefile @@ -137,8 +137,8 @@ test-e2e-group-4: stop ## Runs group 4 e2e tests checking race conditions docker logs $(DOCKERCOMPOSEZKPROVER) trap '$(STOP)' EXIT; MallocNanoZone=0 go test -count=1 -race -v -p 1 -timeout 600s ../ci/e2e-group4/... -.PHONY: benchmark-sequencer -benchmark-sequencer: stop +.PHONY: benchmark-sequencer-eth-transfers +benchmark-sequencer-eth-transfers: stop $(RUNL1NETWORK) $(RUNSTATEDB) $(RUNPOOLDB) @@ -150,7 +150,25 @@ benchmark-sequencer: stop $(RUNJSONRPC) docker ps -a docker logs $(DOCKERCOMPOSEZKPROVER) - @ cd benchmarks/sequencer ; \ + @ cd benchmarks/sequencer/eth-transfers ; \ + mkdir -p results ; \ + touch ./results/out.dat ; \ + go test -bench=. -timeout=600m | tee ./results/out.dat ; + +.PHONY: benchmark-sequencer-erc20-transfers +benchmark-sequencer-erc20-transfers: stop + $(RUNL1NETWORK) + $(RUNSTATEDB) + $(RUNPOOLDB) + sleep 5 + $(RUNZKPROVER) + $(RUNSYNC) + sleep 2 + $(RUNL2GASPRICER) + $(RUNJSONRPC) + docker ps -a + docker logs $(DOCKERCOMPOSEZKPROVER) + @ cd benchmarks/sequencer/erc20-transfers ; \ mkdir -p results ; \ touch ./results/out.dat ; \ go test -bench=. -timeout=600m | tee ./results/out.dat ; @@ -386,12 +404,11 @@ generate-mocks: ## Generates mocks for the tests, using mockery tool mockery --name=stateInterface --dir=../jsonrpc --output=../jsonrpc --outpkg=jsonrpc --inpackage --structname=stateMock --filename=mock_state_test.go mockery --name=Tx --srcpkg=github.com/jackc/pgx/v4 --output=../jsonrpc --outpkg=jsonrpc --structname=dbTxMock --filename=mock_dbtx_test.go - mockery --name=ethTxManager --dir=../sequencer --output=../sequencer/mocks --outpkg=mocks --structname=EthTxManager --filename=mock_ethtxmanager.go - mockery --name=etherman --dir=../sequencer --output=../sequencer/mocks --outpkg=mocks --structname=EthermanMock --filename=mock_etherman.go - mockery --name=stateInterface --dir=../sequencer --output=../sequencer/mocks --outpkg=mocks --structname=StateMock --filename=mock_state.go - mockery --name=txPool --dir=../sequencer --output=../sequencer/mocks --outpkg=mocks --structname=PoolMock --filename=mock_pool.go - mockery --name=Tx --srcpkg=github.com/jackc/pgx/v4 --output=../sequencer/mocks --outpkg=mocks --structname=DbTxMock --filename=mock_dbtx.go - mockery --name=etherman --dir=../sequencer/profitabilitychecker --output=../sequencer/profitabilitychecker/mocks --outpkg=mocks --structname=EthermanMock --filename=mock_etherman.go + mockery --name=workerInterface --dir=../sequencer --output=../sequencer --outpkg=sequencer --inpackage --structname=WorkerMock --filename=mock_worker.go + mockery --name=stateInterface --dir=../sequencer --output=../sequencer --outpkg=sequencer --inpackage --structname=StateMock --filename=mock_state.go + mockery --name=txPool --dir=../sequencer --output=../sequencer --outpkg=sequencer --inpackage --structname=PoolMock --filename=mock_pool.go + mockery --name=Tx --srcpkg=github.com/jackc/pgx/v4 --output=../sequencer --outpkg=sequencer --structname=DbTxMock --filename=mock_dbtx.go + mockery --name=dbManagerInterface --dir=../sequencer --output=../sequencer --outpkg=sequencer --inpackage --structname=DbManagerMock --filename=mock_db_manager.go mockery --name=stateInterface --dir=../sequencer/broadcast --output=../sequencer/broadcast/mocks --outpkg=mocks --structname=StateMock --filename=mock_state.go mockery --name=ethermanInterface --dir=../synchronizer --output=../synchronizer --outpkg=synchronizer --structname=ethermanMock --filename=mock_etherman.go diff --git a/test/benchmarks/sequencer/common/metrics/metrics.go b/test/benchmarks/sequencer/common/metrics/metrics.go new file mode 100644 index 0000000000..a8f6bfe8f2 --- /dev/null +++ b/test/benchmarks/sequencer/common/metrics/metrics.go @@ -0,0 +1,99 @@ +package metrics + +import ( + "fmt" + "net/http" + "os/exec" + "time" + + "github.com/0xPolygonHermez/zkevm-node/log" + metricsLib "github.com/0xPolygonHermez/zkevm-node/metrics" + "github.com/0xPolygonHermez/zkevm-node/sequencer/metrics" + metricsState "github.com/0xPolygonHermez/zkevm-node/state/metrics" + "github.com/0xPolygonHermez/zkevm-node/test/benchmarks/sequencer/common/shared" + "github.com/0xPolygonHermez/zkevm-node/test/testutils" +) + +const ( + oneHundred = 100 + profilingPort = 6060 +) + +// CalculateAndPrint calculates and prints the results +func CalculateAndPrint(prometheusResp *http.Response, profilingResult string, elapsed time.Duration, sequencerTimeSub, executorTimeSub float64, nTxs int) { + sequencerTime, executorTime, workerTime, err := GetValues(prometheusResp) + if err != nil { + log.Fatalf("error getting prometheus metrics: %v", err) + } + + log.Info("##########") + log.Info("# Result #") + log.Info("##########") + log.Infof("Total time took for the sequencer To select all txs from the pool: %v", elapsed) + log.Info("######################") + log.Info("# Prometheus Metrics #") + log.Info("######################") + actualTotalTime := sequencerTime - sequencerTimeSub + actualExecutorTime := executorTime - executorTimeSub + PrintPrometheus(actualTotalTime, actualExecutorTime, workerTime) + log.Infof("[Transactions per second]: %v", float64(nTxs)/actualTotalTime) + if profilingResult != "" { + log.Info("#####################") + log.Info("# Profiling Metrics #") + log.Info("#####################") + log.Infof("%v", profilingResult) + } +} + +// PrintPrometheus prints the prometheus metrics +func PrintPrometheus(totalTime float64, executorTime float64, workerTime float64) { + log.Infof("[TOTAL Processing Time]: %v s", totalTime) + log.Infof("[EXECUTOR Processing Time]: %v s", executorTime) + log.Infof("[SEQUENCER Processing Time]: %v s", totalTime-executorTime) + log.Infof("[WORKER Processing Time]: %v s", workerTime) + log.Infof("[EXECUTOR Time Percentage from TOTAL]: %.2f %%", (executorTime/totalTime)*oneHundred) + log.Infof("[WORKER Time Percentage from TOTAL]: %.2f %%", (workerTime/totalTime)*oneHundred) +} + +// GetValues gets the prometheus metric values +func GetValues(metricsResponse *http.Response) (float64, float64, float64, error) { + var err error + if metricsResponse == nil { + metricsResponse, err = FetchPrometheus() + if err != nil { + log.Fatalf("error getting prometheus metrics: %v", err) + } + } + + mf, err := testutils.ParseMetricFamilies(metricsResponse.Body) + if err != nil { + return 0, 0, 0, err + } + sequencerTotalProcessingTimeHisto := mf[metrics.ProcessingTimeName].Metric[0].Histogram + sequencerTotalProcessingTime := sequencerTotalProcessingTimeHisto.GetSampleSum() + + workerTotalProcessingTimeHisto := mf[metrics.WorkerProcessingTimeName].Metric[0].Histogram + workerTotalProcessingTime := workerTotalProcessingTimeHisto.GetSampleSum() + + executorTotalProcessingTimeHisto := mf[metricsState.ExecutorProcessingTimeName].Metric[0].Histogram + executorTotalProcessingTime := executorTotalProcessingTimeHisto.GetSampleSum() + return sequencerTotalProcessingTime, executorTotalProcessingTime, workerTotalProcessingTime, nil +} + +// FetchPrometheus fetches the prometheus metrics +func FetchPrometheus() (*http.Response, error) { + log.Infof("Fetching prometheus metrics ...") + return http.Get(fmt.Sprintf("http://localhost:%d%s", shared.PrometheusPort, metricsLib.Endpoint)) +} + +// FetchProfiling fetches the profiling metrics +func FetchProfiling() (string, error) { + fullUrl := fmt.Sprintf("http://localhost:%d%s", profilingPort, metricsLib.ProfileEndpoint) + log.Infof("Fetching profiling metrics from: %s ...", fullUrl) + cmd := exec.Command("go", "tool", "pprof", "-top", fullUrl) + out, err := cmd.CombinedOutput() + if err != nil { + log.Fatalf("Error running pprof: %v\n%s", err, out) + } + return string(out), err +} diff --git a/test/benchmarks/sequencer/common/setup/setup.go b/test/benchmarks/sequencer/common/setup/setup.go new file mode 100644 index 0000000000..e6c0fcde1e --- /dev/null +++ b/test/benchmarks/sequencer/common/setup/setup.go @@ -0,0 +1,112 @@ +package setup + +import ( + "context" + "math/big" + "testing" + "time" + + "github.com/0xPolygonHermez/zkevm-node/log" + "github.com/0xPolygonHermez/zkevm-node/pool" + "github.com/0xPolygonHermez/zkevm-node/pool/pgpoolstorage" + "github.com/0xPolygonHermez/zkevm-node/test/benchmarks/sequencer/common/shared" + "github.com/0xPolygonHermez/zkevm-node/test/operations" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/require" +) + +const sleepDuration = 5 * time.Second + +// Environment sets up the environment for the benchmark +func Environment(ctx context.Context, b *testing.B) (*operations.Manager, *ethclient.Client, *pool.Pool, uint64, *big.Int) { + if testing.Short() { + b.Skip() + } + + err := operations.Teardown() + require.NoError(b, err) + + shared.OpsCfg.State.MaxCumulativeGasUsed = shared.MaxCumulativeGasUsed + opsman, err := operations.NewManager(ctx, shared.OpsCfg) + require.NoError(b, err) + + err = Components(opsman) + require.NoError(b, err) + time.Sleep(sleepDuration) + + // Load account with balance on local genesis + auth, err := operations.GetAuth(operations.DefaultSequencerPrivateKey, operations.DefaultL2ChainID) + require.NoError(b, err) + + // Load common client + client, err := ethclient.Dial(operations.DefaultL2NetworkURL) + require.NoError(b, err) + + st := opsman.State() + s, err := pgpoolstorage.NewPostgresPoolStorage(shared.PoolDbConfig) + require.NoError(b, err) + + config := pool.Config{ + FreeClaimGasLimit: 1000000, //nolint:gomnd + DB: shared.PoolDbConfig, + } + + pl := pool.NewPool(config, s, st, common.Address{}, shared.ChainID) + + // Print Info before send + senderBalance, err := client.BalanceAt(ctx, auth.From, nil) + require.NoError(b, err) + senderNonce, err := client.PendingNonceAt(ctx, auth.From) + require.NoError(b, err) + + // Print Initial Stats + log.Infof("Receiver Addr: %v", shared.To.String()) + log.Infof("Sender Addr: %v", auth.From.String()) + log.Infof("Sender Balance: %v", senderBalance.String()) + log.Infof("Sender Nonce: %v", senderNonce) + + gasPrice, err := client.SuggestGasPrice(ctx) + require.NoError(b, err) + + return opsman, client, pl, senderNonce, gasPrice +} + +// Components runs the network container, starts synchronizer and JSON-RPC components, and approves matic +func Components(opsman *operations.Manager) error { + // Run network container + err := opsman.StartNetwork() + if err != nil { + return err + } + + // Approve matic + err = operations.ApproveMatic() + if err != nil { + return err + } + + err = operations.StartComponent("sync") + if err != nil { + return err + } + + err = operations.StartComponent("json-rpc") + if err != nil { + return err + } + time.Sleep(sleepDuration) + + return nil +} + +// BootstrapSequencer starts the sequencer and waits for it to be ready +func BootstrapSequencer(b *testing.B, opsman *operations.Manager) { + log.Debug("Starting sequencer ....") + err := operations.StartComponent("seq") + require.NoError(b, err) + log.Debug("Sequencer Started!") + log.Debug("Setup sequencer ....") + require.NoError(b, opsman.SetUpSequencer()) + log.Debug("Sequencer Setup ready!") +} diff --git a/test/benchmarks/sequencer/common/shared/constants.go b/test/benchmarks/sequencer/common/shared/constants.go new file mode 100644 index 0000000000..c628a79e33 --- /dev/null +++ b/test/benchmarks/sequencer/common/shared/constants.go @@ -0,0 +1,14 @@ +package shared + +import ( + "time" +) + +const ( + // DefaultDeadline is the default deadline for the sequencer + DefaultDeadline = 6000 * time.Second + // MaxCumulativeGasUsed is the maximum cumulative gas used + MaxCumulativeGasUsed = 80000000000 + // PrometheusPort is the port where prometheus is running + PrometheusPort = 9092 +) diff --git a/test/benchmarks/sequencer/common/shared/variables.go b/test/benchmarks/sequencer/common/shared/variables.go new file mode 100644 index 0000000000..90513c84d1 --- /dev/null +++ b/test/benchmarks/sequencer/common/shared/variables.go @@ -0,0 +1,34 @@ +package shared + +import ( + "context" + "math/big" + "strings" + + "github.com/0xPolygonHermez/zkevm-node/test/dbutils" + "github.com/0xPolygonHermez/zkevm-node/test/operations" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" +) + +var ( + // Ctx is the context + Ctx = context.Background() + // PoolDbConfig is the pool db config + PoolDbConfig = dbutils.NewPoolConfigFromEnv() + // SequencerPrivateKey is the private key of the sequencer + SequencerPrivateKey = operations.DefaultSequencerPrivateKey + // ChainID is the chain id + ChainID = operations.DefaultL2ChainID + // OpsCfg is the operations config + OpsCfg = operations.GetDefaultOperationsConfig() + // ToAddress is the address to send the txs + ToAddress = "0x4d5Cf5032B2a844602278b01199ED191A86c93ff" + // To is the address to send the txs + To = common.HexToAddress(ToAddress) + // PrivateKey is the private key of the sender + PrivateKey, _ = crypto.HexToECDSA(strings.TrimPrefix(SequencerPrivateKey, "0x")) + // Auth is the auth of the sender + Auth, _ = bind.NewKeyedTransactorWithChainID(PrivateKey, new(big.Int).SetUint64(ChainID)) +) diff --git a/test/benchmarks/sequencer/common/transactions/transactions.go b/test/benchmarks/sequencer/common/transactions/transactions.go new file mode 100644 index 0000000000..d919f25e48 --- /dev/null +++ b/test/benchmarks/sequencer/common/transactions/transactions.go @@ -0,0 +1,52 @@ +package transactions + +import ( + "context" + "math/big" + "testing" + "time" + + "github.com/0xPolygonHermez/zkevm-node/log" + "github.com/0xPolygonHermez/zkevm-node/pool" + "github.com/0xPolygonHermez/zkevm-node/test/benchmarks/sequencer/common/shared" + "github.com/0xPolygonHermez/zkevm-node/test/operations" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/require" +) + +// SendAndWait sends a number of transactions and waits for them to be marked as pending in the pool +func SendAndWait( + b *testing.B, + senderNonce uint64, + client *ethclient.Client, + gasPrice *big.Int, + pl *pool.Pool, + ctx context.Context, + nTxs int, + txSenderFunc func(b *testing.B, l2Client *ethclient.Client, gasPrice *big.Int, nonce uint64), +) { + shared.Auth.GasPrice = gasPrice + shared.Auth.GasLimit = 2100000 + log.Debugf("Sending %d txs ...", nTxs) + maxNonce := uint64(nTxs) + senderNonce + + for nonce := senderNonce; nonce < maxNonce; nonce++ { + txSenderFunc(b, client, gasPrice, nonce) + } + log.Debug("All txs were sent!") + + log.Debug("Waiting pending transactions To be added in the pool ...") + err := operations.Poll(1*time.Second, shared.DefaultDeadline, func() (bool, error) { + // using a closure here To capture st and currentBatchNumber + count, err := pl.CountPendingTransactions(ctx) + if err != nil { + return false, err + } + + log.Debugf("amount of pending txs: %d\n", count) + done := count == uint64(nTxs) + return done, nil + }) + require.NoError(b, err) + log.Debug("All pending txs are added in the pool!") +} diff --git a/test/benchmarks/sequencer/erc20-transfers/pool_processing_erc20_test.go b/test/benchmarks/sequencer/erc20-transfers/pool_processing_erc20_test.go new file mode 100644 index 0000000000..03cb624949 --- /dev/null +++ b/test/benchmarks/sequencer/erc20-transfers/pool_processing_erc20_test.go @@ -0,0 +1,125 @@ +package erc20_transfers + +import ( + "context" + "fmt" + "math/big" + "net/http" + "testing" + "time" + + "github.com/0xPolygonHermez/zkevm-node/encoding" + "github.com/0xPolygonHermez/zkevm-node/log" + "github.com/0xPolygonHermez/zkevm-node/pool" + "github.com/0xPolygonHermez/zkevm-node/test/benchmarks/sequencer/common/metrics" + "github.com/0xPolygonHermez/zkevm-node/test/benchmarks/sequencer/common/setup" + "github.com/0xPolygonHermez/zkevm-node/test/benchmarks/sequencer/common/shared" + "github.com/0xPolygonHermez/zkevm-node/test/benchmarks/sequencer/common/transactions" + "github.com/0xPolygonHermez/zkevm-node/test/contracts/bin/ERC20" + "github.com/0xPolygonHermez/zkevm-node/test/operations" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/require" +) + +const ( + nTxs = 100 + txTimeout = 60 * time.Second + profilingEnabled = true +) + +var ( + mintAmount, _ = big.NewInt(0).SetString("1000000000000000000000", encoding.Base10) + transferAmount = big.NewInt(0).Div(big.NewInt(0).Mul(big.NewInt(0).Div(mintAmount, big.NewInt(nTxs)), big.NewInt(90)), big.NewInt(100)) + erc20SC *ERC20.ERC20 +) + +func BenchmarkSequencerERC20TransfersPoolProcess(b *testing.B) { + //defer func() { require.NoError(b, operations.Teardown()) }() + opsman, client, pl, senderNonce, gasPrice := setup.Environment(shared.Ctx, b) + + setup.BootstrapSequencer(b, opsman) + startDeploySCTime := time.Now() + err := deployERC20Contract(b, client, shared.Ctx) + require.NoError(b, err) + deploySCElapsed := time.Since(startDeploySCTime) + deploySCSequencerTime, deploySCExecutorOnlyTime, _, err := metrics.GetValues(nil) + if err != nil { + return + } + + transactions.SendAndWait(b, senderNonce, client, gasPrice, pl, shared.Ctx, nTxs, runERC20TxSender) + require.NoError(b, err) + + var ( + elapsed time.Duration + response *http.Response + ) + + b.Run(fmt.Sprintf("sequencer_selecting_%d_txs", nTxs), func(b *testing.B) { + // Wait all txs to be selected by the sequencer + start := time.Now() + log.Debug("Wait for sequencer to select all txs from the pool") + err := operations.Poll(1*time.Second, shared.DefaultDeadline, func() (bool, error) { + selectedCount, err := pl.CountTransactionsByStatus(shared.Ctx, pool.TxStatusSelected) + if err != nil { + return false, err + } + + log.Debugf("amount of selected txs: %d", selectedCount) + done := selectedCount >= nTxs + return done, nil + }) + require.NoError(b, err) + elapsed = time.Since(start) + response, err = metrics.FetchPrometheus() + require.NoError(b, err) + }) + + var profilingResult string + if profilingEnabled { + profilingResult, err = metrics.FetchProfiling() + require.NoError(b, err) + } + + err = operations.Teardown() + if err != nil { + log.Errorf("failed to teardown: %s", err) + } + + metrics.CalculateAndPrint(response, profilingResult, elapsed-deploySCElapsed, deploySCSequencerTime, deploySCExecutorOnlyTime, nTxs) + log.Infof("########################################") + log.Infof("# Deploying ERC20 SC and Mint Tx took: #") + log.Infof("########################################") + metrics.PrintPrometheus(deploySCSequencerTime, deploySCExecutorOnlyTime, 0) +} + +func deployERC20Contract(b *testing.B, client *ethclient.Client, ctx context.Context) error { + var ( + tx *types.Transaction + err error + ) + log.Debugf("Sending TX to deploy ERC20 SC") + _, tx, erc20SC, err = ERC20.DeployERC20(shared.Auth, client, "Test Coin", "TCO") + require.NoError(b, err) + err = operations.WaitTxToBeMined(ctx, client, tx, txTimeout) + require.NoError(b, err) + log.Debugf("Sending TX to do a ERC20 mint") + tx, err = erc20SC.Mint(shared.Auth, mintAmount) + require.NoError(b, err) + err = operations.WaitTxToBeMined(ctx, client, tx, txTimeout) + require.NoError(b, err) + return err +} + +func runERC20TxSender(b *testing.B, l2Client *ethclient.Client, gasPrice *big.Int, nonce uint64) { + log.Debugf("sending nonce: %d", nonce) + var actualTransferAmount *big.Int + if nonce%2 == 0 { + actualTransferAmount = big.NewInt(0).Sub(transferAmount, big.NewInt(int64(nonce))) + } else { + actualTransferAmount = big.NewInt(0).Add(transferAmount, big.NewInt(int64(nonce))) + } + _, err := erc20SC.Transfer(shared.Auth, shared.To, actualTransferAmount) + require.NoError(b, err) +} diff --git a/test/benchmarks/sequencer/eth-transfers/pool_processing_eth_test.go b/test/benchmarks/sequencer/eth-transfers/pool_processing_eth_test.go new file mode 100644 index 0000000000..8f1affc6e4 --- /dev/null +++ b/test/benchmarks/sequencer/eth-transfers/pool_processing_eth_test.go @@ -0,0 +1,98 @@ +package eth_transfers + +import ( + "context" + "errors" + "fmt" + "math/big" + "net/http" + "testing" + "time" + + "github.com/0xPolygonHermez/zkevm-node/encoding" + "github.com/0xPolygonHermez/zkevm-node/log" + "github.com/0xPolygonHermez/zkevm-node/pool" + "github.com/0xPolygonHermez/zkevm-node/state" + "github.com/0xPolygonHermez/zkevm-node/test/benchmarks/sequencer/common/metrics" + "github.com/0xPolygonHermez/zkevm-node/test/benchmarks/sequencer/common/setup" + "github.com/0xPolygonHermez/zkevm-node/test/benchmarks/sequencer/common/shared" + "github.com/0xPolygonHermez/zkevm-node/test/benchmarks/sequencer/common/transactions" + "github.com/0xPolygonHermez/zkevm-node/test/operations" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/require" +) + +var ( + ethAmount, _ = big.NewInt(0).SetString("100000000000", encoding.Base10) +) + +const ( + nTxs = 10 + gasLimit = 21000 + profilingEnabled = true +) + +func BenchmarkSequencerEthTransfersPoolProcess(b *testing.B) { + ctx := context.Background() + //defer func() { require.NoError(b, operations.Teardown()) }() + opsman, client, pl, senderNonce, gasPrice := setup.Environment(ctx, b) + transactions.SendAndWait(b, senderNonce, client, gasPrice, pl, ctx, nTxs, runTxSender) + setup.BootstrapSequencer(b, opsman) + + var ( + elapsed time.Duration + prometheusResponse *http.Response + err error + ) + + b.Run(fmt.Sprintf("sequencer_selecting_%d_txs", nTxs), func(b *testing.B) { + // Wait all txs to be selected by the sequencer + start := time.Now() + log.Debug("Wait for sequencer to select all txs from the pool") + err := operations.Poll(1*time.Second, shared.DefaultDeadline, func() (bool, error) { + selectedCount, err := pl.CountTransactionsByStatus(ctx, pool.TxStatusSelected) + if err != nil { + return false, err + } + + log.Debugf("amount of selected txs: %d", selectedCount) + done := selectedCount >= nTxs + return done, nil + }) + require.NoError(b, err) + elapsed = time.Since(start) + prometheusResponse, err = metrics.FetchPrometheus() + + require.NoError(b, err) + }) + + var profilingResult string + if profilingEnabled { + profilingResult, err = metrics.FetchProfiling() + require.NoError(b, err) + } + + //err = operations.Teardown() + if err != nil { + log.Errorf("failed to teardown: %s", err) + } + + metrics.CalculateAndPrint(prometheusResponse, profilingResult, elapsed, 0, 0, nTxs) + fmt.Printf("%s\n", profilingResult) +} + +func runTxSender(b *testing.B, l2Client *ethclient.Client, gasPrice *big.Int, nonce uint64) { + log.Debugf("sending nonce: %d", nonce) + tx := types.NewTransaction(nonce, shared.To, ethAmount, gasLimit, gasPrice, nil) + signedTx, err := shared.Auth.Signer(shared.Auth.From, tx) + require.NoError(b, err) + err = l2Client.SendTransaction(shared.Ctx, signedTx) + if errors.Is(err, state.ErrStateNotSynchronized) { + for errors.Is(err, state.ErrStateNotSynchronized) { + time.Sleep(5 * time.Second) + err = l2Client.SendTransaction(shared.Ctx, signedTx) + } + } + require.NoError(b, err) +} diff --git a/test/benchmarks/sequencer/pool_processing_test.go b/test/benchmarks/sequencer/pool_processing_test.go deleted file mode 100644 index da6a23907a..0000000000 --- a/test/benchmarks/sequencer/pool_processing_test.go +++ /dev/null @@ -1,251 +0,0 @@ -package sequencer - -import ( - "context" - "errors" - "fmt" - "math/big" - "net/http" - "strings" - "testing" - "time" - - "github.com/0xPolygonHermez/zkevm-node/encoding" - "github.com/0xPolygonHermez/zkevm-node/log" - "github.com/0xPolygonHermez/zkevm-node/metrics" - "github.com/0xPolygonHermez/zkevm-node/pool" - "github.com/0xPolygonHermez/zkevm-node/pool/pgpoolstorage" - "github.com/0xPolygonHermez/zkevm-node/state" - "github.com/0xPolygonHermez/zkevm-node/test/dbutils" - "github.com/0xPolygonHermez/zkevm-node/test/operations" - "github.com/0xPolygonHermez/zkevm-node/test/testutils" - "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/crypto" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/stretchr/testify/require" -) - -const ( - nTxs = 10000 - gasLimit = 21000 - prometheusPort = 9092 - defaultDeadline = 6000 * time.Second - maxCumulativeGasUsed = 80000000000 - invalidNonceInc = 1000 - invalidNonceStartingPercent = 90 -) - -var ( - ctx = context.Background() - poolDbConfig = dbutils.NewPoolConfigFromEnv() - sequencerPrivateKey = operations.DefaultSequencerPrivateKey - chainID = operations.DefaultL2ChainID - opsCfg = operations.GetDefaultOperationsConfig() - - toAddress = "0x4d5Cf5032B2a844602278b01199ED191A86c93ff" - to = common.HexToAddress(toAddress) - ethAmount, _ = big.NewInt(0).SetString("100000000000", encoding.Base10) - privateKey, _ = crypto.HexToECDSA(strings.TrimPrefix(sequencerPrivateKey, "0x")) - auth, _ = bind.NewKeyedTransactorWithChainID(privateKey, new(big.Int).SetUint64(chainID)) -) - -func BenchmarkSequencerPoolProcess(b *testing.B) { - ctx := context.Background() - defer func() { require.NoError(b, operations.Teardown()) }() - opsman, client, pl, senderNonce, gasPrice := setup(ctx, b) - sendAndWaitTxs(b, senderNonce, client, gasPrice, pl, ctx) - startAndSetupSequencer(b, opsman) - - var ( - elapsed time.Duration - response *http.Response - err error - ) - - b.Run(fmt.Sprintf("sequencer_selecting_%d_txs", nTxs), func(b *testing.B) { - // Wait all txs to be selected by the sequencer - start := time.Now() - log.Debug("Wait for sequencer to select all txs from the pool") - err := operations.Poll(1*time.Second, defaultDeadline, func() (bool, error) { - count, err := pl.CountPendingTransactions(ctx) - if err != nil { - return false, err - } - - log.Debugf("amount of pending txs: %d", count) - done := count == 0 - return done, nil - }) - require.NoError(b, err) - elapsed = time.Since(start) - response, err = http.Get(fmt.Sprintf("http://localhost:%d%s", prometheusPort, metrics.Endpoint)) - if err != nil { - log.Errorf("failed to get metrics data: %s", err) - } - }) - - err = operations.Teardown() - if err != nil { - log.Errorf("failed to teardown: %s", err) - } - - printResults(response, elapsed) -} - -func printResults(metricsResponse *http.Response, elapsed time.Duration) { - mf, err := testutils.ParseMetricFamilies(metricsResponse.Body) - if err != nil { - return - } - sequencerTotalProcessingTimeHisto := mf["sequencer_processing_time"].Metric[0].Histogram - sequencerTotalProcessingTime := sequencerTotalProcessingTimeHisto.GetSampleSum() - - executorTotalProcessingTimeHisto := mf["state_executor_processing_time"].Metric[0].Histogram - executorTotalProcessingTime := executorTotalProcessingTimeHisto.GetSampleSum() - - log.Info("##########") - log.Info("# Result #") - log.Info("##########") - log.Infof("Total time took for the sequencer to select all txs from the pool: %v", elapsed) - log.Info("######################") - log.Info("# Prometheus Metrics #") - log.Info("######################") - log.Infof("[sequencer_processing_time]: %v s", sequencerTotalProcessingTime) - log.Infof("[state_executor_processing_time (sequencer)]: %v s", executorTotalProcessingTime) - log.Infof("[sequencer_processing_time_without_executor]: %v s", sequencerTotalProcessingTime-executorTotalProcessingTime) -} - -func startAndSetupSequencer(b *testing.B, opsman *operations.Manager) { - log.Debug("Starting sequencer ....") - err := operations.StartComponent("seq") - require.NoError(b, err) - log.Debug("Sequencer Started!") - log.Debug("Setup sequencer ....") - require.NoError(b, opsman.SetUpSequencer()) - log.Debug("Sequencer setup ready!") -} - -func sendAndWaitTxs(b *testing.B, senderNonce uint64, client *ethclient.Client, gasPrice *big.Int, pl *pool.Pool, ctx context.Context) { - log.Debugf("Sending %d txs ...", nTxs) - maxNonce := uint64(nTxs) + senderNonce - - invalidNonceTxTypesWindowStart := maxNonce * invalidNonceStartingPercent / 100 - invalidNonceTxTypesWindowEnd := maxNonce - for i := senderNonce; i < maxNonce; i++ { - nonce := i - if i >= invalidNonceTxTypesWindowStart && i < invalidNonceTxTypesWindowEnd { - nonce = nonce + invalidNonceInc - } - runTxSender(b, client, gasPrice, nonce) - } - log.Debug("All txs were sent!") - - log.Debug("Waiting pending transactions to be added in the pool ...") - err := operations.Poll(1*time.Second, defaultDeadline, func() (bool, error) { - // using a closure here to capture st and currentBatchNumber - count, err := pl.CountPendingTransactions(ctx) - if err != nil { - return false, err - } - - log.Debugf("amount of pending txs: %d\n", count) - done := count == uint64(nTxs) - return done, nil - }) - require.NoError(b, err) - log.Debug("All pending txs are added in the pool!") -} - -func setup(ctx context.Context, b *testing.B) (*operations.Manager, *ethclient.Client, *pool.Pool, uint64, *big.Int) { - if testing.Short() { - b.Skip() - } - - err := operations.Teardown() - require.NoError(b, err) - - opsCfg.State.MaxCumulativeGasUsed = maxCumulativeGasUsed - opsman, err := operations.NewManager(ctx, opsCfg) - require.NoError(b, err) - - err = setupComponents(opsman) - require.NoError(b, err) - time.Sleep(5 * time.Second) - - // Load account with balance on local genesis - auth, err := operations.GetAuth(operations.DefaultSequencerPrivateKey, operations.DefaultL2ChainID) - require.NoError(b, err) - - // Load eth client - client, err := ethclient.Dial(operations.DefaultL2NetworkURL) - require.NoError(b, err) - - st := opsman.State() - s, err := pgpoolstorage.NewPostgresPoolStorage(poolDbConfig) - require.NoError(b, err) - cfg := pool.Config{ - FreeClaimGasLimit: 150000, - } - pl := pool.NewPool(cfg, s, st, common.Address{}, chainID) - - // Print Info before send - senderBalance, err := client.BalanceAt(ctx, auth.From, nil) - require.NoError(b, err) - senderNonce, err := client.PendingNonceAt(ctx, auth.From) - require.NoError(b, err) - - // Print Initial Stats - log.Infof("Receiver Addr: %v", to.String()) - log.Infof("Sender Addr: %v", auth.From.String()) - log.Infof("Sender Balance: %v", senderBalance.String()) - log.Infof("Sender Nonce: %v", senderNonce) - - gasPrice, err := client.SuggestGasPrice(ctx) - require.NoError(b, err) - - return opsman, client, pl, senderNonce, gasPrice -} - -func setupComponents(opsman *operations.Manager) error { - // Run network container - err := opsman.StartNetwork() - if err != nil { - return err - } - - // Approve matic - err = operations.ApproveMatic() - if err != nil { - return err - } - - err = operations.StartComponent("sync") - if err != nil { - return err - } - - err = operations.StartComponent("json-rpc") - if err != nil { - return err - } - time.Sleep(5 * time.Second) - - return nil -} - -func runTxSender(b *testing.B, l2Client *ethclient.Client, gasPrice *big.Int, nonce uint64) { - log.Debugf("sending nonce: %d", nonce) - tx := types.NewTransaction(nonce, to, ethAmount, gasLimit, gasPrice, nil) - signedTx, err := auth.Signer(auth.From, tx) - require.NoError(b, err) - err = l2Client.SendTransaction(ctx, signedTx) - if errors.Is(err, state.ErrStateNotSynchronized) { - for errors.Is(err, state.ErrStateNotSynchronized) { - time.Sleep(5 * time.Second) - err = l2Client.SendTransaction(ctx, signedTx) - } - } - require.NoError(b, err) -} diff --git a/test/config/debug.node.config.toml b/test/config/debug.node.config.toml index f665657cfd..8a3db82a1b 100644 --- a/test/config/debug.node.config.toml +++ b/test/config/debug.node.config.toml @@ -29,9 +29,9 @@ FreeClaimGasLimit = 1500000 [Etherman] URL = "http://localhost:8545" L1ChainID = 1337 -PoEAddr = "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6" +PoEAddr = "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318" MaticAddr = "0x5FbDB2315678afecb367f032d93F642f64180aa3" -GlobalExitRootManagerAddr = "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" +GlobalExitRootManagerAddr = "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853" MultiGasProvider = false [Etherman.Etherscan] ApiKey = "" @@ -52,18 +52,13 @@ DefaultSenderAddress = "0x1111111111111111111111111111111111111111" [Synchronizer] SyncInterval = "5s" SyncChunkSize = 100 -GenBlockNumber = 57 +GenBlockNumber = 63 [Sequencer] MaxSequenceSize = "2000000" WaitPeriodPoolIsEmpty = "1s" -WaitPeriodSendSequence = "15s" -LastBatchVirtualizationTimeMaxWaitPeriod = "300s" -WaitBlocksToUpdateGER = 10 -WaitBlocksToConsiderGerFinal = 10 -ElapsedTimeToCloseBatchWithoutTxsDueToNewGER = "60s" -MinTimeToCloseBatch = "60s" -MaxTimeForBatchToBeOpen = "15s" +WaitPeriodSendSequence = "5s" +LastBatchVirtualizationTimeMaxWaitPeriod = "5s" BlocksAmountForTxsToBeDeleted = 100 FrequencyToCheckTxsForDelete = "12h" MaxTxsPerBatch = 150 @@ -76,11 +71,26 @@ MaxMemAligns = 262144 MaxArithmetics = 262144 MaxBinaries = 262144 MaxSteps = 8388608 +WeightBatchBytesSize = 1 +WeightCumulativeGasUsed = 1 +WeightKeccakHashes = 1 +WeightPoseidonHashes = 1 +WeightPoseidonPaddings = 1 +WeightMemAligns = 1 +WeightArithmetics = 1 +WeightBinaries = 1 +WeightSteps = 1 MaxAllowedFailedCounter = 50 -SenderAddress = "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" -PrivateKeys = [{Path = "../test/sequencer.keystore", Password = "testonly"}] - [Sequencer.ProfitabilityChecker] - SendBatchesEvenWhenNotProfitable = "true" + [Sequencer.Finalizer] + GERDeadlineTimeoutInSec = "1s" + ForcedBatchDeadlineTimeoutInSec = "60s" + SendingToL1DeadlineTimeoutInSec = "20s" + SleepDurationInMs = "100ms" + ResourcePercentageToCloseBatch = 10 + GERFinalityNumberOfBlocks = 0 + ClosingSignalsManagerWaitForL1OperationsInSec = "1s" + SenderAddress = "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" + PrivateKeys = [{Path = "./test/sequencer.keystore", Password = "testonly"}] [Aggregator] Host = "0.0.0.0" @@ -123,4 +133,6 @@ Port = 61090 Host = "0.0.0.0" Port = 9091 Enabled = false - +ProfilingHost = "0.0.0.0" +ProfilingPort = 6060 +ProfilingEnabled = false diff --git a/test/config/test.genesis.config.json b/test/config/test.genesis.config.json index d4caae4a65..54db6b8369 100644 --- a/test/config/test.genesis.config.json +++ b/test/config/test.genesis.config.json @@ -1,76 +1,101 @@ { - "root": "0x16851d9301e0a13a24dab6b0baec16a73502cdce67e3d3efa2629c86940d34f4", + "root": "0x5c8df6a4b7748c1308a60c5380a2ff77deb5cfee3bf4fba76eef189d651d4558", "genesis": [ - { - "balance": "200000000000000000000000000", - "nonce": "1", - "address": "0x9d98deabc42dd696deb9e40b4f1cab7ddbf55988", - "bytecode": "0x608060405260043610620001675760003560e01c80637b6323c111620000c5578063d02103ca1162000078578063d02103ca146200047d578063d96a15f7146200049f578063dbc1697614620004b6578063ed6be5c914620004ce578063ee25560b14620004e5578063ff634ed7146200051657600080fd5b80637b6323c1146200037057806381b1c17414620003955780639e34070f14620003cf578063a08e8a0814620003f4578063aaa13cc2146200041e578063bab161bf146200044357600080fd5b806334ac9cf2116200011e57806334ac9cf214620002a25780633ae0504714620002c45780633da8168214620002dc5780633e1970431462000301578063463855491462000326578063647c576c146200034b57600080fd5b80630871e971146200016c57806315064c9614620001855780632072f6c514620001b657806322e95f2c14620001ce5780632dfdf0b5146200020c578063318aee3d1462000233575b600080fd5b620001836200017d36600462002432565b6200052d565b005b3480156200019257600080fd5b50602254620001a19060ff1681565b60405190151581526020015b60405180910390f35b348015620001c357600080fd5b5062000183620009cf565b348015620001db57600080fd5b50620001f3620001ed366004620024be565b62000a08565b6040516001600160a01b039091168152602001620001ad565b3480156200021957600080fd5b506200022460215481565b604051908152602001620001ad565b3480156200024057600080fd5b506200027d62000252366004620024fa565b60256020526000908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001ad565b348015620002af57600080fd5b50602754620001f3906001600160a01b031681565b348015620002d157600080fd5b506200022462000a5b565b348015620002e957600080fd5b50620001a1620002fb366004620025e7565b62000b4e565b3480156200030e57600080fd5b50620002246200032036600462002664565b62000c4f565b3480156200033357600080fd5b50620001836200034536600462002774565b62000cdc565b3480156200035857600080fd5b50620001836200036a3660046200285a565b62000e82565b3480156200037d57600080fd5b50620001836200038f36600462002774565b62000fe1565b348015620003a257600080fd5b50620001f3620003b4366004620028aa565b6024602052600090815260409020546001600160a01b031681565b348015620003dc57600080fd5b50620001a1620003ee366004620028aa565b62001469565b3480156200040157600080fd5b506200040b600081565b60405160ff9091168152602001620001ad565b3480156200042b57600080fd5b50620001f36200043d366004620028c4565b620014ae565b3480156200045057600080fd5b506022546200046790610100900463ffffffff1681565b60405163ffffffff9091168152602001620001ad565b3480156200048a57600080fd5b50602654620001f3906001600160a01b031681565b62000183620004b036600462002977565b620015c5565b348015620004c357600080fd5b506200018362001771565b348015620004db57600080fd5b5062000467600081565b348015620004f257600080fd5b506200022462000504366004620028aa565b60236020526000908152604090205481565b3480156200052357600080fd5b506200040b600181565b60225460ff16156200055c5760405162461bcd60e51b81526004016200055390620029de565b60405180910390fd5b60225463ffffffff610100909104811690861603620005e45760405162461bcd60e51b815260206004820152603d60248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2044657374696e6174696f6e2063616e6e6f7420626520697473656c66000000606482015260840162000553565b60008060606001600160a01b03891662000687578534146200067d5760405162461bcd60e51b8152602060048201526044602482018190527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a908201527f20416d6f756e7420646f6573206e6f74206d61746368206d6573736167652e76606482015263616c756560e01b608482015260a40162000553565b60009150620008e9565b6001600160a01b03808a1660009081526025602090815260409182902082518084019093525463ffffffff81168352640100000000900490921691810182905290156200074657604051632770a7eb60e21b81526001600160a01b038b1690639dc29fac90620006fe9033908b9060040162002a46565b600060405180830381600087803b1580156200071957600080fd5b505af11580156200072e573d6000803e3d6000fd5b505050508060200151935080600001519250620008e7565b84156200075b576200075b8a888888620017a8565b620007726001600160a01b038b1633308a62001bcc565b899350602260019054906101000a900463ffffffff169250896001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015620007c9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620007f3919081019062002ada565b8a6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000832573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200085c919081019062002ada565b8b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200089b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008c1919062002b12565b604051602001620008d59392919062002b60565b60405160208183030381529060405291505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600083858b8b8b876021546040516200092b98979695949392919062002b9d565b60405180910390a16200095662000950600084868c8c8c888051906020012062000c4f565b62001c39565b6026546001600160a01b03166333d6247d6200097162000a5b565b6040518263ffffffff1660e01b81526004016200099091815260200190565b600060405180830381600087803b158015620009ab57600080fd5b505af1158015620009c0573d6000803e3d6000fd5b50505050505050505050505050565b6027546001600160a01b03163314620009fc5760405162461bcd60e51b8152600401620005539062002c0a565b62000a0662001d8a565b565b600060246000848460405160200162000a2392919062002c67565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b602154600090819081805b602081101562000b45578260011660010362000ac6576001816020811062000a925762000a9262002c91565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000af3565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b62000b0060028462002cd3565b6040805160208101859052908101849052909350606001604051602081830303815290604052805190602001209150808062000b3c9062002cea565b91505062000a66565b50919392505050565b6000846001600160401b038416825b602081101562000c40578160011660010362000bca5786818151811062000b885762000b8862002c91565b60200260200101518360405160200162000bac929190918252602082015260400190565b60405160208183030381529060405280519060200120925062000c1c565b8287828151811062000be05762000be062002c91565b602002602001015160405160200162000c03929190918252602082015260400190565b6040516020818303038152906040528051906020012092505b62000c2960028362002cd3565b91508062000c378162002cea565b91505062000b5d565b5050821490505b949350505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b60225460ff161562000d025760405162461bcd60e51b81526004016200055390620029de565b62000d188a8a8a8a8a8a8a8a8a8a600162001de8565b62000d298963ffffffff1662002073565b6000836001600160a01b03168387898560405160240162000d4d9392919062002d06565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000d84919062002d41565b60006040518083038185875af1925050503d806000811462000dc3576040519150601f19603f3d011682016040523d82523d6000602084013e62000dc8565b606091505b505090508062000e345760405162461bcd60e51b815260206004820152603060248201527f506f6c79676f6e5a6b45564d4272696467653a3a636c61696d4d65737361676560448201526f0e8813595cdcd859d94819985a5b195960821b606482015260840162000553565b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459838a8888878760405162000e6d95949392919062002d5f565b60405180910390a15050505050505050505050565b600054610100900460ff161580801562000ea35750600054600160ff909116105b8062000ebf5750303b15801562000ebf575060005460ff166001145b62000f245760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162000553565b6000805460ff19166001179055801562000f48576000805461ff0019166101001790555b6022805463ffffffff86166101000264ffffffff0019909116179055602680546001600160a01b038086166001600160a01b0319928316179092556027805492851692909116919091179055801562000fdb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60225460ff1615620010075760405162461bcd60e51b81526004016200055390620029de565b6200101d8a8a8a8a8a8a8a8a8a8a600062001de8565b6200102e8963ffffffff1662002073565b6001600160a01b0385166200112557604080516000808252602082019092526001600160a01b03851690849060405162001069919062002d41565b60006040518083038185875af1925050503d8060008114620010a8576040519150601f19603f3d011682016040523d82523d6000602084013e620010ad565b606091505b50509050806200111e5760405162461bcd60e51b815260206004820152603560248201527f506f6c79676f6e5a6b45564d4272696467653a3a636c61696d41737365743a20604482015274115d1a195c881d1c985b9cd9995c8819985a5b1959605a1b606482015260840162000553565b506200141c565b60225463ffffffff6101009091048116908716036200115a57620011546001600160a01b0386168484620020b5565b6200141c565b600086866040516020016200117192919062002c67565b60408051601f198184030181529181528151602092830120600081815260249093529120549091506001600160a01b031680620013b457600080600085806020019051810190620011c3919062002d96565b925092509250600085848484604051620011dd9062002399565b620011eb9392919062002b60565b8190604051809103906000f59050801580156200120c573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062001240908c908c9060040162002a46565b600060405180830381600087803b1580156200125b57600080fd5b505af115801562001270573d6000803e3d6000fd5b50505050806024600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808d63ffffffff1681526020018c6001600160a01b031681525060256000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507fccd7715648d1f2bb13e158f96b5b6c3aeda555d4cb87112e274a6f28bc571d598c8c83604051620013a29392919063ffffffff9390931683526001600160a01b03918216602084015216604082015260600190565b60405180910390a15050505062001419565b6040516340c10f1960e01b81526001600160a01b038216906340c10f1990620013e4908890889060040162002a46565b600060405180830381600087803b158015620013ff57600080fd5b505af115801562001414573d6000803e3d6000fd5b505050505b50505b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe2754598389878786866040516200145595949392919062002d5f565b60405180910390a150505050505050505050565b6000806200147a6101008462002cd3565b905060006200148c6101008562002e0b565b60009283526023602052604090922054600190921b9182169091149392505050565b6000808888604051602001620014c692919062002c67565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620014f99062002399565b601f1982820381018352601f90910116604081905262001526908d908d908d908d908d9060200162002e4b565b60408051601f198184030181529082905262001546929160200162002e8c565b604051602081830303815290604052805190602001206040516020016200159f94939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60225460ff1615620015eb5760405162461bcd60e51b81526004016200055390620029de565b60225463ffffffff610100909104811690841603620016735760405162461bcd60e51b815260206004820152603f60248201527f506f6c79676f6e5a6b45564d4272696467653a3a6272696467654d657373616760448201527f653a2044657374696e6174696f6e2063616e6e6f7420626520697473656c6600606482015260840162000553565b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001602260019054906101000a900463ffffffff163386863487602154604051620016c798979695949392919062002b9d565b60405180910390a1620016fe620009506001602260019054906101000a900463ffffffff1633878734888051906020012062000c4f565b6026546001600160a01b03166333d6247d6200171962000a5b565b6040518263ffffffff1660e01b81526004016200173891815260200190565b600060405180830381600087803b1580156200175357600080fd5b505af115801562001768573d6000803e3d6000fd5b50505050505050565b6027546001600160a01b031633146200179e5760405162461bcd60e51b8152600401620005539062002c0a565b62000a06620020d7565b6000620017eb83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506200218692505050565b9050632afa533160e01b6001600160e01b0319821601620019e05760008080808080806200181d896004818d62002ebf565b8101906200182c919062002eeb565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146200186e5760405162461bcd60e51b8152600401620005539062002f46565b6001600160a01b0386163014620018995760405162461bcd60e51b8152600401620005539062002fa3565b8a85146200190c5760405162461bcd60e51b815260206004820152603960248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a205065726044820152780dad2e840c2dadeeadce840c8decae640dcdee840dac2e8c6d603b1b606482015260840162000553565b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e16916200198c919062002d41565b6000604051808303816000865af19150503d8060008114620019cb576040519150601f19603f3d011682016040523d82523d6000602084013e620019d0565b606091505b5050505050505050505062001bc5565b6001600160e01b031981166323f2ebc360e21b1462001a565760405162461bcd60e51b815260206004820152602b60248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a204e6f7460448201526a081d985b1a590818d85b1b60aa1b606482015260840162000553565b60008080808080808062001a6e8a6004818e62002ebf565b81019062001a7d919062003005565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001ac15760405162461bcd60e51b8152600401620005539062002f46565b6001600160a01b038716301462001aec5760405162461bcd60e51b8152600401620005539062002fa3565b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162001b75919062002d41565b6000604051808303816000865af19150503d806000811462001bb4576040519150601f19603f3d011682016040523d82523d6000602084013e62001bb9565b606091505b50505050505050505050505b5050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000fdb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526200218d565b80600162001c4a602060026200318e565b62001c5691906200319c565b6021541062001cbb5760405162461bcd60e51b815260206004820152602a60248201527f4465706f736974436f6e74726163743a5f6465706f7369743a204d65726b6c65604482015269081d1c995948199d5b1b60b21b606482015260840162000553565b60016021600082825462001cd09190620031b6565b909155505060215460005b602081101562001d7a578160011660010362001d1057826001826020811062001d085762001d0862002c91565b015550505050565b6001816020811062001d265762001d2662002c91565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925060028262001d63919062002cd3565b91508062001d718162002cea565b91505062001cdb565b5062001d85620031d1565b505050565b60225460ff161562001db05760405162461bcd60e51b81526004016200055390620029de565b6022805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b62001df98a63ffffffff1662001469565b1562001e505760405162461bcd60e51b815260206004820152603060248201526000805160206200477983398151915260448201526f08105b1c9958591e4818db185a5b595960821b606482015260840162000553565b6026546040805160208082018d90528183018c9052825180830384018152606083019384905280519101206312bd9b1960e11b90925260648101919091526000916001600160a01b03169063257b3632906084016020604051808303816000875af115801562001ec4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001eea9190620031e7565b90508060000362001f4d5760405162461bcd60e51b81526020600482015260376024820152600080516020620047798339815191526044820152760811db1bd8985b115e1a5d149bdbdd081a5b9d985b1a59604a1b606482015260840162000553565b60225463ffffffff878116610100909204161462001fcf5760405162461bcd60e51b815260206004820152604360248201526000805160206200477983398151915260448201527f2044657374696e6174696f6e206e6574776f726b20646f6573206e6f74206d616064820152620e8c6d60eb1b608482015260a40162000553565b602254600090610100900463ffffffff1662001fed57508862001ff0565b50895b6200201b6200200c848b8b8b8b8b8b8051906020012062000c4f565b8e8e63ffffffff168462000b4e565b620009c05760405162461bcd60e51b81526020600482015260326024820152600080516020620047798339815191526044820152711024b73b30b634b21039b6ba10383937b7b360711b606482015260840162000553565b6000620020836101008362002cd3565b90506000620020956101008462002e0b565b6000928352602360205260409092208054600190931b9092179091555050565b62001d858363a9059cbb60e01b848460405160240162001c0192919062002a46565b60225460ff16620021515760405162461bcd60e51b815260206004820152603b60248201527f456d657267656e63794d616e616765723a3a6966456d657267656e637953746160448201527f74653a206f6e6c7920696620656d657267656e63792073746174650000000000606482015260840162000553565b6022805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6020015190565b6000620021e4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620022669092919063ffffffff16565b80519091501562001d85578080602001905181019062002205919062003201565b62001d855760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000553565b606062000c47848460008585600080866001600160a01b0316858760405162002290919062002d41565b60006040518083038185875af1925050503d8060008114620022cf576040519150601f19603f3d011682016040523d82523d6000602084013e620022d4565b606091505b5091509150620022e787838387620022f2565b979650505050505050565b60608315620023665782516000036200235e576001600160a01b0385163b6200235e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000553565b508162000c47565b62000c4783838151156200237d5781518083602001fd5b8060405162461bcd60e51b815260040162000553919062003221565b611542806200323783390190565b6001600160a01b0381168114620023bd57600080fd5b50565b8035620023cd81620023a7565b919050565b803563ffffffff81168114620023cd57600080fd5b60008083601f840112620023fa57600080fd5b5081356001600160401b038111156200241257600080fd5b6020830191508360208285010111156200242b57600080fd5b9250929050565b60008060008060008060a087890312156200244c57600080fd5b86356200245981620023a7565b95506200246960208801620023d2565b945060408701356200247b81620023a7565b93506060870135925060808701356001600160401b038111156200249e57600080fd5b620024ac89828a01620023e7565b979a9699509497509295939492505050565b60008060408385031215620024d257600080fd5b620024dd83620023d2565b91506020830135620024ef81620023a7565b809150509250929050565b6000602082840312156200250d57600080fd5b81356200251a81620023a7565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562002562576200256262002521565b604052919050565b600082601f8301126200257c57600080fd5b813560206001600160401b038211156200259a576200259a62002521565b8160051b620025ab82820162002537565b9283528481018201928281019087851115620025c657600080fd5b83870192505b84831015620022e757823582529183019190830190620025cc565b60008060008060808587031215620025fe57600080fd5b8435935060208501356001600160401b03808211156200261d57600080fd5b6200262b888389016200256a565b94506040870135915080821682146200264357600080fd5b509396929550929360600135925050565b60ff81168114620023bd57600080fd5b600080600080600080600060e0888a0312156200268057600080fd5b87356200268d8162002654565b96506200269d60208901620023d2565b95506040880135620026af81620023a7565b9450620026bf60608901620023d2565b93506080880135620026d181620023a7565b9699959850939692959460a0840135945060c09093013592915050565b60006001600160401b038211156200270a576200270a62002521565b50601f01601f191660200190565b600082601f8301126200272a57600080fd5b8135620027416200273b82620026ee565b62002537565b8181528460208386010111156200275757600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806000806000806000806101408b8d0312156200279557600080fd5b8a356001600160401b0380821115620027ad57600080fd5b620027bb8e838f016200256a565b9b50620027cb60208e01620023d2565b9a5060408d0135995060608d01359850620027e960808e01620023d2565b9750620027f960a08e01620023c0565b96506200280960c08e01620023d2565b95506200281960e08e01620023c0565b94506101008d013593506101208d01359150808211156200283957600080fd5b50620028488d828e0162002718565b9150509295989b9194979a5092959850565b6000806000606084860312156200287057600080fd5b6200287b84620023d2565b925060208401356200288d81620023a7565b915060408401356200289f81620023a7565b809150509250925092565b600060208284031215620028bd57600080fd5b5035919050565b600080600080600080600060a0888a031215620028e057600080fd5b620028eb88620023d2565b96506020880135620028fd81620023a7565b955060408801356001600160401b03808211156200291a57600080fd5b620029288b838c01620023e7565b909750955060608a01359150808211156200294257600080fd5b50620029518a828b01620023e7565b9094509250506080880135620029678162002654565b8091505092959891949750929550565b6000806000606084860312156200298d57600080fd5b6200299884620023d2565b92506020840135620029aa81620023a7565b915060408401356001600160401b03811115620029c657600080fd5b620029d48682870162002718565b9150509250925092565b60208082526042908201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960408201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606082015261746560f01b608082015260a00190565b6001600160a01b03929092168252602082015260400190565b60005b8381101562002a7c57818101518382015260200162002a62565b8381111562000fdb5750506000910152565b600082601f83011262002aa057600080fd5b815162002ab16200273b82620026ee565b81815284602083860101111562002ac757600080fd5b62000c4782602083016020870162002a5f565b60006020828403121562002aed57600080fd5b81516001600160401b0381111562002b0457600080fd5b62000c478482850162002a8e565b60006020828403121562002b2557600080fd5b81516200251a8162002654565b6000815180845262002b4c81602086016020860162002a5f565b601f01601f19169290920160200192915050565b60608152600062002b75606083018662002b32565b828103602084015262002b89818662002b32565b91505060ff83166040830152949350505050565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c0830181905260009162002bf18483018762002b32565b925080851660e085015250509998505050505050505050565b6020808252603a908201527f506f6c79676f6e5a6b45564d3a3a6f6e6c79506f6c79676f6e5a6b45564d3a2060408201527f6f6e6c7920506f6c79676f6e5a6b45564d20636f6e7472616374000000000000606082015260800190565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008262002ce55762002ce562002ca7565b500490565b60006001820162002cff5762002cff62002cbd565b5060010190565b6001600160a01b038416815263ffffffff8316602082015260606040820181905260009062002d389083018462002b32565b95945050505050565b6000825162002d5581846020870162002a5f565b9190910192915050565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b60008060006060848603121562002dac57600080fd5b83516001600160401b038082111562002dc457600080fd5b62002dd28783880162002a8e565b9450602086015191508082111562002de957600080fd5b5062002df88682870162002a8e565b92505060408401516200289f8162002654565b60008262002e1d5762002e1d62002ca7565b500690565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60608152600062002e6160608301878962002e22565b828103602084015262002e7681868862002e22565b91505060ff831660408301529695505050505050565b6000835162002ea081846020880162002a5f565b83519083019062002eb681836020880162002a5f565b01949350505050565b6000808585111562002ed057600080fd5b8386111562002ede57600080fd5b5050820193919092039150565b600080600080600080600060e0888a03121562002f0757600080fd5b873562002f1481620023a7565b9650602088013562002f2681620023a7565b955060408801359450606088013593506080880135620026d18162002654565b6020808252603c908201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2050657260408201527f6d6974206f776e6572206d757374206265207468652073656e64657200000000606082015260800190565b60208082526033908201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a205370656040820152726e646572206d7573742062652027746869732760681b606082015260800190565b8015158114620023bd57600080fd5b600080600080600080600080610100898b0312156200302357600080fd5b88356200303081620023a7565b975060208901356200304281620023a7565b965060408901359550606089013594506080890135620030628162002ff6565b935060a0890135620030748162002654565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115620030d2578160001904821115620030b657620030b662002cbd565b80851615620030c457918102915b93841c939080029062003096565b509250929050565b600082620030eb5750600162000a55565b81620030fa5750600062000a55565b81600181146200311357600281146200311e576200313e565b600191505062000a55565b60ff84111562003132576200313262002cbd565b50506001821b62000a55565b5060208310610133831016604e8410600b841016171562003163575081810a62000a55565b6200316f838362003091565b806000190482111562003186576200318662002cbd565b029392505050565b60006200251a8383620030da565b600082821015620031b157620031b162002cbd565b500390565b60008219821115620031cc57620031cc62002cbd565b500190565b634e487b7160e01b600052600160045260246000fd5b600060208284031215620031fa57600080fd5b5051919050565b6000602082840312156200321457600080fd5b81516200251a8162002ff6565b6020815260006200251a602083018462002b3256fe60c06040523480156200001157600080fd5b5060405162001542380380620015428339810160408190526200003491620002ad565b82826003620000448382620003c1565b506004620000538282620003c1565b5050600580546001600160a81b0319163360ff60a01b191617600160a01b60ff851602179055504660808190526200008b9062000098565b60a052506200048d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000c562000146565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b606060038054620001579062000332565b80601f0160208091040260200160405190810160405280929190818152602001828054620001859062000332565b8015620001d65780601f10620001aa57610100808354040283529160200191620001d6565b820191906000526020600020905b815481529060010190602001808311620001b857829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200020857600080fd5b81516001600160401b0380821115620002255762000225620001e0565b604051601f8301601f19908116603f01168101908282118183101715620002505762000250620001e0565b816040528381526020925086838588010111156200026d57600080fd5b600091505b8382101562000291578582018301518183018401529082019062000272565b83821115620002a35760008385830101525b9695505050505050565b600080600060608486031215620002c357600080fd5b83516001600160401b0380821115620002db57600080fd5b620002e987838801620001f6565b945060208601519150808211156200030057600080fd5b506200030f86828701620001f6565b925050604084015160ff811681146200032757600080fd5b809150509250925092565b600181811c908216806200034757607f821691505b6020821081036200036857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003bc57600081815260208120601f850160051c81016020861015620003975750805b601f850160051c820191505b81811015620003b857828155600101620003a3565b5050505b505050565b81516001600160401b03811115620003dd57620003dd620001e0565b620003f581620003ee845462000332565b846200036e565b602080601f8311600181146200042d5760008415620004145750858301515b600019600386901b1c1916600185901b178555620003b8565b600085815260208120601f198616915b828110156200045e578886015182559484019460019091019084016200043d565b50858210156200047d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611088620004ba60003960006104690152600081816102f9015261043301526110886000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146102ce578063a9059cbb146102e1578063cd0d0096146102f4578063d505accf1461031b578063dd62ed3e1461032e578063ffa1ad741461034157600080fd5b806370a082311461023f5780637ecebe001461026857806395d89b41146102885780639dc29fac14610290578063a3c573eb146102a357600080fd5b806330adf81f116100ff57806330adf81f146101c9578063313ce567146101f05780633644e5151461020f578063395093511461021757806340c10f191461022a57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806320606b701461018f57806323b872dd146101b6575b600080fd5b610144610361565b6040516101519190610dc2565b60405180910390f35b61016d610168366004610e33565b6103f3565b6040519015158152602001610151565b6002545b604051908152602001610151565b6101817f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61016d6101c4366004610e5d565b61040b565b6101817f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b600554600160a01b900460ff1660405160ff9091168152602001610151565b61018161042f565b61016d610225366004610e33565b61048b565b61023d610238366004610e33565b6104ad565b005b61018161024d366004610e99565b6001600160a01b031660009081526020819052604090205490565b610181610276366004610e99565b60066020526000908152604090205481565b6101446104ee565b61023d61029e366004610e33565b6104fd565b6005546102b6906001600160a01b031681565b6040516001600160a01b039091168152602001610151565b61016d6102dc366004610e33565b610531565b61016d6102ef366004610e33565b6105ac565b6101817f000000000000000000000000000000000000000000000000000000000000000081565b61023d610329366004610ebb565b6105ba565b61018161033c366004610f2e565b6107f5565b610144604051806040016040528060018152602001603160f81b81525081565b60606003805461037090610f61565b80601f016020809104026020016040519081016040528092919081815260200182805461039c90610f61565b80156103e95780601f106103be576101008083540402835291602001916103e9565b820191906000526020600020905b8154815290600101906020018083116103cc57829003601f168201915b5050505050905090565b600033610401818585610820565b5060019392505050565b600033610419858285610945565b6104248585856109bf565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104665761046146610b51565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b60003361040181858561049e83836107f5565b6104a89190610fb1565b610820565b6005546001600160a01b031633146104e05760405162461bcd60e51b81526004016104d790610fc9565b60405180910390fd5b6104ea8282610bfd565b5050565b60606004805461037090610f61565b6005546001600160a01b031633146105275760405162461bcd60e51b81526004016104d790610fc9565b6104ea8282610caa565b6000338161053f82866107f5565b90508381101561059f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104d7565b6104248286868403610820565b6000336104018185856109bf565b834211156106165760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104d7565b6001600160a01b038716600090815260066020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661066383611019565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106c161042f565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107825750896001600160a01b0316816001600160a01b0316145b6107de5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104d7565b6107e98a8a8a610820565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108825760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104d7565b6001600160a01b0382166108e35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104d7565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061095184846107f5565b905060001981146109b957818110156109ac5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104d7565b6109b98484848403610820565b50505050565b6001600160a01b038316610a235760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104d7565b6001600160a01b038216610a855760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104d7565b6001600160a01b03831660009081526020819052604090205481811015610afd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104d7565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611033833981519152910160405180910390a36109b9565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610b7c610361565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c535760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104d7565b8060026000828254610c659190610fb1565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611033833981519152910160405180910390a35050565b6001600160a01b038216610d0a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104d7565b6001600160a01b03821660009081526020819052604090205481811015610d7e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104d7565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110338339815191529101610938565b600060208083528351808285015260005b81811015610def57858101830151858201604001528201610dd3565b81811115610e01576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114610e2e57600080fd5b919050565b60008060408385031215610e4657600080fd5b610e4f83610e17565b946020939093013593505050565b600080600060608486031215610e7257600080fd5b610e7b84610e17565b9250610e8960208501610e17565b9150604084013590509250925092565b600060208284031215610eab57600080fd5b610eb482610e17565b9392505050565b600080600080600080600060e0888a031215610ed657600080fd5b610edf88610e17565b9650610eed60208901610e17565b95506040880135945060608801359350608088013560ff81168114610f1157600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f4157600080fd5b610f4a83610e17565b9150610f5860208401610e17565b90509250929050565b600181811c90821680610f7557607f821691505b602082108103610f9557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115610fc457610fc4610f9b565b500190565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161102b5761102b610f9b565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212208b7986f78e961ad6c0885b86b24ce427045be98073c1f3d7fe18180542ab873564736f6c634300080f0033506f6c79676f6e5a6b45564d4272696467653a3a5f7665726966794c6561663aa26469706673582212207321963add10aa42fbf70097691018c23164a96132c6cd71e46023fffa7d461764736f6c634300080f0033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0x01", - "0x0000000000000000000000000000000000000000000000000000000000000022": "0x0100", - "0x0000000000000000000000000000000000000000000000000000000000000026": "0xae4bb80be56b819606589de61d5ec3b522eeb032" - }, - "contractName": "PolygonZkEVMBridge" - }, - { - "balance": "0", - "nonce": "3", - "address": "0xc949254d682d8c9ad5682521675b8f43b102aec4", - "pvtKey": "0xdfd01798f92667dbf91df722434e8fbe96af0211d4d1b82bbbbc8f1def7a814f" - }, - { - "balance": "100000000000000000000000", - "nonce": "0", - "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "pvtKey": "0x00" - }, - { - "balance": "0", - "nonce": "1", - "address": "0xae4bb80be56b819606589de61d5ec3b522eeb032", - "bytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b366004610164565b60006020819052908152604090205481565b6100a061009b366004610164565b6100cd565b005b6002546100b5906001600160a01b031681565b6040516001600160a01b039091168152602001610064565b6002546001600160a01b0316331461015f5760405162461bcd60e51b815260206004820152604560248201527f506f6c79676f6e5a6b45564d476c6f62616c45786974526f6f744c323a3a757060448201527f6461746545786974526f6f743a204f6e6c7920506f6c79676f6e5a6b45564d42606482015264726964676560d81b608482015260a40160405180910390fd5b600155565b60006020828403121561017657600080fd5b503591905056fea2646970667358221220515fd6c3d86946bd7f5a4ef86115f8c7ba072b8c318ac2c46e1526fb50a66c3364736f6c634300080f0033", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000002": "0x9d98deabc42dd696deb9e40b4f1cab7ddbf55988" - }, - "contractName": "PolygonZkEVMGlobalExitRootL2" + { + "contractName": "PolygonZkEVMDeployer", + "balance": "0", + "nonce": "4", + "address": "0x70c5dCfCdf437D051c49C13356958fADf9323913", + "bytecode": "0x6080604052600436106100605760003560e01c80632b79805a146100655780634a94d4871461007a5780636d07dbf81461008d578063715018a6146100c35780638da5cb5b146100d8578063e11ae6cb146100f6578063f2fde38b14610109575b600080fd5b610078610073366004610733565b610129565b005b6100786100883660046107c6565b610189565b34801561009957600080fd5b506100ad6100a836600461081d565b6101cb565b6040516100ba919061083f565b60405180910390f35b3480156100cf57600080fd5b506100786101de565b3480156100e457600080fd5b506000546001600160a01b03166100ad565b610078610104366004610853565b6101f2565b34801561011557600080fd5b506100786101243660046108a3565b610246565b6101316102c4565b600061013e85858561031e565b905061014a818361041e565b507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c8160405161017a919061083f565b60405180910390a15050505050565b6101916102c4565b61019c838383610462565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b90600090a1505050565b60006101d78383610490565b9392505050565b6101e66102c4565b6101f0600061049d565b565b6101fa6102c4565b600061020784848461031e565b90507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c81604051610238919061083f565b60405180910390a150505050565b61024e6102c4565b6001600160a01b0381166102b85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6102c18161049d565b50565b6000546001600160a01b031633146101f05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102af565b6000834710156103705760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016102af565b81516000036103c15760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016102af565b8282516020840186f590506001600160a01b0381166101d75760405162461bcd60e51b8152602060048201526019602482015278437265617465323a204661696c6564206f6e206465706c6f7960381b60448201526064016102af565b60606101d7838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506104ed565b6060610488848484604051806060016040528060298152602001610932602991396104ed565b949350505050565b60006101d78383306105c8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60608247101561054e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016102af565b600080866001600160a01b0316858760405161056a91906108e2565b60006040518083038185875af1925050503d80600081146105a7576040519150601f19603f3d011682016040523d82523d6000602084013e6105ac565b606091505b50915091506105bd878383876105f2565b979650505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6060831561066157825160000361065a576001600160a01b0385163b61065a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102af565b5081610488565b61048883838151156106765781518083602001fd5b8060405162461bcd60e51b81526004016102af91906108fe565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126106b757600080fd5b813567ffffffffffffffff808211156106d2576106d2610690565b604051601f8301601f19908116603f011681019082821181831017156106fa576106fa610690565b8160405283815286602085880101111561071357600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561074957600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561076f57600080fd5b61077b888389016106a6565b9350606087013591508082111561079157600080fd5b5061079e878288016106a6565b91505092959194509250565b80356001600160a01b03811681146107c157600080fd5b919050565b6000806000606084860312156107db57600080fd5b6107e4846107aa565b9250602084013567ffffffffffffffff81111561080057600080fd5b61080c868287016106a6565b925050604084013590509250925092565b6000806040838503121561083057600080fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b60008060006060848603121561086857600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561088d57600080fd5b610899868287016106a6565b9150509250925092565b6000602082840312156108b557600080fd5b6101d7826107aa565b60005b838110156108d95781810151838201526020016108c1565b50506000910152565b600082516108f48184602087016108be565b9190910192915050565b602081526000825180602084015261091d8160408501602087016108be565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212207bb17a87bc2c0ad76098275332177f42e104a72ca11bed987dfdf2a11cc1edaa64736f6c63430008110033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000cae25c8623761783fe4ce241c9b428126a7612a" } - ], - "transactions": [ - { - "rawTx": "0xf902768080839896808080b90266608060405234801561001057600080fd5b5060405161024638038061024683398101604081905261002f91610054565b600280546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6101b3806100936000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b366004610164565b60006020819052908152604090205481565b6100a061009b366004610164565b6100cd565b005b6002546100b5906001600160a01b031681565b6040516001600160a01b039091168152602001610064565b6002546001600160a01b0316331461015f5760405162461bcd60e51b815260206004820152604560248201527f506f6c79676f6e5a6b45564d476c6f62616c45786974526f6f744c323a3a757060448201527f6461746545786974526f6f743a204f6e6c7920506f6c79676f6e5a6b45564d42606482015264726964676560d81b608482015260a40160405180910390fd5b600155565b60006020828403121561017657600080fd5b503591905056fea2646970667358221220515fd6c3d86946bd7f5a4ef86115f8c7ba072b8c318ac2c46e1526fb50a66c3364736f6c634300080f00330000000000000000000000009d98deabc42dd696deb9e40b4f1cab7ddbf559888203e8808062c7b6ed3f97f48cb0c909b6fc5fa0bda9ae0392c5e3c6abb883afff10d8843d354c515eb025b1ea82e17a389a23d5d4b0b6dbc45cbf215d181958094d03c4b11b", - "receipt": { - "status": 1, - "gasUsed": "0x029ed4", - "logs": [] - }, - "createAddress": "0xae4bb80be56b819606589de61d5ec3b522eeb032" - }, - { - "rawTx": "0xf947fe0180839896808080b947ee608060405234801561001057600080fd5b506147ce806100206000396000f3fe608060405260043610620001675760003560e01c80637b6323c111620000c5578063d02103ca1162000078578063d02103ca146200047d578063d96a15f7146200049f578063dbc1697614620004b6578063ed6be5c914620004ce578063ee25560b14620004e5578063ff634ed7146200051657600080fd5b80637b6323c1146200037057806381b1c17414620003955780639e34070f14620003cf578063a08e8a0814620003f4578063aaa13cc2146200041e578063bab161bf146200044357600080fd5b806334ac9cf2116200011e57806334ac9cf214620002a25780633ae0504714620002c45780633da8168214620002dc5780633e1970431462000301578063463855491462000326578063647c576c146200034b57600080fd5b80630871e971146200016c57806315064c9614620001855780632072f6c514620001b657806322e95f2c14620001ce5780632dfdf0b5146200020c578063318aee3d1462000233575b600080fd5b620001836200017d36600462002432565b6200052d565b005b3480156200019257600080fd5b50602254620001a19060ff1681565b60405190151581526020015b60405180910390f35b348015620001c357600080fd5b5062000183620009cf565b348015620001db57600080fd5b50620001f3620001ed366004620024be565b62000a08565b6040516001600160a01b039091168152602001620001ad565b3480156200021957600080fd5b506200022460215481565b604051908152602001620001ad565b3480156200024057600080fd5b506200027d62000252366004620024fa565b60256020526000908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201620001ad565b348015620002af57600080fd5b50602754620001f3906001600160a01b031681565b348015620002d157600080fd5b506200022462000a5b565b348015620002e957600080fd5b50620001a1620002fb366004620025e7565b62000b4e565b3480156200030e57600080fd5b50620002246200032036600462002664565b62000c4f565b3480156200033357600080fd5b50620001836200034536600462002774565b62000cdc565b3480156200035857600080fd5b50620001836200036a3660046200285a565b62000e82565b3480156200037d57600080fd5b50620001836200038f36600462002774565b62000fe1565b348015620003a257600080fd5b50620001f3620003b4366004620028aa565b6024602052600090815260409020546001600160a01b031681565b348015620003dc57600080fd5b50620001a1620003ee366004620028aa565b62001469565b3480156200040157600080fd5b506200040b600081565b60405160ff9091168152602001620001ad565b3480156200042b57600080fd5b50620001f36200043d366004620028c4565b620014ae565b3480156200045057600080fd5b506022546200046790610100900463ffffffff1681565b60405163ffffffff9091168152602001620001ad565b3480156200048a57600080fd5b50602654620001f3906001600160a01b031681565b62000183620004b036600462002977565b620015c5565b348015620004c357600080fd5b506200018362001771565b348015620004db57600080fd5b5062000467600081565b348015620004f257600080fd5b506200022462000504366004620028aa565b60236020526000908152604090205481565b3480156200052357600080fd5b506200040b600181565b60225460ff16156200055c5760405162461bcd60e51b81526004016200055390620029de565b60405180910390fd5b60225463ffffffff610100909104811690861603620005e45760405162461bcd60e51b815260206004820152603d60248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2044657374696e6174696f6e2063616e6e6f7420626520697473656c66000000606482015260840162000553565b60008060606001600160a01b03891662000687578534146200067d5760405162461bcd60e51b8152602060048201526044602482018190527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a908201527f20416d6f756e7420646f6573206e6f74206d61746368206d6573736167652e76606482015263616c756560e01b608482015260a40162000553565b60009150620008e9565b6001600160a01b03808a1660009081526025602090815260409182902082518084019093525463ffffffff81168352640100000000900490921691810182905290156200074657604051632770a7eb60e21b81526001600160a01b038b1690639dc29fac90620006fe9033908b9060040162002a46565b600060405180830381600087803b1580156200071957600080fd5b505af11580156200072e573d6000803e3d6000fd5b505050508060200151935080600001519250620008e7565b84156200075b576200075b8a888888620017a8565b620007726001600160a01b038b1633308a62001bcc565b899350602260019054906101000a900463ffffffff169250896001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa158015620007c9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620007f3919081019062002ada565b8a6001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000832573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200085c919081019062002ada565b8b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200089b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008c1919062002b12565b604051602001620008d59392919062002b60565b60405160208183030381529060405291505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600083858b8b8b876021546040516200092b98979695949392919062002b9d565b60405180910390a16200095662000950600084868c8c8c888051906020012062000c4f565b62001c39565b6026546001600160a01b03166333d6247d6200097162000a5b565b6040518263ffffffff1660e01b81526004016200099091815260200190565b600060405180830381600087803b158015620009ab57600080fd5b505af1158015620009c0573d6000803e3d6000fd5b50505050505050505050505050565b6027546001600160a01b03163314620009fc5760405162461bcd60e51b8152600401620005539062002c0a565b62000a0662001d8a565b565b600060246000848460405160200162000a2392919062002c67565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b602154600090819081805b602081101562000b45578260011660010362000ac6576001816020811062000a925762000a9262002c91565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000af3565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b62000b0060028462002cd3565b6040805160208101859052908101849052909350606001604051602081830303815290604052805190602001209150808062000b3c9062002cea565b91505062000a66565b50919392505050565b6000846001600160401b038416825b602081101562000c40578160011660010362000bca5786818151811062000b885762000b8862002c91565b60200260200101518360405160200162000bac929190918252602082015260400190565b60405160208183030381529060405280519060200120925062000c1c565b8287828151811062000be05762000be062002c91565b602002602001015160405160200162000c03929190918252602082015260400190565b6040516020818303038152906040528051906020012092505b62000c2960028362002cd3565b91508062000c378162002cea565b91505062000b5d565b5050821490505b949350505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b60225460ff161562000d025760405162461bcd60e51b81526004016200055390620029de565b62000d188a8a8a8a8a8a8a8a8a8a600162001de8565b62000d298963ffffffff1662002073565b6000836001600160a01b03168387898560405160240162000d4d9392919062002d06565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000d84919062002d41565b60006040518083038185875af1925050503d806000811462000dc3576040519150601f19603f3d011682016040523d82523d6000602084013e62000dc8565b606091505b505090508062000e345760405162461bcd60e51b815260206004820152603060248201527f506f6c79676f6e5a6b45564d4272696467653a3a636c61696d4d65737361676560448201526f0e8813595cdcd859d94819985a5b195960821b606482015260840162000553565b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459838a8888878760405162000e6d95949392919062002d5f565b60405180910390a15050505050505050505050565b600054610100900460ff161580801562000ea35750600054600160ff909116105b8062000ebf5750303b15801562000ebf575060005460ff166001145b62000f245760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162000553565b6000805460ff19166001179055801562000f48576000805461ff0019166101001790555b6022805463ffffffff86166101000264ffffffff0019909116179055602680546001600160a01b038086166001600160a01b0319928316179092556027805492851692909116919091179055801562000fdb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60225460ff1615620010075760405162461bcd60e51b81526004016200055390620029de565b6200101d8a8a8a8a8a8a8a8a8a8a600062001de8565b6200102e8963ffffffff1662002073565b6001600160a01b0385166200112557604080516000808252602082019092526001600160a01b03851690849060405162001069919062002d41565b60006040518083038185875af1925050503d8060008114620010a8576040519150601f19603f3d011682016040523d82523d6000602084013e620010ad565b606091505b50509050806200111e5760405162461bcd60e51b815260206004820152603560248201527f506f6c79676f6e5a6b45564d4272696467653a3a636c61696d41737365743a20604482015274115d1a195c881d1c985b9cd9995c8819985a5b1959605a1b606482015260840162000553565b506200141c565b60225463ffffffff6101009091048116908716036200115a57620011546001600160a01b0386168484620020b5565b6200141c565b600086866040516020016200117192919062002c67565b60408051601f198184030181529181528151602092830120600081815260249093529120549091506001600160a01b031680620013b457600080600085806020019051810190620011c3919062002d96565b925092509250600085848484604051620011dd9062002399565b620011eb9392919062002b60565b8190604051809103906000f59050801580156200120c573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062001240908c908c9060040162002a46565b600060405180830381600087803b1580156200125b57600080fd5b505af115801562001270573d6000803e3d6000fd5b50505050806024600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808d63ffffffff1681526020018c6001600160a01b031681525060256000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507fccd7715648d1f2bb13e158f96b5b6c3aeda555d4cb87112e274a6f28bc571d598c8c83604051620013a29392919063ffffffff9390931683526001600160a01b03918216602084015216604082015260600190565b60405180910390a15050505062001419565b6040516340c10f1960e01b81526001600160a01b038216906340c10f1990620013e4908890889060040162002a46565b600060405180830381600087803b158015620013ff57600080fd5b505af115801562001414573d6000803e3d6000fd5b505050505b50505b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe2754598389878786866040516200145595949392919062002d5f565b60405180910390a150505050505050505050565b6000806200147a6101008462002cd3565b905060006200148c6101008562002e0b565b60009283526023602052604090922054600190921b9182169091149392505050565b6000808888604051602001620014c692919062002c67565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620014f99062002399565b601f1982820381018352601f90910116604081905262001526908d908d908d908d908d9060200162002e4b565b60408051601f198184030181529082905262001546929160200162002e8c565b604051602081830303815290604052805190602001206040516020016200159f94939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60225460ff1615620015eb5760405162461bcd60e51b81526004016200055390620029de565b60225463ffffffff610100909104811690841603620016735760405162461bcd60e51b815260206004820152603f60248201527f506f6c79676f6e5a6b45564d4272696467653a3a6272696467654d657373616760448201527f653a2044657374696e6174696f6e2063616e6e6f7420626520697473656c6600606482015260840162000553565b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001602260019054906101000a900463ffffffff163386863487602154604051620016c798979695949392919062002b9d565b60405180910390a1620016fe620009506001602260019054906101000a900463ffffffff1633878734888051906020012062000c4f565b6026546001600160a01b03166333d6247d6200171962000a5b565b6040518263ffffffff1660e01b81526004016200173891815260200190565b600060405180830381600087803b1580156200175357600080fd5b505af115801562001768573d6000803e3d6000fd5b50505050505050565b6027546001600160a01b031633146200179e5760405162461bcd60e51b8152600401620005539062002c0a565b62000a06620020d7565b6000620017eb83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506200218692505050565b9050632afa533160e01b6001600160e01b0319821601620019e05760008080808080806200181d896004818d62002ebf565b8101906200182c919062002eeb565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146200186e5760405162461bcd60e51b8152600401620005539062002f46565b6001600160a01b0386163014620018995760405162461bcd60e51b8152600401620005539062002fa3565b8a85146200190c5760405162461bcd60e51b815260206004820152603960248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a205065726044820152780dad2e840c2dadeeadce840c8decae640dcdee840dac2e8c6d603b1b606482015260840162000553565b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e16916200198c919062002d41565b6000604051808303816000865af19150503d8060008114620019cb576040519150601f19603f3d011682016040523d82523d6000602084013e620019d0565b606091505b5050505050505050505062001bc5565b6001600160e01b031981166323f2ebc360e21b1462001a565760405162461bcd60e51b815260206004820152602b60248201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a204e6f7460448201526a081d985b1a590818d85b1b60aa1b606482015260840162000553565b60008080808080808062001a6e8a6004818e62002ebf565b81019062001a7d919062003005565b97509750975097509750975097509750336001600160a01b0316886001600160a01b03161462001ac15760405162461bcd60e51b8152600401620005539062002f46565b6001600160a01b038716301462001aec5760405162461bcd60e51b8152600401620005539062002fa3565b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169162001b75919062002d41565b6000604051808303816000865af19150503d806000811462001bb4576040519150601f19603f3d011682016040523d82523d6000602084013e62001bb9565b606091505b50505050505050505050505b5050505050565b6040516001600160a01b038085166024830152831660448201526064810182905262000fdb9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526200218d565b80600162001c4a602060026200318e565b62001c5691906200319c565b6021541062001cbb5760405162461bcd60e51b815260206004820152602a60248201527f4465706f736974436f6e74726163743a5f6465706f7369743a204d65726b6c65604482015269081d1c995948199d5b1b60b21b606482015260840162000553565b60016021600082825462001cd09190620031b6565b909155505060215460005b602081101562001d7a578160011660010362001d1057826001826020811062001d085762001d0862002c91565b015550505050565b6001816020811062001d265762001d2662002c91565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925060028262001d63919062002cd3565b91508062001d718162002cea565b91505062001cdb565b5062001d85620031d1565b505050565b60225460ff161562001db05760405162461bcd60e51b81526004016200055390620029de565b6022805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b62001df98a63ffffffff1662001469565b1562001e505760405162461bcd60e51b815260206004820152603060248201526000805160206200477983398151915260448201526f08105b1c9958591e4818db185a5b595960821b606482015260840162000553565b6026546040805160208082018d90528183018c9052825180830384018152606083019384905280519101206312bd9b1960e11b90925260648101919091526000916001600160a01b03169063257b3632906084016020604051808303816000875af115801562001ec4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001eea9190620031e7565b90508060000362001f4d5760405162461bcd60e51b81526020600482015260376024820152600080516020620047798339815191526044820152760811db1bd8985b115e1a5d149bdbdd081a5b9d985b1a59604a1b606482015260840162000553565b60225463ffffffff878116610100909204161462001fcf5760405162461bcd60e51b815260206004820152604360248201526000805160206200477983398151915260448201527f2044657374696e6174696f6e206e6574776f726b20646f6573206e6f74206d616064820152620e8c6d60eb1b608482015260a40162000553565b602254600090610100900463ffffffff1662001fed57508862001ff0565b50895b6200201b6200200c848b8b8b8b8b8b8051906020012062000c4f565b8e8e63ffffffff168462000b4e565b620009c05760405162461bcd60e51b81526020600482015260326024820152600080516020620047798339815191526044820152711024b73b30b634b21039b6ba10383937b7b360711b606482015260840162000553565b6000620020836101008362002cd3565b90506000620020956101008462002e0b565b6000928352602360205260409092208054600190931b9092179091555050565b62001d858363a9059cbb60e01b848460405160240162001c0192919062002a46565b60225460ff16620021515760405162461bcd60e51b815260206004820152603b60248201527f456d657267656e63794d616e616765723a3a6966456d657267656e637953746160448201527f74653a206f6e6c7920696620656d657267656e63792073746174650000000000606482015260840162000553565b6022805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b6020015190565b6000620021e4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620022669092919063ffffffff16565b80519091501562001d85578080602001905181019062002205919062003201565b62001d855760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000553565b606062000c47848460008585600080866001600160a01b0316858760405162002290919062002d41565b60006040518083038185875af1925050503d8060008114620022cf576040519150601f19603f3d011682016040523d82523d6000602084013e620022d4565b606091505b5091509150620022e787838387620022f2565b979650505050505050565b60608315620023665782516000036200235e576001600160a01b0385163b6200235e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000553565b508162000c47565b62000c4783838151156200237d5781518083602001fd5b8060405162461bcd60e51b815260040162000553919062003221565b611542806200323783390190565b6001600160a01b0381168114620023bd57600080fd5b50565b8035620023cd81620023a7565b919050565b803563ffffffff81168114620023cd57600080fd5b60008083601f840112620023fa57600080fd5b5081356001600160401b038111156200241257600080fd5b6020830191508360208285010111156200242b57600080fd5b9250929050565b60008060008060008060a087890312156200244c57600080fd5b86356200245981620023a7565b95506200246960208801620023d2565b945060408701356200247b81620023a7565b93506060870135925060808701356001600160401b038111156200249e57600080fd5b620024ac89828a01620023e7565b979a9699509497509295939492505050565b60008060408385031215620024d257600080fd5b620024dd83620023d2565b91506020830135620024ef81620023a7565b809150509250929050565b6000602082840312156200250d57600080fd5b81356200251a81620023a7565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562002562576200256262002521565b604052919050565b600082601f8301126200257c57600080fd5b813560206001600160401b038211156200259a576200259a62002521565b8160051b620025ab82820162002537565b9283528481018201928281019087851115620025c657600080fd5b83870192505b84831015620022e757823582529183019190830190620025cc565b60008060008060808587031215620025fe57600080fd5b8435935060208501356001600160401b03808211156200261d57600080fd5b6200262b888389016200256a565b94506040870135915080821682146200264357600080fd5b509396929550929360600135925050565b60ff81168114620023bd57600080fd5b600080600080600080600060e0888a0312156200268057600080fd5b87356200268d8162002654565b96506200269d60208901620023d2565b95506040880135620026af81620023a7565b9450620026bf60608901620023d2565b93506080880135620026d181620023a7565b9699959850939692959460a0840135945060c09093013592915050565b60006001600160401b038211156200270a576200270a62002521565b50601f01601f191660200190565b600082601f8301126200272a57600080fd5b8135620027416200273b82620026ee565b62002537565b8181528460208386010111156200275757600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806000806000806000806101408b8d0312156200279557600080fd5b8a356001600160401b0380821115620027ad57600080fd5b620027bb8e838f016200256a565b9b50620027cb60208e01620023d2565b9a5060408d0135995060608d01359850620027e960808e01620023d2565b9750620027f960a08e01620023c0565b96506200280960c08e01620023d2565b95506200281960e08e01620023c0565b94506101008d013593506101208d01359150808211156200283957600080fd5b50620028488d828e0162002718565b9150509295989b9194979a5092959850565b6000806000606084860312156200287057600080fd5b6200287b84620023d2565b925060208401356200288d81620023a7565b915060408401356200289f81620023a7565b809150509250925092565b600060208284031215620028bd57600080fd5b5035919050565b600080600080600080600060a0888a031215620028e057600080fd5b620028eb88620023d2565b96506020880135620028fd81620023a7565b955060408801356001600160401b03808211156200291a57600080fd5b620029288b838c01620023e7565b909750955060608a01359150808211156200294257600080fd5b50620029518a828b01620023e7565b9094509250506080880135620029678162002654565b8091505092959891949750929550565b6000806000606084860312156200298d57600080fd5b6200299884620023d2565b92506020840135620029aa81620023a7565b915060408401356001600160401b03811115620029c657600080fd5b620029d48682870162002718565b9150509250925092565b60208082526042908201527f456d657267656e63794d616e616765723a3a69664e6f74456d657267656e637960408201527f53746174653a206f6e6c79206966206e6f7420656d657267656e637920737461606082015261746560f01b608082015260a00190565b6001600160a01b03929092168252602082015260400190565b60005b8381101562002a7c57818101518382015260200162002a62565b8381111562000fdb5750506000910152565b600082601f83011262002aa057600080fd5b815162002ab16200273b82620026ee565b81815284602083860101111562002ac757600080fd5b62000c4782602083016020870162002a5f565b60006020828403121562002aed57600080fd5b81516001600160401b0381111562002b0457600080fd5b62000c478482850162002a8e565b60006020828403121562002b2557600080fd5b81516200251a8162002654565b6000815180845262002b4c81602086016020860162002a5f565b601f01601f19169290920160200192915050565b60608152600062002b75606083018662002b32565b828103602084015262002b89818662002b32565b91505060ff83166040830152949350505050565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c0830181905260009162002bf18483018762002b32565b925080851660e085015250509998505050505050505050565b6020808252603a908201527f506f6c79676f6e5a6b45564d3a3a6f6e6c79506f6c79676f6e5a6b45564d3a2060408201527f6f6e6c7920506f6c79676f6e5a6b45564d20636f6e7472616374000000000000606082015260800190565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008262002ce55762002ce562002ca7565b500490565b60006001820162002cff5762002cff62002cbd565b5060010190565b6001600160a01b038416815263ffffffff8316602082015260606040820181905260009062002d389083018462002b32565b95945050505050565b6000825162002d5581846020870162002a5f565b9190910192915050565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b60008060006060848603121562002dac57600080fd5b83516001600160401b038082111562002dc457600080fd5b62002dd28783880162002a8e565b9450602086015191508082111562002de957600080fd5b5062002df88682870162002a8e565b92505060408401516200289f8162002654565b60008262002e1d5762002e1d62002ca7565b500690565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60608152600062002e6160608301878962002e22565b828103602084015262002e7681868862002e22565b91505060ff831660408301529695505050505050565b6000835162002ea081846020880162002a5f565b83519083019062002eb681836020880162002a5f565b01949350505050565b6000808585111562002ed057600080fd5b8386111562002ede57600080fd5b5050820193919092039150565b600080600080600080600060e0888a03121562002f0757600080fd5b873562002f1481620023a7565b9650602088013562002f2681620023a7565b955060408801359450606088013593506080880135620026d18162002654565b6020808252603c908201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a2050657260408201527f6d6974206f776e6572206d757374206265207468652073656e64657200000000606082015260800190565b60208082526033908201527f506f6c79676f6e5a6b45564d4272696467653a3a5f7065726d69743a205370656040820152726e646572206d7573742062652027746869732760681b606082015260800190565b8015158114620023bd57600080fd5b600080600080600080600080610100898b0312156200302357600080fd5b88356200303081620023a7565b975060208901356200304281620023a7565b965060408901359550606089013594506080890135620030628162002ff6565b935060a0890135620030748162002654565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115620030d2578160001904821115620030b657620030b662002cbd565b80851615620030c457918102915b93841c939080029062003096565b509250929050565b600082620030eb5750600162000a55565b81620030fa5750600062000a55565b81600181146200311357600281146200311e576200313e565b600191505062000a55565b60ff84111562003132576200313262002cbd565b50506001821b62000a55565b5060208310610133831016604e8410600b841016171562003163575081810a62000a55565b6200316f838362003091565b806000190482111562003186576200318662002cbd565b029392505050565b60006200251a8383620030da565b600082821015620031b157620031b162002cbd565b500390565b60008219821115620031cc57620031cc62002cbd565b500190565b634e487b7160e01b600052600160045260246000fd5b600060208284031215620031fa57600080fd5b5051919050565b6000602082840312156200321457600080fd5b81516200251a8162002ff6565b6020815260006200251a602083018462002b3256fe60c06040523480156200001157600080fd5b5060405162001542380380620015428339810160408190526200003491620002ad565b82826003620000448382620003c1565b506004620000538282620003c1565b5050600580546001600160a81b0319163360ff60a01b191617600160a01b60ff851602179055504660808190526200008b9062000098565b60a052506200048d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000c562000146565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b606060038054620001579062000332565b80601f0160208091040260200160405190810160405280929190818152602001828054620001859062000332565b8015620001d65780601f10620001aa57610100808354040283529160200191620001d6565b820191906000526020600020905b815481529060010190602001808311620001b857829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200020857600080fd5b81516001600160401b0380821115620002255762000225620001e0565b604051601f8301601f19908116603f01168101908282118183101715620002505762000250620001e0565b816040528381526020925086838588010111156200026d57600080fd5b600091505b8382101562000291578582018301518183018401529082019062000272565b83821115620002a35760008385830101525b9695505050505050565b600080600060608486031215620002c357600080fd5b83516001600160401b0380821115620002db57600080fd5b620002e987838801620001f6565b945060208601519150808211156200030057600080fd5b506200030f86828701620001f6565b925050604084015160ff811681146200032757600080fd5b809150509250925092565b600181811c908216806200034757607f821691505b6020821081036200036857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003bc57600081815260208120601f850160051c81016020861015620003975750805b601f850160051c820191505b81811015620003b857828155600101620003a3565b5050505b505050565b81516001600160401b03811115620003dd57620003dd620001e0565b620003f581620003ee845462000332565b846200036e565b602080601f8311600181146200042d5760008415620004145750858301515b600019600386901b1c1916600185901b178555620003b8565b600085815260208120601f198616915b828110156200045e578886015182559484019460019091019084016200043d565b50858210156200047d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611088620004ba60003960006104690152600081816102f9015261043301526110886000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146102ce578063a9059cbb146102e1578063cd0d0096146102f4578063d505accf1461031b578063dd62ed3e1461032e578063ffa1ad741461034157600080fd5b806370a082311461023f5780637ecebe001461026857806395d89b41146102885780639dc29fac14610290578063a3c573eb146102a357600080fd5b806330adf81f116100ff57806330adf81f146101c9578063313ce567146101f05780633644e5151461020f578063395093511461021757806340c10f191461022a57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806320606b701461018f57806323b872dd146101b6575b600080fd5b610144610361565b6040516101519190610dc2565b60405180910390f35b61016d610168366004610e33565b6103f3565b6040519015158152602001610151565b6002545b604051908152602001610151565b6101817f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61016d6101c4366004610e5d565b61040b565b6101817f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b600554600160a01b900460ff1660405160ff9091168152602001610151565b61018161042f565b61016d610225366004610e33565b61048b565b61023d610238366004610e33565b6104ad565b005b61018161024d366004610e99565b6001600160a01b031660009081526020819052604090205490565b610181610276366004610e99565b60066020526000908152604090205481565b6101446104ee565b61023d61029e366004610e33565b6104fd565b6005546102b6906001600160a01b031681565b6040516001600160a01b039091168152602001610151565b61016d6102dc366004610e33565b610531565b61016d6102ef366004610e33565b6105ac565b6101817f000000000000000000000000000000000000000000000000000000000000000081565b61023d610329366004610ebb565b6105ba565b61018161033c366004610f2e565b6107f5565b610144604051806040016040528060018152602001603160f81b81525081565b60606003805461037090610f61565b80601f016020809104026020016040519081016040528092919081815260200182805461039c90610f61565b80156103e95780601f106103be576101008083540402835291602001916103e9565b820191906000526020600020905b8154815290600101906020018083116103cc57829003601f168201915b5050505050905090565b600033610401818585610820565b5060019392505050565b600033610419858285610945565b6104248585856109bf565b506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104665761046146610b51565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b60003361040181858561049e83836107f5565b6104a89190610fb1565b610820565b6005546001600160a01b031633146104e05760405162461bcd60e51b81526004016104d790610fc9565b60405180910390fd5b6104ea8282610bfd565b5050565b60606004805461037090610f61565b6005546001600160a01b031633146105275760405162461bcd60e51b81526004016104d790610fc9565b6104ea8282610caa565b6000338161053f82866107f5565b90508381101561059f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104d7565b6104248286868403610820565b6000336104018185856109bf565b834211156106165760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b60648201526084016104d7565b6001600160a01b038716600090815260066020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661066383611019565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006106c161042f565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa15801561074c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107825750896001600160a01b0316816001600160a01b0316145b6107de5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b60648201526084016104d7565b6107e98a8a8a610820565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108825760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104d7565b6001600160a01b0382166108e35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104d7565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600061095184846107f5565b905060001981146109b957818110156109ac5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104d7565b6109b98484848403610820565b50505050565b6001600160a01b038316610a235760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104d7565b6001600160a01b038216610a855760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104d7565b6001600160a01b03831660009081526020819052604090205481811015610afd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104d7565b6001600160a01b0384811660008181526020818152604080832087870390559387168083529184902080548701905592518581529092600080516020611033833981519152910160405180910390a36109b9565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610b7c610361565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610c535760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104d7565b8060026000828254610c659190610fb1565b90915550506001600160a01b03821660008181526020818152604080832080548601905551848152600080516020611033833981519152910160405180910390a35050565b6001600160a01b038216610d0a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104d7565b6001600160a01b03821660009081526020819052604090205481811015610d7e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104d7565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192916000805160206110338339815191529101610938565b600060208083528351808285015260005b81811015610def57858101830151858201604001528201610dd3565b81811115610e01576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114610e2e57600080fd5b919050565b60008060408385031215610e4657600080fd5b610e4f83610e17565b946020939093013593505050565b600080600060608486031215610e7257600080fd5b610e7b84610e17565b9250610e8960208501610e17565b9150604084013590509250925092565b600060208284031215610eab57600080fd5b610eb482610e17565b9392505050565b600080600080600080600060e0888a031215610ed657600080fd5b610edf88610e17565b9650610eed60208901610e17565b95506040880135945060608801359350608088013560ff81168114610f1157600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f4157600080fd5b610f4a83610e17565b9150610f5860208401610e17565b90509250929050565b600181811c90821680610f7557607f821691505b602082108103610f9557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115610fc457610fc4610f9b565b500190565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161102b5761102b610f9b565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212208b7986f78e961ad6c0885b86b24ce427045be98073c1f3d7fe18180542ab873564736f6c634300080f0033506f6c79676f6e5a6b45564d4272696467653a3a5f7665726966794c6561663aa26469706673582212207321963add10aa42fbf70097691018c23164a96132c6cd71e46023fffa7d461764736f6c634300080f00338203e88080777dd3dc8232ea55dbedf0681a6a9134de7200ab1334a6015345d9257ef62971780fe992e94f761de3335283ba6c1d9f3f512e05503d4526f62eb9644a1cf5681c", - "receipt": { - "status": 1, - "gasUsed": "0x3d3cde", - "logs": [] - }, - "createAddress": "0x9d98deabc42dd696deb9e40b4f1cab7ddbf55988" - }, - { - "rawTx": "0xf887028083989680949d98deabc42dd696deb9e40b4f1cab7ddbf5598880b864647c576c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000ae4bb80be56b819606589de61d5ec3b522eeb03200000000000000000000000000000000000000000000000000000000000000008203e8808052465a317fd5c147ded90409a32915bbe579c557787787abbc17e67a47f773694f7fa1fd7b14ab8175e1725ec18cee985bcc262340ad5a215b097f2b3a880ee41b", - "receipt": { - "status": 1, - "gasUsed": "0x016aa5", - "logs": [ - [ - "0x9d98deabc42dd696deb9e40b4f1cab7ddbf55988", - [ - "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" - ], - "0x0000000000000000000000000000000000000000000000000000000000000001" - ] - ] - }, - "createAddress": null + }, + { + "contractName": "ProxyAdmin", + "balance": "0", + "nonce": "1", + "address": "0xF4041D86682E321927b1AEFEf2c1086A67E2b954", + "bytecode": "0x60806040526004361061006b5760003560e01c8063204e1c7a14610070578063715018a6146100a65780637eff275e146100bd5780638da5cb5b146100dd5780639623609d146100fb57806399a88ec41461010e578063f2fde38b1461012e578063f3b7dead1461014e575b600080fd5b34801561007c57600080fd5b5061009061008b366004610483565b61016e565b60405161009d91906104a7565b60405180910390f35b3480156100b257600080fd5b506100bb6101ff565b005b3480156100c957600080fd5b506100bb6100d83660046104bb565b610213565b3480156100e957600080fd5b506000546001600160a01b0316610090565b6100bb61010936600461050a565b61027d565b34801561011a57600080fd5b506100bb6101293660046104bb565b6102ec565b34801561013a57600080fd5b506100bb610149366004610483565b610320565b34801561015a57600080fd5b50610090610169366004610483565b61039e565b6000806000836001600160a01b031660405161019490635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101cf576040519150601f19603f3d011682016040523d82523d6000602084013e6101d4565b606091505b5091509150816101e357600080fd5b808060200190518101906101f791906105e0565b949350505050565b6102076103c4565b610211600061041e565b565b61021b6103c4565b6040516308f2839760e41b81526001600160a01b03831690638f283970906102479084906004016104a7565b600060405180830381600087803b15801561026157600080fd5b505af1158015610275573d6000803e3d6000fd5b505050505050565b6102856103c4565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102b590869086906004016105fd565b6000604051808303818588803b1580156102ce57600080fd5b505af11580156102e2573d6000803e3d6000fd5b5050505050505050565b6102f46103c4565b604051631b2ce7f360e11b81526001600160a01b03831690633659cfe6906102479084906004016104a7565b6103286103c4565b6001600160a01b0381166103925760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61039b8161041e565b50565b6000806000836001600160a01b0316604051610194906303e1469160e61b815260040190565b6000546001600160a01b031633146102115760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610389565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116811461039b57600080fd5b60006020828403121561049557600080fd5b81356104a08161046e565b9392505050565b6001600160a01b0391909116815260200190565b600080604083850312156104ce57600080fd5b82356104d98161046e565b915060208301356104e98161046e565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561051f57600080fd5b833561052a8161046e565b9250602084013561053a8161046e565b9150604084013567ffffffffffffffff8082111561055757600080fd5b818601915086601f83011261056b57600080fd5b81358181111561057d5761057d6104f4565b604051601f8201601f19908116603f011681019083821181831017156105a5576105a56104f4565b816040528281528960208487010111156105be57600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000602082840312156105f257600080fd5b81516104a08161046e565b60018060a01b038316815260006020604081840152835180604085015260005b818110156106395785810183015185820160600152820161061d565b506000606082860101526060601f19601f83011685010192505050939250505056fea26469706673582212206232e2e10dd0ae62d268793365a9581496905b1311fa12c8e65667fb563742fa64736f6c63430008110033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000dead72fd97a579e98aef2f9eb190066e1858d15a" } + }, + { + "contractName": "PolygonZkEVMBridge implementation", + "balance": "0", + "nonce": "1", + "address": "0xe74D91A48dD2ED0a9f5585368abDED7AF071b12C", + "bytecode": "0x608060405260043610620001435760003560e01c80633e19704311620000b9578063bab161bf1162000078578063bab161bf14620003e6578063d02103ca1462000420578063d96a15f71462000449578063dbc169761462000460578063ee25560b1462000478578063fb57083414620004a957600080fd5b80633e19704314620002f8578063647c576c146200031d57806381b1c17414620003425780639e34070f146200037c578063aaa13cc214620003c157600080fd5b80632d2c9d9411620001065780632d2c9d9414620002035780632dfdf0b51462000228578063318aee3d146200024f57806334ac9cf214620002be5780633ae0504714620002e057600080fd5b80630871e971146200014857806315064c9614620001615780632072f6c5146200019257806322e95f2c14620001aa5780632cffd02e14620001de575b600080fd5b6200015f6200015936600462002418565b620004ce565b005b3480156200016e57600080fd5b506068546200017d9060ff1681565b60405190151581526020015b60405180910390f35b3480156200019f57600080fd5b506200015f620008df565b348015620001b757600080fd5b50620001cf620001c9366004620024a4565b62000917565b604051620001899190620024e0565b348015620001eb57600080fd5b506200015f620001fd36600462002507565b6200096a565b3480156200021057600080fd5b506200015f6200022236600462002507565b62000d6e565b3480156200023557600080fd5b506200024060535481565b60405190815260200162000189565b3480156200025c57600080fd5b50620002996200026e366004620025ec565b606b6020526000908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b0390911660208301520162000189565b348015620002cb57600080fd5b50606c54620001cf906001600160a01b031681565b348015620002ed57600080fd5b506200024062000ebd565b3480156200030557600080fd5b50620002406200031736600462002623565b62000fa3565b3480156200032a57600080fd5b506200015f6200033c366004620026ad565b62001030565b3480156200034f57600080fd5b50620001cf62000361366004620026fd565b606a602052600090815260409020546001600160a01b031681565b3480156200038957600080fd5b506200017d6200039b366004620026fd565b600881901c600090815260696020526040902054600160ff9092169190911b9081161490565b348015620003ce57600080fd5b50620001cf620003e036600462002717565b620011ad565b348015620003f357600080fd5b506068546200040a90610100900463ffffffff1681565b60405163ffffffff909116815260200162000189565b3480156200042d57600080fd5b50606854620001cf90600160281b90046001600160a01b031681565b6200015f6200045a366004620027ca565b620012c4565b3480156200046d57600080fd5b506200015f62001448565b3480156200048557600080fd5b506200024062000497366004620026fd565b60696020526000908152604090205481565b348015620004b657600080fd5b506200017d620004c836600462002834565b6200147e565b60685460ff1615620004f357604051630bc011ff60e21b815260040160405180910390fd5b620004fd62001567565b60685463ffffffff868116610100909204161480620005235750600263ffffffff861610155b1562000542576040516302caf51760e11b815260040160405180910390fd5b6000806060856001600160a01b038a166200058257863414620005785760405163b89240f560e01b815260040160405180910390fd5b60009250620007e7565b3415620005a25760405163798ee6f160e01b815260040160405180910390fd5b6001600160a01b03808b166000908152606b602090815260409182902082518084019093525463ffffffff81168352640100000000900490921691810182905290156200066157604051632770a7eb60e21b81526001600160a01b038c1690639dc29fac90620006199033908c9060040162002881565b600060405180830381600087803b1580156200063457600080fd5b505af115801562000649573d6000803e3d6000fd5b505050508060200151945080600001519350620007e5565b85156200067657620006768b898989620015c2565b6040516370a0823160e01b81526000906001600160a01b038d16906370a0823190620006a7903090600401620024e0565b602060405180830381865afa158015620006c5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006eb91906200289a565b9050620007046001600160a01b038d1633308c62001925565b6040516370a0823160e01b81526000906001600160a01b038e16906370a082319062000735903090600401620024e0565b602060405180830381865afa15801562000753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200077991906200289a565b9050620007878282620028ca565b6068548e9850610100900463ffffffff1696509350620007a78762001992565b620007b28e62001a59565b620007bd8f62001b17565b604051602001620007d19392919062002934565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868c8c86886053546040516200082998979695949392919062002971565b60405180910390a1620008546200084e600085878d8d87898051906020012062000fa3565b62001bd8565b606854600160281b90046001600160a01b03166333d6247d6200087662000ebd565b6040518263ffffffff1660e01b81526004016200089591815260200190565b600060405180830381600087803b158015620008b057600080fd5b505af1158015620008c5573d6000803e3d6000fd5b5050505050505050620008d760018055565b505050505050565b606c546001600160a01b031633146200090b5760405163e2e8106b60e01b815260040160405180910390fd5b6200091562001cdc565b565b6000606a6000848460405160200162000932929190620029de565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156200098f57604051630bc011ff60e21b815260040160405180910390fd5b620009a68b8b8b8b8b8b8b8b8b8b8b600062001d39565b6001600160a01b03861662000a4f57604080516000808252602082019092526001600160a01b038616908590604051620009e1919062002a1e565b60006040518083038185875af1925050503d806000811462000a20576040519150601f19603f3d011682016040523d82523d6000602084013e62000a25565b606091505b505090508062000a4857604051630ce8f45160e31b815260040160405180910390fd5b5062000d20565b60685463ffffffff61010090910481169088160362000a845762000a7e6001600160a01b038716858562001eb7565b62000d20565b6000878760405160200162000a9b929190620029de565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b03168062000cb8576000808062000ae48688018862002af5565b92509250925060008584848460405162000afe9062002391565b62000b0c9392919062002934565b8190604051809103906000f590508015801562000b2d573d6000803e3d6000fd5b506040516340c10f1960e01b81529091506001600160a01b038216906340c10f199062000b61908d908d9060040162002881565b600060405180830381600087803b15801562000b7c57600080fd5b505af115801562000b91573d6000803e3d6000fd5b5050505080606a600088815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808e63ffffffff1681526020018d6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000ca695949392919062002b93565b60405180910390a15050505062000d1d565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199062000ce8908990899060040162002881565b600060405180830381600087803b15801562000d0357600080fd5b505af115801562000d18573d6000803e3d6000fd5b505050505b50505b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459838a8888878760405162000d5995949392919062002bce565b60405180910390a15050505050505050505050565b60685460ff161562000d9357604051630bc011ff60e21b815260040160405180910390fd5b62000daa8b8b8b8b8b8b8b8b8b8b8b600162001d39565b6000846001600160a01b031684888a868660405160240162000dd0949392919062002c05565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525162000e07919062002a1e565b60006040518083038185875af1925050503d806000811462000e46576040519150601f19603f3d011682016040523d82523d6000602084013e62000e4b565b606091505b505090508062000e6e576040516337e391c360e01b815260040160405180910390fd5b7f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459838b8989888860405162000ea795949392919062002bce565b60405180910390a1505050505050505050505050565b605354600090819081805b602081101562000f9a578083901c60011660010362000f2b576033816020811062000ef75762000ef762002c42565b0154604080516020810192909252810185905260600160405160208183030381529060405280519060200120935062000f58565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b6040805160208101849052908101839052606001604051602081830303815290604052805190602001209150808062000f919062002c58565b91505062000ec8565b50919392505050565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b600054610100900460ff1615808015620010515750600054600160ff909116105b806200106d5750303b1580156200106d575060005460ff166001145b620010d65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015620010fa576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff87160265010000000000600160c81b03191617600160281b6001600160a01b038681169190910291909117909155606c80546001600160a01b0319169184169190911790556200116062001ed9565b8015620011a7576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6000808888604051602001620011c5929190620029de565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180602001620011f89062002391565b601f1982820381018352601f90910116604081905262001225908d908d908d908d908d9060200162002c74565b60408051601f198184030181529082905262001245929160200162002cb5565b604051602081830303815290604052805190602001206040516020016200129e94939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f1901815291905280516020909101209a9950505050505050505050565b60685460ff1615620012e957604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8581166101009092041614806200130f5750600263ffffffff851610155b156200132e576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338787348888605354604051620013849998979695949392919062002ce8565b60405180910390a1620013cd6200084e6001606860019054906101000a900463ffffffff16338888348989604051620013bf92919062002d57565b604051809103902062000fa3565b606854600160281b90046001600160a01b03166333d6247d620013ef62000ebd565b6040518263ffffffff1660e01b81526004016200140e91815260200190565b600060405180830381600087803b1580156200142957600080fd5b505af11580156200143e573d6000803e3d6000fd5b5050505050505050565b606c546001600160a01b03163314620014745760405163e2e8106b60e01b815260040160405180910390fd5b6200091562001f0d565b600084815b60208110156200155957600163ffffffff8616821c81169003620014f557858160208110620014b657620014b662002c42565b602002013582604051602001620014d7929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001544565b818682602081106200150b576200150b62002c42565b60200201356040516020016200152b929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80620015508162002c58565b91505062001483565b50821490505b949350505050565b600260015403620015bb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620010cd565b6002600155565b6000620015d3600482848662002d67565b620015de9162002d93565b9050632afa533160e01b6001600160e01b03198216016200177f57600080808080808062001610896004818d62002d67565b8101906200161f919062002dc4565b9650965096509650965096509650336001600160a01b0316876001600160a01b031614620016605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146200168a5760405163750643af60e01b815260040160405180910390fd5b8a8514620016ab576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e16916200172b919062002a1e565b6000604051808303816000865af19150503d80600081146200176a576040519150601f19603f3d011682016040523d82523d6000602084013e6200176f565b606091505b505050505050505050506200191e565b6001600160e01b031981166323f2ebc360e21b14620017b157604051637141605d60e11b815260040160405180910390fd5b600080808080808080620017c98a6004818e62002d67565b810190620017d8919062002e2e565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146200181b5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b0387163014620018455760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f1691620018ce919062002a1e565b6000604051808303816000865af19150503d80600081146200190d576040519150601f19603f3d011682016040523d82523d6000602084013e62001912565b606091505b50505050505050505050505b5050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052620011a79085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001f66565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b03861691620019db919062002a1e565b600060405180830381855afa9150503d806000811462001a18576040519150601f19603f3d011682016040523d82523d6000602084013e62001a1d565b606091505b50915091508162001a4e57604051806040016040528060078152602001664e4f5f4e414d4560c81b8152506200155f565b6200155f816200203f565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b0386169162001aa2919062002a1e565b600060405180830381855afa9150503d806000811462001adf576040519150601f19603f3d011682016040523d82523d6000602084013e62001ae4565b606091505b50915091508162001a4e57604051806040016040528060098152602001681393d7d4d6535093d360ba1b8152506200155f565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b0386169162001b5f919062002a1e565b600060405180830381855afa9150503d806000811462001b9c576040519150601f19603f3d011682016040523d82523d6000602084013e62001ba1565b606091505b509150915081801562001bb5575080516020145b62001bc25760126200155f565b808060200190518101906200155f919062002eba565b80600162001be96020600262002fd7565b62001bf59190620028ca565b6053541062001c17576040516377ae67b360e11b815260040160405180910390fd5b600060536000815462001c2a9062002c58565b9182905550905060005b602081101562001cc6578082901c60011660010362001c6c57826033826020811062001c645762001c6462002c42565b015550505050565b6033816020811062001c825762001c8262002c42565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001cbd9062002c58565b91505062001c34565b5062001cd162002fe5565b505050565b60018055565b60685460ff161562001d0157604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b62001d4a8b63ffffffff16620021e8565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af115801562001dc5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001deb91906200289a565b90508060000362001e0e57604051622f6fad60e01b815260040160405180910390fd5b60685463ffffffff888116610100909204161462001e3f576040516302caf51760e11b815260040160405180910390fd5b606854600090610100900463ffffffff1662001e5d57508962001e60565b508a5b62001e8962001e80848c8c8c8c8c8c8c604051620013bf92919062002d57565b8f8f846200147e565b62001ea7576040516338105f3b60e21b815260040160405180910390fd5b5050505050505050505050505050565b62001cd18363a9059cbb60e01b84846040516024016200195a92919062002881565b600054610100900460ff1662001f035760405162461bcd60e51b8152600401620010cd9062002ffb565b6200091562002234565b60685460ff1662001f3157604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600062001fbd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200225e9092919063ffffffff16565b80519091501562001cd1578080602001905181019062001fde919062003046565b62001cd15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620010cd565b6060604082511062002061578180602001905181019062000964919062003066565b8151602003620021b55760005b602081108015620020a157508281815181106200208f576200208f62002c42565b01602001516001600160f81b03191615155b15620020bc5780620020b38162002c58565b9150506200206e565b80600003620020f55750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b0381111562002112576200211262002a08565b6040519080825280601f01601f1916602001820160405280156200213d576020820181803683370190505b50905060005b82811015620021ad5784818151811062002161576200216162002c42565b602001015160f81c60f81b82828151811062002181576200218162002c42565b60200101906001600160f81b031916908160001a90535080620021a48162002c58565b91505062002143565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b600881901c60008181526069602052604081208054600160ff861690811b918218928390559290919081831690036200191e57604051630c8d9eab60e31b815260040160405180910390fd5b600054610100900460ff1662001cd65760405162461bcd60e51b8152600401620010cd9062002ffb565b60606200155f848460008585600080866001600160a01b0316858760405162002288919062002a1e565b60006040518083038185875af1925050503d8060008114620022c7576040519150601f19603f3d011682016040523d82523d6000602084013e620022cc565b606091505b5091509150620022df87838387620022ea565b979650505050505050565b606083156200235e57825160000362002356576001600160a01b0385163b620023565760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620010cd565b50816200155f565b6200155f8383815115620023755781518083602001fd5b8060405162461bcd60e51b8152600401620010cd9190620030e5565b61159c80620030fb83390190565b6001600160a01b0381168114620023b557600080fd5b50565b803563ffffffff81168114620021e357600080fd5b60008083601f840112620023e057600080fd5b5081356001600160401b03811115620023f857600080fd5b6020830191508360208285010111156200241157600080fd5b9250929050565b60008060008060008060a087890312156200243257600080fd5b86356200243f816200239f565b95506200244f60208801620023b8565b9450604087013562002461816200239f565b93506060870135925060808701356001600160401b038111156200248457600080fd5b6200249289828a01620023cd565b979a9699509497509295939492505050565b60008060408385031215620024b857600080fd5b620024c383620023b8565b91506020830135620024d5816200239f565b809150509250929050565b6001600160a01b0391909116815260200190565b8061040081018310156200096457600080fd5b60008060008060008060008060008060006105208c8e0312156200252a57600080fd5b620025368d8d620024f4565b9a50620025476104008d01620023b8565b99506104208c013598506104408c01359750620025686104608d01620023b8565b96506104808c01356200257b816200239f565b95506200258c6104a08d01620023b8565b94506104c08c01356200259f816200239f565b93506104e08c013592506105008c01356001600160401b03811115620025c457600080fd5b620025d28e828f01620023cd565b915080935050809150509295989b509295989b9093969950565b600060208284031215620025ff57600080fd5b81356200260c816200239f565b9392505050565b60ff81168114620023b557600080fd5b600080600080600080600060e0888a0312156200263f57600080fd5b87356200264c8162002613565b96506200265c60208901620023b8565b955060408801356200266e816200239f565b94506200267e60608901620023b8565b9350608088013562002690816200239f565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215620026c357600080fd5b620026ce84620023b8565b92506020840135620026e0816200239f565b91506040840135620026f2816200239f565b809150509250925092565b6000602082840312156200271057600080fd5b5035919050565b600080600080600080600060a0888a0312156200273357600080fd5b6200273e88620023b8565b9650602088013562002750816200239f565b955060408801356001600160401b03808211156200276d57600080fd5b6200277b8b838c01620023cd565b909750955060608a01359150808211156200279557600080fd5b50620027a48a828b01620023cd565b9094509250506080880135620027ba8162002613565b8091505092959891949750929550565b60008060008060608587031215620027e157600080fd5b620027ec85620023b8565b93506020850135620027fe816200239f565b925060408501356001600160401b038111156200281a57600080fd5b6200282887828801620023cd565b95989497509550505050565b60008060008061046085870312156200284c57600080fd5b843593506200285f8660208701620024f4565b9250620028706104208601620023b8565b939692955092936104400135925050565b6001600160a01b03929092168252602082015260400190565b600060208284031215620028ad57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115620009645762000964620028b4565b60005b83811015620028fd578181015183820152602001620028e3565b50506000910152565b6000815180845262002920816020860160208601620028e0565b601f01601f19169290920160200192915050565b60608152600062002949606083018662002906565b82810360208401526200295d818662002906565b91505060ff83166040830152949350505050565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c08301819052600091620029c58483018762002906565b925080851660e085015250509998505050505050505050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b634e487b7160e01b600052604160045260246000fd5b6000825162002a32818460208701620028e0565b9190910192915050565b604051601f8201601f191681016001600160401b038111828210171562002a675762002a6762002a08565b604052919050565b60006001600160401b0382111562002a8b5762002a8b62002a08565b50601f01601f191660200190565b600082601f83011262002aab57600080fd5b813562002ac262002abc8262002a6f565b62002a3c565b81815284602083860101111562002ad857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121562002b0b57600080fd5b83356001600160401b038082111562002b2357600080fd5b62002b318783880162002a99565b9450602086013591508082111562002b4857600080fd5b5062002b578682870162002a99565b9250506040840135620026f28162002613565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090620022df908301848662002b6a565b63ffffffff95861681529390941660208401526001600160a01b039182166040840152166060820152608081019190915260a00190565b6001600160a01b038516815263ffffffff8416602082015260606040820181905260009062002c38908301848662002b6a565b9695505050505050565b634e487b7160e01b600052603260045260246000fd5b60006001820162002c6d5762002c6d620028b4565b5060010190565b60608152600062002c8a60608301878962002b6a565b828103602084015262002c9f81868862002b6a565b91505060ff831660408301529695505050505050565b6000835162002cc9818460208801620028e0565b83519083019062002cdf818360208801620028e0565b01949350505050565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c0830181905260009162002d3d848301878962002b6a565b925080851660e085015250509a9950505050505050505050565b8183823760009101908152919050565b6000808585111562002d7857600080fd5b8386111562002d8657600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101562002dbc5780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a03121562002de057600080fd5b873562002ded816200239f565b9650602088013562002dff816200239f565b955060408801359450606088013593506080880135620026908162002613565b8015158114620023b557600080fd5b600080600080600080600080610100898b03121562002e4c57600080fd5b883562002e59816200239f565b9750602089013562002e6b816200239f565b96506040890135955060608901359450608089013562002e8b8162002e1f565b935060a089013562002e9d8162002613565b979a969950949793969295929450505060c08201359160e0013590565b60006020828403121562002ecd57600080fd5b81516200260c8162002613565b600181815b8085111562002f1b57816000190482111562002eff5762002eff620028b4565b8085161562002f0d57918102915b93841c939080029062002edf565b509250929050565b60008262002f345750600162000964565b8162002f435750600062000964565b816001811462002f5c576002811462002f675762002f87565b600191505062000964565b60ff84111562002f7b5762002f7b620028b4565b50506001821b62000964565b5060208310610133831016604e8410600b841016171562002fac575081810a62000964565b62002fb8838362002eda565b806000190482111562002fcf5762002fcf620028b4565b029392505050565b60006200260c838362002f23565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000602082840312156200305957600080fd5b81516200260c8162002e1f565b6000602082840312156200307957600080fd5b81516001600160401b038111156200309057600080fd5b8201601f81018413620030a257600080fd5b8051620030b362002abc8262002a6f565b818152856020838501011115620030c957600080fd5b620030dc826020830160208601620028e0565b95945050505050565b6020815260006200260c60208301846200290656fe6101006040523480156200001257600080fd5b506040516200159c3803806200159c83398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516110e0620004bc60003960006101f70152600081816102ba015281816104e0015261054e0152600061049101526000818161031f015261045b01526110e06000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146102f4578063a9059cbb14610307578063cd0d00961461031a578063d505accf14610341578063dd62ed3e14610354578063ffa1ad741461036757600080fd5b806370a08231146102515780637ecebe001461027a57806395d89b411461029a5780639dc29fac146102a2578063a3c573eb146102b557600080fd5b806330adf81f116100ff57806330adf81f146101c9578063313ce567146101f05780633644e51514610221578063395093511461022957806340c10f191461023c57600080fd5b806306fdde031461013c578063095ea7b31461015a57806318160ddd1461017d57806320606b701461018f57806323b872dd146101b6575b600080fd5b610144610387565b6040516101519190610e26565b60405180910390f35b61016d610168366004610e90565b610419565b6040519015158152602001610151565b6002545b604051908152602001610151565b6101817f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b61016d6101c4366004610eba565b610433565b6101817f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610151565b610181610457565b61016d610237366004610e90565b6104b3565b61024f61024a366004610e90565b6104d5565b005b61018161025f366004610ef6565b6001600160a01b031660009081526020819052604090205490565b610181610288366004610ef6565b60056020526000908152604090205481565b610144610534565b61024f6102b0366004610e90565b610543565b6102dc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610151565b61016d610302366004610e90565b610595565b61016d610315366004610e90565b610610565b6101817f000000000000000000000000000000000000000000000000000000000000000081565b61024f61034f366004610f18565b61061e565b610181610362366004610f8b565b610859565b610144604051806040016040528060018152602001603160f81b81525081565b60606003805461039690610fbe565b80601f01602080910402602001604051908101604052809291908181526020018280546103c290610fbe565b801561040f5780601f106103e45761010080835404028352916020019161040f565b820191906000526020600020905b8154815290600101906020018083116103f257829003601f168201915b5050505050905090565b600033610427818585610884565b60019150505b92915050565b6000336104418582856109a9565b61044c858585610a23565b506001949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000461461048e5761048946610bb5565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000336104278185856104c68383610859565b6104d0919061100e565b610884565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105265760405162461bcd60e51b815260040161051d90611021565b60405180910390fd5b6105308282610c61565b5050565b60606004805461039690610fbe565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461058b5760405162461bcd60e51b815260040161051d90611021565b6105308282610d0e565b600033816105a38286610859565b9050838110156106035760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161051d565b61044c8286868403610884565b600033610427818585610a23565b8342111561067a5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a20457870697265642070656044820152631c9b5a5d60e21b606482015260840161051d565b6001600160a01b038716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866106c783611071565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610725610457565b60405161190160f01b602082015260228101919091526042810183905260620160408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa1580156107b0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107e65750896001600160a01b0316816001600160a01b0316145b6108425760405162461bcd60e51b815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c6964207369604482015266676e617475726560c81b606482015260840161051d565b61084d8a8a8a610884565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166108e65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161051d565b6001600160a01b0382166109475760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161051d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006109b58484610859565b90506000198114610a1d5781811015610a105760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161051d565b610a1d8484848403610884565b50505050565b6001600160a01b038316610a875760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161051d565b6001600160a01b038216610ae95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161051d565b6001600160a01b03831660009081526020819052604090205481811015610b615760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161051d565b6001600160a01b038481166000818152602081815260408083208787039055938716808352918490208054870190559251858152909260008051602061108b833981519152910160405180910390a3610a1d565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610be0610387565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6001600160a01b038216610cb75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161051d565b8060026000828254610cc9919061100e565b90915550506001600160a01b0382166000818152602081815260408083208054860190555184815260008051602061108b833981519152910160405180910390a35050565b6001600160a01b038216610d6e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161051d565b6001600160a01b03821660009081526020819052604090205481811015610de25760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161051d565b6001600160a01b03831660008181526020818152604080832086860390556002805487900390555185815291929160008051602061108b833981519152910161099c565b600060208083528351808285015260005b81811015610e5357858101830151858201604001528201610e37565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610e8b57600080fd5b919050565b60008060408385031215610ea357600080fd5b610eac83610e74565b946020939093013593505050565b600080600060608486031215610ecf57600080fd5b610ed884610e74565b9250610ee660208501610e74565b9150604084013590509250925092565b600060208284031215610f0857600080fd5b610f1182610e74565b9392505050565b600080600080600080600060e0888a031215610f3357600080fd5b610f3c88610e74565b9650610f4a60208901610e74565b95506040880135945060608801359350608088013560ff81168114610f6e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610f9e57600080fd5b610fa783610e74565b9150610fb560208401610e74565b90509250929050565b600181811c90821680610fd257607f821691505b602082108103610ff257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561042d5761042d610ff8565b60208082526030908201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60408201526f6c79676f6e5a6b45564d42726964676560801b606082015260800190565b60006001820161108357611083610ff8565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c54f702400844bca54b965f08b878a7ad166d07c77c1b4434783c6c861d64cea64736f6c63430008110033a26469706673582212202aa6f7b7ecc82d0d4918ea3545a938824a9c0c986e4c0adb6b439e9bf3d70d0864736f6c63430008110033" + }, + { + "contractName": "PolygonZkEVMBridge proxy", + "balance": "200000000000000000000000000", + "nonce": "1", + "address": "0xd0a3d58d135e2ee795dFB26ec150D339394254B9", + "bytecode": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106be565b610118565b61005b6100933660046106d9565b610155565b3480156100a457600080fd5b506100ad6101bc565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106be565b6101ed565b3480156100f557600080fd5b506100ad61020d565b610106610269565b6101166101116102fe565b610308565b565b61012061032c565b6001600160a01b0316330361014d5761014a8160405180602001604052806000815250600061035f565b50565b61014a6100fe565b61015d61032c565b6001600160a01b031633036101b4576101af8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061035f915050565b505050565b6101af6100fe565b60006101c661032c565b6001600160a01b031633036101e2576101dd6102fe565b905090565b6101ea6100fe565b90565b6101f561032c565b6001600160a01b0316330361014d5761014a8161038a565b600061021761032c565b6001600160a01b031633036101e2576101dd61032c565b606061025383836040518060600160405280602781526020016107d0602791396103de565b9392505050565b6001600160a01b03163b151590565b61027161032c565b6001600160a01b031633036101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101dd610456565b3660008037600080366000845af43d6000803e808015610327573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103688361047e565b6000825111806103755750805b156101af57610384838361022e565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103b361032c565b604080516001600160a01b03928316815291841660208301520160405180910390a161014a816104be565b6060600080856001600160a01b0316856040516103fb9190610780565b600060405180830381855af49150503d8060008114610436576040519150601f19603f3d011682016040523d82523d6000602084013e61043b565b606091505b509150915061044c86838387610567565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610350565b610487816105e6565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105235760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016102f5565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b606083156105d45782516000036105cd576105818561025a565b6105cd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102f5565b50816105de565b6105de8383610678565b949350505050565b6105ef8161025a565b6106515760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102f5565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610546565b8151156106885781518083602001fd5b8060405162461bcd60e51b81526004016102f5919061079c565b80356001600160a01b03811681146106b957600080fd5b919050565b6000602082840312156106d057600080fd5b610253826106a2565b6000806000604084860312156106ee57600080fd5b6106f7846106a2565b9250602084013567ffffffffffffffff8082111561071457600080fd5b818601915086601f83011261072857600080fd5b81358181111561073757600080fd5b87602082850101111561074957600080fd5b6020830194508093505050509250925092565b60005b8381101561077757818101518382015260200161075f565b50506000910152565b6000825161079281846020870161075c565b9190910192915050565b60208152600082518060208401526107bb81604085016020870161075c565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220557373ec903fd3bc4b75a2c6285870c5d4a0ead46cf8edd41db562a58981cc1264736f6c63430008110033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000068": "0x00000000000000a40d5f56745a118d0906a34e69aec8c0db1cb8fa0000000100", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000f4041d86682e321927b1aefef2c1086a67e2b954", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000e74d91a48dd2ed0a9f5585368abded7af071b12c" + } + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", + "balance": "0", + "nonce": "1", + "address": "0xE641334b752d435a5133f64c6DBAB34431A9B9DC", + "bytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b36600461012f565b60006020819052908152604090205481565b6100a061009b36600461012f565b6100e1565b005b6100c97f000000000000000000000000d0a3d58d135e2ee795dfb26ec150d339394254b981565b6040516001600160a01b039091168152602001610064565b336001600160a01b037f000000000000000000000000d0a3d58d135e2ee795dfb26ec150d339394254b9161461012a5760405163b49365dd60e01b815260040160405180910390fd5b600155565b60006020828403121561014157600080fd5b503591905056fea2646970667358221220859fbbe22cdffd5d3aab670dd9922eb1c7afadaaea0a619f34b3cb92884acce464736f6c63430008110033" + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", + "balance": "0", + "nonce": "1", + "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", + "bytecode": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106ca565b610118565b61005b6100933660046106e5565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106ca565b61020b565b3480156100f557600080fd5b506100ad610235565b610106610292565b610116610111610331565b61033b565b565b61012061035f565b6001600160a01b0316336001600160a01b031614156101575761015481604051806020016040528060008152506000610392565b50565b6101546100fe565b61016761035f565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610392915050565b505050565b6101c36100fe565b60006101da61035f565b6001600160a01b0316336001600160a01b03161415610200576101fb610331565b905090565b6102086100fe565b90565b61021361035f565b6001600160a01b0316336001600160a01b0316141561015757610154816103f1565b600061023f61035f565b6001600160a01b0316336001600160a01b03161415610200576101fb61035f565b606061028583836040518060600160405280602781526020016107e460279139610445565b9392505050565b3b151590565b61029a61035f565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb610519565b3660008037600080366000845af43d6000803e80801561035a573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b61039b83610541565b6040516001600160a01b038416907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a26000825111806103dc5750805b156101c3576103eb8383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61041a61035f565b604080516001600160a01b03928316815291841660208301520160405180910390a1610154816105e9565b6060833b6104a45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610328565b600080856001600160a01b0316856040516104bf9190610794565b600060405180830381855af49150503d80600081146104fa576040519150601f19603f3d011682016040523d82523d6000602084013e6104ff565b606091505b509150915061050f828286610675565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610383565b803b6105a55760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610328565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b03811661064e5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610328565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61036105c8565b60608315610684575081610285565b8251156106945782518084602001fd5b8160405162461bcd60e51b815260040161032891906107b0565b80356001600160a01b03811681146106c557600080fd5b919050565b6000602082840312156106dc57600080fd5b610285826106ae565b6000806000604084860312156106fa57600080fd5b610703846106ae565b9250602084013567ffffffffffffffff8082111561072057600080fd5b818601915086601f83011261073457600080fd5b81358181111561074357600080fd5b87602082850101111561075557600080fd5b6020830194508093505050509250925092565b60005b8381101561078357818101518382015260200161076b565b838111156103eb5750506000910152565b600082516107a6818460208701610768565b9190910192915050565b60208152600082518060208401526107cf816040850160208701610768565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212204675187caf3a43285d9a2c1844a981e977bd52a85ff073e7fc649f73847d70a464736f6c63430008090033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000f4041d86682e321927b1aefef2c1086a67e2b954", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000e641334b752d435a5133f64c6dbab34431a9b9dc" + } + }, + { + "contractName": "PolygonZkEVMTimelock", + "balance": "0", + "nonce": "1", + "address": "0xDEAd72Fd97a579E98AEF2F9EB190066E1858D15a", + "bytecode": "0x6080604052600436106101865760003560e01c806364d62353116100d7578063b1c5f42711610085578063b1c5f427146104dc578063bc197c81146104fc578063c4d252f514610528578063d45c443514610548578063d547741f14610575578063e38335e514610595578063f23a6e61146105a8578063f27a0c92146105d457600080fd5b806364d62353146103f15780638065657f146104115780638f2a0bb0146104315780638f61f4f51461045157806391d1485414610473578063a217fddf14610493578063b08e51c0146104a857600080fd5b8063248a9ca311610134578063248a9ca3146102c45780632ab0f529146102f45780632f2ff15d1461032557806331d507501461034557806336568abe146103655780633a6aae7214610385578063584b153e146103d157600080fd5b806301d5062a1461019257806301ffc9a7146101b457806307bd0265146101e95780630d3cf6fc14610219578063134008d31461024d57806313bc9f2014610260578063150b7a021461028057600080fd5b3661018d57005b600080fd5b34801561019e57600080fd5b506101b26101ad366004611406565b6105e9565b005b3480156101c057600080fd5b506101d46101cf36600461147a565b61066c565b60405190151581526020015b60405180910390f35b3480156101f557600080fd5b5061020b600080516020611df083398151915281565b6040519081526020016101e0565b34801561022557600080fd5b5061020b7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101b261025b3660046114a4565b610697565b34801561026c57600080fd5b506101d461027b36600461150f565b61073a565b34801561028c57600080fd5b506102ab61029b3660046115dd565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101e0565b3480156102d057600080fd5b5061020b6102df36600461150f565b60009081526020819052604090206001015490565b34801561030057600080fd5b506101d461030f36600461150f565b6000908152600160208190526040909120541490565b34801561033157600080fd5b506101b2610340366004611644565b610760565b34801561035157600080fd5b506101d461036036600461150f565b61078a565b34801561037157600080fd5b506101b2610380366004611644565b6107a3565b34801561039157600080fd5b506103b97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101e0565b3480156103dd57600080fd5b506101d46103ec36600461150f565b610826565b3480156103fd57600080fd5b506101b261040c36600461150f565b61083c565b34801561041d57600080fd5b5061020b61042c3660046114a4565b6108e0565b34801561043d57600080fd5b506101b261044c3660046116b4565b61091f565b34801561045d57600080fd5b5061020b600080516020611dd083398151915281565b34801561047f57600080fd5b506101d461048e366004611644565b610a5f565b34801561049f57600080fd5b5061020b600081565b3480156104b457600080fd5b5061020b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156104e857600080fd5b5061020b6104f7366004611765565b610a88565b34801561050857600080fd5b506102ab61051736600461188c565b63bc197c8160e01b95945050505050565b34801561053457600080fd5b506101b261054336600461150f565b610acd565b34801561055457600080fd5b5061020b61056336600461150f565b60009081526001602052604090205490565b34801561058157600080fd5b506101b2610590366004611644565b610ba2565b6101b26105a3366004611765565b610bc7565b3480156105b457600080fd5b506102ab6105c3366004611935565b63f23a6e6160e01b95945050505050565b3480156105e057600080fd5b5061020b610d3f565b600080516020611dd083398151915261060181610dd5565b60006106118989898989896108e0565b905061061d8184610de2565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610659969594939291906119c2565b60405180910390a3505050505050505050565b60006001600160e01b03198216630271189760e51b1480610691575061069182610ed6565b92915050565b600080516020611df08339815191526106b1816000610a5f565b6106bf576106bf8133610f0b565b60006106cf8888888888886108e0565b90506106db8185610f64565b6106e788888888611000565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161071f94939291906119ff565b60405180910390a3610730816110d3565b5050505050505050565b6000818152600160205260408120546001811180156107595750428111155b9392505050565b60008281526020819052604090206001015461077b81610dd5565b610785838361110c565b505050565b60008181526001602052604081205481905b1192915050565b6001600160a01b03811633146108185760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6108228282611190565b5050565b600081815260016020819052604082205461079c565b33301461089f5760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201526a62652074696d656c6f636b60a81b606482015260840161080f565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b60008686868686866040516020016108fd969594939291906119c2565b6040516020818303038152906040528051906020012090509695505050505050565b600080516020611dd083398151915261093781610dd5565b8887146109565760405162461bcd60e51b815260040161080f90611a31565b8885146109755760405162461bcd60e51b815260040161080f90611a31565b60006109878b8b8b8b8b8b8b8b610a88565b90506109938184610de2565b60005b8a811015610a515780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e858181106109d3576109d3611a74565b90506020020160208101906109e89190611a8a565b8d8d868181106109fa576109fa611a74565b905060200201358c8c87818110610a1357610a13611a74565b9050602002810190610a259190611aa5565b8c8b604051610a39969594939291906119c2565b60405180910390a3610a4a81611b01565b9050610996565b505050505050505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008888888888888888604051602001610aa9989796959493929190611bab565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610af781610dd5565b610b0082610826565b610b665760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e2063616044820152701b9b9bdd0818994818d85b98d95b1b1959607a1b606482015260840161080f565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610bbd81610dd5565b6107858383611190565b600080516020611df0833981519152610be1816000610a5f565b610bef57610bef8133610f0b565b878614610c0e5760405162461bcd60e51b815260040161080f90611a31565b878414610c2d5760405162461bcd60e51b815260040161080f90611a31565b6000610c3f8a8a8a8a8a8a8a8a610a88565b9050610c4b8185610f64565b60005b89811015610d295760008b8b83818110610c6a57610c6a611a74565b9050602002016020810190610c7f9190611a8a565b905060008a8a84818110610c9557610c95611a74565b9050602002013590503660008a8a86818110610cb357610cb3611a74565b9050602002810190610cc59190611aa5565b91509150610cd584848484611000565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b5886868686604051610d0c94939291906119ff565b60405180910390a35050505080610d2290611b01565b9050610c4e565b50610d33816110d3565b50505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc39190611c4c565b15610dce5750600090565b5060025490565b610ddf8133610f0b565b50565b610deb8261078a565b15610e505760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201526e1c9958591e481cd8da19591d5b1959608a1b606482015260840161080f565b610e58610d3f565b811015610eb65760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e746044820152652064656c617960d01b606482015260840161080f565b610ec08142611c6e565b6000928352600160205260409092209190915550565b60006001600160e01b03198216637965db0b60e01b148061069157506301ffc9a760e01b6001600160e01b0319831614610691565b610f158282610a5f565b61082257610f22816111f5565b610f2d836020611207565b604051602001610f3e929190611ca5565b60408051601f198184030181529082905262461bcd60e51b825261080f91600401611d14565b610f6d8261073a565b610f895760405162461bcd60e51b815260040161080f90611d47565b801580610fa55750600081815260016020819052604090912054145b6108225760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e6720646570656044820152656e64656e637960d01b606482015260840161080f565b6000846001600160a01b031684848460405161101d929190611d91565b60006040518083038185875af1925050503d806000811461105a576040519150601f19603f3d011682016040523d82523d6000602084013e61105f565b606091505b50509050806110cc5760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e6720746044820152721c985b9cd858dd1a5bdb881c995d995c9d1959606a1b606482015260840161080f565b5050505050565b6110dc8161073a565b6110f85760405162461bcd60e51b815260040161080f90611d47565b600090815260016020819052604090912055565b6111168282610a5f565b610822576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561114c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61119a8282610a5f565b15610822576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606106916001600160a01b03831660145b60606000611216836002611da1565b611221906002611c6e565b6001600160401b0381111561123857611238611528565b6040519080825280601f01601f191660200182016040528015611262576020820181803683370190505b509050600360fc1b8160008151811061127d5761127d611a74565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106112ac576112ac611a74565b60200101906001600160f81b031916908160001a90535060006112d0846002611da1565b6112db906001611c6e565b90505b6001811115611353576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061130f5761130f611a74565b1a60f81b82828151811061132557611325611a74565b60200101906001600160f81b031916908160001a90535060049490941c9361134c81611db8565b90506112de565b5083156107595760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161080f565b80356001600160a01b03811681146113b957600080fd5b919050565b60008083601f8401126113d057600080fd5b5081356001600160401b038111156113e757600080fd5b6020830191508360208285010111156113ff57600080fd5b9250929050565b600080600080600080600060c0888a03121561142157600080fd5b61142a886113a2565b96506020880135955060408801356001600160401b0381111561144c57600080fd5b6114588a828b016113be565b989b979a50986060810135976080820135975060a09091013595509350505050565b60006020828403121561148c57600080fd5b81356001600160e01b03198116811461075957600080fd5b60008060008060008060a087890312156114bd57600080fd5b6114c6876113a2565b95506020870135945060408701356001600160401b038111156114e857600080fd5b6114f489828a016113be565b979a9699509760608101359660809091013595509350505050565b60006020828403121561152157600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561156657611566611528565b604052919050565b600082601f83011261157f57600080fd5b81356001600160401b0381111561159857611598611528565b6115ab601f8201601f191660200161153e565b8181528460208386010111156115c057600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156115f357600080fd5b6115fc856113a2565b935061160a602086016113a2565b92506040850135915060608501356001600160401b0381111561162c57600080fd5b6116388782880161156e565b91505092959194509250565b6000806040838503121561165757600080fd5b82359150611667602084016113a2565b90509250929050565b60008083601f84011261168257600080fd5b5081356001600160401b0381111561169957600080fd5b6020830191508360208260051b85010111156113ff57600080fd5b600080600080600080600080600060c08a8c0312156116d257600080fd5b89356001600160401b03808211156116e957600080fd5b6116f58d838e01611670565b909b50995060208c013591508082111561170e57600080fd5b61171a8d838e01611670565b909950975060408c013591508082111561173357600080fd5b506117408c828d01611670565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561178157600080fd5b88356001600160401b038082111561179857600080fd5b6117a48c838d01611670565b909a50985060208b01359150808211156117bd57600080fd5b6117c98c838d01611670565b909850965060408b01359150808211156117e257600080fd5b506117ef8b828c01611670565b999c989b509699959896976060870135966080013595509350505050565b600082601f83011261181e57600080fd5b813560206001600160401b0382111561183957611839611528565b8160051b61184882820161153e565b928352848101820192828101908785111561186257600080fd5b83870192505b8483101561188157823582529183019190830190611868565b979650505050505050565b600080600080600060a086880312156118a457600080fd5b6118ad866113a2565b94506118bb602087016113a2565b935060408601356001600160401b03808211156118d757600080fd5b6118e389838a0161180d565b945060608801359150808211156118f957600080fd5b61190589838a0161180d565b9350608088013591508082111561191b57600080fd5b506119288882890161156e565b9150509295509295909350565b600080600080600060a0868803121561194d57600080fd5b611956866113a2565b9450611964602087016113a2565b9350604086013592506060860135915060808601356001600160401b0381111561198d57600080fd5b6119288882890161156e565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a0604082015260006119ea60a083018688611999565b60608301949094525060800152949350505050565b60018060a01b0385168152836020820152606060408201526000611a27606083018486611999565b9695505050505050565b60208082526023908201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611a9c57600080fd5b610759826113a2565b6000808335601e19843603018112611abc57600080fd5b8301803591506001600160401b03821115611ad657600080fd5b6020019150368190038213156113ff57600080fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611b1357611b13611aeb565b5060010190565b81835260006020808501808196508560051b810191508460005b87811015611b9e5782840389528135601e19883603018112611b5557600080fd5b870185810190356001600160401b03811115611b7057600080fd5b803603821315611b7f57600080fd5b611b8a868284611999565b9a87019a9550505090840190600101611b34565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b811015611bec576001600160a01b03611bd7846113a2565b16825260209283019290910190600101611bbe565b5083810360208501528881526001600160fb1b03891115611c0c57600080fd5b8860051b9150818a60208301370182810360209081016040850152611c349082018789611b1a565b60608401959095525050608001529695505050505050565b600060208284031215611c5e57600080fd5b8151801515811461075957600080fd5b8082018082111561069157610691611aeb565b60005b83811015611c9c578181015183820152602001611c84565b50506000910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351611cd7816017850160208801611c81565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611d08816028840160208801611c81565b01602801949350505050565b6020815260008251806020840152611d33816040850160208701611c81565b601f01601f19169190910160400192915050565b6020808252602a908201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e206973604082015269206e6f7420726561647960b01b606082015260800190565b8183823760009101908152919050565b808202811582820484141761069157610691611aeb565b600081611dc757611dc7611aeb565b50600019019056feb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63a2646970667358221220e85779c5558fca47883d23a3cceaeb125898c578f2a4d1ea63a0d3bd9db9b9eb64736f6c63430008110033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x000000000000000000000000000000000000000000000000000000000000000a", + "0xa35b5405ab15b96b03cc591647476727d852994a412b5030df6fc27d6663ae98": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x3068bd570ea4e7d974748b6421609a672ffc2752a61ba3a01cab0651ae1ac36d": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x555ccfd2adedd3617807cc741088518e69e1b40eeadcc863c31e3de2eeb454dd": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0xba259d66f4dd33fbb3dec88075da2b4d0684440fd415c1f24df79a0258ca9e62": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0xd449b9dacab93eed6e33b971a4f75b09702709f5b92088a7d361838e246a3556": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + } + }, + { + "accountName": "keyless Deployer", + "balance": "0", + "nonce": "1", + "address": "0x8b5081b0a6186731873f39d566ed886c7404c3D0" + }, + { + "accountName": "deployer", + "balance": "0", + "nonce": "8", + "address": "0x0cae25c8623761783Fe4CE241C9b428126A7612A" + }, + { + "accountName": "test account", + "balance": "100000000000000000000000", + "nonce": "0", + "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" + } ] -} \ No newline at end of file + } \ No newline at end of file diff --git a/test/config/test.node.config.toml b/test/config/test.node.config.toml index f66f097873..4907fc3580 100644 --- a/test/config/test.node.config.toml +++ b/test/config/test.node.config.toml @@ -28,9 +28,10 @@ FreeClaimGasLimit = 1500000 [Etherman] URL = "http://zkevm-mock-l1-network:8545" -PoEAddr = "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6" +PoEAddr = "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318" MaticAddr = "0x5FbDB2315678afecb367f032d93F642f64180aa3" -GlobalExitRootManagerAddr = "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" +GlobalExitRootManagerAddr = "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853" +L1ChainID = 1337 MultiGasProvider = false [Etherscan] ApiKey = "" @@ -51,18 +52,13 @@ DefaultSenderAddress = "0x1111111111111111111111111111111111111111" [Synchronizer] SyncInterval = "1s" SyncChunkSize = 100 -GenBlockNumber = 57 +GenBlockNumber = 63 [Sequencer] MaxSequenceSize = "2000000" WaitPeriodPoolIsEmpty = "1s" WaitPeriodSendSequence = "15s" LastBatchVirtualizationTimeMaxWaitPeriod = "10s" -WaitBlocksToUpdateGER = 10 -WaitBlocksToConsiderGerFinal = 10 -ElapsedTimeToCloseBatchWithoutTxsDueToNewGER = "60s" -MinTimeToCloseBatch = "60s" -MaxTimeForBatchToBeOpen = "15s" BlocksAmountForTxsToBeDeleted = 100 FrequencyToCheckTxsForDelete = "12h" MaxTxsPerBatch = 150 @@ -75,11 +71,26 @@ MaxMemAligns = 262144 MaxArithmetics = 262144 MaxBinaries = 262144 MaxSteps = 8388608 +WeightBatchBytesSize = 1 +WeightCumulativeGasUsed = 1 +WeightKeccakHashes = 1 +WeightPoseidonHashes = 1 +WeightPoseidonPaddings = 1 +WeightMemAligns = 1 +WeightArithmetics = 1 +WeightBinaries = 1 +WeightSteps = 1 MaxAllowedFailedCounter = 50 -SenderAddress = "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" -PrivateKeys = [{Path = "/pk/sequencer.keystore", Password = "testonly"}] - [Sequencer.ProfitabilityChecker] - SendBatchesEvenWhenNotProfitable = "true" + [Sequencer.Finalizer] + GERDeadlineTimeoutInSec = "2s" + ForcedBatchDeadlineTimeoutInSec = "60s" + SendingToL1DeadlineTimeoutInSec = "20s" + SleepDurationInMs = "100ms" + ResourcePercentageToCloseBatch = 10 + GERFinalityNumberOfBlocks = 0 + ClosingSignalsManagerWaitForL1OperationsInSec = "2s" + SenderAddress = "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" + PrivateKeys = [{Path = "/pk/sequencer.keystore", Password = "testonly"}] [Aggregator] Host = "0.0.0.0" @@ -124,4 +135,10 @@ Port = 61090 Host = "0.0.0.0" Port = 9091 Enabled = true +ProfilingHost = "0.0.0.0" +ProfilingPort = 6060 +ProfilingEnabled = true + + + diff --git a/test/docker-compose.yml b/test/docker-compose.yml index 135ba7b85c..5c38dcbb0f 100644 --- a/test/docker-compose.yml +++ b/test/docker-compose.yml @@ -50,6 +50,7 @@ services: image: zkevm-node ports: - 9092:9091 # needed if metrics enabled + - 6060:6060 environment: - ZKEVM_NODE_STATEDB_HOST=zkevm-state-db - ZKEVM_NODE_POOL_HOST=zkevm-pool-db @@ -292,7 +293,7 @@ services: zkevm-mock-l1-network: container_name: zkevm-mock-l1-network - image: hermeznetwork/geth-zkevm-contracts:v0.6.0.0 + image: hermeznetwork/geth-zkevm-contracts:test ports: - 8545:8545 - 8546:8546 @@ -300,7 +301,7 @@ services: zkevm-prover: container_name: zkevm-prover - image: hermeznetwork/zkevm-prover:e7ac5c4 + image: hermeznetwork/zkevm-prover:88f3835 ports: # - 50051:50051 # Prover - 50052:50052 # Mock prover diff --git a/test/e2e/broadcast_test.go b/test/e2e/broadcast_test.go index 85730d4893..e14c2102a5 100644 --- a/test/e2e/broadcast_test.go +++ b/test/e2e/broadcast_test.go @@ -86,8 +86,8 @@ func initState() (*state.State, error) { return nil, err } stateDb := state.NewPostgresStorage(sqlDB) - executorUri := testutils.GetEnv(constants.ENV_ZKPROVER_URI, "127.0.0.1:50071") - merkleTreeUri := testutils.GetEnv(constants.ENV_MERKLETREE_URI, "127.0.0.1:50061") + executorUri := testutils.GetEnv(constants.ENV_ZKPROVER_URI, "localhost:50071") + merkleTreeUri := testutils.GetEnv(constants.ENV_MERKLETREE_URI, "localhost:50061") executorClient, _, _ := executor.NewExecutorClient(ctx, executor.Config{URI: executorUri}) mtDBClient, _, _ := merkletree.NewMTDBServiceClient(ctx, merkletree.Config{URI: merkleTreeUri}) stateTree := merkletree.NewStateTree(mtDBClient) @@ -145,8 +145,8 @@ func populateDB(ctx context.Context, st *state.State) error { } } - const addExitRoots = "INSERT INTO state.exit_root (block_num, global_exit_root, mainnet_exit_root, rollup_exit_root) VALUES ($1, $2, $3, $4)" - _, err := st.PostgresStorage.Exec(ctx, addExitRoots, blockNumber, ger, mainnetExitRoot, rollupExitRoot) + const addExitRoots = "INSERT INTO state.exit_root (block_num, timestamp, global_exit_root, mainnet_exit_root, rollup_exit_root) VALUES ($1, $2, $3, $4, $5)" + _, err := st.PostgresStorage.Exec(ctx, addExitRoots, blockNumber, time.Now(), ger, mainnetExitRoot, rollupExitRoot) return err } diff --git a/test/e2e/ethtransfer_test.go b/test/e2e/ethtransfer_test.go index b352bfffbc..ec6d483a7a 100644 --- a/test/e2e/ethtransfer_test.go +++ b/test/e2e/ethtransfer_test.go @@ -21,7 +21,6 @@ func TestEthTransfer(t *testing.T) { } ctx := context.Background() - defer func() { require.NoError(t, operations.Teardown()) }() err := operations.Teardown() @@ -40,7 +39,7 @@ func TestEthTransfer(t *testing.T) { client, err := ethclient.Dial(operations.DefaultL2NetworkURL) require.NoError(t, err) // Send txs - nTxs := 50 + nTxs := 10 amount := big.NewInt(10000) toAddress := common.HexToAddress("0x70997970C51812dc3A010C7d01b50e0d17dc79C8") senderBalance, err := client.BalanceAt(ctx, auth.From, nil) diff --git a/test/operations/manager.go b/test/operations/manager.go index 04a0062f85..0620095435 100644 --- a/test/operations/manager.go +++ b/test/operations/manager.go @@ -27,14 +27,14 @@ import ( ) const ( - poeAddress = "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9" + poeAddress = "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853" maticTokenAddress = "0x5FbDB2315678afecb367f032d93F642f64180aa3" //nolint:gosec l1AccHexAddress = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" l1AccHexPrivateKey = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" cmdFolder = "test" ) -// Public constants +// Public shared const ( DefaultSequencerAddress = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" DefaultSequencerPrivateKey = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" diff --git a/test/scripts/batchsender/main.go b/test/scripts/batchsender/main.go index 51943bed0a..5e886c1f39 100644 --- a/test/scripts/batchsender/main.go +++ b/test/scripts/batchsender/main.go @@ -111,12 +111,12 @@ func sendBatches(cliCtx *cli.Context) error { return err } - ethman, err := etherman.NewClient(cfg.Etherman) + ethMan, err := etherman.NewClient(cfg.Etherman) if err != nil { return err } - err = ethman.AddOrReplaceAuth(*auth) + err = ethMan.AddOrReplaceAuth(*auth) if err != nil { return err } @@ -155,7 +155,7 @@ func sendBatches(cliCtx *cli.Context) error { nb = nBatches } - nonce, err := ethman.CurrentNonce(ctx, auth.From) + nonce, err := ethMan.CurrentNonce(ctx, auth.From) if err != nil { err := fmt.Errorf("failed to get current nonce: %w", err) log.Error(err.Error()) @@ -163,7 +163,7 @@ func sendBatches(cliCtx *cli.Context) error { } for i := 0; i < ns; i++ { - currentBlock, err := ethman.EthClient.BlockByNumber(ctx, nil) + currentBlock, err := ethMan.EthClient.BlockByNumber(ctx, nil) if err != nil { return err } @@ -180,36 +180,48 @@ func sendBatches(cliCtx *cli.Context) error { } // send to L1 - to, data, err := ethman.BuildSequenceBatchesTxData(auth.From, seqs) + to, data, err := ethMan.BuildSequenceBatchesTxData(auth.From, seqs) if err != nil { return err } - gas, err := ethman.EstimateGas(ctx, auth.From, to, nil, data) + tx := ethTypes.NewTx(ðTypes.LegacyTx{ + To: to, + Data: data, + }) + signedTx, err := ethMan.SignTx(ctx, auth.From, tx) + if err != nil { + return err + } + err = ethMan.SendTx(ctx, signedTx) + if err != nil { + return err + } + gas, err := ethMan.EstimateGas(ctx, auth.From, to, nil, data) if err != nil { err := fmt.Errorf("failed to estimate gas: %w", err) log.Error(err.Error()) return err } // get gas price - gasPrice, err := ethman.SuggestedGasPrice(ctx) + gasPrice, err := ethMan.SuggestedGasPrice(ctx) if err != nil { err := fmt.Errorf("failed to get suggested gas price: %w", err) log.Error(err.Error()) return err } - tx := ethTypes.NewTx(ðTypes.LegacyTx{ + tx = ethTypes.NewTx(ðTypes.LegacyTx{ Nonce: nonce, Gas: gas + uint64(i), GasPrice: gasPrice, To: to, Data: data, }) - signedTx, err := ethman.SignTx(ctx, auth.From, tx) + signedTx, err = ethMan.SignTx(ctx, auth.From, tx) if err != nil { log.Error(err.Error()) return err } - err = ethman.SendTx(ctx, signedTx) + err = ethMan.SendTx(ctx, signedTx) if err != nil { log.Error(err.Error()) return err @@ -219,8 +231,6 @@ func sendBatches(cliCtx *cli.Context) error { sentTxs = append(sentTxs, signedTx) sentTxsMap[signedTx.Hash()] = struct{}{} - nonce++ - time.Sleep(duration * time.Millisecond) } @@ -239,7 +249,7 @@ func sendBatches(cliCtx *cli.Context) error { done := make(chan struct{}) for _, tx := range sentTxs { - err := operations.WaitTxToBeMined(ctx, ethman.EthClient, tx, miningTimeout) + err := operations.WaitTxToBeMined(ctx, ethMan.EthClient, tx, miningTimeout) if err != nil { return err } @@ -256,7 +266,7 @@ func sendBatches(cliCtx *cli.Context) error { txLoop: for _, tx := range sentTxs { // get rollup tx block number - receipt, err := ethman.EthClient.TransactionReceipt(ctx, tx.Hash()) + receipt, err := ethMan.EthClient.TransactionReceipt(ctx, tx.Hash()) if err != nil { return err } @@ -266,9 +276,9 @@ func sendBatches(cliCtx *cli.Context) error { query := ethereum.FilterQuery{ FromBlock: fromBlock, ToBlock: toBlock, - Addresses: ethman.SCAddresses, + Addresses: ethMan.SCAddresses, } - logs, err := ethman.EthClient.FilterLogs(ctx, query) + logs, err := ethMan.EthClient.FilterLogs(ctx, query) if err != nil { return err } @@ -276,7 +286,7 @@ func sendBatches(cliCtx *cli.Context) error { switch vLog.Topics[0] { case etherman.SequencedBatchesSigHash(): if vLog.TxHash == tx.Hash() { // ignore other txs happening on L1 - sb, err := ethman.PoE.ParseSequenceBatches(vLog) + sb, err := ethMan.PoE.ParseSequenceBatches(vLog) if err != nil { return err } @@ -289,7 +299,7 @@ func sendBatches(cliCtx *cli.Context) error { } } case etherman.TrustedVerifyBatchesSigHash(): - vb, err := ethman.PoE.ParseTrustedVerifyBatches(vLog) + vb, err := ethMan.PoE.ParseVerifyBatchesTrustedAggregator(vLog) if err != nil { return err } diff --git a/test/scripts/init_network/main.go b/test/scripts/init_network/main.go index 1202e3412a..97de6e4d2e 100644 --- a/test/scripts/init_network/main.go +++ b/test/scripts/init_network/main.go @@ -22,7 +22,7 @@ package main // L1ETHAmountToSequencer: "200000000000000000000", // L1MaticAmountToSequencer: "200000000000000000000000", // }, -// SequencerAddress: "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", +// sequencerAddress: "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", // SequencerPrivateKey: "0x28b2b0318721be8c8339199172cd7cc8f5e273800a35616ec893083a4b32c02e", // TxTimeout: time.Minute, // }); err != nil { diff --git a/test/scripts/sendForcedBatch/main.go b/test/scripts/sendForcedBatch/main.go index 9b34dda9d3..05a8719b3f 100644 --- a/test/scripts/sendForcedBatch/main.go +++ b/test/scripts/sendForcedBatch/main.go @@ -138,7 +138,7 @@ func sendForcedBatches(cliCtx *cli.Context) error { fb, err := poe.ParseForceBatch(vLog) if err == nil { log.Debugf("log decoded: %+v", fb) - var ger common.Hash = fb.LastGlobalExitRoot + ger := fb.LastGlobalExitRoot log.Info("GlobalExitRoot: ", ger) log.Info("Transactions: ", common.Bytes2Hex(fb.Transactions)) fullBlock, err := ethClient.BlockByHash(ctx, vLog.BlockHash) diff --git a/tools/network/network.go b/tools/network/network.go index cbe07c2b0f..7bda076adc 100644 --- a/tools/network/network.go +++ b/tools/network/network.go @@ -64,7 +64,7 @@ package network // L1Deployer L1Deployer // // Sequencer address, comes from the keystore passed to node // // on config -// SequencerAddress, SequencerPrivateKey string +// sequencerAddress, SequencerPrivateKey string // TxTimeout time.Duration // } @@ -136,11 +136,11 @@ package network // return err // } -// sequencerAddress := common.HexToAddress(nc.SequencerAddress) +// sequencerAddress := common.HexToAddress(nc.sequencerAddress) // if nc.L1Deployer.L1ETHAmountToSequencer != "" { // // Send some Ether from L1 deployer to sequencer acc // ethAmount, _ := big.NewInt(0).SetString(nc.L1Deployer.L1ETHAmountToSequencer, encoding.Base10) -// log.Infof("Transferring %s L1 ETH to sequencer %q from L1 deployer %q", nc.L1Deployer.L1ETHAmountToSequencer, nc.SequencerAddress, nc.L1Deployer.Address) +// log.Infof("Transferring %s L1 ETH to sequencer %q from L1 deployer %q", nc.L1Deployer.L1ETHAmountToSequencer, nc.sequencerAddress, nc.L1Deployer.Address) // fromAddress := common.HexToAddress(nc.L1Deployer.Address) // nonce, err := clientL1.PendingNonceAt(ctx, fromAddress) // if err != nil { @@ -173,7 +173,7 @@ package network // } // // Send matic to sequencer // maticAmount, _ := big.NewInt(0).SetString(nc.L1Deployer.L1MaticAmountToSequencer, encoding.Base10) -// log.Infof("Transferring %s L1 MATIC tokens to sequencer %q from L1 deployer %q", nc.L1Deployer.L1MaticAmountToSequencer, nc.SequencerAddress, nc.L1Deployer.Address) +// log.Infof("Transferring %s L1 MATIC tokens to sequencer %q from L1 deployer %q", nc.L1Deployer.L1MaticAmountToSequencer, nc.sequencerAddress, nc.L1Deployer.Address) // tx, err := maticTokenSC.Transfer(authDeployer, sequencerAddress, maticAmount) // if err != nil { // return err @@ -186,7 +186,7 @@ package network // } // // approve tokens to be used by PoE SC on behalf of the sequencer -// log.Infof("Approving %s L1 MATIC tokens to be used by PoE on behalf of the sequencer %q", maticAmount.String(), nc.SequencerAddress) +// log.Infof("Approving %s L1 MATIC tokens to be used by PoE on behalf of the sequencer %q", maticAmount.String(), nc.sequencerAddress) // tx, err = maticTokenSC.Approve(authSequencer, cfg.NetworkConfig.PoEAddr, maticAmount) // if err != nil { // return err