package client import ( "fmt" "os" "path" "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/tendermint/tendermint/libs/cli" "github.com/cosmos/cosmos-sdk/client/flags" ethermint "github.com/cosmos/ethermint/types" ) // InitConfig adds the chain-id, encoding and output flags to the persistent flag set. func InitConfig(cmd *cobra.Command) error { home, err := cmd.PersistentFlags().GetString(cli.HomeFlag) if err != nil { return err } configFile := path.Join(home, "config", "config.toml") if _, err := os.Stat(configFile); err == nil { viper.SetConfigFile(configFile) if err := viper.ReadInConfig(); err != nil { return err } } if err := viper.BindPFlag(flags.FlagChainID, cmd.PersistentFlags().Lookup(flags.FlagChainID)); err != nil { return err } if err := viper.BindPFlag(cli.EncodingFlag, cmd.PersistentFlags().Lookup(cli.EncodingFlag)); err != nil { return err } return viper.BindPFlag(cli.OutputFlag, cmd.PersistentFlags().Lookup(cli.OutputFlag)) } // GenerateChainID wraps a cobra command with a RunE function with base 10 integer chain-id random generation // when a chain-id is not provided. func GenerateChainID(baseCmd *cobra.Command) *cobra.Command { // Copy base run command to be used after chain verification baseRunE := baseCmd.RunE // Function to replace command's RunE function generateFn := func(cmd *cobra.Command, args []string) error { chainID, _ := cmd.Flags().GetString(flags.FlagChainID) if chainID != "" { if err := cmd.Flags().Set(flags.FlagChainID, ethermint.GenerateRandomChainID()); err != nil { return fmt.Errorf("could not set random chain-id: %w", err) } } return baseRunE(cmd, args) } baseCmd.RunE = generateFn return baseCmd } // ValidateChainID wraps a cobra command with a RunE function with base 10 integer chain-id verification. func ValidateChainID(baseCmd *cobra.Command) *cobra.Command { // Copy base run command to be used after chain verification baseRunE := baseCmd.RunE // Function to replace command's RunE function validateFn := func(cmd *cobra.Command, args []string) error { chainID, _ := cmd.Flags().GetString(flags.FlagChainID) if !ethermint.IsValidChainID(chainID) { return fmt.Errorf("invalid chain-id format: %s", chainID) } return baseRunE(cmd, args) } baseCmd.RunE = validateFn return baseCmd }