github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/erc20/client/cli/tx.go (about)

     1  package cli
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"strconv"
     8  	"strings"
     9  
    10  	"github.com/ethereum/go-ethereum/common"
    11  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context"
    12  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    13  	interfacetypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec/types"
    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/libs/cosmos-sdk/x/auth"
    17  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/client/utils"
    18  	govcli "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/gov/client/cli"
    19  	"github.com/fibonacci-chain/fbc/x/erc20/types"
    20  	"github.com/fibonacci-chain/fbc/x/gov"
    21  	"github.com/spf13/cobra"
    22  )
    23  
    24  // GetCmdTokenMappingProposal returns a CLI command handler for creating
    25  // a token mapping proposal governance transaction.
    26  func GetCmdTokenMappingProposal(cdcP *codec.CodecProxy, reg interfacetypes.InterfaceRegistry) *cobra.Command {
    27  	cmd := &cobra.Command{
    28  		Use:   "token-mapping [denom] [contract]",
    29  		Args:  cobra.ExactArgs(2),
    30  		Short: "Submit a token mapping proposal",
    31  		Long: strings.TrimSpace(
    32  			fmt.Sprintf(`Submit a token mapping proposal.
    33  
    34  Example:
    35  $ %s tx gov submit-proposal token-mapping xxb 0x0000...0000 --from=<key_or_address>
    36  `, version.ClientName,
    37  			)),
    38  		RunE: func(cmd *cobra.Command, args []string) error {
    39  			cdc := cdcP.GetCdc()
    40  			inBuf := bufio.NewReader(cmd.InOrStdin())
    41  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
    42  			cliCtx := context.NewCLIContext().WithCodec(cdc)
    43  
    44  			title, err := cmd.Flags().GetString(govcli.FlagTitle)
    45  			if err != nil {
    46  				return err
    47  			}
    48  
    49  			description, err := cmd.Flags().GetString(govcli.FlagDescription)
    50  			if err != nil {
    51  				return err
    52  			}
    53  
    54  			var contract *common.Address
    55  			if len(args[1]) > 0 {
    56  				if common.IsHexAddress(args[1]) {
    57  					addr := common.HexToAddress(args[1])
    58  					contract = &addr
    59  				} else {
    60  					return fmt.Errorf("invalid contract address %s", args[1])
    61  				}
    62  			}
    63  
    64  			content := types.NewTokenMappingProposal(
    65  				title, description, args[0], contract,
    66  			)
    67  			if err := content.ValidateBasic(); err != nil {
    68  				return err
    69  			}
    70  
    71  			strDeposit, err := cmd.Flags().GetString(govcli.FlagDeposit)
    72  			if err != nil {
    73  				return err
    74  			}
    75  
    76  			deposit, err := sdk.ParseCoins(strDeposit)
    77  			if err != nil {
    78  				return err
    79  			}
    80  
    81  			msg := gov.NewMsgSubmitProposal(content, deposit, cliCtx.GetFromAddress())
    82  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
    83  		},
    84  	}
    85  	cmd.Flags().String(govcli.FlagTitle, "", "title of proposal")
    86  	cmd.Flags().String(govcli.FlagDescription, "", "description of proposal")
    87  	cmd.Flags().String(govcli.FlagDeposit, "", "deposit of proposal")
    88  
    89  	return cmd
    90  }
    91  
    92  func GetCmdProxyContractRedirectProposal(cdcP *codec.CodecProxy, reg interfacetypes.InterfaceRegistry) *cobra.Command {
    93  	cdc := cdcP.GetCdc()
    94  	cmd := &cobra.Command{
    95  		Use:   "contract-redirect [denom] [tp] [contract|owner]",
    96  		Args:  cobra.ExactArgs(3),
    97  		Short: "Submit a proxy contract redirect proposal",
    98  		Long: strings.TrimSpace(
    99  			fmt.Sprintf(`Submit a proxy contract redirect proposal.
   100    tp: 
   101  	0	implementation	implementation address
   102  	1	owner			owner address
   103  Example:
   104  $ %s tx gov submit-proposal contract-redirect xxb 0 0xffffffffffffffffffff
   105  `, version.ClientName,
   106  			)),
   107  		RunE: func(cmd *cobra.Command, args []string) error {
   108  			inBuf := bufio.NewReader(cmd.InOrStdin())
   109  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
   110  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   111  
   112  			title, err := cmd.Flags().GetString(govcli.FlagTitle)
   113  			if err != nil {
   114  				return err
   115  			}
   116  
   117  			description, err := cmd.Flags().GetString(govcli.FlagDescription)
   118  			if err != nil {
   119  				return err
   120  			}
   121  
   122  			tp, err := strconv.Atoi(args[1])
   123  			if err != nil {
   124  				return fmt.Errorf("invalid redirect tp,only support 0(change contract) or 1(change owner),but give %s", args[1])
   125  			}
   126  			var redirectaddr common.Address
   127  			if len(args[1]) > 0 {
   128  				if common.IsHexAddress(args[2]) {
   129  					redirectaddr = common.HexToAddress(args[2])
   130  				} else {
   131  					return fmt.Errorf("invalid contract address %s", args[1])
   132  				}
   133  			}
   134  
   135  			content := types.NewProxyContractRedirectProposal(
   136  				title, description, args[0], types.RedirectType(tp), &redirectaddr,
   137  			)
   138  			if err := content.ValidateBasic(); err != nil {
   139  				return err
   140  			}
   141  
   142  			strDeposit, err := cmd.Flags().GetString(govcli.FlagDeposit)
   143  			if err != nil {
   144  				return err
   145  			}
   146  
   147  			deposit, err := sdk.ParseCoins(strDeposit)
   148  			if err != nil {
   149  				return err
   150  			}
   151  
   152  			msg := gov.NewMsgSubmitProposal(content, deposit, cliCtx.GetFromAddress())
   153  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   154  		},
   155  	}
   156  	cmd.Flags().String(govcli.FlagTitle, "", "title of proposal")
   157  	cmd.Flags().String(govcli.FlagDescription, "", "description of proposal")
   158  	cmd.Flags().String(govcli.FlagDeposit, "", "deposit of proposal")
   159  
   160  	return cmd
   161  }
   162  
   163  func SetContractTemplateProposal(cdcP *codec.CodecProxy, reg interfacetypes.InterfaceRegistry) *cobra.Command {
   164  	cdc := cdcP.GetCdc()
   165  	cmd := &cobra.Command{
   166  		Use:   "contract-template  [file-path] proxy/implement",
   167  		Args:  cobra.ExactArgs(2),
   168  		Short: "Submit a new bytecode template contract proposal",
   169  		Long: strings.TrimSpace(
   170  			fmt.Sprintf(`Submit a contract template proposal.
   171  Example:
   172  $ %s tx gov submit-proposal contract-template ~/template.json proxy/implement --from=<key_or_address>
   173  the template.json should be like : 
   174  {
   175  	"abi":[xxxxx],
   176  	"bin":"xxxx"
   177  }
   178  `, version.ClientName,
   179  			)),
   180  		RunE: func(cmd *cobra.Command, args []string) error {
   181  			inBuf := bufio.NewReader(cmd.InOrStdin())
   182  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
   183  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   184  
   185  			title, err := cmd.Flags().GetString(govcli.FlagTitle)
   186  			if err != nil {
   187  				return err
   188  			}
   189  
   190  			description, err := cmd.Flags().GetString(govcli.FlagDescription)
   191  			if err != nil {
   192  				return err
   193  			}
   194  
   195  			data, err := ioutil.ReadFile(args[0])
   196  			if nil != err {
   197  				return err
   198  			}
   199  
   200  			_, err = types.UnmarshalCompileContract(data)
   201  			if nil != err {
   202  				return err
   203  			}
   204  
   205  			content := types.NewContractTemplateProposal(
   206  				title, description, args[1], string(data),
   207  			)
   208  			if err := content.ValidateBasic(); err != nil {
   209  				return err
   210  			}
   211  
   212  			strDeposit, err := cmd.Flags().GetString(govcli.FlagDeposit)
   213  			if err != nil {
   214  				return err
   215  			}
   216  
   217  			deposit, err := sdk.ParseCoins(strDeposit)
   218  			if err != nil {
   219  				return err
   220  			}
   221  
   222  			msg := gov.NewMsgSubmitProposal(content, deposit, cliCtx.GetFromAddress())
   223  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   224  		},
   225  	}
   226  	cmd.Flags().String(govcli.FlagTitle, "", "title of proposal")
   227  	cmd.Flags().String(govcli.FlagDescription, "", "description of proposal")
   228  	cmd.Flags().String(govcli.FlagDeposit, "", "deposit of proposal")
   229  
   230  	return cmd
   231  }