1
+ // Copyright 2024 the libevm authors.
2
+ //
3
+ // The libevm additions to go-ethereum are free software: you can redistribute
4
+ // them and/or modify them under the terms of the GNU Lesser General Public License
5
+ // as published by the Free Software Foundation, either version 3 of the License,
6
+ // or (at your option) any later version.
7
+ //
8
+ // The libevm additions are distributed in the hope that they will be useful,
9
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
11
+ // General Public License for more details.
12
+ //
13
+ // You should have received a copy of the GNU Lesser General Public License
14
+ // along with the go-ethereum library. If not, see
15
+ // <http://www.gnu.org/licenses/>.
1
16
package vm
2
17
3
18
import (
@@ -9,16 +24,35 @@ import (
9
24
"github.com/ethereum/go-ethereum/params"
10
25
)
11
26
12
- type chainIDOverrider struct {
13
- chainID int64
27
+ type evmArgOverrider struct {
28
+ newEVMchainID int64
29
+
30
+ resetTxCtx TxContext
31
+ resetStateDB StateDB
14
32
}
15
33
16
- func (o chainIDOverrider ) OverrideNewEVMArgs (args * NewEVMArgs ) * NewEVMArgs {
17
- args .ChainConfig = & params.ChainConfig {ChainID : big .NewInt (o .chainID )}
34
+ func (o evmArgOverrider ) OverrideNewEVMArgs (args * NewEVMArgs ) * NewEVMArgs {
35
+ args .ChainConfig = & params.ChainConfig {ChainID : big .NewInt (o .newEVMchainID )}
18
36
return args
19
37
}
20
38
21
- func (chainIDOverrider ) OverrideJumpTable (_ params.Rules , jt * JumpTable ) * JumpTable { return jt }
39
+ func (evmArgOverrider ) OverrideJumpTable (_ params.Rules , jt * JumpTable ) * JumpTable { return jt }
40
+
41
+ func (o evmArgOverrider ) OverrideEVMResetArgs (* EVMResetArgs ) * EVMResetArgs {
42
+ return & EVMResetArgs {
43
+ TxContext : o .resetTxCtx ,
44
+ StateDB : o .resetStateDB ,
45
+ }
46
+ }
47
+
48
+ func (o evmArgOverrider ) register (t * testing.T ) {
49
+ t .Helper ()
50
+ libevmHooks = nil
51
+ RegisterHooks (o )
52
+ t .Cleanup (func () {
53
+ libevmHooks = nil
54
+ })
55
+ }
22
56
23
57
func TestOverrideNewEVMArgs (t * testing.T ) {
24
58
// The overrideNewEVMArgs function accepts and returns all arguments to
@@ -27,10 +61,27 @@ func TestOverrideNewEVMArgs(t *testing.T) {
27
61
var _ func (BlockContext , TxContext , StateDB , * params.ChainConfig , Config ) * EVM = NewEVM
28
62
29
63
const chainID = 13579
30
- libevmHooks = nil
31
- RegisterHooks (chainIDOverrider {chainID : chainID })
32
- defer func () { libevmHooks = nil }()
64
+ hooks := evmArgOverrider {newEVMchainID : chainID }
65
+ hooks .register (t )
66
+
67
+ evm := NewEVM (BlockContext {}, TxContext {}, nil , nil , Config {})
68
+ got := evm .ChainConfig ().ChainID
69
+ require .Equalf (t , big .NewInt (chainID ), got , "%T.ChainConfig().ChainID set by NewEVM() hook" , evm )
70
+ }
71
+
72
+ func TestOverrideEVMResetArgs (t * testing.T ) {
73
+ // Equivalent to rationale for TestOverrideNewEVMArgs above.
74
+ var _ func (TxContext , StateDB ) = (* EVM )(nil ).Reset
75
+
76
+ const gasPrice = 1357924680
77
+ hooks := evmArgOverrider {
78
+ resetTxCtx : TxContext {
79
+ GasPrice : big .NewInt (gasPrice ),
80
+ },
81
+ }
82
+ hooks .register (t )
33
83
34
- got := NewEVM (BlockContext {}, TxContext {}, nil , nil , Config {}).ChainConfig ().ChainID
35
- require .Equal (t , big .NewInt (chainID ), got )
84
+ evm := NewEVM (BlockContext {}, TxContext {}, nil , nil , Config {})
85
+ evm .Reset (TxContext {}, nil )
86
+ require .Equalf (t , big .NewInt (gasPrice ), evm .GasPrice , "%T.GasPrice set by Reset() hook" , evm )
36
87
}
0 commit comments