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 }