Skip to content

Commit aae9144

Browse files
authored
Merge pull request #114 from oraichain/dang/testing-evm-gas
Dang/fix bug double consumed gas when execute precompile contract
2 parents 36bd40e + d62792b commit aae9144

File tree

11 files changed

+93
-49
lines changed

11 files changed

+93
-49
lines changed

go.mod

+2-1
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,8 @@ replace (
300300

301301
github.com/ethereum/go-ethereum => github.com/oraichain/go-ethereum v0.0.0-20250315003641-c426e3d92f1e
302302

303-
github.com/evmos/ethermint => github.com/oraichain/ethermint-cosmos-0.50 v0.0.0-20250320030536-1af0e1d4b927
303+
github.com/evmos/ethermint => github.com/oraichain/ethermint-cosmos-0.50 v0.0.0-20250320073200-4c44284fecd4
304+
304305
// Fix upstream GHSA-h395-qcrw-5vmq vulnerability.
305306
// See: https://github.com/cosmos/cosmos-sdk/issues/10409
306307
github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.8.1

go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -953,8 +953,8 @@ github.com/oraichain/cometbft v0.38.6-0.20250207043129-6ccdb4a201d3 h1:Rj7XV6xqH
953953
github.com/oraichain/cometbft v0.38.6-0.20250207043129-6ccdb4a201d3/go.mod h1:5l0SkgeLRXi6bBfQuevXjKqML1jjfJJlvI1Ulp02/o4=
954954
github.com/oraichain/cosmos-sdk v0.50.5-0.20250317093009-ee60f8767839 h1:xppXT0YH/7oLHQF5pKebWAma9pkdY4X9mQMqQI06vnA=
955955
github.com/oraichain/cosmos-sdk v0.50.5-0.20250317093009-ee60f8767839/go.mod h1:hrWEFMU1eoXqLJeE6VVESpJDQH67FS1nnMrQIjO2daw=
956-
github.com/oraichain/ethermint-cosmos-0.50 v0.0.0-20250320030536-1af0e1d4b927 h1:kjZm1s129WhuCEV0I88P5fpr6hNM2veX6qpG3/o1l0E=
957-
github.com/oraichain/ethermint-cosmos-0.50 v0.0.0-20250320030536-1af0e1d4b927/go.mod h1:3A68QrhbUQPdCshnz2JHx+/Gl5t7rZ0J99sqVZy15ng=
956+
github.com/oraichain/ethermint-cosmos-0.50 v0.0.0-20250320073200-4c44284fecd4 h1:G77K5Ar2gK/FEel4TZ5pXFa1CxY1M8wXSj7GF0dd4jI=
957+
github.com/oraichain/ethermint-cosmos-0.50 v0.0.0-20250320073200-4c44284fecd4/go.mod h1:3A68QrhbUQPdCshnz2JHx+/Gl5t7rZ0J99sqVZy15ng=
958958
github.com/oraichain/go-ethereum v0.0.0-20250315003641-c426e3d92f1e h1:Cz0xnAIccPltSzQeYjNfu5CzsTVSPxIb0RTUHNtrWHU=
959959
github.com/oraichain/go-ethereum v0.0.0-20250315003641-c426e3d92f1e/go.mod h1:/6CsT5Ceen2WPLI/oCA3xMcZ5sWMF/D46SjM/ayY0Oo=
960960
github.com/oraichain/ibc-go-fork/modules/capability v0.0.0-20241202080239-8bdb6f914705 h1:K/PQ2Ca4UrrT3+zzwa9Ifjf+Q6Hkteh34pfqF1sTLJM=

precompile/common/precompiles.go

+7-4
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,13 @@ func ValidateNonPayable(value *big.Int) error {
2727
return nil
2828
}
2929

30-
func GetPrecompileCtx(accessibleState contract.AccessibleState) (sdk.Context, error) {
31-
ctxer, ok := accessibleState.GetStateDB().(*statedb.StateDB)
30+
func GetPrecompileCtx(accessibleState contract.AccessibleState) (sdk.Context, uint64, error) {
31+
stateDB, ok := accessibleState.GetStateDB().(*statedb.StateDB)
3232
if !ok {
33-
return sdk.UnwrapSDKContext(context.Background()), errors.New("cannot get context from EVM")
33+
return sdk.UnwrapSDKContext(context.Background()), 0, errors.New("cannot get context from EVM")
3434
}
35-
return ctxer.Ctx(), nil
35+
36+
ctx := stateDB.Ctx()
37+
initialGas := ctx.GasMeter().GasConsumed()
38+
return ctx, initialGas, nil
3639
}

precompile/contracts/addr/addr.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ func (p PrecompileExecutor) getCosmosAddr(accessibleState contract.AccessibleSta
8686
readOnly bool,
8787
value *big.Int) (ret []byte, remainingGas uint64, rerr error) {
8888

89-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
89+
ctx, initialGas, rerr := pcommon.GetPrecompileCtx(accessibleState)
9090
if rerr != nil {
9191
return
9292
}
@@ -122,7 +122,7 @@ func (p PrecompileExecutor) getCosmosAddr(accessibleState contract.AccessibleSta
122122
cosmosAddress := p.evmKeeper.GetCosmosAddressMapping(ctx, evmAddress)
123123

124124
ret, rerr = method.Outputs.Pack(cosmosAddress.String())
125-
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed())
125+
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed()-initialGas)
126126
return
127127
}
128128

@@ -134,7 +134,7 @@ func (p PrecompileExecutor) getEvmAddr(accessibleState contract.AccessibleState,
134134
readOnly bool,
135135
value *big.Int) (ret []byte, remainingGas uint64, rerr error) {
136136

137-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
137+
ctx, initialGas, rerr := pcommon.GetPrecompileCtx(accessibleState)
138138
if rerr != nil {
139139
return
140140
}
@@ -179,7 +179,7 @@ func (p PrecompileExecutor) getEvmAddr(accessibleState contract.AccessibleState,
179179
}
180180

181181
ret, rerr = method.Outputs.Pack(evmAddress)
182-
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed())
182+
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed()-initialGas)
183183
return
184184
}
185185

@@ -191,7 +191,7 @@ func (p PrecompileExecutor) associate(accessibleState contract.AccessibleState,
191191
readOnly bool,
192192
value *big.Int) (ret []byte, remainingGas uint64, rerr error) {
193193

194-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
194+
ctx, initialGas, rerr := pcommon.GetPrecompileCtx(accessibleState)
195195
if rerr != nil {
196196
return
197197
}
@@ -273,7 +273,7 @@ func (p PrecompileExecutor) associate(accessibleState contract.AccessibleState,
273273
}
274274

275275
ret, rerr = method.Outputs.Pack(cosmosAddress.String(), evmAddress)
276-
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed())
276+
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed()-initialGas)
277277
return
278278
}
279279

@@ -285,7 +285,7 @@ func (p PrecompileExecutor) associatePublicKey(accessibleState contract.Accessib
285285
readOnly bool,
286286
value *big.Int) (ret []byte, remainingGas uint64, rerr error) {
287287

288-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
288+
ctx, initialGas, rerr := pcommon.GetPrecompileCtx(accessibleState)
289289
if rerr != nil {
290290
return
291291
}
@@ -338,7 +338,7 @@ func (p PrecompileExecutor) associatePublicKey(accessibleState contract.Accessib
338338
}
339339

340340
ret, rerr = method.Outputs.Pack(cosmosAddress.String(), evmAddress)
341-
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed())
341+
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed()-initialGas)
342342
return
343343
}
344344

precompile/contracts/authz/authz.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func (p PrecompileExecutor) setGrant(
8787
readOnly bool,
8888
value *big.Int,
8989
) (ret []byte, remainingGas uint64, rerr error) {
90-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
90+
ctx, initialGas, rerr := pcommon.GetPrecompileCtx(accessibleState)
9191
if rerr != nil {
9292
return
9393
}
@@ -158,7 +158,7 @@ func (p PrecompileExecutor) setGrant(
158158
}
159159

160160
ret, rerr = method.Outputs.Pack(true)
161-
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed())
161+
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed()-initialGas)
162162
return
163163
}
164164

@@ -171,7 +171,7 @@ func (p PrecompileExecutor) execGrant(
171171
readOnly bool,
172172
value *big.Int,
173173
) (ret []byte, remainingGas uint64, rerr error) {
174-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
174+
ctx, initialGas, rerr := pcommon.GetPrecompileCtx(accessibleState)
175175
if rerr != nil {
176176
return
177177
}
@@ -242,7 +242,7 @@ func (p PrecompileExecutor) execGrant(
242242
}
243243

244244
ret, rerr = method.Outputs.Pack(true)
245-
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed())
245+
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed()-initialGas)
246246
return
247247
}
248248

@@ -256,7 +256,7 @@ func (p PrecompileExecutor) grant(
256256
readOnly bool,
257257
value *big.Int,
258258
) (ret []byte, remainingGas uint64, rerr error) {
259-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
259+
ctx, initialGas, rerr := pcommon.GetPrecompileCtx(accessibleState)
260260
if rerr != nil {
261261
return
262262
}
@@ -313,7 +313,7 @@ func (p PrecompileExecutor) grant(
313313
if err != nil {
314314
if strings.Contains(err.Error(), NoGrantError) {
315315
ret, rerr = method.Outputs.Pack(big.NewInt(0))
316-
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed())
316+
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed()-initialGas)
317317

318318
return
319319
}

precompile/contracts/bank/bank.go

+15-15
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ func (p PrecompileExecutor) send(accessibleState contract.AccessibleState,
124124
readOnly bool,
125125
value *big.Int) (ret []byte, remainingGas uint64, rerr error) {
126126

127-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
127+
ctx, initialGas, rerr := pcommon.GetPrecompileCtx(accessibleState)
128128
if rerr != nil {
129129
return
130130
}
@@ -182,7 +182,7 @@ func (p PrecompileExecutor) send(accessibleState contract.AccessibleState,
182182
}
183183

184184
ret, rerr = method.Outputs.Pack(true)
185-
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed())
185+
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed()-initialGas)
186186
return
187187
}
188188

@@ -195,7 +195,7 @@ func (p PrecompileExecutor) burn(
195195
readOnly bool,
196196
value *big.Int,
197197
) (ret []byte, remainingGas uint64, rerr error) {
198-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
198+
ctx, initialGas, rerr := pcommon.GetPrecompileCtx(accessibleState)
199199
if rerr != nil {
200200
return
201201
}
@@ -313,7 +313,7 @@ func (p PrecompileExecutor) burn(
313313
}
314314

315315
ret, rerr = method.Outputs.Pack(true)
316-
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed())
316+
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed()-initialGas)
317317
return
318318
}
319319

@@ -325,7 +325,7 @@ func (p PrecompileExecutor) balance(accessibleState contract.AccessibleState,
325325
readOnly bool,
326326
value *big.Int) (ret []byte, remainingGas uint64, rerr error) {
327327

328-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
328+
ctx, initialGas, rerr := pcommon.GetPrecompileCtx(accessibleState)
329329
if rerr != nil {
330330
return
331331
}
@@ -369,7 +369,7 @@ func (p PrecompileExecutor) balance(accessibleState contract.AccessibleState,
369369
balance := p.bankKeeper.GetBalance(ctx, cosmosAddr, denom)
370370

371371
ret, rerr = method.Outputs.Pack(balance.Amount.BigInt())
372-
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed())
372+
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed()-initialGas)
373373
return
374374
}
375375

@@ -381,7 +381,7 @@ func (p PrecompileExecutor) allBalances(accessibleState contract.AccessibleState
381381
readOnly bool,
382382
value *big.Int) (ret []byte, remainingGas uint64, rerr error) {
383383

384-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
384+
ctx, initialGas, rerr := pcommon.GetPrecompileCtx(accessibleState)
385385
if rerr != nil {
386386
return
387387
}
@@ -428,7 +428,7 @@ func (p PrecompileExecutor) allBalances(accessibleState contract.AccessibleState
428428
}
429429

430430
ret, rerr = method.Outputs.Pack(coinBalances)
431-
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed())
431+
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed()-initialGas)
432432
return
433433
}
434434

@@ -440,7 +440,7 @@ func (p PrecompileExecutor) name(accessibleState contract.AccessibleState,
440440
readOnly bool,
441441
value *big.Int) (ret []byte, remainingGas uint64, rerr error) {
442442

443-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
443+
ctx, initialGas, rerr := pcommon.GetPrecompileCtx(accessibleState)
444444
if rerr != nil {
445445
return
446446
}
@@ -463,7 +463,7 @@ func (p PrecompileExecutor) name(accessibleState contract.AccessibleState,
463463
}
464464

465465
ret, rerr = method.Outputs.Pack(metadata.Name)
466-
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed())
466+
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed()-initialGas)
467467
return
468468
}
469469

@@ -475,7 +475,7 @@ func (p PrecompileExecutor) symbol(accessibleState contract.AccessibleState,
475475
readOnly bool,
476476
value *big.Int) (ret []byte, remainingGas uint64, rerr error) {
477477

478-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
478+
ctx, initialGas, rerr := pcommon.GetPrecompileCtx(accessibleState)
479479
if rerr != nil {
480480
return
481481
}
@@ -498,7 +498,7 @@ func (p PrecompileExecutor) symbol(accessibleState contract.AccessibleState,
498498
}
499499

500500
ret, rerr = method.Outputs.Pack(metadata.Symbol)
501-
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed())
501+
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed()-initialGas)
502502
return
503503
}
504504

@@ -510,7 +510,7 @@ func (p PrecompileExecutor) decimals(accessibleState contract.AccessibleState,
510510
readOnly bool,
511511
value *big.Int) (ret []byte, remainingGas uint64, rerr error) {
512512

513-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
513+
ctx, _, rerr := pcommon.GetPrecompileCtx(accessibleState)
514514
if rerr != nil {
515515
return
516516
}
@@ -539,7 +539,7 @@ func (p PrecompileExecutor) supply(accessibleState contract.AccessibleState,
539539
readOnly bool,
540540
value *big.Int) (ret []byte, remainingGas uint64, rerr error) {
541541

542-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
542+
ctx, initialGas, rerr := pcommon.GetPrecompileCtx(accessibleState)
543543
if rerr != nil {
544544
return
545545
}
@@ -574,7 +574,7 @@ func (p PrecompileExecutor) supply(accessibleState contract.AccessibleState,
574574
denom := args[0].(string)
575575
coin := p.bankKeeper.GetSupply(ctx, denom)
576576
ret, rerr = method.Outputs.Pack(coin.Amount.BigInt())
577-
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed())
577+
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed()-initialGas)
578578
return
579579
}
580580

precompile/contracts/json/json.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func (p PrecompileExecutor) extractAsBytes(accessibleState contract.AccessibleSt
7373
readOnly bool,
7474
value *big.Int) (ret []byte, remainingGas uint64, rerr error) {
7575

76-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
76+
ctx, initialGas, rerr := pcommon.GetPrecompileCtx(accessibleState)
7777
if rerr != nil {
7878
return
7979
}
@@ -125,7 +125,7 @@ func (p PrecompileExecutor) extractAsBytes(accessibleState contract.AccessibleSt
125125
}
126126

127127
ret, rerr = method.Outputs.Pack([]byte(result))
128-
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed())
128+
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed()-initialGas)
129129
return
130130
}
131131

@@ -137,7 +137,7 @@ func (p PrecompileExecutor) extractAsBytesList(accessibleState contract.Accessib
137137
readOnly bool,
138138
value *big.Int) (ret []byte, remainingGas uint64, rerr error) {
139139

140-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
140+
ctx, initialGas, rerr := pcommon.GetPrecompileCtx(accessibleState)
141141
if rerr != nil {
142142
return
143143
}
@@ -195,7 +195,7 @@ func (p PrecompileExecutor) extractAsBytesList(accessibleState contract.Accessib
195195
}
196196

197197
ret, rerr = method.Outputs.Pack(decodedBytes)
198-
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed())
198+
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed()-initialGas)
199199
return
200200
}
201201

@@ -207,7 +207,7 @@ func (p PrecompileExecutor) ExtractAsUint256(accessibleState contract.Accessible
207207
readOnly bool,
208208
value *big.Int) (ret []byte, remainingGas uint64, rerr error) {
209209

210-
ctx, rerr := pcommon.GetPrecompileCtx(accessibleState)
210+
ctx, initialGas, rerr := pcommon.GetPrecompileCtx(accessibleState)
211211
if rerr != nil {
212212
return
213213
}
@@ -235,7 +235,7 @@ func (p PrecompileExecutor) ExtractAsUint256(accessibleState contract.Accessible
235235

236236
uint_.FillBytes(byteArr)
237237

238-
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed())
238+
remainingGas, rerr = contract.DeductGas(suppliedGas, ctx.GasMeter().GasConsumed()-initialGas)
239239

240240
return byteArr, remainingGas, nil
241241
}

0 commit comments

Comments
 (0)