diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e741fd7..17de3f9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,6 +61,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Bug Fixes * (rpc) [#1179](https://github.com/evmos/ethermint/pull/1179) Fix gas used in traceTransaction response. +* (rpc) [#1284](https://github.com/evmos/ethermint/pull/1284) Fix internal trace response upon incomplete `eth_sendTransaction` call. ## [v0.18.0] - 2022-08-04 diff --git a/rpc/backend/sign_tx.go b/rpc/backend/sign_tx.go index ae656215..09c9775b 100644 --- a/rpc/backend/sign_tx.go +++ b/rpc/backend/sign_tx.go @@ -21,9 +21,9 @@ import ( // SendTransaction sends transaction based on received args using Node's key to sign it func (b *Backend) SendTransaction(args evmtypes.TransactionArgs) (common.Hash, error) { // Look up the wallet containing the requested signer - _, err := b.clientCtx.Keyring.KeyByAddress(sdk.AccAddress(args.From.Bytes())) + _, err := b.clientCtx.Keyring.KeyByAddress(sdk.AccAddress(args.GetFrom().Bytes())) if err != nil { - b.logger.Error("failed to find key in keyring", "address", args.From, "error", err.Error()) + b.logger.Error("failed to find key in keyring", "address", args.GetFrom(), "error", err.Error()) return common.Hash{}, fmt.Errorf("%s; %s", keystore.ErrNoMatch, err.Error()) } diff --git a/rpc/websockets.go b/rpc/websockets.go index c501ace3..555a68c3 100644 --- a/rpc/websockets.go +++ b/rpc/websockets.go @@ -94,6 +94,7 @@ func (s *websocketsServer) Start() { go func() { var err error + /* #nosec G114 -- http functions have no support for timeouts */ if s.certFile == "" || s.keyFile == "" { err = http.ListenAndServe(s.wsAddr, ws) } else { diff --git a/tests/integration_tests/test_types.py b/tests/integration_tests/test_types.py index 8126e448..afc9dd96 100644 --- a/tests/integration_tests/test_types.py +++ b/tests/integration_tests/test_types.py @@ -323,6 +323,15 @@ def make_same_rpc_calls(rpc1, rpc2, method, params): assert res, err +def test_incomplete_send_transaction(ethermint, geth): + # Send ethereum tx with nothing in from field + eth_rpc = ethermint.w3.provider + geth_rpc = geth.w3.provider + gas_price = ethermint.w3.eth.gas_price + tx = {"from": "", "to": ADDRS["community"], "value": 0, "gasPrice": gas_price} + make_same_rpc_calls(eth_rpc, geth_rpc, "eth_sendTransaction", [tx]) + + def same_types(object_a, object_b): if isinstance(object_a, dict): diff --git a/tests/rpc/rpc_test.go b/tests/rpc/rpc_test.go index daf6a75a..1039951a 100644 --- a/tests/rpc/rpc_test.go +++ b/tests/rpc/rpc_test.go @@ -329,6 +329,24 @@ func waitForReceipt(t *testing.T, hash hexutil.Bytes) map[string]interface{} { } } +func TestEth_IncompleteSendTransaction(t *testing.T) { + // get gasprice + gasPrice := GetGasPrice(t) + + // make tx params without from address + param := make([]map[string]string, 1) + param[0] = make(map[string]string) + param[0]["from"] = "" + param[0]["to"] = "0x1122334455667788990011223344556677889900" + param[0]["value"] = "0x1" + param[0]["gasPrice"] = gasPrice + _, err := callWithError("eth_sendTransaction", param) + + // require well-formatted error (should not be "method handler crashed") + require.Error(t, err) + require.NotEqual(t, err.Error(), "method handler crashed", "no from field dealt with incorrectly") +} + func TestEth_GetFilterChanges_NoTopics(t *testing.T) { rpcRes := call(t, "eth_blockNumber", []string{})