From 744a64c2e4f45a4e6c38467fc7d3444b3a5cb01b Mon Sep 17 00:00:00 2001 From: Chen Chen Date: Fri, 29 Nov 2024 16:45:10 +0800 Subject: [PATCH] [api] Fix out of gas for new types tx (#4507) --- api/web3server.go | 28 +++++-------------------- api/web3server_test.go | 1 + api/web3server_utils.go | 46 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 23 deletions(-) diff --git a/api/web3server.go b/api/web3server.go index eff255222f..0d9cbd3726 100644 --- a/api/web3server.go +++ b/api/web3server.go @@ -6,11 +6,9 @@ import ( "encoding/json" "fmt" "io" - "math/big" "strconv" "time" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/tracers" "github.com/ethereum/go-ethereum/eth/tracers/logger" @@ -32,7 +30,6 @@ import ( apitypes "github.com/iotexproject/iotex-core/v2/api/types" "github.com/iotexproject/iotex-core/v2/pkg/log" "github.com/iotexproject/iotex-core/v2/pkg/tracer" - "github.com/iotexproject/iotex-core/v2/pkg/util/addrutil" ) const ( @@ -440,26 +437,10 @@ func (svr *web3Handler) estimateGas(in *gjson.Result) (interface{}, error) { if err != nil { return nil, err } - from, to := callMsg.From, callMsg.To - var ( - tx *types.Transaction - toAddr *common.Address - ) - if len(to) != 0 { - addr, err := addrutil.IoAddrToEvmAddr(to) - if err != nil { - return nil, err - } - toAddr = &addr - } - tx = types.NewTx(&types.LegacyTx{ - Nonce: 0, - GasPrice: big.NewInt(0), - Gas: callMsg.Gas, - To: toAddr, - Value: callMsg.Value, - Data: callMsg.Data, - }) + tx, err := callMsg.toUnsignedTx(svr.coreService.EVMNetworkID()) + if err != nil { + return nil, err + } elp, err := svr.ethTxToEnvelope(tx) if err != nil { return nil, err @@ -468,6 +449,7 @@ func (svr *web3Handler) estimateGas(in *gjson.Result) (interface{}, error) { var ( estimatedGas uint64 retval []byte + from = callMsg.From ) switch act := elp.Action().(type) { case *action.Execution: diff --git a/api/web3server_test.go b/api/web3server_test.go index 6bebf91fb8..de0ab09e00 100644 --- a/api/web3server_test.go +++ b/api/web3server_test.go @@ -392,6 +392,7 @@ func TestEstimateGas(t *testing.T) { core.EXPECT().ChainID().Return(uint32(1)).Times(2) t.Run("estimate execution", func(t *testing.T) { + core.EXPECT().EVMNetworkID().Return(uint32(0)).AnyTimes() core.EXPECT().Account(gomock.Any()).Return(&iotextypes.AccountMeta{IsContract: true}, nil, nil) core.EXPECT().EstimateExecutionGasConsumption(gomock.Any(), gomock.Any(), gomock.Any()).Return(uint64(11000), nil, nil) diff --git a/api/web3server_utils.go b/api/web3server_utils.go index ef2c53d857..54f94dcd41 100644 --- a/api/web3server_utils.go +++ b/api/web3server_utils.go @@ -370,6 +370,52 @@ func parseCallObject(in *gjson.Result) (*callMsg, error) { }, nil } +func (call *callMsg) toUnsignedTx(chainID uint32) (*types.Transaction, error) { + var ( + tx *types.Transaction + toAddr *common.Address + ) + if len(call.To) != 0 { + addr, err := addrutil.IoAddrToEvmAddr(call.To) + if err != nil { + return nil, err + } + toAddr = &addr + } + switch { + case call.GasFeeCap != nil || call.GasTipCap != nil: + tx = types.NewTx(&types.DynamicFeeTx{ + ChainID: big.NewInt(int64(chainID)), + GasTipCap: big.NewInt(0), + GasFeeCap: big.NewInt(0), + Gas: call.Gas, + To: toAddr, + Value: call.Value, + Data: call.Data, + AccessList: call.AccessList, + }) + case call.AccessList != nil: + tx = types.NewTx(&types.AccessListTx{ + ChainID: big.NewInt(int64(chainID)), + GasPrice: big.NewInt(0), + Gas: call.Gas, + To: toAddr, + Value: call.Value, + Data: call.Data, + AccessList: call.AccessList, + }) + default: + tx = types.NewTx(&types.LegacyTx{ + GasPrice: big.NewInt(0), + Gas: call.Gas, + To: toAddr, + Value: call.Value, + Data: call.Data, + }) + } + return tx, nil +} + func (svr *web3Handler) getLogQueryRange(fromStr, toStr string, logHeight uint64) (from uint64, to uint64, hasNewLogs bool, err error) { if from, to, err = svr.parseBlockRange(fromStr, toStr); err != nil { return