Skip to content

Commit

Permalink
fix(audit): instrinsic gas (#170)
Browse files Browse the repository at this point in the history
* fix: apply intrinsic gas and include caller in access lists

* fix: gas charging logic

* chore(fix): add missed keeper
  • Loading branch information
djm07073 authored Feb 27, 2025
1 parent 2439b3e commit 429c0d1
Showing 1 changed file with 45 additions and 6 deletions.
51 changes: 45 additions & 6 deletions x/evm/keeper/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@ import (

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/tracing"
coretype "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/vm"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/trie/utils"

evmstate "github.com/initia-labs/minievm/x/evm/state"
Expand All @@ -32,6 +34,17 @@ func (k Keeper) NewStateDB(ctx context.Context, evm *vm.EVM, fee types.Fee) (*ev
)
}

func (k Keeper) chargeIntrinsicGas(gasBalance uint64, isContractCreation bool, data []byte, list coretype.AccessList, rules params.Rules) (uint64, error) {
intrinsicGas, err := core.IntrinsicGas(data, list, isContractCreation, rules.IsHomestead, rules.IsIstanbul, rules.IsShanghai)
if err != nil {
return 0, err
}
if gasBalance < intrinsicGas {
return 0, fmt.Errorf("%w: have %d, want %d", core.ErrIntrinsicGas, gasBalance, intrinsicGas)
}
return gasBalance - intrinsicGas, nil
}

func (k Keeper) computeGasLimit(sdkCtx sdk.Context) uint64 {
gasLimit := sdkCtx.GasMeter().Limit() - sdkCtx.GasMeter().GasConsumedToLimit()
if sdkCtx.ExecMode() == sdk.ExecModeSimulate {
Expand Down Expand Up @@ -249,13 +262,21 @@ func (k Keeper) EVMStaticCallWithTracer(ctx context.Context, caller common.Addre
sdkCtx := sdk.UnwrapSDKContext(ctx)
gasBalance := k.computeGasLimit(sdkCtx)
rules := evm.ChainConfig().Rules(evm.Context.BlockNumber, evm.Context.Random != nil, evm.Context.Time)
gasRemaining, err := k.chargeIntrinsicGas(gasBalance, false, inputBz, accessList, rules)
if err != nil {
return nil, err
}

if rules.IsEIP4762 {
evm.AccessEvents.AddTxOrigin(caller)
}
evm.StateDB.Prepare(rules, caller, types.NullAddress, &contractAddr, k.precompileAddrs(rules), accessList)

retBz, gasRemaining, err := evm.StaticCall(
vm.AccountRef(caller),
contractAddr,
inputBz,
gasBalance,
gasRemaining,
)

// London enforced
Expand Down Expand Up @@ -287,13 +308,23 @@ func (k Keeper) EVMCallWithTracer(ctx context.Context, caller common.Address, co
}

rules := evm.ChainConfig().Rules(evm.Context.BlockNumber, evm.Context.Random != nil, evm.Context.Time)
gasRemaining, err := k.chargeIntrinsicGas(gasBalance, false, inputBz, accessList, rules)
if err != nil {
return nil, nil, err
}

if rules.IsEIP4762 {
evm.AccessEvents.AddTxOrigin(caller)
evm.AccessEvents.AddTxDestination(contractAddr, value.Sign() != 0)
}

evm.StateDB.Prepare(rules, caller, types.NullAddress, &contractAddr, k.precompileAddrs(rules), accessList)

retBz, gasRemaining, err := evm.Call(
vm.AccountRef(caller),
contractAddr,
inputBz,
gasBalance,
gasRemaining,
value,
)

Expand Down Expand Up @@ -381,21 +412,29 @@ func (k Keeper) EVMCreateWithTracer(ctx context.Context, caller common.Address,
}

rules := evm.ChainConfig().Rules(evm.Context.BlockNumber, evm.Context.Random != nil, evm.Context.Time)
evm.StateDB.Prepare(rules, caller, types.NullAddress, nil, k.precompileAddrs(rules), accessList)

var gasRemaining uint64
gasRemaining, err := k.chargeIntrinsicGas(gasBalance, true, codeBz, accessList, rules)
if err != nil {
return nil, common.Address{}, nil, err
}

if rules.IsEIP4762 {
evm.AccessEvents.AddTxOrigin(caller)
}

evm.StateDB.Prepare(rules, caller, types.NullAddress, nil, k.precompileAddrs(rules), accessList)
if salt == nil {
retBz, contractAddr, gasRemaining, err = evm.Create(
vm.AccountRef(caller),
codeBz,
gasBalance,
gasRemaining,
value,
)
} else {
retBz, contractAddr, gasRemaining, err = evm.Create2(
vm.AccountRef(caller),
codeBz,
gasBalance,
gasRemaining,
value,
uint256.NewInt(*salt),
)
Expand Down

0 comments on commit 429c0d1

Please sign in to comment.