package rest import ( "encoding/hex" "encoding/json" "io/ioutil" "net/http" "github.com/gorilla/mux" "github.com/spf13/viper" "github.com/tendermint/go-crypto/keys" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/builder" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/cosmos/cosmos-sdk/x/bank/commands" ) type sendBody struct { // fees is not used currently // Fees sdk.Coin `json="fees"` Amount sdk.Coins `json:"amount"` LocalAccountName string `json:"name"` Password string `json:"password"` ChainID string `json:"chain_id"` Sequence int64 `json:"sequence"` } // SendRequestHandler - http request handler to send coins to a address func SendRequestHandler(cdc *wire.Codec, kb keys.Keybase) func(http.ResponseWriter, *http.Request) { c := commands.Commander{cdc} return func(w http.ResponseWriter, r *http.Request) { // collect data vars := mux.Vars(r) address := vars["address"] var m sendBody body, err := ioutil.ReadAll(r.Body) if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) return } err = json.Unmarshal(body, &m) if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) return } info, err := kb.Get(m.LocalAccountName) if err != nil { w.WriteHeader(http.StatusUnauthorized) w.Write([]byte(err.Error())) return } bz, err := hex.DecodeString(address) if err != nil { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(err.Error())) return } to := sdk.Address(bz) // build message msg := commands.BuildMsg(info.PubKey.Address(), to, m.Amount) if err != nil { // XXX rechecking same error ? w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) return } // sign // XXX: OMG viper.Set(client.FlagSequence, m.Sequence) txBytes, err := builder.SignAndBuild(m.LocalAccountName, m.Password, msg, c.Cdc) if err != nil { w.WriteHeader(http.StatusUnauthorized) w.Write([]byte(err.Error())) return } // send res, err := builder.BroadcastTx(txBytes) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) return } output, err := json.MarshalIndent(res, "", " ") if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) return } w.Write(output) } }