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  }