|
1 | | -// Copyright 2024 the libevm authors. |
| 1 | +// Copyright 2024-2025 the libevm authors. |
2 | 2 | // |
3 | 3 | // The libevm additions to go-ethereum are free software: you can redistribute |
4 | 4 | // them and/or modify them under the terms of the GNU Lesser General Public License |
|
16 | 16 |
|
17 | 17 | package vm |
18 | 18 |
|
19 | | -import "github.com/ava-labs/libevm/params" |
| 19 | +import ( |
| 20 | + "github.com/ava-labs/libevm/libevm/register" |
| 21 | + "github.com/ava-labs/libevm/params" |
| 22 | +) |
20 | 23 |
|
21 | 24 | // RegisterHooks registers the Hooks. It is expected to be called in an `init()` |
22 | 25 | // function and MUST NOT be called more than once. |
23 | 26 | func RegisterHooks(h Hooks) { |
24 | | - if libevmHooks != nil { |
25 | | - panic("already registered") |
26 | | - } |
27 | | - libevmHooks = h |
| 27 | + libevmHooks.MustRegister(h) |
| 28 | +} |
| 29 | + |
| 30 | +// TestOnlyClearRegisteredHooks clears the [Hooks] previously passed to |
| 31 | +// [RegisterHooks]. It panics if called from a non-testing call stack. |
| 32 | +func TestOnlyClearRegisteredHooks() { |
| 33 | + libevmHooks.TestOnlyClear() |
28 | 34 | } |
29 | 35 |
|
30 | | -var libevmHooks Hooks |
| 36 | +var libevmHooks register.AtMostOnce[Hooks] |
31 | 37 |
|
32 | 38 | // Hooks are arbitrary configuration functions to modify default VM behaviour. |
33 | 39 | // See [RegisterHooks]. |
@@ -60,17 +66,17 @@ func overrideNewEVMArgs( |
60 | 66 | chainConfig *params.ChainConfig, |
61 | 67 | config Config, |
62 | 68 | ) (BlockContext, TxContext, StateDB, *params.ChainConfig, Config) { |
63 | | - if libevmHooks == nil { |
| 69 | + if !libevmHooks.Registered() { |
64 | 70 | return blockCtx, txCtx, statedb, chainConfig, config |
65 | 71 | } |
66 | | - args := libevmHooks.OverrideNewEVMArgs(&NewEVMArgs{blockCtx, txCtx, statedb, chainConfig, config}) |
| 72 | + args := libevmHooks.Get().OverrideNewEVMArgs(&NewEVMArgs{blockCtx, txCtx, statedb, chainConfig, config}) |
67 | 73 | return args.BlockContext, args.TxContext, args.StateDB, args.ChainConfig, args.Config |
68 | 74 | } |
69 | 75 |
|
70 | 76 | func (evm *EVM) overrideEVMResetArgs(txCtx TxContext, statedb StateDB) (TxContext, StateDB) { |
71 | | - if libevmHooks == nil { |
| 77 | + if !libevmHooks.Registered() { |
72 | 78 | return txCtx, statedb |
73 | 79 | } |
74 | | - args := libevmHooks.OverrideEVMResetArgs(evm.chainRules, &EVMResetArgs{txCtx, statedb}) |
| 80 | + args := libevmHooks.Get().OverrideEVMResetArgs(evm.chainRules, &EVMResetArgs{txCtx, statedb}) |
75 | 81 | return args.TxContext, args.StateDB |
76 | 82 | } |
0 commit comments