diff --git a/.github/workflows/oracle.yml b/.github/workflows/oracle.yml deleted file mode 100644 index f7713932..00000000 --- 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/go.work b/go.work index a223f15c..26ccd056 100644 --- a/go.work +++ b/go.work @@ -6,6 +6,5 @@ use ( ./node ./ops/l2-genesis ./ops/tools - ./oracle ./tx-submitter ) diff --git a/node/core/batch.go b/node/core/batch.go index 6ba06f23..aac9355f 100644 --- a/node/core/batch.go +++ b/node/core/batch.go @@ -341,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/derivation/batch_info.go b/node/derivation/batch_info.go index 4c1470aa..f9f7830d 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 439acbc4..4dcacd69 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 a3fc43fb..282b187a 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 653ce96c..ed815791 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 f9674bb4..b58c2204 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,6 +220,12 @@ 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", @@ -240,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", @@ -348,6 +349,7 @@ var Flags = []cli.Flag{ L1BeaconAddr, // batch rules + Morph204Time, UpgradeBatchTime, MainnetFlag, HoleskyFlag, diff --git a/node/types/consensus_message.go b/node/types/consensus_message.go index ce69ae59..58d47925 100644 --- a/node/types/consensus_message.go +++ b/node/types/consensus_message.go @@ -152,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/oracle/Dockerfile b/oracle/Dockerfile deleted file mode 100644 index 7a04ec8e..00000000 --- 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 2aa65c43..00000000 --- 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 5e0f7601..00000000 --- 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 063e9685..00000000 --- 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 a852f37d..00000000 --- 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 2988a323..00000000 --- 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 7fc0d856..00000000 --- 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 510531db..00000000 --- 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 18e6e8b2..00000000 --- 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 daaef255..00000000 --- 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 ae0bc3d0..00000000 --- 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 bcde191d..00000000 --- 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.20250225020901-6fe0ee6ffedd - 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 65b029e8..00000000 --- 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.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= -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 d026222c..00000000 --- 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 2384637c..00000000 --- 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 8f688313..00000000 --- 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 fd765b37..00000000 --- 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 c6052faf..00000000 --- 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 05e32d47..00000000 --- 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 2c5fde6d..00000000 --- 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") -)