package rest import ( "bytes" "fmt" "net/http" "github.com/gorilla/mux" "github.com/cosmos/cosmos-sdk/client/context" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/rest" "github.com/cosmos/cosmos-sdk/x/auth/client/utils" "github.com/kava-labs/kava/x/auction/types" ) type placeBidReq struct { BaseReq rest.BaseReq `json:"base_req"` AuctionID string `json:"auction_id"` Bidder string `json:"bidder"` Bid string `json:"bid"` Lot string `json:"lot"` } const ( restAuctionID = "auction_id" restBidder = "bidder" restBid = "bid" restLot = "lot" ) func registerTxRoutes(cliCtx context.CLIContext, r *mux.Router) { r.HandleFunc( fmt.Sprintf("/auction/bid/{%s}/{%s}/{%s}/{%s}", restAuctionID, restBidder, restBid, restLot), bidHandlerFn(cliCtx)).Methods("PUT") } func bidHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var req placeBidReq vars := mux.Vars(r) strAuctionID := vars[restAuctionID] bechBidder := vars[restBidder] strBid := vars[restBid] strLot := vars[restLot] auctionID, err := types.NewIDFromString(strAuctionID) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } bidder, err := sdk.AccAddressFromBech32(bechBidder) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } bid, err := sdk.ParseCoin(strBid) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } lot, err := sdk.ParseCoin(strLot) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } msg := types.NewMsgPlaceBid(auctionID, bidder, bid, lot) if err := msg.ValidateBasic(); err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } fromAddr, err := sdk.AccAddressFromBech32(req.BaseReq.From) if !bytes.Equal(fromAddr, bidder) { rest.WriteErrorResponse(w, http.StatusUnauthorized, "must bid from own address") return } utils.WriteGenerateStdTxResponse(w, cliCtx, req.BaseReq, []sdk.Msg{msg}) } }