@@ -44,17 +44,27 @@ import (
4444// [Header] or [Block] / [Body] is a non-nil `HPtr` or `BPtr` respectively. The
4545// latter guarantee ensures that hooks won't be called on nil-pointer receivers.
4646func RegisterExtras [
47- H any , HPtr interface {
48- HeaderHooks
49- * H
50- },
51- B any , BPtr interface {
52- BlockBodyPayload [BPtr ]
53- * B
54- },
47+ H any , HPtr HeaderHooksPointer [H ],
48+ B any , BPtr BlockBodyHooksPointer [B , BPtr ],
5549 SA any ,
5650]() ExtraPayloads [HPtr , BPtr , SA ] {
57- extra := ExtraPayloads [HPtr , BPtr , SA ]{
51+ payloads , ctors := payloadsAndConstructors [H , HPtr , B , BPtr , SA ]()
52+ registeredExtras .MustRegister (ctors )
53+ log .Info (
54+ "Registered core/types extras" ,
55+ "Header" , log .TypeOf (pseudo .Zero [HPtr ]().Value .Get ()),
56+ "Block/Body" , log .TypeOf (pseudo .Zero [BPtr ]().Value .Get ()),
57+ "StateAccount" , log .TypeOf (pseudo .Zero [SA ]().Value .Get ()),
58+ )
59+ return payloads
60+ }
61+
62+ func payloadsAndConstructors [
63+ H any , HPtr HeaderHooksPointer [H ],
64+ B any , BPtr BlockBodyHooksPointer [B , BPtr ],
65+ SA any ,
66+ ]() (ExtraPayloads [HPtr , BPtr , SA ], * extraConstructors ) {
67+ payloads := ExtraPayloads [HPtr , BPtr , SA ]{
5868 Header : pseudo .NewAccessor [* Header , HPtr ](
5969 (* Header ).extraPayload ,
6070 func (h * Header , t * pseudo.Type ) { h .extra = t },
@@ -72,7 +82,7 @@ func RegisterExtras[
7282 func (a StateOrSlimAccount , t * pseudo.Type ) { a .extra ().t = t },
7383 ),
7484 }
75- registeredExtras . MustRegister ( & extraConstructors {
85+ ctors := & extraConstructors {
7686 stateAccountType : func () string {
7787 var x SA
7888 return fmt .Sprintf ("%T" , x )
@@ -84,23 +94,51 @@ func RegisterExtras[
8494 newHeader : pseudo .NewConstructor [H ]().NewPointer , // i.e. non-nil HPtr
8595 newBlockOrBody : pseudo .NewConstructor [B ]().NewPointer , // i.e. non-nil BPtr
8696 newStateAccount : pseudo .NewConstructor [SA ]().Zero ,
87- hooks : extra ,
88- })
89- log .Info (
90- "Registered core/types extras" ,
91- "Header" , log .TypeOf (pseudo .Zero [HPtr ]().Value .Get ()),
92- "Block/Body" , log .TypeOf (pseudo .Zero [BPtr ]().Value .Get ()),
93- "StateAccount" , log .TypeOf (pseudo .Zero [SA ]().Value .Get ()),
94- )
95- return extra
97+ hooks : payloads ,
98+ }
99+ return payloads , ctors
100+ }
101+
102+ // WithTempRegisteredExtras temporarily registers `HPtr`, `BPtr`, and `SA` as if
103+ // calling [RegisterExtras] the same type parameters. The [ExtraPayloads] are
104+ // passed to `fn` instead of being returned; the argument MUST NOT be persisted
105+ // beyond the life of `fn`. After `fn` returns, the registration is returned to
106+ // its former state, be that none or the types originally passed to
107+ // [RegisterExtras].
108+ //
109+ // This MUST NOT be used on a live chain. It is solely intended for off-chain
110+ // consumers that require access to extras. Said consumers SHOULD NOT, however
111+ // call this function directly. Use the libevm/temporary.WithRegisteredExtras()
112+ // function instead as it atomically overrides all possible packages.
113+ func WithTempRegisteredExtras [
114+ H , B , SA any ,
115+ HPtr HeaderHooksPointer [H ],
116+ BPtr BlockBodyHooksPointer [B , BPtr ],
117+ ](fn func (ExtraPayloads [HPtr , BPtr , SA ])) {
118+ payloads , ctors := payloadsAndConstructors [H , HPtr , B , BPtr , SA ]()
119+ registeredExtras .TempOverride (ctors , func () { fn (payloads ) })
120+ }
121+
122+ // A HeaderHooksPointer is a type constraint for an implementation of
123+ // [HeaderHooks] with a pointer receiver.
124+ type HeaderHooksPointer [H any ] interface {
125+ HeaderHooks
126+ * H
127+ }
128+
129+ // A BlockBodyHooksPointer is a type constraint for an implementation of
130+ // [BlockBodyPayload] with a pointer receiver.
131+ type BlockBodyHooksPointer [B any , Self any ] interface {
132+ BlockBodyPayload [Self ]
133+ * B
96134}
97135
98136// A BlockBodyPayload is an implementation of [BlockBodyHooks] that is also able
99137// to clone itself. Both [Block.Body] and [Block.WithBody] require this
100138// functionality to copy the payload between the types.
101- type BlockBodyPayload [BPtr any ] interface {
139+ type BlockBodyPayload [Self any ] interface {
102140 BlockBodyHooks
103- Copy () BPtr
141+ Copy () Self
104142}
105143
106144// TestOnlyClearRegisteredExtras clears the [Extras] previously passed to
0 commit comments