From 34a8182acb628dd19fea13e37fa87bece0c6ff66 Mon Sep 17 00:00:00 2001 From: artpav <19916123+artemijspavlovs@users.noreply.github.com> Date: Wed, 17 Jul 2024 12:57:01 +0300 Subject: [PATCH] refactor: add init flag support (#816) --- cmd/config/init/flags.go | 11 +- cmd/consts/consts.go | 2 +- cmd/rollapp/init/main.go | 268 +++++-------------------------- cmd/rollapp/init/mockbackends.go | 66 ++++++++ cmd/rollapp/init/utils.go | 259 +++++++++++++++++++++++++++++ cmd/utils/keys.go | 1 + go.mod | 12 +- go.sum | 48 ++++++ 8 files changed, 433 insertions(+), 234 deletions(-) create mode 100644 cmd/rollapp/init/mockbackends.go create mode 100644 cmd/rollapp/init/utils.go diff --git a/cmd/config/init/flags.go b/cmd/config/init/flags.go index 4f694e4a..d1f1f32c 100644 --- a/cmd/config/init/flags.go +++ b/cmd/config/init/flags.go @@ -41,7 +41,6 @@ func AddFlags(cmd *cobra.Command) error { func GetInitConfig( initCmd *cobra.Command, - args []string, ) (*config.RollappConfig, error) { var cfg config.RollappConfig rollerConfigFilePath := filepath.Join(utils.GetRollerRootDir(), config.RollerConfigFileName) @@ -59,9 +58,15 @@ func GetInitConfig( cfg.DA = config.DAType(strings.ToLower(string(cfg.DA))) hubID := initCmd.Flag(FlagNames.HubID).Value.String() - if hub, ok := consts.Hubs[hubID]; ok { - cfg.HubData = hub + + hub, ok := consts.Hubs[hubID] + + if !ok { + return nil, fmt.Errorf("failed to retrieve the hub with hub id: %s", hubID) } + + cfg.HubData = hub + // cfg.RollerVersion = version.TrimVersionStr(version.BuildVersion) // cfg.RollappID = raID // cfg.Denom = raBaseDenom diff --git a/cmd/consts/consts.go b/cmd/consts/consts.go index c8962729..769dae53 100644 --- a/cmd/consts/consts.go +++ b/cmd/consts/consts.go @@ -8,7 +8,7 @@ import ( const ( binsDir = "/usr/local/bin" - DefaultTokenSupply = "1000000000" + DefaultTokenSupply = "1000000000000000000000000000" ) var internalBinsDir = fmt.Sprintf("%s/roller_bins", binsDir) diff --git a/cmd/rollapp/init/main.go b/cmd/rollapp/init/main.go index cb79e2b6..29ca6ece 100644 --- a/cmd/rollapp/init/main.go +++ b/cmd/rollapp/init/main.go @@ -1,273 +1,83 @@ package initrollapp import ( - "bufio" "fmt" - "os" - "os/user" - "path/filepath" "strings" + "github.com/pterm/pterm" "github.com/spf13/cobra" initconfig "github.com/dymensionxyz/roller/cmd/config/init" - "github.com/dymensionxyz/roller/cmd/consts" - "github.com/dymensionxyz/roller/cmd/utils" - "github.com/dymensionxyz/roller/config" - datalayer "github.com/dymensionxyz/roller/data_layer" - global_utils "github.com/dymensionxyz/roller/utils" - "github.com/dymensionxyz/roller/utils/archives" ) var Cmd = &cobra.Command{ - Use: "init", + Use: "init [path-to-config-archive]", Short: "Inititlize RollApp locally", Long: ``, + Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { + pterm.DefaultHeader.WithFullWidth().Printfln("welcome to roller") err := initconfig.AddFlags(cmd) if err != nil { fmt.Println("failed to add flags") return } - reader := bufio.NewReader(os.Stdin) - fmt.Println("Do you already have rollapp config? (y/n)") - resp, err := reader.ReadString('\n') - if err != nil { - fmt.Println(err) - return - } - - resp = strings.TrimSpace(resp) - resp = strings.ToLower(resp) - - if resp == "n" || resp == "no" { - fmt.Println( - `To generate a RollApp configuration file go to -or run 'rollapp config' to expose the UI on localhost:11133. -after configuration files are generated, rerun the 'init' command`, - ) - return - } - - if resp == "y" || resp == "yes" { - fmt.Println( - "provide a path to the configuration archive file downloaded from ", - ) - fp, err := reader.ReadString('\n') + if len(args) != 0 { + archivePath, err := checkConfigArchive(args[0]) if err != nil { + fmt.Printf("failed to get archive: %v\n", err) return } - fp = strings.TrimSpace(fp) - if fp == "" { - fmt.Println("no path was provided") - return - } - - archivePath, err := expandHomePath(fp) + err = runInit(cmd, WithConfig(strings.TrimSpace(archivePath))) if err != nil { + fmt.Printf("failed to initialize the RollApp: %v\n", err) return } - if _, err := os.Stat(archivePath); os.IsNotExist(err) { - fmt.Printf("the file %s does not exist. \n", fp) - return - } + return + } - err = runInit(cmd, args, archivePath) + options := []string{"mock", "dymension"} + backend, _ := pterm.DefaultInteractiveSelect.WithOptions(options).Show() + isMockBackend := backend == "mock" + + if isMockBackend { + err := runInit(cmd) if err != nil { - fmt.Printf("failed to initialize the RollApp: %v\n", err) + fmt.Println("failed to run init: ", err) return } - return } - fmt.Println("invalid or no input") - }, -} + hasConfig, _ := pterm.DefaultInteractiveConfirm.WithDefaultText( + "do you have an existing configuration archive?", + ).Show() -func expandHomePath(path string) (string, error) { - if path[:2] == "~/" { - usr, err := user.Current() - if err != nil { - return "", err + if !hasConfig { + fmt.Println( + `To generate a RollApp configuration file go to +or run 'rollapp config' to expose the UI on localhost:11133. +after configuration files are generated, rerun the 'init' command`, + ) + return } - path = filepath.Join(usr.HomeDir, path[2:]) - } - return path, nil -} - -// in runInit I parse the entire genesis creator zip file twice to extract -// the file this looks awful but since the archive has only 2 files it's -// kinda fine -func runInit(cmd *cobra.Command, args []string, configArchivePath string) error { - home := utils.GetRollerRootDir() - outputHandler := initconfig.NewOutputHandler(false) - defer outputHandler.StopSpinner() + fp, _ := pterm.DefaultInteractiveTextInput.WithDefaultText("provide the configuration archive path"). + Show() - isRootExist, err := global_utils.DirNotEmpty(home) - if err != nil { - utils.PrettifyErrorIfExists(err) - return err - } - - if isRootExist { - outputHandler.StopSpinner() - shouldOverwrite, err := outputHandler.PromptOverwriteConfig(home) + archivePath, err := checkConfigArchive(fp) if err != nil { - utils.PrettifyErrorIfExists(err) - return err - } - if shouldOverwrite { - err = os.RemoveAll(home) - if err != nil { - utils.PrettifyErrorIfExists(err) - return err - } - } else { - os.Exit(0) + fmt.Printf("failed to get archive: %v\n", err) + return } - } - - // nolint:gofumpt - err = os.MkdirAll(home, 0755) - if err != nil { - utils.PrettifyErrorIfExists(err) - return err - } - - err = archives.ExtractFileFromNestedTar( - configArchivePath, - config.RollerConfigFileName, - home, - ) - if err != nil { - return err - } - - initConfigPtr, err := initconfig.GetInitConfig(cmd, args) - if err != nil { - utils.PrettifyErrorIfExists(err) - return err - } - - initConfig := *initConfigPtr - - utils.RunOnInterrupt(outputHandler.StopSpinner) - outputHandler.StartSpinner(consts.SpinnerMsgs.UniqueIdVerification) - err = initConfig.Validate() - if err != nil { - utils.PrettifyErrorIfExists(err) - return err - } - - // TODO: create all dirs here - outputHandler.StartSpinner(" Initializing RollApp configuration files...") - /* ---------------------------- Initialize relayer --------------------------- */ - // 20240607 relayer will be handled using a separate, relayer command - // rollerConfigFilePath := filepath.Join(utils.GetRollerRootDir(), "roller.toml") - // rollappPrefix, err := global_utils.GetKeyFromTomlFile(rollerConfigFilePath, "bech32_prefix") - // utils.PrettifyErrorIfExists(err) - - // err = initializeRelayerConfig(relayer.ChainConfig{ - // ID: initConfig.RollappID, - // RPC: consts.DefaultRollappRPC, - // Denom: initConfig.Denom, - // AddressPrefix: rollappPrefix, - // GasPrices: "0", - // }, relayer.ChainConfig{ - // ID: initConfig.HubData.ID, - // RPC: initConfig.HubData.ARCHIVE_RPC_URL, - // Denom: consts.Denoms.Hub, - // AddressPrefix: consts.AddressPrefixes.Hub, - // GasPrices: initConfig.HubData.GAS_PRICE, - // }, initConfig) - // if err != nil { - // return err - // } - /* ------------------------------ Generate keys ----------------------------- */ - addresses, err := initconfig.GenerateKeys(initConfig) - if err != nil { - utils.PrettifyErrorIfExists(err) - return err - } - - /* ------------------------ Initialize DA light node ------------------------ */ - damanager := datalayer.NewDAManager(initConfig.DA, initConfig.Home) - err = damanager.InitializeLightNodeConfig() - if err != nil { - return err - } - - daAddress, err := damanager.GetDAAccountAddress() - if err != nil { - return err - } - - if daAddress != "" { - addresses = append(addresses, utils.AddressData{ - Name: damanager.GetKeyName(), - Addr: daAddress, - }) - } - - /* --------------------------- Initialize Rollapp -------------------------- */ - err = initconfig.InitializeRollappConfig(initConfig) - if err != nil { - return err - } - - // genesis creator archive - err = archives.ExtractFileFromNestedTar( - configArchivePath, - "genesis.json", - filepath.Join(home, consts.ConfigDirName.Rollapp, "config"), - ) - if err != nil { - return err - } - - // adds the sequencer address to the whitelists - err = initconfig.UpdateGenesisParams(home) - if err != nil { - return err - } - - rollerConfigFilePath := filepath.Join(utils.GetRollerRootDir(), "roller.toml") - err = global_utils.UpdateFieldInToml(rollerConfigFilePath, "home", utils.GetRollerRootDir()) - if err != nil { - fmt.Println("failed to add home to roller.toml: ", err) - return err - } - - // 20240607 genesis is generated using the genesis-creator - // err = initializeRollappGenesis(initConfig) - // if err != nil { - // return err - // } - - // TODO: review, roller config is generated using genesis-creator - // some of the config values should be moved there - // err = config.WriteConfigToTOML(initConfig) - // if err != nil { - // return err - // } - - /* ------------------------------ Initialize Local Hub ---------------------------- */ - // TODO: local hub is out of scope, implement as the last step - // hub := cmd.Flag(FlagNames.HubID).Value.String() - // if hub == consts.LocalHubName { - // err := initLocalHub(initConfig) - // utils.PrettifyErrorIfExists(err) - // } - - /* ------------------------------ Print output ------------------------------ */ - outputHandler.StopSpinner() - outputHandler.PrintInitOutput(initConfig, addresses, initConfig.RollappID) - - return nil + err = runInit(cmd, WithConfig(archivePath)) + if err != nil { + fmt.Printf("failed to initialize the RollApp: %v\n", err) + return + } + }, } diff --git a/cmd/rollapp/init/mockbackends.go b/cmd/rollapp/init/mockbackends.go new file mode 100644 index 00000000..2b65b668 --- /dev/null +++ b/cmd/rollapp/init/mockbackends.go @@ -0,0 +1,66 @@ +package initrollapp + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/BurntSushi/toml" + + "github.com/dymensionxyz/roller/cmd/utils" +) + +type RollerConfig struct { + BaseDenom string `toml:"base_denom"` + Bech32Prefix string `toml:"bech32_prefix"` + Da string `toml:"da"` + Denom string `toml:"denom"` + DenomExponent string `toml:"denom_exponent"` + DenomLogoDataURI string `toml:"denom_logo_data_uri"` + Environment string `toml:"environment"` + Execution string `toml:"execution"` + ExecutionVersion string `toml:"execution_version"` + Home string `toml:"home"` + LogoDataURI string `toml:"logo_data_uri"` + MinimumGasPrices string `toml:"minimum_gas_prices"` + RollappID string `toml:"rollapp_id"` + RollerVersion string `toml:"roller_version"` +} + +func NewMockRollerConfig() *RollerConfig { + return &RollerConfig{ + BaseDenom: "amock", + Bech32Prefix: "ethm", + Da: "local", + Denom: "mock", + DenomExponent: "18", + DenomLogoDataURI: "", + Environment: "local", + Execution: "evm", + ExecutionVersion: "v2.2.0-hotfix.1", + Home: "", + LogoDataURI: "", + MinimumGasPrices: "1000000000amock", + RollappID: "mockrollapp_100000-1", + RollerVersion: "1.0.5", + } +} + +func WriteMockRollerconfigToFile(rc *RollerConfig) error { + home := utils.GetRollerRootDir() + filePath := filepath.Join(home, "roller.toml") + + file, err := os.Create(filePath) + if err != nil { + return err + } + + // nolint S1023 + defer file.Close() + + if err := toml.NewEncoder(file).Encode(rc); err != nil { + fmt.Println("failed to encode toml file", err) + } + + return nil +} diff --git a/cmd/rollapp/init/utils.go b/cmd/rollapp/init/utils.go new file mode 100644 index 00000000..e061258e --- /dev/null +++ b/cmd/rollapp/init/utils.go @@ -0,0 +1,259 @@ +package initrollapp + +import ( + "errors" + "fmt" + "os" + "os/user" + "path/filepath" + "strings" + + "github.com/spf13/cobra" + + initconfig "github.com/dymensionxyz/roller/cmd/config/init" + "github.com/dymensionxyz/roller/cmd/consts" + "github.com/dymensionxyz/roller/cmd/utils" + "github.com/dymensionxyz/roller/config" + datalayer "github.com/dymensionxyz/roller/data_layer" + global_utils "github.com/dymensionxyz/roller/utils" + "github.com/dymensionxyz/roller/utils/archives" +) + +type Options struct { + configArchivePath string +} + +type Option func(*Options) + +func WithConfig(configArchivePath string) Option { + return func(o *Options) { + o.configArchivePath = configArchivePath + } +} + +func defaultOptions() Options { + return Options{ + configArchivePath: "", + } +} + +// in runInit I parse the entire genesis creator zip file twice to extract +// the file this looks awful but since the archive has only 2 files it's +// kinda fine +func runInit(cmd *cobra.Command, opts ...Option) error { + options := defaultOptions() + for _, opt := range opts { + opt(&options) + } + + home := utils.GetRollerRootDir() + outputHandler := initconfig.NewOutputHandler(false) + configArchivePath := options.configArchivePath + + defer outputHandler.StopSpinner() + + isRootExist, err := global_utils.DirNotEmpty(home) + if err != nil { + utils.PrettifyErrorIfExists(err) + return err + } + + if isRootExist { + outputHandler.StopSpinner() + shouldOverwrite, err := outputHandler.PromptOverwriteConfig(home) + if err != nil { + utils.PrettifyErrorIfExists(err) + return err + } + if shouldOverwrite { + err = os.RemoveAll(home) + if err != nil { + utils.PrettifyErrorIfExists(err) + return err + } + } else { + os.Exit(0) + } + } + + // nolint:gofumpt + err = os.MkdirAll(home, 0755) + if err != nil { + utils.PrettifyErrorIfExists(err) + return err + } + + if configArchivePath != "" { + err = archives.ExtractFileFromNestedTar( + configArchivePath, + config.RollerConfigFileName, + home, + ) + if err != nil { + return err + } + } else { + // do something + config := NewMockRollerConfig() + err := WriteMockRollerconfigToFile(config) + if err != nil { + return err + } + + } + + initConfigPtr, err := initconfig.GetInitConfig(cmd) + if err != nil { + utils.PrettifyErrorIfExists(err) + return err + } + + initConfig := *initConfigPtr + + utils.RunOnInterrupt(outputHandler.StopSpinner) + outputHandler.StartSpinner(consts.SpinnerMsgs.UniqueIdVerification) + err = initConfig.Validate() + if err != nil { + utils.PrettifyErrorIfExists(err) + return err + } + + // TODO: create all dirs here + outputHandler.StartSpinner(" Initializing RollApp configuration files...") + /* ---------------------------- Initialize relayer --------------------------- */ + // 20240607 relayer will be handled using a separate, relayer command + // rollerConfigFilePath := filepath.Join(utils.GetRollerRootDir(), "roller.toml") + // rollappPrefix, err := global_utils.GetKeyFromTomlFile(rollerConfigFilePath, "bech32_prefix") + // utils.PrettifyErrorIfExists(err) + + // err = initializeRelayerConfig(relayer.ChainConfig{ + // ID: initConfig.RollappID, + // RPC: consts.DefaultRollappRPC, + // Denom: initConfig.Denom, + // AddressPrefix: rollappPrefix, + // GasPrices: "0", + // }, relayer.ChainConfig{ + // ID: initConfig.HubData.ID, + // RPC: initConfig.HubData.ARCHIVE_RPC_URL, + // Denom: consts.Denoms.Hub, + // AddressPrefix: consts.AddressPrefixes.Hub, + // GasPrices: initConfig.HubData.GAS_PRICE, + // }, initConfig) + // if err != nil { + // return err + // } + + /* ------------------------------ Generate keys ----------------------------- */ + addresses, err := initconfig.GenerateKeys(initConfig) + if err != nil { + utils.PrettifyErrorIfExists(err) + return err + } + + /* ------------------------ Initialize DA light node ------------------------ */ + damanager := datalayer.NewDAManager(initConfig.DA, initConfig.Home) + err = damanager.InitializeLightNodeConfig() + if err != nil { + return err + } + + daAddress, err := damanager.GetDAAccountAddress() + if err != nil { + return err + } + + if daAddress != "" { + addresses = append(addresses, utils.AddressData{ + Name: damanager.GetKeyName(), + Addr: daAddress, + }) + } + + /* --------------------------- Initialize Rollapp -------------------------- */ + err = initconfig.InitializeRollappConfig(initConfig) + if err != nil { + return err + } + + if configArchivePath != "" { + // genesis creator archive + err = archives.ExtractFileFromNestedTar( + configArchivePath, + "genesis.json", + filepath.Join(home, consts.ConfigDirName.Rollapp, "config"), + ) + if err != nil { + return err + } + } + + // adds the sequencer address to the whitelists + err = initconfig.UpdateGenesisParams(home) + if err != nil { + return err + } + + rollerConfigFilePath := filepath.Join(utils.GetRollerRootDir(), "roller.toml") + err = global_utils.UpdateFieldInToml(rollerConfigFilePath, "home", utils.GetRollerRootDir()) + if err != nil { + fmt.Println("failed to add home to roller.toml: ", err) + return err + } + + // 20240607 genesis is generated using the genesis-creator + // err = initializeRollappGenesis(initConfig) + // if err != nil { + // return err + // } + + // TODO: review, roller config is generated using genesis-creator + // some of the config values should be moved there + // err = config.WriteConfigToTOML(initConfig) + // if err != nil { + // return err + // } + + /* ------------------------------ Initialize Local Hub ---------------------------- */ + // TODO: local hub is out of scope, implement as the last step + // hub := cmd.Flag(FlagNames.HubID).Value.String() + // if hub == consts.LocalHubName { + // err := initLocalHub(initConfig) + // utils.PrettifyErrorIfExists(err) + // } + + /* ------------------------------ Print output ------------------------------ */ + outputHandler.StopSpinner() + outputHandler.PrintInitOutput(initConfig, addresses, initConfig.RollappID) + + return nil +} + +func checkConfigArchive(path string) (string, error) { + path = strings.TrimSpace(path) + + if path == "" { + return "", errors.New("invalid or no input") + } + + archivePath, err := expandHomePath(path) + if err != nil { + return "", err + } + + if _, err := os.Stat(archivePath); os.IsNotExist(err) { + return "", err + } + + return archivePath, nil +} + +func expandHomePath(path string) (string, error) { + if path[:2] == "~/" { + usr, err := user.Current() + if err != nil { + return "", err + } + path = filepath.Join(usr.HomeDir, path[2:]) + } + return path, nil +} diff --git a/cmd/utils/keys.go b/cmd/utils/keys.go index 40f9c607..2f8bb8f6 100644 --- a/cmd/utils/keys.go +++ b/cmd/utils/keys.go @@ -94,6 +94,7 @@ type AddressData struct { Addr string } +// TODO: refactor into options, with title and with mnemonic func PrintAddressesWithTitle(addresses []AddressData) { fmt.Printf("🔑 Addresses:\n\n") PrintAddresses(addresses) diff --git a/go.mod b/go.mod index 3f7f009a..a2c793bb 100644 --- a/go.mod +++ b/go.mod @@ -26,10 +26,14 @@ require ( ) require ( + atomicgo.dev/cursor v0.2.0 // indirect + atomicgo.dev/keyboard v0.2.9 // indirect + atomicgo.dev/schedule v0.1.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect github.com/Microsoft/go-winio v0.4.14 // indirect github.com/chzyer/readline v1.5.0 // indirect + github.com/containerd/console v1.0.3 // indirect github.com/containerd/log v0.1.0 // indirect github.com/deckarep/golang-set v1.8.0 // indirect github.com/decred/base58 v1.0.3 // indirect @@ -43,12 +47,14 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/gogo/protobuf v1.3.1 // indirect + github.com/gookit/color v1.5.4 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect + github.com/lithammer/fuzzysearch v1.1.8 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect @@ -59,11 +65,14 @@ require ( github.com/opencontainers/image-spec v1.1.0 // indirect github.com/pierrec/xxHash v0.1.5 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/pterm/pterm v0.12.79 // indirect + github.com/rivo/uniseg v0.4.4 // indirect github.com/rs/cors v1.8.2 // indirect github.com/tidwall/gjson v1.14.2 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/vedhavyas/go-subkey v1.0.3 // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect go.opentelemetry.io/otel v1.28.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 // indirect @@ -73,6 +82,7 @@ require ( golang.org/x/crypto v0.24.0 // indirect golang.org/x/sys v0.21.0 // indirect golang.org/x/term v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect ) diff --git a/go.sum b/go.sum index cbb9c94d..2e1eaf07 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,9 @@ +atomicgo.dev/cursor v0.2.0 h1:H6XN5alUJ52FZZUkI7AlJbUc1aW38GWZalpYRPpoPOw= +atomicgo.dev/cursor v0.2.0/go.mod h1:Lr4ZJB3U7DfPPOkbH7/6TOtJ4vFGHlgj1nc+n900IpU= +atomicgo.dev/keyboard v0.2.9 h1:tOsIid3nlPLZ3lwgG8KZMp/SFmr7P0ssEN5JUsm78K8= +atomicgo.dev/keyboard v0.2.9/go.mod h1:BC4w9g00XkxH/f1HXhW2sXmJFOCWbKn9xrOunSFtExQ= +atomicgo.dev/schedule v0.1.0 h1:nTthAbhZS5YZmgYbb2+DH8uQIZcTlIrd4eYr3UQxEjs= +atomicgo.dev/schedule v0.1.0/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU= 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= @@ -263,6 +269,13 @@ github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= +github.com/MarvinJWendt/testza v0.1.0/go.mod h1:7AxNvlfeHP7Z/hDQ5JtE3OKYT3XFUeLCDE2DQninSqs= +github.com/MarvinJWendt/testza v0.2.1/go.mod h1:God7bhG8n6uQxwdScay+gjm9/LnO4D3kkcZX4hv9Rp8= +github.com/MarvinJWendt/testza v0.2.8/go.mod h1:nwIcjmr0Zz+Rcwfh3/4UhBp7ePKVhuBExvZqnKYWlII= +github.com/MarvinJWendt/testza v0.2.10/go.mod h1:pd+VWsoGUiFtq+hRKSU1Bktnn+DMCSrDrXDpX2bG66k= +github.com/MarvinJWendt/testza v0.2.12/go.mod h1:JOIegYyV7rX+7VZ9r77L/eH6CfJHHzXjB69adAhzZkI= +github.com/MarvinJWendt/testza v0.3.0/go.mod h1:eFcL4I0idjtIx8P9C6KkAuLgATNKpX4/2oUqKc6bF2c= +github.com/MarvinJWendt/testza v0.4.2/go.mod h1:mSdhXiKH8sg/gQehJ63bINcCKp7RtYewEjXsvsVUPbE= github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -287,6 +300,7 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= github.com/apache/thrift v0.17.0/go.mod h1:OLxhMRJxomX+1I/KUw03qoV3mMz16BwaKI+d4fPBx7Q= +github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= github.com/availproject/go-substrate-rpc-client/v4 v4.0.12-avail-1.4.0-rc1-5e286e3 h1:9bPK0/Vd+uOQul3vEBSemRXO+rwqi+UXDAvFzNUlG8A= github.com/availproject/go-substrate-rpc-client/v4 v4.0.12-avail-1.4.0-rc1-5e286e3/go.mod h1:5g1oM4Zu3BOaLpsKQ+O8PAv2kNuq+kPcA1VzFbsSqxE= github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= @@ -352,6 +366,8 @@ github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= 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/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= @@ -614,6 +630,10 @@ github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBH github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= +github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= +github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= +github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= 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= @@ -685,6 +705,8 @@ github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0 github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.10/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= @@ -706,6 +728,8 @@ github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4= +github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= @@ -735,6 +759,9 @@ github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= @@ -820,11 +847,23 @@ github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+ 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/pterm/pterm v0.12.27/go.mod h1:PhQ89w4i95rhgE+xedAoqous6K9X+r6aSOI2eFF7DZI= +github.com/pterm/pterm v0.12.29/go.mod h1:WI3qxgvoQFFGKGjGnJR849gU0TsEOvKn5Q8LlY1U7lg= +github.com/pterm/pterm v0.12.30/go.mod h1:MOqLIyMOgmTDz9yorcYbcw+HsgoZo3BQfg2wtl3HEFE= +github.com/pterm/pterm v0.12.31/go.mod h1:32ZAWZVXD7ZfG0s8qqHXePte42kdz8ECtRyEejaWgXU= +github.com/pterm/pterm v0.12.33/go.mod h1:x+h2uL+n7CP/rel9+bImHD5lF3nM9vJj80k9ybiiTTE= +github.com/pterm/pterm v0.12.36/go.mod h1:NjiL09hFhT/vWjQHSj1athJpx6H8cjpHXNAK5bUw8T8= +github.com/pterm/pterm v0.12.40/go.mod h1:ffwPLwlbXxP+rxT0GsgDTzS3y3rmpAO1NMjUkGTYf8s= +github.com/pterm/pterm v0.12.79 h1:lH3yrYMhdpeqX9y5Ep1u7DejyHy7NSQg9qrBjF9dFT4= +github.com/pterm/pterm v0.12.79/go.mod h1:1v/gzOF1N0FsjbgTHZ1wVycRkKiatFvJSJC4IGaQAAo= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -841,6 +880,7 @@ github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZ 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/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= 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= @@ -907,6 +947,9 @@ github.com/vedhavyas/go-subkey v1.0.3 h1:iKR33BB/akKmcR2PMlXPBeeODjWLM90EL98OrOG github.com/vedhavyas/go-subkey v1.0.3/go.mod h1:CloUaFQSSTdWnINfBRFjVMkWXZANW+nd8+TI5jYcl6Y= 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/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1283,6 +1326,7 @@ golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1291,6 +1335,7 @@ golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1328,6 +1373,8 @@ golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= 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-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -1715,6 +1762,7 @@ google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWn 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-20190902080502-41f04d3bba15/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=