github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/params/client/cli/commit_upgrade.go (about) 1 package cli 2 3 import ( 4 "bufio" 5 "fmt" 6 "os" 7 "strings" 8 9 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context" 10 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec" 11 interfacetypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec/types" 12 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 13 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/version" 14 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth" 15 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/client/utils" 16 govTypes "github.com/fibonacci-chain/fbc/x/gov/types" 17 "github.com/fibonacci-chain/fbc/x/params/types" 18 "github.com/spf13/cobra" 19 ) 20 21 type UpgradeProposalJSON struct { 22 Title string `json:"title" yaml:"title"` 23 Description string `json:"description" yaml:"description"` 24 Deposit sdk.SysCoins `json:"deposit" yaml:"deposit"` 25 26 Name string `json:"name" yaml:"name"` 27 ExpectHeight uint64 `json:"expectHeight" yaml:"expectHeight"` 28 Config string `json:"config,omitempty" yaml:"config,omitempty"` 29 } 30 31 func ParseUpgradeProposalJSON(cdc *codec.Codec, proposalFile string) (UpgradeProposalJSON, error) { 32 var proposal UpgradeProposalJSON 33 34 contents, err := os.ReadFile(proposalFile) 35 if err != nil { 36 return proposal, err 37 } 38 39 if err := cdc.UnmarshalJSON(contents, &proposal); err != nil { 40 return proposal, err 41 } 42 43 return proposal, nil 44 } 45 46 func GetCmdSubmitUpgradeProposal(cdcP *codec.CodecProxy, _ interfacetypes.InterfaceRegistry) *cobra.Command { 47 cmd := &cobra.Command{ 48 Use: "upgrade [proposal-file]", 49 Args: cobra.ExactArgs(1), 50 Short: "Submit a upgrade proposal", 51 Long: strings.TrimSpace( 52 fmt.Sprintf(`Submit a upgrade proposal along with an initial deposit. 53 The proposal details must be supplied via a JSON file. proposal name is unique, so if a 54 proposal's name has been exist, proposal will not be commit successful. 55 Besides set upgrade's' take effect height, you can also set others config in 'config' field, 56 which must be a string. You can also omit it if you don't care about it. 57 IMPORTANT: Only validators or delagators can submit a upgrade proposal. 58 Example: 59 $ %s tx gov submit-proposal upgrade <path/to/proposal.json> --from=<key_or_address> 60 Where proposal.json contains: 61 { 62 "title": "upgrade title", 63 "description": "upgrade description", 64 "deposit": [ 65 { 66 "denom": "%s", 67 "amount": "10000" 68 } 69 ], 70 "name": "YourUpgradeName", 71 "expectHeight": "1000", 72 "config": "your config string or empty" 73 } 74 `, 75 version.ClientName, sdk.DefaultBondDenom, 76 ), 77 ), 78 RunE: func(cmd *cobra.Command, args []string) error { 79 cdc := cdcP.GetCdc() 80 inBuf := bufio.NewReader(cmd.InOrStdin()) 81 txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) 82 cliCtx := context.NewCLIContext().WithCodec(cdc) 83 84 proposal, err := ParseUpgradeProposalJSON(cdc, args[0]) 85 if err != nil { 86 return err 87 } 88 89 from := cliCtx.GetFromAddress() 90 content := types.NewUpgradeProposal( 91 proposal.Title, 92 proposal.Description, 93 proposal.Name, 94 proposal.ExpectHeight, 95 proposal.Config, 96 ) 97 98 msg := govTypes.NewMsgSubmitProposal(content, proposal.Deposit, from) 99 if err := msg.ValidateBasic(); err != nil { 100 return err 101 } 102 103 return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) 104 }, 105 } 106 107 return cmd 108 }