github.com/cosmos/cosmos-sdk@v0.50.10/x/genutil/client/cli/genaccount.go (about)

     1  package cli
     2  
     3  import (
     4  	"bufio"
     5  	"encoding/json"
     6  	"fmt"
     7  	"os"
     8  
     9  	"github.com/spf13/cobra"
    10  
    11  	address "cosmossdk.io/core/address"
    12  
    13  	"github.com/cosmos/cosmos-sdk/client"
    14  	"github.com/cosmos/cosmos-sdk/client/flags"
    15  	"github.com/cosmos/cosmos-sdk/crypto/keyring"
    16  	"github.com/cosmos/cosmos-sdk/server"
    17  	sdk "github.com/cosmos/cosmos-sdk/types"
    18  	"github.com/cosmos/cosmos-sdk/x/genutil"
    19  )
    20  
    21  const (
    22  	flagVestingStart = "vesting-start-time"
    23  	flagVestingEnd   = "vesting-end-time"
    24  	flagVestingAmt   = "vesting-amount"
    25  	flagAppendMode   = "append"
    26  	flagModuleName   = "module-name"
    27  )
    28  
    29  // AddGenesisAccountCmd returns add-genesis-account cobra Command.
    30  // This command is provided as a default, applications are expected to provide their own command if custom genesis accounts are needed.
    31  func AddGenesisAccountCmd(defaultNodeHome string, addressCodec address.Codec) *cobra.Command {
    32  	cmd := &cobra.Command{
    33  		Use:   "add-genesis-account [address_or_key_name] [coin][,[coin]]",
    34  		Short: "Add a genesis account to genesis.json",
    35  		Long: `Add a genesis account to genesis.json. The provided account must specify
    36  the account address or key name and a list of initial coins. If a key name is given,
    37  the address will be looked up in the local Keybase. The list of initial tokens must
    38  contain valid denominations. Accounts may optionally be supplied with vesting parameters.
    39  `,
    40  		Args: cobra.ExactArgs(2),
    41  		RunE: func(cmd *cobra.Command, args []string) error {
    42  			clientCtx := client.GetClientContextFromCmd(cmd)
    43  			serverCtx := server.GetServerContextFromCmd(cmd)
    44  			config := serverCtx.Config
    45  
    46  			config.SetRoot(clientCtx.HomeDir)
    47  
    48  			var kr keyring.Keyring
    49  			addr, err := addressCodec.StringToBytes(args[0])
    50  			if err != nil {
    51  				inBuf := bufio.NewReader(cmd.InOrStdin())
    52  				keyringBackend, _ := cmd.Flags().GetString(flags.FlagKeyringBackend)
    53  
    54  				if keyringBackend != "" && clientCtx.Keyring == nil {
    55  					var err error
    56  					kr, err = keyring.New(sdk.KeyringServiceName(), keyringBackend, clientCtx.HomeDir, inBuf, clientCtx.Codec)
    57  					if err != nil {
    58  						return err
    59  					}
    60  				} else {
    61  					kr = clientCtx.Keyring
    62  				}
    63  
    64  				k, err := kr.Key(args[0])
    65  				if err != nil {
    66  					return fmt.Errorf("failed to get address from Keyring: %w", err)
    67  				}
    68  
    69  				addr, err = k.GetAddress()
    70  				if err != nil {
    71  					return err
    72  				}
    73  			}
    74  
    75  			appendflag, _ := cmd.Flags().GetBool(flagAppendMode)
    76  			vestingStart, _ := cmd.Flags().GetInt64(flagVestingStart)
    77  			vestingEnd, _ := cmd.Flags().GetInt64(flagVestingEnd)
    78  			vestingAmtStr, _ := cmd.Flags().GetString(flagVestingAmt)
    79  			moduleNameStr, _ := cmd.Flags().GetString(flagModuleName)
    80  
    81  			return genutil.AddGenesisAccount(clientCtx.Codec, addr, appendflag, config.GenesisFile(), args[1], vestingAmtStr, vestingStart, vestingEnd, moduleNameStr)
    82  		},
    83  	}
    84  
    85  	cmd.Flags().String(flags.FlagHome, defaultNodeHome, "The application home directory")
    86  	cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|kwallet|pass|test)")
    87  	cmd.Flags().String(flagVestingAmt, "", "amount of coins for vesting accounts")
    88  	cmd.Flags().Int64(flagVestingStart, 0, "schedule start time (unix epoch) for vesting accounts")
    89  	cmd.Flags().Int64(flagVestingEnd, 0, "schedule end time (unix epoch) for vesting accounts")
    90  	cmd.Flags().Bool(flagAppendMode, false, "append the coins to an account already in the genesis.json file")
    91  	cmd.Flags().String(flagModuleName, "", "module account name")
    92  	flags.AddQueryFlagsToCmd(cmd)
    93  
    94  	return cmd
    95  }
    96  
    97  // AddBulkGenesisAccountCmd returns bulk-add-genesis-account cobra Command.
    98  // This command is provided as a default, applications are expected to provide their own command if custom genesis accounts are needed.
    99  func AddBulkGenesisAccountCmd(defaultNodeHome string, addressCodec address.Codec) *cobra.Command {
   100  	cmd := &cobra.Command{
   101  		Use:   "bulk-add-genesis-account [/file/path.json]",
   102  		Short: "Bulk add genesis accounts to genesis.json",
   103  		Example: `bulk-add-genesis-account accounts.json
   104  where accounts.json is:
   105  [
   106      {
   107          "address": "cosmos139f7kncmglres2nf3h4hc4tade85ekfr8sulz5",
   108          "coins": [
   109              { "denom": "umuon", "amount": "100000000" },
   110              { "denom": "stake", "amount": "200000000" }
   111          ]
   112      },
   113      {
   114          "address": "cosmos1e0jnq2sun3dzjh8p2xq95kk0expwmd7shwjpfg",
   115          "coins": [
   116              { "denom": "umuon", "amount": "500000000" }
   117          ],
   118          "vesting_amt": [
   119              { "denom": "umuon", "amount": "400000000" }
   120          ],
   121          "vesting_start": 1724711478,
   122          "vesting_end": 1914013878
   123      }
   124  ]
   125  `,
   126  		Long: `Add genesis accounts in bulk to genesis.json. The provided account must specify
   127  the account address and a list of initial coins. The list of initial tokens must
   128  contain valid denominations. Accounts may optionally be supplied with vesting parameters.
   129  `,
   130  		Args: cobra.ExactArgs(1),
   131  		RunE: func(cmd *cobra.Command, args []string) error {
   132  			clientCtx := client.GetClientContextFromCmd(cmd)
   133  			serverCtx := server.GetServerContextFromCmd(cmd)
   134  			config := serverCtx.Config
   135  
   136  			config.SetRoot(clientCtx.HomeDir)
   137  
   138  			f, err := os.Open(args[0])
   139  			if err != nil {
   140  				return fmt.Errorf("failed to open file: %w", err)
   141  			}
   142  			defer f.Close()
   143  
   144  			var accounts []genutil.GenesisAccount
   145  			if err := json.NewDecoder(f).Decode(&accounts); err != nil {
   146  				return fmt.Errorf("failed to decode JSON: %w", err)
   147  			}
   148  
   149  			appendflag, _ := cmd.Flags().GetBool(flagAppendMode)
   150  
   151  			return genutil.AddGenesisAccounts(clientCtx.Codec, addressCodec, accounts, appendflag, config.GenesisFile())
   152  		},
   153  	}
   154  
   155  	cmd.Flags().Bool(flagAppendMode, false, "append the coins to an account already in the genesis.json file")
   156  	cmd.Flags().String(flags.FlagHome, defaultNodeHome, "The application home directory")
   157  	flags.AddQueryFlagsToCmd(cmd)
   158  
   159  	return cmd
   160  }