This commit is contained in:
Daniel Liu 2026-05-21 21:54:37 -07:00 committed by GitHub
commit 5ef18a2250
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 50 additions and 3 deletions

View file

@ -21,6 +21,7 @@ import (
"encoding/hex"
"errors"
"fmt"
"maps"
gomath "math"
"math/big"
"strings"
@ -1314,12 +1315,15 @@ func AccessList(ctx context.Context, b Backend, blockNrOrHash rpc.BlockNumberOrH
if db == nil || err != nil {
return nil, 0, nil, err
}
isPostMerge := header.Difficulty.Sign() == 0
rules := b.ChainConfig().Rules(header.Number, isPostMerge, header.Time)
precompileSet := maps.Clone(vm.ActivePrecompiledContracts(rules))
// Apply state overrides immediately after StateAndHeaderByNumberOrHash.
// If not applied here, there could be cases where user-specified overrides (e.g., nonce)
// may conflict with default values from the database, leading to inconsistencies.
if stateOverrides != nil {
if err := stateOverrides.Apply(db, nil); err != nil {
if err := stateOverrides.Apply(db, precompileSet); err != nil {
return nil, 0, nil, err
}
}
@ -1343,9 +1347,11 @@ func AccessList(ctx context.Context, b Backend, blockNrOrHash rpc.BlockNumberOrH
} else {
to = crypto.CreateAddress(args.from(), uint64(*args.Nonce))
}
isPostMerge := header.Difficulty.Sign() == 0
// Retrieve the precompiles since they don't need to be added to the access list
precompiles := vm.ActivePrecompiles(b.ChainConfig().Rules(header.Number, isPostMerge, header.Time))
precompiles := make([]common.Address, 0, len(precompileSet))
for addr := range precompileSet {
precompiles = append(precompiles, addr)
}
// addressesToExclude contains sender, receiver, precompiles and valid authorizations
addressesToExclude := map[common.Address]struct{}{args.from(): {}, to: {}}
@ -1393,6 +1399,7 @@ func AccessList(ctx context.Context, b Backend, blockNrOrHash rpc.BlockNumberOrH
tracer := logger.NewAccessListTracer(accessList, addressesToExclude)
config := vm.Config{Tracer: tracer.Hooks(), NoBaseFee: true}
evm := b.GetEVM(ctx, statedb, header, &config, nil)
evm.SetPrecompiles(precompileSet)
// Lower the basefee to 0 to avoid breaking EVM
// invariants (basefee < feecap).

View file

@ -3939,6 +3939,46 @@ func TestCreateAccessListWithStateOverrides(t *testing.T) {
require.Equal(t, expected, result.Accesslist)
}
func TestCreateAccessListWithMovePrecompile(t *testing.T) {
t.Parallel()
// Initialize test accounts
var (
accounts = newAccounts(2)
genesis = &core.Genesis{
Config: params.MergedTestChainConfig,
Alloc: types.GenesisAlloc{
accounts[0].addr: {Balance: big.NewInt(params.Ether)},
},
}
)
backend := newTestBackend(t, 1, genesis, beacon.New(ethash.NewFaker()), func(i int, b *core.BlockGen) {
b.SetPoS()
})
api := NewBlockChainAPI(backend)
var (
sha256Addr = common.BytesToAddress([]byte{0x2})
newSha256Addr = common.BytesToAddress([]byte{0x10, 0})
sha256Input = hexutil.Bytes([]byte("hello"))
gas = hexutil.Uint64(100000)
args = TransactionArgs{
From: &accounts[0].addr,
To: &newSha256Addr,
Data: &sha256Input,
Gas: &gas,
}
overrides = &override.StateOverride{
sha256Addr: override.OverrideAccount{
MovePrecompileTo: &newSha256Addr,
},
}
)
result, err := api.CreateAccessList(context.Background(), args, nil, overrides)
require.NoError(t, err)
require.NotNil(t, result)
require.NotNil(t, result.Accesslist)
}
func TestEstimateGasWithMovePrecompile(t *testing.T) {
t.Parallel()
// Initialize test accounts