From c6c553622680adb5186b5868e7b5600ecd78ef33 Mon Sep 17 00:00:00 2001 From: Marius van der Wijden Date: Wed, 22 Apr 2026 14:49:31 +0200 Subject: [PATCH] core: apply fixes for 8037 --- core/evm.go | 30 ++++++++++++++++++++++++------ core/state_transition.go | 9 +++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/core/evm.go b/core/evm.go index fc81aabb70..27096ab45e 100644 --- a/core/evm.go +++ b/core/evm.go @@ -18,6 +18,7 @@ package core import ( "math/big" + "math/bits" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/consensus" @@ -85,14 +86,31 @@ func NewEVMBlockContext(header *types.Header, chain ChainContext, author *common } // CostPerStateByte computes the cost per one byte of state creation -// after EIP-8037 +// after EIP-8037. func CostPerStateByte(header *types.Header, config *params.ChainConfig) uint64 { - if config.IsAmsterdam(header.Number, header.Time) { - return 1174 - // TODO (MariusVanDerWijden): for devnet-3 we hardcode the costPerStateByte - //return ((header.GasLimit / 2) * 7200 * 365) / params.TargetStateGrowthPerYear + if !config.IsAmsterdam(header.Number, header.Time) { + return 0 } - return 0 + const ( + blocksPerYear uint64 = 2_628_000 // 7200 * 365 + offset uint64 = 9578 + significantBts uint64 = 5 + ) + numerator := header.GasLimit * blocksPerYear + denominator := uint64(2) * params.TargetStateGrowthPerYear + raw := (numerator + denominator - 1) / denominator + shifted := raw + offset + // bit length of shifted + bitLen := uint64(64 - bits.LeadingZeros64(shifted)) + var shift uint64 + if bitLen > significantBts { + shift = bitLen - significantBts + } + quantized := (shifted >> shift) << shift + if quantized > offset { + return quantized - offset + } + return 1 } // NewEVMTxContext creates a new transaction context for a single transaction. diff --git a/core/state_transition.go b/core/state_transition.go index 2ea4641a56..6ef2c58de0 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -83,6 +83,15 @@ func IntrinsicGas(data []byte, accessList types.AccessList, authList []types.Set } else { gas.RegularGas = params.TxGas } + // EIP-8037: authorization tuples contribute both regular and state gas. + if authList != nil { + if rules.IsAmsterdam { + gas.RegularGas += uint64(len(authList)) * params.TxAuthTupleRegularGas + gas.StateGas += uint64(len(authList)) * (params.AuthorizationCreationSize + params.AccountCreationSize) * costPerStateByte + } else { + gas.RegularGas += uint64(len(authList)) * params.TxAuthTupleGas + } + } dataLen := uint64(len(data)) // Bump the required gas by the amount of transactional data if dataLen > 0 {