github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/upgrade/client/rest/tx.go (about)

     1  package rest
     2  
     3  import (
     4  	"net/http"
     5  	"time"
     6  
     7  	"github.com/gorilla/mux"
     8  
     9  	govrest "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/gov/client/rest"
    10  
    11  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context"
    12  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    13  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/rest"
    14  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/client/utils"
    15  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/gov"
    16  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/upgrade/internal/types"
    17  )
    18  
    19  func registerTxRoutes(cliCtx context.CLIContext, r *mux.Router) {
    20  	r.HandleFunc("/upgrade/plan", postPlanHandler(cliCtx)).Methods("POST")
    21  	r.HandleFunc("/upgrade/cancel", cancelPlanHandler(cliCtx)).Methods("POST")
    22  }
    23  
    24  // PlanRequest defines a proposal for a new upgrade plan.
    25  type PlanRequest struct {
    26  	BaseReq       rest.BaseReq `json:"base_req" yaml:"base_req"`
    27  	Title         string       `json:"title" yaml:"title"`
    28  	Description   string       `json:"description" yaml:"description"`
    29  	Deposit       sdk.Coins    `json:"deposit" yaml:"deposit"`
    30  	UpgradeName   string       `json:"upgrade_name" yaml:"upgrade_name"`
    31  	UpgradeHeight int64        `json:"upgrade_height" yaml:"upgrade_height"`
    32  	UpgradeTime   string       `json:"upgrade_time" yaml:"upgrade_time"`
    33  	UpgradeInfo   string       `json:"upgrade_info" yaml:"upgrade_info"`
    34  }
    35  
    36  // CancelRequest defines a proposal to cancel a current plan.
    37  type CancelRequest struct {
    38  	BaseReq     rest.BaseReq `json:"base_req" yaml:"base_req"`
    39  	Title       string       `json:"title" yaml:"title"`
    40  	Description string       `json:"description" yaml:"description"`
    41  	Deposit     sdk.Coins    `json:"deposit" yaml:"deposit"`
    42  }
    43  
    44  func ProposalRESTHandler(cliCtx context.CLIContext) govrest.ProposalRESTHandler {
    45  	return govrest.ProposalRESTHandler{
    46  		SubRoute: "upgrade",
    47  		Handler:  postPlanHandler(cliCtx),
    48  	}
    49  }
    50  
    51  func postPlanHandler(cliCtx context.CLIContext) http.HandlerFunc {
    52  	return func(w http.ResponseWriter, r *http.Request) {
    53  		var req PlanRequest
    54  
    55  		if !rest.ReadRESTReq(w, r, cliCtx.Codec, &req) {
    56  			return
    57  		}
    58  
    59  		req.BaseReq = req.BaseReq.Sanitize()
    60  		if !req.BaseReq.ValidateBasic(w) {
    61  			return
    62  		}
    63  
    64  		fromAddr, err := sdk.AccAddressFromBech32(req.BaseReq.From)
    65  		if err != nil {
    66  			rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
    67  			return
    68  		}
    69  
    70  		var t time.Time
    71  		if req.UpgradeTime != "" {
    72  			t, err = time.Parse(time.RFC3339, req.UpgradeTime)
    73  			if err != nil {
    74  				rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
    75  				return
    76  			}
    77  		}
    78  
    79  		plan := types.Plan{Name: req.UpgradeName, Time: t, Height: req.UpgradeHeight, Info: req.UpgradeInfo}
    80  		content := types.NewSoftwareUpgradeProposal(req.Title, req.Description, plan)
    81  		msg := gov.NewMsgSubmitProposal(content, req.Deposit, fromAddr)
    82  		if err := msg.ValidateBasic(); err != nil {
    83  			rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
    84  			return
    85  		}
    86  
    87  		utils.WriteGenerateStdTxResponse(w, cliCtx, req.BaseReq, []sdk.Msg{msg})
    88  	}
    89  }
    90  
    91  func cancelPlanHandler(cliCtx context.CLIContext) http.HandlerFunc {
    92  	return func(w http.ResponseWriter, r *http.Request) {
    93  		var req CancelRequest
    94  
    95  		if !rest.ReadRESTReq(w, r, cliCtx.Codec, &req) {
    96  			return
    97  		}
    98  
    99  		req.BaseReq = req.BaseReq.Sanitize()
   100  		if !req.BaseReq.ValidateBasic(w) {
   101  			return
   102  		}
   103  
   104  		fromAddr, err := sdk.AccAddressFromBech32(req.BaseReq.From)
   105  		if err != nil {
   106  			rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
   107  			return
   108  		}
   109  
   110  		content := types.NewCancelSoftwareUpgradeProposal(req.Title, req.Description)
   111  		msg := gov.NewMsgSubmitProposal(content, req.Deposit, fromAddr)
   112  		if err := msg.ValidateBasic(); err != nil {
   113  			rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
   114  			return
   115  		}
   116  
   117  		utils.WriteGenerateStdTxResponse(w, cliCtx, req.BaseReq, []sdk.Msg{msg})
   118  	}
   119  }