Skip to content

Commit 68bb5ba

Browse files
fix(evmante): use deterministic ResponseDeliverTx gas wanted and gas consumed on failed EVM tx; nonce increment on the ctx should only happen in DeliverTx and ReCheckTx, not CheckTx (#2434)
* fix(evmante): nonce increment on the ctx should only happen in DeliverTx and ReCheckTx, not CheckTx * fix: pull golangci.yml update from other branch * fix: impl panic-safe guard for fixed gas taken by true ante failures in DeliverTx * fix if statement * chore: upgrade handler for v2.9
1 parent ba418d7 commit 68bb5ba

File tree

5 files changed

+70
-6
lines changed

5 files changed

+70
-6
lines changed

.golangci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ linters:
3030
alias: cmttypes
3131
no-unaliased: true
3232
no-extra-aliases: false
33+
govet: # https://golangci-lint.run/docs/linters/configuration/#govet
34+
disable: ["buildtag"]
3335
misspell:
3436
locale: US
3537
staticcheck:

app/upgrades/all_upgrades.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ var AllUpgrades = []Upgrade{
4343
Upgrade2_6_0,
4444
Upgrade2_7_0,
4545
Upgrade2_8_0,
46+
Upgrade2_9_0,
4647
}
4748

4849
// DefaultUpgradeHandler runs module manager migrations without running any other

app/upgrades/v2.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,4 +129,10 @@ var (
129129
CreateUpgradeHandler: DefaultUpgradeHandler,
130130
StoreUpgrades: store.StoreUpgrades{},
131131
}
132+
133+
Upgrade2_9_0 = Upgrade{
134+
UpgradeName: "v2.9.0",
135+
CreateUpgradeHandler: DefaultUpgradeHandler,
136+
StoreUpgrades: store.StoreUpgrades{},
137+
}
132138
)

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 rerr != nil || perr != nil {
80+
if sdb != nil && msgEthTx != nil {
81+
ethTx := msgEthTx.AsTransaction()
82+
contractCreation := ethTx.To() == nil
83+
rules := sdb.Keeper().GetEVMConfig(sdb.Ctx()).ChainConfig.Rules(
84+
big.NewInt(sdb.Ctx().BlockHeight()),
85+
false,
86+
evm.ParseBlockTimeUnixU64(sdb.Ctx()),
87+
)
88+
intrinsicGasCost, err := core.IntrinsicGas(
89+
ethTx.Data(), ethTx.AccessList(),
90+
contractCreation,
91+
rules.IsHomestead,
92+
rules.IsIstanbul,
93+
rules.IsShanghai,
94+
)
95+
if err == nil {
96+
deterministicGasCost = intrinsicGasCost
97+
}
98+
}
99+
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())

x/evm/evmante/evmante_increment_sender_seq.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,10 @@ func AnteStepIncrementNonce(
7070
"invalid nonce; got %d, expected %d", txNonce, stateNonce,
7171
)
7272
}
73+
newNonce := stateNonce + 1
74+
sdb.SetNonce(msgEthTx.FromAddr(), newNonce)
7375
default:
7476
}
7577

76-
newNonce := stateNonce + 1
77-
sdb.SetNonce(msgEthTx.FromAddr(), newNonce)
78-
7978
return nil
8079
}

0 commit comments

Comments
 (0)