github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/evm/client/cli/query.go (about) 1 package cli 2 3 import ( 4 "fmt" 5 6 ethcommon "github.com/ethereum/go-ethereum/common" 7 8 "strings" 9 10 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client" 11 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context" 12 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/flags" 13 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec" 14 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 15 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/version" 16 "github.com/fibonacci-chain/fbc/x/evm/client/rest" 17 "github.com/fibonacci-chain/fbc/x/evm/client/utils" 18 "github.com/fibonacci-chain/fbc/x/evm/types" 19 "github.com/pkg/errors" 20 "github.com/spf13/cobra" 21 ) 22 23 // GetQueryCmd defines evm module queries through the cli 24 func GetQueryCmd(moduleName string, cdc *codec.Codec) *cobra.Command { 25 evmQueryCmd := &cobra.Command{ 26 Use: types.ModuleName, 27 Short: "Querying commands for the evm module", 28 DisableFlagParsing: true, 29 SuggestionsMinimumDistance: 2, 30 RunE: client.ValidateCmd, 31 } 32 evmQueryCmd.AddCommand(flags.GetCommands( 33 QueryEvmTxCmd(cdc), 34 GetCmdGetStorageAt(moduleName, cdc), 35 GetCmdGetCode(moduleName, cdc), 36 GetCmdQueryParams(moduleName, cdc), 37 GetCmdQueryContractDeploymentWhitelist(moduleName, cdc), 38 GetCmdQueryContractBlockedList(moduleName, cdc), 39 GetCmdQueryContractMethodeBlockedList(moduleName, cdc), 40 GetCmdQueryManageSysContractAddress(moduleName, cdc), 41 )...) 42 return evmQueryCmd 43 } 44 45 func add0xPrefix(al types.AddressList) []string { 46 var res []string 47 for i := 0; i < len(al); i++ { 48 // decode from bech32 when using cosmos address 49 str, err := accountToHex(al[i].String()) 50 if err != nil { 51 continue 52 } 53 res = append(res, str) 54 } 55 return res 56 } 57 58 // GetCmdQueryManageSysContractAddress gets the contract blocked list query command. 59 func GetCmdQueryManageSysContractAddress(storeName string, cdc *codec.Codec) *cobra.Command { 60 return &cobra.Command{ 61 Use: "system-contract-address", 62 Short: "Query system contract address", 63 Long: strings.TrimSpace( 64 fmt.Sprintf(`Query the current system contract address. 65 66 Example: 67 $ %s query evm system-contract-address 68 `, 69 version.ClientName, 70 ), 71 ), 72 Args: cobra.NoArgs, 73 RunE: func(cmd *cobra.Command, args []string) error { 74 cliCtx := context.NewCLIContext().WithCodec(cdc) 75 route := fmt.Sprintf("custom/%s/%s", storeName, types.QuerySysContractAddress) 76 77 addr, _, err := cliCtx.QueryWithData(route, nil) 78 if err != nil { 79 return err 80 } 81 82 ethAddr := ethcommon.BytesToAddress(addr).Hex() 83 result := utils.ResponseSysContractAddress{Address: ethAddr} 84 return cliCtx.PrintOutput(result) 85 }, 86 } 87 } 88 89 // GetCmdQueryContractBlockedList gets the contract blocked list query command. 90 func GetCmdQueryContractMethodeBlockedList(storeName string, cdc *codec.Codec) *cobra.Command { 91 return &cobra.Command{ 92 Use: "contract-method-blocked-list", 93 Short: "Query the contract methode blocked list", 94 Long: strings.TrimSpace( 95 fmt.Sprintf(`Query the current blocked list of contract addresses during evm calling. 96 97 Example: 98 $ %s query evm contract-blocked-list 99 `, 100 version.ClientName, 101 ), 102 ), 103 Args: cobra.NoArgs, 104 RunE: func(cmd *cobra.Command, _ []string) error { 105 cliCtx := context.NewCLIContext().WithCodec(cdc) 106 route := fmt.Sprintf("custom/%s/%s", storeName, types.QueryContractMethodBlockedList) 107 bz, _, err := cliCtx.QueryWithData(route, nil) 108 if err != nil { 109 return err 110 } 111 112 var blockedList types.BlockedContractList 113 cdc.MustUnmarshalJSON(bz, &blockedList) 114 115 results := make([]utils.ResponseBlockContract, 0) 116 for i, _ := range blockedList { 117 ethAddr := ethcommon.BytesToAddress(blockedList[i].Address.Bytes()).Hex() 118 result := utils.ResponseBlockContract{Address: ethAddr, BlockMethods: blockedList[i].BlockMethods} 119 results = append(results, result) 120 } 121 return cliCtx.PrintOutput(results) 122 }, 123 } 124 } 125 126 // GetCmdQueryContractBlockedList gets the contract blocked list query command. 127 func GetCmdQueryContractBlockedList(storeName string, cdc *codec.Codec) *cobra.Command { 128 return &cobra.Command{ 129 Use: "contract-blocked-list", 130 Short: "Query the contract blocked list.Deprecated", 131 Long: strings.TrimSpace( 132 fmt.Sprintf(`Query the current blocked list of contract addresses during evm calling. 133 134 Example: 135 $ %s query evm contract-blocked-list 136 `, 137 version.ClientName, 138 ), 139 ), 140 Args: cobra.NoArgs, 141 RunE: func(cmd *cobra.Command, _ []string) error { 142 cliCtx := context.NewCLIContext().WithCodec(cdc) 143 route := fmt.Sprintf("custom/%s/%s", storeName, types.QueryContractBlockedList) 144 bz, _, err := cliCtx.QueryWithData(route, nil) 145 if err != nil { 146 return err 147 } 148 149 var blockedList types.AddressList 150 cdc.MustUnmarshalJSON(bz, &blockedList) 151 return cliCtx.PrintOutput(add0xPrefix(blockedList)) 152 }, 153 } 154 } 155 156 // GetCmdQueryContractDeploymentWhitelist gets the contract deployment whitelist query command. 157 func GetCmdQueryContractDeploymentWhitelist(storeName string, cdc *codec.Codec) *cobra.Command { 158 return &cobra.Command{ 159 Use: "contract-deployment-whitelist", 160 Short: "Query the whitelist of contract deployment", 161 Long: strings.TrimSpace( 162 fmt.Sprintf(`Query the current whitelist of distributors for contract deployment. 163 164 Example: 165 $ %s query evm contract-deployment-whitelist 166 `, 167 version.ClientName, 168 ), 169 ), 170 Args: cobra.NoArgs, 171 RunE: func(cmd *cobra.Command, _ []string) error { 172 cliCtx := context.NewCLIContext().WithCodec(cdc) 173 route := fmt.Sprintf("custom/%s/%s", storeName, types.QueryContractDeploymentWhitelist) 174 bz, _, err := cliCtx.QueryWithData(route, nil) 175 if err != nil { 176 return err 177 } 178 179 var whitelist types.AddressList 180 cdc.MustUnmarshalJSON(bz, &whitelist) 181 return cliCtx.PrintOutput(whitelist) 182 }, 183 } 184 } 185 186 // QueryEvmTxCmd implements the command for the query of transactions including evm 187 func QueryEvmTxCmd(cdc *codec.Codec) *cobra.Command { 188 cmd := &cobra.Command{ 189 Use: "tx [hash]", 190 Short: "Query for all transactions including evm by hash in a committed block", 191 Args: cobra.ExactArgs(1), 192 RunE: func(cmd *cobra.Command, args []string) error { 193 cliCtx := context.NewCLIContext().WithCodec(cdc) 194 195 res, err := rest.QueryTx(cliCtx, args[0]) 196 if err != nil { 197 return err 198 } 199 200 output, ok := res.(sdk.TxResponse) 201 if !ok { 202 // evm tx result 203 fmt.Println(string(res.([]byte))) 204 return nil 205 } 206 207 if output.Empty() { 208 return fmt.Errorf("no transaction found with hash %s", args[0]) 209 } 210 211 return cliCtx.PrintOutput(output) 212 }, 213 } 214 215 return cmd 216 } 217 218 // GetCmdGetStorageAt queries a key in an accounts storage 219 func GetCmdGetStorageAt(queryRoute string, cdc *codec.Codec) *cobra.Command { 220 return &cobra.Command{ 221 Use: "storage [account] [key]", 222 Short: "Gets storage for an account at a given key", 223 Args: cobra.ExactArgs(2), 224 RunE: func(cmd *cobra.Command, args []string) error { 225 clientCtx := context.NewCLIContext().WithCodec(cdc) 226 227 account, err := accountToHex(args[0]) 228 if err != nil { 229 return errors.Wrap(err, "could not parse account address") 230 } 231 232 key := formatKeyToHash(args[1]) 233 234 res, _, err := clientCtx.Query( 235 fmt.Sprintf("custom/%s/storage/%s/%s", queryRoute, account, key)) 236 237 if err != nil { 238 return fmt.Errorf("could not resolve: %s", err) 239 } 240 var out types.QueryResStorage 241 cdc.MustUnmarshalJSON(res, &out) 242 return clientCtx.PrintOutput(out) 243 }, 244 } 245 } 246 247 // GetCmdGetCode queries the code field of a given address 248 func GetCmdGetCode(queryRoute string, cdc *codec.Codec) *cobra.Command { 249 return &cobra.Command{ 250 Use: "code [account]", 251 Short: "Gets code from an account", 252 Args: cobra.ExactArgs(1), 253 RunE: func(cmd *cobra.Command, args []string) error { 254 clientCtx := context.NewCLIContext().WithCodec(cdc) 255 256 account, err := accountToHex(args[0]) 257 if err != nil { 258 return errors.Wrap(err, "could not parse account address") 259 } 260 261 res, _, err := clientCtx.Query( 262 fmt.Sprintf("custom/%s/code/%s", queryRoute, account)) 263 264 if err != nil { 265 return fmt.Errorf("could not resolve: %s", err) 266 } 267 268 var out types.QueryResCode 269 cdc.MustUnmarshalJSON(res, &out) 270 return clientCtx.PrintOutput(out) 271 }, 272 } 273 } 274 275 // GetCmdQueryParams implements the query params command. 276 func GetCmdQueryParams(queryRoute string, cdc *codec.Codec) *cobra.Command { 277 return &cobra.Command{ 278 Use: "params", 279 Short: "Query all the modifiable parameters of gov proposal", 280 Long: strings.TrimSpace(`Query the all the parameters for the governance process: 281 282 $ fbchaincli query evm params 283 `), 284 Args: cobra.NoArgs, 285 RunE: func(_ *cobra.Command, _ []string) error { 286 cliCtx := context.NewCLIContext().WithCodec(cdc) 287 288 route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryParameters) 289 bz, _, err := cliCtx.QueryWithData(route, nil) 290 if err != nil { 291 return err 292 } 293 294 var params types.Params 295 cdc.MustUnmarshalJSON(bz, ¶ms) 296 return cliCtx.PrintOutput(params) 297 }, 298 } 299 }