github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/wasm/client/cli/gov_tx.go (about) 1 package cli 2 3 import ( 4 "bufio" 5 "fmt" 6 "strconv" 7 8 clientCtx "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context" 9 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec" 10 codectypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec/types" 11 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 12 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth" 13 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/client/utils" 14 govcli "github.com/fibonacci-chain/fbc/x/gov/client/cli" 15 govtypes "github.com/fibonacci-chain/fbc/x/gov/types" 16 "github.com/fibonacci-chain/fbc/x/wasm/types" 17 "github.com/spf13/cobra" 18 ) 19 20 //func ProposalStoreCodeCmd() *cobra.Command { 21 // cmd := &cobra.Command{ 22 // Use: "wasm-store [wasm file] --title [text] --description [text] --run-as [address]", 23 // Short: "Submit a wasm binary proposal", 24 // Args: cobra.ExactArgs(1), 25 // RunE: func(cmd *cobra.Command, args []string) error { 26 // clientCtx, err := client.GetClientTxContext(cmd) 27 // if err != nil { 28 // return err 29 // } 30 // 31 // src, err := parseStoreCodeArgs(args[0], clientCtx.FromAddress, cmd.Flags()) 32 // if err != nil { 33 // return err 34 // } 35 // runAs, err := cmd.Flags().GetString(flagRunAs) 36 // if err != nil { 37 // return fmt.Errorf("run-as: %s", err) 38 // } 39 // if len(runAs) == 0 { 40 // return errors.New("run-as address is required") 41 // } 42 // proposalTitle, err := cmd.Flags().GetString(cli.FlagTitle) 43 // if err != nil { 44 // return fmt.Errorf("proposal title: %s", err) 45 // } 46 // proposalDescr, err := cmd.Flags().GetString(cli.FlagDescription) 47 // if err != nil { 48 // return fmt.Errorf("proposal description: %s", err) 49 // } 50 // depositArg, err := cmd.Flags().GetString(cli.FlagDeposit) 51 // if err != nil { 52 // return err 53 // } 54 // deposit, err := sdk.ParseCoinsNormalized(depositArg) 55 // if err != nil { 56 // return err 57 // } 58 // 59 // content := types.StoreCodeProposal{ 60 // Title: proposalTitle, 61 // Description: proposalDescr, 62 // RunAs: runAs, 63 // WASMByteCode: src.WASMByteCode, 64 // InstantiatePermission: src.InstantiatePermission, 65 // } 66 // 67 // msg, err := govtypes.NewMsgSubmitProposal(&content, deposit, clientCtx.GetFromAddress()) 68 // if err != nil { 69 // return err 70 // } 71 // if err = msg.ValidateBasic(); err != nil { 72 // return err 73 // } 74 // 75 // return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 76 // }, 77 // } 78 // 79 // cmd.Flags().String(flagRunAs, "", "The address that is stored as code creator") 80 // cmd.Flags().String(flagInstantiateByEverybody, "", "Everybody can instantiate a contract from the code, optional") 81 // cmd.Flags().String(flagInstantiateNobody, "", "Nobody except the governance process can instantiate a contract from the code, optional") 82 // cmd.Flags().String(flagInstantiateByAddress, "", "Only this address can instantiate a contract instance from the code, optional") 83 // 84 // // proposal flags 85 // cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") 86 // cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") 87 // cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") 88 // cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") 89 // // type values must match the "ProposalHandler" "routes" in cli 90 // cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") 91 // return cmd 92 //} 93 // 94 //func ProposalInstantiateContractCmd() *cobra.Command { 95 // cmd := &cobra.Command{ 96 // Use: "instantiate-contract [code_id_int64] [json_encoded_init_args] --label [text] --title [text] --description [text] --run-as [address] --admin [address,optional] --amount [coins,optional]", 97 // Short: "Submit an instantiate wasm contract proposal", 98 // Args: cobra.ExactArgs(2), 99 // RunE: func(cmd *cobra.Command, args []string) error { 100 // clientCtx, err := client.GetClientTxContext(cmd) 101 // if err != nil { 102 // return err 103 // } 104 // 105 // src, err := parseInstantiateArgs(args[0], args[1], clientCtx.FromAddress, cmd.Flags()) 106 // if err != nil { 107 // return err 108 // } 109 // 110 // runAs, err := cmd.Flags().GetString(flagRunAs) 111 // if err != nil { 112 // return fmt.Errorf("run-as: %s", err) 113 // } 114 // if len(runAs) == 0 { 115 // return errors.New("run-as address is required") 116 // } 117 // proposalTitle, err := cmd.Flags().GetString(cli.FlagTitle) 118 // if err != nil { 119 // return fmt.Errorf("proposal title: %s", err) 120 // } 121 // proposalDescr, err := cmd.Flags().GetString(cli.FlagDescription) 122 // if err != nil { 123 // return fmt.Errorf("proposal description: %s", err) 124 // } 125 // depositArg, err := cmd.Flags().GetString(cli.FlagDeposit) 126 // if err != nil { 127 // return err 128 // } 129 // deposit, err := sdk.ParseCoinsNormalized(depositArg) 130 // if err != nil { 131 // return err 132 // } 133 // 134 // content := types.InstantiateContractProposal{ 135 // Title: proposalTitle, 136 // Description: proposalDescr, 137 // RunAs: runAs, 138 // Admin: src.Admin, 139 // CodeID: src.CodeID, 140 // Label: src.Label, 141 // Msg: src.Msg, 142 // Funds: src.Funds, 143 // } 144 // 145 // msg, err := govtypes.NewMsgSubmitProposal(&content, deposit, clientCtx.GetFromAddress()) 146 // if err != nil { 147 // return err 148 // } 149 // if err = msg.ValidateBasic(); err != nil { 150 // return err 151 // } 152 // 153 // return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 154 // }, 155 // } 156 // cmd.Flags().String(flagAmount, "", "Coins to send to the contract during instantiation") 157 // cmd.Flags().String(flagLabel, "", "A human-readable name for this contract in lists") 158 // cmd.Flags().String(flagAdmin, "", "Address of an admin") 159 // cmd.Flags().String(flagRunAs, "", "The address that pays the init funds. It is the creator of the contract and passed to the contract as sender on proposal execution") 160 // cmd.Flags().Bool(flagNoAdmin, false, "You must set this explicitly if you don't want an admin") 161 // 162 // // proposal flags 163 // cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") 164 // cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") 165 // cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") 166 // cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") 167 // // type values must match the "ProposalHandler" "routes" in cli 168 // cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") 169 // return cmd 170 //} 171 172 func ProposalMigrateContractCmd(m *codec.CodecProxy, reg codectypes.InterfaceRegistry) *cobra.Command { 173 cmd := &cobra.Command{ 174 Use: "migrate-contract [contract_addr_bech32] [new_code_id_int64] [json_encoded_migration_args]", 175 Short: "Submit a migrate wasm contract to a new code version proposal", 176 Args: cobra.ExactArgs(3), 177 RunE: func(cmd *cobra.Command, args []string) error { 178 inBuf := bufio.NewReader(cmd.InOrStdin()) 179 txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(m.GetCdc())) 180 cliCtx := clientCtx.NewCLIContext().WithCodec(m.GetCdc()).WithInterfaceRegistry(reg) 181 182 src, err := parseMigrateContractArgs(args, cliCtx) 183 if err != nil { 184 return err 185 } 186 187 proposalTitle, err := cmd.Flags().GetString(govcli.FlagTitle) 188 if err != nil { 189 return fmt.Errorf("proposal title: %s", err) 190 } 191 proposalDescr, err := cmd.Flags().GetString(govcli.FlagDescription) 192 if err != nil { 193 return fmt.Errorf("proposal description: %s", err) 194 } 195 depositArg, err := cmd.Flags().GetString(govcli.FlagDeposit) 196 if err != nil { 197 return err 198 } 199 200 deposit, err := sdk.ParseCoinsNormalized(depositArg) 201 if err != nil { 202 return err 203 } 204 205 content := types.MigrateContractProposal{ 206 Title: proposalTitle, 207 Description: proposalDescr, 208 Contract: src.Contract, 209 CodeID: src.CodeID, 210 Msg: src.Msg, 211 } 212 213 msg := govtypes.NewMsgSubmitProposal(&content, deposit, cliCtx.GetFromAddress()) 214 if err = msg.ValidateBasic(); err != nil { 215 return err 216 } 217 218 return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) 219 }, 220 } 221 222 // proposal flags 223 cmd.Flags().String(govcli.FlagTitle, "", "Title of proposal") 224 cmd.Flags().String(govcli.FlagDescription, "", "Description of proposal") 225 cmd.Flags().String(govcli.FlagDeposit, "", "Deposit of proposal") 226 return cmd 227 } 228 229 //func ProposalExecuteContractCmd() *cobra.Command { 230 // cmd := &cobra.Command{ 231 // Use: "execute-contract [contract_addr_bech32] [json_encoded_migration_args]", 232 // Short: "Submit a execute wasm contract proposal (run by any address)", 233 // Args: cobra.ExactArgs(2), 234 // RunE: func(cmd *cobra.Command, args []string) error { 235 // clientCtx, err := client.GetClientTxContext(cmd) 236 // if err != nil { 237 // return err 238 // } 239 // 240 // contract := args[0] 241 // execMsg := []byte(args[1]) 242 // amountStr, err := cmd.Flags().GetString(flagAmount) 243 // if err != nil { 244 // return fmt.Errorf("amount: %s", err) 245 // } 246 // funds, err := sdk.ParseCoinsNormalized(amountStr) 247 // if err != nil { 248 // return fmt.Errorf("amount: %s", err) 249 // } 250 // runAs, err := cmd.Flags().GetString(flagRunAs) 251 // if err != nil { 252 // return fmt.Errorf("run-as: %s", err) 253 // } 254 // 255 // if len(runAs) == 0 { 256 // return errors.New("run-as address is required") 257 // } 258 // proposalTitle, err := cmd.Flags().GetString(cli.FlagTitle) 259 // if err != nil { 260 // return fmt.Errorf("proposal title: %s", err) 261 // } 262 // proposalDescr, err := cmd.Flags().GetString(cli.FlagDescription) 263 // if err != nil { 264 // return fmt.Errorf("proposal description: %s", err) 265 // } 266 // depositArg, err := cmd.Flags().GetString(cli.FlagDeposit) 267 // if err != nil { 268 // return err 269 // } 270 // deposit, err := sdk.ParseCoinsNormalized(depositArg) 271 // if err != nil { 272 // return err 273 // } 274 // 275 // content := types.ExecuteContractProposal{ 276 // Title: proposalTitle, 277 // Description: proposalDescr, 278 // Contract: contract, 279 // Msg: execMsg, 280 // RunAs: runAs, 281 // Funds: funds, 282 // } 283 // 284 // msg, err := govtypes.NewMsgSubmitProposal(&content, deposit, clientCtx.GetFromAddress()) 285 // if err != nil { 286 // return err 287 // } 288 // if err = msg.ValidateBasic(); err != nil { 289 // return err 290 // } 291 // 292 // return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 293 // }, 294 // } 295 // cmd.Flags().String(flagRunAs, "", "The address that is passed as sender to the contract on proposal execution") 296 // cmd.Flags().String(flagAmount, "", "Coins to send to the contract during instantiation") 297 // 298 // // proposal flags 299 // cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") 300 // cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") 301 // cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") 302 // cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") 303 // // type values must match the "ProposalHandler" "routes" in cli 304 // cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") 305 // return cmd 306 //} 307 // 308 //func ProposalSudoContractCmd() *cobra.Command { 309 // cmd := &cobra.Command{ 310 // Use: "sudo-contract [contract_addr_bech32] [json_encoded_migration_args]", 311 // Short: "Submit a sudo wasm contract proposal (to call privileged commands)", 312 // Args: cobra.ExactArgs(2), 313 // RunE: func(cmd *cobra.Command, args []string) error { 314 // clientCtx, err := client.GetClientTxContext(cmd) 315 // if err != nil { 316 // return err 317 // } 318 // 319 // contract := args[0] 320 // sudoMsg := []byte(args[1]) 321 // 322 // proposalTitle, err := cmd.Flags().GetString(cli.FlagTitle) 323 // if err != nil { 324 // return fmt.Errorf("proposal title: %s", err) 325 // } 326 // proposalDescr, err := cmd.Flags().GetString(cli.FlagDescription) 327 // if err != nil { 328 // return fmt.Errorf("proposal description: %s", err) 329 // } 330 // depositArg, err := cmd.Flags().GetString(cli.FlagDeposit) 331 // if err != nil { 332 // return err 333 // } 334 // deposit, err := sdk.ParseCoinsNormalized(depositArg) 335 // if err != nil { 336 // return err 337 // } 338 // 339 // content := types.SudoContractProposal{ 340 // Title: proposalTitle, 341 // Description: proposalDescr, 342 // Contract: contract, 343 // Msg: sudoMsg, 344 // } 345 // 346 // msg, err := govtypes.NewMsgSubmitProposal(&content, deposit, clientCtx.GetFromAddress()) 347 // if err != nil { 348 // return err 349 // } 350 // if err = msg.ValidateBasic(); err != nil { 351 // return err 352 // } 353 // 354 // return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 355 // }, 356 // } 357 // 358 // // proposal flagsExecute 359 // cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") 360 // cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") 361 // cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") 362 // cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") 363 // // type values must match the "ProposalHandler" "routes" in cli 364 // cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") 365 // return cmd 366 //} 367 368 func ProposalUpdateContractAdminCmd(m *codec.CodecProxy, reg codectypes.InterfaceRegistry) *cobra.Command { 369 cmd := &cobra.Command{ 370 Use: "set-contract-admin [contract_addr_bech32] [new_admin_addr_bech32]", 371 Short: "Submit a new admin for a contract proposal", 372 Args: cobra.ExactArgs(2), 373 RunE: func(cmd *cobra.Command, args []string) error { 374 inBuf := bufio.NewReader(cmd.InOrStdin()) 375 txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(m.GetCdc())) 376 cliCtx := clientCtx.NewCLIContext().WithCodec(m.GetCdc()).WithInterfaceRegistry(reg) 377 378 src, err := parseUpdateContractAdminArgs(args, cliCtx) 379 if err != nil { 380 return err 381 } 382 383 proposalTitle, err := cmd.Flags().GetString(govcli.FlagTitle) 384 if err != nil { 385 return fmt.Errorf("proposal title: %s", err) 386 } 387 proposalDescr, err := cmd.Flags().GetString(govcli.FlagDescription) 388 if err != nil { 389 return fmt.Errorf("proposal description: %s", err) 390 } 391 depositArg, err := cmd.Flags().GetString(govcli.FlagDeposit) 392 if err != nil { 393 return fmt.Errorf("deposit: %s", err) 394 } 395 deposit, err := sdk.ParseCoinsNormalized(depositArg) 396 if err != nil { 397 return err 398 } 399 400 content := types.UpdateAdminProposal{ 401 Title: proposalTitle, 402 Description: proposalDescr, 403 Contract: src.Contract, 404 NewAdmin: src.NewAdmin, 405 } 406 407 msg := govtypes.NewMsgSubmitProposal(&content, deposit, cliCtx.GetFromAddress()) 408 if err = msg.ValidateBasic(); err != nil { 409 return err 410 } 411 412 return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) 413 }, 414 } 415 // proposal flags 416 cmd.Flags().String(govcli.FlagTitle, "", "Title of proposal") 417 cmd.Flags().String(govcli.FlagDescription, "", "Description of proposal") 418 cmd.Flags().String(govcli.FlagDeposit, "", "Deposit of proposal") 419 return cmd 420 } 421 422 func ProposalClearContractAdminCmd(m *codec.CodecProxy, reg codectypes.InterfaceRegistry) *cobra.Command { 423 cmd := &cobra.Command{ 424 Use: "clear-contract-admin [contract_addr_bech32]", 425 Short: "Submit a clear admin for a contract to prevent further migrations proposal", 426 Args: cobra.ExactArgs(1), 427 RunE: func(cmd *cobra.Command, args []string) error { 428 inBuf := bufio.NewReader(cmd.InOrStdin()) 429 txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(m.GetCdc())) 430 cliCtx := clientCtx.NewCLIContext().WithCodec(m.GetCdc()).WithInterfaceRegistry(reg) 431 proposalTitle, err := cmd.Flags().GetString(govcli.FlagTitle) 432 if err != nil { 433 return fmt.Errorf("proposal title: %s", err) 434 } 435 proposalDescr, err := cmd.Flags().GetString(govcli.FlagDescription) 436 if err != nil { 437 return fmt.Errorf("proposal description: %s", err) 438 } 439 depositArg, err := cmd.Flags().GetString(govcli.FlagDeposit) 440 if err != nil { 441 return fmt.Errorf("deposit: %s", err) 442 } 443 deposit, err := sdk.ParseCoinsNormalized(depositArg) 444 if err != nil { 445 return err 446 } 447 448 content := types.ClearAdminProposal{ 449 Title: proposalTitle, 450 Description: proposalDescr, 451 Contract: args[0], 452 } 453 454 msg := govtypes.NewMsgSubmitProposal(&content, deposit, cliCtx.GetFromAddress()) 455 if err = msg.ValidateBasic(); err != nil { 456 return err 457 } 458 459 return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) 460 }, 461 } 462 // proposal flags 463 cmd.Flags().String(govcli.FlagTitle, "", "Title of proposal") 464 cmd.Flags().String(govcli.FlagDescription, "", "Description of proposal") 465 cmd.Flags().String(govcli.FlagDeposit, "", "Deposit of proposal") 466 return cmd 467 } 468 469 func ProposalPinCodesCmd(m *codec.CodecProxy, reg codectypes.InterfaceRegistry) *cobra.Command { 470 cmd := &cobra.Command{ 471 Use: "pin-codes [code-ids]", 472 Short: "Submit a pin code proposal for pinning a code to cache", 473 Args: cobra.MinimumNArgs(1), 474 RunE: func(cmd *cobra.Command, args []string) error { 475 inBuf := bufio.NewReader(cmd.InOrStdin()) 476 txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(m.GetCdc())) 477 cliCtx := clientCtx.NewCLIContext().WithCodec(m.GetCdc()).WithInterfaceRegistry(reg) 478 479 proposalTitle, err := cmd.Flags().GetString(govcli.FlagTitle) 480 if err != nil { 481 return fmt.Errorf("proposal title: %s", err) 482 } 483 proposalDescr, err := cmd.Flags().GetString(govcli.FlagDescription) 484 if err != nil { 485 return fmt.Errorf("proposal description: %s", err) 486 } 487 depositArg, err := cmd.Flags().GetString(govcli.FlagDeposit) 488 if err != nil { 489 return fmt.Errorf("deposit: %s", err) 490 } 491 deposit, err := sdk.ParseCoinsNormalized(depositArg) 492 if err != nil { 493 return err 494 } 495 codeIds, err := parsePinCodesArgs(args) 496 if err != nil { 497 return err 498 } 499 500 content := types.PinCodesProposal{ 501 Title: proposalTitle, 502 Description: proposalDescr, 503 CodeIDs: codeIds, 504 } 505 506 msg := govtypes.NewMsgSubmitProposal(&content, deposit, cliCtx.GetFromAddress()) 507 if err = msg.ValidateBasic(); err != nil { 508 return err 509 } 510 511 return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) 512 }, 513 } 514 // proposal flags 515 cmd.Flags().String(govcli.FlagTitle, "", "Title of proposal") 516 cmd.Flags().String(govcli.FlagDescription, "", "Description of proposal") 517 cmd.Flags().String(govcli.FlagDeposit, "", "Deposit of proposal") 518 return cmd 519 } 520 521 func parsePinCodesArgs(args []string) ([]uint64, error) { 522 codeIDs := make([]uint64, len(args)) 523 for i, c := range args { 524 codeID, err := strconv.ParseUint(c, 10, 64) 525 if err != nil { 526 return codeIDs, fmt.Errorf("code IDs: %s", err) 527 } 528 codeIDs[i] = codeID 529 } 530 return codeIDs, nil 531 } 532 533 func ProposalUnpinCodesCmd(m *codec.CodecProxy, reg codectypes.InterfaceRegistry) *cobra.Command { 534 cmd := &cobra.Command{ 535 Use: "unpin-codes [code-ids]", 536 Short: "Submit a unpin code proposal for unpinning a code to cache", 537 Args: cobra.MinimumNArgs(1), 538 RunE: func(cmd *cobra.Command, args []string) error { 539 inBuf := bufio.NewReader(cmd.InOrStdin()) 540 txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(m.GetCdc())) 541 cliCtx := clientCtx.NewCLIContext().WithCodec(m.GetCdc()).WithInterfaceRegistry(reg) 542 543 proposalTitle, err := cmd.Flags().GetString(govcli.FlagTitle) 544 if err != nil { 545 return fmt.Errorf("proposal title: %s", err) 546 } 547 proposalDescr, err := cmd.Flags().GetString(govcli.FlagDescription) 548 if err != nil { 549 return fmt.Errorf("proposal description: %s", err) 550 } 551 depositArg, err := cmd.Flags().GetString(govcli.FlagDeposit) 552 if err != nil { 553 return fmt.Errorf("deposit: %s", err) 554 } 555 deposit, err := sdk.ParseCoinsNormalized(depositArg) 556 if err != nil { 557 return err 558 } 559 codeIds, err := parsePinCodesArgs(args) 560 if err != nil { 561 return err 562 } 563 564 content := types.UnpinCodesProposal{ 565 Title: proposalTitle, 566 Description: proposalDescr, 567 CodeIDs: codeIds, 568 } 569 570 msg := govtypes.NewMsgSubmitProposal(&content, deposit, cliCtx.GetFromAddress()) 571 if err = msg.ValidateBasic(); err != nil { 572 return err 573 } 574 575 return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) 576 }, 577 } 578 // proposal flags 579 cmd.Flags().String(govcli.FlagTitle, "", "Title of proposal") 580 cmd.Flags().String(govcli.FlagDescription, "", "Description of proposal") 581 cmd.Flags().String(govcli.FlagDeposit, "", "Deposit of proposal") 582 return cmd 583 } 584 585 //func parseAccessConfig(config string) (types.AccessConfig, error) { 586 // switch config { 587 // case "nobody": 588 // return types.AllowNobody, nil 589 // case "everybody": 590 // return types.AllowEverybody, nil 591 // default: 592 // address, err := sdk.AccAddressFromBech32(config) 593 // if err != nil { 594 // return types.AccessConfig{}, fmt.Errorf("unable to parse address %s", config) 595 // } 596 // return types.AccessTypeOnlyAddress.With(address), nil 597 // } 598 //} 599 // 600 //func parseAccessConfigUpdates(args []string) ([]types.AccessConfigUpdate, error) { 601 // updates := make([]types.AccessConfigUpdate, len(args)) 602 // for i, c := range args { 603 // // format: code_id,access_config 604 // // access_config: nobody|everybody|address 605 // parts := strings.Split(c, ",") 606 // if len(parts) != 2 { 607 // return nil, fmt.Errorf("invalid format") 608 // } 609 // 610 // codeID, err := strconv.ParseUint(parts[0], 10, 64) 611 // if err != nil { 612 // return nil, fmt.Errorf("invalid code ID: %s", err) 613 // } 614 // 615 // accessConfig, err := parseAccessConfig(parts[1]) 616 // if err != nil { 617 // return nil, err 618 // } 619 // updates[i] = types.AccessConfigUpdate{ 620 // CodeID: codeID, 621 // InstantiatePermission: accessConfig, 622 // } 623 // } 624 // return updates, nil 625 //} 626 // 627 //func ProposalUpdateInstantiateConfigCmd() *cobra.Command { 628 // bech32Prefix := sdk.GetConfig().GetBech32AccountAddrPrefix() 629 // cmd := &cobra.Command{ 630 // Use: "update-instantiate-config [code-id,permission]...", 631 // Short: "Submit an update instantiate config proposal.", 632 // Args: cobra.MinimumNArgs(1), 633 // Long: strings.TrimSpace( 634 // fmt.Sprintf(`Submit an update instantiate config proposal for multiple code ids. 635 // 636 //Example: 637 //$ %s tx gov submit-proposal update-instantiate-config 1,nobody 2,everybody 3,%s1l2rsakp388kuv9k8qzq6lrm9taddae7fpx59wm 638 //`, version.AppName, bech32Prefix)), 639 // RunE: func(cmd *cobra.Command, args []string) error { 640 // clientCtx, err := client.GetClientTxContext(cmd) 641 // if err != nil { 642 // return err 643 // } 644 // 645 // proposalTitle, err := cmd.Flags().GetString(cli.FlagTitle) 646 // if err != nil { 647 // return fmt.Errorf("proposal title: %s", err) 648 // } 649 // proposalDescr, err := cmd.Flags().GetString(cli.FlagDescription) 650 // if err != nil { 651 // return fmt.Errorf("proposal description: %s", err) 652 // } 653 // depositArg, err := cmd.Flags().GetString(cli.FlagDeposit) 654 // if err != nil { 655 // return fmt.Errorf("deposit: %s", err) 656 // } 657 // deposit, err := sdk.ParseCoinsNormalized(depositArg) 658 // if err != nil { 659 // return err 660 // } 661 // updates, err := parseAccessConfigUpdates(args) 662 // if err != nil { 663 // return err 664 // } 665 // 666 // content := types.UpdateInstantiateConfigProposal{ 667 // Title: proposalTitle, 668 // Description: proposalDescr, 669 // AccessConfigUpdates: updates, 670 // } 671 // if err := content.ValidateBasic(); err != nil { 672 // 673 // } 674 // msg := govtypes.NewMsgSubmitProposal(&content, deposit, clientCtx.GetFromAddress()) 675 // if err != nil { 676 // return err 677 // } 678 // if err = msg.ValidateBasic(); err != nil { 679 // return err 680 // } 681 // 682 // return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) 683 // }, 684 // } 685 // // proposal flags 686 // cmd.Flags().String(govcli.FlagTitle, "", "Title of proposal") 687 // cmd.Flags().String(govcli.FlagDescription, "", "Description of proposal") 688 // cmd.Flags().String(govcli.FlagDeposit, "", "Deposit of proposal") 689 // cmd.Flags().String(govcli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") 690 // // type values must match the "ProposalHandler" "routes" in cli 691 // cmd.Flags().String(flagProposalType, "", "Permission of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") 692 // return cmd 693 //}