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 }