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, &params)
   296  			return cliCtx.PrintOutput(params)
   297  		},
   298  	}
   299  }