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 }