diff --git a/CHANGELOG.md b/CHANGELOG.md index 72ce2c60f5..618bf79f9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,10 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (feemarket) [\#1165](https://github.com/evmos/ethermint/pull/1165) Add hint in specs about different gas terminology for gas in Cosmos and Ethereum. * (rpc) [\#1169](https://github.com/evmos/ethermint/pull/1169) Remove unnecessary queries from `getBlockNumber` function +### Bug Fixes + +* (rpc) [#1179](https://github.com/evmos/ethermint/pull/1179) Fix gas used in traceTransaction response. + ## [v0.17.0] - 2022-06-27 ### State Machine Breaking diff --git a/x/evm/keeper/state_transition.go b/x/evm/keeper/state_transition.go index ece31db6ea..1a8cd1cd49 100644 --- a/x/evm/keeper/state_transition.go +++ b/x/evm/keeper/state_transition.go @@ -357,6 +357,14 @@ func (k *Keeper) ApplyMessageWithConfig(ctx sdk.Context, msg core.Message, trace stateDB := statedb.New(ctx, k, txConfig) evm := k.NewEVM(ctx, msg, cfg, tracer, stateDB) + leftoverGas := msg.Gas() + if evm.Config.Debug { + evm.Config.Tracer.CaptureTxStart(leftoverGas) + defer func() { + evm.Config.Tracer.CaptureTxEnd(leftoverGas) + }() + } + sender := vm.AccountRef(msg.From()) contractCreation := msg.To() == nil isLondon := cfg.ChainConfig.IsLondon(evm.Context.BlockNumber) @@ -368,12 +376,11 @@ func (k *Keeper) ApplyMessageWithConfig(ctx sdk.Context, msg core.Message, trace } // Should check again even if it is checked on Ante Handler, because eth_call don't go through Ante Handler. - if msg.Gas() < intrinsicGas { + if leftoverGas < intrinsicGas { // eth_estimateGas will check for this exact error return nil, sdkerrors.Wrap(core.ErrIntrinsicGas, "apply message") } - - leftoverGas := msg.Gas() - intrinsicGas + leftoverGas -= intrinsicGas // access list preparation is moved from ante handler to here, because it's needed when `ApplyMessage` is called // under contexts where ante handlers are not run, for example `eth_call` and `eth_estimateGas`. @@ -403,14 +410,7 @@ func (k *Keeper) ApplyMessageWithConfig(ctx sdk.Context, msg core.Message, trace if msg.Gas() < leftoverGas { return nil, sdkerrors.Wrap(types.ErrGasOverflow, "apply message") } - - temporaryGasUsed := msg.Gas() - leftoverGas - refund := GasToRefund(stateDB.GetRefund(), temporaryGasUsed, refundQuotient) - if refund > temporaryGasUsed { - return nil, sdkerrors.Wrap(types.ErrGasOverflow, "apply message") - } - - temporaryGasUsed -= refund + leftoverGas += GasToRefund(stateDB.GetRefund(), msg.Gas()-leftoverGas, refundQuotient) // EVM execution error needs to be available for the JSON-RPC client var vmError string @@ -431,7 +431,11 @@ func (k *Keeper) ApplyMessageWithConfig(ctx sdk.Context, msg core.Message, trace gasLimit := sdk.NewDec(int64(msg.Gas())) minGasMultiplier := k.GetMinGasMultiplier(ctx) minimumGasUsed := gasLimit.Mul(minGasMultiplier) + + temporaryGasUsed := msg.Gas() - leftoverGas gasUsed := sdk.MaxDec(minimumGasUsed, sdk.NewDec(int64(temporaryGasUsed))).TruncateInt().Uint64() + // reset leftoverGas, to be used by the tracer + leftoverGas = msg.Gas() - gasUsed return &types.MsgEthereumTxResponse{ GasUsed: gasUsed,