diff --git a/.github/workflows/oracle.yml b/.github/workflows/oracle.yml deleted file mode 100644 index f7713932e..000000000 --- a/.github/workflows/oracle.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Oracle - -on: - push: - branches: - - main - paths: - - "oracle/**" - - ".github/workflows/oracle.yaml" - pull_request: - paths: - - "build/**" - - "bindings/**" - - "node/**" - - "oracle/**" - - ".github/workflows/oracle.yaml" - -defaults: - run: - working-directory: "oracle" - -jobs: - check: - if: github.event.pull_request.draft == false - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install Go - uses: actions/setup-go@v5 - with: - go-version: 1.22.x - - name: Lint - run: | - rm -rf $HOME/.cache/golangci-lint - make lint - test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install Go - uses: actions/setup-go@v5 - with: - go-version: 1.22.x - - name: Run build - run: make build - - name: Run tests - run: make test diff --git a/.gitmodules b/.gitmodules index 3b72cbd03..9c1d87aeb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "go-ethereum"] path = go-ethereum url = https://github.com/morph-l2/go-ethereum.git -branch = main +branch = features/coinbase diff --git a/Makefile b/Makefile index d695d2cfd..47cebff9f 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ ################## update dependencies #################### -ETHEREUM_TARGET_VERSION := v1.10.14-0.20250218031646-de5160c106de +ETHEREUM_TARGET_VERSION := v1.10.14-0.20250226070544-6039a12094aa TENDERMINT_TARGET_VERSION := v0.3.2-0.20250115141431-c84dfe5c8533 ETHEREUM_MODULE_NAME := github.com/morph-l2/go-ethereum @@ -128,7 +128,7 @@ go-ubuntu-builder: ################## devnet 4 nodes #################### -devnet-up: submodules go-ubuntu-builder +devnet-up: go-ubuntu-builder python3 ops/devnet-morph/main.py --polyrepo-dir=. .PHONY: devnet-up diff --git a/bindings/go.mod b/bindings/go.mod index c6e19ebc2..bcd5439b9 100644 --- a/bindings/go.mod +++ b/bindings/go.mod @@ -4,7 +4,7 @@ go 1.22 replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2-0.20250115141431-c84dfe5c8533 -require github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de +require github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd require ( github.com/VictoriaMetrics/fastcache v1.12.2 // indirect diff --git a/bindings/go.sum b/bindings/go.sum index 8341ef8c7..bb033749f 100644 --- a/bindings/go.sum +++ b/bindings/go.sum @@ -109,8 +109,8 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de h1:NOzYvFCuqWZ0bg2GAcC2S9cwd1rThSCTwyJCT8Iwfgc= -github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= +github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd h1:u8Ww4bHGUbRR2iPrLFaMM1GuCBQvL1cYUL7ijtbfoH0= +github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= diff --git a/contracts/go.mod b/contracts/go.mod index cced1fb2e..8be1abb7b 100644 --- a/contracts/go.mod +++ b/contracts/go.mod @@ -6,7 +6,7 @@ replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3. require ( github.com/iden3/go-iden3-crypto v0.0.16 - github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de + github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd github.com/stretchr/testify v1.9.0 ) diff --git a/contracts/go.sum b/contracts/go.sum index d70de2f97..44e63ca55 100644 --- a/contracts/go.sum +++ b/contracts/go.sum @@ -25,8 +25,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de h1:NOzYvFCuqWZ0bg2GAcC2S9cwd1rThSCTwyJCT8Iwfgc= -github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= +github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd h1:u8Ww4bHGUbRR2iPrLFaMM1GuCBQvL1cYUL7ijtbfoH0= +github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= diff --git a/contracts/src/deploy-config/l1.ts b/contracts/src/deploy-config/l1.ts index 2a57b3049..e25eca8bb 100644 --- a/contracts/src/deploy-config/l1.ts +++ b/contracts/src/deploy-config/l1.ts @@ -27,7 +27,7 @@ const config = { rollupProposer: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', rollupChallenger: '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65', // genesis config - batchHeader: '0x0000000000000000000000000000000000000000000000000043a758882ae97327ffcc63373e26fcd144a5a738eac834c167175d69713780c0010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014000000000000000000000000000000000000000000000000000000000000000020cd420e20d610897b8f2c5ac5259ab8b57cce1074212cec2815b2b73ff93d9f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + batchHeader: '0x000000000000000000000000000000000000000000000000000b2e7f71779f5cf83a7c814aefc01a72f4ea2a655c94a482461d755ae7ccc23a010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c44401400000000000000000000000000000000000000000000000000000000000000000b762b3dff1d9e0e89fdc07af2379d0df60e9c97e6bb4bb85ccb389677ae34ba000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', // staking config // staking Cross-Chain config diff --git a/go-ethereum b/go-ethereum index de5160c10..6039a1209 160000 --- a/go-ethereum +++ b/go-ethereum @@ -1 +1 @@ -Subproject commit de5160c106deeae615de11c6b72dc64109d18767 +Subproject commit 6039a12094aa91bc711d7296341f58ded34f3077 diff --git a/go.work b/go.work index a223f15ce..26ccd0560 100644 --- a/go.work +++ b/go.work @@ -6,6 +6,5 @@ use ( ./node ./ops/l2-genesis ./ops/tools - ./oracle ./tx-submitter ) diff --git a/go.work.sum b/go.work.sum index e42173204..9dd41278c 100644 --- a/go.work.sum +++ b/go.work.sum @@ -765,10 +765,8 @@ github.com/morph-l2/go-ethereum v1.10.14-0.20241028101924-8c247ffe3315 h1:egBq7X github.com/morph-l2/go-ethereum v1.10.14-0.20241028101924-8c247ffe3315/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= github.com/morph-l2/go-ethereum v1.10.14-0.20241224100051-1582a364edc0 h1:w0RXAFr/x9fWNgQkcrmSnZseYCNkbBFDWgEIfSqhCeY= github.com/morph-l2/go-ethereum v1.10.14-0.20241224100051-1582a364edc0/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= -github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de h1:NOzYvFCuqWZ0bg2GAcC2S9cwd1rThSCTwyJCT8Iwfgc= -github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= -github.com/morph-l2/tendermint v0.3.1 h1:yqyM3/p9sCNmFSsIFeIxS5RBgXHWqbtyNHx16I9cIZ0= -github.com/morph-l2/tendermint v0.3.1/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= +github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd h1:u8Ww4bHGUbRR2iPrLFaMM1GuCBQvL1cYUL7ijtbfoH0= +github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= diff --git a/node/core/batch.go b/node/core/batch.go index 987c4bf03..aac9355f4 100644 --- a/node/core/batch.go +++ b/node/core/batch.go @@ -178,13 +178,7 @@ func (e *Executor) CalculateCapWithProposalBlock(currentBlockBytes []byte, curre return false, err } - var exceeded bool - if e.isBatchUpgraded(block.Timestamp) { - exceeded, err = e.batchingCache.batchData.WillExceedCompressedSizeLimit(e.batchingCache.currentBlockContext, e.batchingCache.currentTxsPayload) - } else { - exceeded, err = e.batchingCache.batchData.EstimateCompressedSizeWithNewPayload(e.batchingCache.currentTxsPayload) - } - return exceeded, err + return e.batchingCache.batchData.WillExceedCompressedSizeLimit(e.batchingCache.currentBlockContext, e.batchingCache.currentTxsPayload) } func (e *Executor) AppendBlsData(height int64, batchHash []byte, data l2node.BlsData) error { @@ -347,7 +341,3 @@ func (e *Executor) ConvertBlsData(blsData l2node.BlsData) (*eth.BatchSignature, } return &bs, nil } - -func (e *Executor) isBatchUpgraded(blockTime uint64) bool { - return blockTime >= e.UpgradeBatchTime -} diff --git a/node/core/batch_seal.go b/node/core/batch_seal.go index be02cdfe1..40ab8ddac 100644 --- a/node/core/batch_seal.go +++ b/node/core/batch_seal.go @@ -61,7 +61,7 @@ func (e *Executor) SealBatch() ([]byte, []byte, error) { } // handleBatchSealing determines which version to use for compression and calculates the data hash. -func (e *Executor) handleBatchSealing(blockTimestamp uint64) ([]byte, common.Hash, error) { +func (e *Executor) handleBatchSealing(_ uint64) ([]byte, common.Hash, error) { var ( compressedPayload []byte batchDataHash common.Hash @@ -69,29 +69,17 @@ func (e *Executor) handleBatchSealing(blockTimestamp uint64) ([]byte, common.Has ) // Check if the batch should use the upgraded version - if e.isBatchUpgraded(blockTimestamp) { - compressedPayload, err = types.CompressBatchBytes(e.batchingCache.batchData.TxsPayloadV2()) - if err != nil { - return nil, common.Hash{}, fmt.Errorf("failed to compress upgraded payload: %w", err) - } - - if len(compressedPayload) <= types.MaxBlobBytesSize { - batchDataHash, err = e.batchingCache.batchData.DataHashV2() - if err != nil { - return nil, common.Hash{}, fmt.Errorf("failed to calculate upgraded data hash: %w", err) - } - return compressedPayload, batchDataHash, nil - } + compressedPayload, err = types.CompressBatchBytes(e.batchingCache.batchData.TxsPayloadV2()) + if err != nil { + return nil, common.Hash{}, fmt.Errorf("failed to compress upgraded payload: %w", err) } - // Fallback to old version if upgraded is not used - compressedPayload, err = types.CompressBatchBytes(e.batchingCache.batchData.TxsPayload()) + batchDataHash, err = e.batchingCache.batchData.DataHashV2() if err != nil { - return nil, common.Hash{}, fmt.Errorf("failed to compress payload: %w", err) + return nil, common.Hash{}, fmt.Errorf("failed to calculate upgraded data hash: %w", err) } - batchDataHash = e.batchingCache.batchData.DataHash() - return compressedPayload, batchDataHash, nil + } // createBatchHeader creates a BatchHeader from the given parameters. @@ -107,27 +95,23 @@ func (e *Executor) createBatchHeader(dataHash common.Hash, sidecar *eth.BlobTxSi parentBatchIndex, _ := e.batchingCache.parentBatchHeader.BatchIndex() parentBatchHash, _ := e.batchingCache.parentBatchHeader.Hash() - batchHeaderV0 := types.BatchHeaderV0{ - BatchIndex: parentBatchIndex + 1, - L1MessagePopped: l1MessagePopped, - TotalL1MessagePopped: e.batchingCache.totalL1MessagePopped, - DataHash: dataHash, - BlobVersionedHash: blobHashes[0], - PrevStateRoot: e.batchingCache.prevStateRoot, - PostStateRoot: e.batchingCache.postStateRoot, - WithdrawalRoot: e.batchingCache.withdrawRoot, - SequencerSetVerifyHash: sequencerSetVerifyHash, - ParentBatchHash: parentBatchHash, - } - if e.isBatchUpgraded(blockTimestamp) { - batchHeaderV1 := types.BatchHeaderV1{ - BatchHeaderV0: batchHeaderV0, - LastBlockNumber: e.batchingCache.lastPackedBlockHeight, - } - return batchHeaderV1.Bytes() - } - return batchHeaderV0.Bytes() + batchHeaderV1 := types.BatchHeaderV1{ + BatchHeaderV0: types.BatchHeaderV0{ + BatchIndex: parentBatchIndex + 1, + L1MessagePopped: l1MessagePopped, + TotalL1MessagePopped: e.batchingCache.totalL1MessagePopped, + DataHash: dataHash, + BlobVersionedHash: blobHashes[0], + PrevStateRoot: e.batchingCache.prevStateRoot, + PostStateRoot: e.batchingCache.postStateRoot, + WithdrawalRoot: e.batchingCache.withdrawRoot, + SequencerSetVerifyHash: sequencerSetVerifyHash, + ParentBatchHash: parentBatchHash, + }, + LastBlockNumber: e.batchingCache.lastPackedBlockHeight, + } + return batchHeaderV1.Bytes() } // logSealedBatch logs the details of the sealed batch for debugging purposes. diff --git a/node/core/config.go b/node/core/config.go index f14d66488..7ec217176 100644 --- a/node/core/config.go +++ b/node/core/config.go @@ -22,9 +22,19 @@ import ( "morph-l2/node/types" ) +type UpgradeConfig struct { + BatchTime uint64 + Morph204Time uint64 +} + var ( - MainnetUpgradeBatchTime uint64 = 2000 - HoleskyUpgradeBatchTime uint64 = 350000 + MainnetUpgradeConfig = UpgradeConfig{ + Morph204Time: 0, + } + + HoleskyUpgradeConfig = UpgradeConfig{ + Morph204Time: 0, + } ) type Config struct { @@ -34,7 +44,7 @@ type Config struct { GovAddress common.Address `json:"gov_address"` L2StakingAddress common.Address `json:"l2staking_address"` MaxL1MessageNumPerBlock uint64 `json:"max_l1_message_num_per_block"` - UpgradeBatchTime uint64 `json:"upgrade_batch_time"` + UpgradeConfig *UpgradeConfig `json:"upgrade_config"` DevSequencer bool `json:"dev_sequencer"` Logger tmlog.Logger `json:"logger"` } @@ -157,15 +167,25 @@ func (c *Config) SetCliContext(ctx *cli.Context) error { c.DevSequencer = ctx.GlobalBool(flags.DevSequencer.Name) } - // setup batch upgrade index + // setup upgrade config switch { case ctx.GlobalIsSet(flags.MainnetFlag.Name): - c.UpgradeBatchTime = MainnetUpgradeBatchTime + c.UpgradeConfig = &MainnetUpgradeConfig case ctx.GlobalIsSet(flags.HoleskyFlag.Name): - c.UpgradeBatchTime = HoleskyUpgradeBatchTime - case ctx.GlobalIsSet(flags.UpgradeBatchTime.Name): - c.UpgradeBatchTime = ctx.GlobalUint64(flags.UpgradeBatchTime.Name) - logger.Info("set UpgradeBatchTime: ", ctx.GlobalUint64(flags.UpgradeBatchTime.Name)) + c.UpgradeConfig = &HoleskyUpgradeConfig + } + if c.UpgradeConfig == nil { + c.UpgradeConfig = &UpgradeConfig{} + if ctx.GlobalIsSet(flags.UpgradeBatchTime.Name) { + logger.Info("set UpgradeBatchTime: ", ctx.GlobalUint64(flags.UpgradeBatchTime.Name)) + upgradeBatchTime := ctx.GlobalUint64(flags.UpgradeBatchTime.Name) + c.UpgradeConfig.BatchTime = upgradeBatchTime + } + if ctx.GlobalIsSet(flags.Morph204Time.Name) { + logger.Info("set Morph204Time: ", ctx.GlobalUint64(flags.Morph204Time.Name)) + morph204Time := ctx.GlobalUint64(flags.Morph204Time.Name) + c.UpgradeConfig.Morph204Time = morph204Time + } } return nil diff --git a/node/core/executor.go b/node/core/executor.go index a7209526e..2c9742f33 100644 --- a/node/core/executor.go +++ b/node/core/executor.go @@ -120,7 +120,7 @@ func NewExecutor(newSyncFunc NewSyncerFunc, config *Config, tmPubKey crypto.PubK devSequencer: config.DevSequencer, rollupABI: rollupAbi, batchingCache: NewBatchingCache(), - UpgradeBatchTime: config.UpgradeBatchTime, + UpgradeBatchTime: config.UpgradeConfig.BatchTime, logger: logger, metrics: PrometheusMetrics("morphnode"), } @@ -175,7 +175,16 @@ func (e *Executor) RequestBlockData(height int64) (txs [][]byte, blockMeta []byt l1MsgTx := tx.AsL1MessageTx() e.logger.Info("[debug]queueIndex in transactions: ", "queueIndex", l1MsgTx.QueueIndex, "gas", l1MsgTx.Gas, "hash", tx.Hash().String()) } - l2Block, err := e.l2Client.AssembleL2Block(context.Background(), big.NewInt(height), transactions) + + var tmKey [32]byte + copy(tmKey[:], e.tmPubKey) + val, found := e.valsByTmKey[tmKey] + if !found { + e.logger.Error("no address found for this proposer", "public key", hexutil.Encode(tmKey[:])) + return nil, nil, false, errors.New("no address found for this proposer") + } + coinbase := val.address + l2Block, err := e.l2Client.AssembleL2Block(context.Background(), big.NewInt(height), coinbase, transactions) if err != nil { e.logger.Error("failed to assemble block", "height", height, "error", err) return diff --git a/node/derivation/batch_info.go b/node/derivation/batch_info.go index 4c1470aa0..f9f7830d8 100644 --- a/node/derivation/batch_info.go +++ b/node/derivation/batch_info.go @@ -17,6 +17,11 @@ import ( "morph-l2/node/zstd" ) +const ( + // BlockContextLegacyLength is the length of a legacy block context without coinbase + BlockContextLegacyLength = 60 +) + type BlockContext struct { Number uint64 `json:"number"` Timestamp uint64 `json:"timestamp"` @@ -24,6 +29,7 @@ type BlockContext struct { GasLimit uint64 txsNum uint16 l1MsgNum uint16 + coinbase common.Address SafeL2Data *catalyst.SafeL2Data L2TxHashes []byte @@ -36,15 +42,18 @@ func (b *BlockContext) Decode(bc []byte) error { if err != nil { return err } - b.Number = wb.Number - b.Timestamp = wb.Timestamp b.BaseFee = wb.BaseFee b.GasLimit = wb.GasLimit b.txsNum = txsNum b.l1MsgNum = l1MsgNum + b.coinbase = wb.Miner return nil } +func decodeCoinbase(bc []byte) (common.Address, error) { + return types.DecodeCoinbase(bc) +} + type BatchInfo struct { batchIndex uint64 blockNum uint64 @@ -79,143 +88,168 @@ func (bi *BatchInfo) TxNum() uint64 { } // ParseBatch This method is externally referenced for parsing Batch -func (bi *BatchInfo) ParseBatch(batch geth.RPCRollupBatch) error { +func (bi *BatchInfo) ParseBatch(batch geth.RPCRollupBatch, morph204Time uint64) error { + if len(batch.Sidecar.Blobs) == 0 { + return fmt.Errorf("blobs length can not be zero") + } + + // Parse parent batch header parentBatchHeader := types.BatchHeaderBytes(batch.ParentBatchHeader) parentBatchIndex, err := parentBatchHeader.BatchIndex() if err != nil { - return fmt.Errorf("decode batch header index error:%v", err) + return fmt.Errorf("decode batch header index error: %v", err) } + totalL1MessagePopped, err := parentBatchHeader.TotalL1MessagePopped() if err != nil { - return fmt.Errorf("decode batch header totalL1MessagePopped error:%v", err) + return fmt.Errorf("decode batch header totalL1MessagePopped error: %v", err) } + + // Initialize batch info fields bi.parentTotalL1MessagePopped = totalL1MessagePopped bi.root = batch.PostStateRoot bi.batchIndex = parentBatchIndex + 1 bi.withdrawalRoot = batch.WithdrawRoot bi.version = uint64(batch.Version) + tq := newTxQueue() - var rawBlockContexts hexutil.Bytes - var txsData []byte + var rawBlockContextsAndTxs hexutil.Bytes + + // Handle version upgrade scenario + blobData, err := types.RetrieveBlobBytes(&batch.Sidecar.Blobs[0]) + if err != nil { + return fmt.Errorf("retrieve blob bytes error: %v", err) + } + + batchBytes, err := zstd.DecompressBatchBytes(blobData) + if err != nil { + return fmt.Errorf("decompress batch bytes error: %v", err) + } + + // Calculate block count based on version var blockCount uint64 if batch.Version > 0 { - parentVersion, err := parentBatchHeader.Version() - if err != nil { - return fmt.Errorf("decode batch header version error:%v", err) - } - if parentVersion == 0 { - if len(batch.Sidecar.Blobs) == 0 { - return fmt.Errorf("blobs length can not be zero") - } - blobData, err := types.RetrieveBlobBytes(&batch.Sidecar.Blobs[0]) - if err != nil { - return err - } - batchBytes, err := zstd.DecompressBatchBytes(blobData) - if err != nil { - return fmt.Errorf("decompress batch bytes error:%v", err) - } - var startBlock BlockContext - if err := startBlock.Decode(batchBytes[:60]); err != nil { - return fmt.Errorf("decode chunk block context error:%v", err) - } - blockCount = batch.LastBlockNumber - startBlock.Number + 1 - } else { - parentBatchBlock, err := parentBatchHeader.LastBlockNumber() - if err != nil { - return fmt.Errorf("decode batch header lastBlockNumber error:%v", err) - } - blockCount = batch.LastBlockNumber - parentBatchBlock + rawBlockContextsAndTxs = batchBytes + // Ensure we have enough data for block context + if len(batchBytes) < 60 { + return fmt.Errorf("insufficient batch bytes for block context, got %d bytes", len(batchBytes)) } - } - // If BlockContexts is not nil, the block context should not be included in the blob. - // Therefore, the required length must be zero. - length := blockCount * 60 - for _, blob := range batch.Sidecar.Blobs { - blobCopy := blob - blobData, err := types.RetrieveBlobBytes(&blobCopy) - if err != nil { - return err + var startBlock BlockContext + // coinbase does not enter batch at this time + if err := startBlock.Decode(batchBytes[:60]); err != nil { + return fmt.Errorf("decode chunk block context error: %v", err) } - batchBytes, err := zstd.DecompressBatchBytes(blobData) - if err != nil { - return err - } - reader := bytes.NewReader(batchBytes) - if batch.BlockContexts == nil { - if len(batchBytes) < int(length) { - rawBlockContexts = append(rawBlockContexts, batchBytes...) - length -= uint64(len(batchBytes)) - reader.Reset(nil) - } else { - bcBytes := make([]byte, length) - _, err = reader.Read(bcBytes) - if err != nil { - return fmt.Errorf("read block context error:%s", err.Error()) - } - rawBlockContexts = append(rawBlockContexts, bcBytes...) - length = 0 - } - } - data, err := io.ReadAll(reader) - if err != nil { - return fmt.Errorf("read txBytes error:%s", err.Error()) + + blockCount = batch.LastBlockNumber - startBlock.Number + 1 + } else { + // First 2 bytes contain the block count + if len(batch.BlockContexts) < 2 { + return fmt.Errorf("insufficient block contexts data: %d bytes", len(batch.BlockContexts)) } - txsData = append(txsData, data...) - } - if batch.BlockContexts != nil { + blockCount = uint64(binary.BigEndian.Uint16(batch.BlockContexts[:2])) - rawBlockContexts = batch.BlockContexts[2 : 60*blockCount+2] + rawBlockContextsAndTxs = append(rawBlockContextsAndTxs, batch.BlockContexts[2:]...) + rawBlockContextsAndTxs = append(rawBlockContextsAndTxs, batchBytes...) } - data, err := types.DecodeTxsFromBytes(txsData) - if err != nil { - return err - } - tq.enqueue(data) + var txsNum uint64 - var l1MsgNum uint64 blockContexts := make([]*BlockContext, int(blockCount)) + + reader := bytes.NewReader(rawBlockContextsAndTxs) + // Process block contexts for i := 0; i < int(blockCount); i++ { var block BlockContext - if err := block.Decode(rawBlockContexts[i*60 : i*60+60]); err != nil { - return fmt.Errorf("decode chunk block context error:%v", err) + bcBytes := make([]byte, BlockContextLegacyLength) + _, err = reader.Read(bcBytes) + if err != nil { + return fmt.Errorf("read block context numberAndTimeBytes error:%s", err.Error()) + } + if err := block.Decode(bcBytes); err != nil { + return fmt.Errorf("decode number and timestamp error: %v", err) + } + var coinbase common.Address + // handle coinbase + if morph204Time != 0 && block.Timestamp >= morph204Time { + coinbaseBytes := make([]byte, common.AddressLength) + _, err = reader.Read(coinbaseBytes) + if err != nil { + return fmt.Errorf("read skipped block context error:%s", err.Error()) + } + + coinbase, err = decodeCoinbase(coinbaseBytes) + if err != nil { + return err + } } + + // Set boundary block numbers if i == 0 { bi.firstBlockNumber = block.Number } if i == int(blockCount)-1 { bi.lastBlockNumber = block.Number } + + // Setup SafeL2Data var safeL2Data catalyst.SafeL2Data safeL2Data.Number = block.Number safeL2Data.GasLimit = block.GasLimit safeL2Data.BaseFee = block.BaseFee safeL2Data.Timestamp = block.Timestamp + // TODO coinbase + fmt.Println(coinbase) + + // Handle zero BaseFee case if block.BaseFee != nil && block.BaseFee.Cmp(big.NewInt(0)) == 0 { safeL2Data.BaseFee = nil } + + // Validate transaction numbers if block.txsNum < block.l1MsgNum { - return fmt.Errorf("txsNum must be or equal to or greater than l1MsgNum,txsNum:%v,l1MsgNum:%v", block.txsNum, block.l1MsgNum) - } - var txs []*eth.Transaction - var err error - if len(batch.Sidecar.Blobs) != 0 { - txs, err = tq.dequeue(int(block.txsNum) - int(block.l1MsgNum)) - if err != nil { - return fmt.Errorf("decode txsPayload error:%v", err) - } + return fmt.Errorf("txsNum must be greater than or equal to l1MsgNum, txsNum: %v, l1MsgNum: %v", + block.txsNum, block.l1MsgNum) } - txsNum += uint64(block.txsNum) - l1MsgNum += uint64(block.l1MsgNum) - // l1 transactions will be inserted later in front of L2 transactions - safeL2Data.Transactions = encodeTransactions(txs) - block.SafeL2Data = &safeL2Data + block.SafeL2Data = &safeL2Data blockContexts[i] = &block } + + // Read transaction data + txsData, err := io.ReadAll(reader) + if err != nil { + return fmt.Errorf("read transaction data error: %s", err.Error()) + } + + // Decode transactions + data, err := types.DecodeTxsFromBytes(txsData) + if err != nil { + return fmt.Errorf("decode transactions error: %v", err) + } + + // Process transactions + tq.enqueue(data) + + for i := 0; i < int(blockCount); i++ { + // Skip if index is out of bounds + if i >= len(blockContexts) { + return fmt.Errorf("block context index out of bounds: %d >= %d", i, len(blockContexts)) + } + + txCount := int(blockContexts[i].txsNum) - int(blockContexts[i].l1MsgNum) + txs, err := tq.dequeue(txCount) + if err != nil { + return fmt.Errorf("decode transaction payload error: %v", err) + } + + txsNum += uint64(blockContexts[i].txsNum) + // l1 transactions will be inserted later in front of L2 transactions + blockContexts[i].SafeL2Data.Transactions = encodeTransactions(txs) + } + bi.txNum += txsNum bi.blockContexts = blockContexts + return nil } diff --git a/node/derivation/config.go b/node/derivation/config.go index 439acbc42..4dcacd696 100644 --- a/node/derivation/config.go +++ b/node/derivation/config.go @@ -44,6 +44,7 @@ type Config struct { MetricsPort uint64 `json:"metrics_port"` MetricsHostname string `json:"metrics_hostname"` MetricsServerEnable bool `json:"metrics_server_enable"` + Morph204Time uint64 `json:"upgrade_time"` } func DefaultConfig() *Config { @@ -91,6 +92,10 @@ func (c *Config) SetCliContext(ctx *cli.Context) error { c.BaseHeight = ctx.GlobalUint64(flags.DerivationBaseHeight.Name) } + if ctx.GlobalIsSet(flags.Morph204Time.Name) { + c.Morph204Time = ctx.GlobalUint64(flags.Morph204Time.Name) + } + if ctx.GlobalIsSet(flags.DerivationPollInterval.Name) { c.PollInterval = ctx.GlobalDuration(flags.DerivationPollInterval.Name) if c.PollInterval == 0 { diff --git a/node/derivation/derivation.go b/node/derivation/derivation.go index a3fc43fbe..282b187a6 100644 --- a/node/derivation/derivation.go +++ b/node/derivation/derivation.go @@ -61,6 +61,7 @@ type Derivation struct { fetchBlockRange uint64 pollInterval time.Duration logProgressInterval time.Duration + morph204Time uint64 // Timestamp threshold for block context format stop chan struct{} } @@ -135,6 +136,7 @@ func NewDerivationClient(ctx context.Context, cfg *Config, syncer *sync.Syncer, fetchBlockRange: cfg.FetchBlockRange, pollInterval: cfg.PollInterval, logProgressInterval: cfg.LogProgressInterval, + morph204Time: cfg.Morph204Time, metrics: metrics, l1BeaconClient: l1BeaconClient, L2ToL1MessagePasser: msgPasser, @@ -409,7 +411,8 @@ func (d *Derivation) UnPackData(data []byte) (geth.RPCRollupBatch, error) { func (d *Derivation) parseBatch(batch geth.RPCRollupBatch, l2Height uint64) (*BatchInfo, error) { batchInfo := new(BatchInfo) - if err := batchInfo.ParseBatch(batch); err != nil { + // Set the derivation reference to access configuration + if err := batchInfo.ParseBatch(batch, d.morph204Time); err != nil { return nil, fmt.Errorf("parse batch error:%v", err) } if err := d.handleL1Message(batchInfo, batchInfo.parentTotalL1MessagePopped, l2Height); err != nil { diff --git a/node/derivation/derivation_test.go b/node/derivation/derivation_test.go index 653ce96ce..ed815791b 100644 --- a/node/derivation/derivation_test.go +++ b/node/derivation/derivation_test.go @@ -34,16 +34,11 @@ func TestUnPackData(t *testing.T) { require.Error(t, err) legacyTxData, err := hexutil.Decode(legacyData) require.NoError(t, err) - legacyBatch, err := d.UnPackData(legacyTxData) - require.NoError(t, err) - LegacyBatchInfo := new(BatchInfo) - err = LegacyBatchInfo.ParseBatch(legacyBatch) + _, err = d.UnPackData(legacyTxData) require.NoError(t, err) beforeMoveBctxTxData, err := hexutil.Decode(beforeMoveBctxData) require.NoError(t, err) - beforeMoveBctxBatch, err := d.UnPackData(beforeMoveBctxTxData) - require.NoError(t, err) - beforeMoveBctxBatchInfo := new(BatchInfo) - err = beforeMoveBctxBatchInfo.ParseBatch(beforeMoveBctxBatch) + _, err = d.UnPackData(beforeMoveBctxTxData) require.NoError(t, err) + } diff --git a/node/flags/flags.go b/node/flags/flags.go index 7ea7c21b2..b58c22047 100644 --- a/node/flags/flags.go +++ b/node/flags/flags.go @@ -198,7 +198,7 @@ var ( DerivationBaseHeight = cli.Uint64Flag{ Name: "derivation.baseHeight", - Usage: "The starting height of l2 derive, usually the node snapshot or other trusted starting height, before which stateRoot will not be checked", + Usage: "L2 snapshot base block height", EnvVar: prefixEnvVar("DERIVATION_BASE_HEIGHT"), } @@ -220,12 +220,23 @@ var ( EnvVar: prefixEnvVar("DERIVATION_FETCH_BLOCK_RANGE"), } + DerivationConfirmations = cli.Int64Flag{ + Name: "derivation.confirmations", + Usage: "The number of confirmations needed on L1 for finalization. If not set, the default value is l1.confirmations", + EnvVar: prefixEnvVar("DERIVATION_CONFIRMATIONS"), + } + // Batch rules UpgradeBatchTime = cli.Uint64Flag{ Name: "upgrade.batchTime", Usage: "Batch index at which the sequencers start to upgrade the batch format", EnvVar: prefixEnvVar("UPGRADE_BATCH_TIME"), } + Morph204Time = cli.Uint64Flag{ + Name: "morph204Time", + Usage: "Morph 204 upgrade time", + EnvVar: prefixEnvVar("MORPH_204_TIME"), + } MainnetFlag = cli.BoolFlag{ Name: "mainnet", Usage: "Morph mainnet", @@ -235,11 +246,6 @@ var ( Usage: "Morph Holesky", } - DerivationConfirmations = cli.Int64Flag{ - Name: "derivation.confirmations", - Usage: "The number of confirmations needed on L1 for finalization. If not set, the default value is l1.confirmations", - EnvVar: prefixEnvVar("DERIVATION_CONFIRMATIONS"), - } // Logger LogLevel = &cli.StringFlag{ Name: "log.level", @@ -343,6 +349,7 @@ var Flags = []cli.Flag{ L1BeaconAddr, // batch rules + Morph204Time, UpgradeBatchTime, MainnetFlag, HoleskyFlag, diff --git a/node/go.mod b/node/go.mod index d298192af..e0fd556fa 100644 --- a/node/go.mod +++ b/node/go.mod @@ -10,7 +10,7 @@ require ( github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/golang-lru v1.0.2 github.com/klauspost/compress v1.17.9 - github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de + github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd github.com/prometheus/client_golang v1.17.0 github.com/spf13/viper v1.13.0 github.com/stretchr/testify v1.9.0 diff --git a/node/go.sum b/node/go.sum index c83da4eb5..4d6d63b02 100644 --- a/node/go.sum +++ b/node/go.sum @@ -360,8 +360,8 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de h1:NOzYvFCuqWZ0bg2GAcC2S9cwd1rThSCTwyJCT8Iwfgc= -github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= +github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd h1:u8Ww4bHGUbRR2iPrLFaMM1GuCBQvL1cYUL7ijtbfoH0= +github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= github.com/morph-l2/tendermint v0.3.2-0.20250115141431-c84dfe5c8533 h1:qhBMCyTQ/ezOpeqHGKjr4qSN/B/bGFByuYjQqDt5wiw= github.com/morph-l2/tendermint v0.3.2-0.20250115141431-c84dfe5c8533/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= diff --git a/node/sequencer/mock/sequencer.go b/node/sequencer/mock/sequencer.go index 55e9e6017..42426dc31 100644 --- a/node/sequencer/mock/sequencer.go +++ b/node/sequencer/mock/sequencer.go @@ -5,6 +5,7 @@ import ( "math/big" "time" + "github.com/morph-l2/go-ethereum/common" "github.com/morph-l2/go-ethereum/log" node "morph-l2/node/core" @@ -39,7 +40,7 @@ func (s *Sequencer) Start() { select { case <-blockTicker.C: log.Info("start to build new block", "block number", s.currentBlock+1) - l2Data, err := s.engine.L2Client().AssembleL2Block(context.Background(), big.NewInt(s.currentBlock+1), nil) + l2Data, err := s.engine.L2Client().AssembleL2Block(context.Background(), big.NewInt(s.currentBlock+1), common.Address{}, nil) if err != nil { log.Error("error assembling block", "error", err) continue diff --git a/node/types/consensus_message.go b/node/types/consensus_message.go index 94742380b..58d479257 100644 --- a/node/types/consensus_message.go +++ b/node/types/consensus_message.go @@ -105,7 +105,7 @@ func (wb *WrappedBlock) UnmarshalBinary(b []byte) error { } func (wb *WrappedBlock) BlockContextBytes(txsNum, l1MsgNum int) []byte { - // Number(8) || Timestamp(8) || BaseFee(32) || GasLimit(8) || numTxs(2) || numL1Messages(2) + // Number(8) || Timestamp(8) || BaseFee(32) || GasLimit(8) || numTxs(2) || numL1Messages(2) || Miner(20) blsBytes := make([]byte, 60) copy(blsBytes[:8], Uint64ToBigEndianBytes(wb.Number)) copy(blsBytes[8:16], Uint64ToBigEndianBytes(wb.Timestamp)) @@ -118,6 +118,11 @@ func (wb *WrappedBlock) BlockContextBytes(txsNum, l1MsgNum int) []byte { copy(blsBytes[56:58], Uint16ToBigEndianBytes(uint16(txsNum))) copy(blsBytes[58:60], Uint16ToBigEndianBytes(uint16(l1MsgNum))) + if wb.Miner != types.EmptyAddress { + blsBytes = append(blsBytes, make([]byte, common.AddressLength)...) + copy(blsBytes[60:], wb.Miner.Bytes()) + } + return blsBytes } @@ -147,6 +152,13 @@ func (wb *WrappedBlock) DecodeBlockContext(bc []byte) (uint16, uint16, error) { return txsNum, l1MsgNum, nil } +func DecodeCoinbase(bc []byte) (common.Address, error) { + if len(bc) != common.AddressLength { + return common.Address{}, fmt.Errorf("invalid bytes length expect 20 have %v", len(bc)) + } + return common.BytesToAddress(bc), nil +} + func WrappedBlockFromBytes(blockBytes []byte) (*WrappedBlock, error) { var curBlock = new(WrappedBlock) if err := curBlock.UnmarshalBinary(blockBytes); err != nil { diff --git a/node/types/retryable_client.go b/node/types/retryable_client.go index 3d3ad949d..cc99f0617 100644 --- a/node/types/retryable_client.go +++ b/node/types/retryable_client.go @@ -45,9 +45,9 @@ func NewRetryableClient(authClient *authclient.Client, ethClient *ethclient.Clie } } -func (rc *RetryableClient) AssembleL2Block(ctx context.Context, number *big.Int, transactions eth.Transactions) (ret *catalyst.ExecutableL2Data, err error) { +func (rc *RetryableClient) AssembleL2Block(ctx context.Context, number *big.Int, coinbase common.Address, transactions eth.Transactions) (ret *catalyst.ExecutableL2Data, err error) { if retryErr := backoff.Retry(func() error { - resp, respErr := rc.authClient.AssembleL2Block(ctx, number, transactions) + resp, respErr := rc.authClient.AssembleL2Block(ctx, number, coinbase, transactions) if respErr != nil { rc.logger.Info("failed to AssembleL2Block", "error", respErr) if retryableError(respErr) { diff --git a/ops/docker/Dockerfile.l1-beacon b/ops/docker/Dockerfile.l1-beacon index a48869810..0f567bcd9 100644 --- a/ops/docker/Dockerfile.l1-beacon +++ b/ops/docker/Dockerfile.l1-beacon @@ -1,5 +1,6 @@ FROM --platform=linux/amd64 ubuntu:20.04 as chain-genesis RUN apt-get update && ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime && apt-get install build-essential curl wget git make pkg-config -y +RUN date RUN curl -o prysmctl -fLO https://github.com/prysmaticlabs/prysm/releases/download/v4.2.1/prysmctl-v4.2.1-linux-amd64 RUN chmod +x prysmctl COPY ops/docker/consensus /consensus diff --git a/ops/docker/docker-compose-4nodes.yml b/ops/docker/docker-compose-4nodes.yml index 7353ee639..8a961bc64 100644 --- a/ops/docker/docker-compose-4nodes.yml +++ b/ops/docker/docker-compose-4nodes.yml @@ -250,6 +250,7 @@ services: command: > morphnode --home $NODE_DATA_DIR +## --log.level="consensus:debug,*:info" node-1: container_name: node-1 diff --git a/ops/l2-genesis/deploy-config/devnet-deploy-config.json b/ops/l2-genesis/deploy-config/devnet-deploy-config.json index 0dfc49866..40d1f5d01 100644 --- a/ops/l2-genesis/deploy-config/devnet-deploy-config.json +++ b/ops/l2-genesis/deploy-config/devnet-deploy-config.json @@ -21,8 +21,8 @@ "gasPriceOracleOwner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "govVotingDuration": 1000, - "govBatchBlockInterval": 20, - "govBatchTimeout": 600, + "govBatchBlockInterval": 600, + "govBatchTimeout": 1200, "govRollupEpoch": 100, "recordOracleAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", @@ -43,6 +43,12 @@ "0x343C5154FFe47c8a07DF5ea6846404e68E9809A2", "0xaaC606d51De6A5aBF0d1B9dbd5ed5Ff2Ac2e521B" ], + "l2StakingPks": [ + "0xd99870855d97327d20c666abc78588f1449b1fac76ed0c86c1afb9ce2db85f32", + "0x0890c388c3bf5e04fee1d8f3c117e5f44f435ced7baf7bfd66c10e1f3a3f4b10", + "0x6fd437eef7a83c486bd2e0a802ae071b3912d125ac31ac08f60841fd891559ae", + "0x9ae53aecdaebe4dcbfec96f3123a2a8c53f9596bf4b3d5adc9a388ccb361b4c0" + ], "l2StakingTmKeys": [ "0x5280d0eee2a64d3ad29480d15ffd1b048ce5908f180b5ccd65cc3dcf00941abb", "0xb798eb74c06721d54c659e9ea2bc232a7f95e96d234cc87186b2ab8f43db6935", diff --git a/ops/l2-genesis/go.mod b/ops/l2-genesis/go.mod index 9102c3db9..697db07f5 100644 --- a/ops/l2-genesis/go.mod +++ b/ops/l2-genesis/go.mod @@ -6,7 +6,7 @@ replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3. require ( github.com/holiman/uint256 v1.2.4 - github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de + github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd github.com/stretchr/testify v1.9.0 github.com/urfave/cli v1.22.14 ) diff --git a/ops/l2-genesis/go.sum b/ops/l2-genesis/go.sum index 38c073c78..fe89b72b0 100644 --- a/ops/l2-genesis/go.sum +++ b/ops/l2-genesis/go.sum @@ -143,8 +143,8 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de h1:NOzYvFCuqWZ0bg2GAcC2S9cwd1rThSCTwyJCT8Iwfgc= -github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= +github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd h1:u8Ww4bHGUbRR2iPrLFaMM1GuCBQvL1cYUL7ijtbfoH0= +github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= diff --git a/ops/l2-genesis/morph-chain-ops/genesis/config.go b/ops/l2-genesis/morph-chain-ops/genesis/config.go index 650e283b9..fab291066 100644 --- a/ops/l2-genesis/morph-chain-ops/genesis/config.go +++ b/ops/l2-genesis/morph-chain-ops/genesis/config.go @@ -128,6 +128,7 @@ type DeployConfig struct { // Upgrade configs Morph203Time *uint64 `json:"morph203Time,omitempty"` + Morph204Time *uint64 `json:"morph204Time,omitempty"` } // GetDeployedAddresses will get the deployed addresses of deployed L1 contracts diff --git a/ops/l2-genesis/morph-chain-ops/genesis/genesis.go b/ops/l2-genesis/morph-chain-ops/genesis/genesis.go index 3e896273d..2ed6998db 100644 --- a/ops/l2-genesis/morph-chain-ops/genesis/genesis.go +++ b/ops/l2-genesis/morph-chain-ops/genesis/genesis.go @@ -35,10 +35,16 @@ func NewL2Genesis(config *DeployConfig, block *types.Block) (*core.Genesis, erro sequencerFeeVaultReceipt = predeploys.L2TxFeeVaultAddr } - var morph203Time *uint64 + var ( + morph203Time *uint64 + morph204Time *uint64 + ) if config.Morph203Time != nil { morph203Time = config.Morph203Time } + if config.Morph204Time != nil { + morph204Time = config.Morph204Time + } morphChainConfig := params.ChainConfig{ ChainID: new(big.Int).SetUint64(config.L2ChainID), @@ -61,6 +67,7 @@ func NewL2Genesis(config *DeployConfig, block *types.Block) (*core.Genesis, erro BernoulliBlock: big.NewInt(0), CurieBlock: big.NewInt(0), Morph203Time: morph203Time, + Morph204Time: morph204Time, TerminalTotalDifficulty: big.NewInt(0), Morph: params.MorphConfig{ UseZktrie: true, diff --git a/ops/tools/go.mod b/ops/tools/go.mod index d7301b8d3..28cc8e6a8 100644 --- a/ops/tools/go.mod +++ b/ops/tools/go.mod @@ -5,7 +5,7 @@ go 1.22 replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2-0.20250115141431-c84dfe5c8533 require ( - github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de + github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd github.com/tendermint/tendermint v0.35.9 ) diff --git a/ops/tools/go.sum b/ops/tools/go.sum index e1249465b..e69dfef41 100644 --- a/ops/tools/go.sum +++ b/ops/tools/go.sum @@ -163,8 +163,8 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de h1:NOzYvFCuqWZ0bg2GAcC2S9cwd1rThSCTwyJCT8Iwfgc= -github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= +github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd h1:u8Ww4bHGUbRR2iPrLFaMM1GuCBQvL1cYUL7ijtbfoH0= +github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= github.com/morph-l2/tendermint v0.3.2-0.20250115141431-c84dfe5c8533 h1:qhBMCyTQ/ezOpeqHGKjr4qSN/B/bGFByuYjQqDt5wiw= github.com/morph-l2/tendermint v0.3.2-0.20250115141431-c84dfe5c8533/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= diff --git a/oracle/Dockerfile b/oracle/Dockerfile deleted file mode 100644 index 7a04ec8e6..000000000 --- a/oracle/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -# Build Geth in a stock Go builder container -FROM golang:1.20-alpine as builder - -RUN apk add --no-cache gcc musl-dev linux-headers git make - -COPY . /staking-oracle - -WORKDIR /staking-oracle - -RUN make staking-oracle - -# Pull Geth into a second stage deploy alpine container -FROM alpine:latest - -RUN apk add --no-cache ca-certificates -COPY --from=builder /staking-oracle/staking-oracle /usr/local/bin/ - -CMD ["staking-oracle"] \ No newline at end of file diff --git a/oracle/Makefile b/oracle/Makefile deleted file mode 100644 index 2aa65c433..000000000 --- a/oracle/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -.PHONY: staking-oracle build clean test lint - -GITCOMMIT := $(shell git rev-parse HEAD) -GITDATE := $(shell git show -s --format='%ct') - -LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT) -LDFLAGSSTRING +=-X main.GitDate=$(GITDATE) -LDFLAGS := -ldflags "$(LDFLAGSSTRING)" - -build: - env GO111MODULE=on CGO_LDFLAGS="-ldl" go build -o build/bin/staking-oracle -v $(LDFLAGS) ./cmd/staking-oracle - -clean: - rm -r build - -test: - go test -v -race -coverprofile=coverage.txt -covermode=atomic -p 1 ./... - -lint: - GOBIN=$(PWD)/build/bin go run ../build/lint.go diff --git a/oracle/backoff/operation.go b/oracle/backoff/operation.go deleted file mode 100644 index 5e0f7601a..000000000 --- a/oracle/backoff/operation.go +++ /dev/null @@ -1,64 +0,0 @@ -package backoff - -import ( - "context" - "fmt" - "time" -) - -// Operation represents an operation that will be retried -// based on some backoff strategy if it fails. -type Operation func() error - -// ErrFailedPermanently is an error raised by Do when the -// underlying Operation has been retried maxAttempts times. -type ErrFailedPermanently struct { - attempts int - LastErr error -} - -func (e *ErrFailedPermanently) Error() string { - return fmt.Sprintf("operation failed permanently after %d attempts: %v", e.attempts, e.LastErr) -} - -// Do performs the provided Operation up to maxAttempts times -// with delays in between each retry according to the provided -// Strategy. -func Do(maxAttempts int, strategy Strategy, op Operation) error { - return DoCtx(context.Background(), maxAttempts, strategy, op) -} - -func DoCtx(ctx context.Context, maxAttempts int, strategy Strategy, op Operation) error { - if maxAttempts < 1 { - return fmt.Errorf("need at least 1 attempt to run op, but have %d max attempts", maxAttempts) - } - var attempt int - - reattemptCh := make(chan struct{}, 1) - doReattempt := func() { - reattemptCh <- struct{}{} - } - doReattempt() - - for { - select { - case <-ctx.Done(): - return ctx.Err() - case <-reattemptCh: - attempt++ - err := op() - if err == nil { - return nil - } - - if attempt == maxAttempts { - return &ErrFailedPermanently{ - attempts: maxAttempts, - LastErr: err, - } - } - time.AfterFunc(strategy.Duration(attempt-1), doReattempt) - } - - } -} diff --git a/oracle/backoff/operation_test.go b/oracle/backoff/operation_test.go deleted file mode 100644 index 063e9685e..000000000 --- a/oracle/backoff/operation_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package backoff - -import ( - "errors" - "testing" - "time" - - "github.com/stretchr/testify/require" -) - -func TestDo(t *testing.T) { - strategy := Fixed(10 * time.Millisecond) - dummyErr := errors.New("explode") - - start := time.Now() - var i int - require.NoError(t, Do(2, strategy, func() error { - if i == 1 { - return nil - } - - i++ - return dummyErr - })) - require.True(t, time.Since(start) > 10*time.Millisecond) - - start = time.Now() - // add one because the first attempt counts - err := Do(3, strategy, func() error { - return dummyErr - }) - require.Equal(t, dummyErr, err.(*ErrFailedPermanently).LastErr) - require.True(t, time.Since(start) > 20*time.Millisecond) -} diff --git a/oracle/backoff/strategies.go b/oracle/backoff/strategies.go deleted file mode 100644 index a852f37df..000000000 --- a/oracle/backoff/strategies.go +++ /dev/null @@ -1,63 +0,0 @@ -package backoff - -import ( - "math" - "math/rand" - "time" -) - -// Strategy is used to calculate how long a particular Operation -// should wait between attempts. -type Strategy interface { - // Duration returns how long to wait for a given retry attempt. - Duration(attempt int) time.Duration -} - -// ExponentialStrategy performs exponential backoff. The exponential backoff -// function is min(e.Min + (2^attempt * 1000) + randBetween(0, e.MaxJitter), e.Max) -type ExponentialStrategy struct { - // Min is the minimum amount of time to wait between attempts in ms. - Min float64 - - // Max is the maximum amount of time to wait between attempts in ms. - Max float64 - - // MaxJitter is the maximum amount of random jitter to insert between - // attempts in ms. - MaxJitter int -} - -func (e *ExponentialStrategy) Duration(attempt int) time.Duration { - var jitter int - if e.MaxJitter > 0 { - jitter = rand.Intn(e.MaxJitter) - } - dur := e.Min + (math.Pow(2, float64(attempt)) * 1000) - dur += float64(jitter) - if dur > e.Max { - return time.Millisecond * time.Duration(e.Max) - } - - return time.Millisecond * time.Duration(dur) -} - -func Exponential() Strategy { - return &ExponentialStrategy{ - Max: 10000, - MaxJitter: 250, - } -} - -type FixedStrategy struct { - Dur time.Duration -} - -func (f *FixedStrategy) Duration(attempt int) time.Duration { - return f.Dur -} - -func Fixed(dur time.Duration) Strategy { - return &FixedStrategy{ - Dur: dur, - } -} diff --git a/oracle/backoff/strategies_test.go b/oracle/backoff/strategies_test.go deleted file mode 100644 index 2988a3233..000000000 --- a/oracle/backoff/strategies_test.go +++ /dev/null @@ -1,21 +0,0 @@ -package backoff - -import ( - "testing" - "time" - - "github.com/stretchr/testify/require" -) - -func TestExponential(t *testing.T) { - strategy := &ExponentialStrategy{ - Min: 3000, - Max: 10000, - MaxJitter: 0, - } - - durations := []int{4, 5, 7, 10, 10} - for i, dur := range durations { - require.Equal(t, time.Millisecond*time.Duration(dur*1000), strategy.Duration(i)) - } -} diff --git a/oracle/cmd/staking-oracle/main.go b/oracle/cmd/staking-oracle/main.go deleted file mode 100644 index 7fc0d856a..000000000 --- a/oracle/cmd/staking-oracle/main.go +++ /dev/null @@ -1,34 +0,0 @@ -package main - -import ( - "fmt" - "os" - - "github.com/morph-l2/go-ethereum/log" - "github.com/morph-l2/go-ethereum/params" - "github.com/urfave/cli" - - "morph-l2/oracle/flags" - "morph-l2/oracle/oracle" -) - -var ( - GitVersion = "" - GitCommit = "" - GitDate = "" -) - -func main() { - - app := cli.NewApp() - app.Flags = flags.Flags - app.Version = fmt.Sprintf("%s-%s", GitVersion, params.VersionWithCommit(GitCommit, GitDate)) - app.Name = "staking-oracle" - app.Usage = "Staking oracle Service" - - app.Action = oracle.Main() - err := app.Run(os.Args) - if err != nil { - log.Crit("Application failed", "message", err) - } -} diff --git a/oracle/config/config.go b/oracle/config/config.go deleted file mode 100644 index 510531db0..000000000 --- a/oracle/config/config.go +++ /dev/null @@ -1,163 +0,0 @@ -package config - -import ( - "fmt" - "time" - - "github.com/morph-l2/go-ethereum/common" - "github.com/morph-l2/go-ethereum/log" - "github.com/urfave/cli" - - "morph-l2/oracle/flags" -) - -type Config struct { - /* Required Params */ - - // ChainID identifies the chain being indexed. - ChainID uint64 - - // L1EthRpc is the HTTP provider URL for L1. - L1EthRpc string - - // L2EthRpc is the HTTP provider URL for L1. - L2EthRpc string - - TendermintRpc string - - // PollInterval is the delay between querying L2 for more transaction - // and creating a new batch. - PollInterval time.Duration - - /* Optional Params */ - - // LogLevel is the lowest log level that will be output. - LogLevel string - - // LogTerminal if true, prints to stdout in terminal format, otherwise - // prints using JSON. If SentryEnable is true this flag is ignored, and logs - // are printed using JSON. - LogTerminal bool - - LogFilename string - - LogFileMaxSize int - - LogFileMaxAge int - - LogCompress bool - - // MetricsServerEnable if true, will create a metrics client and log to - // Prometheus. - MetricsServerEnable bool - - // MetricsHostname is the hostname at which the metrics server is running. - MetricsHostname string - - // MetricsPort is the port at which the metrics server is running. - MetricsPort uint64 - - RollupAddr common.Address - - MaxSize uint64 - MinSize uint64 - StartBlock uint64 - PrivKey string - - // external sign - ExternalSign bool - ExternalSignAddress string - ExternalSignAppid string - ExternalSignChain string - ExternalSignUrl string - ExternalSignRsaPriv string -} - -// NewConfig parses the Config from the provided flags or environment variables. -// This method fails if ValidateConfig deems the configuration to be malformed. -func NewConfig(ctx *cli.Context) (Config, error) { - cfg := Config{ - /* Required Flags */ - L1EthRpc: ctx.GlobalString(flags.L1EthRPCFlag.Name), - L2EthRpc: ctx.GlobalString(flags.L2EthRPCFlag.Name), - TendermintRpc: ctx.GlobalString(flags.TendermintFlag.Name), - RollupAddr: common.HexToAddress(ctx.GlobalString(flags.RollupAddress.Name)), - PrivKey: ctx.GlobalString(flags.PrivateKeyFlag.Name), - /* Optional Flags */ - MaxSize: ctx.GlobalUint64(flags.MaxHeaderBatchSizeFlag.Name), - MinSize: ctx.GlobalUint64(flags.MinHeaderBatchSizeFlag.Name), - LogLevel: ctx.GlobalString(flags.LogLevelFlag.Name), - LogTerminal: ctx.GlobalBool(flags.LogTerminalFlag.Name), - MetricsServerEnable: ctx.GlobalBool(flags.MetricsServerEnableFlag.Name), - MetricsHostname: ctx.GlobalString(flags.MetricsHostnameFlag.Name), - MetricsPort: ctx.GlobalUint64(flags.MetricsPortFlag.Name), - // external sign - 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), - } - - if ctx.GlobalIsSet(flags.LogFilenameFlag.Name) { - cfg.LogFilename = ctx.GlobalString(flags.LogFilenameFlag.Name) - - maxSize := ctx.GlobalInt(flags.LogFileMaxSizeFlag.Name) - if maxSize < 1 { - return Config{}, fmt.Errorf("wrong log.maxsize set: %d", maxSize) - } - cfg.LogFileMaxSize = maxSize - maxAge := ctx.GlobalInt(flags.LogFileMaxAgeFlag.Name) - if maxAge < 1 { - return Config{}, fmt.Errorf("wrong log.maxage set: %d", maxAge) - } - cfg.LogFileMaxAge = maxAge - cfg.LogCompress = ctx.GlobalBool(flags.LogCompressFlag.Name) - } - - err := ValidateConfig(&cfg) - if err != nil { - return Config{}, err - } - - return cfg, nil -} - -// ValidateConfig ensures additional constraints on the parsed configuration to -// ensure that it is well-formed. -func ValidateConfig(cfg *Config) error { - // Sanity check log level. - if cfg.LogLevel == "" { - cfg.LogLevel = "debug" - } - - _, err := log.LvlFromString(cfg.LogLevel) - if err != nil { - return err - } - - if (cfg.RollupAddr == common.Address{}) { - return fmt.Errorf( - "invalied address,RollupAddress:%v", - cfg.RollupAddr.String(), - ) - } - if cfg.ExternalSign && - (cfg.ExternalSignAddress == "" || - cfg.ExternalSignUrl == "" || - cfg.ExternalSignAppid == "" || - cfg.ExternalSignChain == "" || - cfg.ExternalSignRsaPriv == "") { - return fmt.Errorf("invalid external sign config,ExternalSignAddress:%v,ExternalSignUrl:%v,ExternalSignAppid:%v,ExternalSignChain:%v", - cfg.ExternalSignAddress, - cfg.ExternalSignUrl, - cfg.ExternalSignAppid, - cfg.ExternalSignChain, - ) - } - if !cfg.ExternalSign && cfg.PrivKey == "" { - return fmt.Errorf("invalid privkey") - } - return nil -} diff --git a/oracle/docker-compose.yml b/oracle/docker-compose.yml deleted file mode 100644 index 18e6e8b2c..000000000 --- a/oracle/docker-compose.yml +++ /dev/null @@ -1,26 +0,0 @@ -version: '3.8' - -services: - - staking-oracle: - image: morph-staking-oracle - build: - context: . - dockerfile: Dockerfile - environment: - # Note that you must index goerli with INDEXER_BEDROCK=false first, then - # reindex with INDEXER_BEDROCK=true or seed the database - - STAKING_ORACLE_BUILD_ENV=dev - - STAKING_ORACLE_L1_ETH_RPC=${L1_ETH_RPC} - - STAKING_ORACLE_RECORD_PRIVATE_KEY=${RECORD_PRIVATE_KEY} - - STAKING_ORACLE_L2_ETH_RPC=http://morph-geth-0:8545 - - STAKING_ORACLE_L2_TENDERMINT_RPC=http://node-0:26657 - - STAKING_ORACLE_L2_WS_ENDPOINT=http://node-0:26656 - - STAKING_ORACLE_ROLLUP=${MORPH_ROLLUP:-0x6900000000000000000000000000000000000010} - - STAKING_ORACLE_LOG_FILENAME=staking-oracle.log - - STAKING_ORACLE_LOG_FILE_MAX_SIZE=100 #MB - - STAKING_ORACLE_LOG_FILE_MAX_AGE=7 #day - - STAKING_ORACLE_LOG_COMPRESS=true - - STAKING_ORACLE_METRICS_SERVER_ENABLE=true - ports: - - 6060:6060 diff --git a/oracle/flags/flags.go b/oracle/flags/flags.go deleted file mode 100644 index daaef255f..000000000 --- a/oracle/flags/flags.go +++ /dev/null @@ -1,185 +0,0 @@ -package flags - -import ( - "github.com/urfave/cli" -) - -const envVarPrefix = "STAKING_ORACLE_" - -func prefixEnvVar(name string) string { - return envVarPrefix + name -} - -var ( - /* Required Flags */ - - L1EthRPCFlag = cli.StringFlag{ - Name: "l1-eth-rpc", - Usage: "HTTP provider URL for L1", - Required: true, - EnvVar: prefixEnvVar("L1_ETH_RPC"), - } - L2EthRPCFlag = cli.StringFlag{ - Name: "l2-eth-rpc", - Usage: "HTTP provider URL for L2", - Required: true, - EnvVar: prefixEnvVar("L2_ETH_RPC"), - } - TendermintFlag = cli.StringFlag{ - Name: "l2-tendermint-rpc", - Usage: "HTTP provider Tendermint URL for L2", - Required: true, - EnvVar: prefixEnvVar("L2_TENDERMINT_RPC"), - } - - RollupAddress = cli.StringFlag{ - Name: "rollup-address", - Usage: "Address of the rollup", - Required: true, - EnvVar: prefixEnvVar("ROLLUP"), - } - - PrivateKeyFlag = cli.StringFlag{ - Name: "private-key", - Usage: "The private key to use for sending to the rollup contract", - EnvVar: prefixEnvVar("RECORD_PRIVATE_KEY"), - } - - MaxHeaderBatchSizeFlag = cli.Uint64Flag{ - Name: "max-header-batch-size", - Usage: "The maximum number of headers to request as a batch", - Value: 1000, - EnvVar: prefixEnvVar("MAX_HEADER_BATCH_SIZE"), - } - - MinHeaderBatchSizeFlag = cli.Uint64Flag{ - Name: "min-header-batch-size", - Usage: "The maximum number of headers to request as a batch", - Value: 50, - EnvVar: prefixEnvVar("MIN_HEADER_BATCH_SIZE"), - } - - LogLevelFlag = cli.StringFlag{ - Name: "log-level", - Usage: "The lowest log level that will be output", - Value: "info", - EnvVar: prefixEnvVar("LOG_LEVEL"), - } - LogTerminalFlag = cli.BoolFlag{ - Name: "log-terminal", - Usage: "If true, outputs logs in terminal format, otherwise prints " + - "in JSON format. If SENTRY_ENABLE is set to true, this flag is " + - "ignored and logs are printed using JSON", - EnvVar: prefixEnvVar("LOG_TERMINAL"), - } - LogFilenameFlag = cli.StringFlag{ - Name: "log.filename", - Usage: "The target file for writing logs, backup log files will be retained in the same directory.", - EnvVar: prefixEnvVar("LOG_FILENAME"), - } - LogFileMaxSizeFlag = cli.IntFlag{ - Name: "log.maxsize", - Usage: "The maximum size in megabytes of the log file before it gets rotated. It defaults to 100 megabytes. It is used only when log.filename is provided.", - Value: 100, - EnvVar: prefixEnvVar("LOG_FILE_MAX_SIZE"), - } - LogFileMaxAgeFlag = cli.IntFlag{ - Name: "log.maxage", - Usage: "The maximum number of days to retain old log files based on the timestamp encoded in their filename. It defaults to 30 days. It is used only when log.filename is provided.", - Value: 30, - EnvVar: prefixEnvVar("LOG_FILE_MAX_AGE"), - } - LogCompressFlag = cli.BoolFlag{ - Name: "log.compress", - Usage: "Compress determines if the rotated log files should be compressed using gzip. The default is not to perform compression. It is used only when log.filename is provided.", - EnvVar: prefixEnvVar("LOG_COMPRESS"), - } - MetricsServerEnableFlag = cli.BoolFlag{ - Name: "metrics-server-enable", - Usage: "Whether or not to run the embedded metrics server", - EnvVar: prefixEnvVar("METRICS_SERVER_ENABLE"), - } - MetricsHostnameFlag = cli.StringFlag{ - Name: "metrics-hostname", - Usage: "The hostname of the metrics server", - Value: "0.0.0.0", - EnvVar: prefixEnvVar("METRICS_HOSTNAME"), - } - MetricsPortFlag = cli.Uint64Flag{ - Name: "metrics-port", - Usage: "The port of the metrics server", - Value: 6060, - EnvVar: prefixEnvVar("METRICS_PORT"), - } - - // external sign - ExternalSign = cli.BoolFlag{ - Name: "EXTERNAL_SIGN", - Usage: "Enable external sign", - EnvVar: prefixEnvVar("EXTERNAL_SIGN"), - } - - // address - ExternalSignAddress = cli.StringFlag{ - Name: "EXTERNAL_SIGN_ADDRESS", - Usage: "The address of the external sign", - EnvVar: prefixEnvVar("EXTERNAL_SIGN_ADDRESS"), - } - // appid - ExternalSignAppid = cli.StringFlag{ - Name: "EXTERNAL_SIGN_APPID", - Usage: "The appid of the external sign", - EnvVar: prefixEnvVar("EXTERNAL_SIGN_APPID"), - } - // chain - ExternalSignChain = cli.StringFlag{ - Name: "EXTERNAL_SIGN_CHAIN", - Usage: "The chain of the external sign", - EnvVar: prefixEnvVar("EXTERNAL_SIGN_CHAIN"), - } - // url - ExternalSignUrl = cli.StringFlag{ - Name: "EXTERNAL_SIGN_URL", - Usage: "The url of the external sign", - EnvVar: prefixEnvVar("EXTERNAL_SIGN_URL"), - } - ExternalSignRsaPriv = cli.StringFlag{ - Name: "EXTERNAL_RSA_PRIV", - Usage: "The rsa private key of the external sign", - EnvVar: prefixEnvVar("EXTERNAL_SIGN_RSA_PRIV"), - } -) - -var requiredFlags = []cli.Flag{ - L1EthRPCFlag, - L2EthRPCFlag, - TendermintFlag, - RollupAddress, -} - -var optionalFlags = []cli.Flag{ - - LogLevelFlag, - LogTerminalFlag, - LogFilenameFlag, - LogFileMaxSizeFlag, - LogFileMaxAgeFlag, - LogCompressFlag, - MaxHeaderBatchSizeFlag, - MinHeaderBatchSizeFlag, - MetricsServerEnableFlag, - MetricsHostnameFlag, - MetricsPortFlag, - - PrivateKeyFlag, - // external sign - ExternalSign, - ExternalSignAddress, - ExternalSignAppid, - ExternalSignChain, - ExternalSignUrl, - ExternalSignRsaPriv, -} - -// Flags contains the list of configuration options available to the binary. -var Flags = append(requiredFlags, optionalFlags...) diff --git a/oracle/flags/flags_test.go b/oracle/flags/flags_test.go deleted file mode 100644 index ae0bc3d02..000000000 --- a/oracle/flags/flags_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package flags - -import ( - "testing" - - "github.com/stretchr/testify/require" - "github.com/urfave/cli" -) - -// TestRequiredFlagsSetRequired asserts that all flags deemed required properly -// have the Required field set to true. -func TestRequiredFlagsSetRequired(t *testing.T) { - for _, flag := range requiredFlags { - reqFlag, ok := flag.(cli.RequiredFlag) - require.True(t, ok) - require.True(t, reqFlag.IsRequired()) - } -} - -// TestOptionalFlagsDontSetRequired asserts that all flags deemed optional set -// the Required field to false. -func TestOptionalFlagsDontSetRequired(t *testing.T) { - for _, flag := range optionalFlags { - reqFlag, ok := flag.(cli.RequiredFlag) - require.True(t, ok) - require.False(t, reqFlag.IsRequired()) - } -} diff --git a/oracle/go.mod b/oracle/go.mod deleted file mode 100644 index 0a5b7651e..000000000 --- a/oracle/go.mod +++ /dev/null @@ -1,99 +0,0 @@ -module morph-l2/oracle - -go 1.22 - -replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2-0.20250115141431-c84dfe5c8533 - -require ( - github.com/go-kit/kit v0.12.0 - github.com/morph-l2/externalsign v0.3.1 - github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de - github.com/prometheus/client_golang v1.17.0 - github.com/stretchr/testify v1.9.0 - github.com/tendermint/tendermint v0.35.9 - github.com/urfave/cli v1.22.14 - gopkg.in/natefinch/lumberjack.v2 v2.2.1 -) - -require ( - github.com/VictoriaMetrics/fastcache v1.12.2 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.2.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/cosmos/gogoproto v1.4.1 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect - github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/deckarep/golang-set v1.8.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect - github.com/edsrzf/mmap-go v1.1.0 // indirect - github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 // indirect - github.com/fjl/memsize v0.0.2 // indirect - github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect - github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-resty/resty/v2 v2.13.1 // indirect - github.com/go-stack/stack v1.8.1 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/gorilla/websocket v1.5.1 // indirect - github.com/gtank/merlin v0.1.1 // indirect - github.com/hashicorp/go-bexpr v0.1.13 // indirect - github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.4 // indirect - github.com/huin/goupnp v1.3.0 // indirect - github.com/iden3/go-iden3-crypto v0.0.16 // indirect - github.com/jackpal/go-nat-pmp v1.0.2 // indirect - github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect - github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/mitchellh/pointerstructure v1.2.1 // indirect - github.com/mmcloughlin/addchain v0.4.0 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/common v0.45.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect - github.com/prometheus/tsdb v0.10.0 // indirect - github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rivo/uniseg v0.4.3 // indirect - github.com/rjeczalik/notify v0.9.3 // indirect - github.com/rs/cors v1.11.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sasha-s/go-deadlock v0.3.1 // indirect - github.com/scroll-tech/zktrie v0.8.4 // indirect - github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/status-im/keycard-go v0.3.2 // indirect - github.com/supranational/blst v0.3.11 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect - github.com/tklauser/go-sysconf v0.3.13 // indirect - github.com/tklauser/numcpus v0.7.0 // indirect - github.com/tyler-smith/go-bip39 v1.1.0 // indirect - github.com/yusufpapurcu/wmi v1.2.3 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/time v0.5.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect - google.golang.org/grpc v1.62.1 // indirect - google.golang.org/protobuf v1.33.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect - gopkg.in/urfave/cli.v1 v1.20.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - rsc.io/tmplfunc v0.0.3 // indirect -) diff --git a/oracle/go.sum b/oracle/go.sum deleted file mode 100644 index cbef7f1fa..000000000 --- a/oracle/go.sum +++ /dev/null @@ -1,409 +0,0 @@ -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= -github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= -github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/btcsuite/btcd/btcec/v2 v2.2.1 h1:xP60mv8fvp+0khmrN0zTdPC3cNm24rfeE6lh2R/Yv3E= -github.com/btcsuite/btcd/btcec/v2 v2.2.1/go.mod h1:9/CSmJxmuvqzX9Wh2fXMWToLOHhPd11lSPuIupwTkI8= -github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ= -github.com/btcsuite/btcd/btcutil v1.1.2/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= -github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d h1:49RLWk1j44Xu4fjHb6JFYmeUnDORVwHNkDxaQ0ctCVU= -github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= -github.com/cosmos/gogoproto v1.4.1 h1:WoyH+0/jbCTzpKNvyav5FL1ZTWsp1im1MxEpJEzKUB8= -github.com/cosmos/gogoproto v1.4.1/go.mod h1:Ac9lzL4vFpBMcptJROQ6dQ4M3pOEK5Z/l0Q9p+LoCr4= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= -github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= -github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= -github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= -github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= -github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= -github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 h1:B2mpK+MNqgPqk2/KNi1LbqwtZDy5F7iy0mynQiBr8VA= -github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4/go.mod h1:y4GA2JbAUama1S4QwYjC2hefgGLU8Ul0GMtL/ADMF1c= -github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= -github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= -github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= -github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= -github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= -github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-resty/resty/v2 v2.13.1 h1:x+LHXBI2nMB1vqndymf26quycC4aggYJ7DECYbiz03g= -github.com/go-resty/resty/v2 v2.13.1/go.mod h1:GznXlLxkq6Nh4sU59rPmUw3VtgpO3aS96ORAI6Q7d+0= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= -github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= -github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= -github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= -github.com/hashicorp/go-bexpr v0.1.13 h1:HNwp7vZrMpRq8VZXj8VF90LbZpRjQQpim1oJF0DgSwg= -github.com/hashicorp/go-bexpr v0.1.13/go.mod h1:gN7hRKB3s7yT+YvTdnhZVLTENejvhlkZ8UE4YVBS+Q8= -github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= -github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= -github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/iden3/go-iden3-crypto v0.0.16 h1:zN867xiz6HgErXVIV/6WyteGcOukE9gybYTorBMEdsk= -github.com/iden3/go-iden3-crypto v0.0.16/go.mod h1:dLpM4vEPJ3nDHzhWFXDjzkn1qHoBeOT/3UEhXsEsP3E= -github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= -github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= -github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= -github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= -github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= -github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= -github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= -github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morph-l2/externalsign v0.3.1 h1:UYFDZFB0L85A4rDvuwLNBiGEi0kSmg9AZ2v8Q5O4dQo= -github.com/morph-l2/externalsign v0.3.1/go.mod h1:b6NJ4GUiiG/gcSJsp3p8ExsIs4ZdphlrVALASnVoGJE= -github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de h1:NOzYvFCuqWZ0bg2GAcC2S9cwd1rThSCTwyJCT8Iwfgc= -github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= -github.com/morph-l2/tendermint v0.3.2-0.20250115141431-c84dfe5c8533 h1:qhBMCyTQ/ezOpeqHGKjr4qSN/B/bGFByuYjQqDt5wiw= -github.com/morph-l2/tendermint v0.3.2-0.20250115141431-c84dfe5c8533/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= -github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 h1:jik8PHtAIsPlCRJjJzl4udgEf7hawInF9texMeO2jrU= -github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= -github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= -github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= -github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rjeczalik/notify v0.9.3 h1:6rJAzHTGKXGj76sbRgDiDcYj/HniypXmSJo1SWakZeY= -github.com/rjeczalik/notify v0.9.3/go.mod h1:gF3zSOrafR9DQEWSE8TjfI9NkooDxbyT4UgRGKZA0lc= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= -github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= -github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= -github.com/scroll-tech/zktrie v0.8.4 h1:UagmnZ4Z3ITCk+aUq9NQZJNAwnWl4gSxsLb2Nl7IgRE= -github.com/scroll-tech/zktrie v0.8.4/go.mod h1:XvNo7vAk8yxNyTjBDj5WIiFzYW4bx/gJ78+NK6Zn6Uk= -github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= -github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/status-im/keycard-go v0.3.2 h1:YusIF/bHx6YZis8UTOJrpZFnTs4IkRBdmJXqdiXkpFE= -github.com/status-im/keycard-go v0.3.2/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= -github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= -github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= -github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= -github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= -github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk= -github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= -github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= -google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= -google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= -gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= -gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/oracle/metrics/metrics.go b/oracle/metrics/metrics.go deleted file mode 100644 index d026222c2..000000000 --- a/oracle/metrics/metrics.go +++ /dev/null @@ -1,71 +0,0 @@ -package metrics - -import ( - "net" - "net/http" - "strconv" - - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/metrics/prometheus" - stdprometheus "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" -) - -const ( - metricsSubsystem = "staking_oracle" -) - -type Metrics struct { - RewardEpoch metrics.Gauge - RollupEpoch metrics.Gauge - BatchEpoch metrics.Gauge -} - -func NewMetrics(namespace string, labelsAndValues ...string) *Metrics { - var labels []string - for i := 0; i < len(labelsAndValues); i += 2 { - labels = append(labels, labelsAndValues[i]) - } - return &Metrics{ - RewardEpoch: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ - Namespace: namespace, - Subsystem: metricsSubsystem, - Name: "reward_epoch", - Help: "", - }, labels).With(labelsAndValues...), - RollupEpoch: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ - Namespace: namespace, - Subsystem: metricsSubsystem, - Name: "rollup_epoch", - Help: "", - }, labels).With(labelsAndValues...), - BatchEpoch: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ - Namespace: namespace, - Subsystem: metricsSubsystem, - Name: "batch_epoch", - Help: "", - }, labels).With(labelsAndValues...), - } -} - -func (m *Metrics) SetRewardEpoch(index uint64) { - m.RewardEpoch.Set(float64(index)) -} - -func (m *Metrics) SetRollupEpoch(index uint64) { - m.RollupEpoch.Set(float64(index)) -} - -func (m *Metrics) SetBatchEpoch(index uint64) { - m.BatchEpoch.Set(float64(index)) -} - -func (m *Metrics) Serve(hostname string, port uint64) (*http.Server, error) { - mux := http.NewServeMux() - mux.Handle("/metrics", promhttp.Handler()) - srv := new(http.Server) - srv.Addr = net.JoinHostPort(hostname, strconv.FormatUint(port, 10)) - srv.Handler = mux - err := srv.ListenAndServe() - return srv, err -} diff --git a/oracle/oracle/batch.go b/oracle/oracle/batch.go deleted file mode 100644 index 2384637c9..000000000 --- a/oracle/oracle/batch.go +++ /dev/null @@ -1,304 +0,0 @@ -package oracle - -import ( - "bytes" - "context" - "errors" - "fmt" - "math/big" - "time" - - "morph-l2/bindings/bindings" - "morph-l2/node/derivation" - nodetypes "morph-l2/node/types" - "morph-l2/oracle/backoff" - - "github.com/morph-l2/go-ethereum/accounts/abi/bind" - "github.com/morph-l2/go-ethereum/common" - "github.com/morph-l2/go-ethereum/core/types" - "github.com/morph-l2/go-ethereum/eth" - "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 -} - -type BatchInfo struct { - BatchIndex uint64 - L1BlockNumber uint64 - L1TxHash common.Hash - L2BlockNumber uint64 - L2BlockCount uint64 - L2TxCount uint64 -} - -func (o *Oracle) GetStartBlock(nextBatchSubmissionIndex *big.Int) (uint64, error) { - if nextBatchSubmissionIndex.Uint64() == 1 { - return o.cfg.StartBlock + 1, nil - } - bs, err := o.record.BatchSubmissions(nil, new(big.Int).Sub(nextBatchSubmissionIndex, big.NewInt(1))) - if err != nil { - return 0, err - } - return bs.RollupBlock.Uint64() + 1, nil -} - -func (o *Oracle) GetBatchSubmission(ctx context.Context, startBlock, nextBatchSubmissionIndex uint64) ([]bindings.IRecordBatchSubmission, error) { - 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 { - return nil, fmt.Errorf("get latest header error:%v", err) - } - if startBlock >= header.Number.Uint64() { - time.Sleep(defaultSleepTime) - continue - } - if endBlock >= header.Number.Uint64() { - endBlock = header.Number.Uint64() - } - fetchLogs, err := o.fetchRollupLog(ctx, startBlock, endBlock) - if err != nil { - return nil, fmt.Errorf("fetch rollupLog error:%v", err) - } - 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 - } -} - -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 { - 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 err - } - header, err := o.l1Client.HeaderByNumber(context.Background(), big.NewInt(int64(lg.BlockNumber))) - if err != nil { - return fmt.Errorf("get header by number error:%v", err) - } - if pending { - return errors.New("pending transaction") - } - beforeRemoveSkipMapAbi, err := BeforeRemoveSkipMapMetaData.GetAbi() - if err != nil { - return err - } - abi, err := bindings.RollupMetaData.GetAbi() - if err != nil { - 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 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 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[:]), - } - parentBatchHeader := nodetypes.BatchHeaderBytes(batch.ParentBatchHeader) - parentVersion, err := parentBatchHeader.Version() - if err != nil { - return fmt.Errorf("decode parent batch version error:%v", err) - } - if batch.Version == 1 && parentVersion == 0 { - parentBatchIndex, err := parentBatchHeader.BatchIndex() - if err != nil { - return fmt.Errorf("decode parent batch index error:%v", err) - } - parentBatch, err := o.l2Client.GetRollupBatchByIndex(o.ctx, parentBatchIndex) - if err != nil { - return fmt.Errorf("get parent batch error:%v", err) - } - batch.Sidecar = parentBatch.Sidecar - } - } else { - continue - } - - rollupCommitBatch, parseErr := o.rollup.ParseCommitBatch(lg) - if parseErr != nil { - log.Error("get l2 BlockNumber", "err", err) - return parseErr - } - if rollupCommitBatch.BatchIndex.Uint64() < batchIndex { - continue - } - if rollupCommitBatch.BatchIndex.Uint64() > batchIndex { - 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 fmt.Errorf("parse batch error:%v", err) - } - log.Info("received new batch", "batch_index", rollupCommitBatch.BatchIndex.Uint64()) - recordBatchSubmission := bindings.IRecordBatchSubmission{ - Index: rollupCommitBatch.BatchIndex, - Submitter: msg.From(), - StartBlock: big.NewInt(int64(batchData.FirstBlockNumber())), - EndBlock: big.NewInt(int64(batchData.LastBlockNumber())), - RollupTime: big.NewInt(int64(header.Time)), - RollupBlock: big.NewInt(int64(lg.BlockNumber)), - } - *recordBatchSubmissions = append(*recordBatchSubmissions, recordBatchSubmission) - if len(*recordBatchSubmissions) == maxBatchSize { - return nil - } - } - return nil -} - -func (o *Oracle) fetchRollupLog(ctx context.Context, start, end uint64) ([]types.Log, error) { - opts := &bind.FilterOpts{ - Context: ctx, - Start: start, - End: &end, - } - iter, err := o.rollup.FilterCommitBatch(opts, nil, nil) - if err != nil { - return nil, err - } - defer func() { - if err := iter.Close(); err != nil { - log.Info("RollupCommitBatchIterator close failed", "error", err) - } - }() - var logs []types.Log - for iter.Next() { - logs = append(logs, iter.Event.Raw) - } - return logs, nil -} - -func (o *Oracle) GetNextBatchSubmissionIndex() (*big.Int, error) { - return o.record.NextBatchSubmissionIndex(nil) -} - -func (o *Oracle) LastBatchIndex(opts *bind.CallOpts) (*big.Int, error) { - if o.isFinalized { - return o.rollup.LastFinalizedBatchIndex(opts) - - } - return o.rollup.LastCommittedBatchIndex(opts) -} - -func (o *Oracle) submitRecord() error { - nextBatchSubmissionIndex, err := o.GetNextBatchSubmissionIndex() - if err != nil { - return fmt.Errorf("get next batch submission index failed:%v", err) - } - o.metrics.SetBatchEpoch(nextBatchSubmissionIndex.Uint64() - 1) - lastBatchIndex, err := o.LastBatchIndex(nil) - if err != nil { - return fmt.Errorf("get last finalized batch index error:%v", err) - } - if nextBatchSubmissionIndex.Cmp(lastBatchIndex) > 0 { - log.Info("already newest batch submission...", "lastBatchIndex", lastBatchIndex, "nextBatchSubmissionIndex", nextBatchSubmissionIndex) - time.Sleep(defaultSleepTime) - return nil - } - start, err := o.GetStartBlock(nextBatchSubmissionIndex) - if err != nil { - log.Error("get pre batch rollup block number failed", "error", err) - return fmt.Errorf("get pre batch rollup block number error:%v", err) - } - batchSubmissions, err := o.GetBatchSubmission(context.Background(), start, nextBatchSubmissionIndex.Uint64()) - if err != nil { - return fmt.Errorf("get batch submission error:%v", err) - } - callData, err := o.recordAbi.Pack("recordFinalizedBatchSubmissions", batchSubmissions) - if err != nil { - return err - } - tx, err := o.newRecordTxAndSign(callData) - if err != nil { - return fmt.Errorf("record finalized batch error:%v,batchLength:%v", err, 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(3, backoff.Exponential(), func() error { - var err error - receipt, err = o.waitReceiptWithCtx(o.ctx, tx.Hash()) - return err - }) - if err != nil { - return fmt.Errorf("wait tx receipt error:%v,txHash:%v", err, tx.Hash()) - } - if receipt.Status != types.ReceiptStatusSuccessful { - return fmt.Errorf("record batch receipt failed,txHash:%v", tx.Hash()) - } - return nil -} diff --git a/oracle/oracle/oracle.go b/oracle/oracle/oracle.go deleted file mode 100644 index 8f688313c..000000000 --- a/oracle/oracle/oracle.go +++ /dev/null @@ -1,273 +0,0 @@ -package oracle - -import ( - "context" - "crypto/ecdsa" - "crypto/rsa" - "errors" - "fmt" - - "io" - "math/big" - "os" - "strings" - "time" - - "morph-l2/bindings/bindings" - "morph-l2/bindings/predeploys" - "morph-l2/oracle/config" - "morph-l2/oracle/metrics" - - "github.com/morph-l2/externalsign" - "github.com/morph-l2/go-ethereum" - "github.com/morph-l2/go-ethereum/accounts/abi" - "github.com/morph-l2/go-ethereum/common" - "github.com/morph-l2/go-ethereum/core/types" - "github.com/morph-l2/go-ethereum/crypto" - "github.com/morph-l2/go-ethereum/ethclient" - "github.com/morph-l2/go-ethereum/log" - jsonrpcclient "github.com/tendermint/tendermint/rpc/jsonrpc/client" - "github.com/urfave/cli" - "gopkg.in/natefinch/lumberjack.v2" -) - -const ( - defaultRewardEpoch = time.Hour / time.Second * 24 - defaultPrecision = 1e8 - defaultSleepTime = 30 * time.Second -) - -func Main() func(ctx *cli.Context) error { - return func(ctx *cli.Context) error { - cfg, err := config.NewConfig(ctx) - if err != nil { - return err - } - log.Info("Initializing staking-oracle") - m := metrics.NewMetrics("morphoracle") - o, err := NewOracle(&cfg, m) - if err != nil { - log.Error("Unable to create staking-oracle", "error", err) - return err - } - log.Info("Starting staking-oracle") - o.Start() - log.Info("Staking oracle started") - if cfg.MetricsServerEnable { - go func() { - _, err := m.Serve(cfg.MetricsHostname, cfg.MetricsPort) - if err != nil { - log.Error("metrics server failed to start", "err", err) - } - }() - log.Info("metrics server enabled", "host", cfg.MetricsHostname, "port", cfg.MetricsPort) - } - <-(chan struct{})(nil) - log.Info("staking oracle stopped") - return nil - } -} - -type Oracle struct { - ctx context.Context - l1Client *ethclient.Client - l2Client *ethclient.Client - l2Staking *bindings.L2Staking - sequencer *bindings.Sequencer - gov *bindings.Gov - rollup *bindings.Rollup - record *bindings.Record - recordAddr common.Address - recordAbi *abi.ABI - TmClient *jsonrpcclient.Client - rewardEpoch time.Duration - cfg *config.Config - privKey *ecdsa.PrivateKey - externalRsaPriv *rsa.PrivateKey - signer types.Signer - chainId *big.Int - isFinalized bool - enable bool - rollupEpochMaxBlock uint64 - metrics *metrics.Metrics -} - -func NewOracle(cfg *config.Config, m *metrics.Metrics) (*Oracle, error) { - var logHandler log.Handler - output := io.Writer(os.Stderr) - if cfg.LogFilename != "" { - f, err := os.OpenFile(cfg.LogFilename, os.O_CREATE|os.O_RDWR, os.FileMode(0600)) - if err != nil { - return nil, fmt.Errorf("wrong log.filename set: %d", err) - } - _ = f.Close() - - if cfg.LogFileMaxSize < 1 { - return nil, fmt.Errorf("wrong log.maxsize set: %d", cfg.LogFileMaxSize) - } - - if cfg.LogFileMaxAge < 1 { - return nil, fmt.Errorf("wrong log.maxage set: %d", cfg.LogFileMaxAge) - } - logFile := &lumberjack.Logger{ - Filename: cfg.LogFilename, - MaxSize: cfg.LogFileMaxSize, // megabytes - MaxAge: cfg.LogFileMaxAge, // days - Compress: cfg.LogCompress, - } - output = io.MultiWriter(output, logFile) - } - - if cfg.LogTerminal { - logHandler = log.StreamHandler(os.Stdout, log.TerminalFormat(true)) - } else { - logHandler = log.StreamHandler(output, log.JSONFormat()) - } - - logLevel, err := log.LvlFromString(cfg.LogLevel) - if err != nil { - return nil, err - } - - log.Root().SetHandler(log.LvlFilterHandler(logLevel, logHandler)) - l1Client, err := ethclient.Dial(cfg.L1EthRpc) - if err != nil { - return nil, err - } - l2Client, err := ethclient.Dial(cfg.L2EthRpc) - if err != nil { - return nil, err - } - chainId, err := l2Client.ChainID(context.Background()) - if err != nil { - return nil, err - } - httpClient, err := jsonrpcclient.DefaultHTTPClient(cfg.TendermintRpc) - if err != nil { - return nil, err - } - tmClient, err := jsonrpcclient.NewWithHTTPClient(cfg.TendermintRpc, httpClient) - if err != nil { - return nil, err - } - - rollup, err := bindings.NewRollup(cfg.RollupAddr, l1Client) - if err != nil { - return nil, err - } - l2Staking, err := bindings.NewL2Staking(predeploys.L2StakingAddr, l2Client) - if err != nil { - return nil, err - } - record, err := bindings.NewRecord(predeploys.RecordAddr, l2Client) - if err != nil { - return nil, err - } - abi, err := bindings.RecordMetaData.GetAbi() - if err != nil { - return nil, err - } - sequencer, err := bindings.NewSequencer(predeploys.SequencerAddr, l2Client) - if err != nil { - return nil, err - } - gov, err := bindings.NewGov(predeploys.GovAddr, l2Client) - if err != nil { - return nil, err - } - var rsaPriv *rsa.PrivateKey - var privKey *ecdsa.PrivateKey - // external sign - if cfg.ExternalSign { - // parse rsa private key - rsaPriv, err = externalsign.ParseRsaPrivateKey(cfg.ExternalSignRsaPriv) - if err != nil { - return nil, fmt.Errorf("failed to parse rsa private key: %w", err) - } - } else { - // parse priv key - hex := strings.TrimPrefix(cfg.PrivKey, "0x") - privKey, err = crypto.HexToECDSA(hex) - if err != nil { - return nil, fmt.Errorf("parse privkey err:%w", err) - } - - } - - return &Oracle{ - l1Client: l1Client, - l2Client: l2Client, - rollup: rollup, - l2Staking: l2Staking, - record: record, - recordAddr: predeploys.RecordAddr, - recordAbi: abi, - sequencer: sequencer, - gov: gov, - TmClient: tmClient, - cfg: cfg, - rewardEpoch: defaultRewardEpoch, - privKey: privKey, - externalRsaPriv: rsaPriv, - signer: types.LatestSignerForChainID(chainId), - chainId: chainId, - ctx: context.TODO(), - rollupEpochMaxBlock: cfg.MaxSize, - metrics: m, - }, nil -} - -func (o *Oracle) Start() { - go func() { - o.setStartBlock() - for { - if err := o.syncRewardEpoch(); err != nil { - log.Error("syncReward Epoch failed", "error", err) - time.Sleep(30 * time.Second) - } - } - }() - - go func() { - for { - if err := o.submitRecord(); err != nil { - log.Error("reward submission batch failed", "error", err) - time.Sleep(30 * time.Second) - } - } - }() - - if o.enable { - go func() { - for { - if err := o.recordRollupEpoch(); err != nil { - log.Error("record rollup epoch failed", "error", err) - time.Sleep(30 * time.Second) - } - } - }() - } - -} - -func (o *Oracle) waitReceiptWithCtx(ctx context.Context, txHash common.Hash) (*types.Receipt, error) { - t := time.NewTicker(time.Second) - for { - select { - case <-ctx.Done(): - return nil, errors.New("timeout") - case <-t.C: - receipt, err := o.l2Client.TransactionReceipt(o.ctx, txHash) - if errors.Is(err, ethereum.NotFound) { - continue - } - if err != nil { - return nil, err - } - if receipt != nil { - t.Stop() - return receipt, nil - } - } - } -} diff --git a/oracle/oracle/reward.go b/oracle/oracle/reward.go deleted file mode 100644 index fd765b37b..000000000 --- a/oracle/oracle/reward.go +++ /dev/null @@ -1,384 +0,0 @@ -package oracle - -import ( - "bytes" - "context" - "errors" - "fmt" - "math/big" - "sort" - "time" - - "morph-l2/bindings/bindings" - "morph-l2/node/derivation" - "morph-l2/oracle/backoff" - - "github.com/morph-l2/go-ethereum/accounts/abi/bind" - "github.com/morph-l2/go-ethereum/common" - "github.com/morph-l2/go-ethereum/core/types" - "github.com/morph-l2/go-ethereum/log" - "github.com/tendermint/tendermint/crypto/ed25519" - ctypes "github.com/tendermint/tendermint/rpc/core/types" - tmtypes "github.com/tendermint/tendermint/types" -) - -func (o *Oracle) getBlockTimeAndNumber(isFinalized bool) (uint64, *big.Int, error) { - var lastBlockNumber *big.Int - if isFinalized { - latestFinalized, err := o.rollup.LastFinalizedBatchIndex(nil) - if err != nil { - return 0, nil, err - } - batch, err := o.l2Client.GetRollupBatchByIndex(context.Background(), latestFinalized.Uint64()) - if err != nil { - return 0, nil, err - } - if batch == nil { - return 0, nil, fmt.Errorf("batch not found") - } - var batchData derivation.BatchInfo - if err = batchData.ParseBatch(*batch); err != nil { - return 0, nil, fmt.Errorf("parse batch error:%v", err) - } - lastBlockNumber = big.NewInt(int64(batchData.LastBlockNumber())) - } - - header, err := o.l2Client.HeaderByNumber(o.ctx, lastBlockNumber) - if err != nil { - return 0, nil, err - } - return header.Time, header.Number, nil -} - -func (o *Oracle) syncRewardEpoch() error { - _, finalizedBlock, err := o.getBlockTimeAndNumber(o.isFinalized) - if err != nil { - return fmt.Errorf("get block time and number error:%v", err) - } - startRewardEpochIndex, err := o.record.NextRewardEpochIndex(nil) - if err != nil { - return err - } - o.metrics.SetRewardEpoch(startRewardEpochIndex.Uint64() - 1) - startHeight, err := o.getNextHeight() - if err != nil { - return err - } - if startHeight.Cmp(finalizedBlock) > 0 { - time.Sleep(defaultSleepTime) - return nil - } - recordRewardEpochInfo, err := o.getRewardEpochs(startRewardEpochIndex, startHeight) - if err != nil { - return err - } - callData, err := o.recordAbi.Pack("recordRewardEpochs", []bindings.IRecordRewardEpochInfo{*recordRewardEpochInfo}) - if err != nil { - return err - } - tx, err := o.newRecordTxAndSign(callData) - if err != nil { - return fmt.Errorf("record reward epochs error:%v", err) - } - err = o.l2Client.SendTransaction(o.ctx, tx) - if err != nil { - return fmt.Errorf("send transaction error:%v", err) - } - log.Info("send record reward tx success", "txHash", tx.Hash().Hex(), "nonce", tx.Nonce()) - var receipt *types.Receipt - err = backoff.Do(30, backoff.Exponential(), func() error { - var err error - receipt, err = o.waitReceiptWithCtx(o.ctx, tx.Hash()) - return err - }) - if err != nil { - return fmt.Errorf("receipt record reward epochs error:%v", err) - } - if receipt.Status != types.ReceiptStatusSuccessful { - return fmt.Errorf("record reward epochs not success") - } - return nil -} - -func (o *Oracle) getRewardEpochs(startRewardEpochIndex, startHeight *big.Int) (*bindings.IRecordRewardEpochInfo, error) { - endTime, err := o.getEndTime(startHeight, startRewardEpochIndex) - if err != nil { - return nil, err - } - log.Info("new epoch fetching...", "startHeight", startHeight, "startRewardEpochIndex", startRewardEpochIndex, "endTime", endTime) - height := startHeight - sequencersBlockCount := make(map[common.Address]int64) - for { - _, finalizedBlock, err := o.getBlockTimeAndNumber(o.isFinalized) - if err != nil { - continue - } - if height.Cmp(finalizedBlock) > 0 { - log.Info("finalized block small than syncing block,wait...", "finalizedBlock", finalizedBlock, "syncingBlock", height) - time.Sleep(defaultSleepTime) - continue - } - tmHeader, err := o.L2HeaderByNumberWithRetry(height.Int64()) - if err != nil { - return nil, fmt.Errorf("get l2 header error:%v", err) - } - if tmHeader.Time.Unix() > endTime.Int64() { - break - } - log.Info("get new header", "headerNumber", tmHeader.Height, "headerTime", tmHeader.Time) - sequencer, err := o.getSequencer(tmHeader.ProposerAddress, height) - if err != nil { - return nil, fmt.Errorf("get sequencer error:%v", err) - } - sequencersBlockCount[sequencer] += 1 - - height = new(big.Int).Add(height, big.NewInt(1)) - } - - var sequencers []common.Address - var seqBlockCounts, sequencerRatios, sequencerCommissions []*big.Int - for seq, count := range sequencersBlockCount { - sequencers = append(sequencers, seq) - seqBlockCounts = append(seqBlockCounts, big.NewInt(count)) - } - blockCount := new(big.Int).Sub(height, startHeight) - precision := big.NewInt(defaultPrecision) - residue := big.NewInt(defaultPrecision) - maxRatio := big.NewInt(0) - var maxRatioIndex int - for i := 0; i < len(sequencers); i++ { - ratio := new(big.Int).Div(new(big.Int).Mul(seqBlockCounts[i], precision), blockCount) - sequencerRatios = append(sequencerRatios, ratio) - residue = new(big.Int).Sub(residue, ratio) - if ratio.Cmp(maxRatio) > 0 { - maxRatioIndex = i - } - commission, err := o.getSequencerCommission(new(big.Int).Sub(startHeight, big.NewInt(1)), sequencers[i]) - if err != nil { - return nil, fmt.Errorf("get sequencer commission error:%v", err) - } - sequencerCommissions = append(sequencerCommissions, commission) - } - sequencerRatios[maxRatioIndex] = new(big.Int).Add(sequencerRatios[maxRatioIndex], residue) - rewardEpochInfo := bindings.IRecordRewardEpochInfo{ - Index: startRewardEpochIndex, - BlockCount: blockCount, - Sequencers: sequencers, - SequencerBlocks: seqBlockCounts, - SequencerRatios: sequencerRatios, - SequencerCommissions: sequencerCommissions, - } - return &rewardEpochInfo, nil -} - -func (o *Oracle) getSequencerCommission(blockNumber *big.Int, address common.Address) (*big.Int, error) { - if blockNumber.Uint64() < o.cfg.StartBlock { - return big.NewInt(0), nil - } - return o.l2Staking.Commissions(&bind.CallOpts{ - BlockNumber: blockNumber, - }, address) -} - -// L2HeaderByNumberWithRetry retries getting headers. -func (o *Oracle) L2HeaderByNumberWithRetry(height int64) (*tmtypes.Header, error) { - var res *tmtypes.Header - err := backoff.DoCtx(o.ctx, 3, backoff.Exponential(), func() error { - var err error - headerResp, err := o.getHeader(height) - if err != nil { - return err - } - res = headerResp - return nil - }) - return res, err -} - -func (o *Oracle) getHeader(height int64) (*tmtypes.Header, error) { - result := new(ctypes.ResultHeader) - params := make(map[string]interface{}) - if height != 0 { - params["height"] = &height - } - _, err := o.TmClient.Call(o.ctx, "header", params, result) - if err != nil { - return nil, err - } - return result.Header, nil -} - -func (o *Oracle) getSequencer(proposerAddress tmtypes.Address, blockNumber *big.Int) (common.Address, error) { - stakers, err := o.l2Staking.GetStakers(&bind.CallOpts{ - BlockNumber: new(big.Int).Sub(blockNumber, big.NewInt(1)), - }) - if err != nil { - return common.Address{}, err - } - for _, staker := range stakers { - if bytes.Equal(proposerAddress, ed25519.PubKey(staker.TmKey[:]).Address().Bytes()) { - return staker.Addr, nil - } - } - return common.Address{}, fmt.Errorf("sequencer not found") -} - -func (o *Oracle) getNextHeight() (*big.Int, error) { - latest, err := o.record.LatestRewardEpochBlock(nil) - if err != nil { - return latest, err - } - return new(big.Int).Add(latest, big.NewInt(1)), nil -} - -func (o *Oracle) getEndTime(blockNumber *big.Int, nextRewardEpochIndex *big.Int) (*big.Int, error) { - startTime, err := o.l2Staking.RewardStartTime(&bind.CallOpts{ - BlockNumber: blockNumber, - }) - if err != nil { - return nil, err - } - internal := new(big.Int).Mul(nextRewardEpochIndex, big.NewInt(int64(o.rewardEpoch))) - epochStart := new(big.Int).Add(startTime, internal) - epochEnd := new(big.Int).Add(epochStart, big.NewInt(int64(o.rewardEpoch))) - return epochEnd, nil -} - -func (o *Oracle) findStartBlock(start, end uint64, timeStamp int64) (int64, error) { - headerStart, err := o.l2Client.HeaderByNumber(o.ctx, big.NewInt(int64(start))) - if err != nil { - return 0, err - } - headerEnd, err := o.l2Client.HeaderByNumber(o.ctx, big.NewInt(int64(end))) - if err != nil { - return 0, err - } - if end < start { - return 0, fmt.Errorf("invalid start or end,start:%v,end:%v", start, end) - } - if int64(headerStart.Time) > timeStamp || int64(headerEnd.Time) < timeStamp { - return 0, fmt.Errorf("this timestamp is not within the given block range") - } - - s := sort.Search(int(end)+1-int(start), func(i int) bool { - header, err := o.l2Client.HeaderByNumber(o.ctx, big.NewInt(int64(i)+int64(start))) - if err != nil { - log.Error("get header by number failed", "error", err) - return false - } - return int64(header.Time) >= timeStamp - }) - if s == int(end)+1-int(start) { - log.Error("start block not found") - } - target, err := o.l2Client.HeaderByNumber(o.ctx, big.NewInt(int64(start)+int64(s))) - if err != nil { - return 0, err - } - preHeader, err := o.l2Client.HeaderByNumber(o.ctx, big.NewInt(int64(start)+int64(s)-1)) - if err != nil { - return 0, err - } - if !(int64(preHeader.Time) < timeStamp && int64(target.Time) >= timeStamp) { - return 0, fmt.Errorf("invalid start block") - } - log.Info("find start block success", "preHeader_time", preHeader.Time, "timestamp", timeStamp, "target_time", target.Time) - return int64(start) + int64(s), nil -} - -func (o *Oracle) setStartBlock() { - start := o.cfg.StartBlock - for { - err := func() error { - header, err := o.l2Client.HeaderByNumber(o.ctx, nil) - if err != nil { - return fmt.Errorf("get latest header error:%v", err) - } - rewardStarted, err := o.l2Staking.RewardStarted(&bind.CallOpts{ - BlockNumber: header.Number, - }) - if err != nil { - return fmt.Errorf("get RewardStarted error:%v", err) - } - if rewardStarted { - return nil - } - return ErrRewardNotStart - - }() - if err != nil { - if errors.Is(err, ErrRewardNotStart) { - log.Info(err.Error()) - } else { - log.Error("query reward start failed", "error", err) - } - time.Sleep(defaultSleepTime) - continue - } - log.Info("reward start") - break - } - - for { - err := func() error { - header, err := o.l2Client.HeaderByNumber(o.ctx, nil) - if err != nil { - return fmt.Errorf("query header by number error:%v", err) - } - startTime, err := o.l2Staking.RewardStartTime(&bind.CallOpts{ - BlockNumber: header.Number, - }) - if err != nil { - return fmt.Errorf("query reward start time error:%v", err) - } - latestRewardEpochBlock, err := o.record.LatestRewardEpochBlock(nil) - if err != nil { - return fmt.Errorf("query latest reward epoch block error:%v", err) - } - if latestRewardEpochBlock.Uint64() != 0 { - return nil - } - if header.Time < startTime.Uint64() { - start = header.Number.Uint64() - return ErrRewardNotStart - } - log.Info("start find start block", "start_block", start, "end_block", header.Number.Uint64()) - startBlock, err := o.findStartBlock(start, header.Number.Uint64(), startTime.Int64()) - if err != nil { - return fmt.Errorf("find start block error:%v", err) - } - callData, err := o.recordAbi.Pack("setLatestRewardEpochBlock", big.NewInt(startBlock)) - if err != nil { - return err - } - tx, err := o.newRecordTxAndSign(callData) - if err != nil { - return err - } - err = o.l2Client.SendTransaction(o.ctx, tx) - if err != nil { - return fmt.Errorf("send transaction error:%v", err) - } - var receipt *types.Receipt - err = backoff.Do(30, backoff.Exponential(), func() error { - var err error - receipt, err = o.waitReceiptWithCtx(o.ctx, tx.Hash()) - return err - }) - if err != nil { - return fmt.Errorf("TransactionReceipt error:%v", err) - } - if receipt.Status != types.ReceiptStatusSuccessful { - return fmt.Errorf("set stark block failed") - } - log.Info("set start block success") - return nil - }() - if err != nil { - log.Error("start block failed", "error", err) - time.Sleep(defaultSleepTime) - continue - } - break - } -} diff --git a/oracle/oracle/rollup.go b/oracle/oracle/rollup.go deleted file mode 100644 index c6052fafa..000000000 --- a/oracle/oracle/rollup.go +++ /dev/null @@ -1,340 +0,0 @@ -package oracle - -import ( - "container/list" - "context" - "fmt" - "math" - "math/big" - "sort" - "time" - - "morph-l2/bindings/bindings" - "morph-l2/oracle/backoff" - - "github.com/morph-l2/go-ethereum/accounts/abi/bind" - "github.com/morph-l2/go-ethereum/common" - "github.com/morph-l2/go-ethereum/core/types" - "github.com/morph-l2/go-ethereum/log" -) - -var ( - MaxEpochCount = 50 -) - -type SequencerSetUpdateEpoch struct { - Submitters []common.Address - StartTime *big.Int - EndTime *big.Int - EndBlock *big.Int -} - -func (o *Oracle) generateRollupEpoch(index, startTime, rollupEpoch, updateTime, endBlock, endBlockTime, nextUpdateTime int64, sequencerSets []common.Address) ([]bindings.IRecordRollupEpochInfo, error) { - var rollupEpochInfos []bindings.IRecordRollupEpochInfo - if startTime == 0 { - startTime = updateTime - } - epochsStart := startTime - for { - endTime := startTime + rollupEpoch - if endTime > nextUpdateTime { - endTime = nextUpdateTime - } - rollupEpochInfo := bindings.IRecordRollupEpochInfo{ - Index: big.NewInt(index), - Submitter: sequencerSets[(endTime-updateTime)/rollupEpoch%int64(len(sequencerSets))], - StartTime: big.NewInt(startTime), - EndTime: big.NewInt(endTime), - EndBlock: big.NewInt(endBlock), - } - if endTime > endBlockTime { - break - } - // TODO - if o.rollupEpochMaxBlock == 1 && len(rollupEpochInfos) >= MaxEpochCount { - rollupEpochInfo.EndBlock = big.NewInt(endBlock - 1) - rollupEpochInfos = append(rollupEpochInfos, rollupEpochInfo) - break - } - rollupEpochInfos = append(rollupEpochInfos, rollupEpochInfo) - if endTime == endBlockTime { - break - } - startTime = endTime - index++ - } - log.Info("generate rollup epoch", "startTime", epochsStart, "endBlockTime", endBlockTime, "epochLength", len(rollupEpochInfos)) - return rollupEpochInfos, nil -} - -func (o *Oracle) recordRollupEpoch() error { - epochIndex, err := o.record.NextRollupEpochIndex(nil) - if err != nil { - return err - } - o.metrics.SetRollupEpoch(epochIndex.Uint64() - 1) - rollupEpoch, err := o.record.RollupEpochs(nil, new(big.Int).Sub(epochIndex, big.NewInt(1))) - if err != nil { - return err - } - startBlock := rollupEpoch.EndBlock.Uint64() - blockNumber, err := o.l2Client.BlockNumber(o.ctx) - if err != nil { - return err - } - if startBlock+o.cfg.MinSize >= blockNumber { - log.Info("too few blocks are newer than startBlock", "startBlock", startBlock, "latestBlock", blockNumber, "minSize", o.cfg.MinSize) - time.Sleep(defaultSleepTime) - return nil - } - endBlock := startBlock + o.rollupEpochMaxBlock - if endBlock > blockNumber { - endBlock = blockNumber - } - log.Info("record rollup epoch info start", "startBlock", startBlock, "endBlock", endBlock, "nextEpochIndex", epochIndex, "lastEpochInfo", rollupEpoch) - setsEpochs, err := o.GetSequencerSetsEpoch(startBlock, endBlock) - if err != nil { - return err - } - var rollupEpochInfos []bindings.IRecordRollupEpochInfo - var epochTime *big.Int - if len(setsEpochs) != 0 { - for _, setsEpoch := range setsEpochs { - log.Info("received new sets change", "startTime", setsEpoch.StartTime, "endTime", setsEpoch.EndTime, "endBlock", setsEpoch.EndBlock) - updateTime, err := o.GetUpdateTime(setsEpoch.EndBlock.Int64() - 1) - if err != nil { - return err - } - epochTime, err = o.gov.RollupEpoch(&bind.CallOpts{ - BlockNumber: big.NewInt(setsEpoch.EndBlock.Int64() - 1), - }) - if err != nil { - return err - } - epochs, err := o.generateRollupEpoch(epochIndex.Int64()+int64(len(rollupEpochInfos)), rollupEpoch.EndTime.Int64(), epochTime.Int64(), updateTime, setsEpoch.EndBlock.Int64(), setsEpoch.EndTime.Int64(), setsEpoch.EndTime.Int64(), setsEpoch.Submitters) - if err != nil { - return err - } - rollupEpochInfos = append(rollupEpochInfos, epochs...) - } - } else { - updateTime, err := o.GetUpdateTime(int64(endBlock)) - if err != nil { - return fmt.Errorf("get update time error:%v", err) - } - epochTime, err = o.gov.RollupEpoch(&bind.CallOpts{ - BlockNumber: big.NewInt(int64(endBlock)), - }) - if err != nil { - return fmt.Errorf("get rollup epoch time error:%v", err) - } - header, err := o.l2Client.HeaderByNumber(o.ctx, big.NewInt(int64(endBlock))) - if err != nil { - return fmt.Errorf("get header by number error:%v", err) - } - sets, err := o.sequencer.GetSequencerSet2(&bind.CallOpts{ - BlockNumber: big.NewInt(int64(endBlock)), - }) - if err != nil { - return fmt.Errorf("get sequencer set error:%v", err) - } - epochs, err := o.generateRollupEpoch(epochIndex.Int64(), rollupEpoch.EndTime.Int64(), epochTime.Int64(), updateTime, int64(endBlock), int64(header.Time), math.MaxInt64, sets) - if err != nil { - return fmt.Errorf("generate rollup epoch info error:%v", err) - } - rollupEpochInfos = append(rollupEpochInfos, epochs...) - } - if len(rollupEpochInfos) == 0 { - log.Info("rollup epoch infos length is zero", "startBlock", startBlock, "endBlock", endBlock, "rollupEpochMaxBlock", o.rollupEpochMaxBlock, "epochTime", epochTime) - time.Sleep(defaultSleepTime) - return nil - } - log.Info("submit rollup epoch infos", "startBlock", startBlock, "endBlock", endBlock, "infoLength", len(rollupEpochInfos)) - err = o.submitRollupEpoch(rollupEpochInfos) - if err != nil { - if len(rollupEpochInfos) > 50 { - if o.cfg.MinSize*2 <= o.rollupEpochMaxBlock { - o.rollupEpochMaxBlock -= o.cfg.MinSize - } else { - o.rollupEpochMaxBlock = o.rollupEpochMaxBlock / 2 - } - } - return fmt.Errorf("submit rollup epoch info error:%v,rollupEpochMaxBlock:%v", err, o.rollupEpochMaxBlock) - } - if o.rollupEpochMaxBlock+o.cfg.MinSize <= o.cfg.MaxSize { - o.rollupEpochMaxBlock += o.cfg.MinSize - } - - log.Info("submit rollup epoch info success", "rollupEpochMaxBlock", o.rollupEpochMaxBlock) - return nil -} - -func (o *Oracle) submitRollupEpoch(epochs []bindings.IRecordRollupEpochInfo) error { - callData, err := o.recordAbi.Pack("recordRollupEpochs", epochs) - if err != nil { - return err - } - tx, err := o.newRecordTxAndSign(callData) - if err != nil { - return err - } - log.Info("send record rollup epoch tx success", "txHash", tx.Hash().Hex(), "nonce", tx.Nonce()) - var receipt *types.Receipt - err = backoff.Do(30, backoff.Exponential(), func() error { - var err error - receipt, err = o.waitReceiptWithCtx(o.ctx, tx.Hash()) - return err - }) - if err != nil { - return fmt.Errorf("receipt record rollup epochs error:%v", err) - } - if receipt.Status != types.ReceiptStatusSuccessful { - return fmt.Errorf("record rollup epochs not success") - } - log.Info("wait receipt success", "txHash", tx.Hash()) - return nil -} - -func (o *Oracle) GetUpdateTime(blockNumber int64) (int64, error) { - updateTime, err := o.sequencer.UpdateTime(&bind.CallOpts{ - BlockNumber: big.NewInt(blockNumber), - }) - if err != nil { - return 0, err - } - epochUpdateTime, err := o.gov.RollupEpochUpdateTime(&bind.CallOpts{ - BlockNumber: big.NewInt(blockNumber), - }) - if err != nil { - return 0, err - } - header, err := o.l2Client.HeaderByNumber(o.ctx, big.NewInt(1)) - if err != nil { - return 0, err - } - if updateTime.Cmp(epochUpdateTime) <= 0 { - updateTime = epochUpdateTime - } - if updateTime.Uint64() <= header.Time { - updateTime = big.NewInt(int64(header.Time)) - } - return updateTime.Int64(), nil -} - -func (o *Oracle) GetSequencerSetsEpoch(start, end uint64) ([]SequencerSetUpdateEpoch, error) { - var epochBlock []int - rollupEpochUpdated, err := o.fetchRollupEpochUpdated(o.ctx, start, end) - if err != nil { - return nil, err - } - epochBlock = append(epochBlock, rollupEpochUpdated...) - sequencerSetUpdated, err := o.fetchSequencerSetUpdated(o.ctx, start, end) - if err != nil { - return nil, err - } - epochBlock = append(epochBlock, sequencerSetUpdated...) - sortedBlocks := removeDuplicatesAndSort(epochBlock) - sort.Ints(sortedBlocks) - var setsEpochInfos []SequencerSetUpdateEpoch - for _, eb := range sortedBlocks { - header, err := o.l2Client.HeaderByNumber(o.ctx, big.NewInt(int64(eb))) - if err != nil { - return nil, err - } - sequencerSets, err := o.sequencer.GetSequencerSet2(&bind.CallOpts{ - BlockNumber: big.NewInt(int64(eb - 1)), - }) - if err != nil { - return nil, err - } - lastTime, err := o.GetUpdateTime(header.Number.Int64() - 1) - if err != nil { - return nil, err - } - epochInfo := SequencerSetUpdateEpoch{ - Submitters: sequencerSets, - StartTime: big.NewInt(lastTime), - EndTime: big.NewInt(int64(header.Time)), - EndBlock: header.Number, - } - setsEpochInfos = append(setsEpochInfos, epochInfo) - } - return setsEpochInfos, nil -} - -func (o *Oracle) fetchRollupEpochUpdated(ctx context.Context, start, end uint64) ([]int, error) { - opts := &bind.FilterOpts{ - Context: ctx, - Start: start, - End: &end, - } - iter, err := o.gov.FilterRollupEpochUpdated(opts) - if err != nil { - return nil, err - } - defer func() { - if err := iter.Close(); err != nil { - log.Info("GovRollupEpochUpdatedIterator close failed", "error", err) - } - }() - var blocks []int - for iter.Next() { - blocks = append(blocks, int(iter.Event.Raw.BlockNumber)) - } - return blocks, nil -} - -func (o *Oracle) fetchSequencerSetUpdated(ctx context.Context, start, end uint64) ([]int, error) { - opts := &bind.FilterOpts{ - Context: ctx, - Start: start, - End: &end, - } - iter, err := o.sequencer.FilterSequencerSetUpdated(opts) - if err != nil { - return nil, err - } - defer func() { - if err := iter.Close(); err != nil { - log.Info("SequencerSequencerSetUpdatedIterator close failed", "error", err) - } - }() - var blocks []int - for iter.Next() { - blocks = append(blocks, int(iter.Event.Raw.BlockNumber)) - } - return blocks, nil -} - -type set struct { - list *list.List -} - -func newSet() *set { - return &set{list.New()} -} - -func (s *set) add(value int) { - for e := s.list.Front(); e != nil; e = e.Next() { - if e.Value == value { - return - } - } - s.list.PushBack(value) -} - -func (s *set) values() []int { - values := make([]int, 0, s.list.Len()) - for e := s.list.Front(); e != nil; e = e.Next() { - values = append(values, e.Value.(int)) - } - return values -} - -func removeDuplicatesAndSort(arr []int) []int { - s := newSet() - for _, v := range arr { - s.add(v) - } - return s.values() -} diff --git a/oracle/oracle/sign.go b/oracle/oracle/sign.go deleted file mode 100644 index 05e32d476..000000000 --- a/oracle/oracle/sign.go +++ /dev/null @@ -1,83 +0,0 @@ -package oracle - -import ( - "fmt" - "math/big" - - "morph-l2/bindings/predeploys" - - "github.com/morph-l2/externalsign" - "github.com/morph-l2/go-ethereum" - "github.com/morph-l2/go-ethereum/common" - "github.com/morph-l2/go-ethereum/core/types" - "github.com/morph-l2/go-ethereum/crypto" -) - -var externalSigner *externalsign.ExternalSign - -func (o *Oracle) sign(tx *types.Transaction) (*types.Transaction, error) { - if o.cfg.ExternalSign { - if externalSigner == nil { - externalSigner = externalsign.NewExternalSign(o.cfg.ExternalSignAppid, o.externalRsaPriv, o.cfg.ExternalSignAddress, o.cfg.ExternalSignChain, o.signer) - } - signedTx, err := externalSigner.RequestSign(o.cfg.ExternalSignUrl, tx) - if err != nil { - return nil, fmt.Errorf("externalsign sign tx error:%v", err) - } - return signedTx, nil - } else { - signedTx, err := types.SignTx(tx, o.signer, o.privKey) - if err != nil { - return nil, fmt.Errorf("sign tx error:%v", err) - } - return signedTx, nil - - } -} - -func (o *Oracle) newRecordTxAndSign(callData []byte) (*types.Transaction, error) { - from := common.HexToAddress(o.cfg.ExternalSignAddress) - if !o.cfg.ExternalSign { - from = crypto.PubkeyToAddress(o.privKey.PublicKey) - } - nonce, err := o.l2Client.NonceAt(o.ctx, from, nil) - if err != nil { - return nil, err - } - // tip and cap - tip, err := o.l2Client.SuggestGasTipCap(o.ctx) - if err != nil { - return nil, err - } - head, err := o.l2Client.HeaderByNumber(o.ctx, nil) - if err != nil { - return nil, err - } - var gasFeeCap *big.Int - if head.BaseFee != nil { - gasFeeCap = new(big.Int).Add( - tip, - new(big.Int).Mul(head.BaseFee, big.NewInt(2)), - ) - } else { - gasFeeCap = new(big.Int).Set(tip) - } - gas, err := o.l2Client.EstimateGas(o.ctx, ethereum.CallMsg{ - From: from, - To: &predeploys.RecordAddr, - GasFeeCap: gasFeeCap, - GasTipCap: tip, - Data: callData, - }) - if err != nil { - return nil, err - } - return o.sign(types.NewTx(&types.DynamicFeeTx{ - ChainID: o.chainId, - Nonce: nonce, - GasTipCap: tip, - GasFeeCap: gasFeeCap, - Gas: gas, - To: &o.recordAddr, - Data: callData})) -} diff --git a/oracle/oracle/types.go b/oracle/oracle/types.go deleted file mode 100644 index 2c5fde6d2..000000000 --- a/oracle/oracle/types.go +++ /dev/null @@ -1,10 +0,0 @@ -package oracle - -import "errors" - -// empirical value -const maxBatchSize = 72 - -var ( - ErrRewardNotStart = errors.New("reward has not start") -) diff --git a/tx-submitter/go.mod b/tx-submitter/go.mod index b4b15955b..84a07332c 100644 --- a/tx-submitter/go.mod +++ b/tx-submitter/go.mod @@ -7,7 +7,7 @@ replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3. require ( github.com/holiman/uint256 v1.2.4 github.com/morph-l2/externalsign v0.3.1 - github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de + github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd github.com/prometheus/client_golang v1.17.0 github.com/stretchr/testify v1.9.0 github.com/tendermint/tendermint v0.35.9 diff --git a/tx-submitter/go.sum b/tx-submitter/go.sum index b5990fb1a..eedaf8aac 100644 --- a/tx-submitter/go.sum +++ b/tx-submitter/go.sum @@ -164,8 +164,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/morph-l2/externalsign v0.3.1 h1:UYFDZFB0L85A4rDvuwLNBiGEi0kSmg9AZ2v8Q5O4dQo= github.com/morph-l2/externalsign v0.3.1/go.mod h1:b6NJ4GUiiG/gcSJsp3p8ExsIs4ZdphlrVALASnVoGJE= -github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de h1:NOzYvFCuqWZ0bg2GAcC2S9cwd1rThSCTwyJCT8Iwfgc= -github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= +github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd h1:u8Ww4bHGUbRR2iPrLFaMM1GuCBQvL1cYUL7ijtbfoH0= +github.com/morph-l2/go-ethereum v1.10.14-0.20250225020901-6fe0ee6ffedd/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= github.com/morph-l2/tendermint v0.3.2-0.20250115141431-c84dfe5c8533 h1:qhBMCyTQ/ezOpeqHGKjr4qSN/B/bGFByuYjQqDt5wiw= github.com/morph-l2/tendermint v0.3.2-0.20250115141431-c84dfe5c8533/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=