diff --git a/bridge/cmd/app/app.go b/bridge/cmd/app/app.go new file mode 100644 index 000000000..57cee16df --- /dev/null +++ b/bridge/cmd/app/app.go @@ -0,0 +1,125 @@ +package app + +import ( + "fmt" + "os" + "os/signal" + + "github.com/scroll-tech/go-ethereum/log" + "github.com/urfave/cli/v2" + + "scroll-tech/database" + + "scroll-tech/common/utils" + "scroll-tech/common/version" + + "scroll-tech/bridge/config" + "scroll-tech/bridge/l1" + "scroll-tech/bridge/l2" +) + +var ( + app *cli.App +) + +func init() { + // Set up Bridge app info. + app = cli.NewApp() + + app.Action = action + app.Name = "bridge" + app.Usage = "The Scroll Bridge" + app.Version = version.Version + app.Flags = append(app.Flags, utils.CommonFlags...) + app.Flags = append(app.Flags, apiFlags...) + + app.Before = func(ctx *cli.Context) error { + return utils.LogSetup(ctx) + } + + // Register `bridge-test` app for integration-test. + utils.RegisterSimulation(app, "bridge-test") +} + +func action(ctx *cli.Context) error { + // Load config file. + cfgFile := ctx.String(utils.ConfigFileFlag.Name) + cfg, err := config.NewConfig(cfgFile) + if err != nil { + log.Crit("failed to load config file", "config file", cfgFile, "error", err) + } + + // init db connection + var ormFactory database.OrmFactory + if ormFactory, err = database.NewOrmFactory(cfg.DBConfig); err != nil { + log.Crit("failed to init db connection", "err", err) + } + + var ( + l1Backend *l1.Backend + l2Backend *l2.Backend + ) + // @todo change nil to actual client after https://scroll-tech/bridge/pull/40 merged + l1Backend, err = l1.New(ctx.Context, cfg.L1Config, ormFactory) + if err != nil { + return err + } + l2Backend, err = l2.New(ctx.Context, cfg.L2Config, ormFactory) + if err != nil { + return err + } + defer func() { + l1Backend.Stop() + l2Backend.Stop() + err = ormFactory.Close() + if err != nil { + log.Error("can not close ormFactory", err) + } + }() + + // Start all modules. + if err = l1Backend.Start(); err != nil { + log.Crit("couldn't start l1 backend", "error", err) + } + if err = l2Backend.Start(); err != nil { + log.Crit("couldn't start l2 backend", "error", err) + } + + // Register api and start rpc service. + if ctx.Bool(httpEnabledFlag.Name) { + handler, addr, err := utils.StartHTTPEndpoint( + fmt.Sprintf( + "%s:%d", + ctx.String(httpListenAddrFlag.Name), + ctx.Int(httpPortFlag.Name)), + l2Backend.APIs()) + if err != nil { + log.Crit("Could not start RPC api", "error", err) + } + defer func() { + _ = handler.Shutdown(ctx.Context) + log.Info("HTTP endpoint closed", "url", fmt.Sprintf("http://%v/", addr)) + }() + log.Info("HTTP endpoint opened", "url", fmt.Sprintf("http://%v/", addr)) + } + + log.Info("Start bridge successfully") + + // Catch CTRL-C to ensure a graceful shutdown. + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt) + + // Wait until the interrupt signal is received from an OS signal. + <-interrupt + + return nil +} + +// Run run bridge cmd instance. +func Run() { + // Run the bridge. + if err := app.Run(os.Args); err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} diff --git a/bridge/cmd/app/app_test.go b/bridge/cmd/app/app_test.go new file mode 100644 index 000000000..6ace17211 --- /dev/null +++ b/bridge/cmd/app/app_test.go @@ -0,0 +1,19 @@ +package app + +import ( + "fmt" + "testing" + "time" + + "scroll-tech/common/cmd" + "scroll-tech/common/version" +) + +func TestRunBridge(t *testing.T) { + bridge := cmd.NewCmd(t, "bridge-test", "--version") + defer bridge.WaitExit() + + // wait result + bridge.ExpectWithTimeout(true, time.Second*3, fmt.Sprintf("bridge version %s", version.Version)) + bridge.RunApp(false) +} diff --git a/bridge/cmd/flags.go b/bridge/cmd/app/flags.go similarity index 91% rename from bridge/cmd/flags.go rename to bridge/cmd/app/flags.go index 14a06d30b..5a5c28174 100644 --- a/bridge/cmd/flags.go +++ b/bridge/cmd/app/flags.go @@ -1,6 +1,8 @@ -package main +package app -import "github.com/urfave/cli/v2" +import ( + "github.com/urfave/cli/v2" +) var ( apiFlags = []cli.Flag{ diff --git a/bridge/cmd/main.go b/bridge/cmd/main.go index cb4eb601d..1438d2586 100644 --- a/bridge/cmd/main.go +++ b/bridge/cmd/main.go @@ -1,113 +1,7 @@ package main -import ( - "fmt" - "os" - "os/signal" - - "github.com/scroll-tech/go-ethereum/log" - "github.com/urfave/cli/v2" - - "scroll-tech/database" - - "scroll-tech/common/utils" - "scroll-tech/common/version" - - "scroll-tech/bridge/config" - "scroll-tech/bridge/l1" - "scroll-tech/bridge/l2" -) +import "scroll-tech/bridge/cmd/app" func main() { - // Set up Bridge app info. - app := cli.NewApp() - - app.Action = action - app.Name = "bridge" - app.Usage = "The Scroll Bridge" - app.Version = version.Version - app.Flags = append(app.Flags, utils.CommonFlags...) - app.Flags = append(app.Flags, apiFlags...) - - app.Before = func(ctx *cli.Context) error { - return utils.LogSetup(ctx) - } - // Run the sequencer. - if err := app.Run(os.Args); err != nil { - _, _ = fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} - -func action(ctx *cli.Context) error { - // Load config file. - cfgFile := ctx.String(utils.ConfigFileFlag.Name) - cfg, err := config.NewConfig(cfgFile) - if err != nil { - log.Crit("failed to load config file", "config file", cfgFile, "error", err) - } - - // init db connection - var ormFactory database.OrmFactory - if ormFactory, err = database.NewOrmFactory(cfg.DBConfig); err != nil { - log.Crit("failed to init db connection", "err", err) - } - - var ( - l1Backend *l1.Backend - l2Backend *l2.Backend - ) - // @todo change nil to actual client after https://scroll-tech/bridge/pull/40 merged - l1Backend, err = l1.New(ctx.Context, cfg.L1Config, ormFactory) - if err != nil { - return err - } - l2Backend, err = l2.New(ctx.Context, cfg.L2Config, ormFactory) - if err != nil { - return err - } - defer func() { - l1Backend.Stop() - l2Backend.Stop() - err = ormFactory.Close() - if err != nil { - log.Error("can not close ormFactory", err) - } - }() - - // Start all modules. - if err = l1Backend.Start(); err != nil { - log.Crit("couldn't start l1 backend", "error", err) - } - if err = l2Backend.Start(); err != nil { - log.Crit("couldn't start l2 backend", "error", err) - } - - apis := l2Backend.APIs() - // Register api and start rpc service. - if ctx.Bool(httpEnabledFlag.Name) { - handler, addr, err := utils.StartHTTPEndpoint( - fmt.Sprintf( - "%s:%d", - ctx.String(httpListenAddrFlag.Name), - ctx.Int(httpPortFlag.Name)), - apis) - if err != nil { - log.Crit("Could not start HTTP api", "error", err) - } - defer func() { - _ = handler.Shutdown(ctx.Context) - log.Info("HTTP endpoint closed", "url", fmt.Sprintf("http://%v/", addr)) - }() - log.Info("HTTP endpoint opened", "url", fmt.Sprintf("http://%v/", addr)) - } - - // Catch CTRL-C to ensure a graceful shutdown. - interrupt := make(chan os.Signal, 1) - signal.Notify(interrupt, os.Interrupt) - - // Wait until the interrupt signal is received from an OS signal. - <-interrupt - - return nil + app.Run() } diff --git a/bridge/go.mod b/bridge/go.mod index 4fe621827..8a4956baa 100644 --- a/bridge/go.mod +++ b/bridge/go.mod @@ -5,7 +5,7 @@ go 1.18 require ( github.com/iden3/go-iden3-crypto v0.0.13 github.com/orcaman/concurrent-map v1.0.0 - github.com/scroll-tech/go-ethereum v1.10.14-0.20221213034543-78c1f57fcfea + github.com/scroll-tech/go-ethereum v1.10.14-0.20221221073256-5ca70bf3a257 github.com/stretchr/testify v1.8.0 github.com/urfave/cli/v2 v2.10.2 golang.org/x/sync v0.1.0 diff --git a/bridge/go.sum b/bridge/go.sum index bf580629a..f9060bf4a 100644 --- a/bridge/go.sum +++ b/bridge/go.sum @@ -348,8 +348,8 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 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/scroll-tech/go-ethereum v1.10.14-0.20221213034543-78c1f57fcfea h1:KYlmCH4cDMGxQzaYoSK8+DF53POGpAmnzusAtBWzEjA= -github.com/scroll-tech/go-ethereum v1.10.14-0.20221213034543-78c1f57fcfea/go.mod h1:jurIpDQ0hqtp9//xxeWzr8X9KMP/+TYn+vz3K1wZrv0= +github.com/scroll-tech/go-ethereum v1.10.14-0.20221221073256-5ca70bf3a257 h1:FjBC0Ww42WRoiB5EQFxoIEcJqoEUw2twdhN9nGkVCQA= +github.com/scroll-tech/go-ethereum v1.10.14-0.20221221073256-5ca70bf3a257/go.mod h1:jurIpDQ0hqtp9//xxeWzr8X9KMP/+TYn+vz3K1wZrv0= github.com/scroll-tech/zktrie v0.3.0/go.mod h1:CuJFlG1/soTJJBAySxCZgTF7oPvd5qF6utHOEciC43Q= github.com/scroll-tech/zktrie v0.3.1 h1:HlR+fMBdjXX1/7cUMqpUgGEhGy/3vN1JpwQ0ovg/Ys8= github.com/scroll-tech/zktrie v0.3.1/go.mod h1:CuJFlG1/soTJJBAySxCZgTF7oPvd5qF6utHOEciC43Q= diff --git a/bridge/l1/l1_test.go b/bridge/l1/l1_test.go new file mode 100644 index 000000000..a0f17c448 --- /dev/null +++ b/bridge/l1/l1_test.go @@ -0,0 +1,65 @@ +package l1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "scroll-tech/common/docker" + + "scroll-tech/bridge/config" +) + +var ( + // config + cfg *config.Config + + // docker consider handler. + l1gethImg docker.ImgInstance + l2gethImg docker.ImgInstance + dbImg docker.ImgInstance +) + +func setupEnv(t *testing.T) { + // Load config. + var err error + cfg, err = config.NewConfig("../config.json") + assert.NoError(t, err) + + // Create l1geth container. + l1gethImg = docker.NewTestL1Docker(t) + cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = l1gethImg.Endpoint() + cfg.L1Config.Endpoint = l1gethImg.Endpoint() + + // Create l2geth container. + l2gethImg = docker.NewTestL2Docker(t) + cfg.L1Config.RelayerConfig.SenderConfig.Endpoint = l2gethImg.Endpoint() + cfg.L2Config.Endpoint = l2gethImg.Endpoint() + + // Create db container. + dbImg = docker.NewTestDBDocker(t, cfg.DBConfig.DriverName) + cfg.DBConfig.DSN = dbImg.Endpoint() +} + +func free(t *testing.T) { + if dbImg != nil { + assert.NoError(t, dbImg.Stop()) + } + if l1gethImg != nil { + assert.NoError(t, l1gethImg.Stop()) + } + if l2gethImg != nil { + assert.NoError(t, l2gethImg.Stop()) + } +} + +func TestL1(t *testing.T) { + setupEnv(t) + + t.Run("testCreateNewL1Relayer", testCreateNewL1Relayer) + t.Run("testStartWatcher", testStartWatcher) + + t.Cleanup(func() { + free(t) + }) +} diff --git a/bridge/l1/relayer.go b/bridge/l1/relayer.go index c910bf8a6..302ab8c99 100644 --- a/bridge/l1/relayer.go +++ b/bridge/l1/relayer.go @@ -10,6 +10,7 @@ import ( "github.com/scroll-tech/go-ethereum/accounts/abi" "github.com/scroll-tech/go-ethereum/common" + "github.com/scroll-tech/go-ethereum/crypto" "github.com/scroll-tech/go-ethereum/ethclient" "github.com/scroll-tech/go-ethereum/log" @@ -51,7 +52,8 @@ func NewLayer1Relayer(ctx context.Context, ethClient *ethclient.Client, l1Confir sender, err := sender.NewSender(ctx, cfg.SenderConfig, cfg.MessageSenderPrivateKeys) if err != nil { - log.Error("new sender failed", "err", err) + addr := crypto.PubkeyToAddress(cfg.MessageSenderPrivateKeys[0].PublicKey) + log.Error("new sender failed", "main address", addr.String(), "err", err) return nil, err } diff --git a/bridge/l1/relayer_test.go b/bridge/l1/relayer_test.go index 1de9011a1..c019bf584 100644 --- a/bridge/l1/relayer_test.go +++ b/bridge/l1/relayer_test.go @@ -1,4 +1,4 @@ -package l1_test +package l1 import ( "context" @@ -9,37 +9,21 @@ import ( "scroll-tech/database/migrate" - "scroll-tech/bridge/config" - "scroll-tech/bridge/l1" - "scroll-tech/database" - - "scroll-tech/common/docker" ) -// TestCreateNewRelayer test create new relayer instance and stop -func TestCreateNewL1Relayer(t *testing.T) { - cfg, err := config.NewConfig("../config.json") - assert.NoError(t, err) - l1docker := docker.NewTestL1Docker(t) - defer l1docker.Stop() - cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = l1docker.Endpoint() - cfg.L1Config.Endpoint = l1docker.Endpoint() - - client, err := ethclient.Dial(l1docker.Endpoint()) - assert.NoError(t, err) - - dbImg := docker.NewTestDBDocker(t, cfg.DBConfig.DriverName) - defer dbImg.Stop() - cfg.DBConfig.DSN = dbImg.Endpoint() - +// testCreateNewRelayer test create new relayer instance and stop +func testCreateNewL1Relayer(t *testing.T) { // Create db handler and reset db. db, err := database.NewOrmFactory(cfg.DBConfig) assert.NoError(t, err) assert.NoError(t, migrate.ResetDB(db.GetDB().DB)) defer db.Close() - relayer, err := l1.NewLayer1Relayer(context.Background(), client, 1, db, cfg.L2Config.RelayerConfig) + client, err := ethclient.Dial(l1gethImg.Endpoint()) + assert.NoError(t, err) + + relayer, err := NewLayer1Relayer(context.Background(), client, 1, db, cfg.L2Config.RelayerConfig) assert.NoError(t, err) defer relayer.Stop() diff --git a/bridge/l1/watcher.go b/bridge/l1/watcher.go index eefb27bdf..bfb3e58e6 100644 --- a/bridge/l1/watcher.go +++ b/bridge/l1/watcher.go @@ -5,7 +5,7 @@ import ( "math/big" "time" - "github.com/scroll-tech/go-ethereum" + geth "github.com/scroll-tech/go-ethereum" "github.com/scroll-tech/go-ethereum/accounts/abi" "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/core/types" @@ -124,7 +124,7 @@ func (w *Watcher) fetchContractEvent(blockHeight uint64) error { } // warning: uint int conversion... - query := ethereum.FilterQuery{ + query := geth.FilterQuery{ FromBlock: big.NewInt(fromBlock), // inclusive ToBlock: big.NewInt(toBlock), // inclusive Addresses: []common.Address{ diff --git a/bridge/l1/watcher_test.go b/bridge/l1/watcher_test.go new file mode 100644 index 000000000..3a566fe81 --- /dev/null +++ b/bridge/l1/watcher_test.go @@ -0,0 +1,29 @@ +package l1 + +import ( + "context" + "testing" + + "github.com/scroll-tech/go-ethereum/ethclient" + "github.com/stretchr/testify/assert" + + "scroll-tech/database" + "scroll-tech/database/migrate" +) + +func testStartWatcher(t *testing.T) { + // Create db handler and reset db. + db, err := database.NewOrmFactory(cfg.DBConfig) + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(db.GetDB().DB)) + defer db.Close() + + client, err := ethclient.Dial(l1gethImg.Endpoint()) + assert.NoError(t, err) + + l1Cfg := cfg.L1Config + + watcher := NewWatcher(context.Background(), client, l1Cfg.StartHeight, l1Cfg.Confirmations, l1Cfg.L1MessengerAddress, l1Cfg.RelayerConfig.RollupContractAddress, db) + watcher.Start() + defer watcher.Stop() +} diff --git a/bridge/l2/batch_proposer_test.go b/bridge/l2/batch_proposer_test.go new file mode 100644 index 000000000..e0b150af9 --- /dev/null +++ b/bridge/l2/batch_proposer_test.go @@ -0,0 +1,62 @@ +package l2 + +import ( + "context" + "encoding/json" + "fmt" + "math/big" + "os" + "testing" + + "github.com/scroll-tech/go-ethereum/core/types" + "github.com/stretchr/testify/assert" + + "scroll-tech/database" + "scroll-tech/database/migrate" + + "scroll-tech/bridge/config" + + "scroll-tech/common/utils" +) + +func testBatchProposer(t *testing.T) { + // Create db handler and reset db. + db, err := database.NewOrmFactory(cfg.DBConfig) + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(db.GetDB().DB)) + defer db.Close() + + trace2 := &types.BlockTrace{} + trace3 := &types.BlockTrace{} + + data, err := os.ReadFile("../../common/testdata/blockTrace_02.json") + assert.NoError(t, err) + err = json.Unmarshal(data, trace2) + assert.NoError(t, err) + + data, err = os.ReadFile("../../common/testdata/blockTrace_03.json") + assert.NoError(t, err) + err = json.Unmarshal(data, trace3) + assert.NoError(t, err) + // Insert traces into db. + assert.NoError(t, db.InsertBlockTraces(context.Background(), []*types.BlockTrace{trace2, trace3})) + + id := utils.ComputeBatchID(trace3.Header.Hash(), trace2.Header.ParentHash, big.NewInt(1)) + + proposer := newBatchProposer(&config.BatchProposerConfig{ + ProofGenerationFreq: 1, + BatchGasThreshold: 3000000, + BatchTimeSec: 1, + BatchBlocksLimit: 100, + }, db) + assert.NoError(t, proposer.tryProposeBatch()) + + infos, err := db.GetUnbatchedBlocks(map[string]interface{}{}, + fmt.Sprintf("order by number ASC LIMIT %d", 100)) + assert.NoError(t, err) + assert.Equal(t, true, len(infos) == 0) + + exist, err := db.BatchRecordExist(id) + assert.NoError(t, err) + assert.Equal(t, true, exist) +} diff --git a/bridge/l2/l2_test.go b/bridge/l2/l2_test.go index 35467b206..306af608e 100644 --- a/bridge/l2/l2_test.go +++ b/bridge/l2/l2_test.go @@ -1,4 +1,4 @@ -package l2_test +package l2 import ( "testing" @@ -78,6 +78,8 @@ func TestFunction(t *testing.T) { t.Run("testL2RelayerProcessPendingBatches", testL2RelayerProcessPendingBatches) t.Run("testL2RelayerProcessCommittedBatches", testL2RelayerProcessCommittedBatches) + t.Run("testBatchProposer", testBatchProposer) + t.Cleanup(func() { free(t) }) diff --git a/bridge/l2/relayer_test.go b/bridge/l2/relayer_test.go index 799db5c00..32098db61 100644 --- a/bridge/l2/relayer_test.go +++ b/bridge/l2/relayer_test.go @@ -1,4 +1,4 @@ -package l2_test +package l2 import ( "context" @@ -11,8 +11,6 @@ import ( "github.com/scroll-tech/go-ethereum/core/types" "github.com/stretchr/testify/assert" - "scroll-tech/bridge/l2" - "scroll-tech/database" "scroll-tech/database/migrate" "scroll-tech/database/orm" @@ -42,7 +40,7 @@ func testCreateNewRelayer(t *testing.T) { assert.NoError(t, migrate.ResetDB(db.GetDB().DB)) defer db.Close() - relayer, err := l2.NewLayer2Relayer(context.Background(), l2Cli, int64(cfg.L2Config.Confirmations), db, cfg.L2Config.RelayerConfig) + relayer, err := NewLayer2Relayer(context.Background(), l2Cli, int64(cfg.L2Config.Confirmations), db, cfg.L2Config.RelayerConfig) assert.NoError(t, err) defer relayer.Stop() @@ -57,7 +55,7 @@ func testL2RelayerProcessSaveEvents(t *testing.T) { defer db.Close() l2Cfg := cfg.L2Config - relayer, err := l2.NewLayer2Relayer(context.Background(), l2Cli, int64(l2Cfg.Confirmations), db, l2Cfg.RelayerConfig) + relayer, err := NewLayer2Relayer(context.Background(), l2Cli, int64(l2Cfg.Confirmations), db, l2Cfg.RelayerConfig) assert.NoError(t, err) defer relayer.Stop() @@ -111,7 +109,7 @@ func testL2RelayerProcessPendingBatches(t *testing.T) { defer db.Close() l2Cfg := cfg.L2Config - relayer, err := l2.NewLayer2Relayer(context.Background(), l2Cli, int64(l2Cfg.Confirmations), db, l2Cfg.RelayerConfig) + relayer, err := NewLayer2Relayer(context.Background(), l2Cli, int64(l2Cfg.Confirmations), db, l2Cfg.RelayerConfig) assert.NoError(t, err) defer relayer.Stop() @@ -168,7 +166,7 @@ func testL2RelayerProcessCommittedBatches(t *testing.T) { defer db.Close() l2Cfg := cfg.L2Config - relayer, err := l2.NewLayer2Relayer(context.Background(), l2Cli, int64(l2Cfg.Confirmations), db, l2Cfg.RelayerConfig) + relayer, err := NewLayer2Relayer(context.Background(), l2Cli, int64(l2Cfg.Confirmations), db, l2Cfg.RelayerConfig) assert.NoError(t, err) defer relayer.Stop() diff --git a/bridge/l2/watcher.go b/bridge/l2/watcher.go index 1260f419b..f2a9ae4f9 100644 --- a/bridge/l2/watcher.go +++ b/bridge/l2/watcher.go @@ -7,7 +7,7 @@ import ( "reflect" "time" - "github.com/scroll-tech/go-ethereum" + geth "github.com/scroll-tech/go-ethereum" "github.com/scroll-tech/go-ethereum/accounts/abi" "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/core/types" @@ -186,7 +186,7 @@ func (w *WatcherClient) fetchContractEvent(blockHeight uint64) error { } // warning: uint int conversion... - query := ethereum.FilterQuery{ + query := geth.FilterQuery{ FromBlock: big.NewInt(fromBlock), // inclusive ToBlock: big.NewInt(toBlock), // inclusive Addresses: []common.Address{ diff --git a/bridge/l2/watcher_test.go b/bridge/l2/watcher_test.go index 7db717e53..aafcc2ef7 100644 --- a/bridge/l2/watcher_test.go +++ b/bridge/l2/watcher_test.go @@ -1,4 +1,4 @@ -package l2_test +package l2 import ( "context" @@ -15,7 +15,6 @@ import ( "github.com/stretchr/testify/assert" "scroll-tech/bridge/config" - "scroll-tech/bridge/l2" "scroll-tech/bridge/mock_bridge" "scroll-tech/bridge/sender" @@ -32,7 +31,7 @@ func testCreateNewWatcherAndStop(t *testing.T) { defer l2db.Close() l2cfg := cfg.L2Config - rc := l2.NewL2WatcherClient(context.Background(), l2Cli, l2cfg.Confirmations, l2cfg.BatchProposerConfig, l2cfg.L2MessengerAddress, l2db) + rc := NewL2WatcherClient(context.Background(), l2Cli, l2cfg.Confirmations, l2cfg.BatchProposerConfig, l2cfg.L2MessengerAddress, l2db) rc.Start() defer rc.Stop() @@ -183,8 +182,8 @@ func testFetchMultipleSentMessageInOneBlock(t *testing.T) { assert.Equal(t, 5, len(msgs)) } -func prepareRelayerClient(l2Cli *ethclient.Client, bpCfg *config.BatchProposerConfig, db database.OrmFactory, contractAddr common.Address) *l2.WatcherClient { - return l2.NewL2WatcherClient(context.Background(), l2Cli, 0, bpCfg, contractAddr, db) +func prepareRelayerClient(l2Cli *ethclient.Client, bpCfg *config.BatchProposerConfig, db database.OrmFactory, contractAddr common.Address) *WatcherClient { + return NewL2WatcherClient(context.Background(), l2Cli, 0, bpCfg, contractAddr, db) } func prepareAuth(t *testing.T, l2Cli *ethclient.Client, privateKey *ecdsa.PrivateKey) *bind.TransactOpts { diff --git a/bridge/sender/sender.go b/bridge/sender/sender.go index 6ef8b6af6..255042830 100644 --- a/bridge/sender/sender.go +++ b/bridge/sender/sender.go @@ -12,7 +12,7 @@ import ( "sync/atomic" "time" - "github.com/scroll-tech/go-ethereum" + geth "github.com/scroll-tech/go-ethereum" "github.com/scroll-tech/go-ethereum/accounts/abi/bind" "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/common/math" @@ -156,7 +156,7 @@ func (s *Sender) NumberOfAccounts() int { func (s *Sender) getFeeData(auth *bind.TransactOpts, target *common.Address, value *big.Int, data []byte) (*FeeData, error) { // estimate gas limit - gasLimit, err := s.client.EstimateGas(s.ctx, ethereum.CallMsg{From: auth.From, To: target, Value: value, Data: data}) + gasLimit, err := s.client.EstimateGas(s.ctx, geth.CallMsg{From: auth.From, To: target, Value: value, Data: data}) if err != nil { return nil, err } diff --git a/build/dockerfiles/bridge.Dockerfile b/build/dockerfiles/bridge.Dockerfile index 5c90d86b0..0a044aeb3 100644 --- a/build/dockerfiles/bridge.Dockerfile +++ b/build/dockerfiles/bridge.Dockerfile @@ -8,6 +8,7 @@ COPY ./common/go.* ./common/ COPY ./coordinator/go.* ./coordinator/ COPY ./database/go.* ./database/ COPY ./roller/go.* ./roller/ +COPY ./tests/integration-test/go.* ./tests/integration-test/ RUN go mod download -x # Build bridge diff --git a/build/dockerfiles/bridge.Dockerfile.dockerignore b/build/dockerfiles/bridge.Dockerfile.dockerignore index 74412efa6..5348dd31a 100644 --- a/build/dockerfiles/bridge.Dockerfile.dockerignore +++ b/build/dockerfiles/bridge.Dockerfile.dockerignore @@ -1,6 +1,5 @@ assets/ docs/ -integration-test/ l2geth/ rpc-gateway/ *target/* diff --git a/build/dockerfiles/coordinator.Dockerfile b/build/dockerfiles/coordinator.Dockerfile index 132ebd9e6..1c0f88e37 100644 --- a/build/dockerfiles/coordinator.Dockerfile +++ b/build/dockerfiles/coordinator.Dockerfile @@ -24,6 +24,7 @@ COPY ./common/go.* ./common/ COPY ./coordinator/go.* ./coordinator/ COPY ./database/go.* ./database/ COPY ./roller/go.* ./roller/ +COPY ./tests/integration-test/go.* ./tests/integration-test/ RUN go mod download -x diff --git a/build/dockerfiles/coordinator.Dockerfile.dockerignore b/build/dockerfiles/coordinator.Dockerfile.dockerignore index 1789e9d56..e67a9b0ef 100644 --- a/build/dockerfiles/coordinator.Dockerfile.dockerignore +++ b/build/dockerfiles/coordinator.Dockerfile.dockerignore @@ -1,7 +1,6 @@ assets/ contracts/ docs/ -integration-test/ l2geth/ rpc-gateway/ *target/* diff --git a/build/dockerfiles/db_cli.Dockerfile b/build/dockerfiles/db_cli.Dockerfile index e130d6c5a..385339ed2 100644 --- a/build/dockerfiles/db_cli.Dockerfile +++ b/build/dockerfiles/db_cli.Dockerfile @@ -8,6 +8,7 @@ COPY ./common/go.* ./common/ COPY ./coordinator/go.* ./coordinator/ COPY ./database/go.* ./database/ COPY ./roller/go.* ./roller/ +COPY ./tests/integration-test/go.* ./tests/integration-test/ RUN go mod download -x # Build db_cli diff --git a/build/dockerfiles/db_cli.Dockerfile.dockerignore b/build/dockerfiles/db_cli.Dockerfile.dockerignore index 1789e9d56..e67a9b0ef 100644 --- a/build/dockerfiles/db_cli.Dockerfile.dockerignore +++ b/build/dockerfiles/db_cli.Dockerfile.dockerignore @@ -1,7 +1,6 @@ assets/ contracts/ docs/ -integration-test/ l2geth/ rpc-gateway/ *target/* diff --git a/common/cmd/cmd.go b/common/cmd/cmd.go new file mode 100644 index 000000000..eb2b39826 --- /dev/null +++ b/common/cmd/cmd.go @@ -0,0 +1,169 @@ +package cmd + +import ( + "fmt" + "os" + "os/exec" + "strings" + "sync" + "testing" + "time" + + "github.com/docker/docker/pkg/reexec" + cmap "github.com/orcaman/concurrent-map" + "github.com/stretchr/testify/assert" +) + +var verbose bool + +func init() { + v := os.Getenv("LOG_DOCKER") + if v == "true" || v == "TRUE" { + verbose = true + } +} + +type checkFunc func(buf string) + +// Cmd struct +type Cmd struct { + *testing.T + + name string + args []string + + mu sync.Mutex + cmd *exec.Cmd + + checkFuncs cmap.ConcurrentMap //map[string]checkFunc + + //stdout bytes.Buffer + Err error +} + +// NewCmd create Cmd instance. +func NewCmd(t *testing.T, name string, args ...string) *Cmd { + return &Cmd{ + T: t, + checkFuncs: cmap.New(), + name: name, + args: args, + } +} + +// RunApp exec's the current binary using name as argv[0] which will trigger the +// reexec init function for that name (e.g. "geth-test" in cmd/geth/run_test.go) +func (t *Cmd) RunApp(parallel bool) { + t.Log("cmd: ", append([]string{t.name}, t.args...)) + cmd := &exec.Cmd{ + Path: reexec.Self(), + Args: append([]string{t.name}, t.args...), + Stderr: t, + Stdout: t, + } + if parallel { + go func() { + _ = cmd.Run() + }() + } else { + _ = cmd.Run() + } + t.mu.Lock() + t.cmd = cmd + t.mu.Unlock() +} + +// WaitExit wait util process exit. +func (t *Cmd) WaitExit() { + // Send interrupt signal. + t.mu.Lock() + _ = t.cmd.Process.Signal(os.Interrupt) + t.mu.Unlock() + + // Wait all the check funcs are finished or test status is failed. + tick := time.NewTicker(time.Millisecond * 500) + for !(t.Failed() || t.checkFuncs.IsEmpty()) { + <-tick.C + } +} + +// Interrupt send interrupt signal. +func (t *Cmd) Interrupt() { + t.mu.Lock() + t.Err = t.cmd.Process.Signal(os.Interrupt) + t.mu.Unlock() +} + +// RegistFunc register check func +func (t *Cmd) RegistFunc(key string, check checkFunc) { + t.checkFuncs.Set(key, check) +} + +// UnRegistFunc unregister check func +func (t *Cmd) UnRegistFunc(key string) { + t.checkFuncs.Pop(key) +} + +// ExpectWithTimeout wait result during timeout time. +func (t *Cmd) ExpectWithTimeout(parallel bool, timeout time.Duration, keyword string) { + if keyword == "" { + return + } + okCh := make(chan struct{}, 1) + t.RegistFunc(keyword, func(buf string) { + if strings.Contains(buf, keyword) { + select { + case okCh <- struct{}{}: + default: + return + } + } + }) + + waitResult := func() { + defer t.UnRegistFunc(keyword) + select { + case <-okCh: + return + case <-time.After(timeout): + assert.Fail(t, fmt.Sprintf("didn't get the desired result before timeout, keyword: %s", keyword)) + } + } + + if parallel { + go waitResult() + } else { + waitResult() + } +} + +func (t *Cmd) runCmd() { + cmd := exec.Command(t.args[0], t.args[1:]...) //nolint:gosec + cmd.Stdout = t + cmd.Stderr = t + _ = cmd.Run() +} + +// RunCmd parallel running when parallel is true. +func (t *Cmd) RunCmd(parallel bool) { + t.Log("cmd: ", t.args) + if parallel { + go t.runCmd() + } else { + t.runCmd() + } +} + +func (t *Cmd) Write(data []byte) (int, error) { + out := string(data) + if verbose { + t.Logf("%s: %v", t.name, out) + } else if strings.Contains(out, "error") || strings.Contains(out, "warning") { + t.Logf("%s: %v", t.name, out) + } + go t.checkFuncs.IterCb(func(_ string, value interface{}) { + check := value.(checkFunc) + check(out) + }) + return len(data), nil +} diff --git a/common/cmd/cmd_test.go b/common/cmd/cmd_test.go new file mode 100644 index 000000000..0211dd70f --- /dev/null +++ b/common/cmd/cmd_test.go @@ -0,0 +1,42 @@ +package cmd_test + +import ( + "fmt" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/assert" + + "scroll-tech/common/cmd" +) + +func TestCmd(t *testing.T) { + app := cmd.NewCmd(t, "curTime", "date", "+%Y-%m-%d") + + tm := time.Now() + curTime := fmt.Sprintf("%d-%d-%d", tm.Year(), tm.Month(), tm.Day()) + + okCh := make(chan struct{}, 1) + app.RegistFunc(curTime, func(buf string) { + if strings.Contains(buf, curTime) { + select { + case okCh <- struct{}{}: + default: + return + } + } + }) + defer app.UnRegistFunc(curTime) + + // Run cmd. + app.RunCmd(true) + + // Wait result. + select { + case <-okCh: + return + case <-time.After(time.Second): + assert.Fail(t, fmt.Sprintf("didn't get the desired result before timeout, keyword: %s", curTime)) + } +} diff --git a/common/docker/cmd.go b/common/docker/cmd.go deleted file mode 100644 index 49dc0ecbf..000000000 --- a/common/docker/cmd.go +++ /dev/null @@ -1,86 +0,0 @@ -package docker - -import ( - "os" - "os/exec" - "strings" - "sync" - "testing" -) - -var verbose bool - -func init() { - v := os.Getenv("LOG_DOCKER") - if v == "true" || v == "TRUE" { - verbose = true - } -} - -type checkFunc func(buf string) - -// Cmd struct -type Cmd struct { - *testing.T - - name string - args []string - - checkFuncs sync.Map //map[string]checkFunc -} - -// NewCmd create Cmd instance. -func NewCmd(t *testing.T, name string, args ...string) *Cmd { - cmd := &Cmd{ - T: t, - name: name, - args: args, - } - return cmd -} - -// RegistFunc register check func -func (t *Cmd) RegistFunc(key string, check checkFunc) { - t.checkFuncs.Store(key, check) -} - -// UnRegistFunc unregister check func -func (t *Cmd) UnRegistFunc(key string) { - if _, ok := t.checkFuncs.Load(key); ok { - t.checkFuncs.Delete(key) - } -} - -// RunCmd parallel running when parallel is true. -func (t *Cmd) RunCmd(parallel bool) { - t.Log("cmd: ", t.args) - if parallel { - go t.runCmd() - } else { - t.runCmd() - } -} - -func (t *Cmd) Write(data []byte) (int, error) { - out := string(data) - if verbose { - t.Logf("%s: %v", t.name, out) - } else if strings.Contains(out, "error") || strings.Contains(out, "warning") { - t.Logf("%s: %v", t.name, out) - } - go func(content string) { - t.checkFuncs.Range(func(key, value any) bool { - check := value.(checkFunc) - check(content) - return true - }) - }(out) - return len(data), nil -} - -func (t *Cmd) runCmd() { - cmd := exec.Command(t.args[0], t.args[1:]...) //nolint:gosec - cmd.Stdout = t - cmd.Stderr = t - _ = cmd.Run() -} diff --git a/common/docker/docker_db.go b/common/docker/docker_db.go index ae10c268e..b6cf388ec 100644 --- a/common/docker/docker_db.go +++ b/common/docker/docker_db.go @@ -9,6 +9,7 @@ import ( "github.com/docker/docker/api/types" + "scroll-tech/common/cmd" "scroll-tech/common/utils" ) @@ -23,7 +24,7 @@ type ImgDB struct { password string running bool - *Cmd + cmd *cmd.Cmd } // NewImgDB return postgres db img instance. @@ -35,7 +36,7 @@ func NewImgDB(t *testing.T, image, password, dbName string, port int) ImgInstanc dbName: dbName, port: port, } - img.Cmd = NewCmd(t, img.name, img.prepare()...) + img.cmd = cmd.NewCmd(t, img.name, img.prepare()...) return img } @@ -45,7 +46,7 @@ func (i *ImgDB) Start() error { if id != "" { return fmt.Errorf("container already exist, name: %s", i.name) } - i.Cmd.RunCmd(true) + i.cmd.RunCmd(true) i.running = i.isOk() if !i.running { _ = i.Stop() @@ -96,7 +97,7 @@ func (i *ImgDB) prepare() []string { func (i *ImgDB) isOk() bool { keyword := "database system is ready to accept connections" okCh := make(chan struct{}, 1) - i.RegistFunc(keyword, func(buf string) { + i.cmd.RegistFunc(keyword, func(buf string) { if strings.Contains(buf, keyword) { select { case okCh <- struct{}{}: @@ -105,7 +106,7 @@ func (i *ImgDB) isOk() bool { } } }) - defer i.UnRegistFunc(keyword) + defer i.cmd.UnRegistFunc(keyword) select { case <-okCh: diff --git a/common/docker/docker_geth.go b/common/docker/docker_geth.go index b7902fbbb..45b8f39ca 100644 --- a/common/docker/docker_geth.go +++ b/common/docker/docker_geth.go @@ -10,6 +10,7 @@ import ( "github.com/docker/docker/api/types" + "scroll-tech/common/cmd" "scroll-tech/common/utils" ) @@ -25,7 +26,7 @@ type ImgGeth struct { wsPort int running bool - *Cmd + cmd *cmd.Cmd } // NewImgGeth return geth img instance. @@ -38,7 +39,7 @@ func NewImgGeth(t *testing.T, image, volume, ipc string, hPort, wPort int) ImgIn httpPort: hPort, wsPort: wPort, } - img.Cmd = NewCmd(t, img.name, img.prepare()...) + img.cmd = cmd.NewCmd(t, img.name, img.prepare()...) return img } @@ -48,7 +49,7 @@ func (i *ImgGeth) Start() error { if id != "" { return fmt.Errorf("container already exist, name: %s", i.name) } - i.Cmd.RunCmd(true) + i.cmd.RunCmd(true) i.running = i.isOk() if !i.running { _ = i.Stop() @@ -75,7 +76,7 @@ func (i *ImgGeth) Endpoint() string { func (i *ImgGeth) isOk() bool { keyword := "WebSocket enabled" okCh := make(chan struct{}, 1) - i.RegistFunc(keyword, func(buf string) { + i.cmd.RegistFunc(keyword, func(buf string) { if strings.Contains(buf, keyword) { select { case okCh <- struct{}{}: @@ -84,7 +85,7 @@ func (i *ImgGeth) isOk() bool { } } }) - defer i.UnRegistFunc(keyword) + defer i.cmd.UnRegistFunc(keyword) select { case <-okCh: diff --git a/common/docker/docker_test.go b/common/docker/docker_test.go index 9acafc795..b91e294fe 100644 --- a/common/docker/docker_test.go +++ b/common/docker/docker_test.go @@ -10,12 +10,19 @@ import ( "github.com/stretchr/testify/assert" ) -func TestL1Geth(t *testing.T) { +func TestDocker(t *testing.T) { + t.Parallel() + + t.Run("testL1Geth", testL1Geth) + t.Run("testL2Geth", testL2Geth) + t.Run("testDB", testDB) +} + +func testL1Geth(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - img := NewImgGeth(t, "scroll_l1geth", "", "", 8535, 0) - assert.NoError(t, img.Start()) + img := NewTestL1Docker(t) defer img.Stop() client, err := ethclient.Dial(img.Endpoint()) @@ -26,12 +33,11 @@ func TestL1Geth(t *testing.T) { t.Logf("chainId: %s", chainID.String()) } -func TestL2Geth(t *testing.T) { +func testL2Geth(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - img := NewImgGeth(t, "scroll_l2geth", "", "", 8535, 0) - assert.NoError(t, img.Start()) + img := NewTestL2Docker(t) defer img.Stop() client, err := ethclient.Dial(img.Endpoint()) @@ -42,7 +48,7 @@ func TestL2Geth(t *testing.T) { t.Logf("chainId: %s", chainID.String()) } -func TestDB(t *testing.T) { +func testDB(t *testing.T) { driverName := "postgres" dbImg := NewTestDBDocker(t, driverName) defer dbImg.Stop() diff --git a/common/go.mod b/common/go.mod index bcce557b3..c2d7f2c15 100644 --- a/common/go.mod +++ b/common/go.mod @@ -3,12 +3,13 @@ module scroll-tech/common go 1.18 require ( - github.com/docker/docker v20.10.17+incompatible + github.com/docker/docker v20.10.21+incompatible github.com/jmoiron/sqlx v1.3.5 github.com/lib/pq v1.10.6 github.com/mattn/go-colorable v0.1.8 github.com/mattn/go-isatty v0.0.14 - github.com/scroll-tech/go-ethereum v1.10.14-0.20221213034543-78c1f57fcfea + github.com/orcaman/concurrent-map v1.0.0 + github.com/scroll-tech/go-ethereum v1.10.14-0.20221221073256-5ca70bf3a257 github.com/stretchr/testify v1.8.0 github.com/urfave/cli/v2 v2.10.2 golang.org/x/sync v0.1.0 diff --git a/common/go.sum b/common/go.sum index 5f1682107..e7154f9bc 100644 --- a/common/go.sum +++ b/common/go.sum @@ -112,8 +112,8 @@ github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwu github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= -github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.21+incompatible h1:UTLdBmHk3bEY+w8qeO5KttOhy6OmXWsl/FEet9Uswog= +github.com/docker/docker v20.10.21+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -364,6 +364,8 @@ github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFSt github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/orcaman/concurrent-map v1.0.0 h1:I/2A2XPCb4IuQWcQhBhSwGfiuybl/J0ev9HDbW65HOY= +github.com/orcaman/concurrent-map v1.0.0/go.mod h1:Lu3tH6HLW3feq74c2GC+jIMS/K2CFcDWnWD9XkenwhI= github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= @@ -402,8 +404,8 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 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/scroll-tech/go-ethereum v1.10.14-0.20221213034543-78c1f57fcfea h1:KYlmCH4cDMGxQzaYoSK8+DF53POGpAmnzusAtBWzEjA= -github.com/scroll-tech/go-ethereum v1.10.14-0.20221213034543-78c1f57fcfea/go.mod h1:jurIpDQ0hqtp9//xxeWzr8X9KMP/+TYn+vz3K1wZrv0= +github.com/scroll-tech/go-ethereum v1.10.14-0.20221221073256-5ca70bf3a257 h1:FjBC0Ww42WRoiB5EQFxoIEcJqoEUw2twdhN9nGkVCQA= +github.com/scroll-tech/go-ethereum v1.10.14-0.20221221073256-5ca70bf3a257/go.mod h1:jurIpDQ0hqtp9//xxeWzr8X9KMP/+TYn+vz3K1wZrv0= github.com/scroll-tech/zktrie v0.3.0/go.mod h1:CuJFlG1/soTJJBAySxCZgTF7oPvd5qF6utHOEciC43Q= github.com/scroll-tech/zktrie v0.3.1 h1:HlR+fMBdjXX1/7cUMqpUgGEhGy/3vN1JpwQ0ovg/Ys8= github.com/scroll-tech/zktrie v0.3.1/go.mod h1:CuJFlG1/soTJJBAySxCZgTF7oPvd5qF6utHOEciC43Q= diff --git a/common/message/message_test.go b/common/message/message_test.go index dade1b30f..54b8f862d 100644 --- a/common/message/message_test.go +++ b/common/message/message_test.go @@ -4,6 +4,7 @@ import ( "testing" "time" + "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/crypto" "github.com/stretchr/testify/assert" ) @@ -23,4 +24,10 @@ func TestAuthMessageSignAndVerify(t *testing.T) { ok, err := authMsg.Verify() assert.NoError(t, err) assert.Equal(t, true, ok) + + // Check public key is ok. + pub, err := authMsg.PublicKey() + assert.NoError(t, err) + pubkey := crypto.CompressPubkey(&privkey.PublicKey) + assert.Equal(t, pub, common.Bytes2Hex(pubkey)) } diff --git a/common/utils/env.go b/common/utils/env.go deleted file mode 100644 index 2a946f84e..000000000 --- a/common/utils/env.go +++ /dev/null @@ -1,12 +0,0 @@ -package utils - -import "os" - -// GetEnvWithDefault get value from env if is none use the default -func GetEnvWithDefault(key string, defult string) string { - val := os.Getenv(key) - if len(val) == 0 { - val = defult - } - return val -} diff --git a/common/utils/flags.go b/common/utils/flags.go index 591a51473..6e597153e 100644 --- a/common/utils/flags.go +++ b/common/utils/flags.go @@ -1,6 +1,8 @@ package utils -import "github.com/urfave/cli/v2" +import ( + "github.com/urfave/cli/v2" +) var ( // CommonFlags is used for app common flags in different modules diff --git a/common/utils/rpc_test.go b/common/utils/rpc_test.go new file mode 100644 index 000000000..5c00a6c80 --- /dev/null +++ b/common/utils/rpc_test.go @@ -0,0 +1,77 @@ +package utils + +import ( + "context" + "testing" + + "github.com/scroll-tech/go-ethereum/rpc" + "github.com/stretchr/testify/assert" +) + +type testService struct{} + +type echoArgs struct { + S string +} + +type echoResult struct { + Name string + ID int + Args *echoArgs +} + +func (s *testService) NoArgsRets() {} + +func (s *testService) Echo(str string, i int, args *echoArgs) echoResult { + return echoResult{str, i, args} +} + +func TestStartHTTPEndpoint(t *testing.T) { + endpoint := "localhost:18080" + handler, _, err := StartHTTPEndpoint(endpoint, []rpc.API{ + { + Public: true, + Namespace: "test", + Service: new(testService), + }, + }) + assert.NoError(t, err) + defer handler.Shutdown(context.Background()) + + client, err := rpc.Dial("http://" + endpoint) + assert.NoError(t, err) + + assert.NoError(t, client.Call(nil, "test_noArgsRets")) + + result := echoResult{} + assert.NoError(t, client.Call(&result, "test_echo", "test", 0, &echoArgs{S: "test"})) + assert.Equal(t, 0, result.ID) + assert.Equal(t, "test", result.Name) + + defer client.Close() +} + +func TestStartWSEndpoint(t *testing.T) { + endpoint := "localhost:18081" + handler, _, err := StartWSEndpoint(endpoint, []rpc.API{ + { + Public: true, + Namespace: "test", + Service: new(testService), + }, + }) + assert.NoError(t, err) + defer handler.Shutdown(context.Background()) + + client, err := rpc.Dial("ws://" + endpoint) + assert.NoError(t, err) + + assert.NoError(t, client.Call(nil, "test_noArgsRets")) + + result := echoResult{} + assert.NoError(t, client.Call(&result, "test_echo", "test", 0, &echoArgs{S: "test"})) + assert.Equal(t, 0, result.ID) + assert.Equal(t, "test", result.Name) + + defer client.Close() +} diff --git a/common/utils/simulation.go b/common/utils/simulation.go new file mode 100644 index 000000000..d25aad2eb --- /dev/null +++ b/common/utils/simulation.go @@ -0,0 +1,22 @@ +package utils + +import ( + "fmt" + "os" + + "github.com/docker/docker/pkg/reexec" + "github.com/urfave/cli/v2" +) + +// RegisterSimulation register initializer function for integration-test. +func RegisterSimulation(app *cli.App, name string) { + // Run the app for integration-test + reexec.Register(name, func() { + if err := app.Run(os.Args); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + os.Exit(0) + }) + reexec.Init() +} diff --git a/coordinator/client/api.go b/coordinator/client/api.go deleted file mode 100644 index bdc81a1c3..000000000 --- a/coordinator/client/api.go +++ /dev/null @@ -1,27 +0,0 @@ -package client - -import ( - "context" - - "github.com/scroll-tech/go-ethereum" - - "scroll-tech/common/message" -) - -// RequestToken generates token for roller -func (c *Client) RequestToken(ctx context.Context, authMsg *message.AuthMsg) (string, error) { - var token string - err := c.client.CallContext(ctx, &token, "roller_requestToken", authMsg) - return token, err -} - -// RegisterAndSubscribe subscribe roller and register, verified by sign data. -func (c *Client) RegisterAndSubscribe(ctx context.Context, taskCh chan *message.TaskMsg, authMsg *message.AuthMsg) (ethereum.Subscription, error) { - return c.client.Subscribe(ctx, "roller", taskCh, "register", authMsg) -} - -// SubmitProof get proof from roller. -func (c *Client) SubmitProof(ctx context.Context, proof *message.ProofMsg) (bool, error) { - var ok bool - return ok, c.client.CallContext(ctx, &ok, "roller_submitProof", proof) -} diff --git a/coordinator/client/client.go b/coordinator/client/client.go index 0006f1016..7c2cdb9e5 100644 --- a/coordinator/client/client.go +++ b/coordinator/client/client.go @@ -3,7 +3,10 @@ package client import ( "context" + "github.com/scroll-tech/go-ethereum" "github.com/scroll-tech/go-ethereum/rpc" + + "scroll-tech/common/message" ) // Client defines typed wrappers for the Ethereum RPC API. @@ -29,3 +32,21 @@ func DialContext(ctx context.Context, rawurl string) (*Client, error) { func NewClient(c *rpc.Client) *Client { return &Client{client: c} } + +// RequestToken generates token for roller +func (c *Client) RequestToken(ctx context.Context, authMsg *message.AuthMsg) (string, error) { + var token string + err := c.client.CallContext(ctx, &token, "roller_requestToken", authMsg) + return token, err +} + +// RegisterAndSubscribe subscribe roller and register, verified by sign data. +func (c *Client) RegisterAndSubscribe(ctx context.Context, taskCh chan *message.TaskMsg, authMsg *message.AuthMsg) (ethereum.Subscription, error) { + return c.client.Subscribe(ctx, "roller", taskCh, "register", authMsg) +} + +// SubmitProof get proof from roller. +func (c *Client) SubmitProof(ctx context.Context, proof *message.ProofMsg) (bool, error) { + var ok bool + return ok, c.client.CallContext(ctx, &ok, "roller_submitProof", proof) +} diff --git a/coordinator/cmd/app/app.go b/coordinator/cmd/app/app.go new file mode 100644 index 000000000..af1a1d48b --- /dev/null +++ b/coordinator/cmd/app/app.go @@ -0,0 +1,134 @@ +package app + +import ( + "fmt" + "os" + "os/signal" + + "github.com/scroll-tech/go-ethereum/ethclient" + + "github.com/scroll-tech/go-ethereum/log" + "github.com/urfave/cli/v2" + + "scroll-tech/database" + + "scroll-tech/common/utils" + "scroll-tech/common/version" + + "scroll-tech/coordinator" + "scroll-tech/coordinator/config" +) + +var ( + // Set up Coordinator app info. + app *cli.App +) + +func init() { + app = cli.NewApp() + app.Action = action + app.Name = "coordinator" + app.Usage = "The Scroll L2 Coordinator" + app.Version = version.Version + app.Flags = append(app.Flags, utils.CommonFlags...) + app.Flags = append(app.Flags, apiFlags...) + + app.Before = func(ctx *cli.Context) error { + return utils.LogSetup(ctx) + } + + // Register `coordinator-test` app for integration-test. + utils.RegisterSimulation(app, "coordinator-test") +} + +func action(ctx *cli.Context) error { + // Load config file. + cfgFile := ctx.String(utils.ConfigFileFlag.Name) + cfg, err := config.NewConfig(cfgFile) + if err != nil { + log.Crit("failed to load config file", "config file", cfgFile, "error", err) + } + + // init db connection + var ormFactory database.OrmFactory + if ormFactory, err = database.NewOrmFactory(cfg.DBConfig); err != nil { + log.Crit("failed to init db connection", "err", err) + } + + client, err := ethclient.Dial(cfg.L2Config.Endpoint) + if err != nil { + return err + } + + // Initialize all coordinator modules. + rollerManager, err := coordinator.New(ctx.Context, cfg.RollerManagerConfig, ormFactory, client) + if err != nil { + return err + } + defer func() { + rollerManager.Stop() + err = ormFactory.Close() + if err != nil { + log.Error("can not close ormFactory", err) + } + }() + + // Start all modules. + if err = rollerManager.Start(); err != nil { + log.Crit("couldn't start roller manager", "error", err) + } + + apis := rollerManager.APIs() + // Register api and start rpc service. + if ctx.Bool(httpEnabledFlag.Name) { + handler, addr, err := utils.StartHTTPEndpoint( + fmt.Sprintf( + "%s:%d", + ctx.String(httpListenAddrFlag.Name), + ctx.Int(httpPortFlag.Name)), + apis) + if err != nil { + log.Crit("Could not start RPC api", "error", err) + } + defer func() { + _ = handler.Shutdown(ctx.Context) + log.Info("HTTP endpoint closed", "url", fmt.Sprintf("http://%v/", addr)) + }() + log.Info("HTTP endpoint opened", "url", fmt.Sprintf("http://%v/", addr)) + } + // Register api and start ws service. + if ctx.Bool(wsEnabledFlag.Name) { + handler, addr, err := utils.StartWSEndpoint( + fmt.Sprintf( + "%s:%d", + ctx.String(wsListenAddrFlag.Name), + ctx.Int(wsPortFlag.Name)), + apis) + if err != nil { + log.Crit("Could not start WS api", "error", err) + } + defer func() { + _ = handler.Shutdown(ctx.Context) + log.Info("WS endpoint closed", "url", fmt.Sprintf("ws://%v/", addr)) + }() + log.Info("WS endpoint opened", "url", fmt.Sprintf("ws://%v/", addr)) + } + + // Catch CTRL-C to ensure a graceful shutdown. + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt) + + // Wait until the interrupt signal is received from an OS signal. + <-interrupt + + return nil +} + +// Run run coordinator. +func Run() { + // RunApp the coordinator. + if err := app.Run(os.Args); err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} diff --git a/coordinator/cmd/app/app_test.go b/coordinator/cmd/app/app_test.go new file mode 100644 index 000000000..b3d5638b8 --- /dev/null +++ b/coordinator/cmd/app/app_test.go @@ -0,0 +1,19 @@ +package app + +import ( + "fmt" + "testing" + "time" + + "scroll-tech/common/cmd" + "scroll-tech/common/version" +) + +func TestRunCoordinator(t *testing.T) { + coordinator := cmd.NewCmd(t, "coordinator-test", "--version") + defer coordinator.WaitExit() + + // wait result + coordinator.ExpectWithTimeout(true, time.Second*3, fmt.Sprintf("coordinator version %s", version.Version)) + coordinator.RunApp(false) +} diff --git a/coordinator/cmd/flags.go b/coordinator/cmd/app/flags.go similarity index 98% rename from coordinator/cmd/flags.go rename to coordinator/cmd/app/flags.go index 7f6dc844a..68ca985e8 100644 --- a/coordinator/cmd/flags.go +++ b/coordinator/cmd/app/flags.go @@ -1,4 +1,4 @@ -package main +package app import "github.com/urfave/cli/v2" diff --git a/coordinator/cmd/main.go b/coordinator/cmd/main.go index 9e25a96c8..29a0632ca 100644 --- a/coordinator/cmd/main.go +++ b/coordinator/cmd/main.go @@ -1,124 +1,7 @@ package main -import ( - "fmt" - "os" - "os/signal" - - "github.com/scroll-tech/go-ethereum/ethclient" - "github.com/scroll-tech/go-ethereum/log" - "github.com/urfave/cli/v2" - - "scroll-tech/common/utils" - "scroll-tech/common/version" - - "scroll-tech/database" - - "scroll-tech/coordinator" - "scroll-tech/coordinator/config" -) +import "scroll-tech/coordinator/cmd/app" func main() { - // Set up Coordinator app info. - app := cli.NewApp() - - app.Action = action - app.Name = "Coordinator" - app.Usage = "The Scroll L2 Coordinator" - app.Version = version.Version - app.Flags = append(app.Flags, utils.CommonFlags...) - app.Flags = append(app.Flags, apiFlags...) - - app.Before = func(ctx *cli.Context) error { - return utils.LogSetup(ctx) - } - - // Run the coordinator. - if err := app.Run(os.Args); err != nil { - _, _ = fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} - -func action(ctx *cli.Context) error { - // Load config file. - cfgFile := ctx.String(utils.ConfigFileFlag.Name) - cfg, err := config.NewConfig(cfgFile) - if err != nil { - log.Crit("failed to load config file", "config file", cfgFile, "error", err) - } - - // init db connection - var ormFactory database.OrmFactory - if ormFactory, err = database.NewOrmFactory(cfg.DBConfig); err != nil { - log.Crit("failed to init db connection", "err", err) - } - - // init l2geth connection - client, err := ethclient.Dial(cfg.L2Config.Endpoint) - if err != nil { - log.Crit("failed to init l2geth connection", "err", err) - } - - // Initialize all coordinator modules. - rollerManager, err := coordinator.New(ctx.Context, cfg.RollerManagerConfig, ormFactory, client) - if err != nil { - return err - } - defer func() { - rollerManager.Stop() - err = ormFactory.Close() - if err != nil { - log.Error("can not close ormFactory", err) - } - }() - - // Start all modules. - if err = rollerManager.Start(); err != nil { - log.Crit("couldn't start coordinator", "error", err) - } - - apis := rollerManager.APIs() - // Register api and start rpc service. - if ctx.Bool(httpEnabledFlag.Name) { - handler, addr, err := utils.StartHTTPEndpoint( - fmt.Sprintf( - "%s:%d", - ctx.String(httpListenAddrFlag.Name), - ctx.Int(httpPortFlag.Name)), - apis) - if err != nil { - log.Crit("Could not start HTTP api", "error", err) - } - defer func() { - _ = handler.Shutdown(ctx.Context) - log.Info("HTTP endpoint closed", "url", fmt.Sprintf("http://%v/", addr)) - }() - log.Info("HTTP endpoint opened", "url", fmt.Sprintf("http://%v/", addr)) - } - if ctx.Bool(wsEnabledFlag.Name) { - handler, addr, err := utils.StartWSEndpoint( - fmt.Sprintf( - "%s:%d", - ctx.String(wsListenAddrFlag.Name), - ctx.Int(wsPortFlag.Name)), - apis) - if err != nil { - log.Crit("Could not start WS api", "error", err) - } - defer func() { - _ = handler.Shutdown(ctx.Context) - log.Info("WS endpoint closed", "url", fmt.Sprintf("ws://%v/", addr)) - }() - log.Info("WS endpoint opened", "url", fmt.Sprintf("ws://%v/", addr)) - } - - // Catch CTRL-C to ensure a graceful shutdown. - interrupt := make(chan os.Signal, 1) - signal.Notify(interrupt, os.Interrupt) - - // Wait until the interrupt signal is received from an OS signal. - <-interrupt - - return nil + app.Run() } diff --git a/coordinator/go.mod b/coordinator/go.mod index 77390107f..16782abc7 100644 --- a/coordinator/go.mod +++ b/coordinator/go.mod @@ -5,7 +5,7 @@ go 1.18 require ( github.com/orcaman/concurrent-map v1.0.0 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/scroll-tech/go-ethereum v1.10.14-0.20221213034543-78c1f57fcfea + github.com/scroll-tech/go-ethereum v1.10.14-0.20221221073256-5ca70bf3a257 github.com/stretchr/testify v1.8.0 github.com/urfave/cli/v2 v2.10.2 golang.org/x/sync v0.1.0 diff --git a/coordinator/go.sum b/coordinator/go.sum index 5565e6118..4e959ea63 100644 --- a/coordinator/go.sum +++ b/coordinator/go.sum @@ -349,8 +349,8 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 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/scroll-tech/go-ethereum v1.10.14-0.20221213034543-78c1f57fcfea h1:KYlmCH4cDMGxQzaYoSK8+DF53POGpAmnzusAtBWzEjA= -github.com/scroll-tech/go-ethereum v1.10.14-0.20221213034543-78c1f57fcfea/go.mod h1:jurIpDQ0hqtp9//xxeWzr8X9KMP/+TYn+vz3K1wZrv0= +github.com/scroll-tech/go-ethereum v1.10.14-0.20221221073256-5ca70bf3a257 h1:FjBC0Ww42WRoiB5EQFxoIEcJqoEUw2twdhN9nGkVCQA= +github.com/scroll-tech/go-ethereum v1.10.14-0.20221221073256-5ca70bf3a257/go.mod h1:jurIpDQ0hqtp9//xxeWzr8X9KMP/+TYn+vz3K1wZrv0= github.com/scroll-tech/zktrie v0.3.0/go.mod h1:CuJFlG1/soTJJBAySxCZgTF7oPvd5qF6utHOEciC43Q= github.com/scroll-tech/zktrie v0.3.1 h1:HlR+fMBdjXX1/7cUMqpUgGEhGy/3vN1JpwQ0ovg/Ys8= github.com/scroll-tech/zktrie v0.3.1/go.mod h1:CuJFlG1/soTJJBAySxCZgTF7oPvd5qF6utHOEciC43Q= diff --git a/coordinator/verifier/mock.go b/coordinator/verifier/mock.go new file mode 100644 index 000000000..7696ab2cf --- /dev/null +++ b/coordinator/verifier/mock.go @@ -0,0 +1,23 @@ +//go:build mock_verifier + +package verifier + +import ( + "scroll-tech/common/message" + + "scroll-tech/coordinator/config" +) + +// Verifier represents a mock halo2 verifier. +type Verifier struct { +} + +// NewVerifier Sets up a mock verifier. +func NewVerifier(_ *config.VerifierConfig) (*Verifier, error) { + return &Verifier{}, nil +} + +// VerifyProof always return true +func (v *Verifier) VerifyProof(proof *message.AggProof) (bool, error) { + return true, nil +} diff --git a/coordinator/verifier/verifier.go b/coordinator/verifier/verifier.go index 90b150595..7098ab808 100644 --- a/coordinator/verifier/verifier.go +++ b/coordinator/verifier/verifier.go @@ -1,3 +1,5 @@ +//go:build !mock_verifier + package verifier /* diff --git a/database/cmd/app/app.go b/database/cmd/app/app.go new file mode 100644 index 000000000..e742b5fb8 --- /dev/null +++ b/database/cmd/app/app.go @@ -0,0 +1,80 @@ +package app + +import ( + "fmt" + "os" + + "github.com/urfave/cli/v2" + + "scroll-tech/common/utils" + "scroll-tech/common/version" +) + +var ( + // Set up database app info. + app *cli.App +) + +func init() { + app = cli.NewApp() + // Set up database app info. + app.Name = "db_cli" + app.Usage = "The Scroll Database CLI" + app.Version = version.Version + app.Flags = append(app.Flags, utils.CommonFlags...) + + app.Before = func(ctx *cli.Context) error { + return utils.LogSetup(ctx) + } + + app.Commands = []*cli.Command{ + { + Name: "reset", + Usage: "Clean and reset database.", + Action: resetDB, + Flags: []cli.Flag{&utils.ConfigFileFlag}, + }, + { + Name: "status", + Usage: "Check migration status.", + Action: checkDBStatus, + Flags: []cli.Flag{&utils.ConfigFileFlag}, + }, + { + Name: "version", + Usage: "Display the current database version.", + Action: dbVersion, + Flags: []cli.Flag{&utils.ConfigFileFlag}, + }, + { + Name: "migrate", + Usage: "Migrate the database to the latest version.", + Action: migrateDB, + Flags: []cli.Flag{&utils.ConfigFileFlag}, + }, + { + Name: "rollback", + Usage: "Roll back the database to a previous . Rolls back a single migration if no version specified.", + Action: rollbackDB, + Flags: []cli.Flag{ + &utils.ConfigFileFlag, + &cli.IntFlag{ + Name: "version", + Usage: "Rollback to the specified version.", + Value: 0, + }}, + }, + } + + // Register `db_cli-test` app for integration-test. + utils.RegisterSimulation(app, "db_cli-test") +} + +// Run run database cmd instance. +func Run() { + // RunApp the db_cli. + if err := app.Run(os.Args); err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} diff --git a/database/cmd/app/app_test.go b/database/cmd/app/app_test.go new file mode 100644 index 000000000..14e70498d --- /dev/null +++ b/database/cmd/app/app_test.go @@ -0,0 +1,19 @@ +package app + +import ( + "fmt" + "testing" + "time" + + "scroll-tech/common/cmd" + "scroll-tech/common/version" +) + +func TestRunDatabase(t *testing.T) { + bridge := cmd.NewCmd(t, "db_cli-test", "--version") + defer bridge.WaitExit() + + // wait result + bridge.ExpectWithTimeout(true, time.Second*3, fmt.Sprintf("db_cli version %s", version.Version)) + bridge.RunApp(false) +} diff --git a/database/cmd/client.go b/database/cmd/app/client.go similarity index 69% rename from database/cmd/client.go rename to database/cmd/app/client.go index 459a8f256..bcd0c9246 100644 --- a/database/cmd/client.go +++ b/database/cmd/app/client.go @@ -1,4 +1,4 @@ -package main +package app import ( "github.com/jmoiron/sqlx" @@ -11,11 +11,16 @@ import ( "scroll-tech/database/migrate" ) -func initDB(file string) (*sqlx.DB, error) { +func getConfig(ctx *cli.Context) (*database.DBConfig, error) { + file := ctx.String(utils.ConfigFileFlag.Name) dbCfg, err := database.NewConfig(file) if err != nil { return nil, err } + return dbCfg, nil +} + +func initDB(dbCfg *database.DBConfig) (*sqlx.DB, error) { factory, err := database.NewOrmFactory(dbCfg) if err != nil { return nil, err @@ -27,7 +32,11 @@ func initDB(file string) (*sqlx.DB, error) { // resetDB clean or reset database. func resetDB(ctx *cli.Context) error { - db, err := initDB(ctx.String(utils.ConfigFileFlag.Name)) + cfg, err := getConfig(ctx) + if err != nil { + return err + } + db, err := initDB(cfg) if err != nil { return err } @@ -44,7 +53,11 @@ func resetDB(ctx *cli.Context) error { // checkDBStatus check db status func checkDBStatus(ctx *cli.Context) error { - db, err := initDB(ctx.String(utils.ConfigFileFlag.Name)) + cfg, err := getConfig(ctx) + if err != nil { + return err + } + db, err := initDB(cfg) if err != nil { return err } @@ -54,7 +67,11 @@ func checkDBStatus(ctx *cli.Context) error { // dbVersion return the latest version func dbVersion(ctx *cli.Context) error { - db, err := initDB(ctx.String(utils.ConfigFileFlag.Name)) + cfg, err := getConfig(ctx) + if err != nil { + return err + } + db, err := initDB(cfg) if err != nil { return err } @@ -67,7 +84,11 @@ func dbVersion(ctx *cli.Context) error { // migrateDB migrate db func migrateDB(ctx *cli.Context) error { - db, err := initDB(ctx.String(utils.ConfigFileFlag.Name)) + cfg, err := getConfig(ctx) + if err != nil { + return err + } + db, err := initDB(cfg) if err != nil { return err } @@ -77,7 +98,11 @@ func migrateDB(ctx *cli.Context) error { // rollbackDB rollback db by version func rollbackDB(ctx *cli.Context) error { - db, err := initDB(ctx.String(utils.ConfigFileFlag.Name)) + cfg, err := getConfig(ctx) + if err != nil { + return err + } + db, err := initDB(cfg) if err != nil { return err } diff --git a/database/cmd/main.go b/database/cmd/main.go index fb473d87d..a76f79775 100644 --- a/database/cmd/main.go +++ b/database/cmd/main.go @@ -1,78 +1,9 @@ package main import ( - "fmt" - "os" - - "github.com/urfave/cli/v2" - - "scroll-tech/common/utils" - "scroll-tech/common/version" + "scroll-tech/database/cmd/app" ) func main() { - // Set up database app info. - app := cli.NewApp() - app.Name = "db_cli" - app.Usage = "The Scroll Database CLI" - app.Version = version.Version - app.Flags = append(app.Flags, utils.CommonFlags...) - - app.Before = func(ctx *cli.Context) error { - return utils.LogSetup(ctx) - } - - app.Commands = []*cli.Command{ - { - Name: "reset", - Usage: "Clean and reset database.", - Action: resetDB, - Flags: []cli.Flag{ - &utils.ConfigFileFlag, - }, - }, - { - Name: "status", - Usage: "Check migration status.", - Action: checkDBStatus, - Flags: []cli.Flag{ - &utils.ConfigFileFlag, - }, - }, - { - Name: "version", - Usage: "Display the current database version.", - Action: dbVersion, - Flags: []cli.Flag{ - &utils.ConfigFileFlag, - }, - }, - { - Name: "migrate", - Usage: "Migrate the database to the latest version.", - Action: migrateDB, - Flags: []cli.Flag{ - &utils.ConfigFileFlag, - }, - }, - { - Name: "rollback", - Usage: "Roll back the database to a previous . Rolls back a single migration if no version specified.", - Action: rollbackDB, - Flags: []cli.Flag{ - &utils.ConfigFileFlag, - &cli.IntFlag{ - Name: "version", - Usage: "Rollback to the specified version.", - Value: 0, - }, - }, - }, - } - - // Run the database. - if err := app.Run(os.Args); err != nil { - _, _ = fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } + app.Run() } diff --git a/database/go.mod b/database/go.mod index 27d1c4745..4f19b8dfa 100644 --- a/database/go.mod +++ b/database/go.mod @@ -7,7 +7,7 @@ require ( github.com/lib/pq v1.10.6 github.com/mattn/go-sqlite3 v1.14.14 github.com/pressly/goose/v3 v3.7.0 - github.com/scroll-tech/go-ethereum v1.10.14-0.20221213034543-78c1f57fcfea + github.com/scroll-tech/go-ethereum v1.10.14-0.20221221073256-5ca70bf3a257 github.com/stretchr/testify v1.8.0 github.com/urfave/cli/v2 v2.10.2 ) diff --git a/database/go.sum b/database/go.sum index 2c2d7e03c..9bcca2d9e 100644 --- a/database/go.sum +++ b/database/go.sum @@ -339,8 +339,8 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 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/scroll-tech/go-ethereum v1.10.14-0.20221213034543-78c1f57fcfea h1:KYlmCH4cDMGxQzaYoSK8+DF53POGpAmnzusAtBWzEjA= -github.com/scroll-tech/go-ethereum v1.10.14-0.20221213034543-78c1f57fcfea/go.mod h1:jurIpDQ0hqtp9//xxeWzr8X9KMP/+TYn+vz3K1wZrv0= +github.com/scroll-tech/go-ethereum v1.10.14-0.20221221073256-5ca70bf3a257 h1:FjBC0Ww42WRoiB5EQFxoIEcJqoEUw2twdhN9nGkVCQA= +github.com/scroll-tech/go-ethereum v1.10.14-0.20221221073256-5ca70bf3a257/go.mod h1:jurIpDQ0hqtp9//xxeWzr8X9KMP/+TYn+vz3K1wZrv0= github.com/scroll-tech/zktrie v0.3.0/go.mod h1:CuJFlG1/soTJJBAySxCZgTF7oPvd5qF6utHOEciC43Q= github.com/scroll-tech/zktrie v0.3.1 h1:HlR+fMBdjXX1/7cUMqpUgGEhGy/3vN1JpwQ0ovg/Ys8= github.com/scroll-tech/zktrie v0.3.1/go.mod h1:CuJFlG1/soTJJBAySxCZgTF7oPvd5qF6utHOEciC43Q= diff --git a/database/migrate/migrate_test.go b/database/migrate/migrate_test.go index 33ddca205..c3b665198 100644 --- a/database/migrate/migrate_test.go +++ b/database/migrate/migrate_test.go @@ -5,7 +5,6 @@ import ( "github.com/jmoiron/sqlx" _ "github.com/lib/pq" - "github.com/pressly/goose/v3" "github.com/stretchr/testify/assert" "scroll-tech/common/docker" @@ -34,30 +33,57 @@ func initEnv(t *testing.T) error { return nil } -func TestMigration(t *testing.T) { - defer func() { - if dbImg != nil { - assert.NoError(t, dbImg.Stop()) - } - }() +func TestMigrate(t *testing.T) { if err := initEnv(t); err != nil { t.Fatal(err) } - err := Migrate(pgDB.DB) - assert.NoError(t, err) + t.Run("testCurrent", testCurrent) + t.Run("testStatus", testStatus) + t.Run("testResetDB", testResetDB) + t.Run("testMigrate", testMigrate) + t.Run("testRollback", testRollback) - db := pgDB.DB - version0, err := goose.GetDBVersion(db) - assert.NoError(t, err) - t.Log("current version is ", version0) - - // rollback one version - assert.NoError(t, Rollback(db, nil)) - - version1, err := Current(db) - assert.NoError(t, err) - - // check version expect less than 1 - assert.Equal(t, version0-1, version1) + t.Cleanup(func() { + if dbImg != nil { + assert.NoError(t, dbImg.Stop()) + } + }) +} + +func testCurrent(t *testing.T) { + cur, err := Current(pgDB.DB) + assert.NoError(t, err) + assert.Equal(t, 0, int(cur)) +} + +func testStatus(t *testing.T) { + status := Status(pgDB.DB) + assert.NoError(t, status) +} + +func testResetDB(t *testing.T) { + assert.NoError(t, ResetDB(pgDB.DB)) + cur, err := Current(pgDB.DB) + assert.NoError(t, err) + assert.Equal(t, 5, int(cur)) +} + +func testMigrate(t *testing.T) { + assert.NoError(t, Migrate(pgDB.DB)) + cur, err := Current(pgDB.DB) + assert.NoError(t, err) + assert.Equal(t, true, cur > 0) +} + +func testRollback(t *testing.T) { + version, err := Current(pgDB.DB) + assert.NoError(t, err) + assert.Equal(t, true, version > 0) + + assert.NoError(t, Rollback(pgDB.DB, nil)) + + cur, err := Current(pgDB.DB) + assert.NoError(t, err) + assert.Equal(t, true, cur+1 == version) } diff --git a/go.work b/go.work index 336ddc262..a2bb55ae6 100644 --- a/go.work +++ b/go.work @@ -6,4 +6,5 @@ use ( ./coordinator ./database ./roller + ./tests/integration-test ) diff --git a/go.work.sum b/go.work.sum index e5778eed0..1b86f7907 100644 --- a/go.work.sum +++ b/go.work.sum @@ -79,7 +79,6 @@ github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c h1:/ovYnF02fwL0kvspmy9AuyKg1JhdTRUgPw4nUxd9oZM= github.com/dave/jennifer v1.2.0 h1:S15ZkFMRoJ36mGAQgWL1tnr0NQJh9rZ8qatseX/VbBc= github.com/dchest/blake512 v1.0.0 h1:oDFEQFIqFSeuA34xLtXZ/rWxCXdSjirjzPhey5EUvmA= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= @@ -183,19 +182,113 @@ github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5 h1:PJr+ZMXIecYc github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef h1:2jNeR4YUziVtswNP9sEFAI913cVrzH85T+8Q6LpYbT0= github.com/karalabe/usb v0.0.2 h1:M6QQBNxF+CQ8OFvxrT90BA0qBOXymndZnk5q235mFc4= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= +github.com/klauspost/compress v1.4.0 h1:8nsMz3tWa9SWWPL60G1V6CUsf4lLjWLTNEtibhe8gh8= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= +github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6 h1:KAZ1BW2TCmT6PRihDPpocIy1QTtsAsrx6TneU/4+CMg= +github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada h1:3L+neHp83cTjegPdCiOxVOJtRIy7/8RldvMTsyPYH10= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/labstack/echo/v4 v4.2.1 h1:LF5Iq7t/jrtUuSutNuiEWtB5eiHfZ5gSe2pcu5exjQw= +github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= +github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd h1:HvFwW+cm9bCbZ/+vuGNq7CRWXql8c0y8nGeYpqmpvmk= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d h1:oNAwILwmgWKFpuU+dXvI6dl9jG2mAWAZLX3r9s0PPiw= +github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104 h1:d8RFOZ2IiFtFWBcKEHAFYJcPTf0wY5q0exFNJZVWa1U= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae h1:VeRdUYdCw49yizlSbMEn2SZ+gT+3IUKx8BqxyQdz+BY= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223 h1:F9x/1yl3T2AeKLr2AMdilSD8+f9bvMnNN8VS5iDtovc= +github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= +github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 h1:shk/vn9oCoOTmwcouEdwIeOtOGA/ELRUw/GwvxwfT+0= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= +github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= +github.com/ory/dockertest/v3 v3.9.1 h1:v4dkG+dlu76goxMiTT2j8zV7s4oPPEppKT8K8p2f1kY= +github.com/paulbellamy/ratecounter v0.2.0 h1:2L/RhJq+HA8gBQImDXtLPrDXK5qAj6ozWVK/zFXVJGs= +github.com/paulmach/orb v0.7.1 h1:Zha++Z5OX/l168sqHK3k4z18LDvr+YAO/VjK0ReQ9rU= +github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ= +github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= +github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5 h1:tFwafIEMf0B7NlcxV/zJ6leBIa81D3hgGSgsE5hCkOQ= +github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= +github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo= +github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs= +github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52 h1:RnWNS9Hlm8BIkjr6wx8li5abe0fr73jljLycdfemTp0= +github.com/scroll-tech/go-ethereum v1.10.14-0.20221202061207-804e7edc23ba/go.mod h1:jurIpDQ0hqtp9//xxeWzr8X9KMP/+TYn+vz3K1wZrv0= +github.com/scroll-tech/go-ethereum v1.10.14-0.20221213034543-78c1f57fcfea/go.mod h1:jurIpDQ0hqtp9//xxeWzr8X9KMP/+TYn+vz3K1wZrv0= +github.com/segmentio/kafka-go v0.2.0 h1:HtCSf6B4gN/87yc5qTl7WsxPKQIIGXLPPM1bMCPOsoY= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/supranational/blst v0.3.8-0.20220526154634-513d2456b344 h1:m+8fKfQwCAy1QjzINvKe/pYtLjo2dl59x2w9YSEJxuY= +github.com/supranational/blst v0.3.8-0.20220526154634-513d2456b344/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/tinylib/msgp v1.0.2 h1:DfdQrzQa7Yh2es9SuLkixqxuXS2SxsdYn0KbdrOGWD8= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= +github.com/willf/bitset v1.1.3 h1:ekJIKh6+YbUIVt9DfNbkR5d6aFcFTLDRyJNAACURBg8= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6 h1:YdYsPAZ2pC6Tow/nPZOPQ96O3hm/ToAkGsPLzedXERk= +github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= +go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs= +go.opentelemetry.io/otel v1.9.0 h1:8WZNQFIB2a71LnANS9JeyidJKKGOOremcUtb/OtHISw= +go.opentelemetry.io/otel/trace v1.9.0 h1:oZaCNJUjWcg60VXWee8lJKlqhPbXAPB51URuR47pQYc= +go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4= +go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= +go.uber.org/zap v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20191227195350-da58074b4299 h1:zQpM52jfKHG6II1ISZY1ZcpygvuSFZpLwfluuF89XOg= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 h1:rxKZ2gOnYxjfmakvUUqh9Gyb6KXfrj7JWTxORTYqb0E= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= +golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.6.0 h1:DJy6UzXbahnGUf1ujUNkh/NEtK14qMo2nvlBPs4U5yw= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b h1:Qh4dB5D/WpoUUp3lSod7qgoyEHbDGPUWjIbnqdqqe1k= +google.golang.org/api v0.15.0 h1:yzlyyDW/J0w8yNFJIhiAJy4kq74S+1DOLdawELNxFMA= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= +google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f h1:2wh8dWY8959cBGQvk1RD+/eQBgRYYDaZ+hT0/zsARoA= +google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6 h1:a6cXbcDDUkSBlpnkWV1bJ+vv3mOgQEltEJ2rPxroVu0= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +honnef.co/go/tools v0.1.3 h1:qTakTkI6ni6LFD5sBwwsdSO+AQqbSIxOauHTTQKZ/7o= +rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= +rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= diff --git a/roller/cmd/app/app.go b/roller/cmd/app/app.go new file mode 100644 index 000000000..b580f395e --- /dev/null +++ b/roller/cmd/app/app.go @@ -0,0 +1,71 @@ +package app + +import ( + "fmt" + "os" + "os/signal" + + "github.com/scroll-tech/go-ethereum/log" + "github.com/urfave/cli/v2" + + "scroll-tech/roller" + + "scroll-tech/common/utils" + "scroll-tech/common/version" + + "scroll-tech/roller/config" +) + +var app *cli.App + +func init() { + app = cli.NewApp() + app.Action = action + app.Name = "roller" + app.Usage = "The Scroll L2 Roller" + app.Version = version.Version + app.Flags = append(app.Flags, utils.CommonFlags...) + app.Before = func(ctx *cli.Context) error { + return utils.LogSetup(ctx) + } + + // Register `roller-test` app for integration-test. + utils.RegisterSimulation(app, "roller-test") +} + +func action(ctx *cli.Context) error { + // Load config file. + cfgFile := ctx.String(utils.ConfigFileFlag.Name) + cfg, err := config.NewConfig(cfgFile) + if err != nil { + log.Crit("failed to load config file", "config file", cfgFile, "error", err) + } + + // Create roller + r, err := roller.NewRoller(cfg) + if err != nil { + return err + } + // Start roller. + r.Start() + + defer r.Stop() + log.Info("roller start successfully", "name", cfg.RollerName, "publickey", r.PublicKey(), "version", version.Version) + + // Catch CTRL-C to ensure a graceful shutdown. + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt) + + // Wait until the interrupt signal is received from an OS signal. + <-interrupt + + return nil +} + +// Run the roller cmd func. +func Run() { + if err := app.Run(os.Args); err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} diff --git a/roller/cmd/app/app_test.go b/roller/cmd/app/app_test.go new file mode 100644 index 000000000..2da3f1d2e --- /dev/null +++ b/roller/cmd/app/app_test.go @@ -0,0 +1,19 @@ +package app + +import ( + "fmt" + "testing" + "time" + + "scroll-tech/common/cmd" + "scroll-tech/common/version" +) + +func TestRunRoller(t *testing.T) { + roller := cmd.NewCmd(t, "roller-test", "--version") + defer roller.WaitExit() + + // wait result + roller.ExpectWithTimeout(true, time.Second*3, fmt.Sprintf("roller version %s", version.Version)) + roller.RunApp(false) +} diff --git a/roller/cmd/main.go b/roller/cmd/main.go index 169aeac8a..319e3bba0 100644 --- a/roller/cmd/main.go +++ b/roller/cmd/main.go @@ -1,53 +1,7 @@ package main -import ( - "fmt" - "os" - - "github.com/scroll-tech/go-ethereum/log" - "github.com/urfave/cli/v2" - - "scroll-tech/common/utils" - "scroll-tech/common/version" - - "scroll-tech/roller" - "scroll-tech/roller/config" -) +import "scroll-tech/roller/cmd/app" func main() { - app := cli.NewApp() - - app.Action = action - app.Name = "Roller" - app.Usage = "The Scroll L2 Roller" - app.Version = version.Version - app.Flags = append(app.Flags, utils.CommonFlags...) - - app.Before = func(ctx *cli.Context) error { - return utils.LogSetup(ctx) - } - - if err := app.Run(os.Args); err != nil { - _, _ = fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} - -func action(ctx *cli.Context) error { - // Load config file. - cfgFile := ctx.String(utils.ConfigFileFlag.Name) - cfg, err := config.NewConfig(cfgFile) - if err != nil { - log.Crit("failed to load config file", "config file", cfgFile, "error", err) - } - - // Create roller - r, err := roller.NewRoller(cfg) - if err != nil { - return err - } - defer r.Close() - log.Info("roller start successfully", "name", cfg.RollerName, "publickey", r.PublicKey(), "version", version.Version) - - return r.Run() + app.Run() } diff --git a/roller/go.mod b/roller/go.mod index c613ae3e2..25babcd41 100644 --- a/roller/go.mod +++ b/roller/go.mod @@ -3,7 +3,7 @@ module scroll-tech/roller go 1.18 require ( - github.com/scroll-tech/go-ethereum v1.10.14-0.20221213034543-78c1f57fcfea + github.com/scroll-tech/go-ethereum v1.10.14-0.20221221073256-5ca70bf3a257 github.com/stretchr/testify v1.8.0 github.com/urfave/cli/v2 v2.10.2 go.etcd.io/bbolt v1.3.6 diff --git a/roller/go.sum b/roller/go.sum index 96ea81db4..8ad4b1468 100644 --- a/roller/go.sum +++ b/roller/go.sum @@ -323,8 +323,8 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 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/scroll-tech/go-ethereum v1.10.14-0.20221213034543-78c1f57fcfea h1:KYlmCH4cDMGxQzaYoSK8+DF53POGpAmnzusAtBWzEjA= -github.com/scroll-tech/go-ethereum v1.10.14-0.20221213034543-78c1f57fcfea/go.mod h1:jurIpDQ0hqtp9//xxeWzr8X9KMP/+TYn+vz3K1wZrv0= +github.com/scroll-tech/go-ethereum v1.10.14-0.20221221073256-5ca70bf3a257 h1:FjBC0Ww42WRoiB5EQFxoIEcJqoEUw2twdhN9nGkVCQA= +github.com/scroll-tech/go-ethereum v1.10.14-0.20221221073256-5ca70bf3a257/go.mod h1:jurIpDQ0hqtp9//xxeWzr8X9KMP/+TYn+vz3K1wZrv0= github.com/scroll-tech/zktrie v0.3.0/go.mod h1:CuJFlG1/soTJJBAySxCZgTF7oPvd5qF6utHOEciC43Q= github.com/scroll-tech/zktrie v0.3.1 h1:HlR+fMBdjXX1/7cUMqpUgGEhGy/3vN1JpwQ0ovg/Ys8= github.com/scroll-tech/zktrie v0.3.1/go.mod h1:CuJFlG1/soTJJBAySxCZgTF7oPvd5qF6utHOEciC43Q= diff --git a/roller/mock/mock_test.go b/roller/mock/mock_test.go deleted file mode 100644 index 9042e1c3c..000000000 --- a/roller/mock/mock_test.go +++ /dev/null @@ -1,89 +0,0 @@ -package mock - -//var ( -// cfg *config.Config -// scrollPort = 9020 -// mockPath string -//) - -// func TestMain(m *testing.M) { -// mockPath = "/tmp/roller_mock_test" -// _ = os.RemoveAll(mockPath) -// if err := os.Mkdir(mockPath, os.ModePerm); err != nil { -// fmt.Fprintln(os.Stderr, err) -// os.Exit(1) -// } -// scrollPort = rand.Intn(9000) -// cfg = &config.Config{ -// RollerName: "test-roller", -// SecretKey: "dcf2cbdd171a21c480aa7f53d77f31bb102282b3ff099c78e3118b37348c72f7", -// ScrollURL: fmt.Sprintf("ws://localhost:%d", scrollPort), -// Prover: &config.ProverConfig{MockMode: true}, -// DBPath: filepath.Join(mockPath, "stack_db"), -// } - -// os.Exit(m.Run()) -// } -// func TestRoller(t *testing.T) { -// go mockScroll(t) - -// r, err := roller.NewRoller(cfg) -// assert.NoError(t, err) -// go r.Run() - -// <-time.NewTimer(2 * time.Second).C -// r.Close() -// } - -// func mockScroll(t *testing.T) { -// http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { -// up := websocket.Upgrader{} -// c, err := up.Upgrade(w, req, nil) -// assert.NoError(t, err) - -// var payload []byte -// payload, err = func(c *websocket.Conn) ([]byte, error) { -// for { -// var mt int -// mt, payload, err = c.ReadMessage() -// if err != nil { -// return nil, err -// } - -// if mt == websocket.BinaryMessage { -// return payload, nil -// } -// } -// }(c) -// assert.NoError(t, err) - -// msg := &Msg{} -// err = json.Unmarshal(payload, msg) -// assert.NoError(t, err) - -// authMsg := &AuthMessage{} -// err = json.Unmarshal(msg.Payload, authMsg) -// assert.NoError(t, err) - -// // Verify signature -// hash, err := authMsg.Identity.Hash() -// assert.NoError(t, err) - -// if !secp256k1.VerifySignature(common.FromHex(authMsg.Identity.PublicKey), hash, common.FromHex(authMsg.Signature)[:64]) { -// assert.NoError(t, err) -// } -// t.Log("signature verification successful. Roller: ", authMsg.Identity.Name) -// assert.Equal(t, cfg.RollerName, authMsg.Identity.Name) - -// traces := &BlockTraces{ -// ID: 16, -// Traces: nil, -// } -// msgByt, err := roller.MakeMsgByt(BlockTrace, traces) -// assert.NoError(t, err) - -// err = c.WriteMessage(websocket.BinaryMessage, msgByt) -// assert.NoError(t, err) -// }) -// http.ListenAndServe(fmt.Sprintf(":%d", scrollPort), nil) -// } diff --git a/roller/prover/mock.go b/roller/prover/mock.go index 9ec95fe19..1c43d169a 100644 --- a/roller/prover/mock.go +++ b/roller/prover/mock.go @@ -1,6 +1,5 @@ //go:build mock_prover -//nolint:typecheck package prover import ( @@ -23,5 +22,9 @@ func NewProver(cfg *config.ProverConfig) (*Prover, error) { // Prove call rust ffi to generate proof, if first failed, try again. func (p *Prover) Prove(_ []*types.BlockTrace) (*message.AggProof, error) { - return &message.AggProof{}, nil + return &message.AggProof{ + Proof: []byte{}, + Instance: []byte{}, + FinalPair: []byte{}, + }, nil } diff --git a/roller/prover/prover_test.go b/roller/prover/prover_test.go index 5f1f820be..be2980048 100644 --- a/roller/prover/prover_test.go +++ b/roller/prover/prover_test.go @@ -42,9 +42,13 @@ func TestFFI(t *testing.T) { traces := make([]*types.BlockTrace, 0) for _, file := range files { - f, err := os.Open(filepath.Join(tracesPath, file.Name())) + var ( + f *os.File + byt []byte + ) + f, err = os.Open(filepath.Join(tracesPath, file.Name())) as.NoError(err) - byt, err := io.ReadAll(f) + byt, err = io.ReadAll(f) as.NoError(err) rpcTrace := &RPCTrace{} as.NoError(json.Unmarshal(byt, rpcTrace)) diff --git a/roller/roller.go b/roller/roller.go index e9de3c1aa..9cbac6a01 100644 --- a/roller/roller.go +++ b/roller/roller.go @@ -87,23 +87,21 @@ func NewRoller(cfg *config.Config) (*Roller, error) { }, nil } +// PublicKey translate public key to hex and return. func (r *Roller) PublicKey() string { return common.Bytes2Hex(crypto.CompressPubkey(&r.priv.PublicKey)) } -// Run runs Roller. -func (r *Roller) Run() error { +// Start runs Roller. +func (r *Roller) Start() { log.Info("start to register to coordinator") if err := r.Register(); err != nil { log.Crit("register to coordinator failed", "error", err) } log.Info("register to coordinator successfully!") - go func() { - r.HandleCoordinator() - r.Close() - }() - return r.ProveLoop() + go r.HandleCoordinator() + go r.ProveLoop() } // Register registers Roller to the coordinator through Websocket. @@ -174,20 +172,20 @@ func (r *Roller) mustRetryCoordinator() { } // ProveLoop keep popping the block-traces from Stack and sends it to rust-prover for loop. -func (r *Roller) ProveLoop() (err error) { +func (r *Roller) ProveLoop() { for { select { case <-r.stopChan: - return nil + return default: - if err = r.prove(); err != nil { + if err := r.prove(); err != nil { if errors.Is(err, store.ErrEmpty) { log.Debug("get empty trace", "error", err) time.Sleep(time.Second * 3) continue } if strings.Contains(err.Error(), errNormalClose.Error()) { - return nil + return } log.Error("prove failed", "error", err) } @@ -243,8 +241,8 @@ func (r *Roller) signAndSubmitProof(msg *message.ProofDetail) (bool, error) { return r.client.SubmitProof(context.Background(), authZkProof) } -// Close closes the websocket connection. -func (r *Roller) Close() { +// Stop closes the websocket connection. +func (r *Roller) Stop() { if atomic.LoadInt64(&r.isClosed) == 1 { return } diff --git a/integration-test/.gitkeep b/tests/integration-test/.gitkeep similarity index 100% rename from integration-test/.gitkeep rename to tests/integration-test/.gitkeep diff --git a/tests/integration-test/common.go b/tests/integration-test/common.go new file mode 100644 index 000000000..1b815eaf6 --- /dev/null +++ b/tests/integration-test/common.go @@ -0,0 +1,216 @@ +package integration + +import ( + "context" + "crypto/ecdsa" + "crypto/rand" + "encoding/json" + "fmt" + "math/big" + "os" + "strconv" + "testing" + "time" + + "github.com/scroll-tech/go-ethereum/crypto" + "github.com/stretchr/testify/assert" + + "scroll-tech/database" + _ "scroll-tech/database/cmd/app" + + _ "scroll-tech/roller/cmd/app" + rollerConfig "scroll-tech/roller/config" + + _ "scroll-tech/bridge/cmd/app" + bridgeConfig "scroll-tech/bridge/config" + "scroll-tech/bridge/sender" + + "scroll-tech/common/cmd" + "scroll-tech/common/docker" + + _ "scroll-tech/coordinator/cmd/app" + coordinatorConfig "scroll-tech/coordinator/config" +) + +var ( + l1gethImg docker.ImgInstance + l2gethImg docker.ImgInstance + dbImg docker.ImgInstance + + timestamp int + wsPort int64 + + bridgeFile string + dbFile string + coordinatorFile string + + bboltDB string + rollerFile string +) + +func setupEnv(t *testing.T) { + // Start l1geth l2geth and postgres. + l1gethImg = docker.NewTestL1Docker(t) + l2gethImg = docker.NewTestL2Docker(t) + dbImg = docker.NewTestDBDocker(t, "postgres") + + // Create a random ws port. + port, _ := rand.Int(rand.Reader, big.NewInt(2000)) + wsPort = port.Int64() + 22000 + timestamp = time.Now().Nanosecond() + + // Load reset and store config into a random file. + bridgeFile = mockBridgeConfig(t) + dbFile = mockDatabaseConfig(t) + coordinatorFile = mockCoordinatorConfig(t) + rollerFile = mockRollerConfig(t) +} + +func free(t *testing.T) { + assert.NoError(t, l1gethImg.Stop()) + assert.NoError(t, l2gethImg.Stop()) + assert.NoError(t, dbImg.Stop()) + + // Delete temporary files. + assert.NoError(t, os.Remove(bridgeFile)) + assert.NoError(t, os.Remove(dbFile)) + assert.NoError(t, os.Remove(coordinatorFile)) + assert.NoError(t, os.Remove(rollerFile)) + assert.NoError(t, os.Remove(bboltDB)) +} + +type appAPI interface { + RunApp(parallel bool) + WaitExit() + ExpectWithTimeout(parallel bool, timeout time.Duration, keyword string) +} + +func runBridgeApp(t *testing.T, args ...string) appAPI { + args = append(args, "--log.debug", "--config", bridgeFile) + return cmd.NewCmd(t, "bridge-test", args...) +} + +func runCoordinatorApp(t *testing.T, args ...string) appAPI { + args = append(args, "--log.debug", "--config", coordinatorFile, "--ws", "--ws.port", strconv.Itoa(int(wsPort))) + // start process + return cmd.NewCmd(t, "coordinator-test", args...) +} + +func runDBCliApp(t *testing.T, option, keyword string) { + args := []string{option, "--config", dbFile} + app := cmd.NewCmd(t, "db_cli-test", args...) + defer app.WaitExit() + + // Wait expect result. + app.ExpectWithTimeout(true, time.Second*3, keyword) + app.RunApp(false) +} + +func runRollerApp(t *testing.T, args ...string) appAPI { + args = append(args, "--log.debug", "--config", rollerFile) + return cmd.NewCmd(t, "roller-test", args...) +} + +func runSender(t *testing.T, endpoint string) *sender.Sender { + priv, err := crypto.HexToECDSA("1212121212121212121212121212121212121212121212121212121212121212") + assert.NoError(t, err) + newSender, err := sender.NewSender(context.Background(), &bridgeConfig.SenderConfig{ + Endpoint: endpoint, + CheckPendingTime: 3, + EscalateBlocks: 100, + Confirmations: 0, + EscalateMultipleNum: 11, + EscalateMultipleDen: 10, + TxType: "DynamicFeeTx", + }, []*ecdsa.PrivateKey{priv}) + assert.NoError(t, err) + return newSender +} + +func mockBridgeConfig(t *testing.T) string { + // Load origin bridge config file. + cfg, err := bridgeConfig.NewConfig("../../bridge/config.json") + assert.NoError(t, err) + + if l1gethImg != nil { + cfg.L1Config.Endpoint = l1gethImg.Endpoint() + cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = l1gethImg.Endpoint() + } + if l2gethImg != nil { + cfg.L2Config.Endpoint = l2gethImg.Endpoint() + cfg.L1Config.RelayerConfig.SenderConfig.Endpoint = l2gethImg.Endpoint() + } + if dbImg != nil { + cfg.DBConfig.DSN = dbImg.Endpoint() + } + + // Store changed bridge config into a temp file. + data, err := json.Marshal(cfg) + assert.NoError(t, err) + file := fmt.Sprintf("/tmp/%d_bridge-config.json", timestamp) + err = os.WriteFile(file, data, 0644) + assert.NoError(t, err) + + return file +} + +func mockCoordinatorConfig(t *testing.T) string { + cfg, err := coordinatorConfig.NewConfig("../../coordinator/config.json") + assert.NoError(t, err) + + cfg.RollerManagerConfig.Verifier.MockMode = true + if dbImg != nil { + cfg.DBConfig.DSN = dbImg.Endpoint() + } + + if l2gethImg != nil { + cfg.L2Config.Endpoint = l2gethImg.Endpoint() + } + + data, err := json.Marshal(cfg) + assert.NoError(t, err) + + file := fmt.Sprintf("/tmp/%d_coordinator-config.json", timestamp) + err = os.WriteFile(file, data, 0644) + assert.NoError(t, err) + + return file +} + +func mockDatabaseConfig(t *testing.T) string { + cfg, err := database.NewConfig("../../database/config.json") + assert.NoError(t, err) + if dbImg != nil { + cfg.DSN = dbImg.Endpoint() + } + data, err := json.Marshal(cfg) + assert.NoError(t, err) + + file := fmt.Sprintf("/tmp/%d_db-config.json", timestamp) + err = os.WriteFile(file, data, 0644) + assert.NoError(t, err) + + return file +} + +func mockRollerConfig(t *testing.T) string { + cfg, err := rollerConfig.NewConfig("../../roller/config.json") + assert.NoError(t, err) + cfg.CoordinatorURL = fmt.Sprintf("ws://localhost:%d", wsPort) + + // Reuse l1geth's keystore file + cfg.KeystorePath = "../../common/docker/l1geth/genesis-keystore" + cfg.KeystorePassword = "scrolltest" + + bboltDB = fmt.Sprintf("/tmp/%d_bbolt_db", timestamp) + cfg.DBPath = bboltDB + + data, err := json.Marshal(cfg) + assert.NoError(t, err) + + file := fmt.Sprintf("/tmp/%d_roller-config.json", timestamp) + err = os.WriteFile(file, data, 0644) + assert.NoError(t, err) + + return file +} diff --git a/tests/integration-test/go.mod b/tests/integration-test/go.mod new file mode 100644 index 000000000..33db147f4 --- /dev/null +++ b/tests/integration-test/go.mod @@ -0,0 +1,20 @@ +module scroll-tech/integration-test + +go 1.18 + +require ( + github.com/scroll-tech/go-ethereum v1.10.14-0.20221221073256-5ca70bf3a257 + github.com/stretchr/testify v1.8.0 +) + +require ( + github.com/btcsuite/btcd v0.20.1-beta // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/ethereum/go-ethereum v1.10.26 // indirect + github.com/kr/pretty v0.3.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rogpeppe/go-internal v1.8.1 // indirect + golang.org/x/crypto v0.4.0 // indirect + golang.org/x/sys v0.3.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/tests/integration-test/go.sum b/tests/integration-test/go.sum new file mode 100644 index 000000000..bd8eabc66 --- /dev/null +++ b/tests/integration-test/go.sum @@ -0,0 +1,598 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +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/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= +github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= +github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= +github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= +github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= +github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= +github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= +github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= +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/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +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.1.1/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/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= +github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= +github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= +github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dchest/blake512 v1.0.0/go.mod h1:FV1x7xPPLWukZlpDpWQ88rF/SFwZ5qbskrzhLMB92JI= +github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= +github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= +github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= +github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= +github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ethereum/go-ethereum v1.10.13/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= +github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= +github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +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/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= +github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= +github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +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.3.2/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.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +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.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= +github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/iden3/go-iden3-crypto v0.0.12/go.mod h1:swXIv0HFbJKobbQBtsB50G7IHr6PbTowutSew/iBEoo= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= +github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= +github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= +github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= +github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= +github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= +github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= +github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= +github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= +github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= +github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +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.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +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/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +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.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +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/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= +github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/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_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.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +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/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= +github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/scroll-tech/go-ethereum v1.10.14-0.20221221073256-5ca70bf3a257 h1:FjBC0Ww42WRoiB5EQFxoIEcJqoEUw2twdhN9nGkVCQA= +github.com/scroll-tech/zktrie v0.3.0/go.mod h1:CuJFlG1/soTJJBAySxCZgTF7oPvd5qF6utHOEciC43Q= +github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= +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/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= +github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= +github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= +github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= +github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= +github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +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-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= +golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +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-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/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-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +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-20190227155943-e225da77a7e6/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-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/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/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +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-20181107165924-66b7b1311ac8/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/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-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/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-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/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-20210816183151-1e6c022a8912/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-20220128215802-99c3d69c2c27/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.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/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/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +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= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= +gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +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= +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-20180628173108-788fd7840127/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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +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.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/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/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= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/tests/integration-test/integration_test.go b/tests/integration-test/integration_test.go new file mode 100644 index 000000000..7502abcd0 --- /dev/null +++ b/tests/integration-test/integration_test.go @@ -0,0 +1,48 @@ +package integration + +import ( + "testing" + "time" +) + +func TestIntegration(t *testing.T) { + setupEnv(t) + + // test db_cli migrate cmd. + t.Run("testDBClientMigrate", func(t *testing.T) { + runDBCliApp(t, "migrate", "current version:") + }) + + // test bridge service + t.Run("testStartProcess", testStartProcess) + + t.Cleanup(func() { + free(t) + }) +} + +func testStartProcess(t *testing.T) { + // migrate db. + runDBCliApp(t, "reset", "successful to reset") + runDBCliApp(t, "migrate", "current version:") + + // Start bridge process. + bridgeCmd := runBridgeApp(t) + bridgeCmd.RunApp(true) + bridgeCmd.ExpectWithTimeout(false, time.Second*10, "Start bridge successfully") + + // Start coordinator process. + coordinatorCmd := runCoordinatorApp(t, "--ws", "--ws.port", "8391") + coordinatorCmd.RunApp(true) + coordinatorCmd.ExpectWithTimeout(false, time.Second*10, "Start coordinator successfully") + + // Start roller process. + rollerCmd := runRollerApp(t) + rollerCmd.RunApp(true) + rollerCmd.ExpectWithTimeout(false, time.Second*20, "roller start successfully") + rollerCmd.ExpectWithTimeout(false, time.Second*10, "register to coordinator successfully!") + + rollerCmd.WaitExit() + bridgeCmd.WaitExit() + coordinatorCmd.WaitExit() +}