github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/auth/client/cli/query.go (about)

     1  package cli
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	sdkerrors "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/errors"
     8  
     9  	"github.com/spf13/cobra"
    10  	"github.com/spf13/viper"
    11  
    12  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client"
    13  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context"
    14  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/flags"
    15  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    16  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    17  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/rest"
    18  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/version"
    19  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/client/utils"
    20  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/types"
    21  
    22  	tmtypes "github.com/fibonacci-chain/fbc/libs/tendermint/types"
    23  )
    24  
    25  const (
    26  	flagEvents = "events"
    27  
    28  	eventFormat = "{eventType}.{eventAttribute}={value}"
    29  )
    30  
    31  // GetQueryCmd returns the transaction commands for this module
    32  func GetQueryCmd(cdc *codec.Codec) *cobra.Command {
    33  	cmd := &cobra.Command{
    34  		Use:                        types.ModuleName,
    35  		Short:                      "Querying commands for the auth module",
    36  		DisableFlagParsing:         true,
    37  		SuggestionsMinimumDistance: 2,
    38  		RunE:                       client.ValidateCmd,
    39  	}
    40  
    41  	cmd.AddCommand(GetAccountCmd(cdc))
    42  
    43  	return cmd
    44  }
    45  
    46  // GetAccountCmd returns a query account that will display the state of the
    47  // account at a given address.
    48  func GetAccountCmd(cdc *codec.Codec) *cobra.Command {
    49  	cmd := &cobra.Command{
    50  		Use:   "account [address]",
    51  		Short: "Query account balance",
    52  		Args:  cobra.ExactArgs(1),
    53  		RunE: func(cmd *cobra.Command, args []string) error {
    54  			cliCtx := context.NewCLIContext().WithCodec(cdc)
    55  			accGetter := types.NewAccountRetriever(cliCtx)
    56  
    57  			key, err := sdk.AccAddressFromBech32(args[0])
    58  			if err != nil {
    59  				return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, err.Error())
    60  			}
    61  
    62  			acc, err := accGetter.GetAccount(key)
    63  			if err != nil {
    64  				return err
    65  			}
    66  
    67  			return cliCtx.PrintOutput(acc)
    68  		},
    69  	}
    70  
    71  	return flags.GetCommands(cmd)[0]
    72  }
    73  
    74  // QueryTxsByEventsCmd returns a command to search through transactions by events.
    75  func QueryTxsByEventsCmd(cdc *codec.Codec) *cobra.Command {
    76  	cmd := &cobra.Command{
    77  		Use:   "txs",
    78  		Short: "Query for paginated transactions that match a set of events",
    79  		Long: strings.TrimSpace(
    80  			fmt.Sprintf(`
    81  Search for transactions that match the exact given events where results are paginated.
    82  Each event takes the form of '%s'. Please refer
    83  to each module's documentation for the full set of events to query for. Each module
    84  documents its respective events under 'xx_events.md'.
    85  
    86  Example:
    87  $ %s query txs --%s 'message.sender=cosmos1...&message.action=withdraw_delegator_reward' --page 1 --limit 30
    88  `, eventFormat, version.ClientName, flagEvents),
    89  		),
    90  		RunE: func(cmd *cobra.Command, args []string) error {
    91  			eventsStr := strings.Trim(viper.GetString(flagEvents), "'")
    92  
    93  			var events []string
    94  			if strings.Contains(eventsStr, "&") {
    95  				events = strings.Split(eventsStr, "&")
    96  			} else {
    97  				events = append(events, eventsStr)
    98  			}
    99  
   100  			var tmEvents []string
   101  
   102  			for _, event := range events {
   103  				if !strings.Contains(event, "=") {
   104  					return fmt.Errorf("invalid event; event %s should be of the format: %s", event, eventFormat)
   105  				} else if strings.Count(event, "=") > 1 {
   106  					return fmt.Errorf("invalid event; event %s should be of the format: %s", event, eventFormat)
   107  				}
   108  
   109  				tokens := strings.Split(event, "=")
   110  				if tokens[0] == tmtypes.TxHeightKey {
   111  					event = fmt.Sprintf("%s=%s", tokens[0], tokens[1])
   112  				} else {
   113  					event = fmt.Sprintf("%s='%s'", tokens[0], tokens[1])
   114  				}
   115  
   116  				tmEvents = append(tmEvents, event)
   117  			}
   118  
   119  			page := viper.GetInt(flags.FlagPage)
   120  			limit := viper.GetInt(flags.FlagLimit)
   121  
   122  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   123  			txs, err := utils.QueryTxsByEvents(cliCtx, tmEvents, page, limit)
   124  			if err != nil {
   125  				return err
   126  			}
   127  
   128  			var output []byte
   129  			if cliCtx.Indent {
   130  				output, err = cdc.MarshalJSONIndent(txs, "", "  ")
   131  			} else {
   132  				output, err = cdc.MarshalJSON(txs)
   133  			}
   134  
   135  			if err != nil {
   136  				return err
   137  			}
   138  
   139  			fmt.Println(string(output))
   140  			return nil
   141  		},
   142  	}
   143  
   144  	cmd.Flags().StringP(flags.FlagNode, "n", "tcp://localhost:26657", "Node to connect to")
   145  	viper.BindPFlag(flags.FlagNode, cmd.Flags().Lookup(flags.FlagNode))
   146  
   147  	cmd.Flags().Bool(flags.FlagTrustNode, false, flags.TrustNodeUsage)
   148  	viper.BindPFlag(flags.FlagTrustNode, cmd.Flags().Lookup(flags.FlagTrustNode))
   149  
   150  	cmd.Flags().String(flagEvents, "", fmt.Sprintf("list of transaction events in the form of %s", eventFormat))
   151  	cmd.Flags().Uint32(flags.FlagPage, rest.DefaultPage, "Query a specific page of paginated results")
   152  	cmd.Flags().Uint32(flags.FlagLimit, rest.DefaultLimit, "Query number of transactions results per page returned")
   153  	cmd.MarkFlagRequired(flagEvents)
   154  
   155  	return cmd
   156  }
   157  
   158  // QueryTxCmd implements the default command for a tx query.
   159  func QueryTxCmd(cdc *codec.CodecProxy) *cobra.Command {
   160  	cmd := &cobra.Command{
   161  		Use:   "tx [hash]",
   162  		Short: "Query for a transaction by hash in a committed block",
   163  		Args:  cobra.ExactArgs(1),
   164  		RunE: func(cmd *cobra.Command, args []string) error {
   165  			cliCtx := context.NewCLIContext().WithProxy(cdc)
   166  
   167  			output, err := utils.QueryTx(cliCtx, args[0])
   168  			if err != nil {
   169  				return err
   170  			}
   171  
   172  			if output.Empty() {
   173  				return fmt.Errorf("no transaction found with hash %s", args[0])
   174  			}
   175  
   176  			return cliCtx.PrintOutput(output)
   177  		},
   178  	}
   179  
   180  	cmd.Flags().StringP(flags.FlagNode, "n", "tcp://localhost:26657", "Node to connect to")
   181  	viper.BindPFlag(flags.FlagNode, cmd.Flags().Lookup(flags.FlagNode))
   182  	cmd.Flags().Bool(flags.FlagTrustNode, false, flags.TrustNodeUsage)
   183  	viper.BindPFlag(flags.FlagTrustNode, cmd.Flags().Lookup(flags.FlagTrustNode))
   184  
   185  	return cmd
   186  }