feat!: vm.Hooks.OverrideEVMResetArgs() receives params.Rules (#38)

* feat!: `vm.Hooks.OverrideEVMResetArgs()` receives `params.Rules`

* test: propagation of `params.Rules`
This commit is contained in:
Arran Schlosberg 2024-09-26 15:35:54 +01:00 committed by GitHub
parent 53ef0712af
commit 99a755f040
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 23 additions and 15 deletions

View file

@ -159,7 +159,7 @@ func NewEVM(blockCtx BlockContext, txCtx TxContext, statedb StateDB, chainConfig
// Reset resets the EVM with a new transaction context.Reset // Reset resets the EVM with a new transaction context.Reset
// This is not threadsafe and should only be done very cautiously. // This is not threadsafe and should only be done very cautiously.
func (evm *EVM) Reset(txCtx TxContext, statedb StateDB) { func (evm *EVM) Reset(txCtx TxContext, statedb StateDB) {
evm.TxContext, evm.StateDB = overrideEVMResetArgs(txCtx, statedb) evm.TxContext, evm.StateDB = evm.overrideEVMResetArgs(txCtx, statedb)
} }
// Cancel cancels any running EVM operation. This may be called concurrently and // Cancel cancels any running EVM operation. This may be called concurrently and

View file

@ -19,6 +19,7 @@ import (
"math/big" "math/big"
"testing" "testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/params"
@ -27,23 +28,25 @@ import (
type evmArgOverrider struct { type evmArgOverrider struct {
newEVMchainID int64 newEVMchainID int64
resetTxCtx TxContext gotResetChainID *big.Int
resetStateDB StateDB resetTxContextTo TxContext
resetStateDBTo StateDB
} }
func (o evmArgOverrider) OverrideNewEVMArgs(args *NewEVMArgs) *NewEVMArgs { func (o *evmArgOverrider) OverrideNewEVMArgs(args *NewEVMArgs) *NewEVMArgs {
args.ChainConfig = &params.ChainConfig{ChainID: big.NewInt(o.newEVMchainID)} args.ChainConfig = &params.ChainConfig{ChainID: big.NewInt(o.newEVMchainID)}
return args return args
} }
func (o evmArgOverrider) OverrideEVMResetArgs(*EVMResetArgs) *EVMResetArgs { func (o *evmArgOverrider) OverrideEVMResetArgs(r params.Rules, _ *EVMResetArgs) *EVMResetArgs {
o.gotResetChainID = r.ChainID
return &EVMResetArgs{ return &EVMResetArgs{
TxContext: o.resetTxCtx, TxContext: o.resetTxContextTo,
StateDB: o.resetStateDB, StateDB: o.resetStateDBTo,
} }
} }
func (o evmArgOverrider) register(t *testing.T) { func (o *evmArgOverrider) register(t *testing.T) {
t.Helper() t.Helper()
libevmHooks = nil libevmHooks = nil
RegisterHooks(o) RegisterHooks(o)
@ -71,9 +74,13 @@ func TestOverrideEVMResetArgs(t *testing.T) {
// Equivalent to rationale for TestOverrideNewEVMArgs above. // Equivalent to rationale for TestOverrideNewEVMArgs above.
var _ func(TxContext, StateDB) = (*EVM)(nil).Reset var _ func(TxContext, StateDB) = (*EVM)(nil).Reset
const gasPrice = 1357924680 const (
hooks := evmArgOverrider{ chainID = 0xc0ffee
resetTxCtx: TxContext{ gasPrice = 1357924680
)
hooks := &evmArgOverrider{
newEVMchainID: chainID,
resetTxContextTo: TxContext{
GasPrice: big.NewInt(gasPrice), GasPrice: big.NewInt(gasPrice),
}, },
} }
@ -81,5 +88,6 @@ func TestOverrideEVMResetArgs(t *testing.T) {
evm := NewEVM(BlockContext{}, TxContext{}, nil, nil, Config{}) evm := NewEVM(BlockContext{}, TxContext{}, nil, nil, Config{})
evm.Reset(TxContext{}, nil) evm.Reset(TxContext{}, nil)
require.Equalf(t, big.NewInt(gasPrice), evm.GasPrice, "%T.GasPrice set by Reset() hook", evm) assert.Equalf(t, big.NewInt(chainID), hooks.gotResetChainID, "%T.ChainID passed to Reset() hook", params.Rules{})
assert.Equalf(t, big.NewInt(gasPrice), evm.GasPrice, "%T.GasPrice set by Reset() hook", evm)
} }

View file

@ -33,7 +33,7 @@ var libevmHooks Hooks
// See [RegisterHooks]. // See [RegisterHooks].
type Hooks interface { type Hooks interface {
OverrideNewEVMArgs(*NewEVMArgs) *NewEVMArgs OverrideNewEVMArgs(*NewEVMArgs) *NewEVMArgs
OverrideEVMResetArgs(*EVMResetArgs) *EVMResetArgs OverrideEVMResetArgs(params.Rules, *EVMResetArgs) *EVMResetArgs
} }
// NewEVMArgs are the arguments received by [NewEVM], available for override // NewEVMArgs are the arguments received by [NewEVM], available for override
@ -67,10 +67,10 @@ func overrideNewEVMArgs(
return args.BlockContext, args.TxContext, args.StateDB, args.ChainConfig, args.Config return args.BlockContext, args.TxContext, args.StateDB, args.ChainConfig, args.Config
} }
func overrideEVMResetArgs(txCtx TxContext, statedb StateDB) (TxContext, StateDB) { func (evm *EVM) overrideEVMResetArgs(txCtx TxContext, statedb StateDB) (TxContext, StateDB) {
if libevmHooks == nil { if libevmHooks == nil {
return txCtx, statedb return txCtx, statedb
} }
args := libevmHooks.OverrideEVMResetArgs(&EVMResetArgs{txCtx, statedb}) args := libevmHooks.OverrideEVMResetArgs(evm.chainRules, &EVMResetArgs{txCtx, statedb})
return args.TxContext, args.StateDB return args.TxContext, args.StateDB
} }