diff --git a/CHANGELOG.md b/CHANGELOG.md index faa6094f23..8dd5ffe745 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,6 +79,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (evm) [#405](https://github.com/crypto-org-chain/ethermint/pull/405) Avoid duplicate cache events emitted from evm hooks. - (rpc) [#406](https://github.com/crypto-org-chain/ethermint/pull/406) Align filter rule for eth_getLogs when toBlock is newer than latest or extract error occurs. - (rpc) [#409](https://github.com/crypto-org-chain/ethermint/pull/409) Fix nextBaseFee in eth_feeHistory before fee market param change. +- (rpc) [#425](https://github.com/crypto-org-chain/ethermint/pull/425) Avoid Int64() out of bound error in gas related api. ### Improvements diff --git a/rpc/backend/backend.go b/rpc/backend/backend.go index a9d39d9256..9f7e65ccc6 100644 --- a/rpc/backend/backend.go +++ b/rpc/backend/backend.go @@ -71,7 +71,7 @@ type EVMBackend interface { RPCGasCap() uint64 // global gas cap for eth_call over rpc: DoS protection RPCEVMTimeout() time.Duration // global timeout for eth_call over rpc: DoS protection RPCTxFeeCap() float64 // RPCTxFeeCap is the global transaction fee(price * gaslimit) cap for send-transaction variants. The unit is ether. - RPCMinGasPrice() int64 + RPCMinGasPrice() *big.Int // Sign Tx Sign(address common.Address, data hexutil.Bytes) (hexutil.Bytes, error) diff --git a/rpc/backend/call_tx.go b/rpc/backend/call_tx.go index 01c3e71f14..c97e1ce5d1 100644 --- a/rpc/backend/call_tx.go +++ b/rpc/backend/call_tx.go @@ -432,7 +432,7 @@ func (b *Backend) GasPrice() (*hexutil.Big, error) { } result = result.Add(result, head.BaseFee) } else { - result = big.NewInt(b.RPCMinGasPrice()) + result = b.RPCMinGasPrice() } // return at least GlobalMinGasPrice from FeeMarket module diff --git a/rpc/backend/node_info.go b/rpc/backend/node_info.go index 2737c84a2c..14972ab3e0 100644 --- a/rpc/backend/node_info.go +++ b/rpc/backend/node_info.go @@ -338,17 +338,17 @@ func (b *Backend) RPCBlockRangeCap() int32 { // RPCMinGasPrice returns the minimum gas price for a transaction obtained from // the node config. If set value is 0, it will default to 20. -func (b *Backend) RPCMinGasPrice() int64 { +func (b *Backend) RPCMinGasPrice() *big.Int { evmParams, err := b.queryClient.Params(b.ctx, &evmtypes.QueryParamsRequest{}) if err != nil { - return ethermint.DefaultGasPrice + return new(big.Int).SetInt64(ethermint.DefaultGasPrice) } minGasPrice := b.cfg.GetMinGasPrices() - amt := minGasPrice.AmountOf(evmParams.Params.EvmDenom).TruncateInt64() - if amt == 0 { - return ethermint.DefaultGasPrice + amt := minGasPrice.AmountOf(evmParams.Params.EvmDenom).TruncateInt() + if amt.IsZero() { + return new(big.Int).SetInt64(ethermint.DefaultGasPrice) } - return amt + return amt.BigInt() } diff --git a/rpc/backend/node_info_test.go b/rpc/backend/node_info_test.go index 56f1551c3e..1210670f08 100644 --- a/rpc/backend/node_info_test.go +++ b/rpc/backend/node_info_test.go @@ -4,6 +4,7 @@ import ( "fmt" "math/big" + "cosmossdk.io/math" tmrpcclient "github.com/cometbft/cometbft/rpc/client" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -17,10 +18,12 @@ import ( ) func (suite *BackendTestSuite) TestRPCMinGasPrice() { + defaultPrice := new(big.Int).SetInt64(ethermint.DefaultGasPrice) + bigPrice, _ := new(big.Int).SetString("18446744073709551616", 10) testCases := []struct { name string registerMock func() - expMinGasPrice int64 + expMinGasPrice *big.Int expPass bool }{ { @@ -29,7 +32,7 @@ func (suite *BackendTestSuite) TestRPCMinGasPrice() { queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterParamsWithoutHeaderError(queryClient, 1) }, - ethermint.DefaultGasPrice, + defaultPrice, true, }, { @@ -38,7 +41,18 @@ func (suite *BackendTestSuite) TestRPCMinGasPrice() { queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) RegisterParamsWithoutHeader(queryClient, 1) }, - ethermint.DefaultGasPrice, + defaultPrice, + true, + }, + { + "pass - min gas price exceeds math.MaxUint64", + func() { + queryClient := suite.backend.queryClient.QueryClient.(*mocks.EVMQueryClient) + RegisterParamsWithoutHeader(queryClient, 1) + amt, _ := math.NewIntFromString("18446744073709551616") + suite.backend.cfg.SetMinGasPrices([]sdk.DecCoin{sdk.NewDecCoin(ethermint.AttoPhoton, amt)}) + }, + bigPrice, true, }, }