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 }