From 7ec5e5fdef4ed816aa03e9edaecad78e1eebf3c3 Mon Sep 17 00:00:00 2001 From: yihuang Date: Tue, 4 Jan 2022 18:55:30 +0800 Subject: [PATCH] fix: set correct nonce in EthCall/EstimateGas (#871) * fix: set correct nonce in EthCall/EstimateGas Closes: #870 * Update CHANGELOG.md * unit test --- CHANGELOG.md | 1 + x/evm/keeper/grpc_query.go | 8 ++++++++ x/evm/keeper/grpc_query_test.go | 35 +++++++++++++++++++++++++++++++++ x/evm/keeper/keeper_test.go | 5 ++--- 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 39124bc5..80b6adc4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -66,6 +66,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (evm) [tharsis#838](https://github.com/tharsis/ethermint/pull/838) Fix splitting of trace.Memory into 32 chunks. * (rpc) [tharsis#860](https://github.com/tharsis/ethermint/pull/860) Fix `eth_getLogs` when specify blockHash without address/topics, and limit the response size. * (rpc) [tharsis#865](https://github.com/tharsis/ethermint/pull/865) Fix RPC Filter parameters being ignored +* (evm) [tharsis#871](https://github.com/tharsis/ethermint/pull/871) Set correct nonce in `EthCall` and `EstimateGas` grpc query. ## [v0.9.0] - 2021-12-01 diff --git a/x/evm/keeper/grpc_query.go b/x/evm/keeper/grpc_query.go index c9158dd0..0eaebbc1 100644 --- a/x/evm/keeper/grpc_query.go +++ b/x/evm/keeper/grpc_query.go @@ -225,6 +225,10 @@ func (k Keeper) EthCall(c context.Context, req *types.EthCallRequest) (*types.Ms return nil, status.Error(codes.Internal, err.Error()) } + // ApplyMessageWithConfig expect correct nonce set in msg + nonce := k.GetNonce(args.GetFrom()) + args.Nonce = (*hexutil.Uint64)(&nonce) + msg, err := args.ToMessage(req.GasCap, cfg.BaseFee) if err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) @@ -290,6 +294,10 @@ func (k Keeper) EstimateGas(c context.Context, req *types.EthCallRequest) (*type return nil, status.Error(codes.Internal, "failed to load evm config") } + // ApplyMessageWithConfig expect correct nonce set in msg + nonce := k.GetNonce(args.GetFrom()) + args.Nonce = (*hexutil.Uint64)(&nonce) + // Create a helper to check if a gas allowance results in an executable transaction executable := func(gas uint64) (vmerror bool, rsp *types.MsgEthereumTxResponse, err error) { args.Gas = (*hexutil.Uint64)(&gas) diff --git a/x/evm/keeper/grpc_query_test.go b/x/evm/keeper/grpc_query_test.go index e7701159..582c8f74 100644 --- a/x/evm/keeper/grpc_query_test.go +++ b/x/evm/keeper/grpc_query_test.go @@ -11,6 +11,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/tharsis/ethermint/crypto/ethsecp256k1" + "github.com/tharsis/ethermint/server/config" ethermint "github.com/tharsis/ethermint/types" "github.com/tharsis/ethermint/x/evm/types" ) @@ -859,3 +861,36 @@ func (suite *KeeperTestSuite) TestTraceBlock() { suite.enableFeemarket = false // reset flag } + +func (suite *KeeperTestSuite) TestNonceInQuery() { + suite.SetupTest() + priv, err := ethsecp256k1.GenerateKey() + suite.Require().NoError(err) + address := common.BytesToAddress(priv.PubKey().Address().Bytes()) + suite.Require().Equal(uint64(0), suite.app.EvmKeeper.GetNonce(address)) + supply := sdk.NewIntWithDecimal(1000, 18).BigInt() + + // accupy nonce 0 + _ = suite.DeployTestContract(suite.T(), address, supply) + + // do an EthCall/EstimateGas with nonce 0 + ctorArgs, err := types.ERC20Contract.ABI.Pack("", address, supply) + data := append(types.ERC20Contract.Bin, ctorArgs...) + args, err := json.Marshal(&types.TransactionArgs{ + From: &address, + Data: (*hexutil.Bytes)(&data), + }) + suite.Require().NoError(err) + + _, err = suite.queryClient.EstimateGas(sdk.WrapSDKContext(suite.ctx), &types.EthCallRequest{ + Args: args, + GasCap: uint64(config.DefaultGasCap), + }) + suite.Require().NoError(err) + + _, err = suite.queryClient.EthCall(sdk.WrapSDKContext(suite.ctx), &types.EthCallRequest{ + Args: args, + GasCap: uint64(config.DefaultGasCap), + }) + suite.Require().NoError(err) +} diff --git a/x/evm/keeper/keeper_test.go b/x/evm/keeper/keeper_test.go index d29e73d1..10501632 100644 --- a/x/evm/keeper/keeper_test.go +++ b/x/evm/keeper/keeper_test.go @@ -220,9 +220,8 @@ func (suite *KeeperTestSuite) DeployTestContract(t require.TestingT, owner commo data := append(types.ERC20Contract.Bin, ctorArgs...) args, err := json.Marshal(&types.TransactionArgs{ - From: &suite.address, - Data: (*hexutil.Bytes)(&data), - Nonce: (*hexutil.Uint64)(&nonce), + From: &suite.address, + Data: (*hexutil.Bytes)(&data), }) require.NoError(t, err)