From ac0a7c0a1d95206c3677e6d632035ddcd3dfdad6 Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Mon, 10 Dec 2018 14:26:34 +0000 Subject: [PATCH] Move generate_only and simulate to POST body in REST txs Closes: #3056 --- client/lcd/lcd_test.go | 28 ++++++++++++++++------------ client/utils/rest.go | 30 +++++++----------------------- x/stake/client/rest/tx.go | 6 +++--- 3 files changed, 26 insertions(+), 38 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 04453111a..34f8edbc9 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -279,29 +279,29 @@ func TestCoinSend(t *testing.T) { require.Equal(t, int64(1), mycoins.Amount.Int64()) // test failure with too little gas - res, body, _ = doSendWithGas(t, port, seed, name, password, addr, "100", 0, "") + res, body, _ = doSendWithGas(t, port, seed, name, password, addr, "100", 0, false, false) require.Equal(t, http.StatusInternalServerError, res.StatusCode, body) // test failure with negative gas - res, body, _ = doSendWithGas(t, port, seed, name, password, addr, "-200", 0, "") + res, body, _ = doSendWithGas(t, port, seed, name, password, addr, "-200", 0, false, false) require.Equal(t, http.StatusBadRequest, res.StatusCode, body) // test failure with 0 gas - res, body, _ = doSendWithGas(t, port, seed, name, password, addr, "0", 0, "") + res, body, _ = doSendWithGas(t, port, seed, name, password, addr, "0", 0, false, false) require.Equal(t, http.StatusInternalServerError, res.StatusCode, body) // test failure with wrong adjustment - res, body, _ = doSendWithGas(t, port, seed, name, password, addr, "simulate", 0.1, "") + res, body, _ = doSendWithGas(t, port, seed, name, password, addr, "simulate", 0.1, false, false) require.Equal(t, http.StatusInternalServerError, res.StatusCode, body) // run simulation and test success with estimated gas - res, body, _ = doSendWithGas(t, port, seed, name, password, addr, "", 0, "?simulate=true") + res, body, _ = doSendWithGas(t, port, seed, name, password, addr, "", 0, true, false) require.Equal(t, http.StatusOK, res.StatusCode, body) var responseBody struct { GasEstimate int64 `json:"gas_estimate"` } require.Nil(t, json.Unmarshal([]byte(body), &responseBody)) - res, body, _ = doSendWithGas(t, port, seed, name, password, addr, fmt.Sprintf("%v", responseBody.GasEstimate), 0, "") + res, body, _ = doSendWithGas(t, port, seed, name, password, addr, fmt.Sprintf("%v", responseBody.GasEstimate), 0, false, false) require.Equal(t, http.StatusOK, res.StatusCode, body) } @@ -342,7 +342,7 @@ func TestCoinSendGenerateSignAndBroadcast(t *testing.T) { acc := getAccount(t, port, addr) // generate TX - res, body, _ := doSendWithGas(t, port, seed, name, password, addr, "simulate", 0, "?generate_only=true") + res, body, _ := doSendWithGas(t, port, seed, name, password, addr, "simulate", 0, false, true) require.Equal(t, http.StatusOK, res.StatusCode, body) var msg auth.StdTx require.Nil(t, cdc.UnmarshalJSON([]byte(body), &msg)) @@ -897,7 +897,9 @@ func getAccount(t *testing.T, port string, addr sdk.AccAddress) auth.Account { return acc } -func doSendWithGas(t *testing.T, port, seed, name, password string, addr sdk.AccAddress, gas string, gasAdjustment float64, queryStr string) (res *http.Response, body string, receiveAddr sdk.AccAddress) { +func doSendWithGas(t *testing.T, port, seed, name, password string, addr sdk.AccAddress, gas string, + gasAdjustment float64, simulate, generateOnly bool) ( + res *http.Response, body string, receiveAddr sdk.AccAddress) { // create receive address kb := client.MockKeyBase() @@ -935,11 +937,13 @@ func doSendWithGas(t *testing.T, port, seed, name, password string, addr sdk.Acc "password": "%s", "chain_id": "%s", "account_number":"%d", - "sequence":"%d" + "sequence": "%d", + "simulate": %v, + "generate_only": %v } - }`, coinbz, gasStr, gasAdjustmentStr, name, password, chainID, accnum, sequence)) + }`, coinbz, gasStr, gasAdjustmentStr, name, password, chainID, accnum, sequence, simulate, generateOnly)) - res, body = Request(t, port, "POST", fmt.Sprintf("/bank/accounts/%s/transfers%v", receiveAddr, queryStr), jsonStr) + res, body = Request(t, port, "POST", fmt.Sprintf("/bank/accounts/%s/transfers", receiveAddr), jsonStr) return } @@ -958,7 +962,7 @@ func doRecoverKey(t *testing.T, port, recoverName, recoverPassword, seed string) } func doSend(t *testing.T, port, seed, name, password string, addr sdk.AccAddress) (receiveAddr sdk.AccAddress, resultTx ctypes.ResultBroadcastTxCommit) { - res, body, receiveAddr := doSendWithGas(t, port, seed, name, password, addr, "", 0, "") + res, body, receiveAddr := doSendWithGas(t, port, seed, name, password, addr, "", 0, false, false) require.Equal(t, http.StatusOK, res.StatusCode, body) err := cdc.UnmarshalJSON([]byte(body), &resultTx) diff --git a/client/utils/rest.go b/client/utils/rest.go index c0a8c3c77..36ff05af8 100644 --- a/client/utils/rest.go +++ b/client/utils/rest.go @@ -4,7 +4,6 @@ import ( "fmt" "io/ioutil" "net/http" - "net/url" "strconv" "strings" @@ -17,11 +16,6 @@ import ( authtxb "github.com/cosmos/cosmos-sdk/x/auth/client/txbuilder" ) -const ( - queryArgDryRun = "simulate" - queryArgGenerateOnly = "generate_only" -) - //---------------------------------------- // Basic HTTP utilities @@ -39,18 +33,6 @@ func WriteSimulationResponse(w http.ResponseWriter, gas uint64) { w.Write([]byte(fmt.Sprintf(`{"gas_estimate":%v}`, gas))) } -// HasDryRunArg returns true if the request's URL query contains the dry run -// argument and its value is set to "true". -func HasDryRunArg(r *http.Request) bool { - return urlQueryHasArg(r.URL, queryArgDryRun) -} - -// HasGenerateOnlyArg returns whether a URL's query "generate-only" parameter -// is set to "true". -func HasGenerateOnlyArg(r *http.Request) bool { - return urlQueryHasArg(r.URL, queryArgGenerateOnly) -} - // ParseInt64OrReturnBadRequest converts s to a int64 value. func ParseInt64OrReturnBadRequest(w http.ResponseWriter, s string) (n int64, ok bool) { var err error @@ -113,8 +95,6 @@ func WriteGenerateStdTxResponse(w http.ResponseWriter, txBldr authtxb.TxBuilder, return } -func urlQueryHasArg(url *url.URL, arg string) bool { return url.Query().Get(arg) == "true" } - //---------------------------------------- // Building / Sending utilities @@ -128,6 +108,8 @@ type BaseReq struct { Sequence uint64 `json:"sequence"` Gas string `json:"gas"` GasAdjustment string `json:"gas_adjustment"` + GenerateOnly bool `json:"generate_only"` + Simulate bool `json:"simulate"` } // Sanitize performs basic sanitization on a BaseReq object. @@ -140,6 +122,8 @@ func (br BaseReq) Sanitize() BaseReq { GasAdjustment: strings.TrimSpace(br.GasAdjustment), AccountNumber: br.AccountNumber, Sequence: br.Sequence, + GenerateOnly: br.GenerateOnly, + Simulate: br.Simulate, } } @@ -223,14 +207,14 @@ func CompleteAndBroadcastTxREST(w http.ResponseWriter, r *http.Request, cliCtx c Sequence: baseReq.Sequence, } - if HasDryRunArg(r) || txBldr.SimulateGas { + if baseReq.Simulate || txBldr.SimulateGas { newBldr, err := EnrichCtxWithGas(txBldr, cliCtx, baseReq.Name, msgs) if err != nil { WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } - if HasDryRunArg(r) { + if baseReq.Simulate { WriteSimulationResponse(w, newBldr.Gas) return } @@ -238,7 +222,7 @@ func CompleteAndBroadcastTxREST(w http.ResponseWriter, r *http.Request, cliCtx c txBldr = newBldr } - if HasGenerateOnlyArg(r) { + if baseReq.GenerateOnly { WriteGenerateStdTxResponse(w, txBldr, msgs) return } diff --git a/x/stake/client/rest/tx.go b/x/stake/client/rest/tx.go index 437d40e77..5deb5b53c 100644 --- a/x/stake/client/rest/tx.go +++ b/x/stake/client/rest/tx.go @@ -219,14 +219,14 @@ func delegationsRequestHandlerFn(cdc *codec.Codec, kb keys.Keybase, cliCtx conte baseReq.Sequence++ - if utils.HasDryRunArg(r) || txBldr.SimulateGas { + if baseReq.Simulate || txBldr.SimulateGas { newBldr, err := utils.EnrichCtxWithGas(txBldr, cliCtx, baseReq.Name, []sdk.Msg{msg}) if err != nil { utils.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } - if utils.HasDryRunArg(r) { + if baseReq.Simulate { utils.WriteSimulationResponse(w, newBldr.Gas) return } @@ -234,7 +234,7 @@ func delegationsRequestHandlerFn(cdc *codec.Codec, kb keys.Keybase, cliCtx conte txBldr = newBldr } - if utils.HasGenerateOnlyArg(r) { + if baseReq.GenerateOnly { utils.WriteGenerateStdTxResponse(w, txBldr, []sdk.Msg{msg}) return }