diff --git a/evmd/app.go b/evmd/app.go index fe494f779..687b3064a 100644 --- a/evmd/app.go +++ b/evmd/app.go @@ -32,6 +32,7 @@ import ( "github.com/cosmos/evm/x/feemarket" feemarketkeeper "github.com/cosmos/evm/x/feemarket/keeper" feemarkettypes "github.com/cosmos/evm/x/feemarket/types" + // NOTE: override ICS20 keeper to support IBC transfers of ERC20 tokens "github.com/cosmos/evm/x/ibc/transfer" transferkeeper "github.com/cosmos/evm/x/ibc/transfer/keeper" diff --git a/rpc/backend/blocks.go b/rpc/backend/blocks.go index 40b40a448..e9028c038 100644 --- a/rpc/backend/blocks.go +++ b/rpc/backend/blocks.go @@ -339,6 +339,37 @@ func (b *Backend) parseDerivedTxFromAdditionalFields( ethMsg.From = additional.Sender.Hex() return ethMsg } +func (b *Backend) parseDerivedTxFromAdditionalFieldsForTrace( + additional *rpctypes.TxResultAdditionalFields, +) *evmtypes.MsgEthereumTx { + recipient := additional.Recipient + + // for transactions before v31 this value was mistakenly used for Gas field + gas := additional.GasUsed + if additional.GasLimit != nil { + gas = *additional.GasLimit + } + t := ethtypes.NewTx(ðtypes.LegacyTx{ + Nonce: additional.Nonce, + Data: additional.Data, + Gas: gas, + To: &recipient, + GasPrice: nil, + Value: additional.Value, + V: big.NewInt(0), + R: big.NewInt(0), + S: big.NewInt(0), + }) + ethMsg := &evmtypes.MsgEthereumTx{} + err := ethMsg.FromEthereumTx(t) + if err != nil { + b.logger.Error("can not create eth msg", err.Error()) + return nil + } + ethMsg.Hash = additional.Hash.Hex() + ethMsg.From = additional.Sender.Hex() + return ethMsg +} // gasForDerivedEthTx returns the gas value to use for a derived Ethereum transaction. // diff --git a/rpc/backend/tracing.go b/rpc/backend/tracing.go index 721bbde3a..f13222845 100644 --- a/rpc/backend/tracing.go +++ b/rpc/backend/tracing.go @@ -127,6 +127,7 @@ func (b *Backend) TraceTransaction(hash common.Hash, config *evmtypes.TraceConfi // add predecessor messages in current cosmos tx index := int(transaction.MsgIndex) // #nosec G115 + for i := 0; i < index; i++ { msg := tx.GetMsgs()[i] // Check if it's a normal Ethereum tx diff --git a/x/vm/keeper/state_transition.go b/x/vm/keeper/state_transition.go index 665429a62..9c2e45d32 100644 --- a/x/vm/keeper/state_transition.go +++ b/x/vm/keeper/state_transition.go @@ -18,8 +18,10 @@ import ( errorsmod "cosmossdk.io/errors" "cosmossdk.io/math" + sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) // NewEVM generates a go-ethereum VM from the provided Message fields and the chain parameters @@ -243,6 +245,30 @@ func (k *Keeper) ApplyTransaction(ctx sdk.Context, tx *ethtypes.Transaction) (*t if err = k.RefundGas(ctx, msg, msg.Gas()-res.GasUsed, evmDenom); err != nil { return nil, errorsmod.Wrapf(err, "failed to refund gas leftover gas to sender %s", msg.From()) } + // burn base fee (EIP-1559): baseFee * gasUsed + if cfg.BaseFee != nil && cfg.BaseFee.Sign() > 0 && res.GasUsed > 0 { + // compute amount = baseFee * gasUsed + burnAmt := new(big.Int).Mul(cfg.BaseFee, new(big.Int).SetUint64(res.GasUsed)) + + // create coin in EVM denom + burnCoin := sdk.Coin{Denom: types.GetEVMCoinDenom(), Amount: sdkmath.NewIntFromBigInt(burnAmt)} + + // convert to extended denom (chain denom) and burn from fee collector + converted, err := types.ConvertEvmCoinDenomToExtendedDenom(burnCoin) + if err != nil { + // handle error (log and/or return). If you return, it may fail the tx; choose behavior. + k.Logger(ctx).Error("failed to convert evm denom for base fee burn", "err", err) + } else { + burnCoins := sdk.Coins{converted} + evmmodAddr := authtypes.NewModuleAddress(types.ModuleName) + if err := k.bankWrapper.SendCoinsFromModuleToAccount(ctx, authtypes.FeeCollectorName, evmmodAddr, burnCoins); err != nil { + k.Logger(ctx).Error("failed to move base fee to evm module account", "err", err) + } else if err := k.bankWrapper.BurnCoins(ctx, types.ModuleName, burnCoins); err != nil { + // handle error - either log or return error. Logging avoids failing block. + k.Logger(ctx).Error("failed to burn base fee from evm module account", "err", err) + } + } + } if len(logs) > 0 { // Update transient block bloom filter