@@ -3,13 +3,17 @@ package evmante
33// Copyright (c) 2023-2024 Nibi, Inc.
44
55import (
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.
5761func (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:\n txhash: %s\n { IsCheckTx %v, IsDeliverTx %v ReCheckTx%v }" ,
72128 msgEthTx .Hash , sdb .Ctx ().IsCheckTx (), sdb .IsDeliverTx (), sdb .Ctx ().IsReCheckTx ())
0 commit comments