From 6902660386615b4208f40ac2ad49f4efc9ad9177 Mon Sep 17 00:00:00 2001 From: FletcherMan Date: Fri, 6 Dec 2024 12:09:31 +0800 Subject: [PATCH 01/14] fix devnet up (#666) --- ops/devnet-morph/devnet/setup_nodes.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ops/devnet-morph/devnet/setup_nodes.py b/ops/devnet-morph/devnet/setup_nodes.py index d47a6c61..7e72c730 100644 --- a/ops/devnet-morph/devnet/setup_nodes.py +++ b/ops/devnet-morph/devnet/setup_nodes.py @@ -25,7 +25,8 @@ def setup_devnet_nodes(): print("Error: Failed to build Tendermint. Exiting.") sys.exit(1) - os.chdir(ops_dir) + # back to the root directory + os.chdir(root_dir) print("Tendermint build process completed.") # Check if .devnet directory already exists From a3035006b0edb26612853380942d5e72c51321ca Mon Sep 17 00:00:00 2001 From: corey Date: Fri, 6 Dec 2024 13:53:36 +0800 Subject: [PATCH 02/14] Oracle compatible with skip map version (#667) --- oracle/oracle/batch.go | 97 ++++++++++++++++++++++++++++-------------- 1 file changed, 66 insertions(+), 31 deletions(-) diff --git a/oracle/oracle/batch.go b/oracle/oracle/batch.go index 7f29d202..231549d3 100644 --- a/oracle/oracle/batch.go +++ b/oracle/oracle/batch.go @@ -19,6 +19,10 @@ import ( "github.com/morph-l2/go-ethereum/log" ) +var BeforeRemoveSkipMapMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_chainID\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorIncorrectBatchLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorNoBlockInBatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"res\",\"type\":\"string\"}],\"name\":\"ChallengeRes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ChallengeRewardClaim\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"}],\"name\":\"ChallengeState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"CommitBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"}],\"name\":\"FinalizeBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"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\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ProveRemainingClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"RevertBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateChallenger\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"UpdateFinalizationPeriodSeconds\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPercent\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPercent\",\"type\":\"uint256\"}],\"name\":\"UpdateProofRewardPercent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldWindow\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newWindow\",\"type\":\"uint256\"}],\"name\":\"UpdateProofWindow\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldVerifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newVerifier\",\"type\":\"address\"}],\"name\":\"UpdateVerifier\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"LAYER_2_CHAIN_ID\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__maxNumTxInChunk\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"addChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"batchChallengeReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchChallenged\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchChallengedSuccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchDataStore\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"originTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"finalizeTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchExist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInsideChallengeWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"_batchHash\",\"type\":\"bytes32\"}],\"name\":\"challengeState\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"challenges\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"challengeSuccess\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"finished\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimProveRemaining\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"parentBatchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blockContexts\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"skippedL1MessageBitmap\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structIRollup.BatchDataInput\",\"name\":\"batchDataInput\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"sequencerSets\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structIRollup.BatchSignatureInput\",\"name\":\"batchSignatureInput\",\"type\":\"tuple\"}],\"name\":\"commitBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"committedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizationPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"finalizeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"finalizedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"importGenesisBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1StakingContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"}],\"name\":\"isBatchFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"challengerAddress\",\"type\":\"address\"}],\"name\":\"isChallenger\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isChallenger\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1StakingContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastCommittedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastFinalizedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofRewardPercent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofWindow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proveRemaining\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_batchProof\",\"type\":\"bytes\"}],\"name\":\"proveState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"removeChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"revertBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revertReqIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newPeriod\",\"type\":\"uint256\"}],\"name\":\"updateFinalizePeriodSeconds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newWindow\",\"type\":\"uint256\"}],\"name\":\"updateProofWindow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newProofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"updateRewardPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newVerifier\",\"type\":\"address\"}],\"name\":\"updateVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"name\":\"withdrawalRoots\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exist\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", +} + type BatchInfoMap map[common.Hash][]BatchInfo type RollupBatch struct { TxCount uint64 @@ -63,7 +67,7 @@ func (o *Oracle) GetBatchSubmission(ctx context.Context, startBlock, nextBatchSu if err != nil { return nil, fmt.Errorf("fetch rollupLog error:%v", err) } - if len(rLogs) > 1 { + if len(rLogs) >= 1 { break } startBlock = endBlock + 1 @@ -88,20 +92,71 @@ func (o *Oracle) GetBatchSubmission(ctx context.Context, startBlock, nextBatchSu if pending { return nil, errors.New("pending transaction") } + beforeRemoveSkipMapAbi, err := BeforeRemoveSkipMapMetaData.GetAbi() + if err != nil { + return nil, err + } abi, err := bindings.RollupMetaData.GetAbi() if err != nil { return nil, err } + var batch eth.RPCRollupBatch + if bytes.Equal(tx.Data()[0:4], abi.Methods["commitBatch"].ID) { + args, err := abi.Methods["commitBatch"].Inputs.Unpack(tx.Data()[4:]) + if err != nil { + log.Error("fetch batch info failed", "txHash", lg.TxHash, "blockNumber", lg.BlockNumber, "error", err) + return nil, fmt.Errorf("unpack commitBatch error:%v", err) + } + rollupBatchData := args[0].(struct { + Version uint8 "json:\"version\"" + ParentBatchHeader []uint8 "json:\"parentBatchHeader\"" + BlockContexts []uint8 "json:\"blockContexts\"" + PrevStateRoot [32]uint8 "json:\"prevStateRoot\"" + PostStateRoot [32]uint8 "json:\"postStateRoot\"" + WithdrawalRoot [32]uint8 "json:\"withdrawalRoot\"" + }) + batch = eth.RPCRollupBatch{ + Version: uint(rollupBatchData.Version), + ParentBatchHeader: rollupBatchData.ParentBatchHeader, + BlockContexts: rollupBatchData.BlockContexts, + PrevStateRoot: common.BytesToHash(rollupBatchData.PrevStateRoot[:]), + PostStateRoot: common.BytesToHash(rollupBatchData.PostStateRoot[:]), + WithdrawRoot: common.BytesToHash(rollupBatchData.WithdrawalRoot[:]), + } + } else if bytes.Equal(tx.Data()[0:4], beforeRemoveSkipMapAbi.Methods["commitBatch"].ID) { + args, err := beforeRemoveSkipMapAbi.Methods["commitBatch"].Inputs.Unpack(tx.Data()[4:]) + if err != nil { + log.Error("fetch batch info failed", "txHash", lg.TxHash, "blockNumber", lg.BlockNumber, "error", err) + return nil, fmt.Errorf("unpack commitBatch error:%v", err) + } + + rollupBatchData := args[0].(struct { + Version uint8 "json:\"version\"" + ParentBatchHeader []uint8 "json:\"parentBatchHeader\"" + BlockContexts []uint8 "json:\"blockContexts\"" + SkippedL1MessageBitmap []uint8 "json:\"skippedL1MessageBitmap\"" + PrevStateRoot [32]uint8 "json:\"prevStateRoot\"" + PostStateRoot [32]uint8 "json:\"postStateRoot\"" + WithdrawalRoot [32]uint8 "json:\"withdrawalRoot\"" + }) + batch = eth.RPCRollupBatch{ + Version: uint(rollupBatchData.Version), + ParentBatchHeader: rollupBatchData.ParentBatchHeader, + BlockContexts: rollupBatchData.BlockContexts, + SkippedL1MessageBitmap: rollupBatchData.SkippedL1MessageBitmap, + PrevStateRoot: common.BytesToHash(rollupBatchData.PrevStateRoot[:]), + PostStateRoot: common.BytesToHash(rollupBatchData.PostStateRoot[:]), + WithdrawRoot: common.BytesToHash(rollupBatchData.WithdrawalRoot[:]), + } + } else { + continue + } rollupCommitBatch, parseErr := o.rollup.ParseCommitBatch(lg) if parseErr != nil { log.Error("get l2 BlockNumber", "err", err) return nil, parseErr } - - if !bytes.Equal(abi.Methods["commitBatch"].ID, tx.Data()[:4]) { - continue - } if rollupCommitBatch.BatchIndex.Uint64() < batchIndex { continue } @@ -110,30 +165,6 @@ func (o *Oracle) GetBatchSubmission(ctx context.Context, startBlock, nextBatchSu } // set batchIndex to new batch index + 1 batchIndex = rollupCommitBatch.BatchIndex.Uint64() + 1 - args, err := abi.Methods["commitBatch"].Inputs.Unpack(tx.Data()[4:]) - if err != nil { - log.Error("fetch batch info failed", "txHash", lg.TxHash, "blockNumber", lg.BlockNumber, "error", err) - return nil, err - } - rollupBatchData := args[0].(struct { - Version uint8 "json:\"version\"" - ParentBatchHeader []uint8 "json:\"parentBatchHeader\"" - BlockContexts []uint8 "json:\"blockContexts\"" - SkippedL1MessageBitmap []uint8 "json:\"skippedL1MessageBitmap\"" - PrevStateRoot [32]uint8 "json:\"prevStateRoot\"" - PostStateRoot [32]uint8 "json:\"postStateRoot\"" - WithdrawalRoot [32]uint8 "json:\"withdrawalRoot\"" - }) - - batch := eth.RPCRollupBatch{ - Version: uint(rollupBatchData.Version), - ParentBatchHeader: rollupBatchData.ParentBatchHeader, - BlockContexts: rollupBatchData.BlockContexts, - SkippedL1MessageBitmap: rollupBatchData.SkippedL1MessageBitmap, - PrevStateRoot: common.BytesToHash(rollupBatchData.PrevStateRoot[:]), - PostStateRoot: common.BytesToHash(rollupBatchData.PostStateRoot[:]), - WithdrawRoot: common.BytesToHash(rollupBatchData.WithdrawalRoot[:]), - } var batchData derivation.BatchInfo if err = batchData.ParseBatch(batch); err != nil { return nil, fmt.Errorf("parse batch error:%v", err) @@ -221,9 +252,13 @@ func (o *Oracle) submitRecord() error { if err != nil { return fmt.Errorf("record finalized batch error:%v,batchLength:%v", err, len(batchSubmissions)) } - log.Info("record finalized batch success", "txHash", tx.Hash(), "batchLength", len(batchSubmissions)) + err = o.l2Client.SendTransaction(o.ctx, tx) + if err != nil { + return fmt.Errorf("send transaction error:%v", err) + } + log.Info("record finalized batch success", "txHash", tx.Hash(), "batchLength", len(batchSubmissions), "nonce", tx.Nonce()) var receipt *types.Receipt - err = backoff.Do(30, backoff.Exponential(), func() error { + err = backoff.Do(3, backoff.Exponential(), func() error { var err error receipt, err = o.waitReceiptWithCtx(o.ctx, tx.Hash()) return err From 184defcd36f3c447a661865179ff97d3869b150b Mon Sep 17 00:00:00 2001 From: FletcherMan Date: Fri, 6 Dec 2024 14:36:37 +0800 Subject: [PATCH 03/14] Concurrent contract deployment & Dockerfile optimization (#665) --- .dockerignore | 1 + contracts/deploy/013-DeployProxys.ts | 131 +++++++++++++++++++++++++- contracts/deploy/014-DeployImpls.ts | 124 ++++++++++++++++++++++++ contracts/deploy/019-AdminTransfer.ts | 100 +++++++++++++++++++- contracts/deploy/index.ts | 9 +- contracts/package.json | 3 +- contracts/tasks/deploy.ts | 30 +++++- contracts/yarn.lock | 12 +++ ops/devnet-morph/devnet/__init__.py | 8 +- ops/docker/Dockerfile.staking-oracle | 16 ++-- 10 files changed, 413 insertions(+), 21 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..70e57088 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +prover/ diff --git a/contracts/deploy/013-DeployProxys.ts b/contracts/deploy/013-DeployProxys.ts index 334cfe82..24545613 100644 --- a/contracts/deploy/013-DeployProxys.ts +++ b/contracts/deploy/013-DeployProxys.ts @@ -1,6 +1,7 @@ import "@nomiclabs/hardhat-web3" import "@nomiclabs/hardhat-ethers" import "@nomiclabs/hardhat-waffle" +import { Mutex } from 'async-mutex'; import { HardhatRuntimeEnvironment } from "hardhat/types" import { storage, getContractAddressByName, assertContractVariableWithSigner } from "../src/deploy-utils" @@ -188,4 +189,132 @@ export const deployContractProxies = async ( return "" } -export default deployContractProxies +export const deployContractProxyByStorageNameWithNonce = async ( + hre: HardhatRuntimeEnvironment, + path: string, + deployer: any, + storageName: string, + nonce: number +): Promise => { + try { + const emptyContractImplAddr = getContractAddressByName(path, ImplStorageName.EmptyContract); + const ProxyFactoryName = ContractFactoryName.DefaultProxy; + + const ProxyFactory = await hre.ethers.getContractFactory(ProxyFactoryName); + // TransparentUpgradeableProxy deploy with emptyContract as impl, deployer as admin + const proxy = await ProxyFactory.deploy(emptyContractImplAddr, await deployer.getAddress(), "0x", { + nonce: nonce, + }); + await proxy.deployed() + console.log( + `%s=%s ; TX_HASH: %s`, + storageName, + proxy.address.toLocaleLowerCase(), + proxy.deployTransaction.hash + ); + + // check params + const IProxyContract = await hre.ethers.getContractAt(ContractFactoryName.DefaultProxyInterface, proxy.address); + + console.log(await IProxyContract.admin()); + await assertContractVariableWithSigner(IProxyContract, "admin", await deployer.getAddress()); + const blockNumber = await hre.ethers.provider.getBlockNumber(); + console.log("BLOCK_NUMBER: %s", blockNumber); + const err = await storage(path, storageName, proxy.address.toLocaleLowerCase(), blockNumber || 0); + if (err !== "") { + throw new Error(err); + } + + return ""; + } catch (error) { + console.error(`Error deploying ${storageName}:`, error); + return error.message || "Unknown error"; + } +}; + +export const deployContractProxiesConcurrently = async ( + hre: HardhatRuntimeEnvironment, + path: string, + deployer: any, + config: any +): Promise => { + const WETHFactoryName = ContractFactoryName.WETH; + const WETHImplStorageName = ImplStorageName.WETH; + + try { + if (config.l1WETHAddress == "") { + const Factory = await hre.ethers.getContractFactory(WETHFactoryName); + const contract = await Factory.deploy(); + await contract.deployed(); + console.log( + "%s=%s ; TX_HASH: %s", + WETHImplStorageName, + contract.address.toLocaleLowerCase(), + contract.deployTransaction.hash + ); + + const blockNumber = await hre.ethers.provider.getBlockNumber(); + console.log("BLOCK_NUMBER: %s", blockNumber); + + const err = await storage(path, WETHImplStorageName, contract.address.toLocaleLowerCase(), blockNumber || 0); + if (err != "") { + return err; + } + } else { + const blockNumber = await hre.ethers.provider.getBlockNumber(); + const err = await storage(path, WETHImplStorageName, config.l1WETHAddress.toLocaleLowerCase(), blockNumber || 0); + if (err != "") { + return err; + } + } + + console.log("Start to deploy proxies concurrently...") + + const proxyStorageNames = [ + ProxyStorageName.L1CrossDomainMessengerProxyStorageName, + ProxyStorageName.L1MessageQueueWithGasPriceOracleProxyStorageName, + ProxyStorageName.L1StakingProxyStorageName, + ProxyStorageName.RollupProxyStorageName, + ProxyStorageName.L1GatewayRouterProxyStorageName, + ProxyStorageName.L1ETHGatewayProxyStorageName, + ProxyStorageName.L1StandardERC20GatewayProxyStorageName, + ProxyStorageName.L1CustomERC20GatewayProxyStorageName, + ProxyStorageName.L1WithdrawLockERC20GatewayProxyStorageName, + ProxyStorageName.L1ReverseCustomGatewayProxyStorageName, + ProxyStorageName.L1ERC721GatewayProxyStorageName, + ProxyStorageName.L1ERC1155GatewayProxyStorageName, + ProxyStorageName.EnforcedTxGatewayProxyStorageName, + ProxyStorageName.L1WETHGatewayProxyStorageName, + ProxyStorageName.L1USDCGatewayProxyStorageName, + ]; + + let nonce = await hre.ethers.provider.getTransactionCount(deployer.getAddress()) + const mutex = new Mutex(); + const results = await Promise.all( + proxyStorageNames.map(async (storageName) => { + console.log(`Starting deployment for: ${storageName}`); + const release = await mutex.acquire(); // Acquire lock for getting nonce + const nonceToUse = nonce + nonce++; // Increment nonce for each deployment + release(); // Release the lock + + const result = await deployContractProxyByStorageNameWithNonce(hre, path, deployer, storageName, nonceToUse); + console.log(`Deployment completed for: ${storageName}`); + return result; + }) + ); + + const errors = results.filter((err) => err !== ""); + if (errors.length > 0) { + return `Deployment failed with errors: ${errors.join(", ")}`; + } + } catch (error) { + console.error("Error during deployment:", error); + return `Deployment failed with error: ${error.message}`; + } + + return ""; +}; + + +export default deployContractProxies \ No newline at end of file diff --git a/contracts/deploy/014-DeployImpls.ts b/contracts/deploy/014-DeployImpls.ts index 06a58ef1..ed065370 100644 --- a/contracts/deploy/014-DeployImpls.ts +++ b/contracts/deploy/014-DeployImpls.ts @@ -7,6 +7,7 @@ import { } from 'hardhat/types'; import { assertContractVariable, storage, getContractAddressByName } from "../src/deploy-utils"; import { predeploys } from '../src/constants' +import { Mutex } from 'async-mutex'; import { ImplStorageName, @@ -14,6 +15,129 @@ import { ContractFactoryName, } from "../src/types" +export const deployContractImplsConcurrently = async ( + hre: HardhatRuntimeEnvironment, + path: string, + deployer: any, + config: any +): Promise => { + // factory name + const L1CrossDomainMessengerFactoryName = ContractFactoryName.L1CrossDomainMessenger + const L1StakingFactoryName = ContractFactoryName.L1Staking + const L1MessageQueueWithGasPriceOracleFactoryName = ContractFactoryName.L1MessageQueueWithGasPriceOracle + const RollupFactoryName = ContractFactoryName.Rollup + const WhitelistFactoryName = ContractFactoryName.Whitelist + + const L1GatewayRouterFactoryName = ContractFactoryName.L1GatewayRouter + const L1ETHGatewayFactoryName = ContractFactoryName.L1ETHGateway + const L1StandardERC20GatewayFactoryName = ContractFactoryName.L1StandardERC20Gateway + const L1CustomERC20GatewayFactoryName = ContractFactoryName.L1CustomERC20Gateway + const L1WithdrawLockERC20GatewayFactoryName = ContractFactoryName.L1WithdrawLockERC20Gateway + const L1ReverseCustomGatewayFactoryName = ContractFactoryName.L1ReverseCustomGateway + const L1ERC721GatewayFactoryName = ContractFactoryName.L1ERC721Gateway + const L1ERC1155GatewayFactoryName = ContractFactoryName.L1ERC1155Gateway + const L1WETHGatewayFactoryName = ContractFactoryName.L1WETHGateway + const EnforcedTxGatewayFactoryName = ContractFactoryName.EnforcedTxGateway + + // implement storage name + const L1CrossDomainMessengerImplStorageName = ImplStorageName.L1CrossDomainMessengerStorageName + const StakingImplStorageName = ImplStorageName.L1StakingStorageName + const L1MessageQueueWithGasPriceOracleImplStorageName = ImplStorageName.L1MessageQueueWithGasPriceOracle + const RollupImplStorageName = ImplStorageName.RollupStorageName + const L1GatewayRouterImplStorageName = ImplStorageName.L1GatewayRouterStorageName + const L1ETHGatewayImplStorageName = ImplStorageName.L1ETHGatewayStorageName + const L1StandardERC20GatewayImplStorageName = ImplStorageName.L1StandardERC20GatewayStorageName + const L1CustomERC20GatewayImplStorageName = ImplStorageName.L1CustomERC20GatewayStorageName + const L1WithdrawLockERC20GatewayImplStorageName = ImplStorageName.L1WithdrawLockERC20GatewayStorageName + const L1ReverseCustomGatewayImplStorageName = ImplStorageName.L1ReverseCustomGatewayStorageName + const L1WETHGatewayImplStorageName = ImplStorageName.L1WETHGatewayStorageName + const L1ERC721GatewayImplStorageName = ImplStorageName.L1ERC721GatewayStorageName + const L1ERC1155GatewayImplStorageName = ImplStorageName.L1ERC1155GatewayStorageName + const WhitelistImplStorageName = ImplStorageName.Whitelist + const EnforcedTxGatewayStorageName = ImplStorageName.EnforcedTxGatewayStorageName + + // proxy contract address + const L1CrossDomainMessengerProxyAddress = getContractAddressByName(path, ProxyStorageName.L1CrossDomainMessengerProxyStorageName) + const RollupProxyAddress = getContractAddressByName(path, ProxyStorageName.RollupProxyStorageName) + const EnforcedTxGatewayAddress = getContractAddressByName(path, ProxyStorageName.EnforcedTxGatewayProxyStorageName) + + console.log("start to deploy contract implementations concurrently...") + let nonce = await hre.ethers.provider.getTransactionCount(deployer.getAddress()) + const mutex = new Mutex(); + const deployContract = async (factoryName: string, storageName: string, args: any[] = []) => { + const release = await mutex.acquire(); + const nonceToUse = nonce + nonce++; // Increment nonce for each deployment + release(); // Release the lock + + console.log(`Starting deployment for: ${storageName}, args: ${args}, nonce: `, nonceToUse); + const Factory = await hre.ethers.getContractFactory(factoryName) + const contract = await Factory.deploy(...args, { + nonce: nonceToUse, + }) + + + await contract.deployed() + console.log("%s=%s ; TX_HASH: %s", storageName, contract.address.toLocaleLowerCase(), contract.deployTransaction.hash); + + if (factoryName == L1StakingFactoryName) { + await assertContractVariable( + contract, + 'MESSENGER', + L1CrossDomainMessengerProxyAddress + ) + await assertContractVariable( + contract, + 'OTHER_STAKING', + predeploys.L2Staking.toLowerCase() + ) + } + const blockNumber = await hre.ethers.provider.getBlockNumber() + console.log("BLOCK_NUMBER: %s", blockNumber) + console.log(`Deployment completed for: ${storageName}`); + const err = await storage(path, storageName, contract.address.toLocaleLowerCase(), blockNumber || 0) + return err + } + + try { + const deployPromises = [] + + deployPromises.push(deployContract(WhitelistFactoryName, WhitelistImplStorageName, [config.contractAdmin])) + deployPromises.push(deployContract(L1CrossDomainMessengerFactoryName, L1CrossDomainMessengerImplStorageName)) + deployPromises.push(deployContract(L1MessageQueueWithGasPriceOracleFactoryName, L1MessageQueueWithGasPriceOracleImplStorageName, [L1CrossDomainMessengerProxyAddress, RollupProxyAddress, EnforcedTxGatewayAddress])) + deployPromises.push(deployContract(RollupFactoryName, RollupImplStorageName, [config.l2ChainID])) + deployPromises.push(deployContract(L1GatewayRouterFactoryName, L1GatewayRouterImplStorageName)) + deployPromises.push(deployContract(L1StandardERC20GatewayFactoryName, L1StandardERC20GatewayImplStorageName)) + deployPromises.push(deployContract(L1CustomERC20GatewayFactoryName, L1CustomERC20GatewayImplStorageName)) + deployPromises.push(deployContract(L1WithdrawLockERC20GatewayFactoryName, L1WithdrawLockERC20GatewayImplStorageName)) + deployPromises.push(deployContract(L1ReverseCustomGatewayFactoryName, L1ReverseCustomGatewayImplStorageName)) + deployPromises.push(deployContract(L1ETHGatewayFactoryName, L1ETHGatewayImplStorageName)) + + const WETHAddress = getContractAddressByName(path, ImplStorageName.WETH) + deployPromises.push(deployContract(L1WETHGatewayFactoryName, L1WETHGatewayImplStorageName, [WETHAddress, predeploys.L2WETH])) + + deployPromises.push(deployContract(EnforcedTxGatewayFactoryName, EnforcedTxGatewayStorageName)) + deployPromises.push(deployContract(L1ERC721GatewayFactoryName, L1ERC721GatewayImplStorageName)) + deployPromises.push(deployContract(L1ERC1155GatewayFactoryName, L1ERC1155GatewayImplStorageName)) + + deployPromises.push(deployContract(L1StakingFactoryName, StakingImplStorageName, [L1CrossDomainMessengerProxyAddress])) + + const results = await Promise.all(deployPromises) + + for (const result of results) { + if (result != '') { + return result + } + } + + console.log("Complete contract implementations deployment...") + return '' + } catch (err) { + console.error("Error during deployment:", err) + return "Deployment failed" + } +} + export const deployContractImpls = async ( hre: HardhatRuntimeEnvironment, path: string, diff --git a/contracts/deploy/019-AdminTransfer.ts b/contracts/deploy/019-AdminTransfer.ts index bc36b11f..566396b9 100644 --- a/contracts/deploy/019-AdminTransfer.ts +++ b/contracts/deploy/019-AdminTransfer.ts @@ -13,6 +13,8 @@ import { ContractFactoryName, } from "../src/types" +import { Mutex } from 'async-mutex'; + export const AdminTransferByProxyStorageName = async ( hre: HardhatRuntimeEnvironment, path: string, @@ -50,6 +52,102 @@ export const AdminTransferByProxyStorageName = async ( return '' } +export const AdminTransferByProxyStorageNameConcurrently = async ( + hre: HardhatRuntimeEnvironment, + path: string, + deployer: any, + storageName: string, + nonce: number +): Promise => { + const EmptyContractImplAddr = getContractAddressByName(path, ImplStorageName.EmptyContract) + const ProxyAdminImplAddr = getContractAddressByName(path, ImplStorageName.ProxyAdmin) + const ProxyAddr = getContractAddressByName(path, storageName) + const deployerAddr = (await deployer.getAddress()).toLocaleLowerCase() + + const IProxyContract = await hre.ethers.getContractAt(ContractFactoryName.DefaultProxyInterface, ProxyAddr, deployer) + { + if (storageName != ProxyStorageName.L1USDCGatewayProxyStorageName) { + const implAddr = (await IProxyContract.implementation()).toLocaleLowerCase() + const admin = (await IProxyContract.admin()).toLocaleLowerCase() + if (implAddr === EmptyContractImplAddr.toLocaleLowerCase()) { + return `Proxy implementation address ${implAddr} should not be empty contract address ${EmptyContractImplAddr}` + } + if (admin !== deployerAddr) { + return `Proxy admin address ${admin} should deployer address ${deployerAddr}` + } + } + } + console.log(`change ${storageName} admin transfer from ${deployerAddr} to ProxyAdmin ${ProxyAdminImplAddr} `) + // Set the transaction object, including specifying nonce + const tx = await IProxyContract.populateTransaction.changeAdmin(ProxyAdminImplAddr) + // Manually specify nonce + const txWithNonce = { + ...tx, + nonce: nonce, + } + // Send transaction + const res = await deployer.sendTransaction(txWithNonce) + await res.wait() + await assertContractVariable( + IProxyContract, + 'admin', + ProxyAdminImplAddr, + ProxyAdminImplAddr // caller + ) + console.log(`admin transfer successful `) + return '' +} + +export const AdminTransferConcurrently = async ( + hre: HardhatRuntimeEnvironment, + path: string, + deployer: any, + configTmp: any +): Promise => { + console.log("Start to transfer admin concurrrently...") + const contractsToChange = [ + ProxyStorageName.L1CrossDomainMessengerProxyStorageName, + ProxyStorageName.L1MessageQueueWithGasPriceOracleProxyStorageName, + ProxyStorageName.L1StakingProxyStorageName, + ProxyStorageName.RollupProxyStorageName, + ProxyStorageName.L1GatewayRouterProxyStorageName, + ProxyStorageName.L1ETHGatewayProxyStorageName, + ProxyStorageName.L1StandardERC20GatewayProxyStorageName, + ProxyStorageName.L1CustomERC20GatewayProxyStorageName, + ProxyStorageName.L1WithdrawLockERC20GatewayProxyStorageName, + ProxyStorageName.L1ReverseCustomGatewayProxyStorageName, + ProxyStorageName.L1ERC721GatewayProxyStorageName, + ProxyStorageName.L1ERC1155GatewayProxyStorageName, + ProxyStorageName.EnforcedTxGatewayProxyStorageName, + ProxyStorageName.L1WETHGatewayProxyStorageName, + ProxyStorageName.L1USDCGatewayProxyStorageName + ]; + + let nonce = await hre.ethers.provider.getTransactionCount(deployer.getAddress()) + const mutex = new Mutex(); + const results = await Promise.all(contractsToChange.map(async (storageName) => { + const release = await mutex.acquire(); // Acquire lock for getting nonce + const nonceToUse = nonce + nonce++; // Increment nonce for each deployment + release(); // Release the lock + + const err = await AdminTransferByProxyStorageNameConcurrently(hre, path, deployer, storageName, nonceToUse); + if (err !== '') { + return { storageName, error: err }; + } + return { storageName, error: '' }; + })); + + // Check for errors + for (const result of results) { + if (result.error !== '') { + return `Error occurred during admin transfer for ${result.storageName}: ${result.error}`; + } + } + + return ''; +} + export const AdminTransfer = async ( hre: HardhatRuntimeEnvironment, path: string, @@ -170,4 +268,4 @@ export const AdminTransfer = async ( return '' } -module.exports = { AdminTransfer, AdminTransferByProxyStorageName } \ No newline at end of file +module.exports = { AdminTransfer, AdminTransferByProxyStorageName, AdminTransferConcurrently, AdminTransferByProxyStorageNameConcurrently } \ No newline at end of file diff --git a/contracts/deploy/index.ts b/contracts/deploy/index.ts index 4611d3cd..16f69f20 100644 --- a/contracts/deploy/index.ts +++ b/contracts/deploy/index.ts @@ -1,13 +1,13 @@ import deployProxyAdmin from './010-ProxyAdmin' import deployEmptyContract from './011-EmptyContract' -import deployContractProxies from './013-DeployProxys' +import {deployContractProxies,deployContractProxiesConcurrently} from './013-DeployProxys' import deployZkEvmVerifierV1 from './012-Verifier' -import deployContractImpls from './014-DeployImpls' +import {deployContractImpls, deployContractImplsConcurrently} from './014-DeployImpls' import MessengerInit from './015-MessengerInit' import RollupInit from './016-RollupInit' import GatewayInit from './017-GatewayInit' import StakingInit from './018-StakingInit' -import {AdminTransfer,AdminTransferByProxyStorageName} from './019-AdminTransfer' +import {AdminTransfer,AdminTransferByProxyStorageName, AdminTransferConcurrently} from './019-AdminTransfer' import ContractInit from './020-ContractInit' import StakingRegister from './021-StakingRegister' @@ -17,13 +17,16 @@ export { deployEmptyContract, deployZkEvmVerifierV1, deployContractProxies, + deployContractProxiesConcurrently, deployContractImpls, + deployContractImplsConcurrently, MessengerInit, RollupInit, GatewayInit, StakingInit, AdminTransfer, AdminTransferByProxyStorageName, + AdminTransferConcurrently, ContractInit, StakingRegister } \ No newline at end of file diff --git a/contracts/package.json b/contracts/package.json index e85fd3f3..706dcc87 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -87,7 +87,8 @@ }, "dependencies": { "@morph-l2/core-utils": "0.0.1", + "async-mutex": "^0.5.0", "axios": "^1.4.0", "yarn": "^1.22.21" } -} \ No newline at end of file +} diff --git a/contracts/tasks/deploy.ts b/contracts/tasks/deploy.ts index 5dc9df47..9ee6739a 100644 --- a/contracts/tasks/deploy.ts +++ b/contracts/tasks/deploy.ts @@ -10,12 +10,15 @@ import { deployEmptyContract, deployZkEvmVerifierV1, deployContractProxies, + deployContractProxiesConcurrently, deployContractImpls, + deployContractImplsConcurrently, MessengerInit, RollupInit, GatewayInit, StakingInit, AdminTransfer, + AdminTransferConcurrently, ContractInit, StakingRegister, } from '../deploy/index' @@ -23,9 +26,11 @@ import { ethers } from "ethers"; task("deploy") .addParam('storagepath') + .addOptionalParam('concurrent', 'Use concurrent deployment', 'false') .setAction(async (taskArgs, hre) => { // Initialization parameters const storagePath = taskArgs.storagepath + const concurrent = taskArgs.concurrent const deployer = await hre.ethers.provider.getSigner(); const config = hre.deployConfig @@ -48,7 +53,11 @@ task("deploy") } console.log('\n---------------------------------- deploy Proxys ----------------------------------') - err = await deployContractProxies(hre, storagePath, deployer,config) + if (concurrent === 'true') { + err = await deployContractProxiesConcurrently(hre, storagePath, deployer,config) + } else { + err = await deployContractProxies(hre, storagePath, deployer,config) + } if (err != '') { console.log('Deploy Proxys failed, err: ', err) return @@ -64,9 +73,11 @@ task("deploy") task("initialize") .addParam('storagepath') + .addOptionalParam('concurrent', 'Use concurrent deployment', 'false') .setAction(async (taskArgs, hre) => { // Initialization parameters const storagePath = taskArgs.storagepath + const concurrent = taskArgs.concurrent const config = hre.deployConfig const deployer = await hre.ethers.provider.getSigner(); @@ -74,7 +85,12 @@ task("initialize") console.log('deployer :', await deployer.getAddress()) console.log('\n---------------------------------- deploy Impls ----------------------------------') - let err = await deployContractImpls(hre, storagePath, deployer, config) + let err: any + if (concurrent === 'true') { + err = await deployContractImplsConcurrently(hre, storagePath, deployer, config) + } else { + err = await deployContractImpls(hre, storagePath, deployer, config) + } if (err != '') { console.log('Deploy deploy Impls failed, err: ', err) return @@ -105,11 +121,19 @@ task("initialize") return } console.log('\n---------------------------------- Admin Transfer ----------------------------------') - err = await AdminTransfer(hre, storagePath, deployer, config) + if (concurrent === 'true') { + err = await AdminTransferConcurrently(hre, storagePath, deployer, config) + } else { + err = await AdminTransfer(hre, storagePath, deployer, config) + } + if (err != '') { console.log('OwnerTransfer failed, err: ', err) return } + + + console.log('\n---------------------------------- Contract Init ----------------------------------') err = await ContractInit(hre, storagePath, deployer, config) if (err != '') { diff --git a/contracts/yarn.lock b/contracts/yarn.lock index c1d28d9b..4a0d9483 100644 --- a/contracts/yarn.lock +++ b/contracts/yarn.lock @@ -2440,6 +2440,13 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async-mutex@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.5.0.tgz#353c69a0b9e75250971a64ac203b0ebfddd75482" + integrity sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA== + dependencies: + tslib "^2.4.0" + async@1.x, async@^1.4.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -10630,6 +10637,11 @@ tslib@^2.1.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.4.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + tsort@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" diff --git a/ops/devnet-morph/devnet/__init__.py b/ops/devnet-morph/devnet/__init__.py index 62e5504f..ba151512 100644 --- a/ops/devnet-morph/devnet/__init__.py +++ b/ops/devnet-morph/devnet/__init__.py @@ -83,8 +83,8 @@ def devnet_l1(paths, result=None): }) wait_up(9545) wait_for_rpc_server('127.0.0.1:9545') - log.info('Sleep another 20s...') - time.sleep(20) + log.info('Sleep another 10s...') + time.sleep(10) res = eth_accounts('127.0.0.1:9545') response = json.loads(res) account = response['result'][0] @@ -135,7 +135,7 @@ def devnet_deploy(paths, args): 'yarn', 'build' ], env={}, cwd=paths.contracts_dir) run_command([ - 'npx', 'hardhat', 'deploy', '--network', 'l1', '--storagepath', paths.deployment_dir + 'npx', 'hardhat', 'deploy', '--network', 'l1', '--storagepath', paths.deployment_dir, '--concurrent', 'true' ], env={}, cwd=paths.contracts_dir) log.info('Generating L2 genesis and rollup configs.') @@ -171,7 +171,7 @@ def devnet_deploy(paths, args): modified_line = re.sub(pattern3, f"batchHeader: '{genesis_batch_header}'", line) print(modified_line, end='') run_command([ - 'npx', 'hardhat', 'initialize', '--network', 'l1', '--storagepath', paths.deployment_dir + 'npx', 'hardhat', 'initialize', '--network', 'l1', '--storagepath', paths.deployment_dir, '--concurrent', 'true' ], env={}, cwd=paths.contracts_dir) # run_command([ diff --git a/ops/docker/Dockerfile.staking-oracle b/ops/docker/Dockerfile.staking-oracle index 4354c568..eadeaa28 100644 --- a/ops/docker/Dockerfile.staking-oracle +++ b/ops/docker/Dockerfile.staking-oracle @@ -1,18 +1,18 @@ -# Build Geth in a stock Go builder container FROM morph/go-ubuntu-builder:go-1.22-ubuntu as builder -# RUN apk add --no-cache gcc musl-dev linux-headers git make - +# Copy source code and build application COPY . /morph - WORKDIR /morph/oracle - RUN make build -# Pull Geth into a second stage deploy alpine container -FROM builder +# Deploy stage using the same base image (morph/go-ubuntu-builder:go-1.22-ubuntu) +FROM morph/go-ubuntu-builder:go-1.22-ubuntu + +# Install only necessary dependencies (e.g., ca-certificates for networking) +RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && rm -rf /var/lib/apt/lists/* -# RUN apk add --no-cache ca-certificates +# Copy the built binary from the builder stage COPY --from=builder /morph/oracle/build/bin/staking-oracle /usr/local/bin/ +# Set the default command to run the staking oracle CMD ["staking-oracle"] \ No newline at end of file From 1381d457c04453a9a00f61f12a39f8a6328ae0b2 Mon Sep 17 00:00:00 2001 From: Kathy <22675649+anylots@users.noreply.github.com> Date: Fri, 6 Dec 2024 14:58:57 +0800 Subject: [PATCH 04/14] remove skip map (#664) --- gas-oracle/app/src/abi/Rollup.json | 39 ++++++++++++++++++++---- prover/bin/challenge/src/abi/Rollup.json | 39 ++++++++++++++++++++---- prover/bin/challenge/src/handler.rs | 4 --- prover/bin/shadow-prove/abi/Rollup.json | 39 ++++++++++++++++++++---- 4 files changed, 99 insertions(+), 22 deletions(-) diff --git a/gas-oracle/app/src/abi/Rollup.json b/gas-oracle/app/src/abi/Rollup.json index 10b61fb3..dc4c9bba 100644 --- a/gas-oracle/app/src/abi/Rollup.json +++ b/gas-oracle/app/src/abi/Rollup.json @@ -623,11 +623,6 @@ "name": "blockContexts", "type": "bytes" }, - { - "internalType": "bytes", - "name": "skippedL1MessageBitmap", - "type": "bytes" - }, { "internalType": "bytes32", "name": "prevStateRoot", @@ -695,6 +690,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + } + ], + "name": "committedStateRoots", + "outputs": [ + { + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "finalizationPeriodSeconds", @@ -804,6 +818,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_prevStateRoot", + "type": "bytes32" + } + ], + "name": "initialize2", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1142,4 +1169,4 @@ "stateMutability": "payable", "type": "receive" } -] \ No newline at end of file +] diff --git a/prover/bin/challenge/src/abi/Rollup.json b/prover/bin/challenge/src/abi/Rollup.json index 10b61fb3..dc4c9bba 100644 --- a/prover/bin/challenge/src/abi/Rollup.json +++ b/prover/bin/challenge/src/abi/Rollup.json @@ -623,11 +623,6 @@ "name": "blockContexts", "type": "bytes" }, - { - "internalType": "bytes", - "name": "skippedL1MessageBitmap", - "type": "bytes" - }, { "internalType": "bytes32", "name": "prevStateRoot", @@ -695,6 +690,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + } + ], + "name": "committedStateRoots", + "outputs": [ + { + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "finalizationPeriodSeconds", @@ -804,6 +818,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_prevStateRoot", + "type": "bytes32" + } + ], + "name": "initialize2", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1142,4 +1169,4 @@ "stateMutability": "payable", "type": "receive" } -] \ No newline at end of file +] diff --git a/prover/bin/challenge/src/handler.rs b/prover/bin/challenge/src/handler.rs index 58429344..dc40a140 100644 --- a/prover/bin/challenge/src/handler.rs +++ b/prover/bin/challenge/src/handler.rs @@ -418,7 +418,6 @@ struct BatchInfo { withdrawal_root: [u8; 32], sequencer_set_verify_hash: [u8; 32], parent_batch_hash: [u8; 32], - skipped_l1_message_bitmap: Bytes, } async fn batch_inspect(l1_provider: &Provider, hash: TxHash) -> Option { @@ -450,7 +449,6 @@ async fn batch_inspect(l1_provider: &Provider, hash: TxHash) -> Option, hash: TxHash) -> Option Date: Fri, 6 Dec 2024 17:17:48 +0800 Subject: [PATCH 05/14] feat(event): replace file storage with leveldb for event info (#657) Co-authored-by: WorldDogs --- tx-submitter/db/db.go | 20 +++++++++++ tx-submitter/entry.go | 14 ++++---- tx-submitter/event/indexer.go | 41 +++++++++++---------- tx-submitter/event/storage.go | 51 +++++++++++++------------- tx-submitter/event/storage_test.go | 11 +++--- tx-submitter/params/leveldb_keys.go | 5 +++ tx-submitter/services/rollup.go | 56 ++++++++++++++++------------- tx-submitter/services/rotator.go | 12 ++++++- 8 files changed, 128 insertions(+), 82 deletions(-) create mode 100644 tx-submitter/params/leveldb_keys.go diff --git a/tx-submitter/db/db.go b/tx-submitter/db/db.go index 4a5914c4..d6913390 100644 --- a/tx-submitter/db/db.go +++ b/tx-submitter/db/db.go @@ -3,6 +3,7 @@ package db import ( "fmt" "strconv" + "sync" "morph-l2/tx-submitter/utils" @@ -15,6 +16,7 @@ var ( type Db struct { db *leveldb.Database + m sync.Mutex } func New(pathname string) (*Db, error) { @@ -26,6 +28,8 @@ func New(pathname string) (*Db, error) { return &Db{db: ldb}, nil } func (d *Db) GetFloat(key string) (float64, error) { + d.m.Lock() + defer d.m.Unlock() v, err := d.db.Get([]byte(key)) if err != nil { return 0, fmt.Errorf("failed get key from leveldb %s: %w", key, err) @@ -37,6 +41,8 @@ func (d *Db) GetFloat(key string) (float64, error) { return res, nil } func (d *Db) PutFloat(key string, val float64) error { + d.m.Lock() + defer d.m.Unlock() valStr := strconv.FormatFloat(val, 'f', -1, 64) err := d.db.Put([]byte(key), []byte(valStr)) if err != nil { @@ -44,6 +50,20 @@ func (d *Db) PutFloat(key string, val float64) error { } return nil } +func (d *Db) GetString(key string) (string, error) { + d.m.Lock() + defer d.m.Unlock() + v, err := d.db.Get([]byte(key)) + if err != nil { + return "", fmt.Errorf("failed to get key from leveldb %w", err) + } + return string(v), nil +} +func (d *Db) PutString(key, val string) error { + d.m.Lock() + defer d.m.Unlock() + return d.db.Put([]byte(key), []byte(val)) +} func (d *Db) Close() error { return d.db.Close() } diff --git a/tx-submitter/entry.go b/tx-submitter/entry.go index 1cc6ea43..545a2056 100644 --- a/tx-submitter/entry.go +++ b/tx-submitter/entry.go @@ -186,17 +186,16 @@ func Main() func(ctx *cli.Context) error { }, } - eventIndexer := event.NewEventIndexer(cfg.StakingEventStoreFilename, l1Client, new(big.Int).SetUint64(cfg.L1StakingDeployedBlockNumber), filter, cfg.EventIndexStep) - - // new rotator - rotator := services.NewRotator(common.HexToAddress(cfg.L2SequencerAddress), common.HexToAddress(cfg.L2GovAddress), eventIndexer) - // start rorator event indexer - rotator.StartEventIndexer() - ldb, err := db.New(cfg.LeveldbPathName) if err != nil { return fmt.Errorf("failed to connect leveldb: %w", err) } + eventInfoStorage := event.NewEventInfoStorage(ldb) + eventIndexer := event.NewEventIndexer(l1Client, new(big.Int).SetUint64(cfg.L1StakingDeployedBlockNumber), filter, cfg.EventIndexStep, eventInfoStorage) + // new rotator + rotator := services.NewRotator(common.HexToAddress(cfg.L2SequencerAddress), common.HexToAddress(cfg.L2GovAddress), eventIndexer) + // start rorator event indexer + rotator.StartEventIndexer() // blockmonitor bm := l1checker.NewBlockMonitor(cfg.BlockNotIncreasedThreshold, l1Client) @@ -219,6 +218,7 @@ func Main() func(ctx *cli.Context) error { rotator, ldb, bm, + eventInfoStorage, ) // metrics diff --git a/tx-submitter/event/indexer.go b/tx-submitter/event/indexer.go index f666c6b2..0ba87ab5 100644 --- a/tx-submitter/event/indexer.go +++ b/tx-submitter/event/indexer.go @@ -13,31 +13,31 @@ import ( type EventIndexer struct { client *ethclient.Client - storePath string // store path deployBlock *big.Int // Block number of contract deployment filterQuery ethereum.FilterQuery indexStep uint64 // index step + storage *EventInfoStorage } -func NewEventIndexer(storePath string, client *ethclient.Client, deployedBlock *big.Int, filter ethereum.FilterQuery, indexStep uint64) *EventIndexer { +func NewEventIndexer(client *ethclient.Client, deployedBlock *big.Int, filter ethereum.FilterQuery, indexStep uint64, storage *EventInfoStorage) *EventIndexer { return &EventIndexer{ - storePath: storePath, client: client, deployBlock: deployedBlock, filterQuery: filter, indexStep: indexStep, + storage: storage, } } func (l *EventIndexer) Index() { log.Info("event indexer started") - storage := NewEventInfoStorage(l.storePath) - err := storage.Load() - if err != nil { - log.Crit("failed to load storage", "error", err, "file_name", storage.Filename) - } - if storage.BlockProcessed == 0 { - storage.BlockProcessed = l.deployBlock.Uint64() + + if l.storage.BlockProcessed == 0 { + l.storage.BlockProcessed = l.deployBlock.Uint64() + err := l.storage.Store() + if err != nil { + log.Error("failed to store initial block number", "error", err) + } } // Create a ticker that triggers every minute @@ -53,31 +53,31 @@ func (l *EventIndexer) Index() { continue } - if currentBlock <= storage.BlockProcessed { - log.Info("no new block to index", "current_block", currentBlock, "last_processed_block", storage.BlockProcessed) + if currentBlock <= l.storage.BlockProcessed { + log.Info("no new block to index", "current_block", currentBlock, "last_processed_block", l.storage.BlockProcessed) continue } // Perform indexing operation - indexedEventInfo, err := l.index(l.client, big.NewInt(int64(storage.BlockProcessed)), big.NewInt(int64(currentBlock))) + indexedEventInfo, err := l.index(l.client, big.NewInt(int64(l.storage.BlockProcessed)), big.NewInt(int64(currentBlock))) if err != nil { log.Error("indexing operation failed", "error", err) continue } if indexedEventInfo != nil { - storage.EventInfo = *indexedEventInfo + l.storage.EventInfo = *indexedEventInfo } else { - storage.EventInfo = EventInfo{ + l.storage.EventInfo = EventInfo{ BlockProcessed: currentBlock, } } // Update storage - err = storage.Store() + err = l.storage.Store() if err != nil { - log.Error("event index complete, failed to update storage", "error", err, "file_name", storage.Filename) + log.Error("event index complete, failed to update storage", "error", err) } else { - log.Info("event index complete storage updated", "processed_block", storage.EventInfo.BlockProcessed, "block_time", storage.EventInfo.BlockTime) + log.Info("event index complete, storage updated", "processed_block", l.storage.EventInfo.BlockProcessed, "block_time", l.storage.EventInfo.BlockTime) } } @@ -139,7 +139,6 @@ func (ei *EventIndexer) index(client *ethclient.Client, fromBlock, toBlock *big. func (l *EventIndexer) GetFilter() ethereum.FilterQuery { return l.filterQuery } - -func (l *EventIndexer) GetStorePath() string { - return l.storePath +func (l *EventIndexer) GetStorage() *EventInfoStorage { + return l.storage } diff --git a/tx-submitter/event/storage.go b/tx-submitter/event/storage.go index 7e206273..d77f857f 100644 --- a/tx-submitter/event/storage.go +++ b/tx-submitter/event/storage.go @@ -3,8 +3,11 @@ package event import ( "encoding/json" "fmt" - "os" "sync" + + "morph-l2/tx-submitter/db" + "morph-l2/tx-submitter/params" + "morph-l2/tx-submitter/utils" ) type IEventStorage interface { @@ -12,10 +15,6 @@ type IEventStorage interface { Load() error } -var ( - defaultFilename = "event_info.json" -) - type EventInfo struct { BlockTime uint64 `json:"block_time"` // event emit time BlockProcessed uint64 `json:"block_processed"` // block processed @@ -23,51 +22,55 @@ type EventInfo struct { type EventInfoStorage struct { EventInfo - Filename string `json:"filename"` // filename - lock sync.Mutex + db *db.Db + mu sync.Mutex } -func NewEventInfoStorage(filename string) *EventInfoStorage { - if filename == "" { - filename = defaultFilename - } +func NewEventInfoStorage(db *db.Db) *EventInfoStorage { return &EventInfoStorage{ - Filename: filename, + db: db, } } func (e *EventInfoStorage) Store() error { // Convert struct to JSON string - jsonData, err := json.Marshal(e) + jsonData, err := json.Marshal(e.EventInfo) if err != nil { return fmt.Errorf("failed to convert struct to JSON: %w", err) } - e.lock.Lock() - defer e.lock.Unlock() + e.mu.Lock() + defer e.mu.Unlock() // Write JSON data to file - err = os.WriteFile(e.Filename, jsonData, 0600) + err = e.db.PutString(params.EventInfoKey, string(jsonData)) if err != nil { - return fmt.Errorf("failed to write to file: %w", err) + return fmt.Errorf("failed to write to db: err=%w, data=%v", err, jsonData) } - return nil } func (e *EventInfoStorage) Load() error { - e.lock.Lock() - defer e.lock.Unlock() - jsonData, err := os.ReadFile(e.Filename) + e.mu.Lock() + defer e.mu.Unlock() + evnetInfo, err := e.db.GetString(params.EventInfoKey) if err != nil { - if os.IsNotExist(err) { + if utils.ErrStringMatch(err, db.ErrKeyNotFound) { e.EventInfo = EventInfo{} + jsonData, err := json.Marshal(e.EventInfo) + if err != nil { + return fmt.Errorf("failed to marshal json: %w", err) + } + err = e.db.PutString(params.EventInfoKey, string(jsonData)) + if err != nil { + return fmt.Errorf("failed to init eventinfo to db: %w", err) + } return nil } - return fmt.Errorf("failed to read file: %w", err) + return fmt.Errorf("failed to load eventinfo from db: %w", err) } // parse json data to struct - err = json.Unmarshal(jsonData, e) + err = json.Unmarshal([]byte(evnetInfo), &e.EventInfo) if err != nil { return fmt.Errorf("failed to unmarshal JSON: %w", err) } diff --git a/tx-submitter/event/storage_test.go b/tx-submitter/event/storage_test.go index 7ba32dbb..74e78b09 100644 --- a/tx-submitter/event/storage_test.go +++ b/tx-submitter/event/storage_test.go @@ -1,15 +1,18 @@ package event import ( + "morph-l2/tx-submitter/db" "testing" "github.com/stretchr/testify/require" ) func TestEventInfoStorage(t *testing.T) { - filename := "hello.json" - storage := NewEventInfoStorage(filename) - err := storage.Load() + + db, err := db.New("./testleveldb") + require.NoError(t, err) + storage := NewEventInfoStorage(db) + err = storage.Load() require.NoError(t, err) storage.BlockTime = 100 @@ -17,7 +20,7 @@ func TestEventInfoStorage(t *testing.T) { err = storage.Store() require.NoError(t, err) - storage2 := NewEventInfoStorage(filename) + storage2 := NewEventInfoStorage(db) err = storage2.Load() require.NoError(t, err) require.Equal(t, storage.BlockTime, storage2.BlockTime) diff --git a/tx-submitter/params/leveldb_keys.go b/tx-submitter/params/leveldb_keys.go new file mode 100644 index 00000000..b998e6de --- /dev/null +++ b/tx-submitter/params/leveldb_keys.go @@ -0,0 +1,5 @@ +package params + +const ( + EventInfoKey = "event_info" +) diff --git a/tx-submitter/services/rollup.go b/tx-submitter/services/rollup.go index 2ca77a03..50824325 100644 --- a/tx-submitter/services/rollup.go +++ b/tx-submitter/services/rollup.go @@ -75,8 +75,9 @@ type Rollup struct { // collectedL1FeeSum collectedL1FeeSum float64 // batchcache - batchCache *BatchCache - bm *l1checker.BlockMonitor + batchCache *BatchCache + bm *l1checker.BlockMonitor + eventInfoStorage *event.EventInfoStorage } func NewRollup( @@ -96,27 +97,29 @@ func NewRollup( rotator *Rotator, ldb *db.Db, bm *l1checker.BlockMonitor, + eventInfoStorage *event.EventInfoStorage, ) *Rollup { return &Rollup{ - ctx: ctx, - metrics: metrics, - l1RpcClient: l1RpcClient, - L1Client: l1, - Rollup: rollup, - Staking: staking, - L2Clients: l2Clients, - privKey: priKey, - chainId: chainId, - rollupAddr: rollupAddr, - abi: abi, - rotator: rotator, - cfg: cfg, - signer: types.LatestSignerForChainID(chainId), - externalRsaPriv: rsaPriv, - batchCache: NewBatchCache(), - ldb: ldb, - bm: bm, + ctx: ctx, + metrics: metrics, + l1RpcClient: l1RpcClient, + L1Client: l1, + Rollup: rollup, + Staking: staking, + L2Clients: l2Clients, + privKey: priKey, + chainId: chainId, + rollupAddr: rollupAddr, + abi: abi, + rotator: rotator, + cfg: cfg, + signer: types.LatestSignerForChainID(chainId), + externalRsaPriv: rsaPriv, + batchCache: NewBatchCache(), + ldb: ldb, + bm: bm, + eventInfoStorage: eventInfoStorage, } } @@ -561,24 +564,27 @@ func (r *Rollup) rollup() error { return fmt.Errorf("rollup: get current submitter err, %w", err) } - storage := event.NewEventInfoStorage(r.rotator.indexer.GetStorePath()) - err = storage.Load() + err = r.eventInfoStorage.Load() if err != nil { return fmt.Errorf("failed to load storage in rollup: %w", err) } + log.Info("indexer info", + "block_processed", r.eventInfoStorage.EventInfo.BlockProcessed, + "event_latest_emit_time", r.eventInfoStorage.EventInfo.BlockTime, + ) // get current blocknumber blockNumber, err := r.L1Client.BlockNumber(context.Background()) if err != nil { return fmt.Errorf("failed to get block number in rollup: %w", err) } // set metrics - r.metrics.SetIndexerBlockProcessed(storage.EventInfo.BlockProcessed) + r.metrics.SetIndexerBlockProcessed(r.eventInfoStorage.EventInfo.BlockProcessed) // check if indexed block number is too old - if blockNumber > storage.EventInfo.BlockProcessed+100 { + if blockNumber > r.eventInfoStorage.EventInfo.BlockProcessed+100 { log.Info("indexed block number is too old, wait indexer to catch up", "module", r.GetModuleName(), "block_number", blockNumber, - "processed_block", storage.EventInfo.BlockProcessed) + "processed_block", r.eventInfoStorage.EventInfo.BlockProcessed) return nil } diff --git a/tx-submitter/services/rotator.go b/tx-submitter/services/rotator.go index 913fff48..c9988404 100644 --- a/tx-submitter/services/rotator.go +++ b/tx-submitter/services/rotator.go @@ -56,7 +56,7 @@ func (r *Rotator) UpdateState(clients []iface.L2Client, l1Staking iface.IL1Staki return fmt.Errorf("GetCurrentSubmitter: failed to get sequencer set update time: %w", err) } - storage := event.NewEventInfoStorage(r.indexer.GetStorePath()) + storage := r.indexer.GetStorage() err = storage.Load() if err != nil { log.Error("failed to load storage", "err", err) @@ -92,6 +92,16 @@ func (r *Rotator) UpdateState(clients []iface.L2Client, l1Staking iface.IL1Staki } submitterSet := utils.IntersectionOfAddresses(r.GetSequencerSet(), stakers) r.SetSubmitterSet(submitterSet) + // rotator info + log.Info( + "rotator state updated", + "epoch", r.epoch, + "start", r.startTime, + "epoch_update_time", epochUpdateTime, + "seq_update_time", sequcerUpdateTime, + "indexed_latest_block", storage.BlockProcessed, + "indexed_event_emit_time", storage.BlockTime, + ) return nil } From e28101d75625d1f45719ca5b9628acd3c5093010 Mon Sep 17 00:00:00 2001 From: corey Date: Fri, 6 Dec 2024 18:03:26 +0800 Subject: [PATCH 06/14] Fix fetch batch operation dispatching (#668) --- oracle/oracle/batch.go | 56 ++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/oracle/oracle/batch.go b/oracle/oracle/batch.go index 231549d3..b8e9c3ce 100644 --- a/oracle/oracle/batch.go +++ b/oracle/oracle/batch.go @@ -39,7 +39,7 @@ type BatchInfo struct { func (o *Oracle) GetStartBlock(nextBatchSubmissionIndex *big.Int) (uint64, error) { if nextBatchSubmissionIndex.Uint64() == 1 { - return o.cfg.StartBlock, nil + return o.cfg.StartBlock + 1, nil } bs, err := o.record.BatchSubmissions(nil, new(big.Int).Sub(nextBatchSubmissionIndex, big.NewInt(1))) if err != nil { @@ -49,8 +49,19 @@ func (o *Oracle) GetStartBlock(nextBatchSubmissionIndex *big.Int) (uint64, error } func (o *Oracle) GetBatchSubmission(ctx context.Context, startBlock, nextBatchSubmissionIndex uint64) ([]bindings.IRecordBatchSubmission, error) { - var rLogs []types.Log + var recordBatchSubmissions []bindings.IRecordBatchSubmission + lastLogs, err := o.fetchRollupLog(ctx, startBlock-1, startBlock-1) + if err != nil { + return nil, fmt.Errorf("fetch rollupLog error:%v", err) + } + if err = o.getBatchSubmissionByLogs(lastLogs, recordBatchSubmissions, nextBatchSubmissionIndex); err != nil { + return nil, fmt.Errorf("GetBatchSubmissionByLogs error:%v", err) + } + if len(recordBatchSubmissions) == maxBatchSize { + return recordBatchSubmissions, nil + } for { + batchIndex := nextBatchSubmissionIndex + uint64(len(recordBatchSubmissions)) endBlock := startBlock + o.cfg.MaxSize header, err := o.l1Client.HeaderByNumber(o.ctx, nil) if err != nil { @@ -63,49 +74,52 @@ func (o *Oracle) GetBatchSubmission(ctx context.Context, startBlock, nextBatchSu if endBlock >= header.Number.Uint64() { endBlock = header.Number.Uint64() } - rLogs, err = o.fetchRollupLog(ctx, startBlock, endBlock) + fetchLogs, err := o.fetchRollupLog(ctx, startBlock, endBlock) if err != nil { return nil, fmt.Errorf("fetch rollupLog error:%v", err) } - if len(rLogs) >= 1 { - break + if err = o.getBatchSubmissionByLogs(fetchLogs, recordBatchSubmissions, batchIndex); err != nil { + return nil, fmt.Errorf("GetBatchSubmissionByLogs error:%v", err) + } + if len(recordBatchSubmissions) == maxBatchSize { + return recordBatchSubmissions, nil } startBlock = endBlock + 1 } +} - var recordBatchSubmissions []bindings.IRecordBatchSubmission - batchIndex := nextBatchSubmissionIndex +func (o *Oracle) getBatchSubmissionByLogs(rLogs []types.Log, recordBatchSubmissions []bindings.IRecordBatchSubmission, batchIndex uint64) error { for _, lg := range rLogs { - tx, pending, err := o.l1Client.TransactionByHash(ctx, lg.TxHash) + tx, pending, err := o.l1Client.TransactionByHash(o.ctx, lg.TxHash) if err != nil { - return nil, fmt.Errorf("get transaction by hash error:%v", err) + return fmt.Errorf("get transaction by hash error:%v", err) } signer := types.NewLondonSignerWithEIP4844(tx.ChainId()) msg, err := tx.AsMessage(signer, tx.GasFeeCap()) if err != nil { - return nil, err + return err } header, err := o.l1Client.HeaderByNumber(context.Background(), big.NewInt(int64(lg.BlockNumber))) if err != nil { - return nil, fmt.Errorf("get header by number error:%v", err) + return fmt.Errorf("get header by number error:%v", err) } if pending { - return nil, errors.New("pending transaction") + return errors.New("pending transaction") } beforeRemoveSkipMapAbi, err := BeforeRemoveSkipMapMetaData.GetAbi() if err != nil { - return nil, err + return err } abi, err := bindings.RollupMetaData.GetAbi() if err != nil { - return nil, err + return err } var batch eth.RPCRollupBatch if bytes.Equal(tx.Data()[0:4], abi.Methods["commitBatch"].ID) { args, err := abi.Methods["commitBatch"].Inputs.Unpack(tx.Data()[4:]) if err != nil { log.Error("fetch batch info failed", "txHash", lg.TxHash, "blockNumber", lg.BlockNumber, "error", err) - return nil, fmt.Errorf("unpack commitBatch error:%v", err) + return fmt.Errorf("unpack commitBatch error:%v", err) } rollupBatchData := args[0].(struct { Version uint8 "json:\"version\"" @@ -127,7 +141,7 @@ func (o *Oracle) GetBatchSubmission(ctx context.Context, startBlock, nextBatchSu args, err := beforeRemoveSkipMapAbi.Methods["commitBatch"].Inputs.Unpack(tx.Data()[4:]) if err != nil { log.Error("fetch batch info failed", "txHash", lg.TxHash, "blockNumber", lg.BlockNumber, "error", err) - return nil, fmt.Errorf("unpack commitBatch error:%v", err) + return fmt.Errorf("unpack commitBatch error:%v", err) } rollupBatchData := args[0].(struct { @@ -155,19 +169,19 @@ func (o *Oracle) GetBatchSubmission(ctx context.Context, startBlock, nextBatchSu rollupCommitBatch, parseErr := o.rollup.ParseCommitBatch(lg) if parseErr != nil { log.Error("get l2 BlockNumber", "err", err) - return nil, parseErr + return parseErr } if rollupCommitBatch.BatchIndex.Uint64() < batchIndex { continue } if rollupCommitBatch.BatchIndex.Uint64() > batchIndex { - return nil, fmt.Errorf(fmt.Sprintf("batch is incontinuity,expect %v,have %v", batchIndex, rollupCommitBatch.BatchIndex.Uint64())) + return fmt.Errorf(fmt.Sprintf("batch is incontinuity,expect %v,have %v", batchIndex, rollupCommitBatch.BatchIndex.Uint64())) } // set batchIndex to new batch index + 1 batchIndex = rollupCommitBatch.BatchIndex.Uint64() + 1 var batchData derivation.BatchInfo if err = batchData.ParseBatch(batch); err != nil { - return nil, fmt.Errorf("parse batch error:%v", err) + return fmt.Errorf("parse batch error:%v", err) } log.Info("received new batch", "batch_index", rollupCommitBatch.BatchIndex.Uint64()) recordBatchSubmission := bindings.IRecordBatchSubmission{ @@ -180,10 +194,10 @@ func (o *Oracle) GetBatchSubmission(ctx context.Context, startBlock, nextBatchSu } recordBatchSubmissions = append(recordBatchSubmissions, recordBatchSubmission) if len(recordBatchSubmissions) == maxBatchSize { - return recordBatchSubmissions, nil + return nil } } - return recordBatchSubmissions, nil + return nil } func (o *Oracle) fetchRollupLog(ctx context.Context, start, end uint64) ([]types.Log, error) { From 7d286fb953831fc3d952f3266d414401d922c53e Mon Sep 17 00:00:00 2001 From: WorldDogs <33647825+WorldDogs@users.noreply.github.com> Date: Mon, 9 Dec 2024 16:10:21 +0800 Subject: [PATCH 07/14] Revert rollup control batch income (#670) --- tx-submitter/entry.go | 3 - tx-submitter/flags/flags.go | 41 +++----- tx-submitter/services/batch_cache.go | 39 -------- tx-submitter/services/batch_calche_test.go | 21 ----- tx-submitter/services/rollup.go | 103 +++++++-------------- tx-submitter/services/utils.go | 15 --- tx-submitter/utils/config.go | 18 ++-- tx-submitter/utils/utils.go | 53 ++--------- tx-submitter/utils/utils_test.go | 98 -------------------- 9 files changed, 64 insertions(+), 327 deletions(-) delete mode 100644 tx-submitter/services/batch_cache.go delete mode 100644 tx-submitter/services/batch_calche_test.go diff --git a/tx-submitter/entry.go b/tx-submitter/entry.go index 545a2056..5355def1 100644 --- a/tx-submitter/entry.go +++ b/tx-submitter/entry.go @@ -69,9 +69,6 @@ func Main() func(ctx *cli.Context) error { "rough_estimate_per_l1_msg", cfg.RollupTxGasPerL1Msg, "log_level", cfg.LogLevel, "leveldb_pathname", cfg.LeveldbPathName, - "l1_stop_in_blocks", cfg.BlockNotIncreasedThreshold, - "rollup_loss_control", cfg.RollupLossControl, - "rolluo_loss_buffer", cfg.MaxRollupLossBuffer, ) ctx, cancel := context.WithCancel(context.Background()) diff --git a/tx-submitter/flags/flags.go b/tx-submitter/flags/flags.go index 8e8d1b14..041cf2db 100644 --- a/tx-submitter/flags/flags.go +++ b/tx-submitter/flags/flags.go @@ -229,37 +229,37 @@ var ( } // external sign - ExternalSignFlag = cli.BoolFlag{ + ExternalSign = cli.BoolFlag{ Name: "external_sign", Usage: "Enable external sign", EnvVar: prefixEnvVar("EXTERNAL_SIGN"), } // address - ExternalSignAddressFlag = cli.StringFlag{ + ExternalSignAddress = cli.StringFlag{ Name: "external_sign_address", Usage: "The address of the external sign", EnvVar: prefixEnvVar("EXTERNAL_SIGN_ADDRESS"), } // appid - ExternalSignAppidFlag = cli.StringFlag{ + ExternalSignAppid = cli.StringFlag{ Name: "external_sign_appid", Usage: "The appid of the external sign", EnvVar: prefixEnvVar("EXTERNAL_SIGN_APPID"), } // chain - ExternalSignChainFlag = cli.StringFlag{ + ExternalSignChain = cli.StringFlag{ Name: "external_sign_chain", Usage: "The chain of the external sign", EnvVar: prefixEnvVar("EXTERNAL_SIGN_CHAIN"), } // url - ExternalSignUrlFlag = cli.StringFlag{ + ExternalSignUrl = cli.StringFlag{ Name: "external_sign_url", Usage: "The url of the external sign", EnvVar: prefixEnvVar("EXTERNAL_SIGN_URL"), } - ExternalSignRsaPrivFlag = cli.StringFlag{ + ExternalSignRsaPriv = cli.StringFlag{ Name: "external_rsa_priv", Usage: "The rsa private key of the external sign", EnvVar: "SEQUENCER_EXTERNAL_SIGN_RSA_PRIV", // use sequencer rsa from xxx @@ -300,24 +300,12 @@ var ( } // l1 block not incremented threshold - BlockNotIncreasedThresholdFlag = cli.Int64Flag{ + BlockNotIncreasedThreshold = cli.Int64Flag{ Name: "block_not_increased_threshold", Usage: "The threshold for block not incremented", Value: 5, EnvVar: prefixEnvVar("BLOCK_NOT_INCREASED_THRESHOLD"), } - RollupLossControlFlag = cli.BoolFlag{ - Name: "rollup_loss_control", - Usage: "Enable rollup loss control", - EnvVar: prefixEnvVar("ROLLUP_LOSS_CONTROL"), - } - // max rollup loss buffer - MaxRollupLossBufferFlag = cli.Int64Flag{ - Name: "max_rollup_loss_buffer", - Usage: "single transaction rollup maximum allowable loss buff", - Value: 50, // default 50% percent - EnvVar: prefixEnvVar("MAX_ROLLUP_LOSS_BUFFER"), - } ) var requiredFlags = []cli.Flag{ @@ -361,19 +349,18 @@ var optionalFlags = []cli.Flag{ MaxTxsInPendingPoolFlag, // external sign - ExternalSignFlag, - ExternalSignAddressFlag, - ExternalSignAppidFlag, - ExternalSignChainFlag, - ExternalSignUrlFlag, - ExternalSignRsaPrivFlag, + ExternalSign, + ExternalSignAddress, + ExternalSignAppid, + ExternalSignChain, + ExternalSignUrl, + ExternalSignRsaPriv, RoughEstimateGasFlag, RotatorBufferFlag, StakingEventStoreFileFlag, EventIndexStepFlag, LeveldbPathNameFlag, - BlockNotIncreasedThresholdFlag, - MaxRollupLossBufferFlag, + BlockNotIncreasedThreshold, } // Flags contains the list of configuration options available to the binary. diff --git a/tx-submitter/services/batch_cache.go b/tx-submitter/services/batch_cache.go deleted file mode 100644 index 5cb8443a..00000000 --- a/tx-submitter/services/batch_cache.go +++ /dev/null @@ -1,39 +0,0 @@ -package services - -import ( - "sync" - - "github.com/morph-l2/go-ethereum/eth" -) - -type BatchCache struct { - batchCache map[uint64]*eth.RPCRollupBatch - m sync.Mutex -} - -func NewBatchCache() *BatchCache { - return &BatchCache{ - batchCache: make(map[uint64]*eth.RPCRollupBatch), - } -} - -func (b *BatchCache) Get(batchIndex uint64) (*eth.RPCRollupBatch, bool) { - b.m.Lock() - defer b.m.Unlock() - - batch, ok := b.batchCache[batchIndex] - return batch, ok -} -func (b *BatchCache) Set(batchIndex uint64, batch *eth.RPCRollupBatch) { - b.m.Lock() - defer b.m.Unlock() - - b.batchCache[batchIndex] = batch -} - -func (b *BatchCache) Delete(batchIndex uint64) { - b.m.Lock() - defer b.m.Unlock() - - delete(b.batchCache, batchIndex) -} diff --git a/tx-submitter/services/batch_calche_test.go b/tx-submitter/services/batch_calche_test.go deleted file mode 100644 index 03529eb2..00000000 --- a/tx-submitter/services/batch_calche_test.go +++ /dev/null @@ -1,21 +0,0 @@ -package services - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestBatchCache(t *testing.T) { - - cache := NewBatchCache() - cache.Set(1, nil) - _, ok := cache.Get(1) - require.True(t, ok) - cache.Delete(1) - _, ok = cache.Get(1) - require.False(t, ok) - _, ok = cache.Get(2) - require.False(t, ok) - -} diff --git a/tx-submitter/services/rollup.go b/tx-submitter/services/rollup.go index 50824325..2ae0e322 100644 --- a/tx-submitter/services/rollup.go +++ b/tx-submitter/services/rollup.go @@ -75,7 +75,7 @@ type Rollup struct { // collectedL1FeeSum collectedL1FeeSum float64 // batchcache - batchCache *BatchCache + batchCache map[uint64]*eth.RPCRollupBatch bm *l1checker.BlockMonitor eventInfoStorage *event.EventInfoStorage } @@ -101,25 +101,24 @@ func NewRollup( ) *Rollup { return &Rollup{ - ctx: ctx, - metrics: metrics, - l1RpcClient: l1RpcClient, - L1Client: l1, - Rollup: rollup, - Staking: staking, - L2Clients: l2Clients, - privKey: priKey, - chainId: chainId, - rollupAddr: rollupAddr, - abi: abi, - rotator: rotator, - cfg: cfg, - signer: types.LatestSignerForChainID(chainId), - externalRsaPriv: rsaPriv, - batchCache: NewBatchCache(), - ldb: ldb, - bm: bm, - eventInfoStorage: eventInfoStorage, + ctx: ctx, + metrics: metrics, + l1RpcClient: l1RpcClient, + L1Client: l1, + Rollup: rollup, + Staking: staking, + L2Clients: l2Clients, + privKey: priKey, + chainId: chainId, + rollupAddr: rollupAddr, + abi: abi, + rotator: rotator, + cfg: cfg, + signer: types.LatestSignerForChainID(chainId), + externalRsaPriv: rsaPriv, + batchCache: make(map[uint64]*eth.RPCRollupBatch), + ldb: ldb, + bm: bm, } } @@ -259,7 +258,7 @@ func (r *Rollup) ProcessTx() error { if ispending { if txRecord.sendTime+uint64(r.cfg.TxTimeout.Seconds()) < uint64(time.Now().Unix()) { log.Info("tx timeout", "tx", rtx.Hash().Hex(), "nonce", rtx.Nonce(), "method", method) - newtx, err := r.ReSubmitTx(false, rtx, r.GetReSubmitBatchIndex(method, rtx.Data())) + newtx, err := r.ReSubmitTx(false, rtx) if err != nil { log.Error("resubmit tx", "error", err, "tx", rtx.Hash().Hex(), "nonce", rtx.Nonce()) return fmt.Errorf("resubmit tx error:%w", err) @@ -284,8 +283,7 @@ func (r *Rollup) ProcessTx() error { "nonce", rtx.Nonce(), "query_times", txRecord.queryTimes, ) - - replacedtx, err := r.ReSubmitTx(true, rtx, r.GetReSubmitBatchIndex(method, rtx.Data())) + replacedtx, err := r.ReSubmitTx(true, rtx) if err != nil { log.Error("resend discarded tx", "old_tx", rtx.Hash().String(), "nonce", rtx.Nonce(), "error", err) if utils.ErrStringMatch(err, core.ErrNonceTooLow) { @@ -362,7 +360,7 @@ func (r *Rollup) ProcessTx() error { } r.metrics.SetRollupCost(fee) index := utils.ParseParentBatchIndex(rtx.Data()) + 1 - batch, ok := r.batchCache.Get(index) + batch, ok := r.batchCache[index] if ok { collectedL1FeeFloat := ToEtherFloat((*big.Int)(batch.CollectedL1Fee)) r.collectedL1FeeSum += collectedL1FeeFloat @@ -372,7 +370,7 @@ func (r *Rollup) ProcessTx() error { } r.metrics.SetCollectedL1Fee(ToEtherFloat((*big.Int)(batch.CollectedL1Fee))) // remove batch from cache - r.batchCache.Delete(index) + delete(r.batchCache, index) } else { log.Warn("batch not found in batchCache while set collect fee metrics", "index", index, @@ -531,7 +529,7 @@ func (r *Rollup) finalize() error { "size", signedTx.Size(), ) - err = r.SendTx(signedTx, 0) + err = r.SendTx(signedTx) if err != nil { log.Error("send finalize tx to mempool", "error", err.Error()) if utils.ErrStringMatch(err, core.ErrNonceTooLow) { @@ -666,13 +664,9 @@ func (r *Rollup) rollup() error { return nil } - var batch *eth.RPCRollupBatch - batch, ok := r.batchCache.Get(batchIndex) - if !ok { - batch, err = GetRollupBatchByIndex(batchIndex, r.L2Clients) - if err != nil { - return fmt.Errorf("get rollup batch by index err:%v", err) - } + batch, err := GetRollupBatchByIndex(batchIndex, r.L2Clients) + if err != nil { + return fmt.Errorf("get rollup batch by index err:%v", err) } // check if the batch is valid @@ -688,7 +682,7 @@ func (r *Rollup) rollup() error { // set batch cache // it shoud be removed after the batch is committed - r.batchCache.Set(batchIndex, batch) + r.batchCache[batchIndex] = batch signature, err := r.buildSignatureInput(batch) if err != nil { @@ -728,7 +722,7 @@ func (r *Rollup) rollup() error { } if r.cfg.RoughEstimateGas { - msgcnt := r.ParseL1MessageCnt(batch.BlockContexts) + msgcnt := utils.ParseL1MessageCnt(batch.BlockContexts) gas = r.RoughRollupGasEstimate(msgcnt) log.Info("rough estimate rollup tx gas", "gas", gas, "msgcnt", msgcnt) } else { @@ -806,7 +800,7 @@ func (r *Rollup) rollup() error { "blob_len", len(signedTx.BlobHashes()), ) - err = r.SendTx(signedTx, batchIndex) + err = r.SendTx(signedTx) if err != nil { log.Error("send tx to mempool", "error", err.Error()) if utils.ErrStringMatch(err, core.ErrNonceTooLow) { @@ -1111,7 +1105,7 @@ func UpdateGasLimit(tx *types.Transaction) (*types.Transaction, error) { } // send tx to l1 with business logic check -func (r *Rollup) SendTx(tx *types.Transaction, batchIndex uint64) error { +func (r *Rollup) SendTx(tx *types.Transaction) error { // judge tx info is valid if tx == nil { @@ -1121,30 +1115,7 @@ func (r *Rollup) SendTx(tx *types.Transaction, batchIndex uint64) error { if !r.bm.IsGrowth() { return fmt.Errorf("block not growth in %d blocks time", r.cfg.BlockNotIncreasedThreshold) } - // check batch loss - if r.cfg.RollupLossControl { - // calc fee - fee := utils.CalcFeeForTx(tx) - // get batch - var collectedL1Fee *big.Int - batch, ok := r.batchCache.Get(batchIndex) - if ok { - collectedL1Fee = batch.CollectedL1Fee.ToInt() - if collectedL1Fee == nil { - collectedL1Fee = big.NewInt(0) - } - } else { - log.Warn("batch not found in cache when calc fee before SendTx", "batchIndex", batchIndex) - collectedL1Fee = big.NewInt(0) - } - // targetFee = fee * (100 + cfg.RotatorBuffer)/100 - targetFee := new(big.Int).Mul(fee, big.NewInt(100+r.cfg.RotatorBuffer)) - targetFee.Div(targetFee, big.NewInt(100)) - if collectedL1Fee.Cmp(targetFee) < 0 { - return fmt.Errorf("tx fee exceed collectedL1Fee: targetFee=%v,fee=%v,collectedL1Fee:=%v", targetFee, fee, collectedL1Fee) - } - } err := sendTx(r.L1Client, r.cfg.TxFeeLimit, tx) if err != nil { return err @@ -1181,7 +1152,7 @@ func sendTx(client iface.Client, txFeeLimit uint64, tx *types.Transaction) error return client.SendTransaction(context.Background(), tx) } -func (r *Rollup) ReSubmitTx(resend bool, tx *types.Transaction, batchIndex uint64) (*types.Transaction, error) { +func (r *Rollup) ReSubmitTx(resend bool, tx *types.Transaction) (*types.Transaction, error) { if tx == nil { return nil, errors.New("nil tx") } @@ -1272,7 +1243,7 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *types.Transaction, batchIndex uint6 return nil, fmt.Errorf("sign tx error:%w", err) } // send tx - err = r.SendTx(newTx, batchIndex) + err = r.SendTx(newTx) if err != nil { return nil, fmt.Errorf("send tx error:%w", err) } @@ -1378,11 +1349,3 @@ func (r *Rollup) InitFeeMetricsSum() error { r.metrics.CollectedL1FeeSum.Add(r.collectedL1FeeSum) return nil } - -func (r *Rollup) GetReSubmitBatchIndex(method string, calldta []byte) uint64 { - if method == "commitBatch" { - return utils.ParseBatchIndex(method, calldta) - } else { - return 0 - } -} diff --git a/tx-submitter/services/utils.go b/tx-submitter/services/utils.go index d5909d75..e8e185b4 100644 --- a/tx-submitter/services/utils.go +++ b/tx-submitter/services/utils.go @@ -2,11 +2,9 @@ package services import ( "crypto/sha256" - "encoding/binary" "math/big" "github.com/morph-l2/go-ethereum/common" - "github.com/morph-l2/go-ethereum/common/hexutil" "github.com/morph-l2/go-ethereum/core/types" "github.com/morph-l2/go-ethereum/crypto/kzg4844" "github.com/morph-l2/go-ethereum/params" @@ -75,16 +73,3 @@ func ToEtherFloat(weiAmt *big.Int) float64 { return fEtherAmt } - -func (r *Rollup) ParseL1MessageCnt(blockContexts hexutil.Bytes) uint64 { - - var l1msgcnt uint64 - blockNum := binary.BigEndian.Uint16(blockContexts[:2]) - remainingBz := blockContexts[2:] - for i := 0; i < int(blockNum); i++ { - l1msgcnt += uint64(binary.BigEndian.Uint16(remainingBz[58:60])) - remainingBz = remainingBz[60:] - } - - return l1msgcnt -} diff --git a/tx-submitter/utils/config.go b/tx-submitter/utils/config.go index cf7c9551..30decb20 100644 --- a/tx-submitter/utils/config.go +++ b/tx-submitter/utils/config.go @@ -107,8 +107,6 @@ type Config struct { // leveldb path name LeveldbPathName string BlockNotIncreasedThreshold int64 - RollupLossControl bool - MaxRollupLossBuffer int64 } // NewConfig parses the DriverConfig from the provided flags or environment variables. @@ -159,12 +157,12 @@ func NewConfig(ctx *cli.Context) (Config, error) { MaxTxsInPendingPool: ctx.GlobalUint64(flags.MaxTxsInPendingPoolFlag.Name), // external sign - ExternalSign: ctx.GlobalBool(flags.ExternalSignFlag.Name), - ExternalSignAppid: ctx.GlobalString(flags.ExternalSignAppidFlag.Name), - ExternalSignAddress: ctx.GlobalString(flags.ExternalSignAddressFlag.Name), - ExternalSignChain: ctx.GlobalString(flags.ExternalSignChainFlag.Name), - ExternalSignUrl: ctx.GlobalString(flags.ExternalSignUrlFlag.Name), - ExternalSignRsaPriv: ctx.GlobalString(flags.ExternalSignRsaPrivFlag.Name), + ExternalSign: ctx.GlobalBool(flags.ExternalSign.Name), + ExternalSignAppid: ctx.GlobalString(flags.ExternalSignAppid.Name), + ExternalSignAddress: ctx.GlobalString(flags.ExternalSignAddress.Name), + ExternalSignChain: ctx.GlobalString(flags.ExternalSignChain.Name), + ExternalSignUrl: ctx.GlobalString(flags.ExternalSignUrl.Name), + ExternalSignRsaPriv: ctx.GlobalString(flags.ExternalSignRsaPriv.Name), // rough estimate gas switch RoughEstimateGas: ctx.GlobalBool(flags.RoughEstimateGasFlag.Name), // rotator interval buffer @@ -179,9 +177,7 @@ func NewConfig(ctx *cli.Context) (Config, error) { // leveldb path name LeveldbPathName: ctx.GlobalString(flags.LeveldbPathNameFlag.Name), // BlockNotIncreasedThreshold - BlockNotIncreasedThreshold: ctx.GlobalInt64(flags.BlockNotIncreasedThresholdFlag.Name), - RollupLossControl: ctx.GlobalBool(flags.RollupLossControlFlag.Name), - MaxRollupLossBuffer: ctx.GlobalInt64(flags.MaxRollupLossBufferFlag.Name), + BlockNotIncreasedThreshold: ctx.GlobalInt64(flags.BlockNotIncreasedThreshold.Name), } return cfg, nil diff --git a/tx-submitter/utils/utils.go b/tx-submitter/utils/utils.go index 01ed34de..bcfc0205 100644 --- a/tx-submitter/utils/utils.go +++ b/tx-submitter/utils/utils.go @@ -5,7 +5,6 @@ import ( "context" "encoding/binary" "fmt" - "math/big" "reflect" "regexp" "strconv" @@ -16,6 +15,7 @@ import ( "github.com/morph-l2/go-ethereum/accounts/abi" "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/common/hexutil" "github.com/morph-l2/go-ethereum/core/types" "github.com/morph-l2/go-ethereum/log" "github.com/morph-l2/go-ethereum/rpc" @@ -35,17 +35,6 @@ func Loop(ctx context.Context, period time.Duration, f func()) { } } -func ParseBatchIndex(method string, calldata []byte) uint64 { - switch method { - case "commitBatch": - return ParseParentBatchIndex(calldata) + 1 - case "finalizeBatch": - return ParseFBatchIndex(calldata) - default: - return 0 - } -} - func ParseFBatchIndex(calldata []byte) uint64 { abi, _ := bindings.RollupMetaData.GetAbi() parms, _ := abi.Methods["finalizeBatch"].Inputs.Unpack(calldata[4:]) @@ -184,37 +173,15 @@ func ParseNonce(s string) (uint64, uint64, error) { } } -func CalcFeeForTx(tx *types.Transaction) *big.Int { - if tx == nil { - return big.NewInt(0) - } - switch tx.Type() { - case types.DynamicFeeTxType: - if tx.GasFeeCap() == nil { - return big.NewInt(0) - } - fee := new(big.Int).Mul( - tx.GasFeeCap(), - big.NewInt(int64(tx.Gas())), - ) - return fee - case types.BlobTxType: - var blobfee *big.Int - if tx.BlobGasFeeCap() == nil { - blobfee = big.NewInt(0) - } else { - blobfee = new(big.Int).Mul(tx.BlobGasFeeCap(), big.NewInt(int64(tx.BlobGas()))) - } - var calldatafee *big.Int - if tx.GasFeeCap() == nil { - calldatafee = big.NewInt(0) - } else { - calldatafee = new(big.Int).Mul(tx.GasFeeCap(), big.NewInt(int64(tx.Gas()))) - } - return new(big.Int).Add(blobfee, calldatafee) +func ParseL1MessageCnt(blockContexts hexutil.Bytes) uint64 { - default: - log.Warn("unknown tx type to calc fee", "type", tx.Type()) - return big.NewInt(0) + var l1msgcnt uint64 + blockNum := binary.BigEndian.Uint16(blockContexts[:2]) + remainingBz := blockContexts[2:] + for i := 0; i < int(blockNum); i++ { + l1msgcnt += uint64(binary.BigEndian.Uint16(remainingBz[58:60])) + remainingBz = remainingBz[60:] } + + return l1msgcnt } diff --git a/tx-submitter/utils/utils_test.go b/tx-submitter/utils/utils_test.go index 24595710..71cf6111 100644 --- a/tx-submitter/utils/utils_test.go +++ b/tx-submitter/utils/utils_test.go @@ -2,13 +2,8 @@ package utils import ( "encoding/hex" - "math/big" "testing" - "github.com/holiman/uint256" - "github.com/morph-l2/go-ethereum/common" - "github.com/morph-l2/go-ethereum/core/types" - "github.com/morph-l2/go-ethereum/params" "github.com/stretchr/testify/require" ) @@ -19,96 +14,3 @@ func TestParseBatchIndex(t *testing.T) { require.NoError(t, err) require.EqualValues(t, ParseParentBatchIndex(bs), 16) } - -func TestCalcFeeForTx(t *testing.T) { - singleBlobHash := make([]common.Hash, 1) - tests := []struct { - name string - tx *types.Transaction - expected *big.Int - }{ - { - name: "nil transaction", - tx: nil, - expected: big.NewInt(0), - }, - { - name: "DynamicFeeTxType with nil GasFeeCap", - tx: types.NewTx(&types.DynamicFeeTx{ - ChainID: big.NewInt(1), - GasTipCap: big.NewInt(100), - GasFeeCap: nil, - Gas: 21000, - }), - expected: big.NewInt(0), - }, - { - name: "DynamicFeeTxType with non-nil GasFeeCap", - tx: types.NewTx(&types.DynamicFeeTx{ - ChainID: big.NewInt(1), - GasTipCap: big.NewInt(100), - GasFeeCap: big.NewInt(200), - Gas: 21000, - }), - expected: new(big.Int).Mul(big.NewInt(200), big.NewInt(21000)), - }, - { - name: "BlobTxType with nil BlobFeeCap and GasFeeCap", - tx: types.NewTx(&types.BlobTx{ - BlobFeeCap: nil, - BlobHashes: make([]common.Hash, 1), - GasFeeCap: nil, - Gas: 21000, - }), - expected: big.NewInt(0), - }, - { - name: "BlobTxType with nil BlobFeeCap and non-nil GasFeeCap", - tx: types.NewTx(&types.BlobTx{ - BlobFeeCap: nil, - BlobHashes: singleBlobHash, - GasFeeCap: uint256.NewInt(200), - Gas: 21000, - }), - expected: new(big.Int).Mul(big.NewInt(200), big.NewInt(21000)), - }, - { - name: "BlobTxType with non-nil BlobFeeCap and nil GasFeeCap", - tx: types.NewTx(&types.BlobTx{ - BlobFeeCap: uint256.NewInt(150), - BlobHashes: singleBlobHash, - GasFeeCap: nil, - Gas: 21000, - }), - expected: new(big.Int).Mul(big.NewInt(150), big.NewInt(params.BlobTxBlobGasPerBlob)), - }, - { - name: "BlobTxType with non-nil BlobFeeCap and non-nil GasFeeCap", - tx: types.NewTx(&types.BlobTx{ - BlobFeeCap: uint256.NewInt(150), - BlobHashes: singleBlobHash, - GasFeeCap: uint256.NewInt(200), - Gas: 21000, - }), - expected: new(big.Int).Add( - new(big.Int).Mul(big.NewInt(150), big.NewInt(params.BlobTxBlobGasPerBlob)), - new(big.Int).Mul(big.NewInt(200), big.NewInt(21000)), - ), - }, - { - name: "Unknown tx type", - tx: types.NewTx(&types.LegacyTx{ - Gas: 21000, - GasPrice: big.NewInt(200), - }), - expected: big.NewInt(0), - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - result := CalcFeeForTx(tt.tx) - require.Equal(t, tt.expected, result) - }) - } -} From ddd115fdc8a6fb4aab025983b3845b2fe97a34bb Mon Sep 17 00:00:00 2001 From: WorldDogs <33647825+WorldDogs@users.noreply.github.com> Date: Mon, 9 Dec 2024 16:35:12 +0800 Subject: [PATCH 08/14] refactor(tx-submitter): improve batch cache management (#671) --- tx-submitter/entry.go | 1 + tx-submitter/services/rollup.go | 71 +++++++++++++------------- tx-submitter/types/batch_cache.go | 39 ++++++++++++++ tx-submitter/types/batch_cache_test.go | 21 ++++++++ 4 files changed, 97 insertions(+), 35 deletions(-) create mode 100644 tx-submitter/types/batch_cache.go create mode 100644 tx-submitter/types/batch_cache_test.go diff --git a/tx-submitter/entry.go b/tx-submitter/entry.go index 5355def1..8849a4e1 100644 --- a/tx-submitter/entry.go +++ b/tx-submitter/entry.go @@ -69,6 +69,7 @@ func Main() func(ctx *cli.Context) error { "rough_estimate_per_l1_msg", cfg.RollupTxGasPerL1Msg, "log_level", cfg.LogLevel, "leveldb_pathname", cfg.LeveldbPathName, + "l1_stop_in_blocks", cfg.BlockNotIncreasedThreshold, ) ctx, cancel := context.WithCancel(context.Background()) diff --git a/tx-submitter/services/rollup.go b/tx-submitter/services/rollup.go index 2ae0e322..275dac83 100644 --- a/tx-submitter/services/rollup.go +++ b/tx-submitter/services/rollup.go @@ -17,7 +17,7 @@ import ( "github.com/morph-l2/go-ethereum/common" "github.com/morph-l2/go-ethereum/consensus/misc/eip4844" "github.com/morph-l2/go-ethereum/core" - "github.com/morph-l2/go-ethereum/core/types" + ethtypes "github.com/morph-l2/go-ethereum/core/types" "github.com/morph-l2/go-ethereum/crypto" "github.com/morph-l2/go-ethereum/crypto/bls12381" "github.com/morph-l2/go-ethereum/eth" @@ -33,6 +33,7 @@ import ( "morph-l2/tx-submitter/l1checker" "morph-l2/tx-submitter/localpool" "morph-l2/tx-submitter/metrics" + "morph-l2/tx-submitter/types" "morph-l2/tx-submitter/utils" ) @@ -65,7 +66,7 @@ type Rollup struct { // cfg cfg utils.Config // signer - signer types.Signer + signer ethtypes.Signer // leveldb ldb *db.Db // rollupFeeSum @@ -75,7 +76,7 @@ type Rollup struct { // collectedL1FeeSum collectedL1FeeSum float64 // batchcache - batchCache map[uint64]*eth.RPCRollupBatch + batchCache *types.BatchCache bm *l1checker.BlockMonitor eventInfoStorage *event.EventInfoStorage } @@ -114,9 +115,9 @@ func NewRollup( abi: abi, rotator: rotator, cfg: cfg, - signer: types.LatestSignerForChainID(chainId), + signer: ethtypes.LatestSignerForChainID(chainId), externalRsaPriv: rsaPriv, - batchCache: make(map[uint64]*eth.RPCRollupBatch), + batchCache: types.NewBatchCache(), ldb: ldb, bm: bm, } @@ -324,7 +325,7 @@ func (r *Rollup) ProcessTx() error { logs..., ) - if receipt.Status != types.ReceiptStatusSuccessful { + if receipt.Status != ethtypes.ReceiptStatusSuccessful { // if tx is commitBatch if method == "commitBatch" { parentindex := utils.ParseParentBatchIndex(rtx.Data()) @@ -360,7 +361,7 @@ func (r *Rollup) ProcessTx() error { } r.metrics.SetRollupCost(fee) index := utils.ParseParentBatchIndex(rtx.Data()) + 1 - batch, ok := r.batchCache[index] + batch, ok := r.batchCache.Get(index) if ok { collectedL1FeeFloat := ToEtherFloat((*big.Int)(batch.CollectedL1Fee)) r.collectedL1FeeSum += collectedL1FeeFloat @@ -370,7 +371,7 @@ func (r *Rollup) ProcessTx() error { } r.metrics.SetCollectedL1Fee(ToEtherFloat((*big.Int)(batch.CollectedL1Fee))) // remove batch from cache - delete(r.batchCache, index) + r.batchCache.Delete(index) } else { log.Warn("batch not found in batchCache while set collect fee metrics", "index", index, @@ -497,7 +498,7 @@ func (r *Rollup) finalize() error { } } - tx := types.NewTx(&types.DynamicFeeTx{ + tx := ethtypes.NewTx(ðtypes.DynamicFeeTx{ ChainID: r.chainId, Nonce: nonce, GasTipCap: tip, @@ -682,7 +683,7 @@ func (r *Rollup) rollup() error { // set batch cache // it shoud be removed after the batch is committed - r.batchCache[batchIndex] = batch + r.batchCache.Set(batchIndex, batch) signature, err := r.buildSignatureInput(batch) if err != nil { @@ -745,14 +746,14 @@ func (r *Rollup) rollup() error { } } - var tx *types.Transaction + var tx *ethtypes.Transaction if len(batch.Sidecar.Blobs) > 0 { versionedHashes := make([]common.Hash, 0) for _, commit := range batch.Sidecar.Commitments { versionedHashes = append(versionedHashes, kZGToVersionedHash(commit)) } // blob tx - tx = types.NewTx(&types.BlobTx{ + tx = ethtypes.NewTx(ðtypes.BlobTx{ ChainID: uint256.MustFromBig(r.chainId), Nonce: nonce, GasTipCap: uint256.MustFromBig(big.NewInt(tip.Int64())), @@ -762,7 +763,7 @@ func (r *Rollup) rollup() error { Data: calldata, BlobFeeCap: uint256.MustFromBig(blobFee), BlobHashes: versionedHashes, - Sidecar: &types.BlobTxSidecar{ + Sidecar: ðtypes.BlobTxSidecar{ Blobs: batch.Sidecar.Blobs, Commitments: batch.Sidecar.Commitments, Proofs: batch.Sidecar.Proofs, @@ -770,7 +771,7 @@ func (r *Rollup) rollup() error { }) } else { - tx = types.NewTx(&types.DynamicFeeTx{ + tx = ethtypes.NewTx(ðtypes.DynamicFeeTx{ ChainID: r.chainId, Nonce: nonce, GasTipCap: tip, @@ -1058,14 +1059,14 @@ func GetEpochUpdateTime(addr common.Address, clients []iface.L2Client) (*big.Int } -func UpdateGasLimit(tx *types.Transaction) (*types.Transaction, error) { +func UpdateGasLimit(tx *ethtypes.Transaction) (*ethtypes.Transaction, error) { // add buffer to gas limit (*1.2) newGasLimit := tx.Gas() * 12 / 10 - var newTx *types.Transaction - if tx.Type() == types.LegacyTxType { + var newTx *ethtypes.Transaction + if tx.Type() == ethtypes.LegacyTxType { - newTx = types.NewTx(&types.LegacyTx{ + newTx = ethtypes.NewTx(ðtypes.LegacyTx{ Nonce: tx.Nonce(), GasPrice: big.NewInt(tx.GasPrice().Int64()), Gas: newGasLimit, @@ -1073,8 +1074,8 @@ func UpdateGasLimit(tx *types.Transaction) (*types.Transaction, error) { Value: tx.Value(), Data: tx.Data(), }) - } else if tx.Type() == types.DynamicFeeTxType { - newTx = types.NewTx(&types.DynamicFeeTx{ + } else if tx.Type() == ethtypes.DynamicFeeTxType { + newTx = ethtypes.NewTx(ðtypes.DynamicFeeTx{ Nonce: tx.Nonce(), GasTipCap: big.NewInt(tx.GasTipCap().Int64()), GasFeeCap: big.NewInt(tx.GasFeeCap().Int64()), @@ -1083,8 +1084,8 @@ func UpdateGasLimit(tx *types.Transaction) (*types.Transaction, error) { Value: tx.Value(), Data: tx.Data(), }) - } else if tx.Type() == types.BlobTxType { - newTx = types.NewTx(&types.BlobTx{ + } else if tx.Type() == ethtypes.BlobTxType { + newTx = ethtypes.NewTx(ðtypes.BlobTx{ ChainID: uint256.MustFromBig(tx.ChainId()), Nonce: tx.Nonce(), GasTipCap: uint256.MustFromBig(big.NewInt(tx.GasTipCap().Int64())), @@ -1105,7 +1106,7 @@ func UpdateGasLimit(tx *types.Transaction) (*types.Transaction, error) { } // send tx to l1 with business logic check -func (r *Rollup) SendTx(tx *types.Transaction) error { +func (r *Rollup) SendTx(tx *ethtypes.Transaction) error { // judge tx info is valid if tx == nil { @@ -1130,12 +1131,12 @@ func (r *Rollup) SendTx(tx *types.Transaction) error { } // send tx to l1 with business logic check -func sendTx(client iface.Client, txFeeLimit uint64, tx *types.Transaction) error { +func sendTx(client iface.Client, txFeeLimit uint64, tx *ethtypes.Transaction) error { // fee limit if txFeeLimit > 0 { var fee uint64 // calc tx gas fee - if tx.Type() == types.BlobTxType { + if tx.Type() == ethtypes.BlobTxType { // blob fee fee = tx.BlobGasFeeCap().Uint64() * tx.BlobGas() // tx fee @@ -1152,7 +1153,7 @@ func sendTx(client iface.Client, txFeeLimit uint64, tx *types.Transaction) error return client.SendTransaction(context.Background(), tx) } -func (r *Rollup) ReSubmitTx(resend bool, tx *types.Transaction) (*types.Transaction, error) { +func (r *Rollup) ReSubmitTx(resend bool, tx *ethtypes.Transaction) (*ethtypes.Transaction, error) { if tx == nil { return nil, errors.New("nil tx") } @@ -1178,8 +1179,8 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *types.Transaction) (*types.Transact } if !resend { // bump tip & feeCap - bumpedFeeCap := calcThresholdValue(tx.GasFeeCap(), tx.Type() == types.BlobTxType) - bumpedTip := calcThresholdValue(tx.GasTipCap(), tx.Type() == types.BlobTxType) + bumpedFeeCap := calcThresholdValue(tx.GasFeeCap(), tx.Type() == ethtypes.BlobTxType) + bumpedTip := calcThresholdValue(tx.GasTipCap(), tx.Type() == ethtypes.BlobTxType) // if bumpedTip > tip if bumpedTip.Cmp(tip) > 0 { @@ -1190,18 +1191,18 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *types.Transaction) (*types.Transact gasFeeCap = bumpedFeeCap } - if tx.Type() == types.BlobTxType { - bumpedBlobFeeCap := calcThresholdValue(tx.BlobGasFeeCap(), tx.Type() == types.BlobTxType) + if tx.Type() == ethtypes.BlobTxType { + bumpedBlobFeeCap := calcThresholdValue(tx.BlobGasFeeCap(), tx.Type() == ethtypes.BlobTxType) if bumpedBlobFeeCap.Cmp(blobFeeCap) > 0 { blobFeeCap = bumpedBlobFeeCap } } } - var newTx *types.Transaction + var newTx *ethtypes.Transaction switch tx.Type() { - case types.DynamicFeeTxType: - newTx = types.NewTx(&types.DynamicFeeTx{ + case ethtypes.DynamicFeeTxType: + newTx = ethtypes.NewTx(ðtypes.DynamicFeeTx{ To: tx.To(), Nonce: tx.Nonce(), GasFeeCap: gasFeeCap, @@ -1210,9 +1211,9 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *types.Transaction) (*types.Transact Value: tx.Value(), Data: tx.Data(), }) - case types.BlobTxType: + case ethtypes.BlobTxType: - newTx = types.NewTx(&types.BlobTx{ + newTx = ethtypes.NewTx(ðtypes.BlobTx{ ChainID: uint256.MustFromBig(tx.ChainId()), Nonce: tx.Nonce(), GasTipCap: uint256.MustFromBig(tip), diff --git a/tx-submitter/types/batch_cache.go b/tx-submitter/types/batch_cache.go new file mode 100644 index 00000000..7e6794f1 --- /dev/null +++ b/tx-submitter/types/batch_cache.go @@ -0,0 +1,39 @@ +package types + +import ( + "sync" + + "github.com/morph-l2/go-ethereum/eth" +) + +type BatchCache struct { + batchCache map[uint64]*eth.RPCRollupBatch + m sync.Mutex +} + +func NewBatchCache() *BatchCache { + return &BatchCache{ + batchCache: make(map[uint64]*eth.RPCRollupBatch), + } +} + +func (b *BatchCache) Get(batchIndex uint64) (*eth.RPCRollupBatch, bool) { + b.m.Lock() + defer b.m.Unlock() + + batch, ok := b.batchCache[batchIndex] + return batch, ok +} +func (b *BatchCache) Set(batchIndex uint64, batch *eth.RPCRollupBatch) { + b.m.Lock() + defer b.m.Unlock() + + b.batchCache[batchIndex] = batch +} + +func (b *BatchCache) Delete(batchIndex uint64) { + b.m.Lock() + defer b.m.Unlock() + + delete(b.batchCache, batchIndex) +} diff --git a/tx-submitter/types/batch_cache_test.go b/tx-submitter/types/batch_cache_test.go new file mode 100644 index 00000000..f07d6411 --- /dev/null +++ b/tx-submitter/types/batch_cache_test.go @@ -0,0 +1,21 @@ +package types + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestBatchCache(t *testing.T) { + + cache := NewBatchCache() + cache.Set(1, nil) + _, ok := cache.Get(1) + require.True(t, ok) + cache.Delete(1) + _, ok = cache.Get(1) + require.False(t, ok) + _, ok = cache.Get(2) + require.False(t, ok) + +} From 1137e3adac521f7b7204bb9c9388e05a0e2d4354 Mon Sep 17 00:00:00 2001 From: WorldDogs <33647825+WorldDogs@users.noreply.github.com> Date: Fri, 13 Dec 2024 12:33:48 +0800 Subject: [PATCH 09/14] fix(tx-submitter): eventInfoStorage not init (#677) --- tx-submitter/services/rollup.go | 37 +++++++++++++++++---------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/tx-submitter/services/rollup.go b/tx-submitter/services/rollup.go index 275dac83..c7180d3a 100644 --- a/tx-submitter/services/rollup.go +++ b/tx-submitter/services/rollup.go @@ -102,24 +102,25 @@ func NewRollup( ) *Rollup { return &Rollup{ - ctx: ctx, - metrics: metrics, - l1RpcClient: l1RpcClient, - L1Client: l1, - Rollup: rollup, - Staking: staking, - L2Clients: l2Clients, - privKey: priKey, - chainId: chainId, - rollupAddr: rollupAddr, - abi: abi, - rotator: rotator, - cfg: cfg, - signer: ethtypes.LatestSignerForChainID(chainId), - externalRsaPriv: rsaPriv, - batchCache: types.NewBatchCache(), - ldb: ldb, - bm: bm, + ctx: ctx, + metrics: metrics, + l1RpcClient: l1RpcClient, + L1Client: l1, + Rollup: rollup, + Staking: staking, + L2Clients: l2Clients, + privKey: priKey, + chainId: chainId, + rollupAddr: rollupAddr, + abi: abi, + rotator: rotator, + cfg: cfg, + signer: ethtypes.LatestSignerForChainID(chainId), + externalRsaPriv: rsaPriv, + batchCache: types.NewBatchCache(), + ldb: ldb, + bm: bm, + eventInfoStorage: eventInfoStorage, } } From 25acbfdb16042a63f9451775699b0ec18d2d7b25 Mon Sep 17 00:00:00 2001 From: corey Date: Mon, 16 Dec 2024 11:21:42 +0800 Subject: [PATCH 10/14] Fix oracle getBatches (#676) --- oracle/oracle/batch.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/oracle/oracle/batch.go b/oracle/oracle/batch.go index b8e9c3ce..4270bc11 100644 --- a/oracle/oracle/batch.go +++ b/oracle/oracle/batch.go @@ -54,7 +54,7 @@ func (o *Oracle) GetBatchSubmission(ctx context.Context, startBlock, nextBatchSu if err != nil { return nil, fmt.Errorf("fetch rollupLog error:%v", err) } - if err = o.getBatchSubmissionByLogs(lastLogs, recordBatchSubmissions, nextBatchSubmissionIndex); err != nil { + if err = o.getBatchSubmissionByLogs(lastLogs, &recordBatchSubmissions, nextBatchSubmissionIndex); err != nil { return nil, fmt.Errorf("GetBatchSubmissionByLogs error:%v", err) } if len(recordBatchSubmissions) == maxBatchSize { @@ -78,7 +78,7 @@ func (o *Oracle) GetBatchSubmission(ctx context.Context, startBlock, nextBatchSu if err != nil { return nil, fmt.Errorf("fetch rollupLog error:%v", err) } - if err = o.getBatchSubmissionByLogs(fetchLogs, recordBatchSubmissions, batchIndex); err != nil { + if err = o.getBatchSubmissionByLogs(fetchLogs, &recordBatchSubmissions, batchIndex); err != nil { return nil, fmt.Errorf("GetBatchSubmissionByLogs error:%v", err) } if len(recordBatchSubmissions) == maxBatchSize { @@ -88,7 +88,7 @@ func (o *Oracle) GetBatchSubmission(ctx context.Context, startBlock, nextBatchSu } } -func (o *Oracle) getBatchSubmissionByLogs(rLogs []types.Log, recordBatchSubmissions []bindings.IRecordBatchSubmission, batchIndex uint64) error { +func (o *Oracle) getBatchSubmissionByLogs(rLogs []types.Log, recordBatchSubmissions *[]bindings.IRecordBatchSubmission, batchIndex uint64) error { for _, lg := range rLogs { tx, pending, err := o.l1Client.TransactionByHash(o.ctx, lg.TxHash) if err != nil { @@ -192,8 +192,8 @@ func (o *Oracle) getBatchSubmissionByLogs(rLogs []types.Log, recordBatchSubmissi RollupTime: big.NewInt(int64(header.Time)), RollupBlock: big.NewInt(int64(lg.BlockNumber)), } - recordBatchSubmissions = append(recordBatchSubmissions, recordBatchSubmission) - if len(recordBatchSubmissions) == maxBatchSize { + *recordBatchSubmissions = append(*recordBatchSubmissions, recordBatchSubmission) + if len(*recordBatchSubmissions) == maxBatchSize { return nil } } From ae2ea5a318f43d2f7978b5118ed816e332759ace Mon Sep 17 00:00:00 2001 From: corey Date: Mon, 16 Dec 2024 15:45:42 +0800 Subject: [PATCH 11/14] Skip processing l1 msg that has already been processed by snapshot (#678) --- node/derivation/derivation.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/node/derivation/derivation.go b/node/derivation/derivation.go index cd0c7c4a..0b4eeb13 100644 --- a/node/derivation/derivation.go +++ b/node/derivation/derivation.go @@ -311,7 +311,11 @@ func (d *Derivation) fetchRollupDataByTxHash(txHash common.Hash, blockNumber uin } } batch.Sidecar = bts - rollupData, err := d.parseBatch(batch) + l2Height, err := d.l2Client.BlockNumber(d.ctx) + if err != nil { + return nil, fmt.Errorf("query l2 block number error:%v", err) + } + rollupData, err := d.parseBatch(batch, l2Height) if err != nil { d.logger.Error("parse batch failed", "txNonce", tx.Nonce(), "txHash", txHash, "l1BlockNumber", blockNumber) @@ -375,7 +379,7 @@ func (d *Derivation) UnPackData(data []byte) (geth.RPCRollupBatch, error) { return batch, nil } -func (d *Derivation) parseBatch(batch geth.RPCRollupBatch) (*BatchInfo, error) { +func (d *Derivation) parseBatch(batch geth.RPCRollupBatch, l2Height uint64) (*BatchInfo, error) { parentBatchHeader, err := types.DecodeBatchHeader(batch.ParentBatchHeader) if err != nil { return nil, fmt.Errorf("decode batch header error:%v", err) @@ -384,16 +388,20 @@ func (d *Derivation) parseBatch(batch geth.RPCRollupBatch) (*BatchInfo, error) { if err := batchInfo.ParseBatch(batch); err != nil { return nil, fmt.Errorf("parse batch error:%v", err) } - if err := d.handleL1Message(batchInfo, parentBatchHeader.TotalL1MessagePopped); err != nil { + if err := d.handleL1Message(batchInfo, parentBatchHeader.TotalL1MessagePopped, l2Height); err != nil { return nil, fmt.Errorf("handle l1 message error:%v", err) } batchInfo.batchIndex = parentBatchHeader.BatchIndex + 1 return batchInfo, nil } -func (d *Derivation) handleL1Message(rollupData *BatchInfo, parentTotalL1MessagePopped uint64) error { +func (d *Derivation) handleL1Message(rollupData *BatchInfo, parentTotalL1MessagePopped, l2Height uint64) error { totalL1MessagePopped := parentTotalL1MessagePopped for bIndex, block := range rollupData.blockContexts { + // This may happen to nodes started from sanpshot, in which case we will no longer handle L1Msg + if block.Number <= l2Height { + continue + } var l1Transactions []*eth.Transaction l1Messages, err := d.getL1Message(totalL1MessagePopped, uint64(block.l1MsgNum)) if err != nil { From e4739abaf617062566ac6d82751e1554c5b54c91 Mon Sep 17 00:00:00 2001 From: "marvel.yu" Date: Wed, 18 Dec 2024 12:35:39 +0800 Subject: [PATCH 12/14] add make target for qanet (#679) --- MakefileEc2.mk | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/MakefileEc2.mk b/MakefileEc2.mk index 8fa53be8..f5258138 100644 --- a/MakefileEc2.mk +++ b/MakefileEc2.mk @@ -37,3 +37,19 @@ build-bk-prod-morph-prod-testnet-to-morph-tx-submitter-holesky: cp tx-submitter/tx-submitter dist/ tar -czvf tx-submitter.tar.gz dist aws s3 cp tx-submitter.tar.gz s3://morph-0582-morph-technical-department-testnet-data/testnet/holesky/morph-setup/tx-submitter.tar.gz + + +build-bk-test-morph-test-qanet-to-morph-node-qanet: + if [ ! -d dist ]; then mkdir -p dist; fi + cd $(PWD)/node && make build + cp node/build/bin/morphnode dist/ + cp node/build/bin/tendermint dist/ + tar -czvf morph-node.tar.gz dist + aws s3 cp morph-node.tar.gz s3://morph-7637-morph-technical-department-qanet-data/morph-setup/morph-node.tar.gz + +build-bk-test-morph-test-qanet-to-morph-tx-submitter-qanet: + if [ ! -d dist ]; then mkdir -p dist; fi + env GO111MODULE=on CGO_LDFLAGS="-ldl" CGO_ENABLED=1 go build -v $(LDFLAGS) -o tx-submitter/tx-submitter ./tx-submitter/cmd + cp tx-submitter/tx-submitter dist/ + tar -czvf tx-submitter.tar.gz dist + aws s3 cp tx-submitter.tar.gz s3://morph-7637-morph-technical-department-qanet-data/morph-setup/tx-submitter.tar.gz From ee637157d7eb520aae22e8ba247de19000e43563 Mon Sep 17 00:00:00 2001 From: kukoo Date: Wed, 18 Dec 2024 17:06:16 +0800 Subject: [PATCH 13/14] Remove drop messages function (#681) --- .../bin/l1crossdomainmessenger_deployed.hex | 2 +- ...essagequeuewithgaspriceoracle_deployed.hex | 2 +- bindings/bin/rollup_deployed.hex | 2 +- bindings/bindings/l1crossdomainmessenger.go | 231 +++--------------- .../bindings/l1crossdomainmessenger_more.go | 4 +- .../l1messagequeuewithgaspriceoracle.go | 190 +------------- .../l1messagequeuewithgaspriceoracle_more.go | 4 +- bindings/bindings/rollup.go | 2 +- bindings/bindings/rollup_more.go | 2 +- .../contracts/l1/IL1CrossDomainMessenger.sol | 12 - .../contracts/l1/L1CrossDomainMessenger.sol | 59 +---- .../contracts/l1/rollup/IL1MessageQueue.sol | 11 - .../L1MessageQueueWithGasPriceOracle.sol | 19 +- .../test/L1CrossDomainMessenger.t.sol | 65 ----- .../contracts/test/L1CustomERC20Gateway.t.sol | 25 -- .../contracts/test/L1ERC1155Gateway.t.sol | 64 ----- .../contracts/test/L1ERC721Gateway.t.sol | 59 ----- contracts/contracts/test/L1ETHGateway.t.sol | 29 --- contracts/contracts/test/L1MessageQueue.t.sol | 72 ------ .../test/L1StandardERC20Gateway.t.sol | 34 --- contracts/contracts/test/L1WETHGateway.t.sol | 23 -- 21 files changed, 48 insertions(+), 863 deletions(-) diff --git a/bindings/bin/l1crossdomainmessenger_deployed.hex b/bindings/bin/l1crossdomainmessenger_deployed.hex index d7e24332..a401e8da 100644 --- a/bindings/bin/l1crossdomainmessenger_deployed.hex +++ b/bindings/bin/l1crossdomainmessenger_deployed.hex @@ -1 +1 @@ -0x6080604052600436106101a7575f3560e01c806386fa4b73116100e7578063c0c53b8b11610087578063e70fc93b11610062578063e70fc93b146104f9578063ea7ec51414610524578063ecc7042814610550578063f2fde38b14610564575f80fd5b8063c0c53b8b1461049c578063cb23bcb5146104bb578063d87e7df1146104da575f80fd5b8063a14238e7116100c2578063a14238e71461040e578063b2267a7b1461043c578063b604bf4c1461044f578063bedb86fb1461047d575f80fd5b806386fa4b73146103af5780638da5cb5b146103ce578063946130d8146103eb575f80fd5b806355004105116101525780636e296e451161012d5780636e296e45146102de578063715018a6146102fd578063797594b014610311578063846d4d7a14610330575f80fd5b806355004105146102a15780635c975abb146102b45780635f7b1577146102cb575f80fd5b80633b70c18a116101825780633b70c18a1461022c578063407c195514610263578063478222c214610282575f80fd5b806329907acd146101ba5780632a6cccb2146101d9578063340735f7146101f8575f80fd5b366101b6576101b4610583565b005b5f80fd5b3480156101c5575f80fd5b506101b46101d436600461283a565b6105e4565b3480156101e4575f80fd5b506101b46101f33660046128a7565b610966565b348015610203575f80fd5b506102176102123660046128de565b610a2d565b60405190151581526020015b60405180910390f35b348015610237575f80fd5b5060fe5461024b906001600160a01b031681565b6040516001600160a01b039091168152602001610223565b34801561026e575f80fd5b506101b461027d36600461291a565b610af6565b34801561028d575f80fd5b5060cb5461024b906001600160a01b031681565b6101b46102af366004612931565b610bb9565b3480156102bf575f80fd5b5060655460ff16610217565b6101b46102d93660046129c8565b611201565b3480156102e9575f80fd5b5060c95461024b906001600160a01b031681565b348015610308575f80fd5b506101b4611255565b34801561031c575f80fd5b5060ca5461024b906001600160a01b031681565b34801561033b575f80fd5b5061038661034a36600461291a565b6101006020525f90815260409020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b604080516fffffffffffffffffffffffffffffffff938416815292909116602083015201610223565b3480156103ba575f80fd5b506101b46103c9366004612a66565b611266565b3480156103d9575f80fd5b506033546001600160a01b031661024b565b3480156103f6575f80fd5b5061040060ff5481565b604051908152602001610223565b348015610419575f80fd5b5061021761042836600461291a565b60fa6020525f908152604090205460ff1681565b6101b461044a366004612aef565b611732565b34801561045a575f80fd5b5061021761046936600461291a565b60fc6020525f908152604090205460ff1681565b348015610488575f80fd5b506101b4610497366004612b57565b61174d565b3480156104a7575f80fd5b506101b46104b6366004612b72565b61176e565b3480156104c6575f80fd5b5060fd5461024b906001600160a01b031681565b3480156104e5575f80fd5b506101b46104f43660046128a7565b6119d1565b348015610504575f80fd5b5061040061051336600461291a565b60fb6020525f908152604090205481565b34801561052f575f80fd5b5061040061053e36600461291a565b6101016020525f908152604090205481565b34801561055b575f80fd5b50610400611ac7565b34801561056f575f80fd5b506101b461057e3660046128a7565b611b50565b6033546001600160a01b031633146105e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6105ec611bdd565b60c9546001600160a01b031661dead146106485760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105d9565b60fe546001600160a01b03165f6106628787878787611c30565b90505f818051906020012090505f60fb5f8381526020019081526020015f2054116106f55760405162461bcd60e51b815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f717565756564000000000000000000000000000000000000000000000000000060648201526084016105d9565b5f81815260fc602052604090205460ff16156107535760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792064726f7070656400000000000000000060448201526064016105d9565b5f818152610100602052604081205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16908190036107935750845b6040517f91652461000000000000000000000000000000000000000000000000000000008152600481018290526001600160a01b038516906391652461906024015f604051808303815f87803b1580156107eb575f80fd5b505af11580156107fd573d5f803e3d5ffd5b5050505f918252506101016020526040902054801561083d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01610793565b5f82815260fc6020526040808220805460ff191660011790555187917fbd05aabbf548001ebdd6ac80c02f1cfb3b39165f2fae1d420075f22e781ef63b91a260c980547fffffffffffffffffffffffff000000000000000000000000000000000000000016736f297c61b5c92ef107ffd30cd56affe5a273e8411790556040517f14298c510000000000000000000000000000000000000000000000000000000081526001600160a01b038a16906314298c51908990610901908990600401612c1d565b5f604051808303818588803b158015610918575f80fd5b505af115801561092a573d5f803e3d5ffd5b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055505050505050505050505050565b61096e610583565b6001600160a01b0381166109c45760405162461bcd60e51b815260206004820152601d60248201527f6665655661756c742063616e6e6f74206265206164647265737328302900000060448201526064016105d9565b60cb80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f4aadc32827849f797733838c61302f7f56d2b6db28caa175eb3f7f8e5aba25f5905f90a35050565b5f84815b6020811015610aea578085901c600116600103610a9757858160208110610a5a57610a5a612c2f565b602002013582604051602001610a7a929190918252602082015260400190565b604051602081830303815290604052805190602001209150610ae2565b81868260208110610aaa57610aaa612c2f565b6020020135604051602001610ac9929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b600101610a31565b50909114949350505050565b610afe610583565b5f8111610b735760405162461bcd60e51b815260206004820152602360248201527f7265706c61792074696d6573206d75737420626520677265617465722074686160448201527f6e2030000000000000000000000000000000000000000000000000000000000060648201526084016105d9565b60ff80549082905560408051828152602081018490527fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91015b60405180910390a15050565b610bc1611bdd565b60c9546001600160a01b031661dead14610c1d5760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105d9565b60fe5460ca546001600160a01b0391821691165f610c3e8a8a8a8a8a611c30565b90505f818051906020012090505f60fb5f8381526020019081526020015f205411610cd15760405162461bcd60e51b815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f717565756564000000000000000000000000000000000000000000000000000060648201526084016105d9565b5f81815260fc602052604090205460ff1615610d2f5760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792064726f7070656400000000000000000060448201526064016105d9565b6040517f3e4cbbe60000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116600483015263ffffffff881660248301525f9190861690633e4cbbe690604401602060405180830381865afa158015610d9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dbf9190612c5c565b905080341015610e115760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e74206d73672e76616c756520666f7220666565000060448201526064016105d9565b8015610eb95760cb546040515f916001600160a01b03169083908381818185875af1925050503d805f8114610e61576040519150601f19603f3d011682016040523d82523d5f602084013e610e66565b606091505b5050905080610eb75760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f206465647563742074686520666565000000000000000060448201526064016105d9565b505b5f856001600160a01b031663fd0ad31e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1a9190612c5c565b6040517f9b1597820000000000000000000000000000000000000000000000000000000081529091506001600160a01b03871690639b15978290610f669088908c908990600401612c73565b5f604051808303815f87803b158015610f7d575f80fd5b505af1158015610f8f573d5f803e3d5ffd5b5050505f848152610100602090815260408083208151808301909252546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041691810182905292509003610fff575f8281526101016020526040902060018c019055611030565b80602001516001016fffffffffffffffffffffffffffffffff166101015f8481526020019081526020015f20819055505b6fffffffffffffffffffffffffffffffff808316602083015260ff5482519091161061109e5760405162461bcd60e51b815260206004820152601b60248201527f457863656564206d6178696d756d207265706c61792074696d6573000000000060448201526064016105d9565b80516fffffffffffffffffffffffffffffffff600191909101811682525f858152610100602090815260409091208351919093015182167001000000000000000000000000000000000291161790556001600160a01b038c166110fe3390565b6001600160a01b03168b7fa3a1251805b1fc7915884575b42e1fb862e814f0f5c9d670d08bf84697053d618e858d8f60405161113d9493929190612ca9565b60405180910390a4348281039083146111f1575f886001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611199576040519150601f19603f3d011682016040523d82523d5f602084013e61119e565b606091505b50509050806111ef5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20726566756e642074686520666565000000000000000060448201526064016105d9565b505b5050505050505050505050505050565b611209611bdd565b61124d868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250889250879150611ccc9050565b505050505050565b61125d610583565b6105e25f612118565b61126e611bdd565b60c9546001600160a01b031661dead146112ca5760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105d9565b60fe546001600160a01b039081169087160361134e5760405162461bcd60e51b815260206004820152602760248201527f4d657373656e6765723a20466f7262696420746f2063616c6c206d657373616760448201527f652071756575650000000000000000000000000000000000000000000000000060648201526084016105d9565b61135786612181565b60c9546001600160a01b03908116908816036113db5760405162461bcd60e51b815260206004820152602160248201527f4d657373656e6765723a20496e76616c6964206d6573736167652073656e646560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016105d9565b5f6113e98888888888611c30565b80516020918201205f81815260fa90925260409091205490915060ff16156114795760405162461bcd60e51b815260206004820152603060248201527f4d657373656e6765723a207769746864726177616c2068617320616c7265616460448201527f79206265656e2066696e616c697a65640000000000000000000000000000000060648201526084016105d9565b60fd546040517f04d77215000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03909116905f9082906304d7721590602401602060405180830381865afa1580156114dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115019190612cdd565b9050806115765760405162461bcd60e51b815260206004820152602760248201527f4d657373656e6765723a207769746864726177616c526f6f74206e6f7420666960448201527f6e616c697a65640000000000000000000000000000000000000000000000000060648201526084016105d9565b61158283868987610a2d565b6115f45760405162461bcd60e51b815260206004820152602d60248201527f4d657373656e6765723a20696e76616c6964207769746864726177616c20696e60448201527f636c7573696f6e2070726f6f660000000000000000000000000000000000000060648201526084016105d9565b5060c980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038b8116919091179091556040515f918a16908990611642908990612cf8565b5f6040518083038185875af1925050503d805f811461167c576040519150601f19603f3d011682016040523d82523d5f602084013e611681565b606091505b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156116fb575f83815260fa6020526040808220805460ff191660011790555184917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611726565b60405183907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f905f90a25b50505050505050505050565b61173a611bdd565b6117478484848433611ccc565b50505050565b611755610583565b8015611766576117636121d9565b50565b611763612233565b5f54610100900460ff161580801561178c57505f54600160ff909116105b806117a55750303b1580156117a557505f5460ff166001145b6118175760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d9565b5f805460ff191660011790558015611855575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038316158061187257506001600160a01b038216155b8061188457506001600160a01b038416155b156118bb576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118d97353000000000000000000000000000000000000078561226c565b60fd80546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fe805492851692909116919091179055600360ff8190556040517fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91611962915f9190918252602082015260400190565b60405180910390a18015611747575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6119d9610583565b6001600160a01b038116611a555760405162461bcd60e51b815260206004820152602360248201527f726f6c6c757020616464726573732063616e6e6f74206265206164647265737360448201527f283029000000000000000000000000000000000000000000000000000000000060648201526084016105d9565b60fd80546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5272c8ad4bd643b1130291ea29bebd9b3bc583057a6e4d047eb7077039a956309101610bad565b60fe54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290515f926001600160a01b03169163fd0ad31e9160048083019260209291908290030181865afa158015611b27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4b9190612c5c565b905090565b611b58610583565b6001600160a01b038116611bd45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105d9565b61176381612118565b60655460ff16156105e25760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016105d9565b60608585858585604051602401611c4b959493929190612d13565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8ef1332e00000000000000000000000000000000000000000000000000000000179052905095945050505050565b611cd4612384565b60fe5460ca54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290516001600160a01b0393841693909216915f91849163fd0ad31e916004808201926020929091908290030181865afa158015611d40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d649190612c5c565b90505f611d74338a8a858b611c30565b90505f6001600160a01b038516633e4cbbe6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018a9052604401602060405180830381865afa158015611de8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e0c9190612c5c565b9050611e188982612d55565b341015611e675760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e74206d73672e76616c75650000000000000000000060448201526064016105d9565b8015611f0f5760cb546040515f916001600160a01b03169083908381818185875af1925050503d805f8114611eb7576040519150601f19603f3d011682016040523d82523d5f602084013e611ebc565b606091505b5050905080611f0d5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f206465647563742074686520666565000000000000000060448201526064016105d9565b505b6040517f9b1597820000000000000000000000000000000000000000000000000000000081526001600160a01b03861690639b15978290611f589087908b908790600401612d8d565b5f604051808303815f87803b158015611f6f575f80fd5b505af1158015611f81573d5f803e3d5ffd5b505050505f8280519060200120905060fb5f8281526020019081526020015f20545f14611ff05760405162461bcd60e51b815260206004820152601260248201527f4475706c696361746564206d657373616765000000000000000000000000000060448201526064016105d9565b5f81815260fb602052604090204290556001600160a01b038b16336001600160a01b03167f104371f3b442861a2a7b82a070afbbaab748bb13757bf47769e170e37809ec1e8c878c8e6040516120499493929190612db4565b60405180910390a3348290038a8103908b14612100575f886001600160a01b0316826040515f6040518083038185875af1925050503d805f81146120a8576040519150601f19603f3d011682016040523d82523d5f602084013e6120ad565b606091505b50509050806120fe5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20726566756e642074686520666565000000000000000060448201526064016105d9565b505b505050505050506121116001609755565b5050505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b306001600160a01b038216036117635760405162461bcd60e51b815260206004820152601e60248201527f4d657373656e6765723a20466f7262696420746f2063616c6c2073656c66000060448201526064016105d9565b6121e1611bdd565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122163390565b6040516001600160a01b03909116815260200160405180910390a1565b61223b6123e4565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612216565b5f54610100900460ff166122e85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6122f0612436565b6122f86124ba565b61230061253e565b60c980547fffffffffffffffffffffffff000000000000000000000000000000000000000090811661dead1790915560ca80546001600160a01b03858116919093161790558116156123805760cb80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383161790555b5050565b6002609754036123d65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105d9565b6002609755565b6001609755565b60655460ff166105e25760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016105d9565b5f54610100900460ff166124b25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6105e26125c2565b5f54610100900460ff166125365760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6105e2612647565b5f54610100900460ff166125ba5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6105e26126cf565b5f54610100900460ff1661263e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6105e233612118565b5f54610100900460ff166126c35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6065805460ff19169055565b5f54610100900460ff166123dd5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b80356001600160a01b0381168114612761575f80fd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126127a2575f80fd5b813567ffffffffffffffff808211156127bd576127bd612766565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561280357612803612766565b8160405283815286602085880101111561281b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f60a0868803121561284e575f80fd5b6128578661274b565b94506128656020870161274b565b93506040860135925060608601359150608086013567ffffffffffffffff81111561288e575f80fd5b61289a88828901612793565b9150509295509295909350565b5f602082840312156128b7575f80fd5b6128c08261274b565b9392505050565b8061040081018310156128d8575f80fd5b92915050565b5f805f8061046085870312156128f2575f80fd5b8435935061290386602087016128c7565b939693955050505061042082013591610440013590565b5f6020828403121561292a575f80fd5b5035919050565b5f805f805f805f60e0888a031215612947575f80fd5b6129508861274b565b965061295e6020890161274b565b95506040880135945060608801359350608088013567ffffffffffffffff811115612987575f80fd5b6129938a828b01612793565b93505060a088013563ffffffff811681146129ac575f80fd5b91506129ba60c0890161274b565b905092959891949750929550565b5f805f805f8060a087890312156129dd575f80fd5b6129e68761274b565b955060208701359450604087013567ffffffffffffffff80821115612a09575f80fd5b818901915089601f830112612a1c575f80fd5b813581811115612a2a575f80fd5b8a6020828501011115612a3b575f80fd5b60208301965080955050505060608701359150612a5a6080880161274b565b90509295509295509295565b5f805f805f805f6104c0888a031215612a7d575f80fd5b612a868861274b565b9650612a946020890161274b565b95506040880135945060608801359350608088013567ffffffffffffffff811115612abd575f80fd5b612ac98a828b01612793565b935050612ad98960a08a016128c7565b91506104a0880135905092959891949750929550565b5f805f8060808587031215612b02575f80fd5b612b0b8561274b565b935060208501359250604085013567ffffffffffffffff811115612b2d575f80fd5b612b3987828801612793565b949793965093946060013593505050565b8015158114611763575f80fd5b5f60208284031215612b67575f80fd5b81356128c081612b4a565b5f805f60608486031215612b84575f80fd5b612b8d8461274b565b9250612b9b6020850161274b565b9150612ba96040850161274b565b90509250925092565b5f5b83811015612bcc578181015183820152602001612bb4565b50505f910152565b5f8151808452612beb816020860160208601612bb2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6128c06020830184612bd4565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612c6c575f80fd5b5051919050565b6001600160a01b038416815263ffffffff83166020820152606060408201525f612ca06060830184612bd4565b95945050505050565b84815283602082015263ffffffff83166040820152608060608201525f612cd36080830184612bd4565b9695505050505050565b5f60208284031215612ced575f80fd5b81516128c081612b4a565b5f8251612d09818460208701612bb2565b9190910192915050565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152612d4a60a0830184612bd4565b979650505050505050565b808201808211156128d8577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6001600160a01b0384168152826020820152606060408201525f612ca06060830184612bd4565b848152836020820152826040820152608060608201525f612cd36080830184612bd456fea164736f6c6343000818000a +0x60806040526004361061019c575f3560e01c806386fa4b73116100dc578063c0c53b8b11610087578063e70fc93b11610062578063e70fc93b146104cf578063ea7ec514146104fa578063ecc7042814610526578063f2fde38b1461053a575f80fd5b8063c0c53b8b14610472578063cb23bcb514610491578063d87e7df1146104b0575f80fd5b8063a14238e7116100b7578063a14238e714610412578063b2267a7b14610440578063bedb86fb14610453575f80fd5b806386fa4b73146103b35780638da5cb5b146103d2578063946130d8146103ef575f80fd5b806355004105116101475780636e296e45116101225780636e296e45146102e2578063715018a614610301578063797594b014610315578063846d4d7a14610334575f80fd5b806355004105146102a55780635c975abb146102b85780635f7b1577146102cf575f80fd5b80633b70c18a116101775780633b70c18a14610230578063407c195514610267578063478222c214610286575f80fd5b806305804dd7146101af5780632a6cccb2146101f2578063340735f714610211575f80fd5b366101ab576101a9610559565b005b5f80fd5b3480156101ba575f80fd5b506101dd6101c9366004612435565b60fc6020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156101fd575f80fd5b506101a961020c366004612467565b6105ba565b34801561021c575f80fd5b506101dd61022b36600461249e565b610681565b34801561023b575f80fd5b5060fe5461024f906001600160a01b031681565b6040516001600160a01b0390911681526020016101e9565b348015610272575f80fd5b506101a9610281366004612435565b61074a565b348015610291575f80fd5b5060cb5461024f906001600160a01b031681565b6101a96102b33660046125ae565b61080d565b3480156102c3575f80fd5b5060655460ff166101dd565b6101a96102dd366004612645565b610e55565b3480156102ed575f80fd5b5060c95461024f906001600160a01b031681565b34801561030c575f80fd5b506101a9610ea9565b348015610320575f80fd5b5060ca5461024f906001600160a01b031681565b34801561033f575f80fd5b5061038a61034e366004612435565b6101006020525f90815260409020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b604080516fffffffffffffffffffffffffffffffff9384168152929091166020830152016101e9565b3480156103be575f80fd5b506101a96103cd3660046126e3565b610eba565b3480156103dd575f80fd5b506033546001600160a01b031661024f565b3480156103fa575f80fd5b5061040460ff5481565b6040519081526020016101e9565b34801561041d575f80fd5b506101dd61042c366004612435565b60fa6020525f908152604090205460ff1681565b6101a961044e36600461276c565b6113a4565b34801561045e575f80fd5b506101a961046d3660046127d4565b6113bf565b34801561047d575f80fd5b506101a961048c3660046127ef565b6113e0565b34801561049c575f80fd5b5060fd5461024f906001600160a01b031681565b3480156104bb575f80fd5b506101a96104ca366004612467565b611661565b3480156104da575f80fd5b506104046104e9366004612435565b60fb6020525f908152604090205481565b348015610505575f80fd5b50610404610514366004612435565b6101016020525f908152604090205481565b348015610531575f80fd5b50610404611757565b348015610545575f80fd5b506101a9610554366004612467565b6117e0565b6033546001600160a01b031633146105b85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6105c2610559565b6001600160a01b0381166106185760405162461bcd60e51b815260206004820152601d60248201527f6665655661756c742063616e6e6f74206265206164647265737328302900000060448201526064016105af565b60cb80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f4aadc32827849f797733838c61302f7f56d2b6db28caa175eb3f7f8e5aba25f5905f90a35050565b5f84815b602081101561073e578085901c6001166001036106eb578581602081106106ae576106ae61282f565b6020020135826040516020016106ce929190918252602082015260400190565b604051602081830303815290604052805190602001209150610736565b818682602081106106fe576106fe61282f565b602002013560405160200161071d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b600101610685565b50909114949350505050565b610752610559565b5f81116107c75760405162461bcd60e51b815260206004820152602360248201527f7265706c61792074696d6573206d75737420626520677265617465722074686160448201527f6e2030000000000000000000000000000000000000000000000000000000000060648201526084016105af565b60ff80549082905560408051828152602081018490527fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91015b60405180910390a15050565b61081561186d565b60c9546001600160a01b031661dead146108715760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105af565b60fe5460ca546001600160a01b0391821691165f6108928a8a8a8a8a6118c0565b90505f818051906020012090505f60fb5f8381526020019081526020015f2054116109255760405162461bcd60e51b815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f717565756564000000000000000000000000000000000000000000000000000060648201526084016105af565b5f81815260fc602052604090205460ff16156109835760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792064726f7070656400000000000000000060448201526064016105af565b6040517f3e4cbbe60000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116600483015263ffffffff881660248301525f9190861690633e4cbbe690604401602060405180830381865afa1580156109ef573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a13919061285c565b905080341015610a655760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e74206d73672e76616c756520666f7220666565000060448201526064016105af565b8015610b0d5760cb546040515f916001600160a01b03169083908381818185875af1925050503d805f8114610ab5576040519150601f19603f3d011682016040523d82523d5f602084013e610aba565b606091505b5050905080610b0b5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f206465647563742074686520666565000000000000000060448201526064016105af565b505b5f856001600160a01b031663fd0ad31e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6e919061285c565b6040517f9b1597820000000000000000000000000000000000000000000000000000000081529091506001600160a01b03871690639b15978290610bba9088908c9089906004016128de565b5f604051808303815f87803b158015610bd1575f80fd5b505af1158015610be3573d5f803e3d5ffd5b5050505f848152610100602090815260408083208151808301909252546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041691810182905292509003610c53575f8281526101016020526040902060018c019055610c84565b80602001516001016fffffffffffffffffffffffffffffffff166101015f8481526020019081526020015f20819055505b6fffffffffffffffffffffffffffffffff808316602083015260ff54825190911610610cf25760405162461bcd60e51b815260206004820152601b60248201527f457863656564206d6178696d756d207265706c61792074696d6573000000000060448201526064016105af565b80516fffffffffffffffffffffffffffffffff600191909101811682525f858152610100602090815260409091208351919093015182167001000000000000000000000000000000000291161790556001600160a01b038c16610d523390565b6001600160a01b03168b7fa3a1251805b1fc7915884575b42e1fb862e814f0f5c9d670d08bf84697053d618e858d8f604051610d919493929190612914565b60405180910390a434828103908314610e45575f886001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610ded576040519150601f19603f3d011682016040523d82523d5f602084013e610df2565b606091505b5050905080610e435760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20726566756e642074686520666565000000000000000060448201526064016105af565b505b5050505050505050505050505050565b610e5d61186d565b610ea1868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525088925087915061195c9050565b505050505050565b610eb1610559565b6105b85f611da8565b610ec261186d565b60c9546001600160a01b031661dead14610f1e5760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105af565b60fe546001600160a01b0390811690871603610fa25760405162461bcd60e51b815260206004820152602760248201527f4d657373656e6765723a20466f7262696420746f2063616c6c206d657373616760448201527f652071756575650000000000000000000000000000000000000000000000000060648201526084016105af565b610fab86611e11565b60c9546001600160a01b039081169088160361102f5760405162461bcd60e51b815260206004820152602160248201527f4d657373656e6765723a20496e76616c6964206d6573736167652073656e646560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016105af565b5f61103d88888888886118c0565b80516020918201205f81815260fa90925260409091205490915060ff16156110cd5760405162461bcd60e51b815260206004820152603060248201527f4d657373656e6765723a207769746864726177616c2068617320616c7265616460448201527f79206265656e2066696e616c697a65640000000000000000000000000000000060648201526084016105af565b60fd546040517f04d77215000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03909116905f9082906304d7721590602401602060405180830381865afa158015611131573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111559190612948565b9050806111ca5760405162461bcd60e51b815260206004820152602760248201527f4d657373656e6765723a207769746864726177616c526f6f74206e6f7420666960448201527f6e616c697a65640000000000000000000000000000000000000000000000000060648201526084016105af565b6111d683868987610681565b6112485760405162461bcd60e51b815260206004820152602d60248201527f4d657373656e6765723a20696e76616c6964207769746864726177616c20696e60448201527f636c7573696f6e2070726f6f660000000000000000000000000000000000000060648201526084016105af565b5060c980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038b8116919091179091556040515f918a16908990611296908990612963565b5f6040518083038185875af1925050503d805f81146112d0576040519150601f19603f3d011682016040523d82523d5f602084013e6112d5565b606091505b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561136d575f83815260fa602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555184917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611398565b60405183907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f905f90a25b50505050505050505050565b6113ac61186d565b6113b9848484843361195c565b50505050565b6113c7610559565b80156113d8576113d5611e69565b50565b6113d5611ee1565b5f54610100900460ff16158080156113fe57505f54600160ff909116105b806114175750303b15801561141757505f5460ff166001145b6114895760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105af565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156114e5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038316158061150257506001600160a01b038216155b8061151457506001600160a01b038416155b1561154b576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61156973530000000000000000000000000000000000000785611f38565b60fd80546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fe805492851692909116919091179055600360ff8190556040517fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b916115f2915f9190918252602082015260400190565b60405180910390a180156113b9575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b611669610559565b6001600160a01b0381166116e55760405162461bcd60e51b815260206004820152602360248201527f726f6c6c757020616464726573732063616e6e6f74206265206164647265737360448201527f283029000000000000000000000000000000000000000000000000000000000060648201526084016105af565b60fd80546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5272c8ad4bd643b1130291ea29bebd9b3bc583057a6e4d047eb7077039a956309101610801565b60fe54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290515f926001600160a01b03169163fd0ad31e9160048083019260209291908290030181865afa1580156117b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117db919061285c565b905090565b6117e8610559565b6001600160a01b0381166118645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105af565b6113d581611da8565b60655460ff16156105b85760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016105af565b606085858585856040516024016118db95949392919061297e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8ef1332e00000000000000000000000000000000000000000000000000000000179052905095945050505050565b611964612050565b60fe5460ca54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290516001600160a01b0393841693909216915f91849163fd0ad31e916004808201926020929091908290030181865afa1580156119d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119f4919061285c565b90505f611a04338a8a858b6118c0565b90505f6001600160a01b038516633e4cbbe6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018a9052604401602060405180830381865afa158015611a78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a9c919061285c565b9050611aa889826129c0565b341015611af75760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e74206d73672e76616c75650000000000000000000060448201526064016105af565b8015611b9f5760cb546040515f916001600160a01b03169083908381818185875af1925050503d805f8114611b47576040519150601f19603f3d011682016040523d82523d5f602084013e611b4c565b606091505b5050905080611b9d5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f206465647563742074686520666565000000000000000060448201526064016105af565b505b6040517f9b1597820000000000000000000000000000000000000000000000000000000081526001600160a01b03861690639b15978290611be89087908b9087906004016129f8565b5f604051808303815f87803b158015611bff575f80fd5b505af1158015611c11573d5f803e3d5ffd5b505050505f8280519060200120905060fb5f8281526020019081526020015f20545f14611c805760405162461bcd60e51b815260206004820152601260248201527f4475706c696361746564206d657373616765000000000000000000000000000060448201526064016105af565b5f81815260fb602052604090204290556001600160a01b038b16336001600160a01b03167f104371f3b442861a2a7b82a070afbbaab748bb13757bf47769e170e37809ec1e8c878c8e604051611cd99493929190612a1f565b60405180910390a3348290038a8103908b14611d90575f886001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611d38576040519150601f19603f3d011682016040523d82523d5f602084013e611d3d565b606091505b5050905080611d8e5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20726566756e642074686520666565000000000000000060448201526064016105af565b505b50505050505050611da16001609755565b5050505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b306001600160a01b038216036113d55760405162461bcd60e51b815260206004820152601e60248201527f4d657373656e6765723a20466f7262696420746f2063616c6c2073656c66000060448201526064016105af565b611e7161186d565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ec43390565b6040516001600160a01b03909116815260200160405180910390a1565b611ee96120b0565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611ec4565b5f54610100900460ff16611fb45760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b611fbc612102565b611fc4612186565b611fcc61220a565b60c980547fffffffffffffffffffffffff000000000000000000000000000000000000000090811661dead1790915560ca80546001600160a01b038581169190931617905581161561204c5760cb80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383161790555b5050565b6002609754036120a25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105af565b6002609755565b6001609755565b60655460ff166105b85760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016105af565b5f54610100900460ff1661217e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b6105b861228e565b5f54610100900460ff166122025760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b6105b8612313565b5f54610100900460ff166122865760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b6105b86123b9565b5f54610100900460ff1661230a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b6105b833611da8565b5f54610100900460ff1661238f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff166120a95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b5f60208284031215612445575f80fd5b5035919050565b80356001600160a01b0381168114612462575f80fd5b919050565b5f60208284031215612477575f80fd5b6124808261244c565b9392505050565b806104008101831015612498575f80fd5b92915050565b5f805f8061046085870312156124b2575f80fd5b843593506124c38660208701612487565b939693955050505061042082013591610440013590565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112612516575f80fd5b813567ffffffffffffffff80821115612531576125316124da565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612577576125776124da565b8160405283815286602085880101111561258f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a0312156125c4575f80fd5b6125cd8861244c565b96506125db6020890161244c565b95506040880135945060608801359350608088013567ffffffffffffffff811115612604575f80fd5b6126108a828b01612507565b93505060a088013563ffffffff81168114612629575f80fd5b915061263760c0890161244c565b905092959891949750929550565b5f805f805f8060a0878903121561265a575f80fd5b6126638761244c565b955060208701359450604087013567ffffffffffffffff80821115612686575f80fd5b818901915089601f830112612699575f80fd5b8135818111156126a7575f80fd5b8a60208285010111156126b8575f80fd5b602083019650809550505050606087013591506126d76080880161244c565b90509295509295509295565b5f805f805f805f6104c0888a0312156126fa575f80fd5b6127038861244c565b96506127116020890161244c565b95506040880135945060608801359350608088013567ffffffffffffffff81111561273a575f80fd5b6127468a828b01612507565b9350506127568960a08a01612487565b91506104a0880135905092959891949750929550565b5f805f806080858703121561277f575f80fd5b6127888561244c565b935060208501359250604085013567ffffffffffffffff8111156127aa575f80fd5b6127b687828801612507565b949793965093946060013593505050565b80151581146113d5575f80fd5b5f602082840312156127e4575f80fd5b8135612480816127c7565b5f805f60608486031215612801575f80fd5b61280a8461244c565b92506128186020850161244c565b91506128266040850161244c565b90509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6020828403121561286c575f80fd5b5051919050565b5f5b8381101561288d578181015183820152602001612875565b50505f910152565b5f81518084526128ac816020860160208601612873565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6001600160a01b038416815263ffffffff83166020820152606060408201525f61290b6060830184612895565b95945050505050565b84815283602082015263ffffffff83166040820152608060608201525f61293e6080830184612895565b9695505050505050565b5f60208284031215612958575f80fd5b8151612480816127c7565b5f8251612974818460208701612873565b9190910192915050565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a060808301526129b560a0830184612895565b979650505050505050565b80820180821115612498577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6001600160a01b0384168152826020820152606060408201525f61290b6060830184612895565b848152836020820152826040820152608060608201525f61293e608083018461289556fea164736f6c6343000818000a diff --git a/bindings/bin/l1messagequeuewithgaspriceoracle_deployed.hex b/bindings/bin/l1messagequeuewithgaspriceoracle_deployed.hex index 704b6231..a0cd87ec 100644 --- a/bindings/bin/l1messagequeuewithgaspriceoracle_deployed.hex +++ b/bindings/bin/l1messagequeuewithgaspriceoracle_deployed.hex @@ -1 +1 @@ -0x608060405234801561000f575f80fd5b506004361061019a575f3560e01c80639b159782116100e8578063d5ad4a9711610093578063e172d3a11161006e578063e172d3a1146103ac578063e3176bd5146103c6578063f2fde38b146103cf578063fd0ad31e146103e2575f80fd5b8063d5ad4a9714610373578063d99bc80e14610386578063da35a26f14610399575f80fd5b8063bb7862ca116100c3578063bb7862ca14610319578063bdc6f0a014610339578063c27606771461034c575f80fd5b80639b159782146102ea578063a85006ca146102fd578063ae453cd514610306575f80fd5b80635f9cd92e116101485780638da5cb5b116101235780638da5cb5b1461029257806391652461146102b0578063927ede2d146102c3575f80fd5b80635f9cd92e1461022b578063715018a61461023e5780638770d70714610246575f80fd5b80633e6dada1116101785780633e6dada1146101ec5780635ad9945a1461020f5780635e45da2314610222575f80fd5b806329aa604b1461019e5780633c7f5283146101c45780633e4cbbe6146101d9575b5f80fd5b6101b16101ac366004611399565b6103ea565b6040519081526020015b60405180910390f35b6101d76101d23660046113b0565b610409565b005b6101b16101e73660046113f3565b61057a565b6101ff6101fa366004611399565b61062e565b60405190151581526020016101bb565b6101b161021d366004611460565b610650565b6101b160685481565b6101d76102393660046114dc565b610840565b6101d76108d5565b61026d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bb565b60335473ffffffffffffffffffffffffffffffffffffffff1661026d565b6101d76102be366004611399565b6108e8565b61026d7f000000000000000000000000000000000000000000000000000000000000000081565b6101d76102f83660046114f5565b610aa0565b6101b160675481565b6101b1610314366004611399565b610b82565b606b5461026d9073ffffffffffffffffffffffffffffffffffffffff1681565b6101d761034736600461154b565b610bf8565b61026d7f000000000000000000000000000000000000000000000000000000000000000081565b6101d7610381366004611399565b610d29565b6101d7610394366004611399565b610d6f565b6101d76103a73660046115be565b610db5565b6101b16103ba3660046115e8565b60100261520801919050565b6101b160655481565b6101d76103dd3660046114dc565b610f6e565b6066546101b1565b606681815481106103f9575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146104935760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008111156104e55760405162461bcd60e51b815260206004820152601560248201527f706f7020746f6f206d616e79206d657373616765730000000000000000000000604482015260640161048a565b81606754146105365760405162461bcd60e51b815260206004820152601460248201527f737461727420696e646578206d69736d61746368000000000000000000000000604482015260640161048a565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa1580156105e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060c9190611627565b1561061857505f610628565b606554610625908361164d565b90505b92915050565b600881901c5f90815260696020526040812054600160ff84161b161515610628565b5f607e816106fa565b5f8161066757506001919050565b5b811561067d5760089190911c90600101610668565b919050565b8060808310600181146106ba5761069884610659565b60808101835360018301925084816020036008021b83528083019250506106db565b84841516600181146106ce578483536106d3565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b6005604051018061070d60018c83610682565b905061071b60018983610682565b905061072789826106e3565b905061073560018b83610682565b9050600186146001811461079d5760388710600181146107825761075888610659565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610797565b87608001835360018301925087898437918701915b506107ae565b6107ab5f89355f1a84610682565b91505b506107b98c826106e3565b90508181035f8060388310600181146107ec576107d584610659565b60f78101600882021b8517935060010191506107f7565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b61084861100b565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108dd61100b565b6108e65f611072565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146109935760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e676572000000000000000000000000000000000000000000606482015260840161048a565b60675481106109e45760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742064726f702070656e64696e67206d6573736167650000000000604482015260640161048a565b600881901c5f90815260696020526040902054600160ff83161b1615610a4c5760405162461bcd60e51b815260206004820152601760248201527f6d65737361676520616c72656164792064726f70706564000000000000000000604482015260640161048a565b600881901c5f9081526069602052604090208054600160ff84161b1790556040518181527f43a375005206d20a83abc71722cba68c24434a8dc1f583775be7c3fde0396cbf9060200160405180910390a150565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610b4b5760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e676572000000000000000000000000000000000000000000606482015260840161048a565b610b568383836110e8565b3373111100000000000000000000000000000000111101610b7b81865f8787876111e4565b5050505050565b6066545f908210610bd55760405162461bcd60e51b815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e6765000000000000604482015260640161048a565b60668281548110610be857610be8611689565b905f5260205f2001549050919050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610ca35760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f6174657761790000000000000000000000000000000000000000000000000000606482015260840161048a565b73ffffffffffffffffffffffffffffffffffffffff86163b15610d085760405162461bcd60e51b815260206004820152600860248201527f6f6e6c7920454f41000000000000000000000000000000000000000000000000604482015260640161048a565b610d138383836110e8565b610d218686868686866111e4565b505050505050565b610d3161100b565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c5910161056e565b610d7761100b565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead366329910161056e565b5f54610100900460ff1615808015610dd357505f54600160ff909116105b80610dec5750303b158015610dec57505f5460ff166001145b610e5e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161048a565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610eba575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610ec2611295565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610f69575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610f7661100b565b73ffffffffffffffffffffffffffffffffffffffff8116610fff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161048a565b61100881611072565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108e65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048a565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6068548311156111605760405162461bcd60e51b815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d6974000000000000000000000000000000000000000000000000000000606482015260840161048a565b6010810261520801808410156111de5760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e7369632067617300000000000000000000000000606482015260840161048a565b50505050565b6066545f6111f78883888a898989610650565b606680546001810182555f919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540181905560405190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e90611283908a9087908b908b908b906116b6565b60405180910390a35050505050505050565b5f54610100900460ff166113115760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161048a565b6108e65f54610100900460ff166113905760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161048a565b6108e633611072565b5f602082840312156113a9575f80fd5b5035919050565b5f80604083850312156113c1575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff8116811461067d575f80fd5b5f8060408385031215611404575f80fd5b61140d836113d0565b946020939093013593505050565b5f8083601f84011261142b575f80fd5b50813567ffffffffffffffff811115611442575f80fd5b602083019150836020828501011115611459575f80fd5b9250929050565b5f805f805f805f60c0888a031215611476575f80fd5b61147f886113d0565b9650602088013595506040880135945061149b606089016113d0565b93506080880135925060a088013567ffffffffffffffff8111156114bd575f80fd5b6114c98a828b0161141b565b989b979a50959850939692959293505050565b5f602082840312156114ec575f80fd5b610625826113d0565b5f805f8060608587031215611508575f80fd5b611511856113d0565b935060208501359250604085013567ffffffffffffffff811115611533575f80fd5b61153f8782880161141b565b95989497509550505050565b5f805f805f8060a08789031215611560575f80fd5b611569876113d0565b9550611577602088016113d0565b94506040870135935060608701359250608087013567ffffffffffffffff8111156115a0575f80fd5b6115ac89828a0161141b565b979a9699509497509295939492505050565b5f80604083850312156115cf575f80fd5b823591506115df602084016113d0565b90509250929050565b5f80602083850312156115f9575f80fd5b823567ffffffffffffffff81111561160f575f80fd5b61161b8582860161141b565b90969095509350505050565b5f60208284031215611637575f80fd5b81518015158114611646575f80fd5b9392505050565b8082028115828204841417610628577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a +0x608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063a85006ca116100dd578063d99bc80e11610088578063e3176bd511610063578063e3176bd51461037a578063f2fde38b14610383578063fd0ad31e14610396575f80fd5b8063d99bc80e1461033a578063da35a26f1461034d578063e172d3a114610360575f80fd5b8063bdc6f0a0116100b8578063bdc6f0a0146102ed578063c276067714610300578063d5ad4a9714610327575f80fd5b8063a85006ca146102b1578063ae453cd5146102ba578063bb7862ca146102cd575f80fd5b80635f9cd92e1161013d5780638da5cb5b116101185780638da5cb5b14610259578063927ede2d146102775780639b1597821461029e575f80fd5b80635f9cd92e146101f2578063715018a6146102055780638770d7071461020d575f80fd5b80633e4cbbe61161016d5780633e4cbbe6146101c35780635ad9945a146101d65780635e45da23146101e9575f80fd5b806329aa604b146101885780633c7f5283146101ae575b5f80fd5b61019b610196366004611173565b61039e565b6040519081526020015b60405180910390f35b6101c16101bc36600461118a565b6103bd565b005b61019b6101d13660046111cd565b61052e565b61019b6101e436600461123a565b6105e2565b61019b60685481565b6101c16102003660046112b6565b6107d2565b6101c1610867565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a5565b60335473ffffffffffffffffffffffffffffffffffffffff16610234565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c16102ac3660046112cf565b61087a565b61019b60675481565b61019b6102c8366004611173565b61095c565b606b546102349073ffffffffffffffffffffffffffffffffffffffff1681565b6101c16102fb366004611325565b6109d2565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c1610335366004611173565b610b03565b6101c1610348366004611173565b610b49565b6101c161035b366004611398565b610b8f565b61019b61036e3660046113c2565b60100261520801919050565b61019b60655481565b6101c16103913660046112b6565b610d48565b60665461019b565b606681815481106103ad575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146104475760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008111156104995760405162461bcd60e51b815260206004820152601560248201527f706f7020746f6f206d616e79206d657373616765730000000000000000000000604482015260640161043e565b81606754146104ea5760405162461bcd60e51b815260206004820152601460248201527f737461727420696e646578206d69736d61746368000000000000000000000000604482015260640161043e565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa15801561059c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c09190611401565b156105cc57505f6105dc565b6065546105d99083611427565b90505b92915050565b5f607e8161068c565b5f816105f957506001919050565b5b811561060f5760089190911c906001016105fa565b919050565b80608083106001811461064c5761062a846105eb565b60808101835360018301925084816020036008021b835280830192505061066d565b848415166001811461066057848353610665565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b6005604051018061069f60018c83610614565b90506106ad60018983610614565b90506106b98982610675565b90506106c760018b83610614565b9050600186146001811461072f576038871060018114610714576106ea886105eb565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610729565b87608001835360018301925087898437918701915b50610740565b61073d5f89355f1a84610614565b91505b5061074b8c82610675565b90508181035f80603883106001811461077e57610767846105eb565b60f78101600882021b851793506001019150610789565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b6107da610de5565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61086f610de5565b6108785f610e4c565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146109255760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e676572000000000000000000000000000000000000000000606482015260840161043e565b610930838383610ec2565b337311110000000000000000000000000000000011110161095581865f878787610fbe565b5050505050565b6066545f9082106109af5760405162461bcd60e51b815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e6765000000000000604482015260640161043e565b606682815481106109c2576109c2611463565b905f5260205f2001549050919050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610a7d5760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f6174657761790000000000000000000000000000000000000000000000000000606482015260840161043e565b73ffffffffffffffffffffffffffffffffffffffff86163b15610ae25760405162461bcd60e51b815260206004820152600860248201527f6f6e6c7920454f41000000000000000000000000000000000000000000000000604482015260640161043e565b610aed838383610ec2565b610afb868686868686610fbe565b505050505050565b610b0b610de5565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c59101610522565b610b51610de5565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610522565b5f54610100900460ff1615808015610bad57505f54600160ff909116105b80610bc65750303b158015610bc657505f5460ff166001145b610c385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161043e565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c94575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610c9c61106f565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610d43575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610d50610de5565b73ffffffffffffffffffffffffffffffffffffffff8116610dd95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161043e565b610de281610e4c565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161043e565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115610f3a5760405162461bcd60e51b815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d6974000000000000000000000000000000000000000000000000000000606482015260840161043e565b601081026152080180841015610fb85760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e7369632067617300000000000000000000000000606482015260840161043e565b50505050565b6066545f610fd18883888a8989896105e2565b606680546001810182555f919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540181905560405190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e9061105d908a9087908b908b908b90611490565b60405180910390a35050505050505050565b5f54610100900460ff166110eb5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161043e565b6108785f54610100900460ff1661116a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161043e565b61087833610e4c565b5f60208284031215611183575f80fd5b5035919050565b5f806040838503121561119b575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff8116811461060f575f80fd5b5f80604083850312156111de575f80fd5b6111e7836111aa565b946020939093013593505050565b5f8083601f840112611205575f80fd5b50813567ffffffffffffffff81111561121c575f80fd5b602083019150836020828501011115611233575f80fd5b9250929050565b5f805f805f805f60c0888a031215611250575f80fd5b611259886111aa565b96506020880135955060408801359450611275606089016111aa565b93506080880135925060a088013567ffffffffffffffff811115611297575f80fd5b6112a38a828b016111f5565b989b979a50959850939692959293505050565b5f602082840312156112c6575f80fd5b6105d9826111aa565b5f805f80606085870312156112e2575f80fd5b6112eb856111aa565b935060208501359250604085013567ffffffffffffffff81111561130d575f80fd5b611319878288016111f5565b95989497509550505050565b5f805f805f8060a0878903121561133a575f80fd5b611343876111aa565b9550611351602088016111aa565b94506040870135935060608701359250608087013567ffffffffffffffff81111561137a575f80fd5b61138689828a016111f5565b979a9699509497509295939492505050565b5f80604083850312156113a9575f80fd5b823591506113b9602084016111aa565b90509250929050565b5f80602083850312156113d3575f80fd5b823567ffffffffffffffff8111156113e9575f80fd5b6113f5858286016111f5565b90969095509350505050565b5f60208284031215611411575f80fd5b81518015158114611420575f80fd5b9392505050565b80820281158282048414176105dc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a diff --git a/bindings/bin/rollup_deployed.hex b/bindings/bin/rollup_deployed.hex index 9f980dea..b2301145 100644 --- a/bindings/bin/rollup_deployed.hex +++ b/bindings/bin/rollup_deployed.hex @@ -1 +1 @@ -0x608060405260043610610306575f3560e01c8063728cdbca11610191578063b35dac4e116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd146109b1578063f2fde38b146109d0578063fb1e8b04146109ef575f80fd5b8063ddd8a3dc1461095e578063de8b30351461097d578063dff7827e1461099c575f80fd5b8063cd4edc69116100b7578063cd4edc6914610917578063ce5db8d61461092a578063d279c1911461093f575f80fd5b8063b35dac4e146108ba578063b3e0a509146108d9578063bedb86fb146108f8575f80fd5b8063a415d8dc1161013c578063abc8d68d11610117578063abc8d68d1461085b578063b31a77d314610886578063b34844251461089b575f80fd5b8063a415d8dc146107f9578063a479265d14610827578063a4f209b01461083c575f80fd5b80638f1d37761161016c5780638f1d3776146106f9578063910129d4146107a957806397fc007c146107da575f80fd5b8063728cdbca146106a457806388b1ea09146106c35780638da5cb5b146106dc575f80fd5b80632b7ac3f3116102515780635ef7a94a116101fc57806368589dfa116101d757806368589dfa146106465780636c578c1d14610671578063715018a614610690575f80fd5b80635ef7a94a1461057b5780635f77cf1d146105db5780636126729014610627575f80fd5b80634a8d544f1161022c5780634a8d544f1461053257806357e0af6c146105455780635c975abb14610564575f80fd5b80632b7ac3f3146104c75780633b70c18a146104fe5780633e001b661461051d575f80fd5b806313361101116102b157806321e2f9e01161028c57806321e2f9e0146104525780632362f03e146104715780632571098d1461049c575f80fd5b806313361101146103ee57806318463fb01461040d57806318af3b2b14610422575f80fd5b806310d44583116102e157806310d4458314610398578063116a1f42146103b7578063121dcd50146103d9575f80fd5b806304d7721514610311578063059def61146103545780630ceb678014610377575f80fd5b3661030d57005b5f80fd5b34801561031c575f80fd5b5061033f61032b3660046140a5565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561035f575f80fd5b50610369609d5481565b60405190815260200161034b565b348015610382575f80fd5b506103966103913660046140d7565b610a04565b005b3480156103a3575f80fd5b506103966103b2366004614135565b610ad6565b3480156103c2575f80fd5b5061033f6103d13660046140a5565b609d54101590565b3480156103e4575f80fd5b50610369609e5481565b3480156103f9575f80fd5b5061039661040836600461417d565b610e2f565b348015610418575f80fd5b5061036960a75481565b34801561042d575f80fd5b5061033f61043c3660046140a5565b5f90815260a26020526040902060010154421090565b34801561045d575f80fd5b5061033f61046c3660046140a5565b611326565b34801561047c575f80fd5b5061036961048b3660046140a5565b60a16020525f908152604090205481565b3480156104a7575f80fd5b506103696104b63660046140a5565b60a06020525f908152604090205481565b3480156104d2575f80fd5b50609c546104e6906001600160a01b031681565b6040516001600160a01b03909116815260200161034b565b348015610509575f80fd5b50609b546104e6906001600160a01b031681565b348015610528575f80fd5b5061036960aa5481565b6103966105403660046141bc565b611354565b348015610550575f80fd5b5061039661055f3660046140a5565b611bd7565b34801561056f575f80fd5b5060655460ff1661033f565b348015610586575f80fd5b506105bb6105953660046140a5565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161034b565b3480156105e6575f80fd5b5061060e7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161034b565b348015610632575f80fd5b506103966106413660046140a5565b611c82565b348015610651575f80fd5b506103696106603660046140a5565b60ab6020525f908152604090205481565b34801561067c575f80fd5b5061039661068b3660046140d7565b611e97565b34801561069b575f80fd5b50610396611f54565b3480156106af575f80fd5b506103966106be366004614229565b611f67565b3480156106ce575f80fd5b5060a65461033f9060ff1681565b3480156106e7575f80fd5b506033546001600160a01b03166104e6565b348015610704575f80fd5b506107656107133660046140a5565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c00161034b565b3480156107b4575f80fd5b5061033f6107c33660046140a5565b5f90815260a4602052604090206003015460ff1690565b3480156107e5575f80fd5b506103966107f43660046140d7565b6122aa565b348015610804575f80fd5b5061033f6108133660046140d7565b609f6020525f908152604090205460ff1681565b348015610832575f80fd5b5061036960995481565b348015610847575f80fd5b506103966108563660046140a5565b61238d565b348015610866575f80fd5b506103696108753660046140d7565b60a56020525f908152604090205481565b348015610891575f80fd5b5061036960a85481565b3480156108a6575f80fd5b506103966108b5366004614284565b61243d565b3480156108c5575f80fd5b506103966108d43660046140d7565b612682565b3480156108e4575f80fd5b506103966108f336600461417d565b6126db565b348015610903575f80fd5b506103966109123660046142f8565b6129dd565b610396610925366004614313565b612b38565b348015610935575f80fd5b5061036960985481565b34801561094a575f80fd5b506103966109593660046140d7565b613104565b348015610969575f80fd5b506097546104e6906001600160a01b031681565b348015610988575f80fd5b5061033f6109973660046140a5565b6131c3565b3480156109a7575f80fd5b50610369609a5481565b3480156109bc575f80fd5b506103966109cb3660046140a5565b61320d565b3480156109db575f80fd5b506103966109ea3660046140d7565b6132b0565b3480156109fa575f80fd5b5061036960a95481565b610a0c61333d565b6001600160a01b0381165f908152609f602052604090205460ff1615610a795760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609f6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610ade61333d565b5f8111610b2d5760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610a70565b5f80610b398585613397565b915091505f610b4c836001015160c01c90565b5f81815260a160205260409020549091508214610bab5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b5f60a181610bb98785614376565b81526020019081526020015f205414610c395760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610a70565b609d548111610cb05760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b610cbb600182614389565b609e555b8315610e2757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610d07816131c3565b15610d62575f81815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091610d52908490614376565b909155505060a6805460ff191690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610ddf575060a85481145b15610de9575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610cbf575b505050505050565b60a85415610e7f5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b610e876133b2565b5f80610e938484613397565b915091505f610ea6836001015160c01c90565b5f81815260a160205260409020549091508214610f055760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b610f0e81611326565b610f5a5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b610f63816131c3565b15610fb05760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003015460ff16156110115760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610a70565b5f81815260a260205260409020600101544210156110715760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610a70565b605983015160a05f611084600185614389565b81526020019081526020015f2054146110df5760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f81815260a060205260409020541561113a5760405162461bcd60e51b815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610a70565b80609d546001011461118e5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b609d819055600160a35f6111a3866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f82815260a060205260409020556111f26111e5846011015160c01c90565b600985015160c01c613405565b60a25f611200600184614389565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab91906112399084614389565b81526020019081526020015f205f905560a45f6001836112599190614389565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611302866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061134e57505f82815260a1602052604090205415155b92915050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156113c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e4919061439c565b6114305760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610a70565b60a854156114805760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b6114886133b2565b61149560208301836143b7565b60ff16156114e55760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610a70565b5f6114f360408401846143d7565b915050806115435760405162461bcd60e51b815260206004820152600e60248201527f626174636820697320656d7074790000000000000000000000000000000000006044820152606401610a70565b60608301356115945760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610a70565b60808301356115e55760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610a70565b5f806115fc6115f760208701876143d7565b613397565b915091505f61160f836001015160c01c90565b90505f60a181611620846001614376565b81526020019081526020015f20541461167b5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610a70565b609e5481146116cc5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b5f81815260a1602052604090205482146117285760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610a70565b5f81815260ab60205260409020546060870135146117885760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f611797846011015160c01c90565b90505f80806117e96117ac60408c018c6143d7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508792508891506134c29050565b600196909601959485019493840193925090505f80491561180b575f4961182d565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b60408051611f2081019091529850905060f96118588961185060208f018f6143b7565b60ff1661363f565b60c087811b60018b015285811b60098b015286901b60118a01526019890183905260608c013560598a015260808c013560798a015260a08c013560998a01526118c7896118a860208e018e6143d7565b6040516118b6929190614438565b604051809103902060b99190910152565b60d98901889052603989018290528089205f88815260a1602090815260408083209390935560ab905290812060808e0135905560a65460ff16156119345760a7545f90815260a46020526040902060020154609954429161192791614376565b6119319190614389565b90505b604051806080016040528042815260200182609854426119549190614376565b61195e9190614376565b81526020016119af8f806040019061197691906143d7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061364692505050565b81526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611a23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a479190614447565b90525f89815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e8990556097546001600160a01b031692506374fe27b791508c3590611aaf90611aa9908f018f6143d7565b5f61369d565b5f8e8060400190611ac091906143d7565b6040518663ffffffff1660e01b8152600401611ae09594939291906144a5565b602060405180830381865afa158015611afb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b1f919061439c565b611b915760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b5f86815260a16020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b611bdf61333d565b5f81118015611bf057506099548114155b611c3c5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610a70565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff16158015611ca257505f5460ff8083169116105b611d145760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611d4f5f5460ff1690565b60ff16600214611da15760405162461bcd60e51b815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610a70565b81611e145760405162461bcd60e51b815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610a70565b609e545f90815260ab6020526040902054611e3d57609e545f90815260ab602052604090208290555b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611c76565b611e9f61333d565b6001600160a01b0381165f908152609f602052604090205460ff16611f065760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610a70565b6001600160a01b0381165f818152609f60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610acb565b611f5c61333d565b611f655f6136f1565b565b5f54610100900460ff1615808015611f8557505f54600160ff909116105b80611f9e5750303b158015611f9e57505f5460ff166001145b6120105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f805460ff19166001179055801561204e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038616158061206b57506001600160a01b038516155b156120a2576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0387166120f85760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610a70565b61210061375a565b6121086137de565b609780546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a180156122a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6122b261333d565b6001600160a01b038116158015906122d85750609c546001600160a01b03828116911614155b6123245760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610a70565b609c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b61239561333d565b5f811180156123a5575060648111155b80156123b3575060a9548114155b6123ff5760405162461bcd60e51b815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610a70565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611c76565b60a8541561248d5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b6124956133b2565b5f806124a18686613397565b915091505f6124b4836001015160c01c90565b5f81815260a1602052604090205490915082146125135760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b61251c816131c3565b6125685760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a6805460ff1916905560995460029091015442916125c191614376565b11612637575f81815260a4602090815260408083206003908101805460ff1916600117905560a2835292819020909201548251808401909352600783527f54696d656f7574000000000000000000000000000000000000000000000000009183019190915261263291839190613862565b6122a1565b6126428386866139be565b6122a181336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250613b71565b61268a61333d565b60aa80545f90915561269c8282613c3d565b604080516001600160a01b0384168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611c76565b6126e361333d565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea541561275a5760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610a70565b5f806127668484613397565b915091505f612779836001015160c01c90565b90505f612787846079015190565b9050806127d65760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610a70565b600984015160c01c1561282b5760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610a70565b5f612837856019015190565b036128845760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610a70565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440146128b0856039015190565b146128fd5760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610a70565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b6129e561333d565b8015612b06576129f3613ce8565b60a65460ff1615612ac55760a7545f90815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091612a47908490614376565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a6805460ff191690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b612b0e613d42565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612ae8565b50565b335f908152609f602052604090205460ff16612b965760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610a70565b60a85415612be65760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b612bee6133b2565b60a65460ff1615612c415760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610a70565b8167ffffffffffffffff16609d5410612c9c5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a160205260409020548114612d035760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b612d168267ffffffffffffffff16611326565b612d625760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a460205260409020546801000000000000000090046001600160a01b031615612ddd5760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a260205260409020600101544210612e6d5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610a70565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ebd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ee19190614447565b341015612f305760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a4909552969096209451855492516001600160a01b031668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092179290921790556001600160a01b03168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b99763460405161308291815260200190565b60405180910390a35f609d54600161309a9190614376565b90505b609e5481116130f2578267ffffffffffffffff1681146130e0576099545f82815260a26020526040812060010180549091906130da908490614376565b90915550505b806130ea81614518565b91505061309d565b505060a6805460ff1916600117905550565b335f90815260a56020526040812054908190036131635760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610a70565b335f90815260a5602052604081205561317c8282613c3d565b816001600160a01b03167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a826040516131b791815260200190565b60405180910390a25050565b5f81815260a460205260408120546801000000000000000090046001600160a01b03161580159061134e5750505f90815260a46020526040902060030154610100900460ff161590565b61321561333d565b5f8111801561322657506098548114155b6132725760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610a70565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611c76565b6132b861333d565b6001600160a01b0381166133345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a70565b612b35816136f1565b6033546001600160a01b03163314611f655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a70565b5f805f6133a48585613d7b565b812090969095509350505050565b60655460ff1615611f655760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a70565b805f03613410575050565b8082035f5b828110156134bc5761010081840381111561342f57508083035b609b546040517f3c7f528300000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b0390911690633c7f5283906044015f604051808303815f87803b158015613492575f80fd5b505af11580156134a4573d5f803e3d5ffd5b50505050610100830192505061010081019050613415565b50505050565b60405183515f918291602087019190819084906134e0908590613de3565b90506002840193505f5b8181101561356457603c81028501805184526020908101517fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001690840152603a830192505f61353a603c8361454f565b6135449087614376565b90505f61355582603a015160f01c90565b979097019650506001016134ea565b506020850282016040525b801561362d575f61358485603a015160f01c90565b905061359283828b8b613e78565b92505f6135a3866038015160f01c90565b9050818110156135f55760405162461bcd60e51b815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d7367730000006044820152606401610a70565b50978801979690960195603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161356f565b50819003902096919550909350505050565b8082535050565b5f805f6020840190506002810191505f613661828651613de3565b90505f5b613670600183614389565b81101561368657603c9390930192600101613665565b505f613693845160c01c90565b9695505050505050565b60605f808080806136b0888a018a614653565b95509550955095509550508187106136ce5794506136ea9350505050565b8387106136e25782955050505050506136ea565b509293505050505b9392505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166137d65760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f65613f46565b5f54610100900460ff1661385a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f65613fce565b60a88390555f83815260a460205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af11580156138e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390a9190614447565b5f86815260a46020526040902060010154909150613929908290614376565b5f86815260a460209081526040808320546801000000000000000090046001600160a01b0316835260a590915281208054909190613968908490614376565b909155505060405161397b9084906146f0565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80613a0b5760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610a70565b5f613a1a846001015160c01c90565b90505f613a28856039015190565b90505f7f0000000000000000000000000000000000000000000000000000000000000000613a57876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c549091506001600160a01b0316632c09a848613b19885160f81c90565b858888866040518663ffffffff1660e01b8152600401613b3d95949392919061471c565b5f6040518083038186803b158015613b53575f80fd5b505afa158015613b65573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a954909190606490613b95908461454f565b613b9f919061474d565b9050613bab8183614389565b60aa5f828254613bbb9190614376565b90915550506001600160a01b0384165f90815260a5602052604081208054839290613be7908490614376565b9091555050604051613bfa9084906146f0565b604051908190038120906001600160a01b0386169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b8015613ce4575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613c8c576040519150601f19603f3d011682016040523d82523d5f602084013e613c91565b606091505b5050905080613ce25760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610a70565b505b5050565b613cf06133b2565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d253390565b6040516001600160a01b03909116815260200160405180910390a1565b613d4a614053565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613d25565b5f8160f98114613dcd5760405162461bcd60e51b815260206004820152601f60248201527f626174636820686561646572206c656e677468206d75737420626520323439006044820152606401610a70565b6040519150808483378082016040529250929050565b5f613def835160f01c90565b9050805f03613e2a576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613e35603c8261454f565b613e40906002614376565b821461134e576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835f03613e87575083613f3e565b609b546001600160a01b03165f5b85811015613f38576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f906001600160a01b0384169063ae453cd590602401602060405180830381865afa158015613efb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f1f9190614447565b8852506020909601956001948501949384019301613e95565b50859150505b949350505050565b5f54610100900460ff16613fc25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b6065805460ff19169055565b5f54610100900460ff1661404a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f65336136f1565b60655460ff16611f655760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610a70565b5f602082840312156140b5575f80fd5b5035919050565b80356001600160a01b03811681146140d2575f80fd5b919050565b5f602082840312156140e7575f80fd5b6136ea826140bc565b5f8083601f840112614100575f80fd5b50813567ffffffffffffffff811115614117575f80fd5b60208301915083602082850101111561412e575f80fd5b9250929050565b5f805f60408486031215614147575f80fd5b833567ffffffffffffffff81111561415d575f80fd5b614169868287016140f0565b909790965060209590950135949350505050565b5f806020838503121561418e575f80fd5b823567ffffffffffffffff8111156141a4575f80fd5b6141b0858286016140f0565b90969095509350505050565b5f80604083850312156141cd575f80fd5b823567ffffffffffffffff808211156141e4575f80fd5b9084019060c082870312156141f7575f80fd5b9092506020840135908082111561420c575f80fd5b5083016060818603121561421e575f80fd5b809150509250929050565b5f805f805f8060c0878903121561423e575f80fd5b614247876140bc565b9550614255602088016140bc565b9450614263604088016140bc565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f8060408587031215614297575f80fd5b843567ffffffffffffffff808211156142ae575f80fd5b6142ba888389016140f0565b909650945060208701359150808211156142d2575f80fd5b506142df878288016140f0565b95989497509550505050565b8015158114612b35575f80fd5b5f60208284031215614308575f80fd5b81356136ea816142eb565b5f8060408385031215614324575f80fd5b823567ffffffffffffffff8116811461433b575f80fd5b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561134e5761134e614349565b8181038181111561134e5761134e614349565b5f602082840312156143ac575f80fd5b81516136ea816142eb565b5f602082840312156143c7575f80fd5b813560ff811681146136ea575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261440a575f80fd5b83018035915067ffffffffffffffff821115614424575f80fd5b60200191503681900382131561412e575f80fd5b818382375f9101908152919050565b5f60208284031215614457575f80fd5b5051919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b818110156144ef5784516001600160a01b0316835293830193918301916001016144ca565b5050876040860152848103606086015261450a81878961445e565b9a9950505050505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361454857614548614349565b5060010190565b808202811582820484141761134e5761134e614349565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126145a2575f80fd5b8135602067ffffffffffffffff808311156145bf576145bf614566565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110848211171561460257614602614566565b6040529384526020818701810194908101925087851115614621575f80fd5b6020870191505b8482101561464857614639826140bc565b83529183019190830190614628565b979650505050505050565b5f805f805f8060c08789031215614668575f80fd5b86359550602087013567ffffffffffffffff80821115614686575f80fd5b6146928a838b01614593565b96506040890135955060608901359150808211156146ae575f80fd5b6146ba8a838b01614593565b94506080890135935060a08901359150808211156146d6575f80fd5b506146e389828a01614593565b9150509295509295509295565b5f82515f5b8181101561470f57602081860181015185830152016146f5565b505f920191825250919050565b858152846020820152608060408201525f61473b60808301858761445e565b90508260608301529695505050505050565b5f82614780577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a +0x608060405260043610610306575f3560e01c8063728cdbca11610191578063b35dac4e116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd146109b1578063f2fde38b146109d0578063fb1e8b04146109ef575f80fd5b8063ddd8a3dc1461095e578063de8b30351461097d578063dff7827e1461099c575f80fd5b8063cd4edc69116100b7578063cd4edc6914610917578063ce5db8d61461092a578063d279c1911461093f575f80fd5b8063b35dac4e146108ba578063b3e0a509146108d9578063bedb86fb146108f8575f80fd5b8063a415d8dc1161013c578063abc8d68d11610117578063abc8d68d1461085b578063b31a77d314610886578063b34844251461089b575f80fd5b8063a415d8dc146107f9578063a479265d14610827578063a4f209b01461083c575f80fd5b80638f1d37761161016c5780638f1d3776146106f9578063910129d4146107a957806397fc007c146107da575f80fd5b8063728cdbca146106a457806388b1ea09146106c35780638da5cb5b146106dc575f80fd5b80632b7ac3f3116102515780635ef7a94a116101fc57806368589dfa116101d757806368589dfa146106465780636c578c1d14610671578063715018a614610690575f80fd5b80635ef7a94a1461057b5780635f77cf1d146105db5780636126729014610627575f80fd5b80634a8d544f1161022c5780634a8d544f1461053257806357e0af6c146105455780635c975abb14610564575f80fd5b80632b7ac3f3146104c75780633b70c18a146104fe5780633e001b661461051d575f80fd5b806313361101116102b157806321e2f9e01161028c57806321e2f9e0146104525780632362f03e146104715780632571098d1461049c575f80fd5b806313361101146103ee57806318463fb01461040d57806318af3b2b14610422575f80fd5b806310d44583116102e157806310d4458314610398578063116a1f42146103b7578063121dcd50146103d9575f80fd5b806304d7721514610311578063059def61146103545780630ceb678014610377575f80fd5b3661030d57005b5f80fd5b34801561031c575f80fd5b5061033f61032b3660046140f4565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561035f575f80fd5b50610369609d5481565b60405190815260200161034b565b348015610382575f80fd5b50610396610391366004614126565b610a04565b005b3480156103a3575f80fd5b506103966103b2366004614184565b610ad6565b3480156103c2575f80fd5b5061033f6103d13660046140f4565b609d54101590565b3480156103e4575f80fd5b50610369609e5481565b3480156103f9575f80fd5b506103966104083660046141cc565b610e2f565b348015610418575f80fd5b5061036960a75481565b34801561042d575f80fd5b5061033f61043c3660046140f4565b5f90815260a26020526040902060010154421090565b34801561045d575f80fd5b5061033f61046c3660046140f4565b611326565b34801561047c575f80fd5b5061036961048b3660046140f4565b60a16020525f908152604090205481565b3480156104a7575f80fd5b506103696104b63660046140f4565b60a06020525f908152604090205481565b3480156104d2575f80fd5b50609c546104e6906001600160a01b031681565b6040516001600160a01b03909116815260200161034b565b348015610509575f80fd5b50609b546104e6906001600160a01b031681565b348015610528575f80fd5b5061036960aa5481565b61039661054036600461420b565b611354565b348015610550575f80fd5b5061039661055f3660046140f4565b611bd7565b34801561056f575f80fd5b5060655460ff1661033f565b348015610586575f80fd5b506105bb6105953660046140f4565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161034b565b3480156105e6575f80fd5b5061060e7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161034b565b348015610632575f80fd5b506103966106413660046140f4565b611c82565b348015610651575f80fd5b506103696106603660046140f4565b60ab6020525f908152604090205481565b34801561067c575f80fd5b5061039661068b366004614126565b611e97565b34801561069b575f80fd5b50610396611f54565b3480156106af575f80fd5b506103966106be366004614278565b611f67565b3480156106ce575f80fd5b5060a65461033f9060ff1681565b3480156106e7575f80fd5b506033546001600160a01b03166104e6565b348015610704575f80fd5b506107656107133660046140f4565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c00161034b565b3480156107b4575f80fd5b5061033f6107c33660046140f4565b5f90815260a4602052604090206003015460ff1690565b3480156107e5575f80fd5b506103966107f4366004614126565b6122aa565b348015610804575f80fd5b5061033f610813366004614126565b609f6020525f908152604090205460ff1681565b348015610832575f80fd5b5061036960995481565b348015610847575f80fd5b506103966108563660046140f4565b61238d565b348015610866575f80fd5b50610369610875366004614126565b60a56020525f908152604090205481565b348015610891575f80fd5b5061036960a85481565b3480156108a6575f80fd5b506103966108b53660046142d3565b61243d565b3480156108c5575f80fd5b506103966108d4366004614126565b612682565b3480156108e4575f80fd5b506103966108f33660046141cc565b6126db565b348015610903575f80fd5b50610396610912366004614347565b612a2b565b610396610925366004614362565b612b86565b348015610935575f80fd5b5061036960985481565b34801561094a575f80fd5b50610396610959366004614126565b613152565b348015610969575f80fd5b506097546104e6906001600160a01b031681565b348015610988575f80fd5b5061033f6109973660046140f4565b613211565b3480156109a7575f80fd5b50610369609a5481565b3480156109bc575f80fd5b506103966109cb3660046140f4565b61325b565b3480156109db575f80fd5b506103966109ea366004614126565b6132fe565b3480156109fa575f80fd5b5061036960a95481565b610a0c61338b565b6001600160a01b0381165f908152609f602052604090205460ff1615610a795760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609f6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610ade61338b565b5f8111610b2d5760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610a70565b5f80610b3985856133e5565b915091505f610b4c836001015160c01c90565b5f81815260a160205260409020549091508214610bab5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b5f60a181610bb987856143c5565b81526020019081526020015f205414610c395760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610a70565b609d548111610cb05760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b610cbb6001826143d8565b609e555b8315610e2757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610d0781613211565b15610d62575f81815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091610d529084906143c5565b909155505060a6805460ff191690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610ddf575060a85481145b15610de9575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610cbf575b505050505050565b60a85415610e7f5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b610e87613400565b5f80610e9384846133e5565b915091505f610ea6836001015160c01c90565b5f81815260a160205260409020549091508214610f055760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b610f0e81611326565b610f5a5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b610f6381613211565b15610fb05760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003015460ff16156110115760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610a70565b5f81815260a260205260409020600101544210156110715760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610a70565b605983015160a05f6110846001856143d8565b81526020019081526020015f2054146110df5760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f81815260a060205260409020541561113a5760405162461bcd60e51b815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610a70565b80609d546001011461118e5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b609d819055600160a35f6111a3866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f82815260a060205260409020556111f26111e5846011015160c01c90565b600985015160c01c613453565b60a25f6112006001846143d8565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab919061123990846143d8565b81526020019081526020015f205f905560a45f60018361125991906143d8565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611302866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061134e57505f82815260a1602052604090205415155b92915050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156113c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e491906143eb565b6114305760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610a70565b60a854156114805760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b611488613400565b6114956020830183614406565b60ff16156114e55760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610a70565b5f6114f36040840184614426565b915050806115435760405162461bcd60e51b815260206004820152600e60248201527f626174636820697320656d7074790000000000000000000000000000000000006044820152606401610a70565b60608301356115945760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610a70565b60808301356115e55760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610a70565b5f806115fc6115f76020870187614426565b6133e5565b915091505f61160f836001015160c01c90565b90505f60a1816116208460016143c5565b81526020019081526020015f20541461167b5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610a70565b609e5481146116cc5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b5f81815260a1602052604090205482146117285760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610a70565b5f81815260ab60205260409020546060870135146117885760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f611797846011015160c01c90565b90505f80806117e96117ac60408c018c614426565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508792508891506135109050565b600196909601959485019493840193925090505f80491561180b575f4961182d565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b60408051611f2081019091529850905060f96118588961185060208f018f614406565b60ff1661368d565b60c087811b60018b015285811b60098b015286901b60118a01526019890183905260608c013560598a015260808c013560798a015260a08c013560998a01526118c7896118a860208e018e614426565b6040516118b6929190614487565b604051809103902060b99190910152565b60d98901889052603989018290528089205f88815260a1602090815260408083209390935560ab905290812060808e0135905560a65460ff16156119345760a7545f90815260a460205260409020600201546099544291611927916143c5565b61193191906143d8565b90505b6040518060800160405280428152602001826098544261195491906143c5565b61195e91906143c5565b81526020016119af8f80604001906119769190614426565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061369492505050565b81526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611a23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a479190614496565b90525f89815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e8990556097546001600160a01b031692506374fe27b791508c3590611aaf90611aa9908f018f614426565b5f6136eb565b5f8e8060400190611ac09190614426565b6040518663ffffffff1660e01b8152600401611ae09594939291906144f4565b602060405180830381865afa158015611afb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b1f91906143eb565b611b915760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b5f86815260a16020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b611bdf61338b565b5f81118015611bf057506099548114155b611c3c5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610a70565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff16158015611ca257505f5460ff8083169116105b611d145760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611d4f5f5460ff1690565b60ff16600214611da15760405162461bcd60e51b815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610a70565b81611e145760405162461bcd60e51b815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610a70565b609e545f90815260ab6020526040902054611e3d57609e545f90815260ab602052604090208290555b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611c76565b611e9f61338b565b6001600160a01b0381165f908152609f602052604090205460ff16611f065760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610a70565b6001600160a01b0381165f818152609f60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610acb565b611f5c61338b565b611f655f61373f565b565b5f54610100900460ff1615808015611f8557505f54600160ff909116105b80611f9e5750303b158015611f9e57505f5460ff166001145b6120105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f805460ff19166001179055801561204e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038616158061206b57506001600160a01b038516155b156120a2576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0387166120f85760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610a70565b6121006137a8565b61210861382c565b609780546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a180156122a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6122b261338b565b6001600160a01b038116158015906122d85750609c546001600160a01b03828116911614155b6123245760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610a70565b609c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b61239561338b565b5f811180156123a5575060648111155b80156123b3575060a9548114155b6123ff5760405162461bcd60e51b815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610a70565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611c76565b60a8541561248d5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b612495613400565b5f806124a186866133e5565b915091505f6124b4836001015160c01c90565b5f81815260a1602052604090205490915082146125135760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b61251c81613211565b6125685760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a6805460ff1916905560995460029091015442916125c1916143c5565b11612637575f81815260a4602090815260408083206003908101805460ff1916600117905560a2835292819020909201548251808401909352600783527f54696d656f75740000000000000000000000000000000000000000000000000091830191909152612632918391906138b0565b6122a1565b612642838686613a0c565b6122a181336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250613bbf565b61268a61338b565b60aa80545f90915561269c8282613c8b565b604080516001600160a01b0384168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611c76565b6126e361338b565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea541561275a5760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610a70565b5f8061276684846133e5565b915091505f612779836001015160c01c90565b905080156127c95760405162461bcd60e51b815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610a70565b5f6127d5846079015190565b9050806128245760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610a70565b600984015160c01c156128795760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610a70565b5f612885856019015190565b036128d25760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610a70565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440146128fe856039015190565b1461294b5760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610a70565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b612a3361338b565b8015612b5457612a41613d36565b60a65460ff1615612b135760a7545f90815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091612a959084906143c5565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a6805460ff191690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b612b5c613d90565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612b36565b50565b335f908152609f602052604090205460ff16612be45760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610a70565b60a85415612c345760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b612c3c613400565b60a65460ff1615612c8f5760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610a70565b8167ffffffffffffffff16609d5410612cea5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a160205260409020548114612d515760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b612d648267ffffffffffffffff16611326565b612db05760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a460205260409020546801000000000000000090046001600160a01b031615612e2b5760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a260205260409020600101544210612ebb5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610a70565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f2f9190614496565b341015612f7e5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a4909552969096209451855492516001600160a01b031668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092179290921790556001600160a01b03168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b9976346040516130d091815260200190565b60405180910390a35f609d5460016130e891906143c5565b90505b609e548111613140578267ffffffffffffffff16811461312e576099545f82815260a26020526040812060010180549091906131289084906143c5565b90915550505b8061313881614567565b9150506130eb565b505060a6805460ff1916600117905550565b335f90815260a56020526040812054908190036131b15760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610a70565b335f90815260a560205260408120556131ca8282613c8b565b816001600160a01b03167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a8260405161320591815260200190565b60405180910390a25050565b5f81815260a460205260408120546801000000000000000090046001600160a01b03161580159061134e5750505f90815260a46020526040902060030154610100900460ff161590565b61326361338b565b5f8111801561327457506098548114155b6132c05760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610a70565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611c76565b61330661338b565b6001600160a01b0381166133825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a70565b612b838161373f565b6033546001600160a01b03163314611f655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a70565b5f805f6133f28585613dc9565b812090969095509350505050565b60655460ff1615611f655760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a70565b805f0361345e575050565b8082035f5b8281101561350a5761010081840381111561347d57508083035b609b546040517f3c7f528300000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b0390911690633c7f5283906044015f604051808303815f87803b1580156134e0575f80fd5b505af11580156134f2573d5f803e3d5ffd5b50505050610100830192505061010081019050613463565b50505050565b60405183515f9182916020870191908190849061352e908590613e32565b90506002840193505f5b818110156135b257603c81028501805184526020908101517fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001690840152603a830192505f613588603c8361459e565b61359290876143c5565b90505f6135a382603a015160f01c90565b97909701965050600101613538565b506020850282016040525b801561367b575f6135d285603a015160f01c90565b90506135e083828b8b613ec7565b92505f6135f1866038015160f01c90565b9050818110156136435760405162461bcd60e51b815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d7367730000006044820152606401610a70565b50978801979690960195603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016135bd565b50819003902096919550909350505050565b8082535050565b5f805f6020840190506002810191505f6136af828651613e32565b90505f5b6136be6001836143d8565b8110156136d457603c93909301926001016136b3565b505f6136e1845160c01c90565b9695505050505050565b60605f808080806136fe888a018a6146a2565b955095509550955095505081871061371c5794506137389350505050565b838710613730578295505050505050613738565b509293505050505b9392505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166138245760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f65613f95565b5f54610100900460ff166138a85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f6561401d565b60a88390555f83815260a460205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af1158015613934573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139589190614496565b5f86815260a460205260409020600101549091506139779082906143c5565b5f86815260a460209081526040808320546801000000000000000090046001600160a01b0316835260a5909152812080549091906139b69084906143c5565b90915550506040516139c990849061473f565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80613a595760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610a70565b5f613a68846001015160c01c90565b90505f613a76856039015190565b90505f7f0000000000000000000000000000000000000000000000000000000000000000613aa5876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c549091506001600160a01b0316632c09a848613b67885160f81c90565b858888866040518663ffffffff1660e01b8152600401613b8b95949392919061476b565b5f6040518083038186803b158015613ba1575f80fd5b505afa158015613bb3573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a954909190606490613be3908461459e565b613bed919061479c565b9050613bf981836143d8565b60aa5f828254613c0991906143c5565b90915550506001600160a01b0384165f90815260a5602052604081208054839290613c359084906143c5565b9091555050604051613c4890849061473f565b604051908190038120906001600160a01b0386169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b8015613d32575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613cda576040519150601f19603f3d011682016040523d82523d5f602084013e613cdf565b606091505b5050905080613d305760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610a70565b505b5050565b613d3e613400565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d733390565b6040516001600160a01b03909116815260200160405180910390a1565b613d986140a2565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613d73565b5f8160f9811015613e1c5760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610a70565b6040519150808483378082016040529250929050565b5f613e3e835160f01c90565b9050805f03613e79576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613e84603c8261459e565b613e8f9060026143c5565b821461134e576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835f03613ed6575083613f8d565b609b546001600160a01b03165f5b85811015613f87576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f906001600160a01b0384169063ae453cd590602401602060405180830381865afa158015613f4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f6e9190614496565b8852506020909601956001948501949384019301613ee4565b50859150505b949350505050565b5f54610100900460ff166140115760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b6065805460ff19169055565b5f54610100900460ff166140995760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f653361373f565b60655460ff16611f655760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610a70565b5f60208284031215614104575f80fd5b5035919050565b80356001600160a01b0381168114614121575f80fd5b919050565b5f60208284031215614136575f80fd5b6137388261410b565b5f8083601f84011261414f575f80fd5b50813567ffffffffffffffff811115614166575f80fd5b60208301915083602082850101111561417d575f80fd5b9250929050565b5f805f60408486031215614196575f80fd5b833567ffffffffffffffff8111156141ac575f80fd5b6141b88682870161413f565b909790965060209590950135949350505050565b5f80602083850312156141dd575f80fd5b823567ffffffffffffffff8111156141f3575f80fd5b6141ff8582860161413f565b90969095509350505050565b5f806040838503121561421c575f80fd5b823567ffffffffffffffff80821115614233575f80fd5b9084019060c08287031215614246575f80fd5b9092506020840135908082111561425b575f80fd5b5083016060818603121561426d575f80fd5b809150509250929050565b5f805f805f8060c0878903121561428d575f80fd5b6142968761410b565b95506142a46020880161410b565b94506142b26040880161410b565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f80604085870312156142e6575f80fd5b843567ffffffffffffffff808211156142fd575f80fd5b6143098883890161413f565b90965094506020870135915080821115614321575f80fd5b5061432e8782880161413f565b95989497509550505050565b8015158114612b83575f80fd5b5f60208284031215614357575f80fd5b81356137388161433a565b5f8060408385031215614373575f80fd5b823567ffffffffffffffff8116811461438a575f80fd5b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561134e5761134e614398565b8181038181111561134e5761134e614398565b5f602082840312156143fb575f80fd5b81516137388161433a565b5f60208284031215614416575f80fd5b813560ff81168114613738575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614459575f80fd5b83018035915067ffffffffffffffff821115614473575f80fd5b60200191503681900382131561417d575f80fd5b818382375f9101908152919050565b5f602082840312156144a6575f80fd5b5051919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b8181101561453e5784516001600160a01b031683529383019391830191600101614519565b505087604086015284810360608601526145598187896144ad565b9a9950505050505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361459757614597614398565b5060010190565b808202811582820484141761134e5761134e614398565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126145f1575f80fd5b8135602067ffffffffffffffff8083111561460e5761460e6145b5565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614651576146516145b5565b6040529384526020818701810194908101925087851115614670575f80fd5b6020870191505b84821015614697576146888261410b565b83529183019190830190614677565b979650505050505050565b5f805f805f8060c087890312156146b7575f80fd5b86359550602087013567ffffffffffffffff808211156146d5575f80fd5b6146e18a838b016145e2565b96506040890135955060608901359150808211156146fd575f80fd5b6147098a838b016145e2565b94506080890135935060a0890135915080821115614725575f80fd5b5061473289828a016145e2565b9150509295509295509295565b5f82515f5b8181101561475e5760208186018101518583015201614744565b505f920191825250919050565b858152846020820152608060408201525f61478a6080830185876144ad565b90508260608301529695505050505050565b5f826147cf577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a diff --git a/bindings/bindings/l1crossdomainmessenger.go b/bindings/bindings/l1crossdomainmessenger.go index 87775ad2..2f47f0b2 100644 --- a/bindings/bindings/l1crossdomainmessenger.go +++ b/bindings/bindings/l1crossdomainmessenger.go @@ -31,8 +31,8 @@ var ( // L1CrossDomainMessengerMetaData contains all meta data concerning the L1CrossDomainMessenger contract. var L1CrossDomainMessengerMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"DropMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"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\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"oldNonce\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"ReplayMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldFeeVault\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newFeeVault\",\"type\":\"address\"}],\"name\":\"UpdateFeeVault\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldMaxReplayTimes\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newMaxReplayTimes\",\"type\":\"uint256\"}],\"name\":\"UpdateMaxReplayTimes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRollup\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRollup\",\"type\":\"address\"}],\"name\":\"UpdateRollup\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"counterpart\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"}],\"name\":\"dropMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeVault\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finalizedWithdrawals\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeVault\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rollup\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"isL1MessageDropped\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxReplayTimes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"messageSendTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"prevReplayIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[32]\",\"name\":\"_withdrawalProof\",\"type\":\"bytes32[32]\"},{\"internalType\":\"bytes32\",\"name\":\"_withdrawalRoot\",\"type\":\"bytes32\"}],\"name\":\"proveAndRelayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_newGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"_refundAddress\",\"type\":\"address\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"replayStates\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"times\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"lastIndex\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollup\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_refundAddress\",\"type\":\"address\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newFeeVault\",\"type\":\"address\"}],\"name\":\"updateFeeVault\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newMaxReplayTimes\",\"type\":\"uint256\"}],\"name\":\"updateMaxReplayTimes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newRollup\",\"type\":\"address\"}],\"name\":\"updateRollup\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"leafHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProof\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"verifyMerkleProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x608060405234801562000010575f80fd5b506200001b62000021565b620000df565b5f54610100900460ff16156200008d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000dd575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b612de580620000ed5f395ff3fe6080604052600436106101a7575f3560e01c806386fa4b73116100e7578063c0c53b8b11610087578063e70fc93b11610062578063e70fc93b146104f9578063ea7ec51414610524578063ecc7042814610550578063f2fde38b14610564575f80fd5b8063c0c53b8b1461049c578063cb23bcb5146104bb578063d87e7df1146104da575f80fd5b8063a14238e7116100c2578063a14238e71461040e578063b2267a7b1461043c578063b604bf4c1461044f578063bedb86fb1461047d575f80fd5b806386fa4b73146103af5780638da5cb5b146103ce578063946130d8146103eb575f80fd5b806355004105116101525780636e296e451161012d5780636e296e45146102de578063715018a6146102fd578063797594b014610311578063846d4d7a14610330575f80fd5b806355004105146102a15780635c975abb146102b45780635f7b1577146102cb575f80fd5b80633b70c18a116101825780633b70c18a1461022c578063407c195514610263578063478222c214610282575f80fd5b806329907acd146101ba5780632a6cccb2146101d9578063340735f7146101f8575f80fd5b366101b6576101b4610583565b005b5f80fd5b3480156101c5575f80fd5b506101b46101d436600461283a565b6105e4565b3480156101e4575f80fd5b506101b46101f33660046128a7565b610966565b348015610203575f80fd5b506102176102123660046128de565b610a2d565b60405190151581526020015b60405180910390f35b348015610237575f80fd5b5060fe5461024b906001600160a01b031681565b6040516001600160a01b039091168152602001610223565b34801561026e575f80fd5b506101b461027d36600461291a565b610af6565b34801561028d575f80fd5b5060cb5461024b906001600160a01b031681565b6101b46102af366004612931565b610bb9565b3480156102bf575f80fd5b5060655460ff16610217565b6101b46102d93660046129c8565b611201565b3480156102e9575f80fd5b5060c95461024b906001600160a01b031681565b348015610308575f80fd5b506101b4611255565b34801561031c575f80fd5b5060ca5461024b906001600160a01b031681565b34801561033b575f80fd5b5061038661034a36600461291a565b6101006020525f90815260409020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b604080516fffffffffffffffffffffffffffffffff938416815292909116602083015201610223565b3480156103ba575f80fd5b506101b46103c9366004612a66565b611266565b3480156103d9575f80fd5b506033546001600160a01b031661024b565b3480156103f6575f80fd5b5061040060ff5481565b604051908152602001610223565b348015610419575f80fd5b5061021761042836600461291a565b60fa6020525f908152604090205460ff1681565b6101b461044a366004612aef565b611732565b34801561045a575f80fd5b5061021761046936600461291a565b60fc6020525f908152604090205460ff1681565b348015610488575f80fd5b506101b4610497366004612b57565b61174d565b3480156104a7575f80fd5b506101b46104b6366004612b72565b61176e565b3480156104c6575f80fd5b5060fd5461024b906001600160a01b031681565b3480156104e5575f80fd5b506101b46104f43660046128a7565b6119d1565b348015610504575f80fd5b5061040061051336600461291a565b60fb6020525f908152604090205481565b34801561052f575f80fd5b5061040061053e36600461291a565b6101016020525f908152604090205481565b34801561055b575f80fd5b50610400611ac7565b34801561056f575f80fd5b506101b461057e3660046128a7565b611b50565b6033546001600160a01b031633146105e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6105ec611bdd565b60c9546001600160a01b031661dead146106485760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105d9565b60fe546001600160a01b03165f6106628787878787611c30565b90505f818051906020012090505f60fb5f8381526020019081526020015f2054116106f55760405162461bcd60e51b815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f717565756564000000000000000000000000000000000000000000000000000060648201526084016105d9565b5f81815260fc602052604090205460ff16156107535760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792064726f7070656400000000000000000060448201526064016105d9565b5f818152610100602052604081205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16908190036107935750845b6040517f91652461000000000000000000000000000000000000000000000000000000008152600481018290526001600160a01b038516906391652461906024015f604051808303815f87803b1580156107eb575f80fd5b505af11580156107fd573d5f803e3d5ffd5b5050505f918252506101016020526040902054801561083d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01610793565b5f82815260fc6020526040808220805460ff191660011790555187917fbd05aabbf548001ebdd6ac80c02f1cfb3b39165f2fae1d420075f22e781ef63b91a260c980547fffffffffffffffffffffffff000000000000000000000000000000000000000016736f297c61b5c92ef107ffd30cd56affe5a273e8411790556040517f14298c510000000000000000000000000000000000000000000000000000000081526001600160a01b038a16906314298c51908990610901908990600401612c1d565b5f604051808303818588803b158015610918575f80fd5b505af115801561092a573d5f803e3d5ffd5b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055505050505050505050505050565b61096e610583565b6001600160a01b0381166109c45760405162461bcd60e51b815260206004820152601d60248201527f6665655661756c742063616e6e6f74206265206164647265737328302900000060448201526064016105d9565b60cb80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f4aadc32827849f797733838c61302f7f56d2b6db28caa175eb3f7f8e5aba25f5905f90a35050565b5f84815b6020811015610aea578085901c600116600103610a9757858160208110610a5a57610a5a612c2f565b602002013582604051602001610a7a929190918252602082015260400190565b604051602081830303815290604052805190602001209150610ae2565b81868260208110610aaa57610aaa612c2f565b6020020135604051602001610ac9929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b600101610a31565b50909114949350505050565b610afe610583565b5f8111610b735760405162461bcd60e51b815260206004820152602360248201527f7265706c61792074696d6573206d75737420626520677265617465722074686160448201527f6e2030000000000000000000000000000000000000000000000000000000000060648201526084016105d9565b60ff80549082905560408051828152602081018490527fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91015b60405180910390a15050565b610bc1611bdd565b60c9546001600160a01b031661dead14610c1d5760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105d9565b60fe5460ca546001600160a01b0391821691165f610c3e8a8a8a8a8a611c30565b90505f818051906020012090505f60fb5f8381526020019081526020015f205411610cd15760405162461bcd60e51b815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f717565756564000000000000000000000000000000000000000000000000000060648201526084016105d9565b5f81815260fc602052604090205460ff1615610d2f5760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792064726f7070656400000000000000000060448201526064016105d9565b6040517f3e4cbbe60000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116600483015263ffffffff881660248301525f9190861690633e4cbbe690604401602060405180830381865afa158015610d9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dbf9190612c5c565b905080341015610e115760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e74206d73672e76616c756520666f7220666565000060448201526064016105d9565b8015610eb95760cb546040515f916001600160a01b03169083908381818185875af1925050503d805f8114610e61576040519150601f19603f3d011682016040523d82523d5f602084013e610e66565b606091505b5050905080610eb75760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f206465647563742074686520666565000000000000000060448201526064016105d9565b505b5f856001600160a01b031663fd0ad31e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1a9190612c5c565b6040517f9b1597820000000000000000000000000000000000000000000000000000000081529091506001600160a01b03871690639b15978290610f669088908c908990600401612c73565b5f604051808303815f87803b158015610f7d575f80fd5b505af1158015610f8f573d5f803e3d5ffd5b5050505f848152610100602090815260408083208151808301909252546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041691810182905292509003610fff575f8281526101016020526040902060018c019055611030565b80602001516001016fffffffffffffffffffffffffffffffff166101015f8481526020019081526020015f20819055505b6fffffffffffffffffffffffffffffffff808316602083015260ff5482519091161061109e5760405162461bcd60e51b815260206004820152601b60248201527f457863656564206d6178696d756d207265706c61792074696d6573000000000060448201526064016105d9565b80516fffffffffffffffffffffffffffffffff600191909101811682525f858152610100602090815260409091208351919093015182167001000000000000000000000000000000000291161790556001600160a01b038c166110fe3390565b6001600160a01b03168b7fa3a1251805b1fc7915884575b42e1fb862e814f0f5c9d670d08bf84697053d618e858d8f60405161113d9493929190612ca9565b60405180910390a4348281039083146111f1575f886001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611199576040519150601f19603f3d011682016040523d82523d5f602084013e61119e565b606091505b50509050806111ef5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20726566756e642074686520666565000000000000000060448201526064016105d9565b505b5050505050505050505050505050565b611209611bdd565b61124d868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250889250879150611ccc9050565b505050505050565b61125d610583565b6105e25f612118565b61126e611bdd565b60c9546001600160a01b031661dead146112ca5760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105d9565b60fe546001600160a01b039081169087160361134e5760405162461bcd60e51b815260206004820152602760248201527f4d657373656e6765723a20466f7262696420746f2063616c6c206d657373616760448201527f652071756575650000000000000000000000000000000000000000000000000060648201526084016105d9565b61135786612181565b60c9546001600160a01b03908116908816036113db5760405162461bcd60e51b815260206004820152602160248201527f4d657373656e6765723a20496e76616c6964206d6573736167652073656e646560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016105d9565b5f6113e98888888888611c30565b80516020918201205f81815260fa90925260409091205490915060ff16156114795760405162461bcd60e51b815260206004820152603060248201527f4d657373656e6765723a207769746864726177616c2068617320616c7265616460448201527f79206265656e2066696e616c697a65640000000000000000000000000000000060648201526084016105d9565b60fd546040517f04d77215000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03909116905f9082906304d7721590602401602060405180830381865afa1580156114dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115019190612cdd565b9050806115765760405162461bcd60e51b815260206004820152602760248201527f4d657373656e6765723a207769746864726177616c526f6f74206e6f7420666960448201527f6e616c697a65640000000000000000000000000000000000000000000000000060648201526084016105d9565b61158283868987610a2d565b6115f45760405162461bcd60e51b815260206004820152602d60248201527f4d657373656e6765723a20696e76616c6964207769746864726177616c20696e60448201527f636c7573696f6e2070726f6f660000000000000000000000000000000000000060648201526084016105d9565b5060c980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038b8116919091179091556040515f918a16908990611642908990612cf8565b5f6040518083038185875af1925050503d805f811461167c576040519150601f19603f3d011682016040523d82523d5f602084013e611681565b606091505b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156116fb575f83815260fa6020526040808220805460ff191660011790555184917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611726565b60405183907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f905f90a25b50505050505050505050565b61173a611bdd565b6117478484848433611ccc565b50505050565b611755610583565b8015611766576117636121d9565b50565b611763612233565b5f54610100900460ff161580801561178c57505f54600160ff909116105b806117a55750303b1580156117a557505f5460ff166001145b6118175760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d9565b5f805460ff191660011790558015611855575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038316158061187257506001600160a01b038216155b8061188457506001600160a01b038416155b156118bb576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118d97353000000000000000000000000000000000000078561226c565b60fd80546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fe805492851692909116919091179055600360ff8190556040517fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91611962915f9190918252602082015260400190565b60405180910390a18015611747575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6119d9610583565b6001600160a01b038116611a555760405162461bcd60e51b815260206004820152602360248201527f726f6c6c757020616464726573732063616e6e6f74206265206164647265737360448201527f283029000000000000000000000000000000000000000000000000000000000060648201526084016105d9565b60fd80546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5272c8ad4bd643b1130291ea29bebd9b3bc583057a6e4d047eb7077039a956309101610bad565b60fe54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290515f926001600160a01b03169163fd0ad31e9160048083019260209291908290030181865afa158015611b27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4b9190612c5c565b905090565b611b58610583565b6001600160a01b038116611bd45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105d9565b61176381612118565b60655460ff16156105e25760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016105d9565b60608585858585604051602401611c4b959493929190612d13565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8ef1332e00000000000000000000000000000000000000000000000000000000179052905095945050505050565b611cd4612384565b60fe5460ca54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290516001600160a01b0393841693909216915f91849163fd0ad31e916004808201926020929091908290030181865afa158015611d40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d649190612c5c565b90505f611d74338a8a858b611c30565b90505f6001600160a01b038516633e4cbbe6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018a9052604401602060405180830381865afa158015611de8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e0c9190612c5c565b9050611e188982612d55565b341015611e675760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e74206d73672e76616c75650000000000000000000060448201526064016105d9565b8015611f0f5760cb546040515f916001600160a01b03169083908381818185875af1925050503d805f8114611eb7576040519150601f19603f3d011682016040523d82523d5f602084013e611ebc565b606091505b5050905080611f0d5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f206465647563742074686520666565000000000000000060448201526064016105d9565b505b6040517f9b1597820000000000000000000000000000000000000000000000000000000081526001600160a01b03861690639b15978290611f589087908b908790600401612d8d565b5f604051808303815f87803b158015611f6f575f80fd5b505af1158015611f81573d5f803e3d5ffd5b505050505f8280519060200120905060fb5f8281526020019081526020015f20545f14611ff05760405162461bcd60e51b815260206004820152601260248201527f4475706c696361746564206d657373616765000000000000000000000000000060448201526064016105d9565b5f81815260fb602052604090204290556001600160a01b038b16336001600160a01b03167f104371f3b442861a2a7b82a070afbbaab748bb13757bf47769e170e37809ec1e8c878c8e6040516120499493929190612db4565b60405180910390a3348290038a8103908b14612100575f886001600160a01b0316826040515f6040518083038185875af1925050503d805f81146120a8576040519150601f19603f3d011682016040523d82523d5f602084013e6120ad565b606091505b50509050806120fe5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20726566756e642074686520666565000000000000000060448201526064016105d9565b505b505050505050506121116001609755565b5050505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b306001600160a01b038216036117635760405162461bcd60e51b815260206004820152601e60248201527f4d657373656e6765723a20466f7262696420746f2063616c6c2073656c66000060448201526064016105d9565b6121e1611bdd565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122163390565b6040516001600160a01b03909116815260200160405180910390a1565b61223b6123e4565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612216565b5f54610100900460ff166122e85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6122f0612436565b6122f86124ba565b61230061253e565b60c980547fffffffffffffffffffffffff000000000000000000000000000000000000000090811661dead1790915560ca80546001600160a01b03858116919093161790558116156123805760cb80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383161790555b5050565b6002609754036123d65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105d9565b6002609755565b6001609755565b60655460ff166105e25760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016105d9565b5f54610100900460ff166124b25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6105e26125c2565b5f54610100900460ff166125365760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6105e2612647565b5f54610100900460ff166125ba5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6105e26126cf565b5f54610100900460ff1661263e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6105e233612118565b5f54610100900460ff166126c35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6065805460ff19169055565b5f54610100900460ff166123dd5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b80356001600160a01b0381168114612761575f80fd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126127a2575f80fd5b813567ffffffffffffffff808211156127bd576127bd612766565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561280357612803612766565b8160405283815286602085880101111561281b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f60a0868803121561284e575f80fd5b6128578661274b565b94506128656020870161274b565b93506040860135925060608601359150608086013567ffffffffffffffff81111561288e575f80fd5b61289a88828901612793565b9150509295509295909350565b5f602082840312156128b7575f80fd5b6128c08261274b565b9392505050565b8061040081018310156128d8575f80fd5b92915050565b5f805f8061046085870312156128f2575f80fd5b8435935061290386602087016128c7565b939693955050505061042082013591610440013590565b5f6020828403121561292a575f80fd5b5035919050565b5f805f805f805f60e0888a031215612947575f80fd5b6129508861274b565b965061295e6020890161274b565b95506040880135945060608801359350608088013567ffffffffffffffff811115612987575f80fd5b6129938a828b01612793565b93505060a088013563ffffffff811681146129ac575f80fd5b91506129ba60c0890161274b565b905092959891949750929550565b5f805f805f8060a087890312156129dd575f80fd5b6129e68761274b565b955060208701359450604087013567ffffffffffffffff80821115612a09575f80fd5b818901915089601f830112612a1c575f80fd5b813581811115612a2a575f80fd5b8a6020828501011115612a3b575f80fd5b60208301965080955050505060608701359150612a5a6080880161274b565b90509295509295509295565b5f805f805f805f6104c0888a031215612a7d575f80fd5b612a868861274b565b9650612a946020890161274b565b95506040880135945060608801359350608088013567ffffffffffffffff811115612abd575f80fd5b612ac98a828b01612793565b935050612ad98960a08a016128c7565b91506104a0880135905092959891949750929550565b5f805f8060808587031215612b02575f80fd5b612b0b8561274b565b935060208501359250604085013567ffffffffffffffff811115612b2d575f80fd5b612b3987828801612793565b949793965093946060013593505050565b8015158114611763575f80fd5b5f60208284031215612b67575f80fd5b81356128c081612b4a565b5f805f60608486031215612b84575f80fd5b612b8d8461274b565b9250612b9b6020850161274b565b9150612ba96040850161274b565b90509250925092565b5f5b83811015612bcc578181015183820152602001612bb4565b50505f910152565b5f8151808452612beb816020860160208601612bb2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6128c06020830184612bd4565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612c6c575f80fd5b5051919050565b6001600160a01b038416815263ffffffff83166020820152606060408201525f612ca06060830184612bd4565b95945050505050565b84815283602082015263ffffffff83166040820152608060608201525f612cd36080830184612bd4565b9695505050505050565b5f60208284031215612ced575f80fd5b81516128c081612b4a565b5f8251612d09818460208701612bb2565b9190910192915050565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152612d4a60a0830184612bd4565b979650505050505050565b808201808211156128d8577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6001600160a01b0384168152826020820152606060408201525f612ca06060830184612bd4565b848152836020820152826040820152608060608201525f612cd36080830184612bd456fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"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\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"oldNonce\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"ReplayMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldFeeVault\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newFeeVault\",\"type\":\"address\"}],\"name\":\"UpdateFeeVault\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldMaxReplayTimes\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newMaxReplayTimes\",\"type\":\"uint256\"}],\"name\":\"UpdateMaxReplayTimes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRollup\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRollup\",\"type\":\"address\"}],\"name\":\"UpdateRollup\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"__isL1MessageDropped\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counterpart\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeVault\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finalizedWithdrawals\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeVault\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rollup\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxReplayTimes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"messageSendTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"prevReplayIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[32]\",\"name\":\"_withdrawalProof\",\"type\":\"bytes32[32]\"},{\"internalType\":\"bytes32\",\"name\":\"_withdrawalRoot\",\"type\":\"bytes32\"}],\"name\":\"proveAndRelayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_newGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"_refundAddress\",\"type\":\"address\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"replayStates\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"times\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"lastIndex\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollup\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_refundAddress\",\"type\":\"address\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newFeeVault\",\"type\":\"address\"}],\"name\":\"updateFeeVault\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newMaxReplayTimes\",\"type\":\"uint256\"}],\"name\":\"updateMaxReplayTimes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newRollup\",\"type\":\"address\"}],\"name\":\"updateRollup\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"leafHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProof\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"verifyMerkleProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x608060405234801562000010575f80fd5b506200001b62000021565b620000df565b5f54610100900460ff16156200008d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000dd575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b612a5080620000ed5f395ff3fe60806040526004361061019c575f3560e01c806386fa4b73116100dc578063c0c53b8b11610087578063e70fc93b11610062578063e70fc93b146104cf578063ea7ec514146104fa578063ecc7042814610526578063f2fde38b1461053a575f80fd5b8063c0c53b8b14610472578063cb23bcb514610491578063d87e7df1146104b0575f80fd5b8063a14238e7116100b7578063a14238e714610412578063b2267a7b14610440578063bedb86fb14610453575f80fd5b806386fa4b73146103b35780638da5cb5b146103d2578063946130d8146103ef575f80fd5b806355004105116101475780636e296e45116101225780636e296e45146102e2578063715018a614610301578063797594b014610315578063846d4d7a14610334575f80fd5b806355004105146102a55780635c975abb146102b85780635f7b1577146102cf575f80fd5b80633b70c18a116101775780633b70c18a14610230578063407c195514610267578063478222c214610286575f80fd5b806305804dd7146101af5780632a6cccb2146101f2578063340735f714610211575f80fd5b366101ab576101a9610559565b005b5f80fd5b3480156101ba575f80fd5b506101dd6101c9366004612435565b60fc6020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156101fd575f80fd5b506101a961020c366004612467565b6105ba565b34801561021c575f80fd5b506101dd61022b36600461249e565b610681565b34801561023b575f80fd5b5060fe5461024f906001600160a01b031681565b6040516001600160a01b0390911681526020016101e9565b348015610272575f80fd5b506101a9610281366004612435565b61074a565b348015610291575f80fd5b5060cb5461024f906001600160a01b031681565b6101a96102b33660046125ae565b61080d565b3480156102c3575f80fd5b5060655460ff166101dd565b6101a96102dd366004612645565b610e55565b3480156102ed575f80fd5b5060c95461024f906001600160a01b031681565b34801561030c575f80fd5b506101a9610ea9565b348015610320575f80fd5b5060ca5461024f906001600160a01b031681565b34801561033f575f80fd5b5061038a61034e366004612435565b6101006020525f90815260409020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b604080516fffffffffffffffffffffffffffffffff9384168152929091166020830152016101e9565b3480156103be575f80fd5b506101a96103cd3660046126e3565b610eba565b3480156103dd575f80fd5b506033546001600160a01b031661024f565b3480156103fa575f80fd5b5061040460ff5481565b6040519081526020016101e9565b34801561041d575f80fd5b506101dd61042c366004612435565b60fa6020525f908152604090205460ff1681565b6101a961044e36600461276c565b6113a4565b34801561045e575f80fd5b506101a961046d3660046127d4565b6113bf565b34801561047d575f80fd5b506101a961048c3660046127ef565b6113e0565b34801561049c575f80fd5b5060fd5461024f906001600160a01b031681565b3480156104bb575f80fd5b506101a96104ca366004612467565b611661565b3480156104da575f80fd5b506104046104e9366004612435565b60fb6020525f908152604090205481565b348015610505575f80fd5b50610404610514366004612435565b6101016020525f908152604090205481565b348015610531575f80fd5b50610404611757565b348015610545575f80fd5b506101a9610554366004612467565b6117e0565b6033546001600160a01b031633146105b85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6105c2610559565b6001600160a01b0381166106185760405162461bcd60e51b815260206004820152601d60248201527f6665655661756c742063616e6e6f74206265206164647265737328302900000060448201526064016105af565b60cb80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f4aadc32827849f797733838c61302f7f56d2b6db28caa175eb3f7f8e5aba25f5905f90a35050565b5f84815b602081101561073e578085901c6001166001036106eb578581602081106106ae576106ae61282f565b6020020135826040516020016106ce929190918252602082015260400190565b604051602081830303815290604052805190602001209150610736565b818682602081106106fe576106fe61282f565b602002013560405160200161071d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b600101610685565b50909114949350505050565b610752610559565b5f81116107c75760405162461bcd60e51b815260206004820152602360248201527f7265706c61792074696d6573206d75737420626520677265617465722074686160448201527f6e2030000000000000000000000000000000000000000000000000000000000060648201526084016105af565b60ff80549082905560408051828152602081018490527fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91015b60405180910390a15050565b61081561186d565b60c9546001600160a01b031661dead146108715760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105af565b60fe5460ca546001600160a01b0391821691165f6108928a8a8a8a8a6118c0565b90505f818051906020012090505f60fb5f8381526020019081526020015f2054116109255760405162461bcd60e51b815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f717565756564000000000000000000000000000000000000000000000000000060648201526084016105af565b5f81815260fc602052604090205460ff16156109835760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792064726f7070656400000000000000000060448201526064016105af565b6040517f3e4cbbe60000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116600483015263ffffffff881660248301525f9190861690633e4cbbe690604401602060405180830381865afa1580156109ef573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a13919061285c565b905080341015610a655760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e74206d73672e76616c756520666f7220666565000060448201526064016105af565b8015610b0d5760cb546040515f916001600160a01b03169083908381818185875af1925050503d805f8114610ab5576040519150601f19603f3d011682016040523d82523d5f602084013e610aba565b606091505b5050905080610b0b5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f206465647563742074686520666565000000000000000060448201526064016105af565b505b5f856001600160a01b031663fd0ad31e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6e919061285c565b6040517f9b1597820000000000000000000000000000000000000000000000000000000081529091506001600160a01b03871690639b15978290610bba9088908c9089906004016128de565b5f604051808303815f87803b158015610bd1575f80fd5b505af1158015610be3573d5f803e3d5ffd5b5050505f848152610100602090815260408083208151808301909252546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041691810182905292509003610c53575f8281526101016020526040902060018c019055610c84565b80602001516001016fffffffffffffffffffffffffffffffff166101015f8481526020019081526020015f20819055505b6fffffffffffffffffffffffffffffffff808316602083015260ff54825190911610610cf25760405162461bcd60e51b815260206004820152601b60248201527f457863656564206d6178696d756d207265706c61792074696d6573000000000060448201526064016105af565b80516fffffffffffffffffffffffffffffffff600191909101811682525f858152610100602090815260409091208351919093015182167001000000000000000000000000000000000291161790556001600160a01b038c16610d523390565b6001600160a01b03168b7fa3a1251805b1fc7915884575b42e1fb862e814f0f5c9d670d08bf84697053d618e858d8f604051610d919493929190612914565b60405180910390a434828103908314610e45575f886001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610ded576040519150601f19603f3d011682016040523d82523d5f602084013e610df2565b606091505b5050905080610e435760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20726566756e642074686520666565000000000000000060448201526064016105af565b505b5050505050505050505050505050565b610e5d61186d565b610ea1868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525088925087915061195c9050565b505050505050565b610eb1610559565b6105b85f611da8565b610ec261186d565b60c9546001600160a01b031661dead14610f1e5760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105af565b60fe546001600160a01b0390811690871603610fa25760405162461bcd60e51b815260206004820152602760248201527f4d657373656e6765723a20466f7262696420746f2063616c6c206d657373616760448201527f652071756575650000000000000000000000000000000000000000000000000060648201526084016105af565b610fab86611e11565b60c9546001600160a01b039081169088160361102f5760405162461bcd60e51b815260206004820152602160248201527f4d657373656e6765723a20496e76616c6964206d6573736167652073656e646560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016105af565b5f61103d88888888886118c0565b80516020918201205f81815260fa90925260409091205490915060ff16156110cd5760405162461bcd60e51b815260206004820152603060248201527f4d657373656e6765723a207769746864726177616c2068617320616c7265616460448201527f79206265656e2066696e616c697a65640000000000000000000000000000000060648201526084016105af565b60fd546040517f04d77215000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03909116905f9082906304d7721590602401602060405180830381865afa158015611131573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111559190612948565b9050806111ca5760405162461bcd60e51b815260206004820152602760248201527f4d657373656e6765723a207769746864726177616c526f6f74206e6f7420666960448201527f6e616c697a65640000000000000000000000000000000000000000000000000060648201526084016105af565b6111d683868987610681565b6112485760405162461bcd60e51b815260206004820152602d60248201527f4d657373656e6765723a20696e76616c6964207769746864726177616c20696e60448201527f636c7573696f6e2070726f6f660000000000000000000000000000000000000060648201526084016105af565b5060c980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038b8116919091179091556040515f918a16908990611296908990612963565b5f6040518083038185875af1925050503d805f81146112d0576040519150601f19603f3d011682016040523d82523d5f602084013e6112d5565b606091505b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561136d575f83815260fa602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555184917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611398565b60405183907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f905f90a25b50505050505050505050565b6113ac61186d565b6113b9848484843361195c565b50505050565b6113c7610559565b80156113d8576113d5611e69565b50565b6113d5611ee1565b5f54610100900460ff16158080156113fe57505f54600160ff909116105b806114175750303b15801561141757505f5460ff166001145b6114895760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105af565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156114e5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038316158061150257506001600160a01b038216155b8061151457506001600160a01b038416155b1561154b576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61156973530000000000000000000000000000000000000785611f38565b60fd80546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fe805492851692909116919091179055600360ff8190556040517fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b916115f2915f9190918252602082015260400190565b60405180910390a180156113b9575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b611669610559565b6001600160a01b0381166116e55760405162461bcd60e51b815260206004820152602360248201527f726f6c6c757020616464726573732063616e6e6f74206265206164647265737360448201527f283029000000000000000000000000000000000000000000000000000000000060648201526084016105af565b60fd80546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5272c8ad4bd643b1130291ea29bebd9b3bc583057a6e4d047eb7077039a956309101610801565b60fe54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290515f926001600160a01b03169163fd0ad31e9160048083019260209291908290030181865afa1580156117b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117db919061285c565b905090565b6117e8610559565b6001600160a01b0381166118645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105af565b6113d581611da8565b60655460ff16156105b85760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016105af565b606085858585856040516024016118db95949392919061297e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8ef1332e00000000000000000000000000000000000000000000000000000000179052905095945050505050565b611964612050565b60fe5460ca54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290516001600160a01b0393841693909216915f91849163fd0ad31e916004808201926020929091908290030181865afa1580156119d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119f4919061285c565b90505f611a04338a8a858b6118c0565b90505f6001600160a01b038516633e4cbbe6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018a9052604401602060405180830381865afa158015611a78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a9c919061285c565b9050611aa889826129c0565b341015611af75760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e74206d73672e76616c75650000000000000000000060448201526064016105af565b8015611b9f5760cb546040515f916001600160a01b03169083908381818185875af1925050503d805f8114611b47576040519150601f19603f3d011682016040523d82523d5f602084013e611b4c565b606091505b5050905080611b9d5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f206465647563742074686520666565000000000000000060448201526064016105af565b505b6040517f9b1597820000000000000000000000000000000000000000000000000000000081526001600160a01b03861690639b15978290611be89087908b9087906004016129f8565b5f604051808303815f87803b158015611bff575f80fd5b505af1158015611c11573d5f803e3d5ffd5b505050505f8280519060200120905060fb5f8281526020019081526020015f20545f14611c805760405162461bcd60e51b815260206004820152601260248201527f4475706c696361746564206d657373616765000000000000000000000000000060448201526064016105af565b5f81815260fb602052604090204290556001600160a01b038b16336001600160a01b03167f104371f3b442861a2a7b82a070afbbaab748bb13757bf47769e170e37809ec1e8c878c8e604051611cd99493929190612a1f565b60405180910390a3348290038a8103908b14611d90575f886001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611d38576040519150601f19603f3d011682016040523d82523d5f602084013e611d3d565b606091505b5050905080611d8e5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20726566756e642074686520666565000000000000000060448201526064016105af565b505b50505050505050611da16001609755565b5050505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b306001600160a01b038216036113d55760405162461bcd60e51b815260206004820152601e60248201527f4d657373656e6765723a20466f7262696420746f2063616c6c2073656c66000060448201526064016105af565b611e7161186d565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ec43390565b6040516001600160a01b03909116815260200160405180910390a1565b611ee96120b0565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611ec4565b5f54610100900460ff16611fb45760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b611fbc612102565b611fc4612186565b611fcc61220a565b60c980547fffffffffffffffffffffffff000000000000000000000000000000000000000090811661dead1790915560ca80546001600160a01b038581169190931617905581161561204c5760cb80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383161790555b5050565b6002609754036120a25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105af565b6002609755565b6001609755565b60655460ff166105b85760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016105af565b5f54610100900460ff1661217e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b6105b861228e565b5f54610100900460ff166122025760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b6105b8612313565b5f54610100900460ff166122865760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b6105b86123b9565b5f54610100900460ff1661230a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b6105b833611da8565b5f54610100900460ff1661238f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff166120a95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b5f60208284031215612445575f80fd5b5035919050565b80356001600160a01b0381168114612462575f80fd5b919050565b5f60208284031215612477575f80fd5b6124808261244c565b9392505050565b806104008101831015612498575f80fd5b92915050565b5f805f8061046085870312156124b2575f80fd5b843593506124c38660208701612487565b939693955050505061042082013591610440013590565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112612516575f80fd5b813567ffffffffffffffff80821115612531576125316124da565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612577576125776124da565b8160405283815286602085880101111561258f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a0312156125c4575f80fd5b6125cd8861244c565b96506125db6020890161244c565b95506040880135945060608801359350608088013567ffffffffffffffff811115612604575f80fd5b6126108a828b01612507565b93505060a088013563ffffffff81168114612629575f80fd5b915061263760c0890161244c565b905092959891949750929550565b5f805f805f8060a0878903121561265a575f80fd5b6126638761244c565b955060208701359450604087013567ffffffffffffffff80821115612686575f80fd5b818901915089601f830112612699575f80fd5b8135818111156126a7575f80fd5b8a60208285010111156126b8575f80fd5b602083019650809550505050606087013591506126d76080880161244c565b90509295509295509295565b5f805f805f805f6104c0888a0312156126fa575f80fd5b6127038861244c565b96506127116020890161244c565b95506040880135945060608801359350608088013567ffffffffffffffff81111561273a575f80fd5b6127468a828b01612507565b9350506127568960a08a01612487565b91506104a0880135905092959891949750929550565b5f805f806080858703121561277f575f80fd5b6127888561244c565b935060208501359250604085013567ffffffffffffffff8111156127aa575f80fd5b6127b687828801612507565b949793965093946060013593505050565b80151581146113d5575f80fd5b5f602082840312156127e4575f80fd5b8135612480816127c7565b5f805f60608486031215612801575f80fd5b61280a8461244c565b92506128186020850161244c565b91506128266040850161244c565b90509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6020828403121561286c575f80fd5b5051919050565b5f5b8381101561288d578181015183820152602001612875565b50505f910152565b5f81518084526128ac816020860160208601612873565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6001600160a01b038416815263ffffffff83166020820152606060408201525f61290b6060830184612895565b95945050505050565b84815283602082015263ffffffff83166040820152608060608201525f61293e6080830184612895565b9695505050505050565b5f60208284031215612958575f80fd5b8151612480816127c7565b5f8251612974818460208701612873565b9190910192915050565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a060808301526129b560a0830184612895565b979650505050505050565b80820180821115612498577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6001600160a01b0384168152826020820152606060408201525f61290b6060830184612895565b848152836020820152826040820152608060608201525f61293e608083018461289556fea164736f6c6343000818000a", } // L1CrossDomainMessengerABI is the input ABI used to generate the binding from. @@ -202,6 +202,37 @@ func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorRaw) Transact(opt return _L1CrossDomainMessenger.Contract.contract.Transact(opts, method, params...) } +// IsL1MessageDropped is a free data retrieval call binding the contract method 0x05804dd7. +// +// Solidity: function __isL1MessageDropped(bytes32 ) view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) IsL1MessageDropped(opts *bind.CallOpts, arg0 [32]byte) (bool, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "__isL1MessageDropped", arg0) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsL1MessageDropped is a free data retrieval call binding the contract method 0x05804dd7. +// +// Solidity: function __isL1MessageDropped(bytes32 ) view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) IsL1MessageDropped(arg0 [32]byte) (bool, error) { + return _L1CrossDomainMessenger.Contract.IsL1MessageDropped(&_L1CrossDomainMessenger.CallOpts, arg0) +} + +// IsL1MessageDropped is a free data retrieval call binding the contract method 0x05804dd7. +// +// Solidity: function __isL1MessageDropped(bytes32 ) view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) IsL1MessageDropped(arg0 [32]byte) (bool, error) { + return _L1CrossDomainMessenger.Contract.IsL1MessageDropped(&_L1CrossDomainMessenger.CallOpts, arg0) +} + // Counterpart is a free data retrieval call binding the contract method 0x797594b0. // // Solidity: function counterpart() view returns(address) @@ -295,37 +326,6 @@ func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) FinalizedWit return _L1CrossDomainMessenger.Contract.FinalizedWithdrawals(&_L1CrossDomainMessenger.CallOpts, arg0) } -// IsL1MessageDropped is a free data retrieval call binding the contract method 0xb604bf4c. -// -// Solidity: function isL1MessageDropped(bytes32 ) view returns(bool) -func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) IsL1MessageDropped(opts *bind.CallOpts, arg0 [32]byte) (bool, error) { - var out []interface{} - err := _L1CrossDomainMessenger.contract.Call(opts, &out, "isL1MessageDropped", arg0) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// IsL1MessageDropped is a free data retrieval call binding the contract method 0xb604bf4c. -// -// Solidity: function isL1MessageDropped(bytes32 ) view returns(bool) -func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) IsL1MessageDropped(arg0 [32]byte) (bool, error) { - return _L1CrossDomainMessenger.Contract.IsL1MessageDropped(&_L1CrossDomainMessenger.CallOpts, arg0) -} - -// IsL1MessageDropped is a free data retrieval call binding the contract method 0xb604bf4c. -// -// Solidity: function isL1MessageDropped(bytes32 ) view returns(bool) -func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) IsL1MessageDropped(arg0 [32]byte) (bool, error) { - return _L1CrossDomainMessenger.Contract.IsL1MessageDropped(&_L1CrossDomainMessenger.CallOpts, arg0) -} - // MaxReplayTimes is a free data retrieval call binding the contract method 0x946130d8. // // Solidity: function maxReplayTimes() view returns(uint256) @@ -681,27 +681,6 @@ func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) XDomainMessa return _L1CrossDomainMessenger.Contract.XDomainMessageSender(&_L1CrossDomainMessenger.CallOpts) } -// DropMessage is a paid mutator transaction binding the contract method 0x29907acd. -// -// Solidity: function dropMessage(address _from, address _to, uint256 _value, uint256 _messageNonce, bytes _message) returns() -func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) DropMessage(opts *bind.TransactOpts, _from common.Address, _to common.Address, _value *big.Int, _messageNonce *big.Int, _message []byte) (*types.Transaction, error) { - return _L1CrossDomainMessenger.contract.Transact(opts, "dropMessage", _from, _to, _value, _messageNonce, _message) -} - -// DropMessage is a paid mutator transaction binding the contract method 0x29907acd. -// -// Solidity: function dropMessage(address _from, address _to, uint256 _value, uint256 _messageNonce, bytes _message) returns() -func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) DropMessage(_from common.Address, _to common.Address, _value *big.Int, _messageNonce *big.Int, _message []byte) (*types.Transaction, error) { - return _L1CrossDomainMessenger.Contract.DropMessage(&_L1CrossDomainMessenger.TransactOpts, _from, _to, _value, _messageNonce, _message) -} - -// DropMessage is a paid mutator transaction binding the contract method 0x29907acd. -// -// Solidity: function dropMessage(address _from, address _to, uint256 _value, uint256 _messageNonce, bytes _message) returns() -func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) DropMessage(_from common.Address, _to common.Address, _value *big.Int, _messageNonce *big.Int, _message []byte) (*types.Transaction, error) { - return _L1CrossDomainMessenger.Contract.DropMessage(&_L1CrossDomainMessenger.TransactOpts, _from, _to, _value, _messageNonce, _message) -} - // Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b. // // Solidity: function initialize(address _feeVault, address _rollup, address _messageQueue) returns() @@ -954,150 +933,6 @@ func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) Receive( return _L1CrossDomainMessenger.Contract.Receive(&_L1CrossDomainMessenger.TransactOpts) } -// L1CrossDomainMessengerDropMessageIterator is returned from FilterDropMessage and is used to iterate over the raw logs and unpacked data for DropMessage events raised by the L1CrossDomainMessenger contract. -type L1CrossDomainMessengerDropMessageIterator struct { - Event *L1CrossDomainMessengerDropMessage // 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 *L1CrossDomainMessengerDropMessageIterator) 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(L1CrossDomainMessengerDropMessage) - 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(L1CrossDomainMessengerDropMessage) - 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 *L1CrossDomainMessengerDropMessageIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *L1CrossDomainMessengerDropMessageIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// L1CrossDomainMessengerDropMessage represents a DropMessage event raised by the L1CrossDomainMessenger contract. -type L1CrossDomainMessengerDropMessage struct { - Nonce *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDropMessage is a free log retrieval operation binding the contract event 0xbd05aabbf548001ebdd6ac80c02f1cfb3b39165f2fae1d420075f22e781ef63b. -// -// Solidity: event DropMessage(uint256 indexed nonce) -func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterDropMessage(opts *bind.FilterOpts, nonce []*big.Int) (*L1CrossDomainMessengerDropMessageIterator, error) { - - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "DropMessage", nonceRule) - if err != nil { - return nil, err - } - return &L1CrossDomainMessengerDropMessageIterator{contract: _L1CrossDomainMessenger.contract, event: "DropMessage", logs: logs, sub: sub}, nil -} - -// WatchDropMessage is a free log subscription operation binding the contract event 0xbd05aabbf548001ebdd6ac80c02f1cfb3b39165f2fae1d420075f22e781ef63b. -// -// Solidity: event DropMessage(uint256 indexed nonce) -func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchDropMessage(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerDropMessage, nonce []*big.Int) (event.Subscription, error) { - - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "DropMessage", nonceRule) - 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(L1CrossDomainMessengerDropMessage) - if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "DropMessage", 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 -} - -// ParseDropMessage is a log parse operation binding the contract event 0xbd05aabbf548001ebdd6ac80c02f1cfb3b39165f2fae1d420075f22e781ef63b. -// -// Solidity: event DropMessage(uint256 indexed nonce) -func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseDropMessage(log types.Log) (*L1CrossDomainMessengerDropMessage, error) { - event := new(L1CrossDomainMessengerDropMessage) - if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "DropMessage", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // L1CrossDomainMessengerFailedRelayedMessageIterator is returned from FilterFailedRelayedMessage and is used to iterate over the raw logs and unpacked data for FailedRelayedMessage events raised by the L1CrossDomainMessenger contract. type L1CrossDomainMessengerFailedRelayedMessageIterator struct { Event *L1CrossDomainMessengerFailedRelayedMessage // Event containing the contract specifics and raw log diff --git a/bindings/bindings/l1crossdomainmessenger_more.go b/bindings/bindings/l1crossdomainmessenger_more.go index 558c5cf3..2cd2a6c1 100644 --- a/bindings/bindings/l1crossdomainmessenger_more.go +++ b/bindings/bindings/l1crossdomainmessenger_more.go @@ -9,11 +9,11 @@ import ( "morph-l2/bindings/solc" ) -const L1CrossDomainMessengerStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1023_storage\"},{\"astId\":1003,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1022_storage\"},{\"astId\":1005,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_paused\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_bool\"},{\"astId\":1006,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_uint256)1022_storage\"},{\"astId\":1007,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_status\",\"offset\":0,\"slot\":\"151\",\"type\":\"t_uint256\"},{\"astId\":1008,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"152\",\"type\":\"t_array(t_uint256)1022_storage\"},{\"astId\":1009,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"xDomainMessageSender\",\"offset\":0,\"slot\":\"201\",\"type\":\"t_address\"},{\"astId\":1010,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"counterpart\",\"offset\":0,\"slot\":\"202\",\"type\":\"t_address\"},{\"astId\":1011,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"feeVault\",\"offset\":0,\"slot\":\"203\",\"type\":\"t_address\"},{\"astId\":1012,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"204\",\"type\":\"t_array(t_uint256)1021_storage\"},{\"astId\":1013,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"finalizedWithdrawals\",\"offset\":0,\"slot\":\"250\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1014,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"messageSendTimestamp\",\"offset\":0,\"slot\":\"251\",\"type\":\"t_mapping(t_bytes32,t_uint256)\"},{\"astId\":1015,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"isL1MessageDropped\",\"offset\":0,\"slot\":\"252\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1016,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"rollup\",\"offset\":0,\"slot\":\"253\",\"type\":\"t_address\"},{\"astId\":1017,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"messageQueue\",\"offset\":0,\"slot\":\"254\",\"type\":\"t_address\"},{\"astId\":1018,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"maxReplayTimes\",\"offset\":0,\"slot\":\"255\",\"type\":\"t_uint256\"},{\"astId\":1019,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"replayStates\",\"offset\":0,\"slot\":\"256\",\"type\":\"t_mapping(t_bytes32,t_struct(ReplayState)1024_storage)\"},{\"astId\":1020,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"prevReplayIndex\",\"offset\":0,\"slot\":\"257\",\"type\":\"t_mapping(t_uint256,t_uint256)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)1021_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[46]\",\"numberOfBytes\":\"1472\"},\"t_array(t_uint256)1022_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1023_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_mapping(t_bytes32,t_struct(ReplayState)1024_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e struct L1CrossDomainMessenger.ReplayState)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_struct(ReplayState)1024_storage\"},\"t_mapping(t_bytes32,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_uint256\"},\"t_mapping(t_uint256,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_uint256\"},\"t_struct(ReplayState)1024_storage\":{\"encoding\":\"inplace\",\"label\":\"struct L1CrossDomainMessenger.ReplayState\",\"numberOfBytes\":\"32\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" +const L1CrossDomainMessengerStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1023_storage\"},{\"astId\":1003,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1022_storage\"},{\"astId\":1005,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_paused\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_bool\"},{\"astId\":1006,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_uint256)1022_storage\"},{\"astId\":1007,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_status\",\"offset\":0,\"slot\":\"151\",\"type\":\"t_uint256\"},{\"astId\":1008,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"152\",\"type\":\"t_array(t_uint256)1022_storage\"},{\"astId\":1009,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"xDomainMessageSender\",\"offset\":0,\"slot\":\"201\",\"type\":\"t_address\"},{\"astId\":1010,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"counterpart\",\"offset\":0,\"slot\":\"202\",\"type\":\"t_address\"},{\"astId\":1011,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"feeVault\",\"offset\":0,\"slot\":\"203\",\"type\":\"t_address\"},{\"astId\":1012,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"204\",\"type\":\"t_array(t_uint256)1021_storage\"},{\"astId\":1013,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"finalizedWithdrawals\",\"offset\":0,\"slot\":\"250\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1014,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"messageSendTimestamp\",\"offset\":0,\"slot\":\"251\",\"type\":\"t_mapping(t_bytes32,t_uint256)\"},{\"astId\":1015,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__isL1MessageDropped\",\"offset\":0,\"slot\":\"252\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1016,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"rollup\",\"offset\":0,\"slot\":\"253\",\"type\":\"t_address\"},{\"astId\":1017,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"messageQueue\",\"offset\":0,\"slot\":\"254\",\"type\":\"t_address\"},{\"astId\":1018,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"maxReplayTimes\",\"offset\":0,\"slot\":\"255\",\"type\":\"t_uint256\"},{\"astId\":1019,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"replayStates\",\"offset\":0,\"slot\":\"256\",\"type\":\"t_mapping(t_bytes32,t_struct(ReplayState)1024_storage)\"},{\"astId\":1020,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"prevReplayIndex\",\"offset\":0,\"slot\":\"257\",\"type\":\"t_mapping(t_uint256,t_uint256)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)1021_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[46]\",\"numberOfBytes\":\"1472\"},\"t_array(t_uint256)1022_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1023_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_mapping(t_bytes32,t_struct(ReplayState)1024_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e struct L1CrossDomainMessenger.ReplayState)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_struct(ReplayState)1024_storage\"},\"t_mapping(t_bytes32,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_uint256\"},\"t_mapping(t_uint256,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_uint256\"},\"t_struct(ReplayState)1024_storage\":{\"encoding\":\"inplace\",\"label\":\"struct L1CrossDomainMessenger.ReplayState\",\"numberOfBytes\":\"32\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" var L1CrossDomainMessengerStorageLayout = new(solc.StorageLayout) -var L1CrossDomainMessengerDeployedBin = "0x6080604052600436106101a7575f3560e01c806386fa4b73116100e7578063c0c53b8b11610087578063e70fc93b11610062578063e70fc93b14610554578063ea7ec5141461057f578063ecc70428146105ab578063f2fde38b146105bf575f80fd5b8063c0c53b8b146104ea578063cb23bcb514610509578063d87e7df114610535575f80fd5b8063a14238e7116100c2578063a14238e71461045c578063b2267a7b1461048a578063b604bf4c1461049d578063bedb86fb146104cb575f80fd5b806386fa4b73146103f05780638da5cb5b1461040f578063946130d814610439575f80fd5b806355004105116101525780636e296e451161012d5780636e296e4514610305578063715018a614610331578063797594b014610345578063846d4d7a14610371575f80fd5b806355004105146102c85780635c975abb146102db5780635f7b1577146102f2575f80fd5b80633b70c18a116101825780633b70c18a1461022c578063407c19551461027d578063478222c21461029c575f80fd5b806329907acd146101ba5780632a6cccb2146101d9578063340735f7146101f8575f80fd5b366101b6576101b46105de565b005b5f80fd5b3480156101c5575f80fd5b506101b46101d4366004612f3a565b610666565b3480156101e4575f80fd5b506101b46101f3366004612fa7565b610a88565b348015610203575f80fd5b50610217610212366004612fde565b610b83565b60405190151581526020015b60405180910390f35b348015610237575f80fd5b5060fe546102589073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610223565b348015610288575f80fd5b506101b461029736600461301a565b610c4c565b3480156102a7575f80fd5b5060cb546102589073ffffffffffffffffffffffffffffffffffffffff1681565b6101b46102d6366004613031565b610d29565b3480156102e6575f80fd5b5060655460ff16610217565b6101b46103003660046130c8565b61149c565b348015610310575f80fd5b5060c9546102589073ffffffffffffffffffffffffffffffffffffffff1681565b34801561033c575f80fd5b506101b46114f0565b348015610350575f80fd5b5060ca546102589073ffffffffffffffffffffffffffffffffffffffff1681565b34801561037c575f80fd5b506103c761038b36600461301a565b6101006020525f90815260409020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b604080516fffffffffffffffffffffffffffffffff938416815292909116602083015201610223565b3480156103fb575f80fd5b506101b461040a366004613166565b611501565b34801561041a575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff16610258565b348015610444575f80fd5b5061044e60ff5481565b604051908152602001610223565b348015610467575f80fd5b5061021761047636600461301a565b60fa6020525f908152604090205460ff1681565b6101b46104983660046131ef565b611ac8565b3480156104a8575f80fd5b506102176104b736600461301a565b60fc6020525f908152604090205460ff1681565b3480156104d6575f80fd5b506101b46104e5366004613257565b611ae3565b3480156104f5575f80fd5b506101b4610504366004613272565b611b04565b348015610514575f80fd5b5060fd546102589073ffffffffffffffffffffffffffffffffffffffff1681565b348015610540575f80fd5b506101b461054f366004612fa7565b611dd3565b34801561055f575f80fd5b5061044e61056e36600461301a565b60fb6020525f908152604090205481565b34801561058a575f80fd5b5061044e61059936600461301a565b6101016020525f908152604090205481565b3480156105b6575f80fd5b5061044e611efd565b3480156105ca575f80fd5b506101b46105d9366004612fa7565b611f93565b60335473ffffffffffffffffffffffffffffffffffffffff163314610664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b61066e612047565b60c95473ffffffffffffffffffffffffffffffffffffffff1661dead146106f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e00604482015260640161065b565b60fe5473ffffffffffffffffffffffffffffffffffffffff165f61071887878787876120b4565b90505f818051906020012090505f60fb5f8381526020019081526020015f2054116107c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565640000000000000000000000000000000000000000000000000000606482015260840161065b565b5f81815260fc602052604090205460ff161561083d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d65737361676520616c72656164792064726f70706564000000000000000000604482015260640161065b565b5f818152610100602052604081205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169081900361087d5750845b6040517f916524610000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8516906391652461906024015f604051808303815f87803b1580156108e2575f80fd5b505af11580156108f4573d5f803e3d5ffd5b5050505f9182525061010160205260409020548015610934577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161087d565b5f82815260fc602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555187917fbd05aabbf548001ebdd6ac80c02f1cfb3b39165f2fae1d420075f22e781ef63b91a260c980547fffffffffffffffffffffffff000000000000000000000000000000000000000016736f297c61b5c92ef107ffd30cd56affe5a273e8411790556040517f14298c5100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16906314298c51908990610a2390899060040161331d565b5f604051808303818588803b158015610a3a575f80fd5b505af1158015610a4c573d5f803e3d5ffd5b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055505050505050505050505050565b610a906105de565b73ffffffffffffffffffffffffffffffffffffffff8116610b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6665655661756c742063616e6e6f742062652061646472657373283029000000604482015260640161065b565b60cb805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f4aadc32827849f797733838c61302f7f56d2b6db28caa175eb3f7f8e5aba25f5905f90a35050565b5f84815b6020811015610c40578085901c600116600103610bed57858160208110610bb057610bb061332f565b602002013582604051602001610bd0929190918252602082015260400190565b604051602081830303815290604052805190602001209150610c38565b81868260208110610c0057610c0061332f565b6020020135604051602001610c1f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b600101610b87565b50909114949350505050565b610c546105de565b5f8111610ce3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f7265706c61792074696d6573206d75737420626520677265617465722074686160448201527f6e20300000000000000000000000000000000000000000000000000000000000606482015260840161065b565b60ff80549082905560408051828152602081018490527fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91015b60405180910390a15050565b610d31612047565b60c95473ffffffffffffffffffffffffffffffffffffffff1661dead14610db4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e00604482015260640161065b565b60fe5460ca5473ffffffffffffffffffffffffffffffffffffffff91821691165f610de28a8a8a8a8a6120b4565b90505f818051906020012090505f60fb5f8381526020019081526020015f205411610e8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565640000000000000000000000000000000000000000000000000000606482015260840161065b565b5f81815260fc602052604090205460ff1615610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d65737361676520616c72656164792064726f70706564000000000000000000604482015260640161065b565b6040517f3e4cbbe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c8116600483015263ffffffff881660248301525f9190861690633e4cbbe690604401602060405180830381865afa158015610f80573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fa4919061335c565b905080341015611010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f496e73756666696369656e74206d73672e76616c756520666f72206665650000604482015260640161065b565b80156110df5760cb546040515f9173ffffffffffffffffffffffffffffffffffffffff169083908381818185875af1925050503d805f811461106d576040519150601f19603f3d011682016040523d82523d5f602084013e611072565b606091505b50509050806110dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4661696c656420746f2064656475637420746865206665650000000000000000604482015260640161065b565b505b5f8573ffffffffffffffffffffffffffffffffffffffff1663fd0ad31e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611129573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061114d919061335c565b6040517f9b15978200000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff871690639b159782906111a69088908c908990600401613373565b5f604051808303815f87803b1580156111bd575f80fd5b505af11580156111cf573d5f803e3d5ffd5b5050505f848152610100602090815260408083208151808301909252546fffffffffffffffffffffffffffffffff8082168352700100000000000000000000000000000000909104169181018290529250900361123f575f8281526101016020526040902060018c019055611270565b80602001516001016fffffffffffffffffffffffffffffffff166101015f8481526020019081526020015f20819055505b6fffffffffffffffffffffffffffffffff808316602083015260ff548251909116106112f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f457863656564206d6178696d756d207265706c61792074696d65730000000000604482015260640161065b565b80516fffffffffffffffffffffffffffffffff600191909101811682525f8581526101006020908152604090912083519190930151821670010000000000000000000000000000000002911617905573ffffffffffffffffffffffffffffffffffffffff8c166113653390565b73ffffffffffffffffffffffffffffffffffffffff168b7fa3a1251805b1fc7915884575b42e1fb862e814f0f5c9d670d08bf84697053d618e858d8f6040516113b194939291906133b6565b60405180910390a43482810390831461148c575f8873ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f811461141a576040519150601f19603f3d011682016040523d82523d5f602084013e61141f565b606091505b505090508061148a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4661696c656420746f20726566756e6420746865206665650000000000000000604482015260640161065b565b505b5050505050505050505050505050565b6114a4612047565b6114e8868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508892508791506121509050565b505050505050565b6114f86105de565b6106645f61266c565b611509612047565b60c95473ffffffffffffffffffffffffffffffffffffffff1661dead1461158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e00604482015260640161065b565b60fe5473ffffffffffffffffffffffffffffffffffffffff90811690871603611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d657373656e6765723a20466f7262696420746f2063616c6c206d657373616760448201527f6520717565756500000000000000000000000000000000000000000000000000606482015260840161065b565b611640866126e2565b60c95473ffffffffffffffffffffffffffffffffffffffff908116908816036116eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4d657373656e6765723a20496e76616c6964206d6573736167652073656e646560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161065b565b5f6116f988888888886120b4565b80516020918201205f81815260fa90925260409091205490915060ff16156117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d657373656e6765723a207769746864726177616c2068617320616c7265616460448201527f79206265656e2066696e616c697a656400000000000000000000000000000000606482015260840161065b565b60fd546040517f04d772150000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff909116905f9082906304d7721590602401602060405180830381865afa158015611814573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183891906133ea565b9050806118c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d657373656e6765723a207769746864726177616c526f6f74206e6f7420666960448201527f6e616c697a656400000000000000000000000000000000000000000000000000606482015260840161065b565b6118d383868987610b83565b61195f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4d657373656e6765723a20696e76616c6964207769746864726177616c20696e60448201527f636c7573696f6e2070726f6f6600000000000000000000000000000000000000606482015260840161065b565b5060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8b8116919091179091556040515f918a169089906119ba908990613405565b5f6040518083038185875af1925050503d805f81146119f4576040519150601f19603f3d011682016040523d82523d5f602084013e6119f9565b606091505b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015611a91575f83815260fa602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555184917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611abc565b60405183907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f905f90a25b50505050505050505050565b611ad0612047565b611add8484848433612150565b50505050565b611aeb6105de565b8015611afc57611af9612761565b50565b611af96127e6565b5f54610100900460ff1615808015611b2257505f54600160ff909116105b80611b3b5750303b158015611b3b57505f5460ff166001145b611bc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161065b565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611c23575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff83161580611c5a575073ffffffffffffffffffffffffffffffffffffffff8216155b80611c79575073ffffffffffffffffffffffffffffffffffffffff8416155b15611cb0576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cce7353000000000000000000000000000000000000078561283d565b60fd805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fe805492851692909116919091179055600360ff8190556040517fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91611d64915f9190918252602082015260400190565b60405180910390a18015611add575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b611ddb6105de565b73ffffffffffffffffffffffffffffffffffffffff8116611e7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f726f6c6c757020616464726573732063616e6e6f74206265206164647265737360448201527f2830290000000000000000000000000000000000000000000000000000000000606482015260840161065b565b60fd805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5272c8ad4bd643b1130291ea29bebd9b3bc583057a6e4d047eb7077039a956309101610d1d565b60fe54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290515f9273ffffffffffffffffffffffffffffffffffffffff169163fd0ad31e9160048083019260209291908290030181865afa158015611f6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f8e919061335c565b905090565b611f9b6105de565b73ffffffffffffffffffffffffffffffffffffffff811661203e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065b565b611af98161266c565b60655460ff1615610664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161065b565b606085858585856040516024016120cf959493929190613420565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8ef1332e00000000000000000000000000000000000000000000000000000000179052905095945050505050565b612158612989565b60fe5460ca54604080517ffd0ad31e000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff93841693909216915f91849163fd0ad31e916004808201926020929091908290030181865afa1580156121d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121f5919061335c565b90505f612205338a8a858b6120b4565b90505f73ffffffffffffffffffffffffffffffffffffffff8516633e4cbbe6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018a9052604401602060405180830381865afa158015612293573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122b7919061335c565b90506122c3898261346f565b34101561232c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e73756666696369656e74206d73672e76616c756500000000000000000000604482015260640161065b565b80156123fb5760cb546040515f9173ffffffffffffffffffffffffffffffffffffffff169083908381818185875af1925050503d805f8114612389576040519150601f19603f3d011682016040523d82523d5f602084013e61238e565b606091505b50509050806123f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4661696c656420746f2064656475637420746865206665650000000000000000604482015260640161065b565b505b6040517f9b15978200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690639b159782906124519087908b9087906004016134a7565b5f604051808303815f87803b158015612468575f80fd5b505af115801561247a573d5f803e3d5ffd5b505050505f8280519060200120905060fb5f8281526020019081526020015f20545f14612503576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4475706c696361746564206d6573736167650000000000000000000000000000604482015260640161065b565b5f81815260fb6020526040902042905573ffffffffffffffffffffffffffffffffffffffff8b163373ffffffffffffffffffffffffffffffffffffffff167f104371f3b442861a2a7b82a070afbbaab748bb13757bf47769e170e37809ec1e8c878c8e60405161257694939291906134db565b60405180910390a3348290038a8103908b14612654575f8873ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f81146125e2576040519150601f19603f3d011682016040523d82523d5f602084013e6125e7565b606091505b5050905080612652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4661696c656420746f20726566756e6420746865206665650000000000000000604482015260640161065b565b505b505050505050506126656001609755565b5050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b3073ffffffffffffffffffffffffffffffffffffffff821603611af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4d657373656e6765723a20466f7262696420746f2063616c6c2073656c660000604482015260640161065b565b612769612047565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586127bc3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6127ee612a03565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336127bc565b5f54610100900460ff166128d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161065b565b6128db612a6f565b6128e3612b0d565b6128eb612bab565b60c980547fffffffffffffffffffffffff000000000000000000000000000000000000000090811661dead1790915560ca805473ffffffffffffffffffffffffffffffffffffffff858116919093161790558116156129855760cb80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b5050565b6002609754036129f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161065b565b6002609755565b6001609755565b60655460ff16610664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161065b565b5f54610100900460ff16612b05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161065b565b610664612c49565b5f54610100900460ff16612ba3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161065b565b610664612ce8565b5f54610100900460ff16612c41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161065b565b610664612da8565b5f54610100900460ff16612cdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161065b565b6106643361266c565b5f54610100900460ff16612d7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161065b565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff166129fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161065b565b803573ffffffffffffffffffffffffffffffffffffffff81168114612e61575f80fd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112612ea2575f80fd5b813567ffffffffffffffff80821115612ebd57612ebd612e66565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612f0357612f03612e66565b81604052838152866020858801011115612f1b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f60a08688031215612f4e575f80fd5b612f5786612e3e565b9450612f6560208701612e3e565b93506040860135925060608601359150608086013567ffffffffffffffff811115612f8e575f80fd5b612f9a88828901612e93565b9150509295509295909350565b5f60208284031215612fb7575f80fd5b612fc082612e3e565b9392505050565b806104008101831015612fd8575f80fd5b92915050565b5f805f806104608587031215612ff2575f80fd5b843593506130038660208701612fc7565b939693955050505061042082013591610440013590565b5f6020828403121561302a575f80fd5b5035919050565b5f805f805f805f60e0888a031215613047575f80fd5b61305088612e3e565b965061305e60208901612e3e565b95506040880135945060608801359350608088013567ffffffffffffffff811115613087575f80fd5b6130938a828b01612e93565b93505060a088013563ffffffff811681146130ac575f80fd5b91506130ba60c08901612e3e565b905092959891949750929550565b5f805f805f8060a087890312156130dd575f80fd5b6130e687612e3e565b955060208701359450604087013567ffffffffffffffff80821115613109575f80fd5b818901915089601f83011261311c575f80fd5b81358181111561312a575f80fd5b8a602082850101111561313b575f80fd5b6020830196508095505050506060870135915061315a60808801612e3e565b90509295509295509295565b5f805f805f805f6104c0888a03121561317d575f80fd5b61318688612e3e565b965061319460208901612e3e565b95506040880135945060608801359350608088013567ffffffffffffffff8111156131bd575f80fd5b6131c98a828b01612e93565b9350506131d98960a08a01612fc7565b91506104a0880135905092959891949750929550565b5f805f8060808587031215613202575f80fd5b61320b85612e3e565b935060208501359250604085013567ffffffffffffffff81111561322d575f80fd5b61323987828801612e93565b949793965093946060013593505050565b8015158114611af9575f80fd5b5f60208284031215613267575f80fd5b8135612fc08161324a565b5f805f60608486031215613284575f80fd5b61328d84612e3e565b925061329b60208501612e3e565b91506132a960408501612e3e565b90509250925092565b5f5b838110156132cc5781810151838201526020016132b4565b50505f910152565b5f81518084526132eb8160208601602086016132b2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f612fc060208301846132d4565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6020828403121561336c575f80fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff8416815263ffffffff83166020820152606060408201525f6133ad60608301846132d4565b95945050505050565b84815283602082015263ffffffff83166040820152608060608201525f6133e060808301846132d4565b9695505050505050565b5f602082840312156133fa575f80fd5b8151612fc08161324a565b5f82516134168184602087016132b2565b9190910192915050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a0608083015261346460a08301846132d4565b979650505050505050565b80820180821115612fd8577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6133ad60608301846132d4565b848152836020820152826040820152608060608201525f6133e060808301846132d456fea164736f6c6343000818000a" +var L1CrossDomainMessengerDeployedBin = "0x60806040526004361061019c575f3560e01c806386fa4b73116100dc578063c0c53b8b11610087578063e70fc93b11610062578063e70fc93b1461052a578063ea7ec51414610555578063ecc7042814610581578063f2fde38b14610595575f80fd5b8063c0c53b8b146104c0578063cb23bcb5146104df578063d87e7df11461050b575f80fd5b8063a14238e7116100b7578063a14238e714610460578063b2267a7b1461048e578063bedb86fb146104a1575f80fd5b806386fa4b73146103f45780638da5cb5b14610413578063946130d81461043d575f80fd5b806355004105116101475780636e296e45116101225780636e296e4514610309578063715018a614610335578063797594b014610349578063846d4d7a14610375575f80fd5b806355004105146102cc5780635c975abb146102df5780635f7b1577146102f6575f80fd5b80633b70c18a116101775780633b70c18a14610230578063407c195514610281578063478222c2146102a0575f80fd5b806305804dd7146101af5780632a6cccb2146101f2578063340735f714610211575f80fd5b366101ab576101a96105b4565b005b5f80fd5b3480156101ba575f80fd5b506101dd6101c93660046129f2565b60fc6020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156101fd575f80fd5b506101a961020c366004612a31565b61063c565b34801561021c575f80fd5b506101dd61022b366004612a68565b610737565b34801561023b575f80fd5b5060fe5461025c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e9565b34801561028c575f80fd5b506101a961029b3660046129f2565b610800565b3480156102ab575f80fd5b5060cb5461025c9073ffffffffffffffffffffffffffffffffffffffff1681565b6101a96102da366004612b78565b6108dd565b3480156102ea575f80fd5b5060655460ff166101dd565b6101a9610304366004612c0f565b611050565b348015610314575f80fd5b5060c95461025c9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610340575f80fd5b506101a96110a4565b348015610354575f80fd5b5060ca5461025c9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610380575f80fd5b506103cb61038f3660046129f2565b6101006020525f90815260409020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b604080516fffffffffffffffffffffffffffffffff9384168152929091166020830152016101e9565b3480156103ff575f80fd5b506101a961040e366004612cad565b6110b5565b34801561041e575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff1661025c565b348015610448575f80fd5b5061045260ff5481565b6040519081526020016101e9565b34801561046b575f80fd5b506101dd61047a3660046129f2565b60fa6020525f908152604090205460ff1681565b6101a961049c366004612d36565b61167c565b3480156104ac575f80fd5b506101a96104bb366004612d9e565b611697565b3480156104cb575f80fd5b506101a96104da366004612db9565b6116b8565b3480156104ea575f80fd5b5060fd5461025c9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610516575f80fd5b506101a9610525366004612a31565b611987565b348015610535575f80fd5b506104526105443660046129f2565b60fb6020525f908152604090205481565b348015610560575f80fd5b5061045261056f3660046129f2565b6101016020525f908152604090205481565b34801561058c575f80fd5b50610452611ab1565b3480156105a0575f80fd5b506101a96105af366004612a31565b611b47565b60335473ffffffffffffffffffffffffffffffffffffffff16331461063a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6106446105b4565b73ffffffffffffffffffffffffffffffffffffffff81166106c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6665655661756c742063616e6e6f7420626520616464726573732830290000006044820152606401610631565b60cb805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f4aadc32827849f797733838c61302f7f56d2b6db28caa175eb3f7f8e5aba25f5905f90a35050565b5f84815b60208110156107f4578085901c6001166001036107a15785816020811061076457610764612df9565b602002013582604051602001610784929190918252602082015260400190565b6040516020818303038152906040528051906020012091506107ec565b818682602081106107b4576107b4612df9565b60200201356040516020016107d3929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60010161073b565b50909114949350505050565b6108086105b4565b5f8111610897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f7265706c61792074696d6573206d75737420626520677265617465722074686160448201527f6e203000000000000000000000000000000000000000000000000000000000006064820152608401610631565b60ff80549082905560408051828152602081018490527fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91015b60405180910390a15050565b6108e5611bfb565b60c95473ffffffffffffffffffffffffffffffffffffffff1661dead14610968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e006044820152606401610631565b60fe5460ca5473ffffffffffffffffffffffffffffffffffffffff91821691165f6109968a8a8a8a8a611c68565b90505f818051906020012090505f60fb5f8381526020019081526020015f205411610a43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f71756575656400000000000000000000000000000000000000000000000000006064820152608401610631565b5f81815260fc602052604090205460ff1615610abb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d65737361676520616c72656164792064726f707065640000000000000000006044820152606401610631565b6040517f3e4cbbe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c8116600483015263ffffffff881660248301525f9190861690633e4cbbe690604401602060405180830381865afa158015610b34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b589190612e26565b905080341015610bc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f496e73756666696369656e74206d73672e76616c756520666f722066656500006044820152606401610631565b8015610c935760cb546040515f9173ffffffffffffffffffffffffffffffffffffffff169083908381818185875af1925050503d805f8114610c21576040519150601f19603f3d011682016040523d82523d5f602084013e610c26565b606091505b5050905080610c91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4661696c656420746f20646564756374207468652066656500000000000000006044820152606401610631565b505b5f8573ffffffffffffffffffffffffffffffffffffffff1663fd0ad31e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cdd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d019190612e26565b6040517f9b15978200000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff871690639b15978290610d5a9088908c908990600401612ea8565b5f604051808303815f87803b158015610d71575f80fd5b505af1158015610d83573d5f803e3d5ffd5b5050505f848152610100602090815260408083208151808301909252546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041691810182905292509003610df3575f8281526101016020526040902060018c019055610e24565b80602001516001016fffffffffffffffffffffffffffffffff166101015f8481526020019081526020015f20819055505b6fffffffffffffffffffffffffffffffff808316602083015260ff54825190911610610eac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f457863656564206d6178696d756d207265706c61792074696d657300000000006044820152606401610631565b80516fffffffffffffffffffffffffffffffff600191909101811682525f8581526101006020908152604090912083519190930151821670010000000000000000000000000000000002911617905573ffffffffffffffffffffffffffffffffffffffff8c16610f193390565b73ffffffffffffffffffffffffffffffffffffffff168b7fa3a1251805b1fc7915884575b42e1fb862e814f0f5c9d670d08bf84697053d618e858d8f604051610f659493929190612eeb565b60405180910390a434828103908314611040575f8873ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f8114610fce576040519150601f19603f3d011682016040523d82523d5f602084013e610fd3565b606091505b505090508061103e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4661696c656420746f20726566756e64207468652066656500000000000000006044820152606401610631565b505b5050505050505050505050505050565b611058611bfb565b61109c868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250889250879150611d049050565b505050505050565b6110ac6105b4565b61063a5f612220565b6110bd611bfb565b60c95473ffffffffffffffffffffffffffffffffffffffff1661dead14611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e006044820152606401610631565b60fe5473ffffffffffffffffffffffffffffffffffffffff908116908716036111eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d657373656e6765723a20466f7262696420746f2063616c6c206d657373616760448201527f65207175657565000000000000000000000000000000000000000000000000006064820152608401610631565b6111f486612296565b60c95473ffffffffffffffffffffffffffffffffffffffff9081169088160361129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4d657373656e6765723a20496e76616c6964206d6573736167652073656e646560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610631565b5f6112ad8888888888611c68565b80516020918201205f81815260fa90925260409091205490915060ff1615611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d657373656e6765723a207769746864726177616c2068617320616c7265616460448201527f79206265656e2066696e616c697a6564000000000000000000000000000000006064820152608401610631565b60fd546040517f04d772150000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff909116905f9082906304d7721590602401602060405180830381865afa1580156113c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ec9190612f1f565b90508061147b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d657373656e6765723a207769746864726177616c526f6f74206e6f7420666960448201527f6e616c697a6564000000000000000000000000000000000000000000000000006064820152608401610631565b61148783868987610737565b611513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4d657373656e6765723a20696e76616c6964207769746864726177616c20696e60448201527f636c7573696f6e2070726f6f66000000000000000000000000000000000000006064820152608401610631565b5060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8b8116919091179091556040515f918a1690899061156e908990612f3a565b5f6040518083038185875af1925050503d805f81146115a8576040519150601f19603f3d011682016040523d82523d5f602084013e6115ad565b606091505b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015611645575f83815260fa602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555184917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611670565b60405183907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f905f90a25b50505050505050505050565b611684611bfb565b6116918484848433611d04565b50505050565b61169f6105b4565b80156116b0576116ad612315565b50565b6116ad61239a565b5f54610100900460ff16158080156116d657505f54600160ff909116105b806116ef5750303b1580156116ef57505f5460ff166001145b61177b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610631565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156117d7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8316158061180e575073ffffffffffffffffffffffffffffffffffffffff8216155b8061182d575073ffffffffffffffffffffffffffffffffffffffff8416155b15611864576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611882735300000000000000000000000000000000000007856123f1565b60fd805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fe805492851692909116919091179055600360ff8190556040517fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91611918915f9190918252602082015260400190565b60405180910390a18015611691575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b61198f6105b4565b73ffffffffffffffffffffffffffffffffffffffff8116611a32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f726f6c6c757020616464726573732063616e6e6f74206265206164647265737360448201527f28302900000000000000000000000000000000000000000000000000000000006064820152608401610631565b60fd805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5272c8ad4bd643b1130291ea29bebd9b3bc583057a6e4d047eb7077039a9563091016108d1565b60fe54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290515f9273ffffffffffffffffffffffffffffffffffffffff169163fd0ad31e9160048083019260209291908290030181865afa158015611b1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b429190612e26565b905090565b611b4f6105b4565b73ffffffffffffffffffffffffffffffffffffffff8116611bf2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610631565b6116ad81612220565b60655460ff161561063a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610631565b60608585858585604051602401611c83959493929190612f55565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8ef1332e00000000000000000000000000000000000000000000000000000000179052905095945050505050565b611d0c61253d565b60fe5460ca54604080517ffd0ad31e000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff93841693909216915f91849163fd0ad31e916004808201926020929091908290030181865afa158015611d85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611da99190612e26565b90505f611db9338a8a858b611c68565b90505f73ffffffffffffffffffffffffffffffffffffffff8516633e4cbbe6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018a9052604401602060405180830381865afa158015611e47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6b9190612e26565b9050611e778982612fa4565b341015611ee0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e73756666696369656e74206d73672e76616c7565000000000000000000006044820152606401610631565b8015611faf5760cb546040515f9173ffffffffffffffffffffffffffffffffffffffff169083908381818185875af1925050503d805f8114611f3d576040519150601f19603f3d011682016040523d82523d5f602084013e611f42565b606091505b5050905080611fad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4661696c656420746f20646564756374207468652066656500000000000000006044820152606401610631565b505b6040517f9b15978200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690639b159782906120059087908b908790600401612fdc565b5f604051808303815f87803b15801561201c575f80fd5b505af115801561202e573d5f803e3d5ffd5b505050505f8280519060200120905060fb5f8281526020019081526020015f20545f146120b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4475706c696361746564206d65737361676500000000000000000000000000006044820152606401610631565b5f81815260fb6020526040902042905573ffffffffffffffffffffffffffffffffffffffff8b163373ffffffffffffffffffffffffffffffffffffffff167f104371f3b442861a2a7b82a070afbbaab748bb13757bf47769e170e37809ec1e8c878c8e60405161212a9493929190613010565b60405180910390a3348290038a8103908b14612208575f8873ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f8114612196576040519150601f19603f3d011682016040523d82523d5f602084013e61219b565b606091505b5050905080612206576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4661696c656420746f20726566756e64207468652066656500000000000000006044820152606401610631565b505b505050505050506122196001609755565b5050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b3073ffffffffffffffffffffffffffffffffffffffff8216036116ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4d657373656e6765723a20466f7262696420746f2063616c6c2073656c6600006044820152606401610631565b61231d611bfb565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123703390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6123a26125b7565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612370565b5f54610100900460ff16612487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610631565b61248f612623565b6124976126c1565b61249f61275f565b60c980547fffffffffffffffffffffffff000000000000000000000000000000000000000090811661dead1790915560ca805473ffffffffffffffffffffffffffffffffffffffff858116919093161790558116156125395760cb80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b5050565b6002609754036125a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610631565b6002609755565b6001609755565b60655460ff1661063a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610631565b5f54610100900460ff166126b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610631565b61063a6127fd565b5f54610100900460ff16612757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610631565b61063a61289c565b5f54610100900460ff166127f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610631565b61063a61295c565b5f54610100900460ff16612893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610631565b61063a33612220565b5f54610100900460ff16612932576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610631565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff166125b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610631565b5f60208284031215612a02575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612a2c575f80fd5b919050565b5f60208284031215612a41575f80fd5b612a4a82612a09565b9392505050565b806104008101831015612a62575f80fd5b92915050565b5f805f806104608587031215612a7c575f80fd5b84359350612a8d8660208701612a51565b939693955050505061042082013591610440013590565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112612ae0575f80fd5b813567ffffffffffffffff80821115612afb57612afb612aa4565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612b4157612b41612aa4565b81604052838152866020858801011115612b59575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215612b8e575f80fd5b612b9788612a09565b9650612ba560208901612a09565b95506040880135945060608801359350608088013567ffffffffffffffff811115612bce575f80fd5b612bda8a828b01612ad1565b93505060a088013563ffffffff81168114612bf3575f80fd5b9150612c0160c08901612a09565b905092959891949750929550565b5f805f805f8060a08789031215612c24575f80fd5b612c2d87612a09565b955060208701359450604087013567ffffffffffffffff80821115612c50575f80fd5b818901915089601f830112612c63575f80fd5b813581811115612c71575f80fd5b8a6020828501011115612c82575f80fd5b60208301965080955050505060608701359150612ca160808801612a09565b90509295509295509295565b5f805f805f805f6104c0888a031215612cc4575f80fd5b612ccd88612a09565b9650612cdb60208901612a09565b95506040880135945060608801359350608088013567ffffffffffffffff811115612d04575f80fd5b612d108a828b01612ad1565b935050612d208960a08a01612a51565b91506104a0880135905092959891949750929550565b5f805f8060808587031215612d49575f80fd5b612d5285612a09565b935060208501359250604085013567ffffffffffffffff811115612d74575f80fd5b612d8087828801612ad1565b949793965093946060013593505050565b80151581146116ad575f80fd5b5f60208284031215612dae575f80fd5b8135612a4a81612d91565b5f805f60608486031215612dcb575f80fd5b612dd484612a09565b9250612de260208501612a09565b9150612df060408501612a09565b90509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612e36575f80fd5b5051919050565b5f5b83811015612e57578181015183820152602001612e3f565b50505f910152565b5f8151808452612e76816020860160208601612e3d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8416815263ffffffff83166020820152606060408201525f612ee26060830184612e5f565b95945050505050565b84815283602082015263ffffffff83166040820152608060608201525f612f156080830184612e5f565b9695505050505050565b5f60208284031215612f2f575f80fd5b8151612a4a81612d91565b5f8251612f4b818460208701612e3d565b9190910192915050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a06080830152612f9960a0830184612e5f565b979650505050505050565b80820180821115612a62577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f612ee26060830184612e5f565b848152836020820152826040820152608060608201525f612f156080830184612e5f56fea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(L1CrossDomainMessengerStorageLayoutJSON), L1CrossDomainMessengerStorageLayout); err != nil { diff --git a/bindings/bindings/l1messagequeuewithgaspriceoracle.go b/bindings/bindings/l1messagequeuewithgaspriceoracle.go index 34bda65f..fca2a862 100644 --- a/bindings/bindings/l1messagequeuewithgaspriceoracle.go +++ b/bindings/bindings/l1messagequeuewithgaspriceoracle.go @@ -31,8 +31,8 @@ var ( // L1MessageQueueWithGasPriceOracleMetaData contains all meta data concerning the L1MessageQueueWithGasPriceOracle contract. var L1MessageQueueWithGasPriceOracleMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_messenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rollup\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_enforcedTxGateway\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"name\":\"DequeueTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"DropTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"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\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"queueIndex\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"QueueTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldGateway\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newGateway\",\"type\":\"address\"}],\"name\":\"UpdateEnforcedTxGateway\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldGasOracle\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newGasOracle\",\"type\":\"address\"}],\"name\":\"UpdateGasOracle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldL2BaseFee\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newL2BaseFee\",\"type\":\"uint256\"}],\"name\":\"UpdateL2BaseFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_oldMaxGasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newMaxGasLimit\",\"type\":\"uint256\"}],\"name\":\"UpdateMaxGasLimit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldWhitelistChecker\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newWhitelistChecker\",\"type\":\"address\"}],\"name\":\"UpdateWhitelistChecker\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ENFORCED_TX_GATEWAAY\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MESSENGER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROLLUP_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"appendCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"appendEnforcedTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"calculateIntrinsicGasFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"computeTransactionHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"dropCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"estimateCrossDomainMessageFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"}],\"name\":\"getCrossDomainMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_whitelistChecker\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"}],\"name\":\"isMessageDropped\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BaseFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextCrossDomainMessageIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingQueueIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"popCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newL2BaseFee\",\"type\":\"uint256\"}],\"name\":\"setL2BaseFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newMaxGasLimit\",\"type\":\"uint256\"}],\"name\":\"updateMaxGasLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newWhitelistChecker\",\"type\":\"address\"}],\"name\":\"updateWhitelistChecker\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"whitelistChecker\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60e060405234801562000010575f80fd5b506040516200194138038062001941833981016040819052620000339162000185565b6001600160a01b03831615806200005157506001600160a01b038216155b806200006457506001600160a01b038116155b156200008357604051630ecc6fdf60e41b815260040160405180910390fd5b6200008d620000ab565b6001600160a01b0392831660805290821660a0521660c052620001cc565b5f54610100900460ff1615620001175760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161462000167575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b038116811462000180575f80fd5b919050565b5f805f6060848603121562000198575f80fd5b620001a38462000169565b9250620001b36020850162000169565b9150620001c36040850162000169565b90509250925092565b60805160a05160c05161172e620002135f395f81816103510152610bfb01525f818161024b015261040c01525f81816102c8015281816108eb0152610aa3015261172e5ff3fe608060405234801561000f575f80fd5b506004361061019a575f3560e01c80639b159782116100e8578063d5ad4a9711610093578063e172d3a11161006e578063e172d3a1146103ac578063e3176bd5146103c6578063f2fde38b146103cf578063fd0ad31e146103e2575f80fd5b8063d5ad4a9714610373578063d99bc80e14610386578063da35a26f14610399575f80fd5b8063bb7862ca116100c3578063bb7862ca14610319578063bdc6f0a014610339578063c27606771461034c575f80fd5b80639b159782146102ea578063a85006ca146102fd578063ae453cd514610306575f80fd5b80635f9cd92e116101485780638da5cb5b116101235780638da5cb5b1461029257806391652461146102b0578063927ede2d146102c3575f80fd5b80635f9cd92e1461022b578063715018a61461023e5780638770d70714610246575f80fd5b80633e6dada1116101785780633e6dada1146101ec5780635ad9945a1461020f5780635e45da2314610222575f80fd5b806329aa604b1461019e5780633c7f5283146101c45780633e4cbbe6146101d9575b5f80fd5b6101b16101ac366004611399565b6103ea565b6040519081526020015b60405180910390f35b6101d76101d23660046113b0565b610409565b005b6101b16101e73660046113f3565b61057a565b6101ff6101fa366004611399565b61062e565b60405190151581526020016101bb565b6101b161021d366004611460565b610650565b6101b160685481565b6101d76102393660046114dc565b610840565b6101d76108d5565b61026d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bb565b60335473ffffffffffffffffffffffffffffffffffffffff1661026d565b6101d76102be366004611399565b6108e8565b61026d7f000000000000000000000000000000000000000000000000000000000000000081565b6101d76102f83660046114f5565b610aa0565b6101b160675481565b6101b1610314366004611399565b610b82565b606b5461026d9073ffffffffffffffffffffffffffffffffffffffff1681565b6101d761034736600461154b565b610bf8565b61026d7f000000000000000000000000000000000000000000000000000000000000000081565b6101d7610381366004611399565b610d29565b6101d7610394366004611399565b610d6f565b6101d76103a73660046115be565b610db5565b6101b16103ba3660046115e8565b60100261520801919050565b6101b160655481565b6101d76103dd3660046114dc565b610f6e565b6066546101b1565b606681815481106103f9575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146104935760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008111156104e55760405162461bcd60e51b815260206004820152601560248201527f706f7020746f6f206d616e79206d657373616765730000000000000000000000604482015260640161048a565b81606754146105365760405162461bcd60e51b815260206004820152601460248201527f737461727420696e646578206d69736d61746368000000000000000000000000604482015260640161048a565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa1580156105e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060c9190611627565b1561061857505f610628565b606554610625908361164d565b90505b92915050565b600881901c5f90815260696020526040812054600160ff84161b161515610628565b5f607e816106fa565b5f8161066757506001919050565b5b811561067d5760089190911c90600101610668565b919050565b8060808310600181146106ba5761069884610659565b60808101835360018301925084816020036008021b83528083019250506106db565b84841516600181146106ce578483536106d3565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b6005604051018061070d60018c83610682565b905061071b60018983610682565b905061072789826106e3565b905061073560018b83610682565b9050600186146001811461079d5760388710600181146107825761075888610659565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610797565b87608001835360018301925087898437918701915b506107ae565b6107ab5f89355f1a84610682565b91505b506107b98c826106e3565b90508181035f8060388310600181146107ec576107d584610659565b60f78101600882021b8517935060010191506107f7565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b61084861100b565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108dd61100b565b6108e65f611072565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146109935760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e676572000000000000000000000000000000000000000000606482015260840161048a565b60675481106109e45760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742064726f702070656e64696e67206d6573736167650000000000604482015260640161048a565b600881901c5f90815260696020526040902054600160ff83161b1615610a4c5760405162461bcd60e51b815260206004820152601760248201527f6d65737361676520616c72656164792064726f70706564000000000000000000604482015260640161048a565b600881901c5f9081526069602052604090208054600160ff84161b1790556040518181527f43a375005206d20a83abc71722cba68c24434a8dc1f583775be7c3fde0396cbf9060200160405180910390a150565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610b4b5760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e676572000000000000000000000000000000000000000000606482015260840161048a565b610b568383836110e8565b3373111100000000000000000000000000000000111101610b7b81865f8787876111e4565b5050505050565b6066545f908210610bd55760405162461bcd60e51b815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e6765000000000000604482015260640161048a565b60668281548110610be857610be8611689565b905f5260205f2001549050919050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610ca35760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f6174657761790000000000000000000000000000000000000000000000000000606482015260840161048a565b73ffffffffffffffffffffffffffffffffffffffff86163b15610d085760405162461bcd60e51b815260206004820152600860248201527f6f6e6c7920454f41000000000000000000000000000000000000000000000000604482015260640161048a565b610d138383836110e8565b610d218686868686866111e4565b505050505050565b610d3161100b565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c5910161056e565b610d7761100b565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead366329910161056e565b5f54610100900460ff1615808015610dd357505f54600160ff909116105b80610dec5750303b158015610dec57505f5460ff166001145b610e5e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161048a565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610eba575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610ec2611295565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610f69575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610f7661100b565b73ffffffffffffffffffffffffffffffffffffffff8116610fff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161048a565b61100881611072565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108e65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048a565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6068548311156111605760405162461bcd60e51b815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d6974000000000000000000000000000000000000000000000000000000606482015260840161048a565b6010810261520801808410156111de5760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e7369632067617300000000000000000000000000606482015260840161048a565b50505050565b6066545f6111f78883888a898989610650565b606680546001810182555f919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540181905560405190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e90611283908a9087908b908b908b906116b6565b60405180910390a35050505050505050565b5f54610100900460ff166113115760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161048a565b6108e65f54610100900460ff166113905760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161048a565b6108e633611072565b5f602082840312156113a9575f80fd5b5035919050565b5f80604083850312156113c1575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff8116811461067d575f80fd5b5f8060408385031215611404575f80fd5b61140d836113d0565b946020939093013593505050565b5f8083601f84011261142b575f80fd5b50813567ffffffffffffffff811115611442575f80fd5b602083019150836020828501011115611459575f80fd5b9250929050565b5f805f805f805f60c0888a031215611476575f80fd5b61147f886113d0565b9650602088013595506040880135945061149b606089016113d0565b93506080880135925060a088013567ffffffffffffffff8111156114bd575f80fd5b6114c98a828b0161141b565b989b979a50959850939692959293505050565b5f602082840312156114ec575f80fd5b610625826113d0565b5f805f8060608587031215611508575f80fd5b611511856113d0565b935060208501359250604085013567ffffffffffffffff811115611533575f80fd5b61153f8782880161141b565b95989497509550505050565b5f805f805f8060a08789031215611560575f80fd5b611569876113d0565b9550611577602088016113d0565b94506040870135935060608701359250608087013567ffffffffffffffff8111156115a0575f80fd5b6115ac89828a0161141b565b979a9699509497509295939492505050565b5f80604083850312156115cf575f80fd5b823591506115df602084016113d0565b90509250929050565b5f80602083850312156115f9575f80fd5b823567ffffffffffffffff81111561160f575f80fd5b61161b8582860161141b565b90969095509350505050565b5f60208284031215611637575f80fd5b81518015158114611646575f80fd5b9392505050565b8082028115828204841417610628577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_messenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rollup\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_enforcedTxGateway\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"name\":\"DequeueTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"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\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"queueIndex\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"QueueTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldGateway\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newGateway\",\"type\":\"address\"}],\"name\":\"UpdateEnforcedTxGateway\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldGasOracle\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newGasOracle\",\"type\":\"address\"}],\"name\":\"UpdateGasOracle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldL2BaseFee\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newL2BaseFee\",\"type\":\"uint256\"}],\"name\":\"UpdateL2BaseFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_oldMaxGasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newMaxGasLimit\",\"type\":\"uint256\"}],\"name\":\"UpdateMaxGasLimit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldWhitelistChecker\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newWhitelistChecker\",\"type\":\"address\"}],\"name\":\"UpdateWhitelistChecker\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ENFORCED_TX_GATEWAAY\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MESSENGER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROLLUP_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"appendCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"appendEnforcedTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"calculateIntrinsicGasFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"computeTransactionHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"estimateCrossDomainMessageFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"}],\"name\":\"getCrossDomainMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_whitelistChecker\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BaseFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextCrossDomainMessageIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingQueueIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"popCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newL2BaseFee\",\"type\":\"uint256\"}],\"name\":\"setL2BaseFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newMaxGasLimit\",\"type\":\"uint256\"}],\"name\":\"updateMaxGasLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newWhitelistChecker\",\"type\":\"address\"}],\"name\":\"updateWhitelistChecker\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"whitelistChecker\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x60e060405234801562000010575f80fd5b506040516200171438038062001714833981016040819052620000339162000185565b6001600160a01b03831615806200005157506001600160a01b038216155b806200006457506001600160a01b038116155b156200008357604051630ecc6fdf60e41b815260040160405180910390fd5b6200008d620000ab565b6001600160a01b0392831660805290821660a0521660c052620001cc565b5f54610100900460ff1615620001175760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161462000167575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b038116811462000180575f80fd5b919050565b5f805f6060848603121562000198575f80fd5b620001a38462000169565b9250620001b36020850162000169565b9150620001c36040850162000169565b90509250925092565b60805160a05160c0516115086200020c5f395f818161030501526109d501525f818161021201526103c001525f818161027c015261087d01526115085ff3fe608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063a85006ca116100dd578063d99bc80e11610088578063e3176bd511610063578063e3176bd51461037a578063f2fde38b14610383578063fd0ad31e14610396575f80fd5b8063d99bc80e1461033a578063da35a26f1461034d578063e172d3a114610360575f80fd5b8063bdc6f0a0116100b8578063bdc6f0a0146102ed578063c276067714610300578063d5ad4a9714610327575f80fd5b8063a85006ca146102b1578063ae453cd5146102ba578063bb7862ca146102cd575f80fd5b80635f9cd92e1161013d5780638da5cb5b116101185780638da5cb5b14610259578063927ede2d146102775780639b1597821461029e575f80fd5b80635f9cd92e146101f2578063715018a6146102055780638770d7071461020d575f80fd5b80633e4cbbe61161016d5780633e4cbbe6146101c35780635ad9945a146101d65780635e45da23146101e9575f80fd5b806329aa604b146101885780633c7f5283146101ae575b5f80fd5b61019b610196366004611173565b61039e565b6040519081526020015b60405180910390f35b6101c16101bc36600461118a565b6103bd565b005b61019b6101d13660046111cd565b61052e565b61019b6101e436600461123a565b6105e2565b61019b60685481565b6101c16102003660046112b6565b6107d2565b6101c1610867565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a5565b60335473ffffffffffffffffffffffffffffffffffffffff16610234565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c16102ac3660046112cf565b61087a565b61019b60675481565b61019b6102c8366004611173565b61095c565b606b546102349073ffffffffffffffffffffffffffffffffffffffff1681565b6101c16102fb366004611325565b6109d2565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c1610335366004611173565b610b03565b6101c1610348366004611173565b610b49565b6101c161035b366004611398565b610b8f565b61019b61036e3660046113c2565b60100261520801919050565b61019b60655481565b6101c16103913660046112b6565b610d48565b60665461019b565b606681815481106103ad575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146104475760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008111156104995760405162461bcd60e51b815260206004820152601560248201527f706f7020746f6f206d616e79206d657373616765730000000000000000000000604482015260640161043e565b81606754146104ea5760405162461bcd60e51b815260206004820152601460248201527f737461727420696e646578206d69736d61746368000000000000000000000000604482015260640161043e565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa15801561059c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c09190611401565b156105cc57505f6105dc565b6065546105d99083611427565b90505b92915050565b5f607e8161068c565b5f816105f957506001919050565b5b811561060f5760089190911c906001016105fa565b919050565b80608083106001811461064c5761062a846105eb565b60808101835360018301925084816020036008021b835280830192505061066d565b848415166001811461066057848353610665565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b6005604051018061069f60018c83610614565b90506106ad60018983610614565b90506106b98982610675565b90506106c760018b83610614565b9050600186146001811461072f576038871060018114610714576106ea886105eb565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610729565b87608001835360018301925087898437918701915b50610740565b61073d5f89355f1a84610614565b91505b5061074b8c82610675565b90508181035f80603883106001811461077e57610767846105eb565b60f78101600882021b851793506001019150610789565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b6107da610de5565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61086f610de5565b6108785f610e4c565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146109255760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e676572000000000000000000000000000000000000000000606482015260840161043e565b610930838383610ec2565b337311110000000000000000000000000000000011110161095581865f878787610fbe565b5050505050565b6066545f9082106109af5760405162461bcd60e51b815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e6765000000000000604482015260640161043e565b606682815481106109c2576109c2611463565b905f5260205f2001549050919050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610a7d5760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f6174657761790000000000000000000000000000000000000000000000000000606482015260840161043e565b73ffffffffffffffffffffffffffffffffffffffff86163b15610ae25760405162461bcd60e51b815260206004820152600860248201527f6f6e6c7920454f41000000000000000000000000000000000000000000000000604482015260640161043e565b610aed838383610ec2565b610afb868686868686610fbe565b505050505050565b610b0b610de5565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c59101610522565b610b51610de5565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610522565b5f54610100900460ff1615808015610bad57505f54600160ff909116105b80610bc65750303b158015610bc657505f5460ff166001145b610c385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161043e565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c94575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610c9c61106f565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610d43575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610d50610de5565b73ffffffffffffffffffffffffffffffffffffffff8116610dd95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161043e565b610de281610e4c565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161043e565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115610f3a5760405162461bcd60e51b815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d6974000000000000000000000000000000000000000000000000000000606482015260840161043e565b601081026152080180841015610fb85760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e7369632067617300000000000000000000000000606482015260840161043e565b50505050565b6066545f610fd18883888a8989896105e2565b606680546001810182555f919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540181905560405190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e9061105d908a9087908b908b908b90611490565b60405180910390a35050505050505050565b5f54610100900460ff166110eb5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161043e565b6108785f54610100900460ff1661116a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161043e565b61087833610e4c565b5f60208284031215611183575f80fd5b5035919050565b5f806040838503121561119b575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff8116811461060f575f80fd5b5f80604083850312156111de575f80fd5b6111e7836111aa565b946020939093013593505050565b5f8083601f840112611205575f80fd5b50813567ffffffffffffffff81111561121c575f80fd5b602083019150836020828501011115611233575f80fd5b9250929050565b5f805f805f805f60c0888a031215611250575f80fd5b611259886111aa565b96506020880135955060408801359450611275606089016111aa565b93506080880135925060a088013567ffffffffffffffff811115611297575f80fd5b6112a38a828b016111f5565b989b979a50959850939692959293505050565b5f602082840312156112c6575f80fd5b6105d9826111aa565b5f805f80606085870312156112e2575f80fd5b6112eb856111aa565b935060208501359250604085013567ffffffffffffffff81111561130d575f80fd5b611319878288016111f5565b95989497509550505050565b5f805f805f8060a0878903121561133a575f80fd5b611343876111aa565b9550611351602088016111aa565b94506040870135935060608701359250608087013567ffffffffffffffff81111561137a575f80fd5b61138689828a016111f5565b979a9699509497509295939492505050565b5f80604083850312156113a9575f80fd5b823591506113b9602084016111aa565b90509250929050565b5f80602083850312156113d3575f80fd5b823567ffffffffffffffff8111156113e9575f80fd5b6113f5858286016111f5565b90969095509350505050565b5f60208284031215611411575f80fd5b81518015158114611420575f80fd5b9392505050565b80820281158282048414176105dc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a", } // L1MessageQueueWithGasPriceOracleABI is the input ABI used to generate the binding from. @@ -419,37 +419,6 @@ func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCallerS return _L1MessageQueueWithGasPriceOracle.Contract.GetCrossDomainMessage(&_L1MessageQueueWithGasPriceOracle.CallOpts, _queueIndex) } -// IsMessageDropped is a free data retrieval call binding the contract method 0x3e6dada1. -// -// Solidity: function isMessageDropped(uint256 _queueIndex) view returns(bool) -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCaller) IsMessageDropped(opts *bind.CallOpts, _queueIndex *big.Int) (bool, error) { - var out []interface{} - err := _L1MessageQueueWithGasPriceOracle.contract.Call(opts, &out, "isMessageDropped", _queueIndex) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// IsMessageDropped is a free data retrieval call binding the contract method 0x3e6dada1. -// -// Solidity: function isMessageDropped(uint256 _queueIndex) view returns(bool) -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleSession) IsMessageDropped(_queueIndex *big.Int) (bool, error) { - return _L1MessageQueueWithGasPriceOracle.Contract.IsMessageDropped(&_L1MessageQueueWithGasPriceOracle.CallOpts, _queueIndex) -} - -// IsMessageDropped is a free data retrieval call binding the contract method 0x3e6dada1. -// -// Solidity: function isMessageDropped(uint256 _queueIndex) view returns(bool) -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCallerSession) IsMessageDropped(_queueIndex *big.Int) (bool, error) { - return _L1MessageQueueWithGasPriceOracle.Contract.IsMessageDropped(&_L1MessageQueueWithGasPriceOracle.CallOpts, _queueIndex) -} - // L2BaseFee is a free data retrieval call binding the contract method 0xe3176bd5. // // Solidity: function l2BaseFee() view returns(uint256) @@ -709,27 +678,6 @@ func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleTransac return _L1MessageQueueWithGasPriceOracle.Contract.AppendEnforcedTransaction(&_L1MessageQueueWithGasPriceOracle.TransactOpts, _sender, _target, _value, _gasLimit, _data) } -// DropCrossDomainMessage is a paid mutator transaction binding the contract method 0x91652461. -// -// Solidity: function dropCrossDomainMessage(uint256 _index) returns() -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleTransactor) DropCrossDomainMessage(opts *bind.TransactOpts, _index *big.Int) (*types.Transaction, error) { - return _L1MessageQueueWithGasPriceOracle.contract.Transact(opts, "dropCrossDomainMessage", _index) -} - -// DropCrossDomainMessage is a paid mutator transaction binding the contract method 0x91652461. -// -// Solidity: function dropCrossDomainMessage(uint256 _index) returns() -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleSession) DropCrossDomainMessage(_index *big.Int) (*types.Transaction, error) { - return _L1MessageQueueWithGasPriceOracle.Contract.DropCrossDomainMessage(&_L1MessageQueueWithGasPriceOracle.TransactOpts, _index) -} - -// DropCrossDomainMessage is a paid mutator transaction binding the contract method 0x91652461. -// -// Solidity: function dropCrossDomainMessage(uint256 _index) returns() -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleTransactorSession) DropCrossDomainMessage(_index *big.Int) (*types.Transaction, error) { - return _L1MessageQueueWithGasPriceOracle.Contract.DropCrossDomainMessage(&_L1MessageQueueWithGasPriceOracle.TransactOpts, _index) -} - // Initialize is a paid mutator transaction binding the contract method 0xda35a26f. // // Solidity: function initialize(uint256 _maxGasLimit, address _whitelistChecker) returns() @@ -1012,140 +960,6 @@ func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleFiltere return event, nil } -// L1MessageQueueWithGasPriceOracleDropTransactionIterator is returned from FilterDropTransaction and is used to iterate over the raw logs and unpacked data for DropTransaction events raised by the L1MessageQueueWithGasPriceOracle contract. -type L1MessageQueueWithGasPriceOracleDropTransactionIterator struct { - Event *L1MessageQueueWithGasPriceOracleDropTransaction // 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 *L1MessageQueueWithGasPriceOracleDropTransactionIterator) 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(L1MessageQueueWithGasPriceOracleDropTransaction) - 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(L1MessageQueueWithGasPriceOracleDropTransaction) - 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 *L1MessageQueueWithGasPriceOracleDropTransactionIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *L1MessageQueueWithGasPriceOracleDropTransactionIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// L1MessageQueueWithGasPriceOracleDropTransaction represents a DropTransaction event raised by the L1MessageQueueWithGasPriceOracle contract. -type L1MessageQueueWithGasPriceOracleDropTransaction struct { - Index *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDropTransaction is a free log retrieval operation binding the contract event 0x43a375005206d20a83abc71722cba68c24434a8dc1f583775be7c3fde0396cbf. -// -// Solidity: event DropTransaction(uint256 index) -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleFilterer) FilterDropTransaction(opts *bind.FilterOpts) (*L1MessageQueueWithGasPriceOracleDropTransactionIterator, error) { - - logs, sub, err := _L1MessageQueueWithGasPriceOracle.contract.FilterLogs(opts, "DropTransaction") - if err != nil { - return nil, err - } - return &L1MessageQueueWithGasPriceOracleDropTransactionIterator{contract: _L1MessageQueueWithGasPriceOracle.contract, event: "DropTransaction", logs: logs, sub: sub}, nil -} - -// WatchDropTransaction is a free log subscription operation binding the contract event 0x43a375005206d20a83abc71722cba68c24434a8dc1f583775be7c3fde0396cbf. -// -// Solidity: event DropTransaction(uint256 index) -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleFilterer) WatchDropTransaction(opts *bind.WatchOpts, sink chan<- *L1MessageQueueWithGasPriceOracleDropTransaction) (event.Subscription, error) { - - logs, sub, err := _L1MessageQueueWithGasPriceOracle.contract.WatchLogs(opts, "DropTransaction") - 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(L1MessageQueueWithGasPriceOracleDropTransaction) - if err := _L1MessageQueueWithGasPriceOracle.contract.UnpackLog(event, "DropTransaction", 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 -} - -// ParseDropTransaction is a log parse operation binding the contract event 0x43a375005206d20a83abc71722cba68c24434a8dc1f583775be7c3fde0396cbf. -// -// Solidity: event DropTransaction(uint256 index) -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleFilterer) ParseDropTransaction(log types.Log) (*L1MessageQueueWithGasPriceOracleDropTransaction, error) { - event := new(L1MessageQueueWithGasPriceOracleDropTransaction) - if err := _L1MessageQueueWithGasPriceOracle.contract.UnpackLog(event, "DropTransaction", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // L1MessageQueueWithGasPriceOracleInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L1MessageQueueWithGasPriceOracle contract. type L1MessageQueueWithGasPriceOracleInitializedIterator struct { Event *L1MessageQueueWithGasPriceOracleInitialized // Event containing the contract specifics and raw log diff --git a/bindings/bindings/l1messagequeuewithgaspriceoracle_more.go b/bindings/bindings/l1messagequeuewithgaspriceoracle_more.go index a58058b8..95974e78 100644 --- a/bindings/bindings/l1messagequeuewithgaspriceoracle_more.go +++ b/bindings/bindings/l1messagequeuewithgaspriceoracle_more.go @@ -9,11 +9,11 @@ import ( "morph-l2/bindings/solc" ) -const L1MessageQueueWithGasPriceOracleStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1013_storage\"},{\"astId\":1003,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1012_storage\"},{\"astId\":1005,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"l2BaseFee\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"messageQueue\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_bytes32)dyn_storage\"},{\"astId\":1007,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"pendingQueueIndex\",\"offset\":0,\"slot\":\"103\",\"type\":\"t_uint256\"},{\"astId\":1008,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"maxGasLimit\",\"offset\":0,\"slot\":\"104\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"droppedMessageBitmap\",\"offset\":0,\"slot\":\"105\",\"type\":\"t_struct(BitMap)1014_storage\"},{\"astId\":1010,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__skippedMessageBitmap\",\"offset\":0,\"slot\":\"106\",\"type\":\"t_mapping(t_uint256,t_uint256)\"},{\"astId\":1011,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"whitelistChecker\",\"offset\":0,\"slot\":\"107\",\"type\":\"t_address\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_bytes32)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"bytes32[]\",\"numberOfBytes\":\"32\"},\"t_array(t_uint256)1012_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1013_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_uint256,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_uint256\"},\"t_struct(BitMap)1014_storage\":{\"encoding\":\"inplace\",\"label\":\"struct BitMapsUpgradeable.BitMap\",\"numberOfBytes\":\"32\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" +const L1MessageQueueWithGasPriceOracleStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1013_storage\"},{\"astId\":1003,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1012_storage\"},{\"astId\":1005,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"l2BaseFee\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"messageQueue\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_bytes32)dyn_storage\"},{\"astId\":1007,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"pendingQueueIndex\",\"offset\":0,\"slot\":\"103\",\"type\":\"t_uint256\"},{\"astId\":1008,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"maxGasLimit\",\"offset\":0,\"slot\":\"104\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__droppedMessageBitmap\",\"offset\":0,\"slot\":\"105\",\"type\":\"t_struct(BitMap)1014_storage\"},{\"astId\":1010,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__skippedMessageBitmap\",\"offset\":0,\"slot\":\"106\",\"type\":\"t_mapping(t_uint256,t_uint256)\"},{\"astId\":1011,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"whitelistChecker\",\"offset\":0,\"slot\":\"107\",\"type\":\"t_address\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_bytes32)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"bytes32[]\",\"numberOfBytes\":\"32\"},\"t_array(t_uint256)1012_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1013_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_uint256,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_uint256\"},\"t_struct(BitMap)1014_storage\":{\"encoding\":\"inplace\",\"label\":\"struct BitMapsUpgradeable.BitMap\",\"numberOfBytes\":\"32\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" var L1MessageQueueWithGasPriceOracleStorageLayout = new(solc.StorageLayout) -var L1MessageQueueWithGasPriceOracleDeployedBin = "0x608060405234801561000f575f80fd5b506004361061019a575f3560e01c80639b159782116100e8578063d5ad4a9711610093578063e172d3a11161006e578063e172d3a1146103ac578063e3176bd5146103c6578063f2fde38b146103cf578063fd0ad31e146103e2575f80fd5b8063d5ad4a9714610373578063d99bc80e14610386578063da35a26f14610399575f80fd5b8063bb7862ca116100c3578063bb7862ca14610319578063bdc6f0a014610339578063c27606771461034c575f80fd5b80639b159782146102ea578063a85006ca146102fd578063ae453cd514610306575f80fd5b80635f9cd92e116101485780638da5cb5b116101235780638da5cb5b1461029257806391652461146102b0578063927ede2d146102c3575f80fd5b80635f9cd92e1461022b578063715018a61461023e5780638770d70714610246575f80fd5b80633e6dada1116101785780633e6dada1146101ec5780635ad9945a1461020f5780635e45da2314610222575f80fd5b806329aa604b1461019e5780633c7f5283146101c45780633e4cbbe6146101d9575b5f80fd5b6101b16101ac366004611553565b6103ea565b6040519081526020015b60405180910390f35b6101d76101d236600461156a565b610409565b005b6101b16101e73660046115ad565b6105c8565b6101ff6101fa366004611553565b61067c565b60405190151581526020016101bb565b6101b161021d36600461161a565b61069e565b6101b160685481565b6101d7610239366004611696565b61088e565b6101d7610923565b61026d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bb565b60335473ffffffffffffffffffffffffffffffffffffffff1661026d565b6101d76102be366004611553565b610936565b61026d7f000000000000000000000000000000000000000000000000000000000000000081565b6101d76102f83660046116af565b610b3c565b6101b160675481565b6101b1610314366004611553565b610c38565b606b5461026d9073ffffffffffffffffffffffffffffffffffffffff1681565b6101d7610347366004611705565b610cc8565b61026d7f000000000000000000000000000000000000000000000000000000000000000081565b6101d7610381366004611553565b610e2d565b6101d7610394366004611553565b610e73565b6101d76103a7366004611778565b610eb9565b6101b16103ba3660046117a2565b60100261520801919050565b6101b160655481565b6101d76103dd366004611696565b61108c565b6066546101b1565b606681815481106103f9575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146104ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b610100811115610519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f706f7020746f6f206d616e79206d65737361676573000000000000000000000060448201526064016104a4565b8160675414610584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f737461727420696e646578206d69736d6174636800000000000000000000000060448201526064016104a4565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa158015610636573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061065a91906117e1565b1561066657505f610676565b6065546106739083611807565b90505b92915050565b600881901c5f90815260696020526040812054600160ff84161b161515610676565b5f607e81610748565b5f816106b557506001919050565b5b81156106cb5760089190911c906001016106b6565b919050565b806080831060018114610708576106e6846106a7565b60808101835360018301925084816020036008021b8352808301925050610729565b848415166001811461071c57848353610721565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b6005604051018061075b60018c836106d0565b9050610769600189836106d0565b90506107758982610731565b905061078360018b836106d0565b905060018614600181146107eb5760388710600181146107d0576107a6886106a7565b8060b701845360018401935088816020036008021b845280840193505087898437918701916107e5565b87608001835360018301925087898437918701915b506107fc565b6107f95f89355f1a846106d0565b91505b506108078c82610731565b90508181035f80603883106001811461083a57610823846106a7565b60f78101600882021b851793506001019150610845565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b610896611143565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61092b611143565b6109345f6111c4565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146109fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e67657200000000000000000000000000000000000000000060648201526084016104a4565b6067548110610a66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f63616e6e6f742064726f702070656e64696e67206d657373616765000000000060448201526064016104a4565b600881901c5f90815260696020526040902054600160ff83161b1615610ae8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6d65737361676520616c72656164792064726f7070656400000000000000000060448201526064016104a4565b600881901c5f9081526069602052604090208054600160ff84161b1790556040518181527f43a375005206d20a83abc71722cba68c24434a8dc1f583775be7c3fde0396cbf9060200160405180910390a150565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610c01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e67657200000000000000000000000000000000000000000060648201526084016104a4565b610c0c83838361123a565b3373111100000000000000000000000000000000111101610c3181865f87878761136a565b5050505050565b6066545f908210610ca5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e676500000000000060448201526064016104a4565b60668281548110610cb857610cb8611843565b905f5260205f2001549050919050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610d8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f617465776179000000000000000000000000000000000000000000000000000060648201526084016104a4565b73ffffffffffffffffffffffffffffffffffffffff86163b15610e0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6f6e6c7920454f4100000000000000000000000000000000000000000000000060448201526064016104a4565b610e1783838361123a565b610e2586868686868661136a565b505050505050565b610e35611143565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c591016105bc565b610e7b611143565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead36632991016105bc565b5f54610100900460ff1615808015610ed757505f54600160ff909116105b80610ef05750303b158015610ef057505f5460ff166001145b610f7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a4565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fd8575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610fe061141b565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015611087575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b611094611143565b73ffffffffffffffffffffffffffffffffffffffff8116611137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104a4565b611140816111c4565b50565b60335473ffffffffffffffffffffffffffffffffffffffff163314610934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104a4565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6068548311156112cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d697400000000000000000000000000000000000000000000000000000060648201526084016104a4565b601081026152080180841015611364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e736963206761730000000000000000000000000060648201526084016104a4565b50505050565b6066545f61137d8883888a89898961069e565b606680546001810182555f919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540181905560405190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e90611409908a9087908b908b908b90611870565b60405180910390a35050505050505050565b5f54610100900460ff166114b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a4565b6109345f54610100900460ff1661154a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a4565b610934336111c4565b5f60208284031215611563575f80fd5b5035919050565b5f806040838503121561157b575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff811681146106cb575f80fd5b5f80604083850312156115be575f80fd5b6115c78361158a565b946020939093013593505050565b5f8083601f8401126115e5575f80fd5b50813567ffffffffffffffff8111156115fc575f80fd5b602083019150836020828501011115611613575f80fd5b9250929050565b5f805f805f805f60c0888a031215611630575f80fd5b6116398861158a565b965060208801359550604088013594506116556060890161158a565b93506080880135925060a088013567ffffffffffffffff811115611677575f80fd5b6116838a828b016115d5565b989b979a50959850939692959293505050565b5f602082840312156116a6575f80fd5b6106738261158a565b5f805f80606085870312156116c2575f80fd5b6116cb8561158a565b935060208501359250604085013567ffffffffffffffff8111156116ed575f80fd5b6116f9878288016115d5565b95989497509550505050565b5f805f805f8060a0878903121561171a575f80fd5b6117238761158a565b95506117316020880161158a565b94506040870135935060608701359250608087013567ffffffffffffffff81111561175a575f80fd5b61176689828a016115d5565b979a9699509497509295939492505050565b5f8060408385031215611789575f80fd5b823591506117996020840161158a565b90509250929050565b5f80602083850312156117b3575f80fd5b823567ffffffffffffffff8111156117c9575f80fd5b6117d5858286016115d5565b90969095509350505050565b5f602082840312156117f1575f80fd5b81518015158114611800575f80fd5b9392505050565b8082028115828204841417610676577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a" +var L1MessageQueueWithGasPriceOracleDeployedBin = "0x608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063a85006ca116100dd578063d99bc80e11610088578063e3176bd511610063578063e3176bd51461037a578063f2fde38b14610383578063fd0ad31e14610396575f80fd5b8063d99bc80e1461033a578063da35a26f1461034d578063e172d3a114610360575f80fd5b8063bdc6f0a0116100b8578063bdc6f0a0146102ed578063c276067714610300578063d5ad4a9714610327575f80fd5b8063a85006ca146102b1578063ae453cd5146102ba578063bb7862ca146102cd575f80fd5b80635f9cd92e1161013d5780638da5cb5b116101185780638da5cb5b14610259578063927ede2d146102775780639b1597821461029e575f80fd5b80635f9cd92e146101f2578063715018a6146102055780638770d7071461020d575f80fd5b80633e4cbbe61161016d5780633e4cbbe6146101c35780635ad9945a146101d65780635e45da23146101e9575f80fd5b806329aa604b146101885780633c7f5283146101ae575b5f80fd5b61019b6101963660046112df565b61039e565b6040519081526020015b60405180910390f35b6101c16101bc3660046112f6565b6103bd565b005b61019b6101d1366004611339565b61057c565b61019b6101e43660046113a6565b610630565b61019b60685481565b6101c1610200366004611422565b610820565b6101c16108b5565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a5565b60335473ffffffffffffffffffffffffffffffffffffffff16610234565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c16102ac36600461143b565b6108c8565b61019b60675481565b61019b6102c83660046112df565b6109c4565b606b546102349073ffffffffffffffffffffffffffffffffffffffff1681565b6101c16102fb366004611491565b610a54565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c16103353660046112df565b610bb9565b6101c16103483660046112df565b610bff565b6101c161035b366004611504565b610c45565b61019b61036e36600461152e565b60100261520801919050565b61019b60655481565b6101c1610391366004611422565b610e18565b60665461019b565b606681815481106103ad575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610461576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008111156104cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f706f7020746f6f206d616e79206d6573736167657300000000000000000000006044820152606401610458565b8160675414610538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f737461727420696e646578206d69736d617463680000000000000000000000006044820152606401610458565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa1580156105ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060e919061156d565b1561061a57505f61062a565b6065546106279083611593565b90505b92915050565b5f607e816106da565b5f8161064757506001919050565b5b811561065d5760089190911c90600101610648565b919050565b80608083106001811461069a5761067884610639565b60808101835360018301925084816020036008021b83528083019250506106bb565b84841516600181146106ae578483536106b3565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b600560405101806106ed60018c83610662565b90506106fb60018983610662565b905061070789826106c3565b905061071560018b83610662565b9050600186146001811461077d5760388710600181146107625761073888610639565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610777565b87608001835360018301925087898437918701915b5061078e565b61078b5f89355f1a84610662565b91505b506107998c826106c3565b90508181035f8060388310600181146107cc576107b584610639565b60f78101600882021b8517935060010191506107d7565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b610828610ecf565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108bd610ecf565b6108c65f610f50565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161461098d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e6765720000000000000000000000000000000000000000006064820152608401610458565b610998838383610fc6565b33731111000000000000000000000000000000001111016109bd81865f8787876110f6565b5050505050565b6066545f908210610a31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e67650000000000006044820152606401610458565b60668281548110610a4457610a446115cf565b905f5260205f2001549050919050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610b19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f61746577617900000000000000000000000000000000000000000000000000006064820152608401610458565b73ffffffffffffffffffffffffffffffffffffffff86163b15610b98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6f6e6c7920454f410000000000000000000000000000000000000000000000006044820152606401610458565b610ba3838383610fc6565b610bb18686868686866110f6565b505050505050565b610bc1610ecf565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c59101610570565b610c07610ecf565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610570565b5f54610100900460ff1615808015610c6357505f54600160ff909116105b80610c7c5750303b158015610c7c57505f5460ff166001145b610d08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610458565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610d64575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610d6c6111a7565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610e13575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610e20610ecf565b73ffffffffffffffffffffffffffffffffffffffff8116610ec3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610458565b610ecc81610f50565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610458565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d69740000000000000000000000000000000000000000000000000000006064820152608401610458565b6010810261520801808410156110f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e73696320676173000000000000000000000000006064820152608401610458565b50505050565b6066545f6111098883888a898989610630565b606680546001810182555f919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540181905560405190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e90611195908a9087908b908b908b906115fc565b60405180910390a35050505050505050565b5f54610100900460ff1661123d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610458565b6108c65f54610100900460ff166112d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610458565b6108c633610f50565b5f602082840312156112ef575f80fd5b5035919050565b5f8060408385031215611307575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff8116811461065d575f80fd5b5f806040838503121561134a575f80fd5b61135383611316565b946020939093013593505050565b5f8083601f840112611371575f80fd5b50813567ffffffffffffffff811115611388575f80fd5b60208301915083602082850101111561139f575f80fd5b9250929050565b5f805f805f805f60c0888a0312156113bc575f80fd5b6113c588611316565b965060208801359550604088013594506113e160608901611316565b93506080880135925060a088013567ffffffffffffffff811115611403575f80fd5b61140f8a828b01611361565b989b979a50959850939692959293505050565b5f60208284031215611432575f80fd5b61062782611316565b5f805f806060858703121561144e575f80fd5b61145785611316565b935060208501359250604085013567ffffffffffffffff811115611479575f80fd5b61148587828801611361565b95989497509550505050565b5f805f805f8060a087890312156114a6575f80fd5b6114af87611316565b95506114bd60208801611316565b94506040870135935060608701359250608087013567ffffffffffffffff8111156114e6575f80fd5b6114f289828a01611361565b979a9699509497509295939492505050565b5f8060408385031215611515575f80fd5b8235915061152560208401611316565b90509250929050565b5f806020838503121561153f575f80fd5b823567ffffffffffffffff811115611555575f80fd5b61156185828601611361565b90969095509350505050565b5f6020828403121561157d575f80fd5b8151801515811461158c575f80fd5b9392505050565b808202811582820484141761062a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(L1MessageQueueWithGasPriceOracleStorageLayoutJSON), L1MessageQueueWithGasPriceOracleStorageLayout); err != nil { diff --git a/bindings/bindings/rollup.go b/bindings/bindings/rollup.go index 683595a8..755d06fc 100644 --- a/bindings/bindings/rollup.go +++ b/bindings/bindings/rollup.go @@ -49,7 +49,7 @@ type IRollupBatchSignatureInput struct { // RollupMetaData contains all meta data concerning the Rollup contract. var RollupMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_chainID\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorIncorrectBatchLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorNoBlockInBatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"res\",\"type\":\"string\"}],\"name\":\"ChallengeRes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ChallengeRewardClaim\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"}],\"name\":\"ChallengeState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"CommitBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"}],\"name\":\"FinalizeBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"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\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ProveRemainingClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"RevertBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateChallenger\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"UpdateFinalizationPeriodSeconds\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPercent\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPercent\",\"type\":\"uint256\"}],\"name\":\"UpdateProofRewardPercent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldWindow\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newWindow\",\"type\":\"uint256\"}],\"name\":\"UpdateProofWindow\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldVerifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newVerifier\",\"type\":\"address\"}],\"name\":\"UpdateVerifier\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"LAYER_2_CHAIN_ID\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__maxNumTxInChunk\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"addChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"batchChallengeReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchChallenged\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchChallengedSuccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchDataStore\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"originTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"finalizeTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchExist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInsideChallengeWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"_batchHash\",\"type\":\"bytes32\"}],\"name\":\"challengeState\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"challenges\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"challengeSuccess\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"finished\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimProveRemaining\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"parentBatchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blockContexts\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structIRollup.BatchDataInput\",\"name\":\"batchDataInput\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"sequencerSets\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structIRollup.BatchSignatureInput\",\"name\":\"batchSignatureInput\",\"type\":\"tuple\"}],\"name\":\"commitBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"committedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"committedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizationPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"finalizeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"finalizedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"importGenesisBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1StakingContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_prevStateRoot\",\"type\":\"bytes32\"}],\"name\":\"initialize2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"}],\"name\":\"isBatchFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"challengerAddress\",\"type\":\"address\"}],\"name\":\"isChallenger\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isChallenger\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1StakingContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastCommittedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastFinalizedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofRewardPercent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofWindow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proveRemaining\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_batchProof\",\"type\":\"bytes\"}],\"name\":\"proveState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"removeChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"revertBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revertReqIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newPeriod\",\"type\":\"uint256\"}],\"name\":\"updateFinalizePeriodSeconds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newWindow\",\"type\":\"uint256\"}],\"name\":\"updateProofWindow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newProofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"updateRewardPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newVerifier\",\"type\":\"address\"}],\"name\":\"updateVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"name\":\"withdrawalRoots\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exist\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a060405234801562000010575f80fd5b50604051620048f0380380620048f083398101604081905262000033916200010f565b6001600160401b0381166080526200004a62000051565b506200013e565b5f54610100900460ff1615620000bd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146200010d575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f6020828403121562000120575f80fd5b81516001600160401b038116811462000137575f80fd5b9392505050565b6080516147926200015e5f395f81816105ec0152613a2d01526147925ff3fe608060405260043610610306575f3560e01c8063728cdbca11610191578063b35dac4e116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd146109b1578063f2fde38b146109d0578063fb1e8b04146109ef575f80fd5b8063ddd8a3dc1461095e578063de8b30351461097d578063dff7827e1461099c575f80fd5b8063cd4edc69116100b7578063cd4edc6914610917578063ce5db8d61461092a578063d279c1911461093f575f80fd5b8063b35dac4e146108ba578063b3e0a509146108d9578063bedb86fb146108f8575f80fd5b8063a415d8dc1161013c578063abc8d68d11610117578063abc8d68d1461085b578063b31a77d314610886578063b34844251461089b575f80fd5b8063a415d8dc146107f9578063a479265d14610827578063a4f209b01461083c575f80fd5b80638f1d37761161016c5780638f1d3776146106f9578063910129d4146107a957806397fc007c146107da575f80fd5b8063728cdbca146106a457806388b1ea09146106c35780638da5cb5b146106dc575f80fd5b80632b7ac3f3116102515780635ef7a94a116101fc57806368589dfa116101d757806368589dfa146106465780636c578c1d14610671578063715018a614610690575f80fd5b80635ef7a94a1461057b5780635f77cf1d146105db5780636126729014610627575f80fd5b80634a8d544f1161022c5780634a8d544f1461053257806357e0af6c146105455780635c975abb14610564575f80fd5b80632b7ac3f3146104c75780633b70c18a146104fe5780633e001b661461051d575f80fd5b806313361101116102b157806321e2f9e01161028c57806321e2f9e0146104525780632362f03e146104715780632571098d1461049c575f80fd5b806313361101146103ee57806318463fb01461040d57806318af3b2b14610422575f80fd5b806310d44583116102e157806310d4458314610398578063116a1f42146103b7578063121dcd50146103d9575f80fd5b806304d7721514610311578063059def61146103545780630ceb678014610377575f80fd5b3661030d57005b5f80fd5b34801561031c575f80fd5b5061033f61032b3660046140a5565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561035f575f80fd5b50610369609d5481565b60405190815260200161034b565b348015610382575f80fd5b506103966103913660046140d7565b610a04565b005b3480156103a3575f80fd5b506103966103b2366004614135565b610ad6565b3480156103c2575f80fd5b5061033f6103d13660046140a5565b609d54101590565b3480156103e4575f80fd5b50610369609e5481565b3480156103f9575f80fd5b5061039661040836600461417d565b610e2f565b348015610418575f80fd5b5061036960a75481565b34801561042d575f80fd5b5061033f61043c3660046140a5565b5f90815260a26020526040902060010154421090565b34801561045d575f80fd5b5061033f61046c3660046140a5565b611326565b34801561047c575f80fd5b5061036961048b3660046140a5565b60a16020525f908152604090205481565b3480156104a7575f80fd5b506103696104b63660046140a5565b60a06020525f908152604090205481565b3480156104d2575f80fd5b50609c546104e6906001600160a01b031681565b6040516001600160a01b03909116815260200161034b565b348015610509575f80fd5b50609b546104e6906001600160a01b031681565b348015610528575f80fd5b5061036960aa5481565b6103966105403660046141bc565b611354565b348015610550575f80fd5b5061039661055f3660046140a5565b611bd7565b34801561056f575f80fd5b5060655460ff1661033f565b348015610586575f80fd5b506105bb6105953660046140a5565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161034b565b3480156105e6575f80fd5b5061060e7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161034b565b348015610632575f80fd5b506103966106413660046140a5565b611c82565b348015610651575f80fd5b506103696106603660046140a5565b60ab6020525f908152604090205481565b34801561067c575f80fd5b5061039661068b3660046140d7565b611e97565b34801561069b575f80fd5b50610396611f54565b3480156106af575f80fd5b506103966106be366004614229565b611f67565b3480156106ce575f80fd5b5060a65461033f9060ff1681565b3480156106e7575f80fd5b506033546001600160a01b03166104e6565b348015610704575f80fd5b506107656107133660046140a5565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c00161034b565b3480156107b4575f80fd5b5061033f6107c33660046140a5565b5f90815260a4602052604090206003015460ff1690565b3480156107e5575f80fd5b506103966107f43660046140d7565b6122aa565b348015610804575f80fd5b5061033f6108133660046140d7565b609f6020525f908152604090205460ff1681565b348015610832575f80fd5b5061036960995481565b348015610847575f80fd5b506103966108563660046140a5565b61238d565b348015610866575f80fd5b506103696108753660046140d7565b60a56020525f908152604090205481565b348015610891575f80fd5b5061036960a85481565b3480156108a6575f80fd5b506103966108b5366004614284565b61243d565b3480156108c5575f80fd5b506103966108d43660046140d7565b612682565b3480156108e4575f80fd5b506103966108f336600461417d565b6126db565b348015610903575f80fd5b506103966109123660046142f8565b6129dd565b610396610925366004614313565b612b38565b348015610935575f80fd5b5061036960985481565b34801561094a575f80fd5b506103966109593660046140d7565b613104565b348015610969575f80fd5b506097546104e6906001600160a01b031681565b348015610988575f80fd5b5061033f6109973660046140a5565b6131c3565b3480156109a7575f80fd5b50610369609a5481565b3480156109bc575f80fd5b506103966109cb3660046140a5565b61320d565b3480156109db575f80fd5b506103966109ea3660046140d7565b6132b0565b3480156109fa575f80fd5b5061036960a95481565b610a0c61333d565b6001600160a01b0381165f908152609f602052604090205460ff1615610a795760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609f6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610ade61333d565b5f8111610b2d5760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610a70565b5f80610b398585613397565b915091505f610b4c836001015160c01c90565b5f81815260a160205260409020549091508214610bab5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b5f60a181610bb98785614376565b81526020019081526020015f205414610c395760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610a70565b609d548111610cb05760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b610cbb600182614389565b609e555b8315610e2757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610d07816131c3565b15610d62575f81815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091610d52908490614376565b909155505060a6805460ff191690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610ddf575060a85481145b15610de9575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610cbf575b505050505050565b60a85415610e7f5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b610e876133b2565b5f80610e938484613397565b915091505f610ea6836001015160c01c90565b5f81815260a160205260409020549091508214610f055760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b610f0e81611326565b610f5a5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b610f63816131c3565b15610fb05760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003015460ff16156110115760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610a70565b5f81815260a260205260409020600101544210156110715760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610a70565b605983015160a05f611084600185614389565b81526020019081526020015f2054146110df5760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f81815260a060205260409020541561113a5760405162461bcd60e51b815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610a70565b80609d546001011461118e5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b609d819055600160a35f6111a3866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f82815260a060205260409020556111f26111e5846011015160c01c90565b600985015160c01c613405565b60a25f611200600184614389565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab91906112399084614389565b81526020019081526020015f205f905560a45f6001836112599190614389565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611302866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061134e57505f82815260a1602052604090205415155b92915050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156113c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e4919061439c565b6114305760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610a70565b60a854156114805760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b6114886133b2565b61149560208301836143b7565b60ff16156114e55760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610a70565b5f6114f360408401846143d7565b915050806115435760405162461bcd60e51b815260206004820152600e60248201527f626174636820697320656d7074790000000000000000000000000000000000006044820152606401610a70565b60608301356115945760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610a70565b60808301356115e55760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610a70565b5f806115fc6115f760208701876143d7565b613397565b915091505f61160f836001015160c01c90565b90505f60a181611620846001614376565b81526020019081526020015f20541461167b5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610a70565b609e5481146116cc5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b5f81815260a1602052604090205482146117285760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610a70565b5f81815260ab60205260409020546060870135146117885760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f611797846011015160c01c90565b90505f80806117e96117ac60408c018c6143d7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508792508891506134c29050565b600196909601959485019493840193925090505f80491561180b575f4961182d565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b60408051611f2081019091529850905060f96118588961185060208f018f6143b7565b60ff1661363f565b60c087811b60018b015285811b60098b015286901b60118a01526019890183905260608c013560598a015260808c013560798a015260a08c013560998a01526118c7896118a860208e018e6143d7565b6040516118b6929190614438565b604051809103902060b99190910152565b60d98901889052603989018290528089205f88815260a1602090815260408083209390935560ab905290812060808e0135905560a65460ff16156119345760a7545f90815260a46020526040902060020154609954429161192791614376565b6119319190614389565b90505b604051806080016040528042815260200182609854426119549190614376565b61195e9190614376565b81526020016119af8f806040019061197691906143d7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061364692505050565b81526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611a23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a479190614447565b90525f89815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e8990556097546001600160a01b031692506374fe27b791508c3590611aaf90611aa9908f018f6143d7565b5f61369d565b5f8e8060400190611ac091906143d7565b6040518663ffffffff1660e01b8152600401611ae09594939291906144a5565b602060405180830381865afa158015611afb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b1f919061439c565b611b915760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b5f86815260a16020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b611bdf61333d565b5f81118015611bf057506099548114155b611c3c5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610a70565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff16158015611ca257505f5460ff8083169116105b611d145760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611d4f5f5460ff1690565b60ff16600214611da15760405162461bcd60e51b815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610a70565b81611e145760405162461bcd60e51b815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610a70565b609e545f90815260ab6020526040902054611e3d57609e545f90815260ab602052604090208290555b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611c76565b611e9f61333d565b6001600160a01b0381165f908152609f602052604090205460ff16611f065760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610a70565b6001600160a01b0381165f818152609f60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610acb565b611f5c61333d565b611f655f6136f1565b565b5f54610100900460ff1615808015611f8557505f54600160ff909116105b80611f9e5750303b158015611f9e57505f5460ff166001145b6120105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f805460ff19166001179055801561204e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038616158061206b57506001600160a01b038516155b156120a2576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0387166120f85760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610a70565b61210061375a565b6121086137de565b609780546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a180156122a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6122b261333d565b6001600160a01b038116158015906122d85750609c546001600160a01b03828116911614155b6123245760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610a70565b609c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b61239561333d565b5f811180156123a5575060648111155b80156123b3575060a9548114155b6123ff5760405162461bcd60e51b815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610a70565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611c76565b60a8541561248d5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b6124956133b2565b5f806124a18686613397565b915091505f6124b4836001015160c01c90565b5f81815260a1602052604090205490915082146125135760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b61251c816131c3565b6125685760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a6805460ff1916905560995460029091015442916125c191614376565b11612637575f81815260a4602090815260408083206003908101805460ff1916600117905560a2835292819020909201548251808401909352600783527f54696d656f7574000000000000000000000000000000000000000000000000009183019190915261263291839190613862565b6122a1565b6126428386866139be565b6122a181336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250613b71565b61268a61333d565b60aa80545f90915561269c8282613c3d565b604080516001600160a01b0384168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611c76565b6126e361333d565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea541561275a5760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610a70565b5f806127668484613397565b915091505f612779836001015160c01c90565b90505f612787846079015190565b9050806127d65760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610a70565b600984015160c01c1561282b5760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610a70565b5f612837856019015190565b036128845760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610a70565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440146128b0856039015190565b146128fd5760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610a70565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b6129e561333d565b8015612b06576129f3613ce8565b60a65460ff1615612ac55760a7545f90815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091612a47908490614376565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a6805460ff191690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b612b0e613d42565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612ae8565b50565b335f908152609f602052604090205460ff16612b965760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610a70565b60a85415612be65760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b612bee6133b2565b60a65460ff1615612c415760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610a70565b8167ffffffffffffffff16609d5410612c9c5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a160205260409020548114612d035760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b612d168267ffffffffffffffff16611326565b612d625760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a460205260409020546801000000000000000090046001600160a01b031615612ddd5760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a260205260409020600101544210612e6d5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610a70565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ebd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ee19190614447565b341015612f305760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a4909552969096209451855492516001600160a01b031668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092179290921790556001600160a01b03168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b99763460405161308291815260200190565b60405180910390a35f609d54600161309a9190614376565b90505b609e5481116130f2578267ffffffffffffffff1681146130e0576099545f82815260a26020526040812060010180549091906130da908490614376565b90915550505b806130ea81614518565b91505061309d565b505060a6805460ff1916600117905550565b335f90815260a56020526040812054908190036131635760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610a70565b335f90815260a5602052604081205561317c8282613c3d565b816001600160a01b03167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a826040516131b791815260200190565b60405180910390a25050565b5f81815260a460205260408120546801000000000000000090046001600160a01b03161580159061134e5750505f90815260a46020526040902060030154610100900460ff161590565b61321561333d565b5f8111801561322657506098548114155b6132725760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610a70565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611c76565b6132b861333d565b6001600160a01b0381166133345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a70565b612b35816136f1565b6033546001600160a01b03163314611f655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a70565b5f805f6133a48585613d7b565b812090969095509350505050565b60655460ff1615611f655760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a70565b805f03613410575050565b8082035f5b828110156134bc5761010081840381111561342f57508083035b609b546040517f3c7f528300000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b0390911690633c7f5283906044015f604051808303815f87803b158015613492575f80fd5b505af11580156134a4573d5f803e3d5ffd5b50505050610100830192505061010081019050613415565b50505050565b60405183515f918291602087019190819084906134e0908590613de3565b90506002840193505f5b8181101561356457603c81028501805184526020908101517fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001690840152603a830192505f61353a603c8361454f565b6135449087614376565b90505f61355582603a015160f01c90565b979097019650506001016134ea565b506020850282016040525b801561362d575f61358485603a015160f01c90565b905061359283828b8b613e78565b92505f6135a3866038015160f01c90565b9050818110156135f55760405162461bcd60e51b815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d7367730000006044820152606401610a70565b50978801979690960195603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161356f565b50819003902096919550909350505050565b8082535050565b5f805f6020840190506002810191505f613661828651613de3565b90505f5b613670600183614389565b81101561368657603c9390930192600101613665565b505f613693845160c01c90565b9695505050505050565b60605f808080806136b0888a018a614653565b95509550955095509550508187106136ce5794506136ea9350505050565b8387106136e25782955050505050506136ea565b509293505050505b9392505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166137d65760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f65613f46565b5f54610100900460ff1661385a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f65613fce565b60a88390555f83815260a460205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af11580156138e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390a9190614447565b5f86815260a46020526040902060010154909150613929908290614376565b5f86815260a460209081526040808320546801000000000000000090046001600160a01b0316835260a590915281208054909190613968908490614376565b909155505060405161397b9084906146f0565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80613a0b5760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610a70565b5f613a1a846001015160c01c90565b90505f613a28856039015190565b90505f7f0000000000000000000000000000000000000000000000000000000000000000613a57876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c549091506001600160a01b0316632c09a848613b19885160f81c90565b858888866040518663ffffffff1660e01b8152600401613b3d95949392919061471c565b5f6040518083038186803b158015613b53575f80fd5b505afa158015613b65573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a954909190606490613b95908461454f565b613b9f919061474d565b9050613bab8183614389565b60aa5f828254613bbb9190614376565b90915550506001600160a01b0384165f90815260a5602052604081208054839290613be7908490614376565b9091555050604051613bfa9084906146f0565b604051908190038120906001600160a01b0386169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b8015613ce4575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613c8c576040519150601f19603f3d011682016040523d82523d5f602084013e613c91565b606091505b5050905080613ce25760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610a70565b505b5050565b613cf06133b2565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d253390565b6040516001600160a01b03909116815260200160405180910390a1565b613d4a614053565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613d25565b5f8160f98114613dcd5760405162461bcd60e51b815260206004820152601f60248201527f626174636820686561646572206c656e677468206d75737420626520323439006044820152606401610a70565b6040519150808483378082016040529250929050565b5f613def835160f01c90565b9050805f03613e2a576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613e35603c8261454f565b613e40906002614376565b821461134e576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835f03613e87575083613f3e565b609b546001600160a01b03165f5b85811015613f38576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f906001600160a01b0384169063ae453cd590602401602060405180830381865afa158015613efb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f1f9190614447565b8852506020909601956001948501949384019301613e95565b50859150505b949350505050565b5f54610100900460ff16613fc25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b6065805460ff19169055565b5f54610100900460ff1661404a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f65336136f1565b60655460ff16611f655760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610a70565b5f602082840312156140b5575f80fd5b5035919050565b80356001600160a01b03811681146140d2575f80fd5b919050565b5f602082840312156140e7575f80fd5b6136ea826140bc565b5f8083601f840112614100575f80fd5b50813567ffffffffffffffff811115614117575f80fd5b60208301915083602082850101111561412e575f80fd5b9250929050565b5f805f60408486031215614147575f80fd5b833567ffffffffffffffff81111561415d575f80fd5b614169868287016140f0565b909790965060209590950135949350505050565b5f806020838503121561418e575f80fd5b823567ffffffffffffffff8111156141a4575f80fd5b6141b0858286016140f0565b90969095509350505050565b5f80604083850312156141cd575f80fd5b823567ffffffffffffffff808211156141e4575f80fd5b9084019060c082870312156141f7575f80fd5b9092506020840135908082111561420c575f80fd5b5083016060818603121561421e575f80fd5b809150509250929050565b5f805f805f8060c0878903121561423e575f80fd5b614247876140bc565b9550614255602088016140bc565b9450614263604088016140bc565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f8060408587031215614297575f80fd5b843567ffffffffffffffff808211156142ae575f80fd5b6142ba888389016140f0565b909650945060208701359150808211156142d2575f80fd5b506142df878288016140f0565b95989497509550505050565b8015158114612b35575f80fd5b5f60208284031215614308575f80fd5b81356136ea816142eb565b5f8060408385031215614324575f80fd5b823567ffffffffffffffff8116811461433b575f80fd5b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561134e5761134e614349565b8181038181111561134e5761134e614349565b5f602082840312156143ac575f80fd5b81516136ea816142eb565b5f602082840312156143c7575f80fd5b813560ff811681146136ea575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261440a575f80fd5b83018035915067ffffffffffffffff821115614424575f80fd5b60200191503681900382131561412e575f80fd5b818382375f9101908152919050565b5f60208284031215614457575f80fd5b5051919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b818110156144ef5784516001600160a01b0316835293830193918301916001016144ca565b5050876040860152848103606086015261450a81878961445e565b9a9950505050505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361454857614548614349565b5060010190565b808202811582820484141761134e5761134e614349565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126145a2575f80fd5b8135602067ffffffffffffffff808311156145bf576145bf614566565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110848211171561460257614602614566565b6040529384526020818701810194908101925087851115614621575f80fd5b6020870191505b8482101561464857614639826140bc565b83529183019190830190614628565b979650505050505050565b5f805f805f8060c08789031215614668575f80fd5b86359550602087013567ffffffffffffffff80821115614686575f80fd5b6146928a838b01614593565b96506040890135955060608901359150808211156146ae575f80fd5b6146ba8a838b01614593565b94506080890135935060a08901359150808211156146d6575f80fd5b506146e389828a01614593565b9150509295509295509295565b5f82515f5b8181101561470f57602081860181015185830152016146f5565b505f920191825250919050565b858152846020820152608060408201525f61473b60808301858761445e565b90508260608301529695505050505050565b5f82614780577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a", + Bin: "0x60a060405234801562000010575f80fd5b506040516200493f3803806200493f83398101604081905262000033916200010f565b6001600160401b0381166080526200004a62000051565b506200013e565b5f54610100900460ff1615620000bd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146200010d575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f6020828403121562000120575f80fd5b81516001600160401b038116811462000137575f80fd5b9392505050565b6080516147e16200015e5f395f81816105ec0152613a7b01526147e15ff3fe608060405260043610610306575f3560e01c8063728cdbca11610191578063b35dac4e116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd146109b1578063f2fde38b146109d0578063fb1e8b04146109ef575f80fd5b8063ddd8a3dc1461095e578063de8b30351461097d578063dff7827e1461099c575f80fd5b8063cd4edc69116100b7578063cd4edc6914610917578063ce5db8d61461092a578063d279c1911461093f575f80fd5b8063b35dac4e146108ba578063b3e0a509146108d9578063bedb86fb146108f8575f80fd5b8063a415d8dc1161013c578063abc8d68d11610117578063abc8d68d1461085b578063b31a77d314610886578063b34844251461089b575f80fd5b8063a415d8dc146107f9578063a479265d14610827578063a4f209b01461083c575f80fd5b80638f1d37761161016c5780638f1d3776146106f9578063910129d4146107a957806397fc007c146107da575f80fd5b8063728cdbca146106a457806388b1ea09146106c35780638da5cb5b146106dc575f80fd5b80632b7ac3f3116102515780635ef7a94a116101fc57806368589dfa116101d757806368589dfa146106465780636c578c1d14610671578063715018a614610690575f80fd5b80635ef7a94a1461057b5780635f77cf1d146105db5780636126729014610627575f80fd5b80634a8d544f1161022c5780634a8d544f1461053257806357e0af6c146105455780635c975abb14610564575f80fd5b80632b7ac3f3146104c75780633b70c18a146104fe5780633e001b661461051d575f80fd5b806313361101116102b157806321e2f9e01161028c57806321e2f9e0146104525780632362f03e146104715780632571098d1461049c575f80fd5b806313361101146103ee57806318463fb01461040d57806318af3b2b14610422575f80fd5b806310d44583116102e157806310d4458314610398578063116a1f42146103b7578063121dcd50146103d9575f80fd5b806304d7721514610311578063059def61146103545780630ceb678014610377575f80fd5b3661030d57005b5f80fd5b34801561031c575f80fd5b5061033f61032b3660046140f4565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561035f575f80fd5b50610369609d5481565b60405190815260200161034b565b348015610382575f80fd5b50610396610391366004614126565b610a04565b005b3480156103a3575f80fd5b506103966103b2366004614184565b610ad6565b3480156103c2575f80fd5b5061033f6103d13660046140f4565b609d54101590565b3480156103e4575f80fd5b50610369609e5481565b3480156103f9575f80fd5b506103966104083660046141cc565b610e2f565b348015610418575f80fd5b5061036960a75481565b34801561042d575f80fd5b5061033f61043c3660046140f4565b5f90815260a26020526040902060010154421090565b34801561045d575f80fd5b5061033f61046c3660046140f4565b611326565b34801561047c575f80fd5b5061036961048b3660046140f4565b60a16020525f908152604090205481565b3480156104a7575f80fd5b506103696104b63660046140f4565b60a06020525f908152604090205481565b3480156104d2575f80fd5b50609c546104e6906001600160a01b031681565b6040516001600160a01b03909116815260200161034b565b348015610509575f80fd5b50609b546104e6906001600160a01b031681565b348015610528575f80fd5b5061036960aa5481565b61039661054036600461420b565b611354565b348015610550575f80fd5b5061039661055f3660046140f4565b611bd7565b34801561056f575f80fd5b5060655460ff1661033f565b348015610586575f80fd5b506105bb6105953660046140f4565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161034b565b3480156105e6575f80fd5b5061060e7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161034b565b348015610632575f80fd5b506103966106413660046140f4565b611c82565b348015610651575f80fd5b506103696106603660046140f4565b60ab6020525f908152604090205481565b34801561067c575f80fd5b5061039661068b366004614126565b611e97565b34801561069b575f80fd5b50610396611f54565b3480156106af575f80fd5b506103966106be366004614278565b611f67565b3480156106ce575f80fd5b5060a65461033f9060ff1681565b3480156106e7575f80fd5b506033546001600160a01b03166104e6565b348015610704575f80fd5b506107656107133660046140f4565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c00161034b565b3480156107b4575f80fd5b5061033f6107c33660046140f4565b5f90815260a4602052604090206003015460ff1690565b3480156107e5575f80fd5b506103966107f4366004614126565b6122aa565b348015610804575f80fd5b5061033f610813366004614126565b609f6020525f908152604090205460ff1681565b348015610832575f80fd5b5061036960995481565b348015610847575f80fd5b506103966108563660046140f4565b61238d565b348015610866575f80fd5b50610369610875366004614126565b60a56020525f908152604090205481565b348015610891575f80fd5b5061036960a85481565b3480156108a6575f80fd5b506103966108b53660046142d3565b61243d565b3480156108c5575f80fd5b506103966108d4366004614126565b612682565b3480156108e4575f80fd5b506103966108f33660046141cc565b6126db565b348015610903575f80fd5b50610396610912366004614347565b612a2b565b610396610925366004614362565b612b86565b348015610935575f80fd5b5061036960985481565b34801561094a575f80fd5b50610396610959366004614126565b613152565b348015610969575f80fd5b506097546104e6906001600160a01b031681565b348015610988575f80fd5b5061033f6109973660046140f4565b613211565b3480156109a7575f80fd5b50610369609a5481565b3480156109bc575f80fd5b506103966109cb3660046140f4565b61325b565b3480156109db575f80fd5b506103966109ea366004614126565b6132fe565b3480156109fa575f80fd5b5061036960a95481565b610a0c61338b565b6001600160a01b0381165f908152609f602052604090205460ff1615610a795760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609f6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610ade61338b565b5f8111610b2d5760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610a70565b5f80610b3985856133e5565b915091505f610b4c836001015160c01c90565b5f81815260a160205260409020549091508214610bab5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b5f60a181610bb987856143c5565b81526020019081526020015f205414610c395760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610a70565b609d548111610cb05760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b610cbb6001826143d8565b609e555b8315610e2757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610d0781613211565b15610d62575f81815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091610d529084906143c5565b909155505060a6805460ff191690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610ddf575060a85481145b15610de9575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610cbf575b505050505050565b60a85415610e7f5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b610e87613400565b5f80610e9384846133e5565b915091505f610ea6836001015160c01c90565b5f81815260a160205260409020549091508214610f055760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b610f0e81611326565b610f5a5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b610f6381613211565b15610fb05760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003015460ff16156110115760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610a70565b5f81815260a260205260409020600101544210156110715760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610a70565b605983015160a05f6110846001856143d8565b81526020019081526020015f2054146110df5760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f81815260a060205260409020541561113a5760405162461bcd60e51b815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610a70565b80609d546001011461118e5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b609d819055600160a35f6111a3866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f82815260a060205260409020556111f26111e5846011015160c01c90565b600985015160c01c613453565b60a25f6112006001846143d8565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab919061123990846143d8565b81526020019081526020015f205f905560a45f60018361125991906143d8565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611302866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061134e57505f82815260a1602052604090205415155b92915050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156113c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e491906143eb565b6114305760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610a70565b60a854156114805760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b611488613400565b6114956020830183614406565b60ff16156114e55760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610a70565b5f6114f36040840184614426565b915050806115435760405162461bcd60e51b815260206004820152600e60248201527f626174636820697320656d7074790000000000000000000000000000000000006044820152606401610a70565b60608301356115945760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610a70565b60808301356115e55760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610a70565b5f806115fc6115f76020870187614426565b6133e5565b915091505f61160f836001015160c01c90565b90505f60a1816116208460016143c5565b81526020019081526020015f20541461167b5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610a70565b609e5481146116cc5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b5f81815260a1602052604090205482146117285760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610a70565b5f81815260ab60205260409020546060870135146117885760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f611797846011015160c01c90565b90505f80806117e96117ac60408c018c614426565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508792508891506135109050565b600196909601959485019493840193925090505f80491561180b575f4961182d565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b60408051611f2081019091529850905060f96118588961185060208f018f614406565b60ff1661368d565b60c087811b60018b015285811b60098b015286901b60118a01526019890183905260608c013560598a015260808c013560798a015260a08c013560998a01526118c7896118a860208e018e614426565b6040516118b6929190614487565b604051809103902060b99190910152565b60d98901889052603989018290528089205f88815260a1602090815260408083209390935560ab905290812060808e0135905560a65460ff16156119345760a7545f90815260a460205260409020600201546099544291611927916143c5565b61193191906143d8565b90505b6040518060800160405280428152602001826098544261195491906143c5565b61195e91906143c5565b81526020016119af8f80604001906119769190614426565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061369492505050565b81526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611a23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a479190614496565b90525f89815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e8990556097546001600160a01b031692506374fe27b791508c3590611aaf90611aa9908f018f614426565b5f6136eb565b5f8e8060400190611ac09190614426565b6040518663ffffffff1660e01b8152600401611ae09594939291906144f4565b602060405180830381865afa158015611afb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b1f91906143eb565b611b915760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b5f86815260a16020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b611bdf61338b565b5f81118015611bf057506099548114155b611c3c5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610a70565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff16158015611ca257505f5460ff8083169116105b611d145760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611d4f5f5460ff1690565b60ff16600214611da15760405162461bcd60e51b815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610a70565b81611e145760405162461bcd60e51b815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610a70565b609e545f90815260ab6020526040902054611e3d57609e545f90815260ab602052604090208290555b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611c76565b611e9f61338b565b6001600160a01b0381165f908152609f602052604090205460ff16611f065760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610a70565b6001600160a01b0381165f818152609f60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610acb565b611f5c61338b565b611f655f61373f565b565b5f54610100900460ff1615808015611f8557505f54600160ff909116105b80611f9e5750303b158015611f9e57505f5460ff166001145b6120105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f805460ff19166001179055801561204e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038616158061206b57506001600160a01b038516155b156120a2576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0387166120f85760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610a70565b6121006137a8565b61210861382c565b609780546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a180156122a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6122b261338b565b6001600160a01b038116158015906122d85750609c546001600160a01b03828116911614155b6123245760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610a70565b609c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b61239561338b565b5f811180156123a5575060648111155b80156123b3575060a9548114155b6123ff5760405162461bcd60e51b815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610a70565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611c76565b60a8541561248d5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b612495613400565b5f806124a186866133e5565b915091505f6124b4836001015160c01c90565b5f81815260a1602052604090205490915082146125135760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b61251c81613211565b6125685760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a6805460ff1916905560995460029091015442916125c1916143c5565b11612637575f81815260a4602090815260408083206003908101805460ff1916600117905560a2835292819020909201548251808401909352600783527f54696d656f75740000000000000000000000000000000000000000000000000091830191909152612632918391906138b0565b6122a1565b612642838686613a0c565b6122a181336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250613bbf565b61268a61338b565b60aa80545f90915561269c8282613c8b565b604080516001600160a01b0384168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611c76565b6126e361338b565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea541561275a5760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610a70565b5f8061276684846133e5565b915091505f612779836001015160c01c90565b905080156127c95760405162461bcd60e51b815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610a70565b5f6127d5846079015190565b9050806128245760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610a70565b600984015160c01c156128795760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610a70565b5f612885856019015190565b036128d25760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610a70565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440146128fe856039015190565b1461294b5760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610a70565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b612a3361338b565b8015612b5457612a41613d36565b60a65460ff1615612b135760a7545f90815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091612a959084906143c5565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a6805460ff191690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b612b5c613d90565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612b36565b50565b335f908152609f602052604090205460ff16612be45760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610a70565b60a85415612c345760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b612c3c613400565b60a65460ff1615612c8f5760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610a70565b8167ffffffffffffffff16609d5410612cea5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a160205260409020548114612d515760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b612d648267ffffffffffffffff16611326565b612db05760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a460205260409020546801000000000000000090046001600160a01b031615612e2b5760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a260205260409020600101544210612ebb5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610a70565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f2f9190614496565b341015612f7e5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a4909552969096209451855492516001600160a01b031668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092179290921790556001600160a01b03168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b9976346040516130d091815260200190565b60405180910390a35f609d5460016130e891906143c5565b90505b609e548111613140578267ffffffffffffffff16811461312e576099545f82815260a26020526040812060010180549091906131289084906143c5565b90915550505b8061313881614567565b9150506130eb565b505060a6805460ff1916600117905550565b335f90815260a56020526040812054908190036131b15760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610a70565b335f90815260a560205260408120556131ca8282613c8b565b816001600160a01b03167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a8260405161320591815260200190565b60405180910390a25050565b5f81815260a460205260408120546801000000000000000090046001600160a01b03161580159061134e5750505f90815260a46020526040902060030154610100900460ff161590565b61326361338b565b5f8111801561327457506098548114155b6132c05760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610a70565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611c76565b61330661338b565b6001600160a01b0381166133825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a70565b612b838161373f565b6033546001600160a01b03163314611f655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a70565b5f805f6133f28585613dc9565b812090969095509350505050565b60655460ff1615611f655760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a70565b805f0361345e575050565b8082035f5b8281101561350a5761010081840381111561347d57508083035b609b546040517f3c7f528300000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b0390911690633c7f5283906044015f604051808303815f87803b1580156134e0575f80fd5b505af11580156134f2573d5f803e3d5ffd5b50505050610100830192505061010081019050613463565b50505050565b60405183515f9182916020870191908190849061352e908590613e32565b90506002840193505f5b818110156135b257603c81028501805184526020908101517fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001690840152603a830192505f613588603c8361459e565b61359290876143c5565b90505f6135a382603a015160f01c90565b97909701965050600101613538565b506020850282016040525b801561367b575f6135d285603a015160f01c90565b90506135e083828b8b613ec7565b92505f6135f1866038015160f01c90565b9050818110156136435760405162461bcd60e51b815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d7367730000006044820152606401610a70565b50978801979690960195603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016135bd565b50819003902096919550909350505050565b8082535050565b5f805f6020840190506002810191505f6136af828651613e32565b90505f5b6136be6001836143d8565b8110156136d457603c93909301926001016136b3565b505f6136e1845160c01c90565b9695505050505050565b60605f808080806136fe888a018a6146a2565b955095509550955095505081871061371c5794506137389350505050565b838710613730578295505050505050613738565b509293505050505b9392505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166138245760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f65613f95565b5f54610100900460ff166138a85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f6561401d565b60a88390555f83815260a460205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af1158015613934573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139589190614496565b5f86815260a460205260409020600101549091506139779082906143c5565b5f86815260a460209081526040808320546801000000000000000090046001600160a01b0316835260a5909152812080549091906139b69084906143c5565b90915550506040516139c990849061473f565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80613a595760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610a70565b5f613a68846001015160c01c90565b90505f613a76856039015190565b90505f7f0000000000000000000000000000000000000000000000000000000000000000613aa5876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c549091506001600160a01b0316632c09a848613b67885160f81c90565b858888866040518663ffffffff1660e01b8152600401613b8b95949392919061476b565b5f6040518083038186803b158015613ba1575f80fd5b505afa158015613bb3573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a954909190606490613be3908461459e565b613bed919061479c565b9050613bf981836143d8565b60aa5f828254613c0991906143c5565b90915550506001600160a01b0384165f90815260a5602052604081208054839290613c359084906143c5565b9091555050604051613c4890849061473f565b604051908190038120906001600160a01b0386169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b8015613d32575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613cda576040519150601f19603f3d011682016040523d82523d5f602084013e613cdf565b606091505b5050905080613d305760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610a70565b505b5050565b613d3e613400565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d733390565b6040516001600160a01b03909116815260200160405180910390a1565b613d986140a2565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613d73565b5f8160f9811015613e1c5760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610a70565b6040519150808483378082016040529250929050565b5f613e3e835160f01c90565b9050805f03613e79576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613e84603c8261459e565b613e8f9060026143c5565b821461134e576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835f03613ed6575083613f8d565b609b546001600160a01b03165f5b85811015613f87576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f906001600160a01b0384169063ae453cd590602401602060405180830381865afa158015613f4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f6e9190614496565b8852506020909601956001948501949384019301613ee4565b50859150505b949350505050565b5f54610100900460ff166140115760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b6065805460ff19169055565b5f54610100900460ff166140995760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f653361373f565b60655460ff16611f655760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610a70565b5f60208284031215614104575f80fd5b5035919050565b80356001600160a01b0381168114614121575f80fd5b919050565b5f60208284031215614136575f80fd5b6137388261410b565b5f8083601f84011261414f575f80fd5b50813567ffffffffffffffff811115614166575f80fd5b60208301915083602082850101111561417d575f80fd5b9250929050565b5f805f60408486031215614196575f80fd5b833567ffffffffffffffff8111156141ac575f80fd5b6141b88682870161413f565b909790965060209590950135949350505050565b5f80602083850312156141dd575f80fd5b823567ffffffffffffffff8111156141f3575f80fd5b6141ff8582860161413f565b90969095509350505050565b5f806040838503121561421c575f80fd5b823567ffffffffffffffff80821115614233575f80fd5b9084019060c08287031215614246575f80fd5b9092506020840135908082111561425b575f80fd5b5083016060818603121561426d575f80fd5b809150509250929050565b5f805f805f8060c0878903121561428d575f80fd5b6142968761410b565b95506142a46020880161410b565b94506142b26040880161410b565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f80604085870312156142e6575f80fd5b843567ffffffffffffffff808211156142fd575f80fd5b6143098883890161413f565b90965094506020870135915080821115614321575f80fd5b5061432e8782880161413f565b95989497509550505050565b8015158114612b83575f80fd5b5f60208284031215614357575f80fd5b81356137388161433a565b5f8060408385031215614373575f80fd5b823567ffffffffffffffff8116811461438a575f80fd5b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561134e5761134e614398565b8181038181111561134e5761134e614398565b5f602082840312156143fb575f80fd5b81516137388161433a565b5f60208284031215614416575f80fd5b813560ff81168114613738575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614459575f80fd5b83018035915067ffffffffffffffff821115614473575f80fd5b60200191503681900382131561417d575f80fd5b818382375f9101908152919050565b5f602082840312156144a6575f80fd5b5051919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b8181101561453e5784516001600160a01b031683529383019391830191600101614519565b505087604086015284810360608601526145598187896144ad565b9a9950505050505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361459757614597614398565b5060010190565b808202811582820484141761134e5761134e614398565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126145f1575f80fd5b8135602067ffffffffffffffff8083111561460e5761460e6145b5565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614651576146516145b5565b6040529384526020818701810194908101925087851115614670575f80fd5b6020870191505b84821015614697576146888261410b565b83529183019190830190614677565b979650505050505050565b5f805f805f8060c087890312156146b7575f80fd5b86359550602087013567ffffffffffffffff808211156146d5575f80fd5b6146e18a838b016145e2565b96506040890135955060608901359150808211156146fd575f80fd5b6147098a838b016145e2565b94506080890135935060a0890135915080821115614725575f80fd5b5061473289828a016145e2565b9150509295509295509295565b5f82515f5b8181101561475e5760208186018101518583015201614744565b505f920191825250919050565b858152846020820152608060408201525f61478a6080830185876144ad565b90508260608301529695505050505050565b5f826147cf577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a", } // RollupABI is the input ABI used to generate the binding from. diff --git a/bindings/bindings/rollup_more.go b/bindings/bindings/rollup_more.go index 3543f43d..3581703c 100644 --- a/bindings/bindings/rollup_more.go +++ b/bindings/bindings/rollup_more.go @@ -13,7 +13,7 @@ const RollupStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"co var RollupStorageLayout = new(solc.StorageLayout) -var RollupDeployedBin = "0x608060405260043610610306575f3560e01c8063728cdbca11610191578063b35dac4e116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd14610a0c578063f2fde38b14610a2b578063fb1e8b0414610a4a575f80fd5b8063ddd8a3dc146109ac578063de8b3035146109d8578063dff7827e146109f7575f80fd5b8063cd4edc69116100b7578063cd4edc6914610965578063ce5db8d614610978578063d279c1911461098d575f80fd5b8063b35dac4e14610908578063b3e0a50914610927578063bedb86fb14610946575f80fd5b8063a415d8dc1161013c578063abc8d68d11610117578063abc8d68d146108a9578063b31a77d3146108d4578063b3484425146108e9575f80fd5b8063a415d8dc14610847578063a479265d14610875578063a4f209b01461088a575f80fd5b80638f1d37761161016c5780638f1d37761461072d578063910129d4146107f757806397fc007c14610828575f80fd5b8063728cdbca146106cb57806388b1ea09146106ea5780638da5cb5b14610703575f80fd5b80632b7ac3f3116102515780635ef7a94a116101fc57806368589dfa116101d757806368589dfa1461066d5780636c578c1d14610698578063715018a6146106b7575f80fd5b80635ef7a94a146105a25780635f77cf1d14610602578063612672901461064e575f80fd5b80634a8d544f1161022c5780634a8d544f1461055957806357e0af6c1461056c5780635c975abb1461058b575f80fd5b80632b7ac3f3146104c75780633b70c18a146105185780633e001b6614610544575f80fd5b806313361101116102b157806321e2f9e01161028c57806321e2f9e0146104525780632362f03e146104715780632571098d1461049c575f80fd5b806313361101146103ee57806318463fb01461040d57806318af3b2b14610422575f80fd5b806310d44583116102e157806310d4458314610398578063116a1f42146103b7578063121dcd50146103d9575f80fd5b806304d7721514610311578063059def61146103545780630ceb678014610377575f80fd5b3661030d57005b5f80fd5b34801561031c575f80fd5b5061033f61032b366004614b17565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561035f575f80fd5b50610369609d5481565b60405190815260200161034b565b348015610382575f80fd5b50610396610391366004614b56565b610a5f565b005b3480156103a3575f80fd5b506103966103b2366004614bb4565b610b83565b3480156103c2575f80fd5b5061033f6103d1366004614b17565b609d54101590565b3480156103e4575f80fd5b50610369609e5481565b3480156103f9575f80fd5b50610396610408366004614bfc565b610f6f565b348015610418575f80fd5b5061036960a75481565b34801561042d575f80fd5b5061033f61043c366004614b17565b5f90815260a26020526040902060010154421090565b34801561045d575f80fd5b5061033f61046c366004614b17565b61156e565b34801561047c575f80fd5b5061036961048b366004614b17565b60a16020525f908152604090205481565b3480156104a7575f80fd5b506103696104b6366004614b17565b60a06020525f908152604090205481565b3480156104d2575f80fd5b50609c546104f39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161034b565b348015610523575f80fd5b50609b546104f39073ffffffffffffffffffffffffffffffffffffffff1681565b34801561054f575f80fd5b5061036960aa5481565b610396610567366004614c3b565b61159c565b348015610577575f80fd5b50610396610586366004614b17565b611f7e565b348015610596575f80fd5b5060655460ff1661033f565b3480156105ad575f80fd5b506105e26105bc366004614b17565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161034b565b34801561060d575f80fd5b506106357f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161034b565b348015610659575f80fd5b50610396610668366004614b17565b612043565b348015610678575f80fd5b50610369610687366004614b17565b60ab6020525f908152604090205481565b3480156106a3575f80fd5b506103966106b2366004614b56565b6122a6565b3480156106c2575f80fd5b506103966123b5565b3480156106d6575f80fd5b506103966106e5366004614ca8565b6123c8565b3480156106f5575f80fd5b5060a65461033f9060ff1681565b34801561070e575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166104f3565b348015610738575f80fd5b506107a6610747366004614b17565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff8316936801000000000000000090930473ffffffffffffffffffffffffffffffffffffffff16929060ff8082169161010090041686565b6040805167ffffffffffffffff909716875273ffffffffffffffffffffffffffffffffffffffff909516602087015293850192909252606084015215156080830152151560a082015260c00161034b565b348015610802575f80fd5b5061033f610811366004614b17565b5f90815260a4602052604090206003015460ff1690565b348015610833575f80fd5b50610396610842366004614b56565b612791565b348015610852575f80fd5b5061033f610861366004614b56565b609f6020525f908152604090205460ff1681565b348015610880575f80fd5b5061036960995481565b348015610895575f80fd5b506103966108a4366004614b17565b6128b5565b3480156108b4575f80fd5b506103696108c3366004614b56565b60a56020525f908152604090205481565b3480156108df575f80fd5b5061036960a85481565b3480156108f4575f80fd5b50610396610903366004614d03565b61297f565b348015610913575f80fd5b50610396610922366004614b56565b612c4e565b348015610932575f80fd5b50610396610941366004614bfc565b612cb4565b348015610951575f80fd5b50610396610960366004614d77565b613038565b610396610973366004614d92565b6131cb565b348015610983575f80fd5b5061036960985481565b348015610998575f80fd5b506103966109a7366004614b56565b6138e0565b3480156109b7575f80fd5b506097546104f39073ffffffffffffffffffffffffffffffffffffffff1681565b3480156109e3575f80fd5b5061033f6109f2366004614b17565b6139c6565b348015610a02575f80fd5b50610369609a5481565b348015610a17575f80fd5b50610396610a26366004614b17565b613a1d565b348015610a36575f80fd5b50610396610a45366004614b56565b613ada565b348015610a55575f80fd5b5061036960a95481565b610a67613b8e565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609f602052604090205460ff1615610afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f818152609f602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610b8b613b8e565b5f8111610bf4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610af2565b5f80610c008585613c0f565b915091505f610c13836001015160c01c90565b5f81815260a160205260409020549091508214610c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b5f60a181610c9a8785614df5565b81526020019081526020015f205414610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610af2565b609d548111610dc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610af2565b610dd0600182614e08565b609e555b8315610f6757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610e1c816139c6565b15610ea2575f81815260a4602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a59092528220805491929091610e74908490614df5565b909155505060a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610f1f575060a85481145b15610f29575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610dd4575b505050505050565b60a85415610fd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b610fe1613c2a565b5f80610fed8484613c0f565b915091505f611000836001015160c01c90565b5f81815260a160205260409020549091508214611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b6110828161156e565b6110e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610af2565b6110f1816139c6565b15611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610af2565b5f81815260a4602052604090206003015460ff16156111d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610af2565b5f81815260a2602052604090206001015442101561124d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610af2565b605983015160a05f611260600185614e08565b81526020019081526020015f2054146112d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610af2565b5f81815260a060205260409020541561134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610af2565b80609d54600101146113b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610af2565b609d819055600160a35f6113cd866099015190565b815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560798301515f82815260a0602052604090205561143a61142d846011015160c01c90565b600985015160c01c613c97565b60a25f611448600184614e08565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab91906114819084614e08565b81526020019081526020015f205f905560a45f6001836114a19190614e08565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d61154a866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061159657505f82815260a1602052604090205415155b92915050565b60975473ffffffffffffffffffffffffffffffffffffffff166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015611622573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116469190614e1b565b6116ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610af2565b60a85415611716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b61171e613c2a565b61172b6020830183614e36565b60ff1615611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610af2565b5f6117a36040840184614e56565b9150508061180d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f626174636820697320656d7074790000000000000000000000000000000000006044820152606401610af2565b6060830135611878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610af2565b60808301356118e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610af2565b5f806118fa6118f56020870187614e56565b613c0f565b915091505f61190d836001015160c01c90565b90505f60a18161191e846001614df5565b81526020019081526020015f205414611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610af2565b609e5481146119fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610af2565b5f81815260a160205260409020548214611a74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610af2565b5f81815260ab6020526040902054606087013514611aee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610af2565b5f611afd846011015160c01c90565b90505f8080611b4f611b1260408c018c614e56565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250879250889150613d619050565b600196909601959485019493840193925090505f804915611b71575f49611b93565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b60408051611f2081019091529850905060f9611bbe89611bb660208f018f614e36565b60ff16613ef8565b60c087811b60018b015285811b60098b015286901b60118a01526019890183905260608c013560598a015260808c013560798a015260a08c013560998a0152611c2d89611c0e60208e018e614e56565b604051611c1c929190614eb7565b604051809103902060b99190910152565b60d98901889052603989018290528089205f88815260a1602090815260408083209390935560ab905290812060808e0135905560a65460ff1615611c9a5760a7545f90815260a460205260409020600201546099544291611c8d91614df5565b611c979190614e08565b90505b60405180608001604052804281526020018260985442611cba9190614df5565b611cc49190614df5565b8152602001611d158f8060400190611cdc9190614e56565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250613eff92505050565b815260975460209091019073ffffffffffffffffffffffffffffffffffffffff1663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015611da3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc79190614ec6565b90525f89815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e89905560975473ffffffffffffffffffffffffffffffffffffffff1692506374fe27b791508c3590611e3c90611e36908f018f614e56565b5f613f56565b5f8e8060400190611e4d9190614e56565b6040518663ffffffff1660e01b8152600401611e6d959493929190614f24565b602060405180830381865afa158015611e88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eac9190614e1b565b611f38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610af2565b5f86815260a16020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b611f86613b8e565b5f81118015611f9757506099548114155b611ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610af2565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff1615801561206357505f5460ff8083169116105b6120ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610af2565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff83161761010017905561212a5f5460ff1690565b60ff16600214612196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610af2565b81612223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610af2565b609e545f90815260ab602052604090205461224c57609e545f90815260ab602052604090208290555b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001612037565b6122ae613b8e565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609f602052604090205460ff1661233c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610af2565b73ffffffffffffffffffffffffffffffffffffffff81165f818152609f6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610b78565b6123bd613b8e565b6123c65f613faa565b565b5f54610100900460ff16158080156123e657505f54600160ff909116105b806123ff5750303b1580156123ff57505f5460ff166001145b61248b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610af2565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156124e7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8616158061251e575073ffffffffffffffffffffffffffffffffffffffff8516155b15612555576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166125d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610af2565b6125da614020565b6125e26140be565b6097805473ffffffffffffffffffffffffffffffffffffffff808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a18015612788575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b612799613b8e565b73ffffffffffffffffffffffffffffffffffffffff8116158015906127d95750609c5473ffffffffffffffffffffffffffffffffffffffff828116911614155b61283f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610af2565b609c805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b6128bd613b8e565b5f811180156128cd575060648111155b80156128db575060a9548114155b612941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610af2565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101612037565b60a854156129e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b6129f1613c2a565b5f806129fd8686613c0f565b915091505f612a10836001015160c01c90565b5f81815260a160205260409020549091508214612a89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b612a92816139c6565b612af8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610af2565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556099546002909101544291612b6f91614df5565b11612c03575f81815260a460209081526040808320600390810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560a2835292819020909201548251808401909352600783527f54696d656f75740000000000000000000000000000000000000000000000000091830191909152612bfe9183919061415c565b612788565b612c0e8386866142df565b61278881336040518060400160405280600d81526020017f50726f6f662073756363657373000000000000000000000000000000000000008152506144b9565b612c56613b8e565b60aa80545f909155612c68828261459f565b6040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101612037565b612cbc613b8e565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea5415612d4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610af2565b5f80612d598484613c0f565b915091505f612d6c836001015160c01c90565b90505f612d7a846079015190565b905080612de3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610af2565b600984015160c01c15612e52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610af2565b5f612e5e856019015190565b03612ec5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610af2565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014612ef1856039015190565b14612f58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610af2565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b613040613b8e565b80156131995761304e614671565b60a65460ff161561314b5760a7545f90815260a4602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a590925282208054919290916130af908490614df5565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b6131a16146f6565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361316e565b50565b335f908152609f602052604090205460ff16613243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610af2565b60a854156132ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b6132b5613c2a565b60a65460ff1615613322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610af2565b8167ffffffffffffffff16609d5410613397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610af2565b67ffffffffffffffff82165f90815260a160205260409020548114613418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b61342b8267ffffffffffffffff1661156e565b613491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610af2565b67ffffffffffffffff82165f90815260a4602052604090205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1615613533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610af2565b67ffffffffffffffff82165f90815260a2602052604090206001015442106135dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610af2565b60975f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613647573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061366b9190614ec6565b3410156136d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610af2565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a49095529690962094518554925173ffffffffffffffffffffffffffffffffffffffff1668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921792909217905573ffffffffffffffffffffffffffffffffffffffff168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b99763460405161384091815260200190565b60405180910390a35f609d5460016138589190614df5565b90505b609e5481116138b0578267ffffffffffffffff16811461389e576099545f82815260a2602052604081206001018054909190613898908490614df5565b90915550505b806138a881614fa4565b91505061385b565b505060a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b335f90815260a5602052604081205490819003613959576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610af2565b335f90815260a56020526040812055613972828261459f565b8173ffffffffffffffffffffffffffffffffffffffff167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a826040516139ba91815260200190565b60405180910390a25050565b5f81815260a4602052604081205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16158015906115965750505f90815260a46020526040902060030154610100900460ff161590565b613a25613b8e565b5f81118015613a3657506098548114155b613a9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610af2565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101612037565b613ae2613b8e565b73ffffffffffffffffffffffffffffffffffffffff8116613b85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610af2565b6131c881613faa565b60335473ffffffffffffffffffffffffffffffffffffffff1633146123c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610af2565b5f805f613c1c858561474d565b812090969095509350505050565b60655460ff16156123c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610af2565b805f03613ca2575050565b8082035f5b82811015613d5b57610100818403811115613cc157508083035b609b546040517f3c7f5283000000000000000000000000000000000000000000000000000000008152600481018590526024810183905273ffffffffffffffffffffffffffffffffffffffff90911690633c7f5283906044015f604051808303815f87803b158015613d31575f80fd5b505af1158015613d43573d5f803e3d5ffd5b50505050610100830192505061010081019050613ca7565b50505050565b60405183515f91829160208701919081908490613d7f9085906147cf565b90506002840193505f5b81811015613e0357603c81028501805184526020908101517fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001690840152603a830192505f613dd9603c83614fdb565b613de39087614df5565b90505f613df482603a015160f01c90565b97909701965050600101613d89565b506020850282016040525b8015613ee6575f613e2385603a015160f01c90565b9050613e3183828b8b614864565b92505f613e42866038015160f01c90565b905081811015613eae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d7367730000006044820152606401610af2565b50978801979690960195603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613e0e565b50819003902096919550909350505050565b8082535050565b5f805f6020840190506002810191505f613f1a8286516147cf565b90505f5b613f29600183614e08565b811015613f3f57603c9390930192600101613f1e565b505f613f4c845160c01c90565b9695505050505050565b60605f80808080613f69888a018a6150df565b9550955095509550955050818710613f87579450613fa39350505050565b838710613f9b578295505050505050613fa3565b509293505050505b9392505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166140b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b6123c661494c565b5f54610100900460ff16614154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b6123c6614a0c565b60a88390555f83815260a460205260408082205460975491517f45bc4d10000000000000000000000000000000000000000000000000000000008152600481018690526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff908116939216906345bc4d10906024016020604051808303815f875af11580156141ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142119190614ec6565b5f86815260a46020526040902060010154909150614230908290614df5565b5f86815260a4602090815260408083205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16835260a59091528120805490919061427c908490614df5565b909155505060405161428f90849061517c565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff84169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80614346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610af2565b5f614355846001015160c01c90565b90505f614363856039015190565b90505f7f0000000000000000000000000000000000000000000000000000000000000000614392876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c5490915073ffffffffffffffffffffffffffffffffffffffff16632c09a848614461885160f81c90565b858888866040518663ffffffff1660e01b81526004016144859594939291906151a8565b5f6040518083038186803b15801561449b575f80fd5b505afa1580156144ad573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a9549091906064906144dd9084614fdb565b6144e791906151d9565b90506144f38183614e08565b60aa5f8282546145039190614df5565b909155505073ffffffffffffffffffffffffffffffffffffffff84165f90815260a560205260408120805483929061453c908490614df5565b909155505060405161454f90849061517c565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff86169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b801561466d575f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f81146145fb576040519150601f19603f3d011682016040523d82523d5f602084013e614600565b606091505b505090508061466b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610af2565b505b5050565b614679613c2a565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586146cc3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6146fe614aab565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336146cc565b5f8160f981146147b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f626174636820686561646572206c656e677468206d75737420626520323439006044820152606401610af2565b6040519150808483378082016040529250929050565b5f6147db835160f01c90565b9050805f03614816576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614821603c82614fdb565b61482c906002614df5565b8214611596576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835f03614873575083614944565b609b5473ffffffffffffffffffffffffffffffffffffffff165f5b8581101561493e576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f9073ffffffffffffffffffffffffffffffffffffffff84169063ae453cd590602401602060405180830381865afa158015614901573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149259190614ec6565b885250602090960195600194850194938401930161488e565b50859150505b949350505050565b5f54610100900460ff166149e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff16614aa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b6123c633613faa565b60655460ff166123c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610af2565b5f60208284031215614b27575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114614b51575f80fd5b919050565b5f60208284031215614b66575f80fd5b613fa382614b2e565b5f8083601f840112614b7f575f80fd5b50813567ffffffffffffffff811115614b96575f80fd5b602083019150836020828501011115614bad575f80fd5b9250929050565b5f805f60408486031215614bc6575f80fd5b833567ffffffffffffffff811115614bdc575f80fd5b614be886828701614b6f565b909790965060209590950135949350505050565b5f8060208385031215614c0d575f80fd5b823567ffffffffffffffff811115614c23575f80fd5b614c2f85828601614b6f565b90969095509350505050565b5f8060408385031215614c4c575f80fd5b823567ffffffffffffffff80821115614c63575f80fd5b9084019060c08287031215614c76575f80fd5b90925060208401359080821115614c8b575f80fd5b50830160608186031215614c9d575f80fd5b809150509250929050565b5f805f805f8060c08789031215614cbd575f80fd5b614cc687614b2e565b9550614cd460208801614b2e565b9450614ce260408801614b2e565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f8060408587031215614d16575f80fd5b843567ffffffffffffffff80821115614d2d575f80fd5b614d3988838901614b6f565b90965094506020870135915080821115614d51575f80fd5b50614d5e87828801614b6f565b95989497509550505050565b80151581146131c8575f80fd5b5f60208284031215614d87575f80fd5b8135613fa381614d6a565b5f8060408385031215614da3575f80fd5b823567ffffffffffffffff81168114614dba575f80fd5b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561159657611596614dc8565b8181038181111561159657611596614dc8565b5f60208284031215614e2b575f80fd5b8151613fa381614d6a565b5f60208284031215614e46575f80fd5b813560ff81168114613fa3575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614e89575f80fd5b83018035915067ffffffffffffffff821115614ea3575f80fd5b602001915036819003821315614bad575f80fd5b818382375f9101908152919050565b5f60208284031215614ed6575f80fd5b5051919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b81811015614f7b57845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101614f49565b50508760408601528481036060860152614f96818789614edd565b9a9950505050505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614fd457614fd4614dc8565b5060010190565b808202811582820484141761159657611596614dc8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f83011261502e575f80fd5b8135602067ffffffffffffffff8083111561504b5761504b614ff2565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110848211171561508e5761508e614ff2565b60405293845260208187018101949081019250878511156150ad575f80fd5b6020870191505b848210156150d4576150c582614b2e565b835291830191908301906150b4565b979650505050505050565b5f805f805f8060c087890312156150f4575f80fd5b86359550602087013567ffffffffffffffff80821115615112575f80fd5b61511e8a838b0161501f565b965060408901359550606089013591508082111561513a575f80fd5b6151468a838b0161501f565b94506080890135935060a0890135915080821115615162575f80fd5b5061516f89828a0161501f565b9150509295509295509295565b5f82515f5b8181101561519b5760208186018101518583015201615181565b505f920191825250919050565b858152846020820152608060408201525f6151c7608083018587614edd565b90508260608301529695505050505050565b5f8261520c577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a" +var RollupDeployedBin = "0x608060405260043610610306575f3560e01c8063728cdbca11610191578063b35dac4e116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd14610a0c578063f2fde38b14610a2b578063fb1e8b0414610a4a575f80fd5b8063ddd8a3dc146109ac578063de8b3035146109d8578063dff7827e146109f7575f80fd5b8063cd4edc69116100b7578063cd4edc6914610965578063ce5db8d614610978578063d279c1911461098d575f80fd5b8063b35dac4e14610908578063b3e0a50914610927578063bedb86fb14610946575f80fd5b8063a415d8dc1161013c578063abc8d68d11610117578063abc8d68d146108a9578063b31a77d3146108d4578063b3484425146108e9575f80fd5b8063a415d8dc14610847578063a479265d14610875578063a4f209b01461088a575f80fd5b80638f1d37761161016c5780638f1d37761461072d578063910129d4146107f757806397fc007c14610828575f80fd5b8063728cdbca146106cb57806388b1ea09146106ea5780638da5cb5b14610703575f80fd5b80632b7ac3f3116102515780635ef7a94a116101fc57806368589dfa116101d757806368589dfa1461066d5780636c578c1d14610698578063715018a6146106b7575f80fd5b80635ef7a94a146105a25780635f77cf1d14610602578063612672901461064e575f80fd5b80634a8d544f1161022c5780634a8d544f1461055957806357e0af6c1461056c5780635c975abb1461058b575f80fd5b80632b7ac3f3146104c75780633b70c18a146105185780633e001b6614610544575f80fd5b806313361101116102b157806321e2f9e01161028c57806321e2f9e0146104525780632362f03e146104715780632571098d1461049c575f80fd5b806313361101146103ee57806318463fb01461040d57806318af3b2b14610422575f80fd5b806310d44583116102e157806310d4458314610398578063116a1f42146103b7578063121dcd50146103d9575f80fd5b806304d7721514610311578063059def61146103545780630ceb678014610377575f80fd5b3661030d57005b5f80fd5b34801561031c575f80fd5b5061033f61032b366004614b80565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561035f575f80fd5b50610369609d5481565b60405190815260200161034b565b348015610382575f80fd5b50610396610391366004614bbf565b610a5f565b005b3480156103a3575f80fd5b506103966103b2366004614c1d565b610b83565b3480156103c2575f80fd5b5061033f6103d1366004614b80565b609d54101590565b3480156103e4575f80fd5b50610369609e5481565b3480156103f9575f80fd5b50610396610408366004614c65565b610f6f565b348015610418575f80fd5b5061036960a75481565b34801561042d575f80fd5b5061033f61043c366004614b80565b5f90815260a26020526040902060010154421090565b34801561045d575f80fd5b5061033f61046c366004614b80565b61156e565b34801561047c575f80fd5b5061036961048b366004614b80565b60a16020525f908152604090205481565b3480156104a7575f80fd5b506103696104b6366004614b80565b60a06020525f908152604090205481565b3480156104d2575f80fd5b50609c546104f39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161034b565b348015610523575f80fd5b50609b546104f39073ffffffffffffffffffffffffffffffffffffffff1681565b34801561054f575f80fd5b5061036960aa5481565b610396610567366004614ca4565b61159c565b348015610577575f80fd5b50610396610586366004614b80565b611f7e565b348015610596575f80fd5b5060655460ff1661033f565b3480156105ad575f80fd5b506105e26105bc366004614b80565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161034b565b34801561060d575f80fd5b506106357f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161034b565b348015610659575f80fd5b50610396610668366004614b80565b612043565b348015610678575f80fd5b50610369610687366004614b80565b60ab6020525f908152604090205481565b3480156106a3575f80fd5b506103966106b2366004614bbf565b6122a6565b3480156106c2575f80fd5b506103966123b5565b3480156106d6575f80fd5b506103966106e5366004614d11565b6123c8565b3480156106f5575f80fd5b5060a65461033f9060ff1681565b34801561070e575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166104f3565b348015610738575f80fd5b506107a6610747366004614b80565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff8316936801000000000000000090930473ffffffffffffffffffffffffffffffffffffffff16929060ff8082169161010090041686565b6040805167ffffffffffffffff909716875273ffffffffffffffffffffffffffffffffffffffff909516602087015293850192909252606084015215156080830152151560a082015260c00161034b565b348015610802575f80fd5b5061033f610811366004614b80565b5f90815260a4602052604090206003015460ff1690565b348015610833575f80fd5b50610396610842366004614bbf565b612791565b348015610852575f80fd5b5061033f610861366004614bbf565b609f6020525f908152604090205460ff1681565b348015610880575f80fd5b5061036960995481565b348015610895575f80fd5b506103966108a4366004614b80565b6128b5565b3480156108b4575f80fd5b506103696108c3366004614bbf565b60a56020525f908152604090205481565b3480156108df575f80fd5b5061036960a85481565b3480156108f4575f80fd5b50610396610903366004614d6c565b61297f565b348015610913575f80fd5b50610396610922366004614bbf565b612c4e565b348015610932575f80fd5b50610396610941366004614c65565b612cb4565b348015610951575f80fd5b50610396610960366004614de0565b6130a0565b610396610973366004614dfb565b613233565b348015610983575f80fd5b5061036960985481565b348015610998575f80fd5b506103966109a7366004614bbf565b613948565b3480156109b7575f80fd5b506097546104f39073ffffffffffffffffffffffffffffffffffffffff1681565b3480156109e3575f80fd5b5061033f6109f2366004614b80565b613a2e565b348015610a02575f80fd5b50610369609a5481565b348015610a17575f80fd5b50610396610a26366004614b80565b613a85565b348015610a36575f80fd5b50610396610a45366004614bbf565b613b42565b348015610a55575f80fd5b5061036960a95481565b610a67613bf6565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609f602052604090205460ff1615610afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f818152609f602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610b8b613bf6565b5f8111610bf4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610af2565b5f80610c008585613c77565b915091505f610c13836001015160c01c90565b5f81815260a160205260409020549091508214610c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b5f60a181610c9a8785614e5e565b81526020019081526020015f205414610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610af2565b609d548111610dc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610af2565b610dd0600182614e71565b609e555b8315610f6757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610e1c81613a2e565b15610ea2575f81815260a4602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a59092528220805491929091610e74908490614e5e565b909155505060a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610f1f575060a85481145b15610f29575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610dd4575b505050505050565b60a85415610fd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b610fe1613c92565b5f80610fed8484613c77565b915091505f611000836001015160c01c90565b5f81815260a160205260409020549091508214611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b6110828161156e565b6110e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610af2565b6110f181613a2e565b15611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610af2565b5f81815260a4602052604090206003015460ff16156111d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610af2565b5f81815260a2602052604090206001015442101561124d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610af2565b605983015160a05f611260600185614e71565b81526020019081526020015f2054146112d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610af2565b5f81815260a060205260409020541561134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610af2565b80609d54600101146113b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610af2565b609d819055600160a35f6113cd866099015190565b815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560798301515f82815260a0602052604090205561143a61142d846011015160c01c90565b600985015160c01c613cff565b60a25f611448600184614e71565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab91906114819084614e71565b81526020019081526020015f205f905560a45f6001836114a19190614e71565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d61154a866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061159657505f82815260a1602052604090205415155b92915050565b60975473ffffffffffffffffffffffffffffffffffffffff166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015611622573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116469190614e84565b6116ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610af2565b60a85415611716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b61171e613c92565b61172b6020830183614e9f565b60ff1615611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610af2565b5f6117a36040840184614ebf565b9150508061180d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f626174636820697320656d7074790000000000000000000000000000000000006044820152606401610af2565b6060830135611878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610af2565b60808301356118e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610af2565b5f806118fa6118f56020870187614ebf565b613c77565b915091505f61190d836001015160c01c90565b90505f60a18161191e846001614e5e565b81526020019081526020015f205414611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610af2565b609e5481146119fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610af2565b5f81815260a160205260409020548214611a74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610af2565b5f81815260ab6020526040902054606087013514611aee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610af2565b5f611afd846011015160c01c90565b90505f8080611b4f611b1260408c018c614ebf565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250879250889150613dc99050565b600196909601959485019493840193925090505f804915611b71575f49611b93565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b60408051611f2081019091529850905060f9611bbe89611bb660208f018f614e9f565b60ff16613f60565b60c087811b60018b015285811b60098b015286901b60118a01526019890183905260608c013560598a015260808c013560798a015260a08c013560998a0152611c2d89611c0e60208e018e614ebf565b604051611c1c929190614f20565b604051809103902060b99190910152565b60d98901889052603989018290528089205f88815260a1602090815260408083209390935560ab905290812060808e0135905560a65460ff1615611c9a5760a7545f90815260a460205260409020600201546099544291611c8d91614e5e565b611c979190614e71565b90505b60405180608001604052804281526020018260985442611cba9190614e5e565b611cc49190614e5e565b8152602001611d158f8060400190611cdc9190614ebf565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250613f6792505050565b815260975460209091019073ffffffffffffffffffffffffffffffffffffffff1663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015611da3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc79190614f2f565b90525f89815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e89905560975473ffffffffffffffffffffffffffffffffffffffff1692506374fe27b791508c3590611e3c90611e36908f018f614ebf565b5f613fbe565b5f8e8060400190611e4d9190614ebf565b6040518663ffffffff1660e01b8152600401611e6d959493929190614f8d565b602060405180830381865afa158015611e88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eac9190614e84565b611f38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610af2565b5f86815260a16020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b611f86613bf6565b5f81118015611f9757506099548114155b611ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610af2565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff1615801561206357505f5460ff8083169116105b6120ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610af2565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff83161761010017905561212a5f5460ff1690565b60ff16600214612196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610af2565b81612223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610af2565b609e545f90815260ab602052604090205461224c57609e545f90815260ab602052604090208290555b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001612037565b6122ae613bf6565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609f602052604090205460ff1661233c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610af2565b73ffffffffffffffffffffffffffffffffffffffff81165f818152609f6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610b78565b6123bd613bf6565b6123c65f614012565b565b5f54610100900460ff16158080156123e657505f54600160ff909116105b806123ff5750303b1580156123ff57505f5460ff166001145b61248b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610af2565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156124e7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8616158061251e575073ffffffffffffffffffffffffffffffffffffffff8516155b15612555576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166125d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610af2565b6125da614088565b6125e2614126565b6097805473ffffffffffffffffffffffffffffffffffffffff808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a18015612788575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b612799613bf6565b73ffffffffffffffffffffffffffffffffffffffff8116158015906127d95750609c5473ffffffffffffffffffffffffffffffffffffffff828116911614155b61283f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610af2565b609c805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b6128bd613bf6565b5f811180156128cd575060648111155b80156128db575060a9548114155b612941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610af2565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101612037565b60a854156129e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b6129f1613c92565b5f806129fd8686613c77565b915091505f612a10836001015160c01c90565b5f81815260a160205260409020549091508214612a89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b612a9281613a2e565b612af8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610af2565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556099546002909101544291612b6f91614e5e565b11612c03575f81815260a460209081526040808320600390810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560a2835292819020909201548251808401909352600783527f54696d656f75740000000000000000000000000000000000000000000000000091830191909152612bfe918391906141c4565b612788565b612c0e838686614347565b61278881336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250614521565b612c56613bf6565b60aa80545f909155612c688282614607565b6040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101612037565b612cbc613bf6565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea5415612d4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610af2565b5f80612d598484613c77565b915091505f612d6c836001015160c01c90565b90508015612dd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610af2565b5f612de2846079015190565b905080612e4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610af2565b600984015160c01c15612eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610af2565b5f612ec6856019015190565b03612f2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610af2565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014612f59856039015190565b14612fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610af2565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b6130a8613bf6565b8015613201576130b66146d9565b60a65460ff16156131b35760a7545f90815260a4602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a59092528220805491929091613117908490614e5e565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b61320961475e565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336131d6565b50565b335f908152609f602052604090205460ff166132ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610af2565b60a85415613315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b61331d613c92565b60a65460ff161561338a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610af2565b8167ffffffffffffffff16609d54106133ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610af2565b67ffffffffffffffff82165f90815260a160205260409020548114613480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b6134938267ffffffffffffffff1661156e565b6134f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610af2565b67ffffffffffffffff82165f90815260a4602052604090205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff161561359b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610af2565b67ffffffffffffffff82165f90815260a260205260409020600101544210613645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610af2565b60975f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136d39190614f2f565b34101561373c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610af2565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a49095529690962094518554925173ffffffffffffffffffffffffffffffffffffffff1668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921792909217905573ffffffffffffffffffffffffffffffffffffffff168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b9976346040516138a891815260200190565b60405180910390a35f609d5460016138c09190614e5e565b90505b609e548111613918578267ffffffffffffffff168114613906576099545f82815260a2602052604081206001018054909190613900908490614e5e565b90915550505b806139108161500d565b9150506138c3565b505060a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b335f90815260a56020526040812054908190036139c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610af2565b335f90815260a560205260408120556139da8282614607565b8173ffffffffffffffffffffffffffffffffffffffff167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a82604051613a2291815260200190565b60405180910390a25050565b5f81815260a4602052604081205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16158015906115965750505f90815260a46020526040902060030154610100900460ff161590565b613a8d613bf6565b5f81118015613a9e57506098548114155b613b04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610af2565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101612037565b613b4a613bf6565b73ffffffffffffffffffffffffffffffffffffffff8116613bed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610af2565b61323081614012565b60335473ffffffffffffffffffffffffffffffffffffffff1633146123c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610af2565b5f805f613c8485856147b5565b812090969095509350505050565b60655460ff16156123c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610af2565b805f03613d0a575050565b8082035f5b82811015613dc357610100818403811115613d2957508083035b609b546040517f3c7f5283000000000000000000000000000000000000000000000000000000008152600481018590526024810183905273ffffffffffffffffffffffffffffffffffffffff90911690633c7f5283906044015f604051808303815f87803b158015613d99575f80fd5b505af1158015613dab573d5f803e3d5ffd5b50505050610100830192505061010081019050613d0f565b50505050565b60405183515f91829160208701919081908490613de7908590614838565b90506002840193505f5b81811015613e6b57603c81028501805184526020908101517fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001690840152603a830192505f613e41603c83615044565b613e4b9087614e5e565b90505f613e5c82603a015160f01c90565b97909701965050600101613df1565b506020850282016040525b8015613f4e575f613e8b85603a015160f01c90565b9050613e9983828b8b6148cd565b92505f613eaa866038015160f01c90565b905081811015613f16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d7367730000006044820152606401610af2565b50978801979690960195603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613e76565b50819003902096919550909350505050565b8082535050565b5f805f6020840190506002810191505f613f82828651614838565b90505f5b613f91600183614e71565b811015613fa757603c9390930192600101613f86565b505f613fb4845160c01c90565b9695505050505050565b60605f80808080613fd1888a018a615148565b9550955095509550955050818710613fef57945061400b9350505050565b83871061400357829550505050505061400b565b509293505050505b9392505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff1661411e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b6123c66149b5565b5f54610100900460ff166141bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b6123c6614a75565b60a88390555f83815260a460205260408082205460975491517f45bc4d10000000000000000000000000000000000000000000000000000000008152600481018690526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff908116939216906345bc4d10906024016020604051808303815f875af1158015614255573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142799190614f2f565b5f86815260a46020526040902060010154909150614298908290614e5e565b5f86815260a4602090815260408083205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16835260a5909152812080549091906142e4908490614e5e565b90915550506040516142f79084906151e5565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff84169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b806143ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610af2565b5f6143bd846001015160c01c90565b90505f6143cb856039015190565b90505f7f00000000000000000000000000000000000000000000000000000000000000006143fa876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c5490915073ffffffffffffffffffffffffffffffffffffffff16632c09a8486144c9885160f81c90565b858888866040518663ffffffff1660e01b81526004016144ed959493929190615211565b5f6040518083038186803b158015614503575f80fd5b505afa158015614515573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a9549091906064906145459084615044565b61454f9190615242565b905061455b8183614e71565b60aa5f82825461456b9190614e5e565b909155505073ffffffffffffffffffffffffffffffffffffffff84165f90815260a56020526040812080548392906145a4908490614e5e565b90915550506040516145b79084906151e5565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff86169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80156146d5575f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f8114614663576040519150601f19603f3d011682016040523d82523d5f602084013e614668565b606091505b50509050806146d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610af2565b505b5050565b6146e1613c92565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586147343390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b614766614b14565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33614734565b5f8160f9811015614822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610af2565b6040519150808483378082016040529250929050565b5f614844835160f01c90565b9050805f0361487f576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61488a603c82615044565b614895906002614e5e565b8214611596576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835f036148dc5750836149ad565b609b5473ffffffffffffffffffffffffffffffffffffffff165f5b858110156149a7576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f9073ffffffffffffffffffffffffffffffffffffffff84169063ae453cd590602401602060405180830381865afa15801561496a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061498e9190614f2f565b88525060209096019560019485019493840193016148f7565b50859150505b949350505050565b5f54610100900460ff16614a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff16614b0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b6123c633614012565b60655460ff166123c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610af2565b5f60208284031215614b90575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114614bba575f80fd5b919050565b5f60208284031215614bcf575f80fd5b61400b82614b97565b5f8083601f840112614be8575f80fd5b50813567ffffffffffffffff811115614bff575f80fd5b602083019150836020828501011115614c16575f80fd5b9250929050565b5f805f60408486031215614c2f575f80fd5b833567ffffffffffffffff811115614c45575f80fd5b614c5186828701614bd8565b909790965060209590950135949350505050565b5f8060208385031215614c76575f80fd5b823567ffffffffffffffff811115614c8c575f80fd5b614c9885828601614bd8565b90969095509350505050565b5f8060408385031215614cb5575f80fd5b823567ffffffffffffffff80821115614ccc575f80fd5b9084019060c08287031215614cdf575f80fd5b90925060208401359080821115614cf4575f80fd5b50830160608186031215614d06575f80fd5b809150509250929050565b5f805f805f8060c08789031215614d26575f80fd5b614d2f87614b97565b9550614d3d60208801614b97565b9450614d4b60408801614b97565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f8060408587031215614d7f575f80fd5b843567ffffffffffffffff80821115614d96575f80fd5b614da288838901614bd8565b90965094506020870135915080821115614dba575f80fd5b50614dc787828801614bd8565b95989497509550505050565b8015158114613230575f80fd5b5f60208284031215614df0575f80fd5b813561400b81614dd3565b5f8060408385031215614e0c575f80fd5b823567ffffffffffffffff81168114614e23575f80fd5b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561159657611596614e31565b8181038181111561159657611596614e31565b5f60208284031215614e94575f80fd5b815161400b81614dd3565b5f60208284031215614eaf575f80fd5b813560ff8116811461400b575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614ef2575f80fd5b83018035915067ffffffffffffffff821115614f0c575f80fd5b602001915036819003821315614c16575f80fd5b818382375f9101908152919050565b5f60208284031215614f3f575f80fd5b5051919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b81811015614fe457845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101614fb2565b50508760408601528481036060860152614fff818789614f46565b9a9950505050505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361503d5761503d614e31565b5060010190565b808202811582820484141761159657611596614e31565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112615097575f80fd5b8135602067ffffffffffffffff808311156150b4576150b461505b565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811084821117156150f7576150f761505b565b6040529384526020818701810194908101925087851115615116575f80fd5b6020870191505b8482101561513d5761512e82614b97565b8352918301919083019061511d565b979650505050505050565b5f805f805f8060c0878903121561515d575f80fd5b86359550602087013567ffffffffffffffff8082111561517b575f80fd5b6151878a838b01615088565b96506040890135955060608901359150808211156151a3575f80fd5b6151af8a838b01615088565b94506080890135935060a08901359150808211156151cb575f80fd5b506151d889828a01615088565b9150509295509295509295565b5f82515f5b8181101561520457602081860181015185830152016151ea565b505f920191825250919050565b858152846020820152608060408201525f615230608083018587614f46565b90508260608301529695505050505050565b5f82615275577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(RollupStorageLayoutJSON), RollupStorageLayout); err != nil { diff --git a/contracts/contracts/l1/IL1CrossDomainMessenger.sol b/contracts/contracts/l1/IL1CrossDomainMessenger.sol index ce99bbfa..2e190c70 100644 --- a/contracts/contracts/l1/IL1CrossDomainMessenger.sol +++ b/contracts/contracts/l1/IL1CrossDomainMessenger.sol @@ -37,10 +37,6 @@ interface IL1CrossDomainMessenger is ICrossDomainMessenger { bytes message ); - /// @notice Emitted when have message dropped. - /// @param nonce The index of the message to be dropped. - event DropMessage(uint256 indexed nonce); - /***************************** * Public Mutating Functions * *****************************/ @@ -80,12 +76,4 @@ interface IL1CrossDomainMessenger is ICrossDomainMessenger { uint32 newGasLimit, address refundAddress ) external payable; - - /// @notice Drop a skipped message. - /// @param from The address of the sender of the message. - /// @param to The address of the recipient of the message. - /// @param value The msg.value passed to the message call. - /// @param messageNonce The nonce for the message to drop. - /// @param message The content of the message. - function dropMessage(address from, address to, uint256 value, uint256 messageNonce, bytes memory message) external; } diff --git a/contracts/contracts/l1/L1CrossDomainMessenger.sol b/contracts/contracts/l1/L1CrossDomainMessenger.sol index 475e981d..baa4b7fc 100644 --- a/contracts/contracts/l1/L1CrossDomainMessenger.sol +++ b/contracts/contracts/l1/L1CrossDomainMessenger.sol @@ -42,7 +42,7 @@ contract L1CrossDomainMessenger is IL1CrossDomainMessenger, CrossDomainMessenger mapping(bytes32 => uint256) public messageSendTimestamp; /// @notice Mapping from L1 message hash to drop status. - mapping(bytes32 => bool) public isL1MessageDropped; + mapping(bytes32 => bool) public __isL1MessageDropped; /// @notice The address of Rollup contract. address public rollup; @@ -192,7 +192,7 @@ contract L1CrossDomainMessenger is IL1CrossDomainMessenger, CrossDomainMessenger require(messageSendTimestamp[_xDomainCalldataHash] > 0, "Provided message has not been enqueued"); // cannot replay dropped message - require(!isL1MessageDropped[_xDomainCalldataHash], "Message already dropped"); + require(!__isL1MessageDropped[_xDomainCalldataHash], "Message already dropped"); // compute and deduct the messaging fee to fee vault. uint256 _fee = IL1MessageQueue(_messageQueue).estimateCrossDomainMessageFee(_from, _newGasLimit); @@ -243,61 +243,6 @@ contract L1CrossDomainMessenger is IL1CrossDomainMessenger, CrossDomainMessenger } } - /// @inheritdoc IL1CrossDomainMessenger - function dropMessage( - address _from, - address _to, - uint256 _value, - uint256 _messageNonce, - bytes memory _message - ) external override whenNotPaused notInExecution { - // The criteria for dropping a message: - // 1. The message is a L1 message. - // 2. The message has not been dropped before. - // 3. the message and all of its replacement are finalized in L1. - // 4. the message and all of its replacement are skipped. - // - // Possible denial of service attack: - // + replayMessage is called every time someone want to drop the message. - // + replayMessage is called so many times for a skipped message, thus results a long list. - // - // We limit the number of `replayMessage` calls of each message, which may solve the above problem. - - address _messageQueue = messageQueue; - - // check message exists - bytes memory _xDomainCalldata = _encodeXDomainCalldata(_from, _to, _value, _messageNonce, _message); - bytes32 _xDomainCalldataHash = keccak256(_xDomainCalldata); - require(messageSendTimestamp[_xDomainCalldataHash] > 0, "Provided message has not been enqueued"); - - // check message not dropped - require(!isL1MessageDropped[_xDomainCalldataHash], "Message already dropped"); - - // check message is finalized - uint256 _lastIndex = replayStates[_xDomainCalldataHash].lastIndex; - if (_lastIndex == 0) _lastIndex = _messageNonce; - - // check message is skipped and drop it. - // @note If the list is very long, the message may never be dropped. - while (true) { - IL1MessageQueue(_messageQueue).dropCrossDomainMessage(_lastIndex); - _lastIndex = prevReplayIndex[_lastIndex]; - if (_lastIndex == 0) break; - unchecked { - _lastIndex = _lastIndex - 1; - } - } - - isL1MessageDropped[_xDomainCalldataHash] = true; - emit DropMessage(_messageNonce); - - // set execution context - xDomainMessageSender = Constants.DROP_XDOMAIN_MESSAGE_SENDER; - IMessageDropCallback(_from).onDropMessage{value: _value}(_message); - // clear execution context - xDomainMessageSender = Constants.DEFAULT_XDOMAIN_MESSAGE_SENDER; - } - /************************ * Restricted Functions * ************************/ diff --git a/contracts/contracts/l1/rollup/IL1MessageQueue.sol b/contracts/contracts/l1/rollup/IL1MessageQueue.sol index 3e9a4734..8f33381f 100644 --- a/contracts/contracts/l1/rollup/IL1MessageQueue.sol +++ b/contracts/contracts/l1/rollup/IL1MessageQueue.sol @@ -35,10 +35,6 @@ interface IL1MessageQueue { /// @param count The number of messages popped. event DequeueTransaction(uint256 startIndex, uint256 count); - /// @notice Emitted when a message is dropped from L1. - /// @param index The index of message dropped. - event DropTransaction(uint256 index); - /// @notice Emitted when owner updates gas oracle contract. /// @param _oldGasOracle The address of old gas oracle contract. /// @param _newGasOracle The address of new gas oracle contract. @@ -95,10 +91,6 @@ interface IL1MessageQueue { bytes calldata data ) external view returns (bytes32); - /// @notice Return whether the message is dropped. - /// @param queueIndex The queue index of the message to check. - function isMessageDropped(uint256 queueIndex) external view returns (bool); - /***************************** * Public Mutating Functions * *****************************/ @@ -132,7 +124,4 @@ interface IL1MessageQueue { /// @param startIndex The start index to pop. /// @param count The number of messages to pop. function popCrossDomainMessage(uint256 startIndex, uint256 count) external; - - /// @notice Drop a skipped message from the queue. - function dropCrossDomainMessage(uint256 index) external; } diff --git a/contracts/contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol b/contracts/contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol index de353fe9..3d86a753 100644 --- a/contracts/contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol +++ b/contracts/contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol @@ -48,8 +48,8 @@ contract L1MessageQueueWithGasPriceOracle is OwnableUpgradeable, IL1MessageQueue /// @notice The max gas limit of L1 transactions. uint256 public maxGasLimit; - /// @dev The bitmap for dropped messages, where `droppedMessageBitmap[i]` keeps the bits from `[i*256, (i+1)*256)`. - BitMapsUpgradeable.BitMap private droppedMessageBitmap; + /// @dev The bitmap for dropped messages, where `droppedMessageBitmap[i]` keeps the bits from `[i*256, (i+1)*256)`. Deprecated. + BitMapsUpgradeable.BitMap private __droppedMessageBitmap; /// @dev The bitmap for skipped messages, where `skippedMessageBitmap[i]` keeps the bits from `[i*256, (i+1)*256)`. Deprecated. mapping(uint256 => uint256) private __skippedMessageBitmap; @@ -260,11 +260,6 @@ contract L1MessageQueueWithGasPriceOracle is OwnableUpgradeable, IL1MessageQueue return hash; } - /// @inheritdoc IL1MessageQueue - function isMessageDropped(uint256 _queueIndex) external view returns (bool) { - return droppedMessageBitmap.get(_queueIndex); - } - /***************************** * Public Mutating Functions * *****************************/ @@ -325,16 +320,6 @@ contract L1MessageQueueWithGasPriceOracle is OwnableUpgradeable, IL1MessageQueue emit DequeueTransaction(_startIndex, _count); } - /// @inheritdoc IL1MessageQueue - function dropCrossDomainMessage(uint256 _index) external onlyMessenger { - require(_index < pendingQueueIndex, "cannot drop pending message"); - - require(!droppedMessageBitmap.get(_index), "message already dropped"); - droppedMessageBitmap.set(_index); - - emit DropTransaction(_index); - } - /************************ * Restricted Functions * ************************/ diff --git a/contracts/contracts/test/L1CrossDomainMessenger.t.sol b/contracts/contracts/test/L1CrossDomainMessenger.t.sol index 47af5645..0dcb9f1f 100644 --- a/contracts/contracts/test/L1CrossDomainMessenger.t.sol +++ b/contracts/contracts/test/L1CrossDomainMessenger.t.sol @@ -427,69 +427,6 @@ contract L1CrossDomainMessengerTest is L1GatewayBaseTest { assertEq(nonce + 2, l1CrossDomainMessenger.messageNonce()); } - function test_dropMessage_notEnqueued_reverts() external { - address sender = address(this); - address to = address(bob); - bytes memory data = "send message"; - // hevm.deal(sender, 10 ether); - - // send value zero - uint256 value = 0; - uint256 nonce = l1MessageQueueWithGasPriceOracle.nextCrossDomainMessageIndex(); - - // Expect revert when the message has not been enqueued. - hevm.expectRevert("Provided message has not been enqueued"); - l1CrossDomainMessenger.dropMessage(sender, to, value, nonce, data); - } - - function test_dropMessage_succeeds(uint256 amount, address recipient, bytes memory dataToCall) public { - amount = bound(amount, 1, address(this).balance); - bytes memory message = abi.encodeCall( - IL2ETHGateway.finalizeDepositETH, - (address(this), recipient, amount, dataToCall) - ); - - l1ETHGateway.depositETHAndCall{value: amount}(recipient, amount, dataToCall, defaultGasLimit); - - // pop message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // Drop message 0 and verify balance - revertOnReceive = false; - uint256 balance = address(this).balance; - l1CrossDomainMessenger.dropMessage(address(l1ETHGateway), address(counterpartGateway), amount, 0, message); - assertEq(balance + amount, address(this).balance); - } - - function test_dropMessage_dropAgain_reverts(uint256 amount, address recipient, bytes memory dataToCall) public { - amount = bound(amount, 1, address(this).balance); - bytes memory message = abi.encodeCall( - IL2ETHGateway.finalizeDepositETH, - (address(this), recipient, amount, dataToCall) - ); - - l1ETHGateway.depositETHAndCall{value: amount}(recipient, amount, dataToCall, defaultGasLimit); - - // pop message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // Drop message 0 and verify balance - revertOnReceive = false; - uint256 balance = address(this).balance; - l1CrossDomainMessenger.dropMessage(address(l1ETHGateway), address(counterpartGateway), amount, 0, message); - assertEq(balance + amount, address(this).balance); - - // Expect revert when trying to drop the same message again. - hevm.expectRevert("Message already dropped"); - l1CrossDomainMessenger.dropMessage(address(l1ETHGateway), address(counterpartGateway), amount, 0, message); - } - function test_updateMaxReplayTimes_succeeds(uint256 _maxReplayTimes) external { hevm.assume(_maxReplayTimes > 0); // not owner, revert @@ -529,8 +466,6 @@ contract L1CrossDomainMessengerTest is L1GatewayBaseTest { l1CrossDomainMessenger.proveAndRelayMessage(address(0), address(0), 0, 0, new bytes(0), wdProof, wdRoot); hevm.expectRevert("Pausable: paused"); l1CrossDomainMessenger.replayMessage(address(0), address(0), 0, 0, new bytes(0), 0, address(0)); - hevm.expectRevert("Pausable: paused"); - l1CrossDomainMessenger.dropMessage(address(0), address(0), 0, 0, new bytes(0)); // unpause hevm.prank(multisig); diff --git a/contracts/contracts/test/L1CustomERC20Gateway.t.sol b/contracts/contracts/test/L1CustomERC20Gateway.t.sol index 8ac88ce0..f1a63821 100644 --- a/contracts/contracts/test/L1CustomERC20Gateway.t.sol +++ b/contracts/contracts/test/L1CustomERC20Gateway.t.sol @@ -182,31 +182,6 @@ contract L1CustomERC20GatewayTest is L1GatewayBaseTest { _depositERC20WithRecipientAndCalldata(false, amount, recipient, dataToCall, gasLimit, feePerGas); } - function test_dropMessage_succeeds(uint256 amount, address recipient, bytes memory dataToCall) public { - gateway.updateTokenMapping(address(l1Token), address(l2Token)); - - amount = bound(amount, 1, l1Token.balanceOf(address(this))); - bytes memory message = abi.encodeCall( - IL2ERC20Gateway.finalizeDepositERC20, - (address(l1Token), address(l2Token), address(this), recipient, amount, dataToCall) - ); - gateway.depositERC20AndCall(address(l1Token), recipient, amount, dataToCall, defaultGasLimit); - - // pop message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // drop message 0 - hevm.expectEmit(true, true, false, true); - emit IL1ERC20Gateway.RefundERC20(address(l1Token), address(this), amount); - - uint256 balance = l1Token.balanceOf(address(this)); - l1CrossDomainMessenger.dropMessage(address(gateway), address(counterpartGateway), 0, 0, message); - assertEq(balance + amount, l1Token.balanceOf(address(this))); - } - function test_onDropMessage_beforeDropMessage_reverts() public { uint256 amount = 1000; diff --git a/contracts/contracts/test/L1ERC1155Gateway.t.sol b/contracts/contracts/test/L1ERC1155Gateway.t.sol index b81e9270..18fc2f8a 100644 --- a/contracts/contracts/test/L1ERC1155Gateway.t.sol +++ b/contracts/contracts/test/L1ERC1155Gateway.t.sol @@ -157,70 +157,6 @@ contract L1ERC1155GatewayTest is L1GatewayBaseTest, ERC1155TokenReceiver { _testBatchDepositERC1155WithRecipient(tokenCount, amount, recipient, gasLimit, feePerGas); } - function test_dropMessage_succeeds(uint256 tokenId, uint256 amount) public { - gateway.updateTokenMapping(address(l1Token), address(l2Token)); - - tokenId = bound(tokenId, 0, TOKEN_COUNT - 1); - amount = bound(amount, 1, MAX_TOKEN_BALANCE); - bytes memory message = abi.encodeCall( - IL2ERC1155Gateway.finalizeDepositERC1155, - (address(l1Token), address(l2Token), address(this), address(this), tokenId, amount) - ); - gateway.depositERC1155(address(l1Token), tokenId, amount, defaultGasLimit); - - // pop message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // drop message 0 - hevm.expectEmit(true, true, false, true); - emit IL1ERC1155Gateway.RefundERC1155(address(l1Token), address(this), tokenId, amount); - - uint256 balance = l1Token.balanceOf(address(this), tokenId); - l1CrossDomainMessenger.dropMessage(address(gateway), address(counterpartGateway), 0, 0, message); - assertEq(balance + amount, l1Token.balanceOf(address(this), tokenId)); - } - - function test_dropMessageBatch_succeeds(uint256 tokenCount, uint256 amount) public { - tokenCount = bound(tokenCount, 1, TOKEN_COUNT); - amount = bound(amount, 1, MAX_TOKEN_BALANCE); - gateway.updateTokenMapping(address(l1Token), address(l2Token)); - - uint256[] memory _tokenIds = new uint256[](tokenCount); - uint256[] memory _amounts = new uint256[](tokenCount); - for (uint256 i = 0; i < tokenCount; i++) { - _tokenIds[i] = i; - _amounts[i] = amount; - } - - bytes memory message = abi.encodeCall( - IL2ERC1155Gateway.finalizeBatchDepositERC1155, - (address(l1Token), address(l2Token), address(this), address(this), _tokenIds, _amounts) - ); - gateway.batchDepositERC1155(address(l1Token), _tokenIds, _amounts, defaultGasLimit); - - // pop message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // drop message 0 - hevm.expectEmit(true, true, false, true); - emit IL1ERC1155Gateway.BatchRefundERC1155(address(l1Token), address(this), _tokenIds, _amounts); - - uint256[] memory balances = new uint256[](tokenCount); - for (uint256 i = 0; i < tokenCount; i++) { - balances[i] = l1Token.balanceOf(address(this), _tokenIds[i]); - } - l1CrossDomainMessenger.dropMessage(address(gateway), address(counterpartGateway), 0, 0, message); - for (uint256 i = 0; i < tokenCount; i++) { - assertEq(balances[i] + _amounts[i], l1Token.balanceOf(address(this), _tokenIds[i])); - } - } - function test_onDropMessage_revert(uint256 tokenId, uint256 amount) external { gateway.updateTokenMapping(address(l1Token), address(l2Token)); tokenId = bound(tokenId, 0, TOKEN_COUNT - 1); diff --git a/contracts/contracts/test/L1ERC721Gateway.t.sol b/contracts/contracts/test/L1ERC721Gateway.t.sol index 17db63c8..b71e36b6 100644 --- a/contracts/contracts/test/L1ERC721Gateway.t.sol +++ b/contracts/contracts/test/L1ERC721Gateway.t.sol @@ -174,65 +174,6 @@ contract L1ERC721GatewayTest is L1GatewayBaseTest, ERC721TokenReceiver { _testBatchDepositERC721WithRecipient(tokenCount, recipient, gasLimit, feePerGas); } - function test_dropMessage_succeeds(uint256 tokenId) public { - gateway.updateTokenMapping(address(l1Token), address(l2Token)); - - tokenId = bound(tokenId, 0, TOKEN_COUNT - 1); - bytes memory message = abi.encodeCall( - IL2ERC721Gateway.finalizeDepositERC721, - (address(l1Token), address(l2Token), address(this), address(this), tokenId) - ); - gateway.depositERC721(address(l1Token), tokenId, defaultGasLimit); - - // pop message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // drop message 0 - hevm.expectEmit(true, true, false, true); - emit IL1ERC721Gateway.RefundERC721(address(l1Token), address(this), tokenId); - - assertEq(l1Token.ownerOf(tokenId), address(gateway)); - l1CrossDomainMessenger.dropMessage(address(gateway), address(counterpartGateway), 0, 0, message); - assertEq(l1Token.ownerOf(tokenId), address(this)); - } - - function test_dropMessageBatch_succeeds(uint256 tokenCount) public { - tokenCount = bound(tokenCount, 1, TOKEN_COUNT); - gateway.updateTokenMapping(address(l1Token), address(l2Token)); - - uint256[] memory _tokenIds = new uint256[](tokenCount); - for (uint256 i = 0; i < tokenCount; i++) { - _tokenIds[i] = i; - } - - bytes memory message = abi.encodeCall( - IL2ERC721Gateway.finalizeBatchDepositERC721, - (address(l1Token), address(l2Token), address(this), address(this), _tokenIds) - ); - gateway.batchDepositERC721(address(l1Token), _tokenIds, defaultGasLimit); - - // pop message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // drop message 0 - hevm.expectEmit(true, true, false, true); - emit IL1ERC721Gateway.BatchRefundERC721(address(l1Token), address(this), _tokenIds); - for (uint256 i = 0; i < tokenCount; i++) { - assertEq(l1Token.ownerOf(_tokenIds[i]), address(gateway)); - } - - l1CrossDomainMessenger.dropMessage(address(gateway), address(counterpartGateway), 0, 0, message); - for (uint256 i = 0; i < tokenCount; i++) { - assertEq(l1Token.ownerOf(_tokenIds[i]), address(this)); - } - } - function test_finalizeWithdrawERC721_counterError_fails(address sender, address recipient, uint256 tokenId) public { hevm.assume(recipient != address(0)); tokenId = bound(tokenId, 0, TOKEN_COUNT - 1); diff --git a/contracts/contracts/test/L1ETHGateway.t.sol b/contracts/contracts/test/L1ETHGateway.t.sol index 488e2777..d7e979b4 100644 --- a/contracts/contracts/test/L1ETHGateway.t.sol +++ b/contracts/contracts/test/L1ETHGateway.t.sol @@ -167,35 +167,6 @@ contract L1ETHGatewayTest is L1GatewayBaseTest { _depositETHWithRecipientAndCalldata(true, amount, recipient, dataToCall, gasLimit, feePerGas); } - function test_dropMessage_succeeds(uint256 amount, address recipient, bytes memory dataToCall) public { - amount = bound(amount, 1, address(this).balance); - bytes memory message = abi.encodeCall( - IL2ETHGateway.finalizeDepositETH, - (address(this), recipient, amount, dataToCall) - ); - l1ETHGateway.depositETHAndCall{value: amount}(recipient, amount, dataToCall, defaultGasLimit); - - // pop message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // ETH transfer failed, revert - revertOnReceive = true; - hevm.expectRevert("ETH transfer failed"); - l1CrossDomainMessenger.dropMessage(address(l1ETHGateway), address(counterpartGateway), amount, 0, message); - - // drop message 0 - hevm.expectEmit(true, true, false, true); - emit IL1ETHGateway.RefundETH(address(this), amount); - - revertOnReceive = false; - uint256 balance = address(this).balance; - l1CrossDomainMessenger.dropMessage(address(l1ETHGateway), address(counterpartGateway), amount, 0, message); - assertEq(balance + amount, address(this).balance); - } - function test_finalizeWithdrawETH_counterErr_fails( address sender, address recipient, diff --git a/contracts/contracts/test/L1MessageQueue.t.sol b/contracts/contracts/test/L1MessageQueue.t.sol index 2620f2e6..c11fa8f3 100644 --- a/contracts/contracts/test/L1MessageQueue.t.sol +++ b/contracts/contracts/test/L1MessageQueue.t.sol @@ -238,78 +238,6 @@ contract L1MessageQueueTest is L1MessageBaseTest { l1MessageQueue.popCrossDomainMessage(1, 2); } - function test_dropCrossDomainMessage_cannotDropPending_reverts() external { - bytes memory _calldata = "0x0"; - uint256 gasLimit = l1MessageQueue.calculateIntrinsicGasFee(_calldata); - - // Store alice as messenger and rollup. - upgradeStorage(address(alice), address(alice), address(alice)); - - // Expect revert when (_index < pendingQueueIndex) is false. - hevm.prank(alice); - l1MessageQueue.appendCrossDomainMessage(alice, gasLimit, _calldata); - hevm.prank(alice); - hevm.expectRevert("cannot drop pending message"); - l1MessageQueue.dropCrossDomainMessage(0); - } - - function test_pop_dropCrossDomainMessage_succeeds() external { - // store alice as messenger and rollup - upgradeStorage(address(alice), address(alice), address(alice)); - assertEq(alice, l1MessageQueue.MESSENGER()); - assertEq(alice, l1MessageQueue.ROLLUP_CONTRACT()); - bytes memory _calldata = "0x0"; - uint256 gasLimit = l1MessageQueue.calculateIntrinsicGasFee(_calldata); - // append 10 message - hevm.startPrank(alice); - for (uint64 i = 0; i < 10; i++) { - l1MessageQueue.appendCrossDomainMessage(alice, gasLimit, _calldata); - } - - // Verify the event QueueTransaction is emitted successfully. - hevm.expectEmit(false, false, false, true); - emit IL1MessageQueue.DequeueTransaction(0, 10); - - // pop all 10 message - l1MessageQueue.popCrossDomainMessage(0, 10); - - // drop all 10 message - for (uint64 i = 0; i < 10; i++) { - l1MessageQueue.dropCrossDomainMessage(i); - assertTrue(l1MessageQueue.isMessageDropped(i)); - } - hevm.stopPrank(); - } - - function test_dropCrossDomainMessage_dropAgain_reverts() external { - // store alice as messenger and rollup - upgradeStorage(address(alice), address(alice), address(alice)); - assertEq(alice, l1MessageQueue.MESSENGER()); - assertEq(alice, l1MessageQueue.ROLLUP_CONTRACT()); - bytes memory _calldata = "0x0"; - uint256 gasLimit = l1MessageQueue.calculateIntrinsicGasFee(_calldata); - // append 10 message - hevm.startPrank(alice); - for (uint64 i = 0; i < 10; i++) { - l1MessageQueue.appendCrossDomainMessage(alice, gasLimit, _calldata); - } - - // pop all 10 message - l1MessageQueue.popCrossDomainMessage(0, 10); - - // drop all 10 message - for (uint64 i = 0; i < 10; i++) { - l1MessageQueue.dropCrossDomainMessage(i); - assertTrue(l1MessageQueue.isMessageDropped(i)); - } - hevm.stopPrank(); - - // Expect revert when message already dropped. - hevm.prank(alice); - hevm.expectRevert("message already dropped"); - l1MessageQueue.dropCrossDomainMessage(1); - } - function test_updateMaxGasLimit_notOwner_reverts() external { // Verify the modifier onlyOwner works successfully. // It throws an error "Ownable: caller is not the owner" when msg.sender is not the owner. diff --git a/contracts/contracts/test/L1StandardERC20Gateway.t.sol b/contracts/contracts/test/L1StandardERC20Gateway.t.sol index 00bbe5e6..d9440daf 100644 --- a/contracts/contracts/test/L1StandardERC20Gateway.t.sol +++ b/contracts/contracts/test/L1StandardERC20Gateway.t.sol @@ -287,40 +287,6 @@ contract L1StandardERC20GatewayTest is L1GatewayBaseTest { assertEq(balanceBefore + amount - fee, balanceAfter); } - function test_dropMessage_succeeds(uint256 amount, address recipient, bytes memory dataToCall) public { - amount = bound(amount, 1, l1Token.balanceOf(address(this)) / 2); - bytes memory message = abi.encodeCall( - IL2ERC20Gateway.finalizeDepositERC20, - ( - address(l1Token), - address(l2Token), - address(this), - recipient, - amount, - abi.encode( - true, - abi.encode(dataToCall, abi.encode(l1Token.symbol(), l1Token.name(), l1Token.decimals())) - ) - ) - ); - l1StandardERC20Gateway.depositERC20AndCall(address(l1Token), recipient, amount, dataToCall, defaultGasLimit); - l1StandardERC20Gateway.depositERC20AndCall(address(l1Token), recipient, amount, dataToCall, defaultGasLimit); - - // pop message 0 and 1 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 2); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 2); - hevm.stopPrank(); - - // drop message 1 - hevm.expectEmit(true, true, false, true); - emit IL1ERC20Gateway.RefundERC20(address(l1Token), address(this), amount); - - uint256 balance = l1Token.balanceOf(address(this)); - l1CrossDomainMessenger.dropMessage(address(l1StandardERC20Gateway), address(counterpartGateway), 0, 1, message); - assertEq(balance + amount, l1Token.balanceOf(address(this))); - } - function test_finalizeWithdrawERC20_beforeFinalizeWithdrawERC20_reverts() public { address recipient = address(2048); address _from = address(counterpartGateway); diff --git a/contracts/contracts/test/L1WETHGateway.t.sol b/contracts/contracts/test/L1WETHGateway.t.sol index f4de6bac..1a8aa309 100644 --- a/contracts/contracts/test/L1WETHGateway.t.sol +++ b/contracts/contracts/test/L1WETHGateway.t.sol @@ -197,29 +197,6 @@ contract L1WETHGatewayTest is L1GatewayBaseTest { _depositERC20WithRecipientAndCalldata(true, amount, recipient, dataToCall, gasLimit, feePerGas); } - function test_dropMessage_succeeds(uint256 amount, address recipient, bytes memory dataToCall) public { - amount = bound(amount, 1, l1weth.balanceOf(address(this))); - bytes memory message = abi.encodeCall( - IL2ERC20Gateway.finalizeDepositERC20, - (address(l1weth), address(l2weth), address(this), recipient, amount, dataToCall) - ); - gateway.depositERC20AndCall(address(l1weth), recipient, amount, dataToCall, defaultGasLimit); - - // skip message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // drop message 0 - hevm.expectEmit(true, true, false, true); - emit IL1ERC20Gateway.RefundERC20(address(l1weth), address(this), amount); - - uint256 balance = l1weth.balanceOf(address(this)); - l1CrossDomainMessenger.dropMessage(address(gateway), address(counterpartGateway), amount, 0, message); - assertEq(balance + amount, l1weth.balanceOf(address(this))); - } - function test_finalizeWithdrawERC20_counterErr_fails( address sender, address recipient, From fc22179120b95eae03476ad7deabdc73751b8471 Mon Sep 17 00:00:00 2001 From: kukoo Date: Fri, 20 Dec 2024 11:37:23 +0800 Subject: [PATCH 14/14] Update message queue gas limit config (#683) --- contracts/src/deploy-config/holesky.ts | 2 +- contracts/src/deploy-config/l1.ts | 2 +- contracts/src/deploy-config/qanetl1.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/src/deploy-config/holesky.ts b/contracts/src/deploy-config/holesky.ts index 76ceef57..8999df58 100644 --- a/contracts/src/deploy-config/holesky.ts +++ b/contracts/src/deploy-config/holesky.ts @@ -8,7 +8,7 @@ const config = { l2ChainID: 2810, // L1MessageQueue config - l1MessageQueueMaxGasLimit: 100000000, + l1MessageQueueMaxGasLimit: 30000000, // gasPriceOracle config l2BaseFee: 0.1, // Gwei diff --git a/contracts/src/deploy-config/l1.ts b/contracts/src/deploy-config/l1.ts index bc0c67ad..e625e22d 100644 --- a/contracts/src/deploy-config/l1.ts +++ b/contracts/src/deploy-config/l1.ts @@ -11,7 +11,7 @@ const config = { l2ChainID: 53077, // L1MessageQueue config - l1MessageQueueMaxGasLimit: 100000000, + l1MessageQueueMaxGasLimit: 30000000, // gasPriceOracle config l2BaseFee: 0.1, // Gwei diff --git a/contracts/src/deploy-config/qanetl1.ts b/contracts/src/deploy-config/qanetl1.ts index 56fe986f..2b324ab4 100644 --- a/contracts/src/deploy-config/qanetl1.ts +++ b/contracts/src/deploy-config/qanetl1.ts @@ -8,7 +8,7 @@ const config = { l2ChainID: 53077, // L1MessageQueue config - l1MessageQueueMaxGasLimit: 100000000, + l1MessageQueueMaxGasLimit: 30000000, // gasPriceOracle config l2BaseFee: 0.1, // Gwei