From a9eabb5ff94769a2f43cb2e4ad6ed42018b7a37e Mon Sep 17 00:00:00 2001 From: Denis Fadeev Date: Thu, 24 Dec 2020 00:11:33 +0500 Subject: [PATCH 01/15] docs: install.md (#602) --- docs/1 Introduction/2 Install.md | 34 +++++++++++--------------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/docs/1 Introduction/2 Install.md b/docs/1 Introduction/2 Install.md index fb41cc2568..658e14122a 100644 --- a/docs/1 Introduction/2 Install.md +++ b/docs/1 Introduction/2 Install.md @@ -1,44 +1,32 @@ # Install Starport -**Prerequisites:** If you want to install Starport locally, make sure to have [Golang >=1.14](https://golang.org/) and [Node.js >=12.19.0](https://nodejs.org/) installed on your system. The latest version of Starport also requires [Protocol Buffer compiler](https://grpc.io/docs/protoc-installation/) to be installed. +**Prerequisites:** If you want to install Starport locally, make sure to have [Golang >=1.14](https://golang.org/). The latest version of Starport also requires [Protocol Buffer compiler](https://grpc.io/docs/protoc-installation/) to be installed. [Node.js >=12.19.0](https://nodejs.org/) is used to build the welcome screen, block explorer and to run the web scaffold. -## Installation Options +To install Starport: -### NPM - -```bash -npm i -g @tendermint/starport ``` +curl https://i.jpillora.com/tendermint/starport! | bash +``` + +This command will download the latest `starport` binary from Github and install it into `/usr/local/bin`. To learn more about how to install previous versions of the binary, refer to the [documentation](https://github.com/jpillora/installer). -### macOS with Homebrew +## macOS with Homebrew ``` brew install tendermint/tap/starport ``` - - -### Build from source on Mac, Linux, and WSL - -```bash git clone https://github.com/tendermint/starport && cd starport && make ``` -You'll find a freshly-baked `starport` binary in the build folder. +This will build and install `starport` binary into `$GOBIN`. -Note: When building from source, it is important to have your GOPATH set correctly. When in doubt, the folllowing should do: +Note: When building from source, it is important to have your `$GOPATH` set correctly. When in doubt, the folllowing should do: -```bash +``` mkdir ~/go export GOPATH=~/go ``` From b1e86ec0f1b6fa73e645311b967281572ea6cc23 Mon Sep 17 00:00:00 2001 From: Andrei Azhoichyk Date: Thu, 24 Dec 2020 09:45:05 +0300 Subject: [PATCH 02/15] feat(pkg/gomodulepath): add tests for paths with versions --- starport/pkg/gomodulepath/gomodulepath_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/starport/pkg/gomodulepath/gomodulepath_test.go b/starport/pkg/gomodulepath/gomodulepath_test.go index 0efacb3d59..0b51a429dd 100644 --- a/starport/pkg/gomodulepath/gomodulepath_test.go +++ b/starport/pkg/gomodulepath/gomodulepath_test.go @@ -28,6 +28,12 @@ func TestParse(t *testing.T) { "github.com/a/b/c@", Path{}, fmt.Errorf("app name is an invalid go module name: %w", errors.New(`malformed module path "github.com/a/b/c@": invalid char '@'`)), }, + {"name starting with the letter v", + "github.com/a/vote", Path{"github.com/a/vote", "vote", "vote"}, nil, + }, + {"with version", + "github.com/a/b/v2", Path{"github.com/a/b/v2", "b", "b"}, nil, + }, } for _, tt := range cases { t.Run(tt.name, func(t *testing.T) { From 40cec6051d0a15f1df1129e0ed742542e3a99149 Mon Sep 17 00:00:00 2001 From: Lucas Bertrand Date: Tue, 29 Dec 2020 10:18:06 +0100 Subject: [PATCH 03/15] refactor: cleanup home files (#595) --- integration/env_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/integration/env_test.go b/integration/env_test.go index 46ef5386b5..33af53f17c 100644 --- a/integration/env_test.go +++ b/integration/env_test.go @@ -164,6 +164,18 @@ func (e env) Scaffold(appName, sdkVersion string) (appPath string) { step.Workdir(root), )), ) + + // Cleanup the home directory of the app + e.t.Cleanup(func() { + switch sdkVersion { + case Stargate: + os.RemoveAll(filepath.Join(e.Home(), fmt.Sprintf(".%s", appName))) + case Launchpad: + os.RemoveAll(filepath.Join(e.Home(), fmt.Sprintf(".%sd", appName))) + os.RemoveAll(filepath.Join(e.Home(), fmt.Sprintf(".%scli", appName))) + } + }) + return filepath.Join(root, appName) } From 8baa8e5a18bed2cf570d86f9fa76677650922d5b Mon Sep 17 00:00:00 2001 From: Lucas Bertrand Date: Mon, 4 Jan 2021 14:33:52 +0100 Subject: [PATCH 04/15] refactor: package for blockchain application commands (#583) --- starport/pkg/chaincmd/chaincmd.go | 295 ++++++++++++++++++ starport/pkg/chaincmd/launchpad.go | 96 ++++++ starport/services/chain/chain.go | 21 ++ starport/services/chain/init.go | 49 +-- starport/services/chain/plugin-launchpad.go | 126 ++------ starport/services/chain/plugin-stargate.go | 97 +++--- starport/services/chain/plugin.go | 4 +- .../services/networkbuilder/networkbuilder.go | 31 +- .../services/networkbuilder/simulation.go | 20 +- 9 files changed, 515 insertions(+), 224 deletions(-) create mode 100644 starport/pkg/chaincmd/chaincmd.go create mode 100644 starport/pkg/chaincmd/launchpad.go diff --git a/starport/pkg/chaincmd/chaincmd.go b/starport/pkg/chaincmd/chaincmd.go new file mode 100644 index 0000000000..15a08be473 --- /dev/null +++ b/starport/pkg/chaincmd/chaincmd.go @@ -0,0 +1,295 @@ +package chaincmd + +import "github.com/tendermint/starport/starport/pkg/cmdrunner/step" + +const ( + commandStart = "start" + commandInit = "init" + commandKeys = "keys" + commandAddGenesisAccount = "add-genesis-account" + commandGentx = "gentx" + commandCollectGentxs = "collect-gentxs" + commandValidateGenesis = "validate-genesis" + commandShowNodeID = "show-node-id" + + optionHome = "--home" + optionKeyringBackend = "--keyring-backend" + optionChainID = "--chain-id" + optionOutput = "--output" + optionRecover = "--recover" + optionAddress = "--address" + optionAmount = "--amount" + optionValidatorMoniker = "--moniker" + optionValidatorCommissionRate = "--commission-rate" + optionValidatorCommissionMaxRate = "--commission-max-rate" + optionValidatorCommissionMaxChangeRate = "--commission-max-change-rate" + optionValidatorMinSelfDelegation = "--min-self-delegation" + optionValidatorGasPrices = "--gas-prices" + + constTendermint = "tendermint" + constJSON = "json" +) + +type KeyringBackend string + +const ( + KeyringBackendOS KeyringBackend = "os" + KeyringBackendFile KeyringBackend = "file" + KeyringBackendPass KeyringBackend = "pass" + KeyringBackendTest KeyringBackend = "test" + KeyringBackendKwallet KeyringBackend = "kwallet" +) + +type ChainCmd struct { + appCmd string + chainID string + homeDir string + keyringBackend KeyringBackend + cliCmd string +} + +// New creates a new ChainCmd to launch command with the chain app +func New(appCmd string, options ...Option) ChainCmd { + chainCmd := ChainCmd{ + appCmd: appCmd, + } + + // Apply the options provided by the user + for _, applyOption := range options { + applyOption(&chainCmd) + } + + return chainCmd +} + +type Option func(*ChainCmd) + +// WithHome replaces the default home used by the chain +func WithHome(home string) Option { + return func(c *ChainCmd) { + c.homeDir = home + } +} + +// WithChainID provides a specific chain ID for the commands that accept this option +func WithChainID(chainID string) Option { + return func(c *ChainCmd) { + c.chainID = chainID + } +} + +// WithKeyrinBackend provides a specific keyring backend for the commands that accept this option +func WithKeyrinBackend(keyringBackend KeyringBackend) Option { + return func(c *ChainCmd) { + c.keyringBackend = keyringBackend + } +} + +// WithLaunchpadCLI provides the name of the CLI application to call Launchpad CLI commands +func WithLaunchpadCLI(cliCmd string) Option { + return func(c *ChainCmd) { + c.cliCmd = cliCmd + } +} + +// StartCommand returns the command to start the daemon of the chain +func (c ChainCmd) StartCommand(options ...string) step.Option { + command := append([]string{ + commandStart, + }, options...) + return step.Exec(c.appCmd, c.attachHome(command)...) +} + +// InitCommand returns the command to initialize the chain +func (c ChainCmd) InitCommand(moniker string) step.Option { + command := []string{ + commandInit, + moniker, + } + command = c.attachChainID(command) + return step.Exec(c.appCmd, c.attachHome(command)...) +} + +// AddKeyCommand returns the command to add a new key in the chain keyring +func (c ChainCmd) AddKeyCommand(accountName string) step.Option { + command := []string{ + commandKeys, + "add", + accountName, + optionOutput, + constJSON, + } + command = c.attachKeyringBackend(command) + return step.Exec(c.appCmd, c.attachHome(command)...) +} + +// ImportKeyCommand returns the command to import a key into the chain keyring from a mnemonic +func (c ChainCmd) ImportKeyCommand(accountName string) step.Option { + command := []string{ + commandKeys, + "add", + accountName, + optionRecover, + } + command = c.attachKeyringBackend(command) + return step.Exec(c.appCmd, c.attachHome(command)...) +} + +// ShowKeyAddressCommand returns the command to print the address of a key in the chain keyring +func (c ChainCmd) ShowKeyAddressCommand(accountName string) step.Option { + command := []string{ + commandKeys, + "show", + accountName, + optionAddress, + } + command = c.attachKeyringBackend(command) + return step.Exec(c.appCmd, c.attachHome(command)...) +} + +// AddGenesisAccountCommand returns the command to add a new account in the genesis file of the chain +func (c ChainCmd) AddGenesisAccountCommand(address string, coins string) step.Option { + command := []string{ + commandAddGenesisAccount, + address, + coins, + } + return step.Exec(c.appCmd, c.attachHome(command)...) +} + +// Options for the GentxCommand +type GentxOption func([]string) []string + +// GentxWithMoniker provides moniker option for the gentx command +func GentxWithMoniker(moniker string) GentxOption { + return func(command []string) []string { + if len(moniker) > 0 { + return append(command, optionValidatorMoniker, moniker) + } + return command + } +} + +// GentxWithCommissionRate provides commission rate option for the gentx command +func GentxWithCommissionRate(commissionRate string) GentxOption { + return func(command []string) []string { + if len(commissionRate) > 0 { + return append(command, optionValidatorCommissionRate, commissionRate) + } + return command + } +} + +// GentxWithCommissionMaxRate provides commission max rate option for the gentx command +func GentxWithCommissionMaxRate(commissionMaxRate string) GentxOption { + return func(command []string) []string { + if len(commissionMaxRate) > 0 { + return append(command, optionValidatorCommissionMaxRate, commissionMaxRate) + } + return command + } +} + +// GentxWithCommissionMaxChangeRate provides commission max change rate option for the gentx command +func GentxWithCommissionMaxChangeRate(commissionMaxChangeRate string) GentxOption { + return func(command []string) []string { + if len(commissionMaxChangeRate) > 0 { + return append(command, optionValidatorCommissionMaxChangeRate, commissionMaxChangeRate) + } + return command + } +} + +// GentxWithMinSelfDelegation provides minimum self delegation option for the gentx command +func GentxWithMinSelfDelegation(minSelfDelegation string) GentxOption { + return func(command []string) []string { + if len(minSelfDelegation) > 0 { + return append(command, optionValidatorMinSelfDelegation, minSelfDelegation) + } + return command + } +} + +// GentxWithGasPrices provides gas price option for the gentx command +func GentxWithGasPrices(gasPrices string) GentxOption { + return func(command []string) []string { + if len(gasPrices) > 0 { + return append(command, optionValidatorGasPrices, gasPrices) + } + return command + } +} + +// GentxCommand returns the command to generate a gentx for the chain +func (c ChainCmd) GentxCommand( + validatorName string, + selfDelegation string, + options ...GentxOption, +) step.Option { + command := []string{ + commandGentx, + validatorName, + optionAmount, + selfDelegation, + } + + // Apply the options provided by the user + for _, applyOption := range options { + command = applyOption(command) + } + + // Add necessary flags + command = c.attachChainID(command) + command = c.attachKeyringBackend(command) + + return step.Exec(c.appCmd, c.attachHome(command)...) +} + +// CollectGentxsCommand returns the command to gather the gentxs in /gentx dir into the genesis file of the chain +func (c ChainCmd) CollectGentxsCommand() step.Option { + command := []string{ + commandCollectGentxs, + } + return step.Exec(c.appCmd, c.attachHome(command)...) +} + +// ValidateGenesisCommand returns the command to check the validity of the chain genesis +func (c ChainCmd) ValidateGenesisCommand() step.Option { + command := []string{ + commandValidateGenesis, + } + return step.Exec(c.appCmd, c.attachHome(command)...) +} + +// ShowNodeIDCommand returns the command to print the node ID of the node for the chain +func (c ChainCmd) ShowNodeIDCommand() step.Option { + command := []string{ + constTendermint, + commandShowNodeID, + } + return step.Exec(c.appCmd, c.attachHome(command)...) +} + +// attachChainID appends the chain ID flag to the provided command +func (c ChainCmd) attachChainID(command []string) []string { + if c.chainID != "" { + command = append(command, []string{optionChainID, c.chainID}...) + } + return command +} + +// attachKeyringBackend appends the keyring backend flag to the provided command +func (c ChainCmd) attachKeyringBackend(command []string) []string { + if c.keyringBackend != "" { + command = append(command, []string{optionKeyringBackend, string(c.keyringBackend)}...) + } + return command +} + +// attachHome appends the home flag to the provided command +func (c ChainCmd) attachHome(command []string) []string { + if c.homeDir != "" { + command = append(command, []string{optionHome, c.homeDir}...) + } + return command +} diff --git a/starport/pkg/chaincmd/launchpad.go b/starport/pkg/chaincmd/launchpad.go new file mode 100644 index 0000000000..bb641c9451 --- /dev/null +++ b/starport/pkg/chaincmd/launchpad.go @@ -0,0 +1,96 @@ +package chaincmd + +import "github.com/tendermint/starport/starport/pkg/cmdrunner/step" + +const ( + commandConfig = "config" + commandRestServer = "rest-server" + + optionUnsafeCors = "--unsafe-cors" + optionAPIAddress = "--laddr" + optionRPCAddress = "--node" + optionName = "--name" +) + +// LaunchpadAddKeyCommand returns the command to add a new key in the chain keyring with Launchpad chains +func (c ChainCmd) LaunchpadAddKeyCommand(accountName string) step.Option { + command := []string{ + commandKeys, + "add", + accountName, + optionOutput, + constJSON, + } + command = c.attachKeyringBackend(command) + return step.Exec(c.cliCmd, c.attachHome(command)...) +} + +// LaunchpadImportKeyCommand returns the command to import a key into the chain keyring from a mnemonic with Launchpad chains +func (c ChainCmd) LaunchpadImportKeyCommand(accountName string) step.Option { + command := []string{ + commandKeys, + "add", + accountName, + optionRecover, + } + command = c.attachKeyringBackend(command) + return step.Exec(c.cliCmd, c.attachHome(command)...) +} + +// LaunchpadShowKeyAddressCommand returns the command to print the address of a key in the chain keyring with Launchpad chains +func (c ChainCmd) LaunchpadShowKeyAddressCommand(accountName string) step.Option { + command := []string{ + commandKeys, + "show", + accountName, + optionAddress, + } + command = c.attachKeyringBackend(command) + return step.Exec(c.cliCmd, c.attachHome(command)...) +} + +// LaunchpadSetConfigCommand +func (c ChainCmd) LaunchpadSetConfigCommand(name string, value string) step.Option { + command := []string{ + commandConfig, + name, + value, + } + return step.Exec(c.cliCmd, c.attachHome(command)...) +} + +// LaunchpadRestServerCommand +func (c ChainCmd) LaunchpadRestServerCommand(apiAddress string, rpcAddress string) step.Option { + command := []string{ + commandRestServer, + optionUnsafeCors, + optionAPIAddress, + apiAddress, + optionRPCAddress, + rpcAddress, + } + return step.Exec(c.cliCmd, c.attachHome(command)...) +} + +// LaunchpadGentxCommand returns the command to generate a gentx for the chain +func (c ChainCmd) LaunchpadGentxCommand( + validatorName string, + selfDelegation string, + options ...GentxOption, +) step.Option { + command := []string{ + commandGentx, + optionName, + validatorName, + optionAmount, + selfDelegation, + } + + // Apply the options provided by the user + for _, applyOption := range options { + command = applyOption(command) + } + + command = c.attachKeyringBackend(command) + return step.Exec(c.appCmd, c.attachHome(command)...) +} diff --git a/starport/services/chain/chain.go b/starport/services/chain/chain.go index 43a04ef008..51032c45fd 100644 --- a/starport/services/chain/chain.go +++ b/starport/services/chain/chain.go @@ -8,6 +8,8 @@ import ( "os" "strings" + "github.com/tendermint/starport/starport/pkg/chaincmd" + "github.com/go-git/go-git/v5" "github.com/gookit/color" "github.com/tendermint/starport/starport/pkg/cosmosver" @@ -49,6 +51,7 @@ type Chain struct { plugin Plugin version version logLevel LogLevel + cmd chaincmd.ChainCmd serveCancel context.CancelFunc serveRefresher chan struct{} stdout, stderr io.Writer @@ -72,6 +75,7 @@ func New(app App, noCheck bool, logLevel LogLevel) (*Chain, error) { var err error + // Check if !noCheck { c.version, err = c.appVersion() if err != nil && err != git.ErrRepositoryNotExists { @@ -79,11 +83,23 @@ func New(app App, noCheck bool, logLevel LogLevel) (*Chain, error) { } } + // initialize the plugin depending on the version of the chain c.plugin, err = c.pickPlugin() if err != nil { return nil, err } + // initialize the chain commands + id, err := c.ID() + if err != nil { + return nil, err + } + c.cmd = chaincmd.New( + app.D(), + chaincmd.WithChainID(id), + chaincmd.WithHome(c.Home()), + ) + return c, nil } @@ -185,3 +201,8 @@ func (c *Chain) AppTOMLPath() string { func (c *Chain) ConfigTOMLPath() string { return fmt.Sprintf("%s/config/config.toml", c.Home()) } + +// Commands returns the chaincmd object to perform command with the chain binary +func (c *Chain) Commands() chaincmd.ChainCmd { + return c.cmd +} diff --git a/starport/services/chain/init.go b/starport/services/chain/init.go index 52a72b3de2..1d192e4cba 100644 --- a/starport/services/chain/init.go +++ b/starport/services/chain/init.go @@ -18,6 +18,10 @@ import ( "github.com/tendermint/starport/starport/pkg/xos" ) +const ( + moniker = "mynode" +) + // Init initializes chain. func (c *Chain) Init(ctx context.Context) error { chainID, err := c.ID() @@ -47,12 +51,7 @@ func (c *Chain) Init(ctx context.Context) error { // init node. steps.Add(step.New(step.NewOptions(). Add( - step.Exec( - c.app.D(), - "init", - "mynode", - "--chain-id", chainID, - ), + c.cmd.InitCommand(moniker), // overwrite configuration changes from Starport's config.yml to // over app's sdk configs. step.PostExec(func(err error) error { @@ -220,16 +219,11 @@ var gentxRe = regexp.MustCompile(`(?m)"(.+?)"`) // Gentx generates a gentx for v. func (c *Chain) Gentx(ctx context.Context, v Validator) (gentxPath string, err error) { - chainID, err := c.ID() - if err != nil { - return "", err - } - gentxPathMessage := &bytes.Buffer{} if err := cmdrunner. New(c.cmdOptions()...). Run(ctx, step.New( - c.plugin.GentxCommand(chainID, v), + c.plugin.GentxCommand(v), step.Stderr(io.MultiWriter(gentxPathMessage, c.stdLog(logAppd).err)), step.Stdout(io.MultiWriter(gentxPathMessage, c.stdLog(logAppd).out)), )); err != nil { @@ -254,14 +248,7 @@ func (c *Chain) AddGenesisAccount(ctx context.Context, account Account) error { New(c.cmdOptions()...). Run(ctx, step.New(step.NewOptions(). Add( - step.Exec( - c.app.D(), - "add-genesis-account", - account.Address, - account.Coins, - "--home", - c.Home(), - ), + c.cmd.AddGenesisAccountCommand(account.Address, account.Coins), step.Stderr(errb), )..., )) @@ -274,12 +261,7 @@ func (c *Chain) CollectGentx(ctx context.Context) error { if err := cmdrunner. New(c.cmdOptions()...). Run(ctx, step.New( - step.Exec( - c.app.D(), - "collect-gentxs", - "--home", - c.Home(), - ), + c.cmd.CollectGentxsCommand(), step.Stderr(io.MultiWriter(c.stdLog(logAppd).err, &errb)), step.Stdout(c.stdLog(logAppd).out), )); err != nil { @@ -296,16 +278,11 @@ func (c *Chain) ShowNodeID(ctx context.Context) (string, error) { if err := cmdrunner. New(c.cmdOptions()...). - Run(ctx, - step.New( - step.Exec( - c.app.D(), - "tendermint", - "show-node-id", - ), - step.Stdout(&key), - step.Stderr(&errb), - ), + Run(ctx, step.New( + c.cmd.ShowNodeIDCommand(), + step.Stdout(&key), + step.Stderr(&errb), + ), ); err != nil { return "", errors.Wrap(err, errb.String()) } diff --git a/starport/services/chain/plugin-launchpad.go b/starport/services/chain/plugin-launchpad.go index da75a14a7c..27ed029288 100644 --- a/starport/services/chain/plugin-launchpad.go +++ b/starport/services/chain/plugin-launchpad.go @@ -5,6 +5,8 @@ import ( "os" "path/filepath" + "github.com/tendermint/starport/starport/pkg/chaincmd" + "github.com/pelletier/go-toml" "github.com/pkg/errors" "github.com/tendermint/starport/starport/pkg/cmdrunner" @@ -16,11 +18,20 @@ import ( type launchpadPlugin struct { app App + cmd chaincmd.ChainCmd } func newLaunchpadPlugin(app App) *launchpadPlugin { + // initialize the chain command with keyring backend test + cmd := chaincmd.New( + app.D(), + chaincmd.WithKeyrinBackend(chaincmd.KeyringBackendTest), + chaincmd.WithLaunchpadCLI(app.CLI()), + ) + return &launchpadPlugin{ app: app, + cmd: cmd, } } @@ -55,106 +66,42 @@ func (p *launchpadPlugin) Binaries() []string { } func (p *launchpadPlugin) AddUserCommand(accountName string) step.Options { - return step.NewOptions(). - Add( - step.Exec( - p.app.CLI(), - "keys", - "add", - accountName, - "--output", "json", - "--keyring-backend", "test", - ), - ) + return step.NewOptions().Add(p.cmd.LaunchpadAddKeyCommand(accountName)) } func (p *launchpadPlugin) ImportUserCommand(name, mnemonic string) step.Options { return step.NewOptions(). Add( - step.Exec( - p.app.CLI(), - "keys", - "add", - name, - "--recover", - "--keyring-backend", "test", - ), + p.cmd.LaunchpadImportKeyCommand(name), step.Write([]byte(mnemonic+"\n")), ) } func (p *launchpadPlugin) ShowAccountCommand(accountName string) step.Option { - return step.Exec( - p.app.CLI(), - "keys", - "show", - accountName, - "-a", - "--keyring-backend", "test", - ) + return p.cmd.LaunchpadShowKeyAddressCommand(accountName) } func (p *launchpadPlugin) ConfigCommands(chainID string) []step.Option { return []step.Option{ - step.Exec( - p.app.CLI(), - "config", - "keyring-backend", - "test", - ), - step.Exec( - p.app.CLI(), - "config", - "chain-id", - chainID, - ), - step.Exec( - p.app.CLI(), - "config", - "output", - "json", - ), - step.Exec( - p.app.CLI(), - "config", - "indent", - "true", - ), - step.Exec( - p.app.CLI(), - "config", - "trust-node", - "true", - ), + p.cmd.LaunchpadSetConfigCommand("keyring-backend", "test"), + p.cmd.LaunchpadSetConfigCommand("chain-id", chainID), + p.cmd.LaunchpadSetConfigCommand("output", "json"), + p.cmd.LaunchpadSetConfigCommand("indent", "true"), + p.cmd.LaunchpadSetConfigCommand("trust-node", "true"), } } -func (p *launchpadPlugin) GentxCommand(_ string, v Validator) step.Option { - args := []string{ - "gentx", - "--name", v.Name, - "--keyring-backend", "test", - "--amount", v.StakingAmount, - } - if v.Moniker != "" { - args = append(args, "--moniker", v.Moniker) - } - if v.CommissionRate != "" { - args = append(args, "--commission-rate", v.CommissionRate) - } - if v.CommissionMaxRate != "" { - args = append(args, "--commission-max-rate", v.CommissionMaxRate) - } - if v.CommissionMaxChangeRate != "" { - args = append(args, "--commission-max-change-rate", v.CommissionMaxChangeRate) - } - if v.MinSelfDelegation != "" { - args = append(args, "--min-self-delegation", v.MinSelfDelegation) - } - if v.GasPrices != "" { - args = append(args, "--gas-prices", v.GasPrices) - } - return step.Exec(p.app.D(), args...) +func (p *launchpadPlugin) GentxCommand(v Validator) step.Option { + return p.cmd.LaunchpadGentxCommand( + v.Name, + v.StakingAmount, + chaincmd.GentxWithMoniker(v.Moniker), + chaincmd.GentxWithCommissionRate(v.CommissionRate), + chaincmd.GentxWithCommissionMaxRate(v.CommissionMaxRate), + chaincmd.GentxWithCommissionMaxChangeRate(v.CommissionMaxChangeRate), + chaincmd.GentxWithMinSelfDelegation(v.MinSelfDelegation), + chaincmd.GentxWithGasPrices(v.GasPrices), + ) } func (p *launchpadPlugin) PostInit(conf starportconf.Config) error { @@ -189,23 +136,14 @@ func (p *launchpadPlugin) StartCommands(conf starportconf.Config) [][]step.Optio return [][]step.Option{ step.NewOptions(). Add( - step.Exec( - p.app.D(), - "start", - ), + p.cmd.StartCommand(), step.PostExec(func(exitErr error) error { return errors.Wrapf(exitErr, "cannot run %[1]vd start", p.app.Name) }), ), step.NewOptions(). Add( - step.Exec( - p.app.CLI(), - "rest-server", - "--unsafe-cors", - "--laddr", xurl.TCP(conf.Servers.APIAddr), - "--node", xurl.TCP(conf.Servers.RPCAddr), - ), + p.cmd.LaunchpadRestServerCommand(xurl.TCP(conf.Servers.APIAddr), xurl.TCP(conf.Servers.RPCAddr)), step.PostExec(func(exitErr error) error { return errors.Wrapf(exitErr, "cannot run %[1]vcli rest-server", p.app.Name) }), diff --git a/starport/services/chain/plugin-stargate.go b/starport/services/chain/plugin-stargate.go index 1a33e41c6f..0a912b306f 100644 --- a/starport/services/chain/plugin-stargate.go +++ b/starport/services/chain/plugin-stargate.go @@ -5,6 +5,8 @@ import ( "os" "path/filepath" + "github.com/tendermint/starport/starport/pkg/chaincmd" + "github.com/pelletier/go-toml" "github.com/pkg/errors" "github.com/tendermint/starport/starport/pkg/cmdrunner/step" @@ -16,13 +18,27 @@ import ( type stargatePlugin struct { app App chain *Chain + cmd chaincmd.ChainCmd } -func newStargatePlugin(app App, chain *Chain) *stargatePlugin { +func newStargatePlugin(app App, chain *Chain) (*stargatePlugin, error) { + id, err := chain.ID() + if err != nil { + return nil, err + } + + // initialize the chain command with keyring backend test + cmd := chaincmd.New( + app.D(), + chaincmd.WithKeyrinBackend(chaincmd.KeyringBackendTest), + chaincmd.WithChainID(id), + ) + return &stargatePlugin{ app: app, chain: chain, - } + cmd: cmd, + }, nil } func (p *stargatePlugin) Name() string { @@ -40,75 +56,36 @@ func (p *stargatePlugin) Binaries() []string { } func (p *stargatePlugin) AddUserCommand(accountName string) step.Options { - return step.NewOptions(). - Add( - step.Exec( - p.app.D(), - "keys", - "add", - accountName, - "--output", "json", - "--keyring-backend", "test", - ), - ) + return step.NewOptions().Add(p.cmd.AddKeyCommand(accountName)) } func (p *stargatePlugin) ImportUserCommand(name, mnemonic string) step.Options { return step.NewOptions(). Add( - step.Exec( - p.app.D(), - "keys", - "add", - name, - "--recover", - "--keyring-backend", "test", - ), + p.cmd.ImportKeyCommand(name), step.Write([]byte(mnemonic+"\n")), ) } func (p *stargatePlugin) ShowAccountCommand(accountName string) step.Option { - return step.Exec( - p.app.D(), - "keys", - "show", - accountName, - "-a", - "--keyring-backend", "test", - ) + return p.cmd.ShowKeyAddressCommand(accountName) } func (p *stargatePlugin) ConfigCommands(_ string) []step.Option { return nil } -func (p *stargatePlugin) GentxCommand(chainID string, v Validator) step.Option { - args := []string{ - "gentx", v.Name, - "--chain-id", chainID, - "--keyring-backend", "test", - "--amount", v.StakingAmount, - } - if v.Moniker != "" { - args = append(args, "--moniker", v.Moniker) - } - if v.CommissionRate != "" { - args = append(args, "--commission-rate", v.CommissionRate) - } - if v.CommissionMaxRate != "" { - args = append(args, "--commission-max-rate", v.CommissionMaxRate) - } - if v.CommissionMaxChangeRate != "" { - args = append(args, "--commission-max-change-rate", v.CommissionMaxChangeRate) - } - if v.MinSelfDelegation != "" { - args = append(args, "--min-self-delegation", v.MinSelfDelegation) - } - if v.GasPrices != "" { - args = append(args, "--gas-prices", v.GasPrices) - } - return step.Exec(p.app.D(), args...) +func (p *stargatePlugin) GentxCommand(v Validator) step.Option { + return p.cmd.GentxCommand( + v.Name, + v.StakingAmount, + chaincmd.GentxWithMoniker(v.Moniker), + chaincmd.GentxWithCommissionRate(v.CommissionRate), + chaincmd.GentxWithCommissionMaxRate(v.CommissionMaxRate), + chaincmd.GentxWithCommissionMaxChangeRate(v.CommissionMaxChangeRate), + chaincmd.GentxWithMinSelfDelegation(v.MinSelfDelegation), + chaincmd.GentxWithGasPrices(v.GasPrices), + ) } func (p *stargatePlugin) PostInit(conf starportconf.Config) error { @@ -165,11 +142,11 @@ func (p *stargatePlugin) StartCommands(conf starportconf.Config) [][]step.Option return [][]step.Option{ step.NewOptions(). Add( - step.Exec( - p.app.D(), - "start", - "--pruning", "nothing", - "--grpc.address", conf.Servers.GRPCAddr, + p.cmd.StartCommand( + "--pruning", + "nothing", + "--grpc.address", + conf.Servers.GRPCAddr, ), step.PostExec(func(exitErr error) error { return errors.Wrapf(exitErr, "cannot run %[1]vd start", p.app.Name) diff --git a/starport/services/chain/plugin.go b/starport/services/chain/plugin.go index e03cbe5447..e38034e794 100644 --- a/starport/services/chain/plugin.go +++ b/starport/services/chain/plugin.go @@ -33,7 +33,7 @@ type Plugin interface { ConfigCommands(chainID string) []step.Option // GentxCommand returns step.Exec configuration for gentx command. - GentxCommand(chainID string, v Validator) step.Option + GentxCommand(v Validator) step.Option // PostInit hook. PostInit(starportconf.Config) error @@ -67,7 +67,7 @@ func (c *Chain) pickPlugin() (Plugin, error) { case cosmosver.Launchpad: return newLaunchpadPlugin(c.app), nil case cosmosver.Stargate: - return newStargatePlugin(c.app, c), nil + return newStargatePlugin(c.app, c) } panic("unknown cosmos version") } diff --git a/starport/services/networkbuilder/networkbuilder.go b/starport/services/networkbuilder/networkbuilder.go index 8c8a65b26c..517d114527 100644 --- a/starport/services/networkbuilder/networkbuilder.go +++ b/starport/services/networkbuilder/networkbuilder.go @@ -302,7 +302,7 @@ func (b *Builder) StartChain(ctx context.Context, chainID string, flags []string Name: path.Root, Version: cosmosver.Stargate, } - chainCmd, err := chain.New(app, true, chain.LogSilent) + chainHandler, err := chain.New(app, true, chain.LogSilent) if err != nil { return err } @@ -312,7 +312,7 @@ func (b *Builder) StartChain(ctx context.Context, chainID string, flags []string } // generate the genesis file for the chain to start - if err := generateGenesis(ctx, chainInfo, launchInfo, chainCmd); err != nil { + if err := generateGenesis(ctx, chainInfo, launchInfo, chainHandler); err != nil { return err } @@ -338,7 +338,7 @@ func (b *Builder) StartChain(ctx context.Context, chainID string, flags []string } // save the finalized version of config.toml with peers. - configTomlPath := filepath.Join(chainCmd.Home(), "config/config.toml") + configTomlPath := filepath.Join(chainHandler.Home(), "config/config.toml") configToml, err := toml.LoadFile(configTomlPath) if err != nil { return err @@ -359,10 +359,7 @@ func (b *Builder) StartChain(ctx context.Context, chainID string, flags []string // run the start command of the chain. g.Go(func() error { return cmdrunner.New().Run(ctx, step.New( - step.Exec( - app.D(), - append([]string{"start"}, flags...)..., - ), + chainHandler.Commands().StartCommand(flags...), step.Stdout(os.Stdout), step.Stderr(os.Stderr), )) @@ -401,19 +398,19 @@ func (b *Builder) StartChain(ctx context.Context, chainID string, flags []string } // generateGenesis generate the genesis from the launch information in the specified app home -func generateGenesis(ctx context.Context, chainInfo spn.Chain, launchInfo spn.LaunchInformation, chainCmd *chain.Chain) error { +func generateGenesis(ctx context.Context, chainInfo spn.Chain, launchInfo spn.LaunchInformation, chainHandler *chain.Chain) error { // overwrite genesis with initial genesis. - initialGenesis, err := ioutil.ReadFile(initialGenesisPath(chainCmd.Home())) + initialGenesis, err := ioutil.ReadFile(initialGenesisPath(chainHandler.Home())) if err != nil { return err } - err = ioutil.WriteFile(genesisPath(chainCmd.Home()), initialGenesis, 0755) + err = ioutil.WriteFile(genesisPath(chainHandler.Home()), initialGenesis, 0755) if err != nil { return err } // make sure that Genesis' genesis_time is set to chain's creation time on SPN. - cf := confile.New(confile.DefaultJSONEncodingCreator, genesisPath(chainCmd.Home())) + cf := confile.New(confile.DefaultJSONEncodingCreator, genesisPath(chainHandler.Home())) var genesis map[string]interface{} if err := cf.Load(&genesis); err != nil { return err @@ -430,21 +427,21 @@ func generateGenesis(ctx context.Context, chainInfo spn.Chain, launchInfo spn.La Coins: account.Coins.String(), } - if err := chainCmd.AddGenesisAccount(ctx, genesisAccount); err != nil { + if err := chainHandler.AddGenesisAccount(ctx, genesisAccount); err != nil { return err } } // reset gentx directory - os.Mkdir(filepath.Join(chainCmd.Home(), "config/gentx"), os.ModePerm) - dir, err := ioutil.ReadDir(filepath.Join(chainCmd.Home(), "config/gentx")) + os.Mkdir(filepath.Join(chainHandler.Home(), "config/gentx"), os.ModePerm) + dir, err := ioutil.ReadDir(filepath.Join(chainHandler.Home(), "config/gentx")) if err != nil { return err } // remove all the current gentxs for _, d := range dir { - if err := os.RemoveAll(filepath.Join(chainCmd.Home(), "config/gentx", d.Name())); err != nil { + if err := os.RemoveAll(filepath.Join(chainHandler.Home(), "config/gentx", d.Name())); err != nil { return err } } @@ -452,13 +449,13 @@ func generateGenesis(ctx context.Context, chainInfo spn.Chain, launchInfo spn.La // add and collect the gentxs for i, gentx := range launchInfo.GenTxs { // Save the gentx in the gentx directory - gentxPath := filepath.Join(chainCmd.Home(), fmt.Sprintf("config/gentx/gentx%v.json", i)) + gentxPath := filepath.Join(chainHandler.Home(), fmt.Sprintf("config/gentx/gentx%v.json", i)) if err = ioutil.WriteFile(gentxPath, gentx, 0666); err != nil { return err } } if len(launchInfo.GenTxs) > 0 { - if err = chainCmd.CollectGentx(ctx); err != nil { + if err = chainHandler.CollectGentx(ctx); err != nil { return err } } diff --git a/starport/services/networkbuilder/simulation.go b/starport/services/networkbuilder/simulation.go index 576938effd..b17c264c30 100644 --- a/starport/services/networkbuilder/simulation.go +++ b/starport/services/networkbuilder/simulation.go @@ -67,19 +67,19 @@ func (b *Builder) VerifyProposals(ctx context.Context, chainID string, proposals Version: cosmosver.Stargate, HomePath: tmpHome, } - chainCmd, err := chain.New(app, true, chain.LogSilent) + chainHandler, err := chain.New(app, true, chain.LogSilent) if err != nil { return false, err } // copy the config to the temporary directory - if err := copy.Copy(chainCmd.DefaultHome(), chainCmd.Home()); err != nil { + if err := copy.Copy(chainHandler.DefaultHome(), chainHandler.Home()); err != nil { return false, err } // generate the genesis to test b.ev.Send(events.New(events.StatusOngoing, "generating genesis")) - if err := generateGenesis(ctx, chainInfo, simulatedLaunchInfo, chainCmd); err != nil { + if err := generateGenesis(ctx, chainInfo, simulatedLaunchInfo, chainHandler); err != nil { fmt.Fprintf(commandOut, "error generating the genesis: %s\n", err.Error()) return false, nil } @@ -94,12 +94,7 @@ func (b *Builder) VerifyProposals(ctx context.Context, chainID string, proposals // run validate-genesis command on the generated genesis b.ev.Send(events.New(events.StatusOngoing, "validating genesis format")) err = cmdrunner.New().Run(ctx, step.New( - step.Exec( - app.D(), - "validate-genesis", - "--home", - tmpHome, - ), + chainHandler.Commands().ValidateGenesisCommand(), step.Stderr(commandOut), // This is the error of the verifying command, therefore this is the same as stdout step.Stdout(commandOut), )) @@ -123,12 +118,7 @@ func (b *Builder) VerifyProposals(ctx context.Context, chainID string, proposals go func() { errBytes := &bytes.Buffer{} err := cmdrunner.New().Run(ctx, step.New( - step.Exec( - app.D(), - "start", - "--home", - tmpHome, - ), + chainHandler.Commands().StartCommand(), step.PostExec(func(exitErr error) error { // If the error is validator set is nil, it means the genesis didn't get broken after a proposal // The genesis was correctly generated but we don't have the necessary proposals to have a validator set From a3f446c7e858bdc676d2620e63512ba188881eee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Mon, 4 Jan 2021 17:07:57 +0300 Subject: [PATCH 05/15] refactor: use stable version of Starport in docs (#610) * refactor: use stable version of Starport in docs by default * Update readme.md Co-authored-by: Denis Fadeev --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 28ad372e3e..4a88026917 100644 --- a/readme.md +++ b/readme.md @@ -2,12 +2,12 @@ Starport is the easiest way to build a blockchain. It is a developer-friendly interface to the [Cosmos SDK](https://github.com/cosmos/cosmos-sdk), the world's most widely-used blockchain application framework. Starport generates boilerplate code for you, so you can focus on writing business logic. -* [**Build a blockchain with Starport in a web-based IDE**](https://gitpod.io/#https://github.com/tendermint/starport/) +* [**Build a blockchain with Starport in a web-based IDE** (stable)](https://gitpod.io/#https://github.com/tendermint/starport/tree/master) or use [nightly version](https://gitpod.io/#https://github.com/tendermint/starport/) * [Check out the latest features in v0.13](https://www.youtube.com/watch?v=DhciTJHxvAY) ## Quick start -Open Starport [in your browser](https://gitpod.io/#https://github.com/tendermint/starport/), or [install it](/docs/1%20Introduction/2%20Install.md). Then: +Open Starport [in your browser](https://gitpod.io/#https://github.com/tendermint/starport/tree/master), or [install it](/docs/1%20Introduction/2%20Install.md). Then: ``` starport app github.com/foo/mychain From 447c199425c20dfa68d63259c8afc764723950c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Tue, 5 Jan 2021 12:44:06 +0300 Subject: [PATCH 06/15] feature(network): show errors from appd binary (#506) fixes #481. --- starport/services/chain/init.go | 223 ++++++++++++++++---------------- 1 file changed, 112 insertions(+), 111 deletions(-) diff --git a/starport/services/chain/init.go b/starport/services/chain/init.go index 1d192e4cba..242159d16a 100644 --- a/starport/services/chain/init.go +++ b/starport/services/chain/init.go @@ -35,6 +35,7 @@ func (c *Chain) Init(ctx context.Context) error { } var steps step.Steps + var errb bytes.Buffer // cleanup persistent data from previous `serve`. steps.Add(step.New( @@ -49,57 +50,57 @@ func (c *Chain) Init(ctx context.Context) error { )) // init node. - steps.Add(step.New(step.NewOptions(). - Add( - c.cmd.InitCommand(moniker), - // overwrite configuration changes from Starport's config.yml to - // over app's sdk configs. - step.PostExec(func(err error) error { - if err != nil { - return err - } + steps.Add(step.New( + c.cmd.InitCommand(moniker), + // overwrite configuration changes from Starport's config.yml to + // over app's sdk configs. + step.PostExec(func(err error) error { + if err != nil { + return err + } - // make sure that chain id given during chain.New() has the most priority. - if conf.Genesis != nil { - conf.Genesis["chain_id"] = chainID - } + // make sure that chain id given during chain.New() has the most priority. + if conf.Genesis != nil { + conf.Genesis["chain_id"] = chainID + } - appconfigs := []struct { - ec confile.EncodingCreator - path string - changes map[string]interface{} - }{ - {confile.DefaultJSONEncodingCreator, c.GenesisPath(), conf.Genesis}, - {confile.DefaultTOMLEncodingCreator, c.AppTOMLPath(), conf.Init.App}, - {confile.DefaultTOMLEncodingCreator, c.ConfigTOMLPath(), conf.Init.Config}, - } + appconfigs := []struct { + ec confile.EncodingCreator + path string + changes map[string]interface{} + }{ + {confile.DefaultJSONEncodingCreator, c.GenesisPath(), conf.Genesis}, + {confile.DefaultTOMLEncodingCreator, c.AppTOMLPath(), conf.Init.App}, + {confile.DefaultTOMLEncodingCreator, c.ConfigTOMLPath(), conf.Init.Config}, + } - for _, ac := range appconfigs { - cf := confile.New(ac.ec, ac.path) - var conf map[string]interface{} - if err := cf.Load(&conf); err != nil { - return err - } - if err := mergo.Merge(&conf, ac.changes, mergo.WithOverride); err != nil { - return err - } - if err := cf.Save(conf); err != nil { - return err - } + for _, ac := range appconfigs { + cf := confile.New(ac.ec, ac.path) + var conf map[string]interface{} + if err := cf.Load(&conf); err != nil { + return err } - return nil - }), - step.PostExec(func(err error) error { - if err != nil { + if err := mergo.Merge(&conf, ac.changes, mergo.WithOverride); err != nil { return err } - return c.plugin.PostInit(conf) - }), - ). - Add(c.stdSteps(logAppd)...)..., + if err := cf.Save(conf); err != nil { + return err + } + } + return nil + }), + step.PostExec(func(err error) error { + if err != nil { + return err + } + return c.plugin.PostInit(conf) + }), + step.Stderr(io.MultiWriter(c.stdLog(logAppd).err, &errb)), + step.Stdout(c.stdLog(logAppd).out), )) - return cmdrunner.New(c.cmdOptions()...).Run(ctx, steps...) + err = cmdrunner.New(c.cmdOptions()...).Run(ctx, steps...) + return errors.Wrap(err, errb.String()) } func (c *Chain) setupSteps() (steps step.Steps, err error) { @@ -142,66 +143,62 @@ func (c *Chain) CreateAccount(ctx context.Context, name, mnemonic string, isSile Name: name, } - var steps step.Steps + var ( + steps step.Steps + key = &bytes.Buffer{} + errb = &bytes.Buffer{} + ) if mnemonic != "" { steps.Add( - step.New( - step.NewOptions(). - Add(c.plugin.ImportUserCommand(name, mnemonic)...)..., + step.New(step.NewOptions(). + Add(c.plugin.ImportUserCommand(name, mnemonic)...). + Add(step.Stderr(errb))..., ), ) } else { generatedMnemonic := &bytes.Buffer{} steps.Add( - step.New( - step.NewOptions(). - Add(c.plugin.AddUserCommand(name)...). - Add( - step.PostExec(func(exitErr error) error { - if exitErr != nil { - return errors.Wrapf(exitErr, "cannot create %s account", name) - } - if err := json.NewDecoder(generatedMnemonic).Decode(&acc); err != nil { - return errors.Wrap(err, "cannot decode mnemonic") - } - if !isSilent { - fmt.Fprintf(c.stdLog(logStarport).out, "🙂 Created an account. Password (mnemonic): %[1]v\n", acc.Mnemonic) - } - return nil - }), - ). - Add(c.stdSteps(logAppcli)...). - // Stargate pipes from stdout, Launchpad pipes from stderr. - Add(step.Stderr(generatedMnemonic), step.Stdout(generatedMnemonic))..., + step.New(step.NewOptions(). + Add(c.plugin.AddUserCommand(name)...). + Add( + step.PostExec(func(exitErr error) error { + if exitErr != nil { + return errors.Wrapf(exitErr, "cannot create %s account", name) + } + if err := json.NewDecoder(generatedMnemonic).Decode(&acc); err != nil { + return errors.Wrap(err, "cannot decode mnemonic") + } + if !isSilent { + fmt.Fprintf(c.stdLog(logStarport).out, "🙂 Created an account. Password (mnemonic): %[1]v\n", acc.Mnemonic) + } + return nil + }), + ). + Add(c.stdSteps(logAppcli)...). + // Stargate pipes from stdout, Launchpad pipes from stderr. + Add(step.Stderr(generatedMnemonic), step.Stdout(generatedMnemonic))..., ), ) } - key := &bytes.Buffer{} - steps.Add( - step.New(step.NewOptions(). - Add( - c.plugin.ShowAccountCommand(name), - step.PostExec(func(err error) error { - if err != nil { - return err - } - acc.Address = strings.TrimSpace(key.String()) - return nil - }), - ). - Add(c.stdSteps(logAppcli)...). - Add(step.Stdout(key))..., + step.New( + c.plugin.ShowAccountCommand(name), + step.PostExec(func(err error) error { + if err != nil { + return err + } + acc.Address = strings.TrimSpace(key.String()) + return nil + }), + step.Stderr(io.MultiWriter(c.stdLog(logAppcli).err, errb)), + step.Stdout(key), ), ) - if err := cmdrunner.New(c.cmdOptions()...).Run(ctx, steps...); err != nil { - return Account{}, err - } - - return acc, nil + err := cmdrunner.New(c.cmdOptions()...).Run(ctx, steps...) + return acc, errors.Wrap(err, errb.String()) } type Validator struct { @@ -219,16 +216,21 @@ var gentxRe = regexp.MustCompile(`(?m)"(.+?)"`) // Gentx generates a gentx for v. func (c *Chain) Gentx(ctx context.Context, v Validator) (gentxPath string, err error) { - gentxPathMessage := &bytes.Buffer{} + var ( + gentxPathMessage = &bytes.Buffer{} + errb = &bytes.Buffer{} + ) + if err := cmdrunner. New(c.cmdOptions()...). Run(ctx, step.New( c.plugin.GentxCommand(v), - step.Stderr(io.MultiWriter(gentxPathMessage, c.stdLog(logAppd).err)), + step.Stderr(io.MultiWriter(gentxPathMessage, c.stdLog(logAppd).err, errb)), step.Stdout(io.MultiWriter(gentxPathMessage, c.stdLog(logAppd).out)), )); err != nil { - return "", err + return "", errors.Wrap(err, errb.String()) } + return gentxRe.FindStringSubmatch(gentxPathMessage.String())[1], nil } @@ -244,45 +246,44 @@ type Account struct { func (c *Chain) AddGenesisAccount(ctx context.Context, account Account) error { errb := &bytes.Buffer{} - return cmdrunner. + err := cmdrunner. New(c.cmdOptions()...). - Run(ctx, step.New(step.NewOptions(). - Add( - c.cmd.AddGenesisAccountCommand(account.Address, account.Coins), - step.Stderr(errb), - )..., + Run(ctx, step.New( + c.cmd.AddGenesisAccountCommand(account.Address, account.Coins), + step.Stderr(errb), )) + return errors.Wrap(err, errb.String()) } // CollectGentx collects gentxs on chain. func (c *Chain) CollectGentx(ctx context.Context) error { - var errb bytes.Buffer + errb := &bytes.Buffer{} - if err := cmdrunner. + err := cmdrunner. New(c.cmdOptions()...). Run(ctx, step.New( c.cmd.CollectGentxsCommand(), - step.Stderr(io.MultiWriter(c.stdLog(logAppd).err, &errb)), + step.Stderr(io.MultiWriter(c.stdLog(logAppd).err, errb)), step.Stdout(c.stdLog(logAppd).out), - )); err != nil { - return errors.Wrap(err, errb.String()) - } - - return nil + )) + return errors.Wrap(err, errb.String()) } // ShowNodeID shows node's id. func (c *Chain) ShowNodeID(ctx context.Context) (string, error) { - var key bytes.Buffer - var errb bytes.Buffer + var ( + key = &bytes.Buffer{} + errb = &bytes.Buffer{} + ) if err := cmdrunner. New(c.cmdOptions()...). - Run(ctx, step.New( - c.cmd.ShowNodeIDCommand(), - step.Stdout(&key), - step.Stderr(&errb), - ), + Run(ctx, + step.New( + c.cmd.ShowNodeIDCommand(), + step.Stdout(key), + step.Stderr(errb), + ), ); err != nil { return "", errors.Wrap(err, errb.String()) } From a52c3a63511117e2768003142cc9780927d8ac62 Mon Sep 17 00:00:00 2001 From: Lucas Bertrand Date: Tue, 5 Jan 2021 14:54:03 +0100 Subject: [PATCH 07/15] refactor: set chaincmd commands as version agnostic (#614) --- starport/pkg/chaincmd/chaincmd.go | 85 ++++++++++++++------- starport/pkg/chaincmd/launchpad.go | 84 ++++++++------------ starport/pkg/chaincmd/stargate.go | 28 +++++++ starport/services/chain/plugin-launchpad.go | 10 +-- 4 files changed, 122 insertions(+), 85 deletions(-) create mode 100644 starport/pkg/chaincmd/stargate.go diff --git a/starport/pkg/chaincmd/chaincmd.go b/starport/pkg/chaincmd/chaincmd.go index 15a08be473..30dc75d6e0 100644 --- a/starport/pkg/chaincmd/chaincmd.go +++ b/starport/pkg/chaincmd/chaincmd.go @@ -46,6 +46,7 @@ type ChainCmd struct { homeDir string keyringBackend KeyringBackend cliCmd string + cliHome string } // New creates a new ChainCmd to launch command with the chain app @@ -85,8 +86,9 @@ func WithKeyrinBackend(keyringBackend KeyringBackend) Option { } } -// WithLaunchpadCLI provides the name of the CLI application to call Launchpad CLI commands -func WithLaunchpadCLI(cliCmd string) Option { +// WithLaunchpad defines the command as Launchpad application commands +// and provides the name of the CLI application to call Launchpad CLI commands +func WithLaunchpad(cliCmd string) Option { return func(c *ChainCmd) { c.cliCmd = cliCmd } @@ -97,7 +99,7 @@ func (c ChainCmd) StartCommand(options ...string) step.Option { command := append([]string{ commandStart, }, options...) - return step.Exec(c.appCmd, c.attachHome(command)...) + return c.daemonCommand(command) } // InitCommand returns the command to initialize the chain @@ -107,7 +109,7 @@ func (c ChainCmd) InitCommand(moniker string) step.Option { moniker, } command = c.attachChainID(command) - return step.Exec(c.appCmd, c.attachHome(command)...) + return c.daemonCommand(command) } // AddKeyCommand returns the command to add a new key in the chain keyring @@ -120,7 +122,8 @@ func (c ChainCmd) AddKeyCommand(accountName string) step.Option { constJSON, } command = c.attachKeyringBackend(command) - return step.Exec(c.appCmd, c.attachHome(command)...) + + return c.cliCommand(command) } // ImportKeyCommand returns the command to import a key into the chain keyring from a mnemonic @@ -132,7 +135,8 @@ func (c ChainCmd) ImportKeyCommand(accountName string) step.Option { optionRecover, } command = c.attachKeyringBackend(command) - return step.Exec(c.appCmd, c.attachHome(command)...) + + return c.cliCommand(command) } // ShowKeyAddressCommand returns the command to print the address of a key in the chain keyring @@ -144,7 +148,8 @@ func (c ChainCmd) ShowKeyAddressCommand(accountName string) step.Option { optionAddress, } command = c.attachKeyringBackend(command) - return step.Exec(c.appCmd, c.attachHome(command)...) + + return c.cliCommand(command) } // AddGenesisAccountCommand returns the command to add a new account in the genesis file of the chain @@ -154,7 +159,7 @@ func (c ChainCmd) AddGenesisAccountCommand(address string, coins string) step.Op address, coins, } - return step.Exec(c.appCmd, c.attachHome(command)...) + return c.daemonCommand(command) } // Options for the GentxCommand @@ -226,23 +231,11 @@ func (c ChainCmd) GentxCommand( selfDelegation string, options ...GentxOption, ) step.Option { - command := []string{ - commandGentx, - validatorName, - optionAmount, - selfDelegation, - } - - // Apply the options provided by the user - for _, applyOption := range options { - command = applyOption(command) + // Check version + if c.isStargate() { + return c.stargateGentxCommand(validatorName, selfDelegation, options...) } - - // Add necessary flags - command = c.attachChainID(command) - command = c.attachKeyringBackend(command) - - return step.Exec(c.appCmd, c.attachHome(command)...) + return c.launchpadGentxCommand(validatorName, selfDelegation, options...) } // CollectGentxsCommand returns the command to gather the gentxs in /gentx dir into the genesis file of the chain @@ -250,7 +243,7 @@ func (c ChainCmd) CollectGentxsCommand() step.Option { command := []string{ commandCollectGentxs, } - return step.Exec(c.appCmd, c.attachHome(command)...) + return c.daemonCommand(command) } // ValidateGenesisCommand returns the command to check the validity of the chain genesis @@ -258,7 +251,7 @@ func (c ChainCmd) ValidateGenesisCommand() step.Option { command := []string{ commandValidateGenesis, } - return step.Exec(c.appCmd, c.attachHome(command)...) + return c.daemonCommand(command) } // ShowNodeIDCommand returns the command to print the node ID of the node for the chain @@ -267,7 +260,25 @@ func (c ChainCmd) ShowNodeIDCommand() step.Option { constTendermint, commandShowNodeID, } - return step.Exec(c.appCmd, c.attachHome(command)...) + return c.daemonCommand(command) +} + +// LaunchpadSetConfigCommand returns the command to set config value +func (c ChainCmd) LaunchpadSetConfigCommand(name string, value string) step.Option { + // Check version + if c.isStargate() { + panic("config command doesn't exist for Stargate") + } + return c.launchpadSetConfigCommand(name, value) +} + +// LaunchpadRestServerCommand returns the command to start the CLI REST server +func (c ChainCmd) LaunchpadRestServerCommand(apiAddress string, rpcAddress string) step.Option { + // Check version + if c.isStargate() { + panic("rest-server command doesn't exist for Stargate") + } + return c.launchpadRestServerCommand(apiAddress, rpcAddress) } // attachChainID appends the chain ID flag to the provided command @@ -293,3 +304,23 @@ func (c ChainCmd) attachHome(command []string) []string { } return command } + +// isStargate checks if the version for commands is Stargate +func (c ChainCmd) isStargate() bool { + return c.cliCmd == "" +} + +// daemonCommand returns the daemon command from the provided command +func (c ChainCmd) daemonCommand(command []string) step.Option { + return step.Exec(c.appCmd, c.attachHome(command)...) +} + +// cliCommand returns the cli command from the provided command +// cli is the daemon for Stargate +func (c ChainCmd) cliCommand(command []string) step.Option { + // Check version + if c.isStargate() { + return step.Exec(c.appCmd, c.attachHome(command)...) + } + return step.Exec(c.cliCmd, c.attachCLIHome(command)...) +} diff --git a/starport/pkg/chaincmd/launchpad.go b/starport/pkg/chaincmd/launchpad.go index bb641c9451..cb81a106dd 100644 --- a/starport/pkg/chaincmd/launchpad.go +++ b/starport/pkg/chaincmd/launchpad.go @@ -12,55 +12,48 @@ const ( optionName = "--name" ) -// LaunchpadAddKeyCommand returns the command to add a new key in the chain keyring with Launchpad chains -func (c ChainCmd) LaunchpadAddKeyCommand(accountName string) step.Option { - command := []string{ - commandKeys, - "add", - accountName, - optionOutput, - constJSON, +// WithLaunchpadCLIHome replaces the default home used by the Launchpad chain CLI +func WithLaunchpadCLIHome(cliHome string) Option { + return func(c *ChainCmd) { + c.cliHome = cliHome } - command = c.attachKeyringBackend(command) - return step.Exec(c.cliCmd, c.attachHome(command)...) } -// LaunchpadImportKeyCommand returns the command to import a key into the chain keyring from a mnemonic with Launchpad chains -func (c ChainCmd) LaunchpadImportKeyCommand(accountName string) step.Option { +// launchpadGentxCommand returns the command to generate a gentx for the chain +func (c ChainCmd) launchpadGentxCommand( + validatorName string, + selfDelegation string, + options ...GentxOption, +) step.Option { command := []string{ - commandKeys, - "add", - accountName, - optionRecover, + commandGentx, + optionName, + validatorName, + optionAmount, + selfDelegation, } - command = c.attachKeyringBackend(command) - return step.Exec(c.cliCmd, c.attachHome(command)...) -} -// LaunchpadShowKeyAddressCommand returns the command to print the address of a key in the chain keyring with Launchpad chains -func (c ChainCmd) LaunchpadShowKeyAddressCommand(accountName string) step.Option { - command := []string{ - commandKeys, - "show", - accountName, - optionAddress, + // Apply the options provided by the user + for _, applyOption := range options { + command = applyOption(command) } + command = c.attachKeyringBackend(command) - return step.Exec(c.cliCmd, c.attachHome(command)...) + return c.daemonCommand(command) } -// LaunchpadSetConfigCommand -func (c ChainCmd) LaunchpadSetConfigCommand(name string, value string) step.Option { +// launchpadSetConfigCommand +func (c ChainCmd) launchpadSetConfigCommand(name string, value string) step.Option { command := []string{ commandConfig, name, value, } - return step.Exec(c.cliCmd, c.attachHome(command)...) + return c.cliCommand(command) } -// LaunchpadRestServerCommand -func (c ChainCmd) LaunchpadRestServerCommand(apiAddress string, rpcAddress string) step.Option { +// launchpadRestServerCommand +func (c ChainCmd) launchpadRestServerCommand(apiAddress string, rpcAddress string) step.Option { command := []string{ commandRestServer, optionUnsafeCors, @@ -69,28 +62,13 @@ func (c ChainCmd) LaunchpadRestServerCommand(apiAddress string, rpcAddress strin optionRPCAddress, rpcAddress, } - return step.Exec(c.cliCmd, c.attachHome(command)...) + return c.cliCommand(command) } -// LaunchpadGentxCommand returns the command to generate a gentx for the chain -func (c ChainCmd) LaunchpadGentxCommand( - validatorName string, - selfDelegation string, - options ...GentxOption, -) step.Option { - command := []string{ - commandGentx, - optionName, - validatorName, - optionAmount, - selfDelegation, - } - - // Apply the options provided by the user - for _, applyOption := range options { - command = applyOption(command) +// attachCLIHome appends the home flag to the provided CLI command +func (c ChainCmd) attachCLIHome(command []string) []string { + if c.cliHome != "" { + command = append(command, []string{optionHome, c.cliHome}...) } - - command = c.attachKeyringBackend(command) - return step.Exec(c.appCmd, c.attachHome(command)...) + return command } diff --git a/starport/pkg/chaincmd/stargate.go b/starport/pkg/chaincmd/stargate.go new file mode 100644 index 0000000000..db734cefbb --- /dev/null +++ b/starport/pkg/chaincmd/stargate.go @@ -0,0 +1,28 @@ +package chaincmd + +import "github.com/tendermint/starport/starport/pkg/cmdrunner/step" + +// stargateGentxCommand returns the command to generate a gentx for the chain +func (c ChainCmd) stargateGentxCommand( + validatorName string, + selfDelegation string, + options ...GentxOption, +) step.Option { + command := []string{ + commandGentx, + validatorName, + optionAmount, + selfDelegation, + } + + // Apply the options provided by the user + for _, applyOption := range options { + command = applyOption(command) + } + + // Add necessary flags + command = c.attachChainID(command) + command = c.attachKeyringBackend(command) + + return c.daemonCommand(command) +} diff --git a/starport/services/chain/plugin-launchpad.go b/starport/services/chain/plugin-launchpad.go index 27ed029288..c953febdb9 100644 --- a/starport/services/chain/plugin-launchpad.go +++ b/starport/services/chain/plugin-launchpad.go @@ -26,7 +26,7 @@ func newLaunchpadPlugin(app App) *launchpadPlugin { cmd := chaincmd.New( app.D(), chaincmd.WithKeyrinBackend(chaincmd.KeyringBackendTest), - chaincmd.WithLaunchpadCLI(app.CLI()), + chaincmd.WithLaunchpad(app.CLI()), ) return &launchpadPlugin{ @@ -66,19 +66,19 @@ func (p *launchpadPlugin) Binaries() []string { } func (p *launchpadPlugin) AddUserCommand(accountName string) step.Options { - return step.NewOptions().Add(p.cmd.LaunchpadAddKeyCommand(accountName)) + return step.NewOptions().Add(p.cmd.AddKeyCommand(accountName)) } func (p *launchpadPlugin) ImportUserCommand(name, mnemonic string) step.Options { return step.NewOptions(). Add( - p.cmd.LaunchpadImportKeyCommand(name), + p.cmd.ImportKeyCommand(name), step.Write([]byte(mnemonic+"\n")), ) } func (p *launchpadPlugin) ShowAccountCommand(accountName string) step.Option { - return p.cmd.LaunchpadShowKeyAddressCommand(accountName) + return p.cmd.ShowKeyAddressCommand(accountName) } func (p *launchpadPlugin) ConfigCommands(chainID string) []step.Option { @@ -92,7 +92,7 @@ func (p *launchpadPlugin) ConfigCommands(chainID string) []step.Option { } func (p *launchpadPlugin) GentxCommand(v Validator) step.Option { - return p.cmd.LaunchpadGentxCommand( + return p.cmd.GentxCommand( v.Name, v.StakingAmount, chaincmd.GentxWithMoniker(v.Moniker), From e1d053cf113034f02c8a3a1fec91bb17f96bb139 Mon Sep 17 00:00:00 2001 From: Jacob Gadikian Date: Wed, 6 Jan 2021 22:02:09 +0700 Subject: [PATCH 08/15] Update devices.yml (#616) Each platform gets its own docker manifest so the :arm64 and :amd64 on the image tags are superfluous. --- .github/workflows/devices.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/devices.yml b/.github/workflows/devices.yml index c672face29..2266720a6a 100644 --- a/.github/workflows/devices.yml +++ b/.github/workflows/devices.yml @@ -31,7 +31,7 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push - run: docker buildx build --tag ${{ secrets.DOCKERHUB_USERNAME }}/starport:amd64 --file .docker/Dockerfile.amd64 --platform linux/amd64 --cache-from ${{ secrets.DOCKERHUB_USERNAME }}/starport:amd64cache --cache-to ${{ secrets.DOCKERHUB_USERNAME }}/starport:amd64cache --push --progress tty . + run: docker buildx build --tag ${{ secrets.DOCKERHUB_USERNAME }}/starport --file .docker/Dockerfile.amd64 --platform linux/amd64 --cache-from ${{ secrets.DOCKERHUB_USERNAME }}/starport:amd64cache --cache-to ${{ secrets.DOCKERHUB_USERNAME }}/starport:amd64cache --push --progress tty . arm64: name: arm64 docker @@ -56,7 +56,7 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push - run: docker buildx build --tag ${{ secrets.DOCKERHUB_USERNAME }}/starport:arm64 --file .docker/Dockerfile.arm64 --platform linux/arm64 --cache-from ${{ secrets.DOCKERHUB_USERNAME }}/starport:arm64cache --cache-to ${{ secrets.DOCKERHUB_USERNAME }}/starport:arm64cache --push --progress tty . + run: docker buildx build --tag ${{ secrets.DOCKERHUB_USERNAME }}/starport --file .docker/Dockerfile.arm64 --platform linux/arm64 --cache-from ${{ secrets.DOCKERHUB_USERNAME }}/starport:cache --cache-to ${{ secrets.DOCKERHUB_USERNAME }}/starport:cache --push --progress tty . pi: name: Starport Pi From 68ff0faa61431cc4031ca925f76a5c9784bc2a08 Mon Sep 17 00:00:00 2001 From: Lucas Bertrand Date: Thu, 7 Jan 2021 09:29:20 +0100 Subject: [PATCH 09/15] refactor: use a fixed-name dir for Starport Network chain sources (#597) --- go.mod | 2 +- go.sum | 4 ++-- .../services/networkbuilder/networkbuilder.go | 20 +++++++++++++++++-- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 62f41fc4fb..9e33fcd0da 100644 --- a/go.mod +++ b/go.mod @@ -49,7 +49,7 @@ require ( golang.org/x/mod v0.4.0 golang.org/x/net v0.0.0-20201021035429-f5854403a974 // indirect golang.org/x/sync v0.0.0-20201207232520-09787c993a3a - golang.org/x/sys v0.0.0-20201223074533-0d417f636930 // indirect + golang.org/x/sys v0.0.0-20210105210732-16f7687f5001 // indirect golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154 // indirect google.golang.org/grpc v1.33.0 diff --git a/go.sum b/go.sum index 332abbe5ec..8a9c14c8a8 100644 --- a/go.sum +++ b/go.sum @@ -928,8 +928,8 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201223074533-0d417f636930 h1:vRgIt+nup/B/BwIS0g2oC0haq0iqbV3ZA+u6+0TlNCo= -golang.org/x/sys v0.0.0-20201223074533-0d417f636930/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210105210732-16f7687f5001 h1:/dSxr6gT0FNI1MO5WLJo8mTmItROeOKTkDn+7OwWBos= +golang.org/x/sys v0.0.0-20210105210732-16f7687f5001/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/starport/services/networkbuilder/networkbuilder.go b/starport/services/networkbuilder/networkbuilder.go index 517d114527..37204f07da 100644 --- a/starport/services/networkbuilder/networkbuilder.go +++ b/starport/services/networkbuilder/networkbuilder.go @@ -38,6 +38,10 @@ const ( tendermintrpcAddr = "http://localhost:26657" ) +var ( + sourcePath = filepath.Join(starportConfDir, "spn-chains") +) + // Builder is network builder. type Builder struct { ev events.Bus @@ -185,8 +189,20 @@ func (b *Builder) Init(ctx context.Context, chainID string, source SourceOption, // otherwise clone from the remote. this option can be used by chain coordinators // as well as validators. default: - // use a tempdir to clone the source code inside. - if path, err = ioutil.TempDir("", ""); err != nil { + // ensure the path for chain source exists + if err := os.MkdirAll(sourcePath, 0700); err != nil && !os.IsExist(err) { + if !os.IsExist(err) { + return nil, err + } + } + + path = filepath.Join(sourcePath, chainID) + if _, err := os.Stat(path); err == nil { + // if the directory already exists, we overwrite it to ensure we have the last version + if err := os.RemoveAll(path); err != nil { + return nil, err + } + } else if !os.IsNotExist(err) { return nil, err } From c80e5605d46d92a9e088364fa1454e8c424c7280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Thu, 7 Jan 2021 16:17:47 +0300 Subject: [PATCH 10/15] refactor: add&use chaincmdrunner package (#612) `chaincmdrunner` provides a high level API to execute commands of an SDK app through programmatic access. * refactor `services/` to use this new pkg. * init cmdchainrunner pkg * start using chaincmdrunner in chain and networkbuilder services * cleanup * fix linter * cosmetics --- starport/pkg/chaincmd/chaincmd.go | 19 +- starport/pkg/chaincmd/runner/account.go | 92 ++++++ starport/pkg/chaincmd/runner/chain.go | 78 +++++ starport/pkg/chaincmd/runner/runner.go | 120 ++++++++ starport/services/chain/chain.go | 33 ++- starport/services/chain/init.go | 279 ++++-------------- starport/services/chain/log.go | 12 +- starport/services/chain/plugin-launchpad.go | 87 ++---- starport/services/chain/plugin-stargate.go | 65 +--- starport/services/chain/plugin.go | 20 +- starport/services/chain/serve.go | 78 ++--- .../services/networkbuilder/blockchain.go | 27 +- .../services/networkbuilder/networkbuilder.go | 17 +- .../services/networkbuilder/simulation.go | 41 +-- 14 files changed, 518 insertions(+), 450 deletions(-) create mode 100644 starport/pkg/chaincmd/runner/account.go create mode 100644 starport/pkg/chaincmd/runner/chain.go create mode 100644 starport/pkg/chaincmd/runner/runner.go diff --git a/starport/pkg/chaincmd/chaincmd.go b/starport/pkg/chaincmd/chaincmd.go index 30dc75d6e0..fcf95affde 100644 --- a/starport/pkg/chaincmd/chaincmd.go +++ b/starport/pkg/chaincmd/chaincmd.go @@ -79,8 +79,8 @@ func WithChainID(chainID string) Option { } } -// WithKeyrinBackend provides a specific keyring backend for the commands that accept this option -func WithKeyrinBackend(keyringBackend KeyringBackend) Option { +// WithKeyringBackend provides a specific keyring backend for the commands that accept this option +func WithKeyringBackend(keyringBackend KeyringBackend) Option { return func(c *ChainCmd) { c.keyringBackend = keyringBackend } @@ -152,6 +152,19 @@ func (c ChainCmd) ShowKeyAddressCommand(accountName string) step.Option { return c.cliCommand(command) } +// ListKeysCommand returns the command to print the list of a keys in the chain keyring +func (c ChainCmd) ListKeysCommand() step.Option { + command := []string{ + commandKeys, + "list", + optionOutput, + constJSON, + } + command = c.attachKeyringBackend(command) + + return c.cliCommand(command) +} + // AddGenesisAccountCommand returns the command to add a new account in the genesis file of the chain func (c ChainCmd) AddGenesisAccountCommand(address string, coins string) step.Option { command := []string{ @@ -162,7 +175,7 @@ func (c ChainCmd) AddGenesisAccountCommand(address string, coins string) step.Op return c.daemonCommand(command) } -// Options for the GentxCommand +// GentxOption for the GentxCommand type GentxOption func([]string) []string // GentxWithMoniker provides moniker option for the gentx command diff --git a/starport/pkg/chaincmd/runner/account.go b/starport/pkg/chaincmd/runner/account.go new file mode 100644 index 0000000000..75c6399d75 --- /dev/null +++ b/starport/pkg/chaincmd/runner/account.go @@ -0,0 +1,92 @@ +package chaincmdrunner + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "strings" + + "github.com/tendermint/starport/starport/pkg/cmdrunner/step" +) + +// AddAccount creates a new account or imports an account when mnemonic is provided. +// returns with an error if the operation went unsuccessful or an account with the provided name +// already exists. +func (r Runner) AddAccount(ctx context.Context, name, mnemonic string) (Account, error) { + b := &bytes.Buffer{} + + // check if account already exists. + var accounts []Account + if err := r.run(ctx, runOptions{stdout: b}, r.cc.ListKeysCommand()); err != nil { + return Account{}, err + } + if err := json.NewDecoder(b).Decode(&accounts); err != nil { + return Account{}, err + } + for _, account := range accounts { + if account.Name == name { + return Account{}, errors.New("account already exists") + } + } + b.Reset() + + account := Account{ + Name: name, + Mnemonic: mnemonic, + } + + // import the account when mnemonic is provided, otherwise create a new one. + if mnemonic != "" { + if err := r.run( + ctx, + runOptions{}, + r.cc.ImportKeyCommand(name), + step.Write([]byte(mnemonic+"\n")), + ); err != nil { + return Account{}, err + } + } else { + // note that, launchpad prints account output from stderr. + if err := r.run(ctx, runOptions{stdout: b, stderr: b}, r.cc.AddKeyCommand(name)); err != nil { + return Account{}, err + } + if err := json.NewDecoder(b).Decode(&account); err != nil { + return Account{}, err + } + + b.Reset() + } + + // get full details of the account. + if err := r.run(ctx, runOptions{stdout: b}, r.cc.ShowKeyAddressCommand(name)); err != nil { + return Account{}, err + } + account.Address = strings.TrimSpace(b.String()) + + return account, nil +} + +// Account represents a user account. +type Account struct { + Name string `json:"name"` + Address string `json:"address"` + Mnemonic string `json:"mnemonic,omitempty"` +} + +// ShowAccount shows details of an account. +func (r Runner) ShowAccount(ctx context.Context, name string) (Account, error) { + b := &bytes.Buffer{} + if err := r.run(ctx, runOptions{stdout: b}, r.cc.ShowKeyAddressCommand(name)); err != nil { + return Account{}, err + } + return Account{ + Name: name, + Address: strings.TrimSpace(b.String()), + }, nil +} + +// AddGenesisAccount adds account to genesis by its address. +func (r Runner) AddGenesisAccount(ctx context.Context, address, coins string) error { + return r.run(ctx, runOptions{}, r.cc.AddGenesisAccountCommand(address, coins)) +} diff --git a/starport/pkg/chaincmd/runner/chain.go b/starport/pkg/chaincmd/runner/chain.go new file mode 100644 index 0000000000..fd0f232aa0 --- /dev/null +++ b/starport/pkg/chaincmd/runner/chain.go @@ -0,0 +1,78 @@ +package chaincmdrunner + +import ( + "bytes" + "context" + "regexp" + "strings" + + "github.com/tendermint/starport/starport/pkg/chaincmd" +) + +// Start starts the blockchain. +func (r Runner) Start(ctx context.Context, args ...string) error { + return r.run(ctx, runOptions{longRunning: true}, r.cc.StartCommand(args...)) +} + +// LaunchpadStartRestServer start launchpad rest server. +func (r Runner) LaunchpadStartRestServer(ctx context.Context, apiAddress, rpcAddress string) error { + return r.run(ctx, runOptions{longRunning: true}, r.cc.LaunchpadRestServerCommand(apiAddress, rpcAddress)) +} + +// Init inits the blockchain. +func (r Runner) Init(ctx context.Context, moniker string) error { + return r.run(ctx, runOptions{}, r.cc.InitCommand(moniker)) +} + +// KV holds a key, value pair. +type KV struct { + key string + value string +} + +// NewKV returns a new key, value pair. +func NewKV(key, value string) KV { + return KV{key, value} +} + +// LaunchpadSetConfigs updates configurations for a launchpad app. +func (r Runner) LaunchpadSetConfigs(ctx context.Context, kvs ...KV) error { + for _, kv := range kvs { + if err := r.run(ctx, runOptions{}, r.cc.LaunchpadSetConfigCommand(kv.key, kv.value)); err != nil { + return err + } + } + return nil +} + +var gentxRe = regexp.MustCompile(`(?m)"(.+?)"`) + +// Gentx generates a genesis tx carrying a self delegation. +func (r Runner) Gentx(ctx context.Context, validatorName, selfDelegation string, options ...chaincmd.GentxOption) (gentxPath string, err error) { + b := &bytes.Buffer{} + + // note: launchpad outputs from stderr. + if err := r.run(ctx, runOptions{stdout: b, stderr: b}, r.cc.GentxCommand(validatorName, selfDelegation, options...)); err != nil { + return "", err + } + + return gentxRe.FindStringSubmatch(b.String())[1], nil +} + +// CollectGentxs collects gentxs. +func (r Runner) CollectGentxs(ctx context.Context) error { + return r.run(ctx, runOptions{}, r.cc.CollectGentxsCommand()) +} + +// ValidateGenesis validates genesis. +func (r Runner) ValidateGenesis(ctx context.Context) error { + return r.run(ctx, runOptions{}, r.cc.ValidateGenesisCommand()) +} + +// ShowNodeID shows node id. +func (r Runner) ShowNodeID(ctx context.Context) (nodeID string, err error) { + b := &bytes.Buffer{} + err = r.run(ctx, runOptions{stdout: b}, r.cc.ShowNodeIDCommand()) + nodeID = strings.TrimSpace(b.String()) + return +} diff --git a/starport/pkg/chaincmd/runner/runner.go b/starport/pkg/chaincmd/runner/runner.go new file mode 100644 index 0000000000..d18aaa0b95 --- /dev/null +++ b/starport/pkg/chaincmd/runner/runner.go @@ -0,0 +1,120 @@ +// Package chaincmdrunner provides a high level access to a blockchain's commands. +package chaincmdrunner + +import ( + "bytes" + "context" + "io" + "io/ioutil" + + "github.com/pkg/errors" + "github.com/tendermint/starport/starport/pkg/chaincmd" + "github.com/tendermint/starport/starport/pkg/cmdrunner" + "github.com/tendermint/starport/starport/pkg/cmdrunner/step" + "github.com/tendermint/starport/starport/pkg/lineprefixer" +) + +// Runner provides a high level access to a blockchain's commands. +type Runner struct { + cc chaincmd.ChainCmd + stdout, stderr io.Writer + daemonLogPrefix, cliLogPrefix string +} + +// Option configures Runner. +type Option func(r *Runner) + +// Stdout sets stdout for executed commands. +func Stdout(w io.Writer) Option { + return func(r *Runner) { + r.stdout = w + } +} + +// DaemonLogPrefix is a prefix added to app's daemon logs. +func DaemonLogPrefix(prefix string) Option { + return func(r *Runner) { + r.daemonLogPrefix = prefix + } +} + +// CLILogPrefix is a prefix added to app's cli logs. +func CLILogPrefix(prefix string) Option { + return func(r *Runner) { + r.cliLogPrefix = prefix + } +} + +// Stderr sets stderr for executed commands. +func Stderr(w io.Writer) Option { + return func(r *Runner) { + r.stderr = w + } +} + +// New creates a new Runner with cc and options. +func New(cc chaincmd.ChainCmd, options ...Option) Runner { + r := Runner{ + cc: cc, + stdout: ioutil.Discard, + stderr: ioutil.Discard, + } + + applyOptions(&r, options) + + return r +} + +func applyOptions(r *Runner, options []Option) { + for _, apply := range options { + apply(r) + } +} + +// Copy makes a copy of runner by overwriting its options with given options. +func (r Runner) Copy(options ...Option) Runner { + applyOptions(&r, options) + + return r +} + +type runOptions struct { + // longRunning indicates that command expected to run for a long period of time. + longRunning bool + + // stdout and stderr used to collect a copy of command's outputs. + stdout, stderr io.Writer +} + +// run executes a command. +func (r Runner) run(ctx context.Context, roptions runOptions, soptions ...step.Option) error { + var ( + errb = &bytes.Buffer{} + + // add optional prefixes to output streams. + stdout io.Writer = lineprefixer.NewWriter(r.stdout, func() string { return r.daemonLogPrefix }) + stderr io.Writer = lineprefixer.NewWriter(r.stderr, func() string { return r.cliLogPrefix }) + ) + + if roptions.stdout != nil { + stdout = io.MultiWriter(stdout, roptions.stdout) + } + if roptions.stderr != nil { + stderr = io.MultiWriter(stderr, roptions.stderr) + } + + if !roptions.longRunning { + stderr = io.MultiWriter(stderr, errb) + } + + rnoptions := []cmdrunner.Option{ + cmdrunner.DefaultStdout(stdout), + cmdrunner.DefaultStderr(stderr), + } + + err := cmdrunner. + New(rnoptions...). + Run(ctx, step.New(soptions...)) + + return errors.Wrap(err, errb.String()) +} diff --git a/starport/services/chain/chain.go b/starport/services/chain/chain.go index 51032c45fd..8fa9bc0b6d 100644 --- a/starport/services/chain/chain.go +++ b/starport/services/chain/chain.go @@ -9,6 +9,7 @@ import ( "strings" "github.com/tendermint/starport/starport/pkg/chaincmd" + chaincmdrunner "github.com/tendermint/starport/starport/pkg/chaincmd/runner" "github.com/go-git/go-git/v5" "github.com/gookit/color" @@ -51,7 +52,7 @@ type Chain struct { plugin Plugin version version logLevel LogLevel - cmd chaincmd.ChainCmd + cmd chaincmdrunner.Runner serveCancel context.CancelFunc serveRefresher chan struct{} stdout, stderr io.Writer @@ -94,11 +95,31 @@ func New(app App, noCheck bool, logLevel LogLevel) (*Chain, error) { if err != nil { return nil, err } - c.cmd = chaincmd.New( - app.D(), + + ccoptions := []chaincmd.Option{ chaincmd.WithChainID(id), chaincmd.WithHome(c.Home()), - ) + chaincmd.WithKeyringBackend(chaincmd.KeyringBackendTest), + } + if c.plugin.Version() == cosmosver.Launchpad { + ccoptions = append(ccoptions, + chaincmd.WithLaunchpad(app.CLI()), + //chaincmd.WithLaunchpadCLIHome(), + ) + } + + cc := chaincmd.New(app.D(), ccoptions...) + + ccroptions := []chaincmdrunner.Option{} + if c.logLevel == LogVerbose { + ccroptions = append(ccroptions, + chaincmdrunner.Stdout(os.Stdout), + chaincmdrunner.Stderr(os.Stderr), + chaincmdrunner.DaemonLogPrefix(c.genPrefix(logAppd)), + chaincmdrunner.CLILogPrefix(c.genPrefix(logAppcli)), + ) + } + c.cmd = chaincmdrunner.New(cc, ccroptions...) return c, nil } @@ -202,7 +223,7 @@ func (c *Chain) ConfigTOMLPath() string { return fmt.Sprintf("%s/config/config.toml", c.Home()) } -// Commands returns the chaincmd object to perform command with the chain binary -func (c *Chain) Commands() chaincmd.ChainCmd { +// Commands returns the runner execute commands on the chain's binary +func (c *Chain) Commands() chaincmdrunner.Runner { return c.cmd } diff --git a/starport/services/chain/init.go b/starport/services/chain/init.go index 242159d16a..b948803f46 100644 --- a/starport/services/chain/init.go +++ b/starport/services/chain/init.go @@ -1,19 +1,11 @@ package chain import ( - "bytes" "context" - "encoding/json" "fmt" - "io" "os" - "regexp" - "strings" "github.com/imdario/mergo" - "github.com/pkg/errors" - "github.com/tendermint/starport/starport/pkg/cmdrunner" - "github.com/tendermint/starport/starport/pkg/cmdrunner/step" "github.com/tendermint/starport/starport/pkg/confile" "github.com/tendermint/starport/starport/pkg/xos" ) @@ -34,171 +26,75 @@ func (c *Chain) Init(ctx context.Context) error { return err } - var steps step.Steps - var errb bytes.Buffer - // cleanup persistent data from previous `serve`. - steps.Add(step.New( - step.PreExec(func() error { - for _, path := range c.plugin.StoragePaths() { - if err := os.RemoveAll(path); err != nil { - return err - } - } - return nil - }), - )) + for _, path := range c.plugin.StoragePaths() { + if err := os.RemoveAll(path); err != nil { + return err + } + } // init node. - steps.Add(step.New( - c.cmd.InitCommand(moniker), - // overwrite configuration changes from Starport's config.yml to - // over app's sdk configs. - step.PostExec(func(err error) error { - if err != nil { - return err - } - - // make sure that chain id given during chain.New() has the most priority. - if conf.Genesis != nil { - conf.Genesis["chain_id"] = chainID - } - - appconfigs := []struct { - ec confile.EncodingCreator - path string - changes map[string]interface{} - }{ - {confile.DefaultJSONEncodingCreator, c.GenesisPath(), conf.Genesis}, - {confile.DefaultTOMLEncodingCreator, c.AppTOMLPath(), conf.Init.App}, - {confile.DefaultTOMLEncodingCreator, c.ConfigTOMLPath(), conf.Init.Config}, - } - - for _, ac := range appconfigs { - cf := confile.New(ac.ec, ac.path) - var conf map[string]interface{} - if err := cf.Load(&conf); err != nil { - return err - } - if err := mergo.Merge(&conf, ac.changes, mergo.WithOverride); err != nil { - return err - } - if err := cf.Save(conf); err != nil { - return err - } - } - return nil - }), - step.PostExec(func(err error) error { - if err != nil { - return err - } - return c.plugin.PostInit(conf) - }), - step.Stderr(io.MultiWriter(c.stdLog(logAppd).err, &errb)), - step.Stdout(c.stdLog(logAppd).out), - )) + if err := c.cmd.Init(ctx, moniker); err != nil { + return err + } - err = cmdrunner.New(c.cmdOptions()...).Run(ctx, steps...) - return errors.Wrap(err, errb.String()) -} + // overwrite configuration changes from Starport's config.yml to + // over app's sdk configs. -func (c *Chain) setupSteps() (steps step.Steps, err error) { - if err := c.checkIBCRelayerSupport(); err == nil { - steps.Add(step.New( - step.PreExec(func() error { - if err := xos.RemoveAllUnderHome(".relayer"); err != nil { - return err - } - info, err := c.RelayerInfo() - if err != nil { - return err - } - fmt.Fprintf(c.stdLog(logStarport).out, "✨ Relayer info: %s\n", info) - return nil - }), - )) + // make sure that chain id given during chain.New() has the most priority. + if conf.Genesis != nil { + conf.Genesis["chain_id"] = chainID } - chainID, err := c.ID() - if err != nil { - return nil, err + appconfigs := []struct { + ec confile.EncodingCreator + path string + changes map[string]interface{} + }{ + {confile.DefaultJSONEncodingCreator, c.GenesisPath(), conf.Genesis}, + {confile.DefaultTOMLEncodingCreator, c.AppTOMLPath(), conf.Init.App}, + {confile.DefaultTOMLEncodingCreator, c.ConfigTOMLPath(), conf.Init.Config}, } - for _, execOption := range c.plugin.ConfigCommands(chainID) { - execOption := execOption - steps.Add(step.New(step.NewOptions(). - Add(execOption). - Add(c.stdSteps(logAppcli)...)..., - )) + for _, ac := range appconfigs { + cf := confile.New(ac.ec, ac.path) + var conf map[string]interface{} + if err := cf.Load(&conf); err != nil { + return err + } + if err := mergo.Merge(&conf, ac.changes, mergo.WithOverride); err != nil { + return err + } + if err := cf.Save(conf); err != nil { + return err + } } - return steps, nil + // run post init handler + return c.plugin.PostInit(conf) } -// CreateAccount creates an account on chain. -// cmnemonic is returned when account is created but not restored. -func (c *Chain) CreateAccount(ctx context.Context, name, mnemonic string, isSilent bool) (Account, error) { - acc := Account{ - Name: name, +func (c *Chain) configure(ctx context.Context) error { + // setup IBC Relayer. + if err := c.checkIBCRelayerSupport(); err == nil { + if err := xos.RemoveAllUnderHome(".relayer"); err != nil { + return err + } + info, err := c.RelayerInfo() + if err != nil { + return err + } + fmt.Fprintf(c.stdLog(logStarport).out, "✨ Relayer info: %s\n", info) + return nil } - var ( - steps step.Steps - key = &bytes.Buffer{} - errb = &bytes.Buffer{} - ) - - if mnemonic != "" { - steps.Add( - step.New(step.NewOptions(). - Add(c.plugin.ImportUserCommand(name, mnemonic)...). - Add(step.Stderr(errb))..., - ), - ) - } else { - generatedMnemonic := &bytes.Buffer{} - steps.Add( - step.New(step.NewOptions(). - Add(c.plugin.AddUserCommand(name)...). - Add( - step.PostExec(func(exitErr error) error { - if exitErr != nil { - return errors.Wrapf(exitErr, "cannot create %s account", name) - } - if err := json.NewDecoder(generatedMnemonic).Decode(&acc); err != nil { - return errors.Wrap(err, "cannot decode mnemonic") - } - if !isSilent { - fmt.Fprintf(c.stdLog(logStarport).out, "🙂 Created an account. Password (mnemonic): %[1]v\n", acc.Mnemonic) - } - return nil - }), - ). - Add(c.stdSteps(logAppcli)...). - // Stargate pipes from stdout, Launchpad pipes from stderr. - Add(step.Stderr(generatedMnemonic), step.Stdout(generatedMnemonic))..., - ), - ) + // configure blockchain. + chainID, err := c.ID() + if err != nil { + return err } - steps.Add( - step.New( - c.plugin.ShowAccountCommand(name), - step.PostExec(func(err error) error { - if err != nil { - return err - } - acc.Address = strings.TrimSpace(key.String()) - return nil - }), - step.Stderr(io.MultiWriter(c.stdLog(logAppcli).err, errb)), - step.Stdout(key), - ), - ) - - err := cmdrunner.New(c.cmdOptions()...).Run(ctx, steps...) - return acc, errors.Wrap(err, errb.String()) + return c.plugin.Configure(ctx, chainID) } type Validator struct { @@ -212,28 +108,6 @@ type Validator struct { GasPrices string } -var gentxRe = regexp.MustCompile(`(?m)"(.+?)"`) - -// Gentx generates a gentx for v. -func (c *Chain) Gentx(ctx context.Context, v Validator) (gentxPath string, err error) { - var ( - gentxPathMessage = &bytes.Buffer{} - errb = &bytes.Buffer{} - ) - - if err := cmdrunner. - New(c.cmdOptions()...). - Run(ctx, step.New( - c.plugin.GentxCommand(v), - step.Stderr(io.MultiWriter(gentxPathMessage, c.stdLog(logAppd).err, errb)), - step.Stdout(io.MultiWriter(gentxPathMessage, c.stdLog(logAppd).out)), - )); err != nil { - return "", errors.Wrap(err, errb.String()) - } - - return gentxRe.FindStringSubmatch(gentxPathMessage.String())[1], nil -} - // Account represents an account in the chain. type Account struct { Name string @@ -241,52 +115,3 @@ type Account struct { Mnemonic string `json:"mnemonic"` Coins string } - -// AddGenesisAccount add a genesis account in the chain. -func (c *Chain) AddGenesisAccount(ctx context.Context, account Account) error { - errb := &bytes.Buffer{} - - err := cmdrunner. - New(c.cmdOptions()...). - Run(ctx, step.New( - c.cmd.AddGenesisAccountCommand(account.Address, account.Coins), - step.Stderr(errb), - )) - return errors.Wrap(err, errb.String()) -} - -// CollectGentx collects gentxs on chain. -func (c *Chain) CollectGentx(ctx context.Context) error { - errb := &bytes.Buffer{} - - err := cmdrunner. - New(c.cmdOptions()...). - Run(ctx, step.New( - c.cmd.CollectGentxsCommand(), - step.Stderr(io.MultiWriter(c.stdLog(logAppd).err, errb)), - step.Stdout(c.stdLog(logAppd).out), - )) - return errors.Wrap(err, errb.String()) -} - -// ShowNodeID shows node's id. -func (c *Chain) ShowNodeID(ctx context.Context) (string, error) { - var ( - key = &bytes.Buffer{} - errb = &bytes.Buffer{} - ) - - if err := cmdrunner. - New(c.cmdOptions()...). - Run(ctx, - step.New( - c.cmd.ShowNodeIDCommand(), - step.Stdout(key), - step.Stderr(errb), - ), - ); err != nil { - return "", errors.Wrap(err, errb.String()) - } - - return strings.TrimSpace(key.String()), nil -} diff --git a/starport/services/chain/log.go b/starport/services/chain/log.go index c4b1c534b1..78ea90dac1 100644 --- a/starport/services/chain/log.go +++ b/starport/services/chain/log.go @@ -17,8 +17,8 @@ var prefixes = map[logType]struct { }{ logStarport: {"starport", 202}, logBuild: {"build", 203}, - logAppd: {"%sd", 204}, - logAppcli: {"%scli", 205}, + logAppd: {"%s daemon", 204}, + logAppcli: {"%s cli", 205}, logRelayer: {"relayer", 206}, } @@ -75,3 +75,11 @@ func (c *Chain) stdLog(logType logType) std { err: stderr, } } + +func (c *Chain) genPrefix(logType logType) string { + prefix := prefixes[logType] + + return prefixgen. + New(prefix.Name, prefixgen.Common(prefixgen.Color(prefix.Color))...). + Gen(c.app.Name) +} diff --git a/starport/services/chain/plugin-launchpad.go b/starport/services/chain/plugin-launchpad.go index c953febdb9..5b9151faf2 100644 --- a/starport/services/chain/plugin-launchpad.go +++ b/starport/services/chain/plugin-launchpad.go @@ -6,9 +6,11 @@ import ( "path/filepath" "github.com/tendermint/starport/starport/pkg/chaincmd" + "golang.org/x/sync/errgroup" "github.com/pelletier/go-toml" "github.com/pkg/errors" + chaincmdrunner "github.com/tendermint/starport/starport/pkg/chaincmd/runner" "github.com/tendermint/starport/starport/pkg/cmdrunner" "github.com/tendermint/starport/starport/pkg/cmdrunner/step" "github.com/tendermint/starport/starport/pkg/cosmosver" @@ -17,21 +19,14 @@ import ( ) type launchpadPlugin struct { - app App - cmd chaincmd.ChainCmd + app App + chain *Chain } -func newLaunchpadPlugin(app App) *launchpadPlugin { - // initialize the chain command with keyring backend test - cmd := chaincmd.New( - app.D(), - chaincmd.WithKeyrinBackend(chaincmd.KeyringBackendTest), - chaincmd.WithLaunchpad(app.CLI()), - ) - +func newLaunchpadPlugin(app App, chain *Chain) *launchpadPlugin { return &launchpadPlugin{ - app: app, - cmd: cmd, + app: app, + chain: chain, } } @@ -65,34 +60,19 @@ func (p *launchpadPlugin) Binaries() []string { } } -func (p *launchpadPlugin) AddUserCommand(accountName string) step.Options { - return step.NewOptions().Add(p.cmd.AddKeyCommand(accountName)) -} - -func (p *launchpadPlugin) ImportUserCommand(name, mnemonic string) step.Options { - return step.NewOptions(). - Add( - p.cmd.ImportKeyCommand(name), - step.Write([]byte(mnemonic+"\n")), - ) -} - -func (p *launchpadPlugin) ShowAccountCommand(accountName string) step.Option { - return p.cmd.ShowKeyAddressCommand(accountName) -} - -func (p *launchpadPlugin) ConfigCommands(chainID string) []step.Option { - return []step.Option{ - p.cmd.LaunchpadSetConfigCommand("keyring-backend", "test"), - p.cmd.LaunchpadSetConfigCommand("chain-id", chainID), - p.cmd.LaunchpadSetConfigCommand("output", "json"), - p.cmd.LaunchpadSetConfigCommand("indent", "true"), - p.cmd.LaunchpadSetConfigCommand("trust-node", "true"), - } +func (p *launchpadPlugin) Configure(ctx context.Context, chainID string) error { + return p.chain.Commands().LaunchpadSetConfigs(ctx, + chaincmdrunner.NewKV("keyring-backend", "test"), + chaincmdrunner.NewKV("chain-id", chainID), + chaincmdrunner.NewKV("output", "json"), + chaincmdrunner.NewKV("indent", "true"), + chaincmdrunner.NewKV("trust-node", "true"), + ) } -func (p *launchpadPlugin) GentxCommand(v Validator) step.Option { - return p.cmd.GentxCommand( +func (p *launchpadPlugin) Gentx(ctx context.Context, v Validator) (path string, err error) { + return p.chain.Commands().Gentx( + ctx, v.Name, v.StakingAmount, chaincmd.GentxWithMoniker(v.Moniker), @@ -132,23 +112,20 @@ func (p *launchpadPlugin) configtoml(conf starportconf.Config) error { return err } -func (p *launchpadPlugin) StartCommands(conf starportconf.Config) [][]step.Option { - return [][]step.Option{ - step.NewOptions(). - Add( - p.cmd.StartCommand(), - step.PostExec(func(exitErr error) error { - return errors.Wrapf(exitErr, "cannot run %[1]vd start", p.app.Name) - }), - ), - step.NewOptions(). - Add( - p.cmd.LaunchpadRestServerCommand(xurl.TCP(conf.Servers.APIAddr), xurl.TCP(conf.Servers.RPCAddr)), - step.PostExec(func(exitErr error) error { - return errors.Wrapf(exitErr, "cannot run %[1]vcli rest-server", p.app.Name) - }), - ), - } +func (p *launchpadPlugin) Start(ctx context.Context, conf starportconf.Config) error { + g, ctx := errgroup.WithContext(ctx) + + g.Go(func() error { + err := p.chain.Commands().Start(ctx) + return errors.Wrapf(err, "cannot run %[1]vd start", p.app.Name) + }) + + g.Go(func() error { + err := p.chain.Commands().LaunchpadStartRestServer(ctx, xurl.TCP(conf.Servers.APIAddr), xurl.TCP(conf.Servers.RPCAddr)) + return errors.Wrapf(err, "cannot run %[1]vcli rest-server", p.app.Name) + }) + + return g.Wait() } func (p *launchpadPlugin) StoragePaths() []string { diff --git a/starport/services/chain/plugin-stargate.go b/starport/services/chain/plugin-stargate.go index 0a912b306f..0aae059f8c 100644 --- a/starport/services/chain/plugin-stargate.go +++ b/starport/services/chain/plugin-stargate.go @@ -9,7 +9,6 @@ import ( "github.com/pelletier/go-toml" "github.com/pkg/errors" - "github.com/tendermint/starport/starport/pkg/cmdrunner/step" "github.com/tendermint/starport/starport/pkg/cosmosver" "github.com/tendermint/starport/starport/pkg/xurl" starportconf "github.com/tendermint/starport/starport/services/chain/conf" @@ -18,27 +17,13 @@ import ( type stargatePlugin struct { app App chain *Chain - cmd chaincmd.ChainCmd } -func newStargatePlugin(app App, chain *Chain) (*stargatePlugin, error) { - id, err := chain.ID() - if err != nil { - return nil, err - } - - // initialize the chain command with keyring backend test - cmd := chaincmd.New( - app.D(), - chaincmd.WithKeyrinBackend(chaincmd.KeyringBackendTest), - chaincmd.WithChainID(id), - ) - +func newStargatePlugin(app App, chain *Chain) *stargatePlugin { return &stargatePlugin{ app: app, chain: chain, - cmd: cmd, - }, nil + } } func (p *stargatePlugin) Name() string { @@ -55,28 +40,13 @@ func (p *stargatePlugin) Binaries() []string { } } -func (p *stargatePlugin) AddUserCommand(accountName string) step.Options { - return step.NewOptions().Add(p.cmd.AddKeyCommand(accountName)) -} - -func (p *stargatePlugin) ImportUserCommand(name, mnemonic string) step.Options { - return step.NewOptions(). - Add( - p.cmd.ImportKeyCommand(name), - step.Write([]byte(mnemonic+"\n")), - ) -} - -func (p *stargatePlugin) ShowAccountCommand(accountName string) step.Option { - return p.cmd.ShowKeyAddressCommand(accountName) -} - -func (p *stargatePlugin) ConfigCommands(_ string) []step.Option { +func (p *stargatePlugin) Configure(_ context.Context, _ string) error { return nil } -func (p *stargatePlugin) GentxCommand(v Validator) step.Option { - return p.cmd.GentxCommand( +func (p *stargatePlugin) Gentx(ctx context.Context, v Validator) (path string, err error) { + return p.chain.Commands().Gentx( + ctx, v.Name, v.StakingAmount, chaincmd.GentxWithMoniker(v.Moniker), @@ -138,21 +108,14 @@ func (p *stargatePlugin) configtoml(conf starportconf.Config) error { return err } -func (p *stargatePlugin) StartCommands(conf starportconf.Config) [][]step.Option { - return [][]step.Option{ - step.NewOptions(). - Add( - p.cmd.StartCommand( - "--pruning", - "nothing", - "--grpc.address", - conf.Servers.GRPCAddr, - ), - step.PostExec(func(exitErr error) error { - return errors.Wrapf(exitErr, "cannot run %[1]vd start", p.app.Name) - }), - ), - } +func (p *stargatePlugin) Start(ctx context.Context, conf starportconf.Config) error { + err := p.chain.Commands().Start(ctx, + "--pruning", + "nothing", + "--grpc.address", + conf.Servers.GRPCAddr, + ) + return errors.Wrapf(err, "cannot run %[1]vd start", p.app.Name) } func (p *stargatePlugin) StoragePaths() []string { diff --git a/starport/services/chain/plugin.go b/starport/services/chain/plugin.go index e38034e794..dcb812b4a0 100644 --- a/starport/services/chain/plugin.go +++ b/starport/services/chain/plugin.go @@ -3,7 +3,6 @@ package chain import ( "context" - "github.com/tendermint/starport/starport/pkg/cmdrunner/step" "github.com/tendermint/starport/starport/pkg/cosmosver" starportconf "github.com/tendermint/starport/starport/services/chain/conf" ) @@ -20,26 +19,17 @@ type Plugin interface { // Binaries returns a list of binaries that will be compiled for the app. Binaries() []string - // AddUserCommand returns step.Exec configuration to add users. - AddUserCommand(name string) step.Options - - // ImportUserCommand returns step.Exec configuration to import users. - ImportUserCommand(namem, mnemonic string) step.Options - - // ShowAccountCommand returns step.Exec configuration to run show account. - ShowAccountCommand(accountName string) step.Option - // ConfigCommands returns step.Exec configuration for config commands. - ConfigCommands(chainID string) []step.Option + Configure(ctx context.Context, chainID string) error // GentxCommand returns step.Exec configuration for gentx command. - GentxCommand(v Validator) step.Option + Gentx(context.Context, Validator) (path string, err error) // PostInit hook. PostInit(starportconf.Config) error // StartCommands returns step.Exec configuration to start servers. - StartCommands(starportconf.Config) [][]step.Option + Start(context.Context, starportconf.Config) error // StoragePaths returns a list of where persistent data kept. StoragePaths() []string @@ -65,9 +55,9 @@ func (c *Chain) pickPlugin() (Plugin, error) { } switch version { case cosmosver.Launchpad: - return newLaunchpadPlugin(c.app), nil + return newLaunchpadPlugin(c.app, c), nil case cosmosver.Stargate: - return newStargatePlugin(c.app, c) + return newStargatePlugin(c.app, c), nil } panic("unknown cosmos version") } diff --git a/starport/services/chain/serve.go b/starport/services/chain/serve.go index 27c0fe1f55..306f3ec7a8 100644 --- a/starport/services/chain/serve.go +++ b/starport/services/chain/serve.go @@ -12,7 +12,6 @@ import ( "path" "path/filepath" "strings" - "sync" "time" "github.com/pkg/errors" @@ -183,90 +182,65 @@ func (c *Chain) serve(ctx context.Context) error { } for _, account := range conf.Accounts { - acc, err := c.CreateAccount(ctx, account.Name, "", false) + acc, err := c.Commands().AddAccount(ctx, account.Name, "") if err != nil { return err } - acc.Coins = strings.Join(account.Coins, ",") - if err := c.AddGenesisAccount(ctx, acc); err != nil { + coins := strings.Join(account.Coins, ",") + if err := c.Commands().AddGenesisAccount(ctx, acc.Address, coins); err != nil { return err } + + fmt.Fprintf(c.stdLog(logStarport).out, "🙂 Created an account. Password (mnemonic): %[1]v\n", acc.Mnemonic) } + for _, account := range sconf.Accounts { - acc, err := c.CreateAccount(ctx, account.Name, account.Mnemonic, false) + acc, err := c.Commands().AddAccount(ctx, account.Name, account.Mnemonic) if err != nil { return err } - acc.Coins = strings.Join(account.Coins, ",") - if err := c.AddGenesisAccount(ctx, acc); err != nil { + coins := strings.Join(account.Coins, ",") + if err := c.Commands().AddGenesisAccount(ctx, acc.Address, coins); err != nil { return err } } - setupSteps, err := c.setupSteps() - if err != nil { - return err - } - if err := cmdrunner. - New(c.cmdOptions()...). - Run(ctx, setupSteps...); err != nil { + if err := c.configure(ctx); err != nil { return err } - if _, err := c.Gentx(ctx, Validator{ + + if _, err := c.plugin.Gentx(ctx, Validator{ Name: conf.Validator.Name, StakingAmount: conf.Validator.Staked, }); err != nil { return err } - if err := c.CollectGentx(ctx); err != nil { + + if err := c.Commands().CollectGentxs(ctx); err != nil { return err } - wr := sync.WaitGroup{} - wr.Add(1) + return c.start(ctx, conf) +} + +func (c *Chain) start(ctx context.Context, conf conf.Config) error { + g, ctx := errgroup.WithContext(ctx) + + g.Go(func() error { return c.plugin.Start(ctx, conf) }) + + fmt.Fprintf(c.stdLog(logStarport).out, "🌍 Running a Cosmos '%[1]v' app with Tendermint at %s.\n", c.app.Name, xurl.HTTP(conf.Servers.RPCAddr)) + fmt.Fprintf(c.stdLog(logStarport).out, "🌍 Running a server at %s (LCD)\n", xurl.HTTP(conf.Servers.APIAddr)) + fmt.Fprintf(c.stdLog(logStarport).out, "\n🚀 Get started: %s\n\n", xurl.HTTP(conf.Servers.DevUIAddr)) go func() { - wr.Wait() if err := c.initRelayer(ctx, conf); err != nil && ctx.Err() == nil { fmt.Fprintf(c.stdLog(logStarport).err, "could not init relayer: %s", err) } }() - return cmdrunner. - New(append(c.cmdOptions(), cmdrunner.RunParallel())...). - Run(ctx, c.serverSteps(ctx, &wr, conf)...) -} - -func (c *Chain) serverSteps(_ context.Context, wr *sync.WaitGroup, conf conf.Config) (steps step.Steps) { - var wg sync.WaitGroup - wg.Add(len(c.plugin.StartCommands(conf))) - go func() { - wg.Wait() - fmt.Fprintf(c.stdLog(logStarport).out, "🌍 Running a Cosmos '%[1]v' app with Tendermint at %s.\n", c.app.Name, xurl.HTTP(conf.Servers.RPCAddr)) - fmt.Fprintf(c.stdLog(logStarport).out, "🌍 Running a server at %s (LCD)\n", xurl.HTTP(conf.Servers.APIAddr)) - fmt.Fprintf(c.stdLog(logStarport).out, "\n🚀 Get started: %s\n\n", xurl.HTTP(conf.Servers.DevUIAddr)) - wr.Done() - }() - - for _, exec := range c.plugin.StartCommands(conf) { - steps.Add( - step.New( - step.NewOptions(). - Add(exec...). - Add( - step.InExec(func() error { - wg.Done() - return nil - }), - ). - Add(c.stdSteps(logAppd)...)..., - ), - ) - } - - return + return g.Wait() } func (c *Chain) watchAppFrontend(ctx context.Context) error { diff --git a/starport/services/networkbuilder/blockchain.go b/starport/services/networkbuilder/blockchain.go index ba8982b24b..57feb15007 100644 --- a/starport/services/networkbuilder/blockchain.go +++ b/starport/services/networkbuilder/blockchain.go @@ -8,6 +8,7 @@ import ( "os" "github.com/cosmos/cosmos-sdk/types" + "github.com/tendermint/starport/starport/pkg/chaincmd" "github.com/tendermint/starport/starport/pkg/cosmosver" "github.com/tendermint/starport/starport/pkg/events" "github.com/tendermint/starport/starport/pkg/gomodulepath" @@ -166,16 +167,34 @@ type Account struct { } func (b *Blockchain) CreateAccount(ctx context.Context, account chain.Account) (chain.Account, error) { - return b.chain.CreateAccount(ctx, account.Name, account.Mnemonic, false) + acc, err := b.chain.Commands().AddAccount(ctx, account.Name, account.Mnemonic) + if err != nil { + return chain.Account{}, err + } + return chain.Account{ + Name: acc.Name, + Address: acc.Address, + Mnemonic: acc.Mnemonic, + }, nil } // IssueGentx creates a Genesis transaction for account with proposal. func (b *Blockchain) IssueGentx(ctx context.Context, account chain.Account, proposal Proposal) (gentx jsondoc.Doc, err error) { proposal.Validator.Name = account.Name - if err := b.chain.AddGenesisAccount(ctx, account); err != nil { + if err := b.chain.Commands().AddGenesisAccount(ctx, account.Address, account.Coins); err != nil { return nil, err } - gentxPath, err := b.chain.Gentx(ctx, proposal.Validator) + gentxPath, err := b.chain.Commands().Gentx( + ctx, + account.Name, + proposal.Validator.StakingAmount, + chaincmd.GentxWithMoniker(proposal.Validator.Moniker), + chaincmd.GentxWithCommissionRate(proposal.Validator.CommissionRate), + chaincmd.GentxWithCommissionMaxRate(proposal.Validator.CommissionMaxRate), + chaincmd.GentxWithCommissionMaxChangeRate(proposal.Validator.CommissionMaxChangeRate), + chaincmd.GentxWithMinSelfDelegation(proposal.Validator.MinSelfDelegation), + chaincmd.GentxWithGasPrices(proposal.Validator.GasPrices), + ) if err != nil { return nil, err } @@ -187,7 +206,7 @@ func (b *Blockchain) IssueGentx(ctx context.Context, account chain.Account, prop // address is the ip+port combination of a p2p address of a node (does not include id). // https://docs.tendermint.com/master/spec/p2p/config.html. func (b *Blockchain) Join(ctx context.Context, accountAddress, publicAddress string, coins types.Coins, gentx []byte, selfDelegation types.Coin) error { - key, err := b.chain.ShowNodeID(ctx) + key, err := b.chain.Commands().ShowNodeID(ctx) if err != nil { return err } diff --git a/starport/services/networkbuilder/networkbuilder.go b/starport/services/networkbuilder/networkbuilder.go index 37204f07da..ecb2ecc3b3 100644 --- a/starport/services/networkbuilder/networkbuilder.go +++ b/starport/services/networkbuilder/networkbuilder.go @@ -21,8 +21,7 @@ import ( "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" "github.com/tendermint/starport/starport/pkg/availableport" - "github.com/tendermint/starport/starport/pkg/cmdrunner" - "github.com/tendermint/starport/starport/pkg/cmdrunner/step" + chaincmdrunner "github.com/tendermint/starport/starport/pkg/chaincmd/runner" "github.com/tendermint/starport/starport/pkg/confile" "github.com/tendermint/starport/starport/pkg/cosmosver" "github.com/tendermint/starport/starport/pkg/ctxticker" @@ -374,11 +373,11 @@ func (b *Builder) StartChain(ctx context.Context, chainID string, flags []string // run the start command of the chain. g.Go(func() error { - return cmdrunner.New().Run(ctx, step.New( - chainHandler.Commands().StartCommand(flags...), - step.Stdout(os.Stdout), - step.Stderr(os.Stderr), - )) + return chainHandler.Commands(). + Copy( + chaincmdrunner.Stdout(os.Stdout), + chaincmdrunner.Stderr(os.Stderr)). + Start(ctx, flags...) }) // log connected peers info. @@ -443,7 +442,7 @@ func generateGenesis(ctx context.Context, chainInfo spn.Chain, launchInfo spn.La Coins: account.Coins.String(), } - if err := chainHandler.AddGenesisAccount(ctx, genesisAccount); err != nil { + if err := chainHandler.Commands().AddGenesisAccount(ctx, genesisAccount.Address, genesisAccount.Coins); err != nil { return err } } @@ -471,7 +470,7 @@ func generateGenesis(ctx context.Context, chainInfo spn.Chain, launchInfo spn.La } } if len(launchInfo.GenTxs) > 0 { - if err = chainHandler.CollectGentx(ctx); err != nil { + if err = chainHandler.Commands().CollectGentxs(ctx); err != nil { return err } } diff --git a/starport/services/networkbuilder/simulation.go b/starport/services/networkbuilder/simulation.go index b17c264c30..8becb289fd 100644 --- a/starport/services/networkbuilder/simulation.go +++ b/starport/services/networkbuilder/simulation.go @@ -1,7 +1,6 @@ package networkbuilder import ( - "bytes" "context" "errors" "fmt" @@ -18,8 +17,7 @@ import ( "github.com/otiai10/copy" "github.com/pelletier/go-toml" "github.com/tendermint/starport/starport/pkg/availableport" - "github.com/tendermint/starport/starport/pkg/cmdrunner" - "github.com/tendermint/starport/starport/pkg/cmdrunner/step" + chaincmdrunner "github.com/tendermint/starport/starport/pkg/chaincmd/runner" "github.com/tendermint/starport/starport/pkg/cosmosver" "github.com/tendermint/starport/starport/pkg/events" "github.com/tendermint/starport/starport/pkg/gomodulepath" @@ -91,14 +89,15 @@ func (b *Builder) VerifyProposals(ctx context.Context, chainID string, proposals return false, err } + runner := chainHandler.Commands(). + Copy( + chaincmdrunner.Stderr(commandOut), // This is the error of the verifying command, therefore this is the same as stdout + chaincmdrunner.Stdout(commandOut), + ) + // run validate-genesis command on the generated genesis b.ev.Send(events.New(events.StatusOngoing, "validating genesis format")) - err = cmdrunner.New().Run(ctx, step.New( - chainHandler.Commands().ValidateGenesisCommand(), - step.Stderr(commandOut), // This is the error of the verifying command, therefore this is the same as stdout - step.Stdout(commandOut), - )) - if err != nil { + if runner.ValidateGenesis(ctx); err != nil { return false, nil } b.ev.Send(events.New(events.StatusDone, "genesis correctly formatted")) @@ -116,23 +115,13 @@ func (b *Builder) VerifyProposals(ctx context.Context, chainID string, proposals // Go routine to start the app b.ev.Send(events.New(events.StatusOngoing, "starting chain")) go func() { - errBytes := &bytes.Buffer{} - err := cmdrunner.New().Run(ctx, step.New( - chainHandler.Commands().StartCommand(), - step.PostExec(func(exitErr error) error { - // If the error is validator set is nil, it means the genesis didn't get broken after a proposal - // The genesis was correctly generated but we don't have the necessary proposals to have a validator set - // after the execution of gentxs - if strings.Contains(errBytes.String(), ValidatorSetNilErrorMessage) { - return nil - } - - // We interpret any other error as if the genesis is broken - return exitErr - }), - step.Stderr(io.MultiWriter(commandOut, errBytes)), - step.Stdout(commandOut), - )) + err := runner.Start(ctx) + // If the error is validator set is nil, it means the genesis didn't get broken after a proposal + // The genesis was correctly generated but we don't have the necessary proposals to have a validator set + // after the execution of gentxs + if strings.Contains(err.Error(), ValidatorSetNilErrorMessage) { + err = nil + } exit <- err }() From e7f51cd18d250c8d52bc333acfa30657bd56b682 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Fri, 8 Jan 2021 11:36:11 +0300 Subject: [PATCH 11/15] refactor(services/chain): make New depend on the source code (#618) * refactor(services/chain): make New depend on the source code a part of #608. --- starport/interface/cli/starport/cmd/build.go | 2 +- .../interface/cli/starport/cmd/relayer.go | 4 ++-- starport/interface/cli/starport/cmd/serve.go | 2 +- starport/services/chain/chain.go | 13 ++++------- .../services/networkbuilder/blockchain.go | 2 +- .../services/networkbuilder/networkbuilder.go | 21 +++++------------ .../services/networkbuilder/simulation.go | 23 +++++++------------ 7 files changed, 23 insertions(+), 44 deletions(-) diff --git a/starport/interface/cli/starport/cmd/build.go b/starport/interface/cli/starport/cmd/build.go index a50407dee6..815785f8e5 100644 --- a/starport/interface/cli/starport/cmd/build.go +++ b/starport/interface/cli/starport/cmd/build.go @@ -30,7 +30,7 @@ func buildHandler(cmd *cobra.Command, args []string) error { ImportPath: path.RawPath, } - s, err := chain.New(app, false, logLevel(cmd)) + s, err := chain.New(app, logLevel(cmd)) if err != nil { return err } diff --git a/starport/interface/cli/starport/cmd/relayer.go b/starport/interface/cli/starport/cmd/relayer.go index aaab2a7226..8712e9d448 100644 --- a/starport/interface/cli/starport/cmd/relayer.go +++ b/starport/interface/cli/starport/cmd/relayer.go @@ -51,7 +51,7 @@ func relayerInfoHandler(cmd *cobra.Command, args []string) error { Path: appPath, } - s, err := chain.New(app, false, logLevel(cmd)) + s, err := chain.New(app, logLevel(cmd)) if err != nil { return err } @@ -73,7 +73,7 @@ func relayerAddHandler(cmd *cobra.Command, args []string) error { Path: appPath, } - s, err := chain.New(app, false, logLevel(cmd)) + s, err := chain.New(app, logLevel(cmd)) if err != nil { return err } diff --git a/starport/interface/cli/starport/cmd/serve.go b/starport/interface/cli/starport/cmd/serve.go index 979b8c436c..8a99631562 100644 --- a/starport/interface/cli/starport/cmd/serve.go +++ b/starport/interface/cli/starport/cmd/serve.go @@ -32,7 +32,7 @@ func serveHandler(cmd *cobra.Command, args []string) error { ImportPath: path.RawPath, } - s, err := chain.New(app, false, logLevel(cmd)) + s, err := chain.New(app, logLevel(cmd)) if err != nil { return err } diff --git a/starport/services/chain/chain.go b/starport/services/chain/chain.go index 8fa9bc0b6d..0aca970cfb 100644 --- a/starport/services/chain/chain.go +++ b/starport/services/chain/chain.go @@ -58,9 +58,7 @@ type Chain struct { stdout, stderr io.Writer } -// TODO document noCheck (basically it stands to enable Chain initialization without -// need of source code) -func New(app App, noCheck bool, logLevel LogLevel) (*Chain, error) { +func New(app App, logLevel LogLevel) (*Chain, error) { c := &Chain{ app: app, logLevel: logLevel, @@ -76,12 +74,9 @@ func New(app App, noCheck bool, logLevel LogLevel) (*Chain, error) { var err error - // Check - if !noCheck { - c.version, err = c.appVersion() - if err != nil && err != git.ErrRepositoryNotExists { - return nil, err - } + c.version, err = c.appVersion() + if err != nil && err != git.ErrRepositoryNotExists { + return nil, err } // initialize the plugin depending on the version of the chain diff --git a/starport/services/networkbuilder/blockchain.go b/starport/services/networkbuilder/blockchain.go index 57feb15007..d063c5c3fa 100644 --- a/starport/services/networkbuilder/blockchain.go +++ b/starport/services/networkbuilder/blockchain.go @@ -55,7 +55,7 @@ func (b *Blockchain) init(ctx context.Context, chainID string, mustNotInitialize Path: b.appPath, } - c, err := chain.New(app, false, chain.LogSilent) + c, err := chain.New(app, chain.LogSilent) if err != nil { return err } diff --git a/starport/services/networkbuilder/networkbuilder.go b/starport/services/networkbuilder/networkbuilder.go index ecb2ecc3b3..70e56d5b08 100644 --- a/starport/services/networkbuilder/networkbuilder.go +++ b/starport/services/networkbuilder/networkbuilder.go @@ -6,9 +6,7 @@ import ( "fmt" "io/ioutil" "math" - "net/url" "os" - "path" "path/filepath" "strings" "time" @@ -23,7 +21,6 @@ import ( "github.com/tendermint/starport/starport/pkg/availableport" chaincmdrunner "github.com/tendermint/starport/starport/pkg/chaincmd/runner" "github.com/tendermint/starport/starport/pkg/confile" - "github.com/tendermint/starport/starport/pkg/cosmosver" "github.com/tendermint/starport/starport/pkg/ctxticker" "github.com/tendermint/starport/starport/pkg/events" "github.com/tendermint/starport/starport/pkg/gomodulepath" @@ -301,23 +298,17 @@ func (b *Builder) StartChain(ctx context.Context, chainID string, flags []string return err } - // find out the app's name form url. - u, err := url.Parse(chainInfo.URL) + appPath := filepath.Join(sourcePath, chainID) + path, err := gomodulepath.ParseFile(appPath) if err != nil { return err } - importPath := path.Join(u.Host, u.Path) - path, err := gomodulepath.Parse(importPath) - if err != nil { - return err - } - app := chain.App{ - ChainID: chainID, - Name: path.Root, - Version: cosmosver.Stargate, + Name: path.Root, + Path: appPath, + ImportPath: path.RawPath, } - chainHandler, err := chain.New(app, true, chain.LogSilent) + chainHandler, err := chain.New(app, chain.LogSilent) if err != nil { return err } diff --git a/starport/services/networkbuilder/simulation.go b/starport/services/networkbuilder/simulation.go index 8becb289fd..e2a06dbd06 100644 --- a/starport/services/networkbuilder/simulation.go +++ b/starport/services/networkbuilder/simulation.go @@ -6,9 +6,7 @@ import ( "fmt" "io" "io/ioutil" - "net/url" "os" - "path" "path/filepath" "strings" "time" @@ -18,7 +16,6 @@ import ( "github.com/pelletier/go-toml" "github.com/tendermint/starport/starport/pkg/availableport" chaincmdrunner "github.com/tendermint/starport/starport/pkg/chaincmd/runner" - "github.com/tendermint/starport/starport/pkg/cosmosver" "github.com/tendermint/starport/starport/pkg/events" "github.com/tendermint/starport/starport/pkg/gomodulepath" "github.com/tendermint/starport/starport/pkg/httpstatuschecker" @@ -49,23 +46,19 @@ func (b *Builder) VerifyProposals(ctx context.Context, chainID string, proposals } defer os.RemoveAll(tmpHome) - // find out the app's name form url - u, err := url.Parse(chainInfo.URL) - if err != nil { - return false, err - } - importPath := path.Join(u.Host, u.Path) - path, err := gomodulepath.Parse(importPath) + appPath := filepath.Join(sourcePath, chainID) + path, err := gomodulepath.ParseFile(appPath) if err != nil { return false, err } app := chain.App{ - ChainID: chainID, - Name: path.Root, - Version: cosmosver.Stargate, - HomePath: tmpHome, + Name: path.Root, + Path: appPath, + ImportPath: path.RawPath, + HomePath: tmpHome, } - chainHandler, err := chain.New(app, true, chain.LogSilent) + + chainHandler, err := chain.New(app, chain.LogSilent) if err != nil { return false, err } From 9d17702ab0a6bb40b136b15747c30919fff21f85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Fri, 8 Jan 2021 20:57:56 +0300 Subject: [PATCH 12/15] refactor(cmd): replace cmd.getModule() (#620) * refactor(cmd): replace cmd.getModule() w/ gomodulepath.ParseAt(). solves a part of #609. * fix after merge --- starport/interface/cli/starport/cmd/build.go | 2 +- starport/interface/cli/starport/cmd/cmd.go | 14 -------------- starport/interface/cli/starport/cmd/relayer.go | 4 ++-- starport/interface/cli/starport/cmd/serve.go | 2 +- starport/pkg/gomodulepath/gomodulepath.go | 4 ++-- starport/services/networkbuilder/blockchain.go | 2 +- starport/services/networkbuilder/networkbuilder.go | 2 +- starport/services/networkbuilder/simulation.go | 2 +- starport/services/scaffolder/module.go | 4 ++-- starport/services/scaffolder/type.go | 2 +- 10 files changed, 12 insertions(+), 26 deletions(-) diff --git a/starport/interface/cli/starport/cmd/build.go b/starport/interface/cli/starport/cmd/build.go index 815785f8e5..da039b3911 100644 --- a/starport/interface/cli/starport/cmd/build.go +++ b/starport/interface/cli/starport/cmd/build.go @@ -20,7 +20,7 @@ func NewBuild() *cobra.Command { } func buildHandler(cmd *cobra.Command, args []string) error { - path, err := gomodulepath.Parse(getModule(appPath)) + path, err := gomodulepath.ParseAt(appPath) if err != nil { return err } diff --git a/starport/interface/cli/starport/cmd/cmd.go b/starport/interface/cli/starport/cmd/cmd.go index decd2ea7b5..9ffc62c94e 100644 --- a/starport/interface/cli/starport/cmd/cmd.go +++ b/starport/interface/cli/starport/cmd/cmd.go @@ -2,10 +2,6 @@ package starportcmd import ( "fmt" - "io/ioutil" - "log" - "path/filepath" - "strings" "github.com/fatih/color" "github.com/spf13/cobra" @@ -38,16 +34,6 @@ func New() *cobra.Command { return c } -func getModule(path string) string { - goModFile, err := ioutil.ReadFile(filepath.Join(path, "go.mod")) - if err != nil { - log.Fatal(err) - } - moduleString := strings.Split(string(goModFile), "\n")[0] - modulePath := strings.ReplaceAll(moduleString, "module ", "") - return modulePath -} - func logLevel(cmd *cobra.Command) chain.LogLevel { verbose, _ := cmd.Flags().GetBool("verbose") if verbose { diff --git a/starport/interface/cli/starport/cmd/relayer.go b/starport/interface/cli/starport/cmd/relayer.go index 8712e9d448..c7f628760d 100644 --- a/starport/interface/cli/starport/cmd/relayer.go +++ b/starport/interface/cli/starport/cmd/relayer.go @@ -42,7 +42,7 @@ func NewRelayerAdd() *cobra.Command { } func relayerInfoHandler(cmd *cobra.Command, args []string) error { - path, err := gomodulepath.Parse(getModule(appPath)) + path, err := gomodulepath.ParseAt(appPath) if err != nil { return err } @@ -64,7 +64,7 @@ func relayerInfoHandler(cmd *cobra.Command, args []string) error { } func relayerAddHandler(cmd *cobra.Command, args []string) error { - path, err := gomodulepath.Parse(getModule(appPath)) + path, err := gomodulepath.ParseAt(appPath) if err != nil { return err } diff --git a/starport/interface/cli/starport/cmd/serve.go b/starport/interface/cli/starport/cmd/serve.go index 8a99631562..a7f62661bf 100644 --- a/starport/interface/cli/starport/cmd/serve.go +++ b/starport/interface/cli/starport/cmd/serve.go @@ -22,7 +22,7 @@ func NewServe() *cobra.Command { } func serveHandler(cmd *cobra.Command, args []string) error { - path, err := gomodulepath.Parse(getModule(appPath)) + path, err := gomodulepath.ParseAt(appPath) if err != nil { return err } diff --git a/starport/pkg/gomodulepath/gomodulepath.go b/starport/pkg/gomodulepath/gomodulepath.go index 136375e2d4..517f31c957 100644 --- a/starport/pkg/gomodulepath/gomodulepath.go +++ b/starport/pkg/gomodulepath/gomodulepath.go @@ -48,8 +48,8 @@ func Parse(rawpath string) (Path, error) { return p, nil } -// ParseFile parses Go module path of an app resides at path. -func ParseFile(path string) (Path, error) { +// ParseAt parses Go module path of an app resides at path. +func ParseAt(path string) (Path, error) { parsed, err := gomodule.ParseAt(path) if err != nil { return Path{}, err diff --git a/starport/services/networkbuilder/blockchain.go b/starport/services/networkbuilder/blockchain.go index d063c5c3fa..f5c914c7e8 100644 --- a/starport/services/networkbuilder/blockchain.go +++ b/starport/services/networkbuilder/blockchain.go @@ -45,7 +45,7 @@ func newBlockchain(ctx context.Context, builder *Builder, chainID, appPath, url, func (b *Blockchain) init(ctx context.Context, chainID string, mustNotInitializedBefore bool) error { b.builder.ev.Send(events.New(events.StatusOngoing, "Initializing the blockchain")) - path, err := gomodulepath.ParseFile(b.appPath) + path, err := gomodulepath.ParseAt(b.appPath) if err != nil { return err } diff --git a/starport/services/networkbuilder/networkbuilder.go b/starport/services/networkbuilder/networkbuilder.go index 70e56d5b08..c1fd10b749 100644 --- a/starport/services/networkbuilder/networkbuilder.go +++ b/starport/services/networkbuilder/networkbuilder.go @@ -299,7 +299,7 @@ func (b *Builder) StartChain(ctx context.Context, chainID string, flags []string } appPath := filepath.Join(sourcePath, chainID) - path, err := gomodulepath.ParseFile(appPath) + path, err := gomodulepath.ParseAt(appPath) if err != nil { return err } diff --git a/starport/services/networkbuilder/simulation.go b/starport/services/networkbuilder/simulation.go index e2a06dbd06..3bf2ffd4de 100644 --- a/starport/services/networkbuilder/simulation.go +++ b/starport/services/networkbuilder/simulation.go @@ -47,7 +47,7 @@ func (b *Builder) VerifyProposals(ctx context.Context, chainID string, proposals defer os.RemoveAll(tmpHome) appPath := filepath.Join(sourcePath, chainID) - path, err := gomodulepath.ParseFile(appPath) + path, err := gomodulepath.ParseAt(appPath) if err != nil { return false, err } diff --git a/starport/services/scaffolder/module.go b/starport/services/scaffolder/module.go index cc8902e07e..93761227ac 100644 --- a/starport/services/scaffolder/module.go +++ b/starport/services/scaffolder/module.go @@ -39,7 +39,7 @@ func (s *Scaffolder) CreateModule(moduleName string) error { if ok { return fmt.Errorf("the module %v already exists", moduleName) } - path, err := gomodulepath.ParseFile(s.path) + path, err := gomodulepath.ParseAt(s.path) if err != nil { return err } @@ -96,7 +96,7 @@ func (s *Scaffolder) ImportModule(name string) error { return err } - path, err := gomodulepath.ParseFile(s.path) + path, err := gomodulepath.ParseAt(s.path) if err != nil { return err } diff --git a/starport/services/scaffolder/type.go b/starport/services/scaffolder/type.go index bc80d364ef..701b7d41d1 100644 --- a/starport/services/scaffolder/type.go +++ b/starport/services/scaffolder/type.go @@ -28,7 +28,7 @@ func (s *Scaffolder) AddType(moduleName string, stype string, fields ...string) if err != nil { return err } - path, err := gomodulepath.ParseFile(s.path) + path, err := gomodulepath.ParseAt(s.path) if err != nil { return err } From 23dcfa8aa0bb28d342df52536628b106e82c4274 Mon Sep 17 00:00:00 2001 From: Lucas Bertrand Date: Fri, 8 Jan 2021 18:59:00 +0100 Subject: [PATCH 13/15] fix(template): use HomeDir from clientCtx RegisterTxService --- starport/templates/app/stargate/app/app.go.plush | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/starport/templates/app/stargate/app/app.go.plush b/starport/templates/app/stargate/app/app.go.plush index a9f4a61575..dded4212d4 100644 --- a/starport/templates/app/stargate/app/app.go.plush +++ b/starport/templates/app/stargate/app/app.go.plush @@ -542,7 +542,7 @@ func (app *App) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig func (app *App) RegisterTxService(clientCtx client.Context) { // TODO remove this workaround after https://github.com/cosmos/cosmos-sdk/pull/7840 has merged. // -- right now, clientCtx does not have a Client set. this workaround fixes that. - config, err := toml.LoadFile(filepath.Join(DefaultNodeHome(""), "config/config.toml")) + config, err := toml.LoadFile(filepath.Join(clientCtx.HomeDir, "config/config.toml")) if err != nil { panic(err) } From 603ce6ecd83c19d3fcccf8e49995d649f8739cd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lker=20G=2E=20=C3=96zt=C3=BCrk?= Date: Sun, 10 Jan 2021 12:24:39 +0300 Subject: [PATCH 14/15] refactor(services/chain): refactor initialization with New() (#621) * refactor(cmd): replace cmd.getModule() w/ gomodulepath.ParseAt(). solves a part of #609. * fix after merge * refactor(services/chain): refactor initialization of New() make the required and optional fields explicit to prevent incorrect initializations. resolves #619. solves a part of #608. * fix linter --- starport/interface/cli/starport/cmd/build.go | 13 +-- starport/interface/cli/starport/cmd/cmd.go | 2 +- .../interface/cli/starport/cmd/relayer.go | 23 +---- starport/interface/cli/starport/cmd/serve.go | 13 +-- starport/services/chain/app.go | 23 +++-- starport/services/chain/chain.go | 84 ++++++++++++++----- starport/services/chain/plugin.go | 10 +-- .../services/networkbuilder/blockchain.go | 18 +--- .../services/networkbuilder/networkbuilder.go | 12 +-- .../services/networkbuilder/simulation.go | 17 +--- 10 files changed, 95 insertions(+), 120 deletions(-) diff --git a/starport/interface/cli/starport/cmd/build.go b/starport/interface/cli/starport/cmd/build.go index da039b3911..707e2c0854 100644 --- a/starport/interface/cli/starport/cmd/build.go +++ b/starport/interface/cli/starport/cmd/build.go @@ -2,7 +2,6 @@ package starportcmd import ( "github.com/spf13/cobra" - "github.com/tendermint/starport/starport/pkg/gomodulepath" "github.com/tendermint/starport/starport/services/chain" ) @@ -20,17 +19,7 @@ func NewBuild() *cobra.Command { } func buildHandler(cmd *cobra.Command, args []string) error { - path, err := gomodulepath.ParseAt(appPath) - if err != nil { - return err - } - app := chain.App{ - Name: path.Root, - Path: appPath, - ImportPath: path.RawPath, - } - - s, err := chain.New(app, logLevel(cmd)) + s, err := chain.New(appPath, chain.LogLevel(logLevel(cmd))) if err != nil { return err } diff --git a/starport/interface/cli/starport/cmd/cmd.go b/starport/interface/cli/starport/cmd/cmd.go index 9ffc62c94e..9061763fb8 100644 --- a/starport/interface/cli/starport/cmd/cmd.go +++ b/starport/interface/cli/starport/cmd/cmd.go @@ -34,7 +34,7 @@ func New() *cobra.Command { return c } -func logLevel(cmd *cobra.Command) chain.LogLevel { +func logLevel(cmd *cobra.Command) chain.LogLvl { verbose, _ := cmd.Flags().GetBool("verbose") if verbose { return chain.LogVerbose diff --git a/starport/interface/cli/starport/cmd/relayer.go b/starport/interface/cli/starport/cmd/relayer.go index c7f628760d..92cb769cda 100644 --- a/starport/interface/cli/starport/cmd/relayer.go +++ b/starport/interface/cli/starport/cmd/relayer.go @@ -4,7 +4,6 @@ import ( "fmt" "github.com/spf13/cobra" - "github.com/tendermint/starport/starport/pkg/gomodulepath" "github.com/tendermint/starport/starport/services/chain" ) @@ -42,16 +41,7 @@ func NewRelayerAdd() *cobra.Command { } func relayerInfoHandler(cmd *cobra.Command, args []string) error { - path, err := gomodulepath.ParseAt(appPath) - if err != nil { - return err - } - app := chain.App{ - Name: path.Root, - Path: appPath, - } - - s, err := chain.New(app, logLevel(cmd)) + s, err := chain.New(appPath, chain.LogLevel(logLevel(cmd))) if err != nil { return err } @@ -64,16 +54,7 @@ func relayerInfoHandler(cmd *cobra.Command, args []string) error { } func relayerAddHandler(cmd *cobra.Command, args []string) error { - path, err := gomodulepath.ParseAt(appPath) - if err != nil { - return err - } - app := chain.App{ - Name: path.Root, - Path: appPath, - } - - s, err := chain.New(app, logLevel(cmd)) + s, err := chain.New(appPath, chain.LogLevel(logLevel(cmd))) if err != nil { return err } diff --git a/starport/interface/cli/starport/cmd/serve.go b/starport/interface/cli/starport/cmd/serve.go index a7f62661bf..4c5bb035d7 100644 --- a/starport/interface/cli/starport/cmd/serve.go +++ b/starport/interface/cli/starport/cmd/serve.go @@ -2,7 +2,6 @@ package starportcmd import ( "github.com/spf13/cobra" - "github.com/tendermint/starport/starport/pkg/gomodulepath" "github.com/tendermint/starport/starport/services/chain" ) @@ -22,17 +21,7 @@ func NewServe() *cobra.Command { } func serveHandler(cmd *cobra.Command, args []string) error { - path, err := gomodulepath.ParseAt(appPath) - if err != nil { - return err - } - app := chain.App{ - Name: path.Root, - Path: appPath, - ImportPath: path.RawPath, - } - - s, err := chain.New(app, logLevel(cmd)) + s, err := chain.New(appPath, chain.LogLevel(logLevel(cmd))) if err != nil { return err } diff --git a/starport/services/chain/app.go b/starport/services/chain/app.go index 9182707790..eb00a285d6 100644 --- a/starport/services/chain/app.go +++ b/starport/services/chain/app.go @@ -4,17 +4,27 @@ import ( "path/filepath" "strings" - "github.com/tendermint/starport/starport/pkg/cosmosver" + "github.com/tendermint/starport/starport/pkg/gomodulepath" ) // App keeps info about chain. type App struct { - ChainID string - Version cosmosver.MajorVersion Name string Path string ImportPath string - HomePath string +} + +// NewAppAt creates an App from the blockchain source code located at path. +func NewAppAt(path string) (App, error) { + p, err := gomodulepath.ParseAt(path) + if err != nil { + return App{}, err + } + return App{ + Path: path, + Name: p.Root, + ImportPath: p.RawPath, + }, nil } // N returns app name without dashes. @@ -47,8 +57,3 @@ func (a App) Root() string { path, _ := filepath.Abs(a.Path) return path } - -// Home returns the node's home dir. -func (a App) Home() string { - return a.HomePath -} diff --git a/starport/services/chain/chain.go b/starport/services/chain/chain.go index 0aca970cfb..2fe9c05ed5 100644 --- a/starport/services/chain/chain.go +++ b/starport/services/chain/chain.go @@ -8,11 +8,10 @@ import ( "os" "strings" - "github.com/tendermint/starport/starport/pkg/chaincmd" - chaincmdrunner "github.com/tendermint/starport/starport/pkg/chaincmd/runner" - "github.com/go-git/go-git/v5" "github.com/gookit/color" + "github.com/tendermint/starport/starport/pkg/chaincmd" + chaincmdrunner "github.com/tendermint/starport/starport/pkg/chaincmd/runner" "github.com/tendermint/starport/starport/pkg/cosmosver" "github.com/tendermint/starport/starport/services/chain/conf" secretconf "github.com/tendermint/starport/starport/services/chain/conf/secret" @@ -39,41 +38,87 @@ type version struct { hash string } -type LogLevel int +type LogLvl int const ( - LogSilent LogLevel = iota + LogSilent LogLvl = iota LogRegular LogVerbose ) +// Chain provides programatic access and tools for a Cosmos SDK blockchain. type Chain struct { - app App + // app holds info about blockchain app. + app App + + options chainOptions + plugin Plugin version version - logLevel LogLevel + logLevel LogLvl cmd chaincmdrunner.Runner serveCancel context.CancelFunc serveRefresher chan struct{} stdout, stderr io.Writer } -func New(app App, logLevel LogLevel) (*Chain, error) { +// chainOptions holds user given options that overwrites chain's defaults. +type chainOptions struct { + // chainID is the chain's id. + chainID string + + // homePath of the chain's config dir. + homePath string +} + +// Option configures Chain. +type Option func(*Chain) + +// LogLevel sets logging level. +func LogLevel(level LogLvl) Option { + return func(c *Chain) { + c.logLevel = level + } +} + +// ID replaces chain's id with given id. +func ID(id string) Option { + return func(c *Chain) { + c.options.chainID = id + } +} + +// HomePath replaces chain's configuration home path with given path. +func HomePath(path string) Option { + return func(c *Chain) { + c.options.homePath = path + } +} + +// New initializes a new Chain with options that its source lives at path. +func New(path string, options ...Option) (*Chain, error) { + app, err := NewAppAt(path) + if err != nil { + return nil, err + } + c := &Chain{ app: app, - logLevel: logLevel, + logLevel: LogSilent, serveRefresher: make(chan struct{}, 1), stdout: ioutil.Discard, stderr: ioutil.Discard, } - if logLevel == LogVerbose { + for _, apply := range options { + apply(c) + } + + if c.logLevel == LogVerbose { c.stdout = os.Stdout c.stderr = os.Stderr } - var err error - c.version, err = c.appVersion() if err != nil && err != git.ErrRepositoryNotExists { return nil, err @@ -98,12 +143,12 @@ func New(app App, logLevel LogLevel) (*Chain, error) { } if c.plugin.Version() == cosmosver.Launchpad { ccoptions = append(ccoptions, - chaincmd.WithLaunchpad(app.CLI()), + chaincmd.WithLaunchpad(c.app.CLI()), //chaincmd.WithLaunchpadCLIHome(), ) } - cc := chaincmd.New(app.D(), ccoptions...) + cc := chaincmd.New(c.app.D(), ccoptions...) ccroptions := []chaincmdrunner.Option{} if c.logLevel == LogVerbose { @@ -171,8 +216,8 @@ func (c *Chain) Config() (conf.Config, error) { // ID returns the chain's id. func (c *Chain) ID() (string, error) { // chainID in App has the most priority. - if c.app.ChainID != "" { - return c.app.ChainID, nil + if c.options.chainID != "" { + return c.options.chainID, nil } // otherwise uses defined in config.yml @@ -191,11 +236,10 @@ func (c *Chain) ID() (string, error) { // Home returns the blockchain node's home dir. func (c *Chain) Home() string { - appHome := c.app.Home() - if appHome == "" { - return c.DefaultHome() + if c.options.homePath != "" { + return c.options.homePath } - return appHome + return c.DefaultHome() } // DefaultHome returns the blockchain node's default home dir when not specified. diff --git a/starport/services/chain/plugin.go b/starport/services/chain/plugin.go index dcb812b4a0..f176b63780 100644 --- a/starport/services/chain/plugin.go +++ b/starport/services/chain/plugin.go @@ -45,13 +45,9 @@ type Plugin interface { } func (c *Chain) pickPlugin() (Plugin, error) { - version := c.app.Version - if version == "" { - var err error - version, err = cosmosver.Detect(c.app.Path) - if err != nil { - return nil, err - } + version, err := cosmosver.Detect(c.app.Path) + if err != nil { + return nil, err } switch version { case cosmosver.Launchpad: diff --git a/starport/services/networkbuilder/blockchain.go b/starport/services/networkbuilder/blockchain.go index f5c914c7e8..e12112a456 100644 --- a/starport/services/networkbuilder/blockchain.go +++ b/starport/services/networkbuilder/blockchain.go @@ -11,7 +11,6 @@ import ( "github.com/tendermint/starport/starport/pkg/chaincmd" "github.com/tendermint/starport/starport/pkg/cosmosver" "github.com/tendermint/starport/starport/pkg/events" - "github.com/tendermint/starport/starport/pkg/gomodulepath" "github.com/tendermint/starport/starport/pkg/jsondoc" "github.com/tendermint/starport/starport/pkg/spn" "github.com/tendermint/starport/starport/pkg/xchisel" @@ -25,7 +24,6 @@ type Blockchain struct { url string hash string chain *chain.Chain - app chain.App builder *Builder } @@ -45,17 +43,10 @@ func newBlockchain(ctx context.Context, builder *Builder, chainID, appPath, url, func (b *Blockchain) init(ctx context.Context, chainID string, mustNotInitializedBefore bool) error { b.builder.ev.Send(events.New(events.StatusOngoing, "Initializing the blockchain")) - path, err := gomodulepath.ParseAt(b.appPath) - if err != nil { - return err - } - app := chain.App{ - ChainID: chainID, - Name: path.Root, - Path: b.appPath, - } - - c, err := chain.New(app, chain.LogSilent) + c, err := chain.New(b.appPath, + chain.ID(chainID), + chain.LogLevel(chain.LogSilent), + ) if err != nil { return err } @@ -95,7 +86,6 @@ func (b *Blockchain) init(ctx context.Context, chainID string, mustNotInitialize } b.chain = c - b.app = app return nil } diff --git a/starport/services/networkbuilder/networkbuilder.go b/starport/services/networkbuilder/networkbuilder.go index c1fd10b749..a0cd42833f 100644 --- a/starport/services/networkbuilder/networkbuilder.go +++ b/starport/services/networkbuilder/networkbuilder.go @@ -23,7 +23,6 @@ import ( "github.com/tendermint/starport/starport/pkg/confile" "github.com/tendermint/starport/starport/pkg/ctxticker" "github.com/tendermint/starport/starport/pkg/events" - "github.com/tendermint/starport/starport/pkg/gomodulepath" "github.com/tendermint/starport/starport/pkg/spn" "github.com/tendermint/starport/starport/pkg/tendermintrpc" "github.com/tendermint/starport/starport/pkg/xchisel" @@ -299,16 +298,7 @@ func (b *Builder) StartChain(ctx context.Context, chainID string, flags []string } appPath := filepath.Join(sourcePath, chainID) - path, err := gomodulepath.ParseAt(appPath) - if err != nil { - return err - } - app := chain.App{ - Name: path.Root, - Path: appPath, - ImportPath: path.RawPath, - } - chainHandler, err := chain.New(app, chain.LogSilent) + chainHandler, err := chain.New(appPath, chain.LogLevel(chain.LogSilent)) if err != nil { return err } diff --git a/starport/services/networkbuilder/simulation.go b/starport/services/networkbuilder/simulation.go index 3bf2ffd4de..781a1b03ad 100644 --- a/starport/services/networkbuilder/simulation.go +++ b/starport/services/networkbuilder/simulation.go @@ -17,7 +17,6 @@ import ( "github.com/tendermint/starport/starport/pkg/availableport" chaincmdrunner "github.com/tendermint/starport/starport/pkg/chaincmd/runner" "github.com/tendermint/starport/starport/pkg/events" - "github.com/tendermint/starport/starport/pkg/gomodulepath" "github.com/tendermint/starport/starport/pkg/httpstatuschecker" "github.com/tendermint/starport/starport/pkg/xurl" "github.com/tendermint/starport/starport/services/chain" @@ -47,18 +46,10 @@ func (b *Builder) VerifyProposals(ctx context.Context, chainID string, proposals defer os.RemoveAll(tmpHome) appPath := filepath.Join(sourcePath, chainID) - path, err := gomodulepath.ParseAt(appPath) - if err != nil { - return false, err - } - app := chain.App{ - Name: path.Root, - Path: appPath, - ImportPath: path.RawPath, - HomePath: tmpHome, - } - - chainHandler, err := chain.New(app, chain.LogSilent) + chainHandler, err := chain.New(appPath, + chain.HomePath(tmpHome), + chain.LogLevel(chain.LogSilent), + ) if err != nil { return false, err } From db5e1bbd97926b7d4a9cbf84a1fefdcd28e72a0d Mon Sep 17 00:00:00 2001 From: Lucas Bertrand Date: Mon, 11 Jan 2021 17:25:31 +0100 Subject: [PATCH 15/15] refactor: update Stargate version to v0.40.0 (#622) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove workaround * Update cosmos version * Update templates * migrate to SDK version of v0.40.0 * migrate x/client * fix integration test * update relayer to 1daec66 * support both v0.40.0 and v0.40.0-rc-X versions of Stargate * linter * template: fix client cmd tx * fix relayer * docs * docs Co-authored-by: İlker Göktuğ ÖZTÜRK --- .github/workflows/test-integration.yml | 2 +- .github/workflows/test-relayer.yml | 2 +- .gitpod.yml | 2 +- docs/1 Introduction/6 Starport IBC.md | 2 +- go.mod | 2 +- go.sum | 4 +- integration/integration_test.go | 2 +- integration/tx_test.go | 6 +- starport/pkg/chaincmd/chaincmd.go | 79 +++++++++++++++--- starport/pkg/chaincmd/launchpad.go | 30 ------- starport/pkg/chaincmd/stargate.go | 28 ------- starport/pkg/cosmosver/cosmosver.go | 80 +++++++++++++------ starport/pkg/cosmosver/detect.go | 36 +++++++++ starport/services/chain/build.go | 4 +- starport/services/chain/chain.go | 17 ++-- starport/services/chain/plugin.go | 12 +-- starport/services/chain/relayer.go | 4 +- starport/services/chain/rly/relayer.go | 2 +- starport/services/chain/serve.go | 2 +- starport/services/scaffolder/scaffolder.go | 6 +- .../templates/app/stargate/app/app.go.plush | 56 ++++++------- .../app/stargate/app/genesis.go.plush | 7 +- .../{{binaryNamePrefix}}d/cmd/app.go.plush | 3 - .../cmd/genaccounts.go.plush | 4 +- .../{{binaryNamePrefix}}d/cmd/root.go.plush | 72 ++++++++--------- .../cmd/{{binaryNamePrefix}}d/main.go.plush | 4 +- starport/templates/app/stargate/go.mod.plush | 14 ++-- starport/templates/app/stargate/go.sum | 70 +++++++++++----- .../client/cli/query{{TypeName}}.go.plush | 12 +-- .../client/cli/tx{{TypeName}}.go.plush | 9 +-- 30 files changed, 332 insertions(+), 241 deletions(-) delete mode 100644 starport/pkg/chaincmd/stargate.go create mode 100644 starport/pkg/cosmosver/detect.go delete mode 100644 starport/templates/app/stargate/cmd/{{binaryNamePrefix}}d/cmd/app.go.plush diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index 36a08e048d..66421a2525 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -26,7 +26,7 @@ jobs: run: go get -u github.com/gobuffalo/packr/v2/packr2 - name: Set up relayer - run: git clone https://github.com/ovrclk/relayer && cd relayer && git checkout 3080dab10e37e6db9e691c343b1c0cdb6d845753 && make install + run: git clone https://github.com/cosmos/relayer && cd relayer && git checkout 1daec66da1700c9fcd8900dbf06c70f2fd838cdf && make install - name: Checkout uses: actions/checkout@v2 diff --git a/.github/workflows/test-relayer.yml b/.github/workflows/test-relayer.yml index 70474dd753..5a90b7e605 100644 --- a/.github/workflows/test-relayer.yml +++ b/.github/workflows/test-relayer.yml @@ -26,7 +26,7 @@ jobs: run: go get -u github.com/gobuffalo/packr/v2/packr2 - name: Set up relayer - run: git clone https://github.com/ovrclk/relayer && cd relayer && git checkout 3080dab10e37e6db9e691c343b1c0cdb6d845753 && make install + run: git clone https://github.com/cosmos/relayer && cd relayer && git checkout 1daec66da1700c9fcd8900dbf06c70f2fd838cdf && make install - name: Checkout uses: actions/checkout@v2 diff --git a/.gitpod.yml b/.gitpod.yml index cb6f04caf8..5eb32811bf 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -14,7 +14,7 @@ tasks: brew install gh # install rly - (cd /tmp && git clone https://github.com/ovrclk/relayer && cd relayer && git checkout 3080dab10e37e6db9e691c343b1c0cdb6d845753 && make -C /tmp/relayer install) + (cd /tmp && git clone https://github.com/cosmos/relayer && cd relayer && git checkout 1daec66da1700c9fcd8900dbf06c70f2fd838cdf && make -C /tmp/relayer install) command: | export VUE_APP_CUSTOM_URL=$(gp url) diff --git a/docs/1 Introduction/6 Starport IBC.md b/docs/1 Introduction/6 Starport IBC.md index e449571ecf..71cbe5bacd 100644 --- a/docs/1 Introduction/6 Starport IBC.md +++ b/docs/1 Introduction/6 Starport IBC.md @@ -50,7 +50,7 @@ The two chains are now connected via IBC and you have successfully created a rel ## Sending tokens from `foo` to `bar` -Once the chains are connected, you can use a [relayer](https://github.com/ovrclk/relayer) CLI `rly` to create an IBC token send transaction: +Once the chains are connected, you can use a [relayer](https://github.com/cosmos/relayer) CLI `rly` to create an IBC token send transaction: ``` rly tx transfer foo bar 5token $(rly chains address bar) diff --git a/go.mod b/go.mod index 9e33fcd0da..6cfd48e306 100644 --- a/go.mod +++ b/go.mod @@ -49,7 +49,7 @@ require ( golang.org/x/mod v0.4.0 golang.org/x/net v0.0.0-20201021035429-f5854403a974 // indirect golang.org/x/sync v0.0.0-20201207232520-09787c993a3a - golang.org/x/sys v0.0.0-20210105210732-16f7687f5001 // indirect + golang.org/x/sys v0.0.0-20210110051926-789bb1bd4061 // indirect golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154 // indirect google.golang.org/grpc v1.33.0 diff --git a/go.sum b/go.sum index 8a9c14c8a8..985b0c314e 100644 --- a/go.sum +++ b/go.sum @@ -928,8 +928,8 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210105210732-16f7687f5001 h1:/dSxr6gT0FNI1MO5WLJo8mTmItROeOKTkDn+7OwWBos= -golang.org/x/sys v0.0.0-20210105210732-16f7687f5001/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210110051926-789bb1bd4061 h1:DQmQoKxQWtyybCtX/3dIuDBcAhFszqq8YiNeS6sNu1c= +golang.org/x/sys v0.0.0-20210110051926-789bb1bd4061/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/integration/integration_test.go b/integration/integration_test.go index fee0162d83..73aee68637 100644 --- a/integration/integration_test.go +++ b/integration/integration_test.go @@ -17,7 +17,7 @@ import ( ) const ( - relayerVersion = "3080dab10e37e6db9e691c343b1c0cdb6d845753" + relayerVersion = "1daec66da1700c9fcd8900dbf06c70f2fd838cdf" ) func TestMain(m *testing.M) { diff --git a/integration/tx_test.go b/integration/tx_test.go index 282924053c..ed641e686e 100644 --- a/integration/tx_test.go +++ b/integration/tx_test.go @@ -6,11 +6,11 @@ import ( "bytes" "context" "encoding/json" - "errors" "fmt" "net/http" "testing" + "github.com/pkg/errors" "github.com/stretchr/testify/require" "github.com/tendermint/starport/starport/pkg/cmdrunner" "github.com/tendermint/starport/starport/pkg/cmdrunner/step" @@ -117,10 +117,10 @@ func TestGetTxViaGRPCGateway(t *testing.T) { return err } - addr := fmt.Sprintf("%s/cosmos/tx/v1beta1/tx/%s", xurl.HTTP(servers.APIAddr), tx.Hash) + addr := fmt.Sprintf("%s/cosmos/tx/v1beta1/txs/%s", xurl.HTTP(servers.APIAddr), tx.Hash) req, err := http.NewRequestWithContext(ctx, http.MethodGet, addr, nil) if err != nil { - return err + return errors.Wrap(err, "call to get tx via gRPC gateway") } resp, err := http.DefaultClient.Do(req) if err != nil { diff --git a/starport/pkg/chaincmd/chaincmd.go b/starport/pkg/chaincmd/chaincmd.go index fcf95affde..564e225c2c 100644 --- a/starport/pkg/chaincmd/chaincmd.go +++ b/starport/pkg/chaincmd/chaincmd.go @@ -1,6 +1,9 @@ package chaincmd -import "github.com/tendermint/starport/starport/pkg/cmdrunner/step" +import ( + "github.com/tendermint/starport/starport/pkg/cmdrunner/step" + "github.com/tendermint/starport/starport/pkg/cosmosver" +) const ( commandStart = "start" @@ -47,12 +50,15 @@ type ChainCmd struct { keyringBackend KeyringBackend cliCmd string cliHome string + + sdkVersion cosmosver.Version } // New creates a new ChainCmd to launch command with the chain app func New(appCmd string, options ...Option) ChainCmd { chainCmd := ChainCmd{ - appCmd: appCmd, + appCmd: appCmd, + sdkVersion: cosmosver.Versions.Latest(), } // Apply the options provided by the user @@ -63,8 +69,17 @@ func New(appCmd string, options ...Option) ChainCmd { return chainCmd } +// Option configures ChainCmd. type Option func(*ChainCmd) +// WithVersion sets the version of the blockchain. +// when this is not provided, latest version of SDK is assumed. +func WithVersion(v cosmosver.Version) Option { + return func(c *ChainCmd) { + c.sdkVersion = v + } +} + // WithHome replaces the default home used by the chain func WithHome(home string) Option { return func(c *ChainCmd) { @@ -86,14 +101,22 @@ func WithKeyringBackend(keyringBackend KeyringBackend) Option { } } -// WithLaunchpad defines the command as Launchpad application commands -// and provides the name of the CLI application to call Launchpad CLI commands -func WithLaunchpad(cliCmd string) Option { +// WithSecondaryCLI provides the secondary CLI name for the blockchain. +// this is useful for Launchpad applications since it has two different binaries but +// not needed by Stargate applications. +func WithSecondaryCLI(cliCmd string) Option { return func(c *ChainCmd) { c.cliCmd = cliCmd } } +// WithSecondaryCLIHome replaces the default home used by the Launchpad chain CLI +func WithSecondaryCLIHome(cliHome string) Option { + return func(c *ChainCmd) { + c.cliHome = cliHome + } +} + // StartCommand returns the command to start the daemon of the chain func (c ChainCmd) StartCommand(options ...string) step.Option { command := append([]string{ @@ -244,11 +267,47 @@ func (c ChainCmd) GentxCommand( selfDelegation string, options ...GentxOption, ) step.Option { - // Check version - if c.isStargate() { - return c.stargateGentxCommand(validatorName, selfDelegation, options...) + command := []string{ + commandGentx, + } + + if c.sdkVersion.Is(cosmosver.StargateZeroFourtyAndAbove) { + command = append(command, + validatorName, + selfDelegation, + ) } - return c.launchpadGentxCommand(validatorName, selfDelegation, options...) + + if c.sdkVersion.Is(cosmosver.StargateBelowZeroFourty) { + command = append(command, + validatorName, + optionAmount, + selfDelegation, + ) + } + + if c.sdkVersion.Is(cosmosver.LaunchpadAny) { + command = append(command, + optionName, + validatorName, + optionAmount, + selfDelegation, + ) + } + + // Apply the options provided by the user + for _, applyOption := range options { + command = applyOption(command) + } + + // Add necessary flags + if c.sdkVersion.Major().Is(cosmosver.Stargate) { + command = c.attachChainID(command) + } + + command = c.attachKeyringBackend(command) + + return c.daemonCommand(command) } // CollectGentxsCommand returns the command to gather the gentxs in /gentx dir into the genesis file of the chain @@ -320,7 +379,7 @@ func (c ChainCmd) attachHome(command []string) []string { // isStargate checks if the version for commands is Stargate func (c ChainCmd) isStargate() bool { - return c.cliCmd == "" + return c.sdkVersion.Major() == cosmosver.Stargate } // daemonCommand returns the daemon command from the provided command diff --git a/starport/pkg/chaincmd/launchpad.go b/starport/pkg/chaincmd/launchpad.go index cb81a106dd..afd24b2bb6 100644 --- a/starport/pkg/chaincmd/launchpad.go +++ b/starport/pkg/chaincmd/launchpad.go @@ -12,36 +12,6 @@ const ( optionName = "--name" ) -// WithLaunchpadCLIHome replaces the default home used by the Launchpad chain CLI -func WithLaunchpadCLIHome(cliHome string) Option { - return func(c *ChainCmd) { - c.cliHome = cliHome - } -} - -// launchpadGentxCommand returns the command to generate a gentx for the chain -func (c ChainCmd) launchpadGentxCommand( - validatorName string, - selfDelegation string, - options ...GentxOption, -) step.Option { - command := []string{ - commandGentx, - optionName, - validatorName, - optionAmount, - selfDelegation, - } - - // Apply the options provided by the user - for _, applyOption := range options { - command = applyOption(command) - } - - command = c.attachKeyringBackend(command) - return c.daemonCommand(command) -} - // launchpadSetConfigCommand func (c ChainCmd) launchpadSetConfigCommand(name string, value string) step.Option { command := []string{ diff --git a/starport/pkg/chaincmd/stargate.go b/starport/pkg/chaincmd/stargate.go deleted file mode 100644 index db734cefbb..0000000000 --- a/starport/pkg/chaincmd/stargate.go +++ /dev/null @@ -1,28 +0,0 @@ -package chaincmd - -import "github.com/tendermint/starport/starport/pkg/cmdrunner/step" - -// stargateGentxCommand returns the command to generate a gentx for the chain -func (c ChainCmd) stargateGentxCommand( - validatorName string, - selfDelegation string, - options ...GentxOption, -) step.Option { - command := []string{ - commandGentx, - validatorName, - optionAmount, - selfDelegation, - } - - // Apply the options provided by the user - for _, applyOption := range options { - command = applyOption(command) - } - - // Add necessary flags - command = c.attachChainID(command) - command = c.attachKeyringBackend(command) - - return c.daemonCommand(command) -} diff --git a/starport/pkg/cosmosver/cosmosver.go b/starport/pkg/cosmosver/cosmosver.go index 6b4b724e2a..b02d66b001 100644 --- a/starport/pkg/cosmosver/cosmosver.go +++ b/starport/pkg/cosmosver/cosmosver.go @@ -3,13 +3,8 @@ package cosmosver import ( "fmt" "strings" - - "github.com/tendermint/starport/starport/pkg/gomodule" - "golang.org/x/mod/semver" ) -type MajorVersion string - const ( // Launchpad points to Launchpad version of Cosmos-SDK. Launchpad MajorVersion = "launchpad" @@ -18,30 +13,63 @@ const ( Stargate MajorVersion = "stargate" ) +const ( + LaunchpadAny Version = iota + + StargateBelowZeroFourty + + StargateZeroFourtyAndAbove +) + // MajorVersions are the list of supported Cosmos-SDK major versions. -var MajorVersions = majorVersions{Launchpad, Stargate} +var ( + MajorVersions = majorVersions{ + Launchpad, + Stargate, + } -const ( - referenceModulePath = "github.com/cosmos/cosmos-sdk" - referenceModuleLatestTag = "v0.39.99" + Versions = versions{ + LaunchpadAny, + StargateBelowZeroFourty, + StargateZeroFourtyAndAbove, + } ) -// Detect dedects major version of Cosmos. -func Detect(appPath string) (MajorVersion, error) { - parsed, err := gomodule.ParseAt(appPath) - if err != nil { - return "", err +// MajorVersion represents major, named versions of Cosmos-SDK. +type MajorVersion string + +func (v MajorVersion) Is(comparedTo MajorVersion) bool { + return v == comparedTo +} + +// Version represents a range of Cosmos-SDK versions. +type Version int + +func (v Version) Is(comparedTo Version) bool { + return v == comparedTo +} + +// Major returns the MajorVersion of the version. +func (v Version) Major() MajorVersion { + switch v { + case StargateBelowZeroFourty, StargateZeroFourtyAndAbove: + return Stargate + default: + return Launchpad } - for _, r := range parsed.Require { - v := r.Mod - if v.Path == referenceModulePath { - if semver.Compare(v.Version, referenceModuleLatestTag) >= 0 { - return Stargate, nil - } - break - } +} + +func (v Version) String() string { + switch v { + case StargateZeroFourtyAndAbove: + return "Stargate v0.40.0 (or above)" + + case StargateBelowZeroFourty: + return "Stargate v0.40.0 (pre-release)" + + default: + return "Launchpad" } - return Launchpad, nil } type majorVersions []MajorVersion @@ -65,3 +93,9 @@ func (v majorVersions) String() string { } return strings.TrimSpace(vs) } + +type versions []Version + +func (v versions) Latest() Version { + return v[len(v)-1] +} diff --git a/starport/pkg/cosmosver/detect.go b/starport/pkg/cosmosver/detect.go new file mode 100644 index 0000000000..73480de66f --- /dev/null +++ b/starport/pkg/cosmosver/detect.go @@ -0,0 +1,36 @@ +package cosmosver + +import ( + "github.com/tendermint/starport/starport/pkg/gomodule" + "golang.org/x/mod/semver" +) + +const ( + cosmosModulePath = "github.com/cosmos/cosmos-sdk" + cosmosModuleMaxLaunchpadTag = "v0.39.99" + cosmosModuleStargateTag = "v0.40.0" +) + +// Detect dedects major version of Cosmos. +func Detect(appPath string) (Version, error) { + parsed, err := gomodule.ParseAt(appPath) + if err != nil { + return 0, err + } + for _, r := range parsed.Require { + v := r.Mod + if v.Path == cosmosModulePath { + switch { + case semver.Compare(v.Version, cosmosModuleStargateTag) >= 0: + return StargateZeroFourtyAndAbove, nil + + case semver.Compare(v.Version, cosmosModuleMaxLaunchpadTag) <= 0: + return LaunchpadAny, nil + + default: + return StargateBelowZeroFourty, nil + } + } + } + return 0, nil +} diff --git a/starport/services/chain/build.go b/starport/services/chain/build.go index e646c337ac..b0a9a619e0 100644 --- a/starport/services/chain/build.go +++ b/starport/services/chain/build.go @@ -51,8 +51,8 @@ func (c *Chain) buildSteps() ( -X %s/cmd/%s/cmd.ChainID=%s`, c.app.Name, c.app.Name, - c.version.tag, - c.version.hash, + c.sourceVersion.tag, + c.sourceVersion.hash, c.app.ImportPath, c.app.D(), chainID, diff --git a/starport/services/chain/chain.go b/starport/services/chain/chain.go index 2fe9c05ed5..084787d4a3 100644 --- a/starport/services/chain/chain.go +++ b/starport/services/chain/chain.go @@ -53,8 +53,10 @@ type Chain struct { options chainOptions + Version cosmosver.Version + plugin Plugin - version version + sourceVersion version logLevel LogLvl cmd chaincmdrunner.Runner serveCancel context.CancelFunc @@ -119,17 +121,19 @@ func New(path string, options ...Option) (*Chain, error) { c.stderr = os.Stderr } - c.version, err = c.appVersion() + c.sourceVersion, err = c.appVersion() if err != nil && err != git.ErrRepositoryNotExists { return nil, err } - // initialize the plugin depending on the version of the chain - c.plugin, err = c.pickPlugin() + c.Version, err = cosmosver.Detect(c.app.Path) if err != nil { return nil, err } + // initialize the plugin depending on the version of the chain + c.plugin = c.pickPlugin() + // initialize the chain commands id, err := c.ID() if err != nil { @@ -140,11 +144,12 @@ func New(path string, options ...Option) (*Chain, error) { chaincmd.WithChainID(id), chaincmd.WithHome(c.Home()), chaincmd.WithKeyringBackend(chaincmd.KeyringBackendTest), + chaincmd.WithVersion(c.Version), } if c.plugin.Version() == cosmosver.Launchpad { ccoptions = append(ccoptions, - chaincmd.WithLaunchpad(c.app.CLI()), - //chaincmd.WithLaunchpadCLIHome(), + chaincmd.WithSecondaryCLI(c.app.CLI()), + //chaincmd.WithSecondaryCLIHome(), ) } diff --git a/starport/services/chain/plugin.go b/starport/services/chain/plugin.go index f176b63780..4f280c4350 100644 --- a/starport/services/chain/plugin.go +++ b/starport/services/chain/plugin.go @@ -44,16 +44,12 @@ type Plugin interface { SupportsIBC() bool } -func (c *Chain) pickPlugin() (Plugin, error) { - version, err := cosmosver.Detect(c.app.Path) - if err != nil { - return nil, err - } - switch version { +func (c *Chain) pickPlugin() Plugin { + switch c.Version.Major() { case cosmosver.Launchpad: - return newLaunchpadPlugin(c.app, c), nil + return newLaunchpadPlugin(c.app, c) case cosmosver.Stargate: - return newStargatePlugin(c.app, c), nil + return newStargatePlugin(c.app, c) } panic("unknown cosmos version") } diff --git a/starport/services/chain/relayer.go b/starport/services/chain/relayer.go index db9c4d64da..e4e1eac8f3 100644 --- a/starport/services/chain/relayer.go +++ b/starport/services/chain/relayer.go @@ -26,7 +26,7 @@ import ( ) const ( - relayerVersion = "3080dab10e37e6db9e691c343b1c0cdb6d845753" + relayerVersion = "1daec66da1700c9fcd8900dbf06c70f2fd838cdf" ) // relayerInfo holds relayer info that is shared between chains to make a connection. @@ -173,6 +173,8 @@ func (c *Chain) initRelayer(ctx context.Context, _ conf.Config) error { account.Name, "testkey", account.Mnemonic, + "--coin-type", + "118", ), // check if RPC is available before adding key for this account. step.PreExec(func() error { diff --git a/starport/services/chain/rly/relayer.go b/starport/services/chain/rly/relayer.go index 349bd410ab..8ef3800112 100644 --- a/starport/services/chain/rly/relayer.go +++ b/starport/services/chain/rly/relayer.go @@ -1,6 +1,6 @@ package rly -// types are copy pasted from https://github.com/ovrclk/relayer because this package +// types are copy pasted from https://github.com/cosmos/relayer because this package // is not go get-able for now. once that's fixed, this pkg will be removed. import ( "github.com/google/uuid" diff --git a/starport/services/chain/serve.go b/starport/services/chain/serve.go index 306f3ec7a8..342b1c7548 100644 --- a/starport/services/chain/serve.go +++ b/starport/services/chain/serve.go @@ -103,7 +103,7 @@ func (c *Chain) Serve(ctx context.Context) error { } func (c *Chain) setup(ctx context.Context) error { - fmt.Fprintf(c.stdLog(logStarport).out, "Cosmos' version is: %s\n\n", infoColor(c.plugin.Name())) + fmt.Fprintf(c.stdLog(logStarport).out, "Cosmos SDK's version is: %s\n\n", infoColor(c.Version)) if err := c.checkSystem(); err != nil { return err diff --git a/starport/services/scaffolder/scaffolder.go b/starport/services/scaffolder/scaffolder.go index 32d032e4f1..e99e711cf8 100644 --- a/starport/services/scaffolder/scaffolder.go +++ b/starport/services/scaffolder/scaffolder.go @@ -26,7 +26,11 @@ func New(path string, options ...Option) *Scaffolder { } func (s *Scaffolder) version() (cosmosver.MajorVersion, error) { - return cosmosver.Detect(s.path) + v, err := cosmosver.Detect(s.path) + if err != nil { + return "", err + } + return v.Major(), nil } func owner(modulePath string) string { diff --git a/starport/templates/app/stargate/app/app.go.plush b/starport/templates/app/stargate/app/app.go.plush index dded4212d4..fdfc2739fa 100644 --- a/starport/templates/app/stargate/app/app.go.plush +++ b/starport/templates/app/stargate/app/app.go.plush @@ -7,7 +7,6 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/pelletier/go-toml" "github.com/spf13/cast" abci "github.com/tendermint/tendermint/abci/types" @@ -16,6 +15,7 @@ import ( dbm "github.com/tendermint/tm-db" "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/server/api" @@ -80,7 +80,6 @@ import ( upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" tmjson "github.com/tendermint/tendermint/libs/json" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - rpchttp "github.com/tendermint/tendermint/rpc/client/http" appparams "<%= ModulePath %>/app/params" "<%= ModulePath + "/x/" + AppName %>" <%= AppName %>keeper "<%= ModulePath %>/x/<%= AppName %>/keeper" @@ -88,12 +87,12 @@ import ( // this line is used by starport scaffolding # stargate/app/moduleImport ) +const Name = "<%= AppName %>" + var ( // DefaultNodeHome default home directories for the application daemon - DefaultNodeHome = func(appName string) string { - return os.ExpandEnv("$HOME/.<%= AppName %>") - } - + DefaultNodeHome string + // ModuleBasics defines the module BasicManager is in charge of setting up basic, // non-dependant module elements, such as codec registration // and genesis verification. @@ -142,14 +141,21 @@ var ( _ servertypes.Application = (*App)(nil) ) +func init() { + userHomeDir, err := os.UserHomeDir() + if err != nil { + panic(err) + } + + DefaultNodeHome = filepath.Join(userHomeDir, "."+Name) +} + // App extends an ABCI application, but with most of its parameters exported. // They are exported for convenience in creating helper functions, as object // capabilities aren't needed for testing. type App struct { *baseapp.BaseApp - appName string - cdc *codec.LegacyAmino appCodec codec.Marshaler interfaceRegistry types.InterfaceRegistry @@ -191,7 +197,7 @@ type App struct { // New returns a reference to an initialized Gaia. // NewSimApp returns a reference to an initialized SimApp. func New( - appName string, logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, skipUpgradeHeights map[int64]bool, + logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, skipUpgradeHeights map[int64]bool, homePath string, invCheckPeriod uint, encodingConfig appparams.EncodingConfig, appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp), ) *App { @@ -200,7 +206,7 @@ func New( cdc := encodingConfig.Amino interfaceRegistry := encodingConfig.InterfaceRegistry - bApp := baseapp.NewBaseApp(appName, logger, db, encodingConfig.TxConfig.TxDecoder(), baseAppOptions...) + bApp := baseapp.NewBaseApp(Name, logger, db, encodingConfig.TxConfig.TxDecoder(), baseAppOptions...) bApp.SetCommitMultiStoreTracer(traceStore) bApp.SetAppVersion(version.Version) bApp.SetInterfaceRegistry(interfaceRegistry) @@ -218,7 +224,6 @@ func New( app := &App{ BaseApp: bApp, - appName: appName, cdc: cdc, appCodec: appCodec, interfaceRegistry: interfaceRegistry, @@ -276,8 +281,9 @@ func New( // Create IBC Keeper app.IBCKeeper = ibckeeper.NewKeeper( - appCodec, keys[ibchost.StoreKey], app.StakingKeeper, scopedIBCKeeper, - ) + appCodec, keys[ibchost.StoreKey], app.GetSubspace(ibchost.ModuleName), app.StakingKeeper, scopedIBCKeeper, + ) + // register the proposal types govRouter := govtypes.NewRouter() @@ -531,30 +537,25 @@ func (app *App) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig // Register legacy tx routes. authrest.RegisterTxRoutes(clientCtx, apiSvr.Router) // Register new tx routes from grpc-gateway. - authtx.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCRouter) + authtx.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) + // Register new tendermint queries routes from grpc-gateway. + tmservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) // Register legacy and grpc-gateway routes for all modules. ModuleBasics.RegisterRESTRoutes(clientCtx, apiSvr.Router) - ModuleBasics.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCRouter) + ModuleBasics.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter) } // RegisterTxService implements the Application.RegisterTxService method. func (app *App) RegisterTxService(clientCtx client.Context) { - // TODO remove this workaround after https://github.com/cosmos/cosmos-sdk/pull/7840 has merged. - // -- right now, clientCtx does not have a Client set. this workaround fixes that. - config, err := toml.LoadFile(filepath.Join(clientCtx.HomeDir, "config/config.toml")) - if err != nil { - panic(err) - } - client, err := rpchttp.New(config.Get("rpc.laddr").(string), "/websocket") - if err != nil { - panic(err) - } - clientCtx = clientCtx.WithClient(client) - // -- end of the workaround. authtx.RegisterTxService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.BaseApp.Simulate, app.interfaceRegistry) } +// RegisterTendermintService implements the Application.RegisterTendermintService method. +func (app *App) RegisterTendermintService(clientCtx client.Context) { + tmservice.RegisterTendermintService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.interfaceRegistry) +} + // GetMaccPerms returns a copy of the module account permissions func GetMaccPerms() map[string][]string { dupMaccPerms := make(map[string][]string) @@ -577,6 +578,7 @@ func initParamsKeeper(appCodec codec.BinaryMarshaler, legacyAmino *codec.LegacyA paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govtypes.ParamKeyTable()) paramsKeeper.Subspace(crisistypes.ModuleName) paramsKeeper.Subspace(ibctransfertypes.ModuleName) + paramsKeeper.Subspace(ibchost.ModuleName) // this line is used by starport scaffolding # stargate/app/paramSubspace return paramsKeeper diff --git a/starport/templates/app/stargate/app/genesis.go.plush b/starport/templates/app/stargate/app/genesis.go.plush index 340cd801a8..3587510c3d 100644 --- a/starport/templates/app/stargate/app/genesis.go.plush +++ b/starport/templates/app/stargate/app/genesis.go.plush @@ -2,6 +2,8 @@ package app import ( "encoding/json" + + "github.com/cosmos/cosmos-sdk/codec" ) // The genesis state of the blockchain is represented here as a map of raw json @@ -14,7 +16,6 @@ import ( type GenesisState map[string]json.RawMessage // NewDefaultGenesisState generates the default state for the application. -func NewDefaultGenesisState() GenesisState { - encCfg := MakeEncodingConfig() - return ModuleBasics.DefaultGenesis(encCfg.Marshaler) +func NewDefaultGenesisState(cdc codec.JSONMarshaler) GenesisState { + return ModuleBasics.DefaultGenesis(cdc) } diff --git a/starport/templates/app/stargate/cmd/{{binaryNamePrefix}}d/cmd/app.go.plush b/starport/templates/app/stargate/cmd/{{binaryNamePrefix}}d/cmd/app.go.plush deleted file mode 100644 index e33ef8bed4..0000000000 --- a/starport/templates/app/stargate/cmd/{{binaryNamePrefix}}d/cmd/app.go.plush +++ /dev/null @@ -1,3 +0,0 @@ -package cmd - -const appName = "<%= AppName %>" diff --git a/starport/templates/app/stargate/cmd/{{binaryNamePrefix}}d/cmd/genaccounts.go.plush b/starport/templates/app/stargate/cmd/{{binaryNamePrefix}}d/cmd/genaccounts.go.plush index 87b1478bc5..a195b4b77d 100644 --- a/starport/templates/app/stargate/cmd/{{binaryNamePrefix}}d/cmd/genaccounts.go.plush +++ b/starport/templates/app/stargate/cmd/{{binaryNamePrefix}}d/cmd/genaccounts.go.plush @@ -70,7 +70,7 @@ contain valid denominations. Accounts may optionally be supplied with vesting pa addr = info.GetAddress() } - coins, err := sdk.ParseCoins(args[1]) + coins, err := sdk.ParseCoinsNormalized(args[1]) if err != nil { return fmt.Errorf("failed to parse coins: %w", err) } @@ -88,7 +88,7 @@ contain valid denominations. Accounts may optionally be supplied with vesting pa return err } - vestingAmt, err := sdk.ParseCoins(vestingAmtStr) + vestingAmt, err := sdk.ParseCoinsNormalized(vestingAmtStr) if err != nil { return fmt.Errorf("failed to parse vesting amount: %w", err) } diff --git a/starport/templates/app/stargate/cmd/{{binaryNamePrefix}}d/cmd/root.go.plush b/starport/templates/app/stargate/cmd/{{binaryNamePrefix}}d/cmd/root.go.plush index fb4e7fe94f..33667f3f54 100644 --- a/starport/templates/app/stargate/cmd/{{binaryNamePrefix}}d/cmd/root.go.plush +++ b/starport/templates/app/stargate/cmd/{{binaryNamePrefix}}d/cmd/root.go.plush @@ -1,12 +1,11 @@ package cmd import ( - "context" + "errors" "io" "os" "path/filepath" - "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/snapshots" "<%= ModulePath %>/app/params" @@ -51,10 +50,10 @@ func NewRootCmd() (*cobra.Command, params.EncodingConfig) { WithInput(os.Stdin). WithAccountRetriever(types.AccountRetriever{}). WithBroadcastMode(flags.BroadcastBlock). - WithHomeDir(app.DefaultNodeHome(appName)) + WithHomeDir(app.DefaultNodeHome) rootCmd := &cobra.Command{ - Use: appName, + Use: app.Name+"d", Short: "Stargate CosmosHub App", PersistentPreRunE: func(cmd *cobra.Command, _ []string) error { if err := client.SetCmdClientContextHandler(initClientCtx, cmd); err != nil { @@ -74,46 +73,29 @@ func NewRootCmd() (*cobra.Command, params.EncodingConfig) { return rootCmd, encodingConfig } -// Execute executes the root command. -func Execute(rootCmd *cobra.Command) error { - app.SetConfig() - - // Create and set a client.Context on the command's Context. During the pre-run - // of the root command, a default initialized client.Context is provided to - // seed child command execution with values such as AccountRetriver, Keyring, - // and a Tendermint RPC. This requires the use of a pointer reference when - // getting and setting the client.Context. Ideally, we utilize - // https://github.com/spf13/cobra/pull/1118. - ctx := context.Background() - ctx = context.WithValue(ctx, client.ClientContextKey, &client.Context{}) - ctx = context.WithValue(ctx, server.ServerContextKey, server.NewDefaultContext()) - - executor := tmcli.PrepareBaseCmd(rootCmd, "", app.DefaultNodeHome(appName)) - return executor.ExecuteContext(ctx) -} - func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { authclient.Codec = encodingConfig.Marshaler rootCmd.AddCommand( - genutilcli.InitCmd(app.ModuleBasics, app.DefaultNodeHome(appName)), - genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, app.DefaultNodeHome(appName)), + genutilcli.InitCmd(app.ModuleBasics, app.DefaultNodeHome), + genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, app.DefaultNodeHome), genutilcli.MigrateGenesisCmd(), - genutilcli.GenTxCmd(app.ModuleBasics, encodingConfig.TxConfig, banktypes.GenesisBalancesIterator{}, app.DefaultNodeHome(appName)), - genutilcli.ValidateGenesisCmd(app.ModuleBasics, encodingConfig.TxConfig), - AddGenesisAccountCmd(app.DefaultNodeHome(appName)), + genutilcli.GenTxCmd(app.ModuleBasics, encodingConfig.TxConfig, banktypes.GenesisBalancesIterator{}, app.DefaultNodeHome), + genutilcli.ValidateGenesisCmd(app.ModuleBasics), + AddGenesisAccountCmd(app.DefaultNodeHome), tmcli.NewCompletionCmd(rootCmd, true), debug.Cmd(), ) - server.AddCommands(rootCmd, app.DefaultNodeHome(appName), newApp, createSimappAndExport, addModuleInitFlags) + a := appCreator{encodingConfig} + server.AddCommands(rootCmd, app.DefaultNodeHome, a.newApp, a.appExport, addModuleInitFlags) // add keybase, auxiliary RPC, query, and tx child commands rootCmd.AddCommand( rpc.StatusCommand(), queryCommand(), txCommand(), - keys.Commands(app.DefaultNodeHome(appName)), + keys.Commands(app.DefaultNodeHome), ) } @@ -173,7 +155,12 @@ func txCommand() *cobra.Command { return cmd } -func newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts servertypes.AppOptions) servertypes.Application { +type appCreator struct { + encCfg params.EncodingConfig +} + +// newApp is an AppCreator +func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts servertypes.AppOptions) servertypes.Application { var cache sdk.MultiStorePersistentCache if cast.ToBool(appOpts.Get(server.FlagInterBlockCache)) { @@ -201,10 +188,10 @@ func newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts serverty } return app.New( - appName, logger, db, traceStore, true, skipUpgradeHeights, + logger, db, traceStore, true, skipUpgradeHeights, cast.ToString(appOpts.Get(flags.FlagHome)), cast.ToUint(appOpts.Get(server.FlagInvCheckPeriod)), - app.MakeEncodingConfig(), // Ideally, we would reuse the one created by NewRootCmd. + a.encCfg, appOpts, baseapp.SetPruning(pruningOpts), baseapp.SetMinGasPrices(cast.ToString(appOpts.Get(server.FlagMinGasPrices))), @@ -220,24 +207,29 @@ func newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts serverty ) } -func createSimappAndExport( +// appExport creates a new simapp (optionally at a given height) +func (a appCreator) appExport ( logger log.Logger, db dbm.DB, traceStore io.Writer, height int64, forZeroHeight bool, jailAllowedAddrs []string, appOpts servertypes.AppOptions) (servertypes.ExportedApp, error) { - encCfg := app.MakeEncodingConfig() // Ideally, we would reuse the one created by NewRootCmd. - encCfg.Marshaler = codec.NewProtoCodec(encCfg.InterfaceRegistry) - var a *app.App + var anApp *app.App + + homePath, ok := appOpts.Get(flags.FlagHome).(string) + if !ok || homePath == "" { + return servertypes.ExportedApp{}, errors.New("application home not set") + } + if height != -1 { - a = app.New(appName, logger, db, traceStore, false, map[int64]bool{}, "", uint(1), encCfg, appOpts) + anApp = app.New(logger, db, traceStore, false, map[int64]bool{}, homePath, uint(1), a.encCfg, appOpts) - if err := a.LoadHeight(height); err != nil { + if err := anApp.LoadHeight(height); err != nil { return servertypes.ExportedApp{}, err } } else { - a = app.New(appName, logger, db, traceStore, true, map[int64]bool{}, "", uint(1), encCfg, appOpts) + anApp = app.New(logger, db, traceStore, true, map[int64]bool{}, homePath, uint(1), a.encCfg, appOpts) } - return a.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs) + return anApp.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs) } func overwriteFlagDefaults(c *cobra.Command, defaults map[string]string) { diff --git a/starport/templates/app/stargate/cmd/{{binaryNamePrefix}}d/main.go.plush b/starport/templates/app/stargate/cmd/{{binaryNamePrefix}}d/main.go.plush index c1730db460..34091883b7 100644 --- a/starport/templates/app/stargate/cmd/{{binaryNamePrefix}}d/main.go.plush +++ b/starport/templates/app/stargate/cmd/{{binaryNamePrefix}}d/main.go.plush @@ -4,11 +4,13 @@ import ( "os" "<%= ModulePath %>/cmd/<%= BinaryNamePrefix %>d/cmd" + svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" + "<%= ModulePath %>/app" ) func main() { rootCmd, _ := cmd.NewRootCmd() - if err := cmd.Execute(rootCmd); err != nil { + if err := svrcmd.Execute(rootCmd, app.DefaultNodeHome); err != nil { os.Exit(1) } } diff --git a/starport/templates/app/stargate/go.mod.plush b/starport/templates/app/stargate/go.mod.plush index c4d02d8fcc..45b020b062 100644 --- a/starport/templates/app/stargate/go.mod.plush +++ b/starport/templates/app/stargate/go.mod.plush @@ -3,19 +3,19 @@ module <%= ModulePath %> go 1.15 require ( - github.com/cosmos/cosmos-sdk v0.40.0-rc3 + github.com/cosmos/cosmos-sdk v0.40.0 github.com/gogo/protobuf v1.3.1 github.com/golang/protobuf v1.4.3 github.com/gorilla/mux v1.8.0 - github.com/grpc-ecosystem/grpc-gateway v1.15.2 - github.com/pelletier/go-toml v1.8.0 + github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/regen-network/cosmos-proto v0.3.0 github.com/spf13/cast v1.3.1 github.com/spf13/cobra v1.1.1 - github.com/tendermint/tendermint v0.34.0-rc6 - github.com/tendermint/tm-db v0.6.2 - google.golang.org/genproto v0.0.0-20201014134559-03b6142f0dc9 - google.golang.org/grpc v1.33.0 + github.com/spf13/pflag v1.0.5 + github.com/tendermint/tendermint v0.34.1 + github.com/tendermint/tm-db v0.6.3 + google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d + google.golang.org/grpc v1.33.2 ) diff --git a/starport/templates/app/stargate/go.sum b/starport/templates/app/stargate/go.sum index 6dce837241..481c2a8a57 100644 --- a/starport/templates/app/stargate/go.sum +++ b/starport/templates/app/stargate/go.sum @@ -45,8 +45,8 @@ github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.4 h1:Xqf+7f2Vhl9tsqDYmXhnXInUdcrtgpRNpIA15/uldSc= -github.com/armon/go-metrics v0.3.4/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.3.5 h1:uq4txK6NAUvLQ60rotN+K+JuTnf3XP4TdQmcs9ma5mk= +github.com/armon/go-metrics v0.3.5/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= @@ -104,13 +104,16 @@ github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cosmos/cosmos-sdk v0.40.0-rc3 h1:sS9BZ82dOxXiZPZdfrzSniEAzLLN0oTP5lFVyjnq2x4= -github.com/cosmos/cosmos-sdk v0.40.0-rc3/go.mod h1:eKgbkQO4FEvC+a1+eyRuL7UgluGK1ad4PufPTpQc6ZA= +github.com/cosmos/cosmos-sdk v0.40.0 h1:nMPdGr5lly9HOENghgr5IRx2QDieqAncHKCSsCdEJSU= +github.com/cosmos/cosmos-sdk v0.40.0/go.mod h1:MMEVnorMyci71WQopgvFmfz2SrDCdWgq5lBjpVclFrg= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d h1:49RLWk1j44Xu4fjHb6JFYmeUnDORVwHNkDxaQ0ctCVU= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= +github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/iavl v0.15.0-rc3.0.20201009144442-230e9bdf52cd/go.mod h1:3xOIaNNX19p0QrX0VqWa6voPRoJRGGYtny+DH8NEPvE= -github.com/cosmos/iavl v0.15.0-rc4 h1:P1wmET7BueqCzfxsn+BzVkDWDLY9ij2JNwkbIdM7RG8= -github.com/cosmos/iavl v0.15.0-rc4/go.mod h1:5CsecJdh44Uj4vZ6WSPeWq84hNW5BwRI36ZsAbfJvRw= +github.com/cosmos/iavl v0.15.0-rc5/go.mod h1:WqoPL9yPTQ85QBMT45OOUzPxG/U/JcJoN7uMjgxke/I= +github.com/cosmos/iavl v0.15.3 h1:xE9r6HW8GeKeoYJN4zefpljZ1oukVScP/7M8oj6SUts= +github.com/cosmos/iavl v0.15.3/go.mod h1:OLjQiAQ4fGD2KDZooyJG9yz+p2ao2IAYSbke8mVvSA4= github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4= github.com/cosmos/ledger-cosmos-go v0.11.1/go.mod h1:J8//BsAGTo3OC/vDLjMRFLW6q0WAaXvHnVc7ZmE8iUY= github.com/cosmos/ledger-go v0.9.2 h1:Nnao/dLwaVTk1Q5U9THldpUMMXU94BOTWPddSmVB6pI= @@ -263,14 +266,15 @@ github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.2.1/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2 h1:FlFbCRLd5Jr4iYXZufAvgWN6Ao0JrI5chLINnUXDDr0= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.14.7/go.mod h1:oYZKL012gGh6LMyg/xA7Q2yq6j8bu0wa+9w14EEthWU= -github.com/grpc-ecosystem/grpc-gateway v1.15.2 h1:HC+hWRWf+v5zTMPyoaYTKIJih+4sd4XRWmj0qlG87Co= -github.com/grpc-ecosystem/grpc-gateway v1.15.2/go.mod h1:vO11I9oWA+KsxmfFQPhLnnIb1VDE24M+pdxZFiuZcA8= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= @@ -340,6 +344,7 @@ github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6 github.com/kkdai/bstream v1.0.0/go.mod h1:FDnDOHt5Yx4p3FaHcioFT0QjDOtgUpvjeZqAs+NVZZA= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -421,14 +426,14 @@ github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxS github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= +github.com/otiai10/copy v1.4.2 h1:RTiz2sol3eoXPLF4o+YWqEybwfUa/Q2Nkc4ZIUs3fwI= +github.com/otiai10/copy v1.4.2/go.mod h1:XWfuS3CrI0R6IE0FbgHsEazaXO8G0LpMp9o8tos0x4E= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= github.com/otiai10/curr v1.0.0 h1:TJIWdbX0B+kpNagQrjgq8bCMrbhiuX73M2XwgtDMoOI= github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/otiai10/mint v1.3.2 h1:VYWnrP5fXmz1MXvjuUvcBrXSjGE6xjON+axB/UrpO3E= +github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= @@ -447,6 +452,7 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= 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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= @@ -478,6 +484,8 @@ github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lN github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.14.0 h1:RHRyE8UocrbjU+6UvRzwi6HjiDfxrrBU91TtbKzkGp4= github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -507,6 +515,9 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.20.0 h1:38k9hgtUBdxFwE34yS8rTHmHBa4eN16E4DJlv177LNs= +github.com/rs/zerolog v1.20.0/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJRjo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -530,8 +541,8 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.3.4 h1:8q6vk3hthlpb2SouZcnBVKboxWQWMDNF38bwholZrJc= +github.com/spf13/afero v1.3.4/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= @@ -581,8 +592,13 @@ github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoM github.com/tendermint/tendermint v0.34.0-rc4/go.mod h1:yotsojf2C1QBOw4dZrTcxbyxmPUrT4hNuOQWX9XUwB4= github.com/tendermint/tendermint v0.34.0-rc6 h1:SVuKGvvE22KxfuK8QUHctUrmOWJsncZSYXIYtcnoKN0= github.com/tendermint/tendermint v0.34.0-rc6/go.mod h1:ugzyZO5foutZImv0Iyx/gOFCX6mjJTgbLHTwi17VDVg= +github.com/tendermint/tendermint v0.34.0/go.mod h1:Aj3PIipBFSNO21r+Lq3TtzQ+uKESxkbA3yo/INM4QwQ= +github.com/tendermint/tendermint v0.34.1 h1:TsJXY8+1NThc/XIENMv1ENzazriHBJJjeP6hN3kpC8g= +github.com/tendermint/tendermint v0.34.1/go.mod h1:Aj3PIipBFSNO21r+Lq3TtzQ+uKESxkbA3yo/INM4QwQ= github.com/tendermint/tm-db v0.6.2 h1:DOn8jwCdjJblrCFJbtonEIPD1IuJWpbRUUdR8GWE4RM= github.com/tendermint/tm-db v0.6.2/go.mod h1:GYtQ67SUvATOcoY8/+x6ylk8Qo02BQyLrAs+yAcLvGI= +github.com/tendermint/tm-db v0.6.3 h1:ZkhQcKnB8/2jr5EaZwGndN4owkPsGezW2fSisS9zGbg= +github.com/tendermint/tm-db v0.6.3/go.mod h1:lfA1dL9/Y/Y8wwyPp2NMLyn5P5Ptr/gvDFNWtrCWSf8= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= @@ -621,6 +637,7 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk 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-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -628,9 +645,12 @@ golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 h1:DZhuSZLsGlFL4CmhA8BcRA0mnthyA/nZ00AqCUo7vHg= golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee h1:4yd7jl+vXjalO5ztz6Vc1VADv+S/80LGJmyl1ROJ2AI= -golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/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= @@ -681,6 +701,7 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrS golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc h1:zK/HqS5bZxDptfPJNq8v7vJfXtkU7r9TLIoSr1bXaP4= 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-20200930145003-4acb6c075d10 h1:YfxMZzv3PjGonQYNUaeU2+DhAdqOxerQ30JFB6WgAXo= golang.org/x/net v0.0.0-20200930145003-4acb6c075d10/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -718,6 +739,7 @@ golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/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-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -736,6 +758,8 @@ golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed h1:J22ig1FUekjjkmZUM7pTKixYm golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211 h1:9UQO31fZ+0aKQOFldThf7BKPMJTiBfWycGh/u3UoO88= golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 h1:/ZHdbVpdR/jk3g30/d4yUL0JU9kksj8+F/bnQUVLGDM= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= @@ -762,6 +786,7 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw 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-20190828213141-aed303cbaa74/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-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -806,8 +831,10 @@ google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201014134559-03b6142f0dc9 h1:fG84H9C3EXfuDlzkG+VEPDYHHExklP6scH1QZ5gQTqU= -google.golang.org/genproto v0.0.0-20201014134559-03b6142f0dc9/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201111145450-ac7456db90a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201119123407-9b1e624d6bc4/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d h1:HV9Z9qMhQEsdlvxNFELgQ11RkMzO3CMkjEySjCtuLes= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -828,8 +855,9 @@ google.golang.org/grpc v1.31.1 h1:SfXqXS5hkufcdZ/mHtYCh53P2b+92WQq/DZcKLgsFRs= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.32.0 h1:zWTV+LMdc3kaiJMSTOFz2UgSBgx8RNQoTGiZu3fR9S0= google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.0 h1:IBKSUNL2uBS2DkJBncPP+TwT0sp9tgA8A75NjHt6umg= -google.golang.org/grpc v1.33.0/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= 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= @@ -871,6 +899,8 @@ gopkg.in/yaml.v2 v2.2.5/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 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/starport/templates/typed/stargate/x/{{moduleName}}/client/cli/query{{TypeName}}.go.plush b/starport/templates/typed/stargate/x/{{moduleName}}/client/cli/query{{TypeName}}.go.plush index cfdb3e413c..6628b01fd0 100644 --- a/starport/templates/typed/stargate/x/{{moduleName}}/client/cli/query{{TypeName}}.go.plush +++ b/starport/templates/typed/stargate/x/{{moduleName}}/client/cli/query{{TypeName}}.go.plush @@ -15,10 +15,6 @@ func CmdList<%= title(TypeName) %>() *cobra.Command { Short: "list all <%= TypeName %>", RunE: func(cmd *cobra.Command, args []string) error { clientCtx := client.GetClientContextFromCmd(cmd) - clientCtx, err := client.ReadQueryCommandFlags(clientCtx, cmd.Flags()) - if err != nil { - return err - } pageReq, err := client.ReadPageRequest(cmd.Flags()) if err != nil { @@ -36,7 +32,7 @@ func CmdList<%= title(TypeName) %>() *cobra.Command { return err } - return clientCtx.PrintOutput(res) + return clientCtx.PrintProto(res) }, } @@ -52,10 +48,6 @@ func CmdShow<%= title(TypeName) %>() *cobra.Command { Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { clientCtx := client.GetClientContextFromCmd(cmd) - clientCtx, err := client.ReadQueryCommandFlags(clientCtx, cmd.Flags()) - if err != nil { - return err - } queryClient := types.NewQueryClient(clientCtx) @@ -68,7 +60,7 @@ func CmdShow<%= title(TypeName) %>() *cobra.Command { return err } - return clientCtx.PrintOutput(res) + return clientCtx.PrintProto(res) }, } diff --git a/starport/templates/typed/stargate/x/{{moduleName}}/client/cli/tx{{TypeName}}.go.plush b/starport/templates/typed/stargate/x/{{moduleName}}/client/cli/tx{{TypeName}}.go.plush index e495eaea7f..f6e041c479 100644 --- a/starport/templates/typed/stargate/x/{{moduleName}}/client/cli/tx{{TypeName}}.go.plush +++ b/starport/templates/typed/stargate/x/{{moduleName}}/client/cli/tx{{TypeName}}.go.plush @@ -18,8 +18,7 @@ func CmdCreate<%= title(TypeName) %>() *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { <%= for (i, field) in Fields { %>args<%= title(field.Name) %><%= if (field.DatatypeName != "string") {%>, _<%}%> := <%= if (field.DatatypeName == "string") {%>string<%} else {%>strconv.Parse<%= title(field.DatatypeName) %><%}%>(args[<%= i %>]<%= if (field.DatatypeName == "int") {%>, 10, 64<%}%>) <% } %> - clientCtx := client.GetClientContextFromCmd(cmd) - clientCtx, err := client.ReadTxCommandFlags(clientCtx, cmd.Flags()) + clientCtx, err := client.GetClientTxContext(cmd) if err != nil { return err } @@ -46,8 +45,7 @@ func CmdUpdate<%= title(TypeName) %>() *cobra.Command { id := args[0] <%= for (i, field) in Fields { %>args<%= title(field.Name) %><%= if (field.DatatypeName != "string") {%>, _<%}%> := <%= if (field.DatatypeName == "string") {%>string<%} else {%>strconv.Parse<%= title(field.DatatypeName) %><%}%>(args[<%= i + 1 %>]<%= if (field.DatatypeName == "int") {%>, 10, 64<%}%>) <% } %> - clientCtx := client.GetClientContextFromCmd(cmd) - clientCtx, err := client.ReadTxCommandFlags(clientCtx, cmd.Flags()) + clientCtx, err := client.GetClientTxContext(cmd) if err != nil { return err } @@ -73,8 +71,7 @@ func CmdDelete<%= title(TypeName) %>() *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { id := args[0] - clientCtx := client.GetClientContextFromCmd(cmd) - clientCtx, err := client.ReadTxCommandFlags(clientCtx, cmd.Flags()) + clientCtx, err := client.GetClientTxContext(cmd) if err != nil { return err }