mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-06-23 23:24:30 +00:00
* feat: pseudo-generic extra payloads in `params.ChainConfig` and `params.Rules` * feat: `params.ExtraPayloadGetter` for end-user type safety * refactor: payloads only available through `params.ExtraPayloadGetter` * chore: make `libevm/examples/extraparams` a `params` testable example * doc: `libevm/pseudo` package comments and improved readability * doc: `params.*Extra*` comments and improved readability * doc: `params.ExtraPayloadGetter` comments and improved readability * doc: `params/config.libevm_test.go` comments and improved readability * refactor: simplify `params.ChainConfig.UnmarshalJSON()` * refactor: abstract new/nil-pointer creation into `pseudo.Constructor`s * feat: precompile override via `params.Extras` hooks * doc: flesh out `PrecompileOverride()` in example * doc: complete commentary and improve readability * refactor: `ChainConfig.Hooks()` + `Rules` equivalent * chore: rename precompiles test file in keeping with geth equivalent * feat: stateful precompiles + allowlist hooks The allowlist hooks are included in this commit because they allow for the same functionality as stateful precompiles in `ava-labs/coreth` and `ava-labs/subnet-evm`. * fix: `StateTransition.canExecuteTransaction()` used `msg.From` instead of `To` * test: `params.RulesHooks.CanCreateContract` integration * test: `params.RulesHooks.CanExecuteTransaction` integration * test: `vm.NewStatefulPrecompile()` integration * refactor: simplify test of `CanCreateContract` * refactor: abstract generation of random `Address`/`Hash` values * doc: full documentation + readability refactoring/renaming * fix: remove circular dependency in tests
60 lines
1.9 KiB
Go
60 lines
1.9 KiB
Go
// Package hookstest provides test doubles for testing subsets of libevm hooks.
|
|
package hookstest
|
|
|
|
import (
|
|
"math/big"
|
|
"testing"
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
"github.com/ethereum/go-ethereum/libevm"
|
|
"github.com/ethereum/go-ethereum/params"
|
|
)
|
|
|
|
// A Stub is a test double for [params.ChainConfigHooks] and
|
|
// [params.RulesHooks]. Each of the fields, if non-nil, back their respective
|
|
// hook methods, which otherwise fall back to the default behaviour.
|
|
type Stub struct {
|
|
PrecompileOverrides map[common.Address]libevm.PrecompiledContract
|
|
CanExecuteTransactionFn func(common.Address, *common.Address, libevm.StateReader) error
|
|
CanCreateContractFn func(*libevm.AddressContext, libevm.StateReader) error
|
|
}
|
|
|
|
// RegisterForRules clears any registered [params.Extras] and then registers s
|
|
// as [params.RulesHooks], which are themselves cleared by the
|
|
// [testing.TB.Cleanup] routine.
|
|
func (s *Stub) RegisterForRules(tb testing.TB) {
|
|
params.TestOnlyClearRegisteredExtras()
|
|
params.RegisterExtras(params.Extras[params.NOOPHooks, Stub]{
|
|
NewRules: func(_ *params.ChainConfig, _ *params.Rules, _ *params.NOOPHooks, blockNum *big.Int, isMerge bool, timestamp uint64) *Stub {
|
|
return s
|
|
},
|
|
})
|
|
tb.Cleanup(params.TestOnlyClearRegisteredExtras)
|
|
}
|
|
|
|
func (s Stub) PrecompileOverride(a common.Address) (libevm.PrecompiledContract, bool) {
|
|
if len(s.PrecompileOverrides) == 0 {
|
|
return nil, false
|
|
}
|
|
p, ok := s.PrecompileOverrides[a]
|
|
return p, ok
|
|
}
|
|
|
|
func (s Stub) CanExecuteTransaction(from common.Address, to *common.Address, sr libevm.StateReader) error {
|
|
if f := s.CanExecuteTransactionFn; f != nil {
|
|
return f(from, to, sr)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (s Stub) CanCreateContract(cc *libevm.AddressContext, sr libevm.StateReader) error {
|
|
if f := s.CanCreateContractFn; f != nil {
|
|
return f(cc, sr)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var _ interface {
|
|
params.ChainConfigHooks
|
|
params.RulesHooks
|
|
} = Stub{}
|