Skip to content

Commit 3da8d8f

Browse files
committed
fix: impl panic-safe guard for fixed gas taken by true ante failures in DeliverTx
1 parent e0c7ee0 commit 3da8d8f

File tree

1 file changed

+59
-3
lines changed

1 file changed

+59
-3
lines changed

x/evm/evmante/all_evmante.go

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,17 @@ package evmante
33
// Copyright (c) 2023-2024 Nibi, Inc.
44

55
import (
6+
"fmt"
67
"log"
8+
"math/big"
79
"path"
810
"reflect"
911
"runtime"
1012
"strings"
1113

1214
sdk "github.com/cosmos/cosmos-sdk/types"
15+
"github.com/ethereum/go-ethereum/core"
16+
"github.com/ethereum/go-ethereum/params"
1317

1418
"github.com/NibiruChain/nibiru/v2/app/ante"
1519
"github.com/NibiruChain/nibiru/v2/x/evm"
@@ -56,17 +60,69 @@ func NewAnteHandlerEvm(
5660
// CanTransfer function to see if the address can execute the transaction.
5761
func (handlerGroup AnteHandlerEvm) AnteHandle(
5862
ctx sdk.Context, tx sdk.Tx, simulate bool, next sdk.AnteHandler,
59-
) (sdk.Context, error) {
60-
msgEthTx, err := evm.RequireStandardEVMTxMsg(tx)
63+
) (rCtx sdk.Context, rerr error) {
64+
var (
65+
sdb *evmstate.SDB
66+
msgEthTx *evm.MsgEthereumTx
67+
)
68+
defer func() {
69+
var (
70+
perr error // panic error
71+
72+
// Panic-safe guard for fixed gas taken by true ante failures in DeliverTx
73+
deterministicGasCost = params.TxGas
74+
)
75+
if panicInfo := recover(); panicInfo != nil {
76+
perr = fmt.Errorf("%v", panicInfo)
77+
}
78+
79+
if sdb != nil && msgEthTx != nil {
80+
ethTx := msgEthTx.AsTransaction()
81+
contractCreation := ethTx.To() == nil
82+
rules := sdb.Keeper().GetEVMConfig(sdb.Ctx()).ChainConfig.Rules(
83+
big.NewInt(sdb.Ctx().BlockHeight()),
84+
false,
85+
evm.ParseBlockTimeUnixU64(sdb.Ctx()),
86+
)
87+
intrinsicGasCost, err := core.IntrinsicGas(
88+
ethTx.Data(), ethTx.AccessList(),
89+
contractCreation,
90+
rules.IsHomestead,
91+
rules.IsIstanbul,
92+
rules.IsShanghai,
93+
)
94+
if err != nil {
95+
deterministicGasCost = intrinsicGasCost
96+
}
97+
}
98+
99+
if rerr != nil || perr != nil {
100+
rCtx = rCtx.WithGasMeter(
101+
func() sdk.GasMeter {
102+
gm := sdk.NewGasMeter(deterministicGasCost)
103+
gm.ConsumeGas(deterministicGasCost, "EVM ante failure fixed gas")
104+
return gm
105+
}(),
106+
)
107+
}
108+
109+
if perr != nil {
110+
rerr = perr
111+
}
112+
}()
113+
114+
var err error
115+
msgEthTx, err = evm.RequireStandardEVMTxMsg(tx)
61116
if err != nil {
62117
return ctx, err
63118
}
64119

65-
sdb := evmstate.NewSDB(
120+
sdb = evmstate.NewSDB(
66121
ctx,
67122
handlerGroup.EVMKeeper,
68123
handlerGroup.TxConfig(ctx, msgEthTx.AsTransaction().Hash()),
69124
)
125+
70126
log.Printf(
71127
"EthState AnteHandle BEGIN:\ntxhash: %s\n{ IsCheckTx %v, IsDeliverTx %v ReCheckTx%v }",
72128
msgEthTx.Hash, sdb.Ctx().IsCheckTx(), sdb.IsDeliverTx(), sdb.Ctx().IsReCheckTx())

0 commit comments

Comments
 (0)