github.com/Finschia/finschia-sdk@v0.48.1/x/bank/client/cli/query.go (about)

     1  package cli
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/spf13/cobra"
     8  
     9  	"github.com/Finschia/finschia-sdk/client"
    10  	"github.com/Finschia/finschia-sdk/client/flags"
    11  	sdk "github.com/Finschia/finschia-sdk/types"
    12  	"github.com/Finschia/finschia-sdk/version"
    13  	"github.com/Finschia/finschia-sdk/x/bank/types"
    14  )
    15  
    16  const (
    17  	FlagDenom = "denom"
    18  )
    19  
    20  // GetQueryCmd returns the parent command for all x/bank CLi query commands. The
    21  // provided clientCtx should have, at a minimum, a verifier, Tendermint RPC client,
    22  // and marshaler set.
    23  func GetQueryCmd() *cobra.Command {
    24  	cmd := &cobra.Command{
    25  		Use:                        types.ModuleName,
    26  		Short:                      "Querying commands for the bank module",
    27  		DisableFlagParsing:         true,
    28  		SuggestionsMinimumDistance: 2,
    29  		RunE:                       client.ValidateCmd,
    30  	}
    31  
    32  	cmd.AddCommand(
    33  		GetBalancesCmd(),
    34  		GetCmdQueryTotalSupply(),
    35  		GetCmdDenomsMetadata(),
    36  	)
    37  
    38  	return cmd
    39  }
    40  
    41  func GetBalancesCmd() *cobra.Command {
    42  	cmd := &cobra.Command{
    43  		Use:   "balances [address]",
    44  		Short: "Query for account balances by address",
    45  		Long: strings.TrimSpace(
    46  			fmt.Sprintf(`Query the total balance of an account or of a specific denomination.
    47  
    48  Example:
    49    $ %s query %s balances [address]
    50    $ %s query %s balances [address] --denom=[denom]
    51  `,
    52  				version.AppName, types.ModuleName, version.AppName, types.ModuleName,
    53  			),
    54  		),
    55  		Args: cobra.ExactArgs(1),
    56  		RunE: func(cmd *cobra.Command, args []string) error {
    57  			clientCtx, err := client.GetClientQueryContext(cmd)
    58  			if err != nil {
    59  				return err
    60  			}
    61  			denom, err := cmd.Flags().GetString(FlagDenom)
    62  			if err != nil {
    63  				return err
    64  			}
    65  
    66  			queryClient := types.NewQueryClient(clientCtx)
    67  
    68  			addr, err := sdk.AccAddressFromBech32(args[0])
    69  			if err != nil {
    70  				return err
    71  			}
    72  
    73  			pageReq, err := client.ReadPageRequest(cmd.Flags())
    74  			if err != nil {
    75  				return err
    76  			}
    77  			ctx := cmd.Context()
    78  			if denom == "" {
    79  				params := types.NewQueryAllBalancesRequest(addr, pageReq)
    80  				res, err := queryClient.AllBalances(ctx, params)
    81  				if err != nil {
    82  					return err
    83  				}
    84  				return clientCtx.PrintProto(res)
    85  			}
    86  
    87  			params := types.NewQueryBalanceRequest(addr, denom)
    88  			res, err := queryClient.Balance(ctx, params)
    89  			if err != nil {
    90  				return err
    91  			}
    92  
    93  			return clientCtx.PrintProto(res.Balance)
    94  		},
    95  	}
    96  
    97  	cmd.Flags().String(FlagDenom, "", "The specific balance denomination to query for")
    98  	flags.AddQueryFlagsToCmd(cmd)
    99  	flags.AddPaginationFlagsToCmd(cmd, "all balances")
   100  
   101  	return cmd
   102  }
   103  
   104  // GetCmdDenomsMetadata defines the cobra command to query client denomination metadata.
   105  func GetCmdDenomsMetadata() *cobra.Command {
   106  	cmd := &cobra.Command{
   107  		Use:   "denom-metadata",
   108  		Args:  cobra.NoArgs,
   109  		Short: "Query the client metadata for coin denominations",
   110  		Long: strings.TrimSpace(
   111  			fmt.Sprintf(`Query the client metadata for all the registered coin denominations
   112  
   113  Example:
   114    To query for the client metadata of all coin denominations use:
   115    $ %s query %s denom-metadata
   116  
   117  To query for the client metadata of a specific coin denomination use:
   118    $ %s query %s denom-metadata --denom=[denom]
   119  `,
   120  				version.AppName, types.ModuleName, version.AppName, types.ModuleName,
   121  			),
   122  		),
   123  		RunE: func(cmd *cobra.Command, _ []string) error {
   124  			clientCtx, err := client.GetClientQueryContext(cmd)
   125  			if err != nil {
   126  				return err
   127  			}
   128  			denom, err := cmd.Flags().GetString(FlagDenom)
   129  			if err != nil {
   130  				return err
   131  			}
   132  
   133  			queryClient := types.NewQueryClient(clientCtx)
   134  
   135  			if denom == "" {
   136  				res, err := queryClient.DenomsMetadata(cmd.Context(), &types.QueryDenomsMetadataRequest{})
   137  				if err != nil {
   138  					return err
   139  				}
   140  
   141  				return clientCtx.PrintProto(res)
   142  			}
   143  
   144  			res, err := queryClient.DenomMetadata(cmd.Context(), &types.QueryDenomMetadataRequest{Denom: denom})
   145  			if err != nil {
   146  				return err
   147  			}
   148  
   149  			return clientCtx.PrintProto(res)
   150  		},
   151  	}
   152  
   153  	cmd.Flags().String(FlagDenom, "", "The specific denomination to query client metadata for")
   154  	flags.AddQueryFlagsToCmd(cmd)
   155  
   156  	return cmd
   157  }
   158  
   159  func GetCmdQueryTotalSupply() *cobra.Command {
   160  	cmd := &cobra.Command{
   161  		Use:   "total",
   162  		Args:  cobra.NoArgs,
   163  		Short: "Query the total supply of coins of the chain",
   164  		Long: strings.TrimSpace(
   165  			fmt.Sprintf(`Query total supply of coins that are held by accounts in the chain.
   166  
   167  Example:
   168    $ %s query %s total
   169  
   170  To query for the total supply of a specific coin denomination use:
   171    $ %s query %s total --denom=[denom]
   172  `,
   173  				version.AppName, types.ModuleName, version.AppName, types.ModuleName,
   174  			),
   175  		),
   176  		RunE: func(cmd *cobra.Command, args []string) error {
   177  			clientCtx, err := client.GetClientQueryContext(cmd)
   178  			if err != nil {
   179  				return err
   180  			}
   181  			denom, err := cmd.Flags().GetString(FlagDenom)
   182  			if err != nil {
   183  				return err
   184  			}
   185  
   186  			queryClient := types.NewQueryClient(clientCtx)
   187  			ctx := cmd.Context()
   188  
   189  			pageReq, err := client.ReadPageRequest(cmd.Flags())
   190  			if err != nil {
   191  				return err
   192  			}
   193  			if denom == "" {
   194  				res, err := queryClient.TotalSupply(ctx, &types.QueryTotalSupplyRequest{Pagination: pageReq})
   195  				if err != nil {
   196  					return err
   197  				}
   198  
   199  				return clientCtx.PrintProto(res)
   200  			}
   201  
   202  			res, err := queryClient.SupplyOf(ctx, &types.QuerySupplyOfRequest{Denom: denom})
   203  			if err != nil {
   204  				return err
   205  			}
   206  
   207  			return clientCtx.PrintProto(&res.Amount)
   208  		},
   209  	}
   210  
   211  	cmd.Flags().String(FlagDenom, "", "The specific balance denomination to query for")
   212  	flags.AddQueryFlagsToCmd(cmd)
   213  	flags.AddPaginationFlagsToCmd(cmd, "all supply totals")
   214  
   215  	return cmd
   216  }