@@ -39,8 +39,8 @@ import (
3939// The payloads can be accessed via the [pseudo.Accessor] methods of the
4040// [ExtraPayloads] returned by RegisterExtras. The default `SA` value accessed
4141// in this manner will be a zero-value `SA` while the default value from a
42- // [Header] is a non-nil `HPtr`. The latter guarantee ensures that hooks won't
43- // be called on nil-pointer receivers.
42+ // [Header] is a non-nil `HPtr` and the default value from a [Block] is a non-nil
43+ // `BlockExtraPtr`. The latter guarantee ensures that hooks won't be called on nil-pointer receivers.
4444func RegisterExtras [
4545 H any , HPtr interface {
4646 HeaderHooks
@@ -50,9 +50,13 @@ func RegisterExtras[
5050 BodyHooks
5151 * BodyExtra
5252 },
53+ BlockExtra any , BlockExtraPtr interface {
54+ BlockHooks
55+ * BlockExtra
56+ },
5357 SA any ,
54- ]() ExtraPayloads [HPtr , BodyExtraPtr , SA ] {
55- extra := ExtraPayloads [HPtr , BodyExtraPtr , SA ]{
58+ ]() ExtraPayloads [HPtr , BodyExtraPtr , BlockExtraPtr , SA ] {
59+ extra := ExtraPayloads [HPtr , BodyExtraPtr , BlockExtraPtr , SA ]{
5660 Header : pseudo .NewAccessor [* Header , HPtr ](
5761 (* Header ).extraPayload ,
5862 func (h * Header , t * pseudo.Type ) { h .extra = t },
@@ -61,6 +65,10 @@ func RegisterExtras[
6165 (* Body ).extraPayload ,
6266 func (b * Body , t * pseudo.Type ) { b .extra = t },
6367 ),
68+ Block : pseudo .NewAccessor [* Block , BlockExtraPtr ](
69+ (* Block ).extraPayload ,
70+ func (b * Block , t * pseudo.Type ) { b .extra = t },
71+ ),
6472 StateAccount : pseudo .NewAccessor [StateOrSlimAccount , SA ](
6573 func (a StateOrSlimAccount ) * pseudo.Type { return a .extra ().payload () },
6674 func (a StateOrSlimAccount , t * pseudo.Type ) { a .extra ().t = t },
@@ -71,11 +79,12 @@ func RegisterExtras[
7179 var x SA
7280 return fmt .Sprintf ("%T" , x )
7381 }(),
74- // The [ExtraPayloads] that we returns is based on [HPtr,BodyExtraPtr,SA], not
75- // [H,BodyExtra,SA] so our constructors MUST match that. This guarantees that calls to
76- // the [HeaderHooks] and [BodyHooks] methods will never be performed on a nil pointer.
77- newHeader : pseudo .NewConstructor [H ]().NewPointer , // i.e. non-nil HPtr
78- newBody : pseudo .NewConstructor [BodyExtra ]().NewPointer , // i.e. non-nil BodyExtraPtr
82+ // The [ExtraPayloads] that we returns is based on [HPtr,BodyExtraPtr,BlockExtraPtr,SA], not
83+ // [H,BodyExtra,BlockExtra,SA] so our constructors MUST match that. This guarantees that calls to
84+ // the [HeaderHooks], [BodyHooks] and [BlockHooks] methods will never be performed on a nil pointer.
85+ newHeader : pseudo .NewConstructor [H ]().NewPointer , // i.e. non-nil HPtr
86+ newBody : pseudo .NewConstructor [BodyExtra ]().NewPointer , // i.e. non-nil BodyExtraPtr
87+ newBlock : pseudo .NewConstructor [BlockExtra ]().NewPointer , // i.e. non-nil BlockExtraPtr
7988 newStateAccount : pseudo .NewConstructor [SA ]().Zero ,
8089 cloneStateAccount : extra .cloneStateAccount ,
8190 hooks : extra ,
@@ -99,11 +108,13 @@ type extraConstructors struct {
99108 stateAccountType string
100109 newHeader func () * pseudo.Type
101110 newBody func () * pseudo.Type
111+ newBlock func () * pseudo.Type
102112 newStateAccount func () * pseudo.Type
103113 cloneStateAccount func (* StateAccountExtra ) * StateAccountExtra
104114 hooks interface {
105115 hooksFromHeader (* Header ) HeaderHooks
106116 hooksFromBody (* Body ) BodyHooks
117+ hooksFromBlock (* Block ) BlockHooks
107118 }
108119}
109120
@@ -117,15 +128,16 @@ func (e *StateAccountExtra) clone() *StateAccountExtra {
117128}
118129
119130// ExtraPayloads provides strongly typed access to the extra payload carried by
120- // [Header], [Body], [StateAccount], and [SlimAccount] structs. The only valid way to
131+ // [Header], [Body], [Block], [ StateAccount], and [SlimAccount] structs. The only valid way to
121132// construct an instance is by a call to [RegisterExtras].
122- type ExtraPayloads [HPtr HeaderHooks , BodyExtraPtr BodyHooks , SA any ] struct {
133+ type ExtraPayloads [HPtr HeaderHooks , BodyExtraPtr BodyHooks , BlockExtraPtr BlockHooks , SA any ] struct {
123134 Header pseudo.Accessor [* Header , HPtr ]
124135 Body pseudo.Accessor [* Body , BodyExtraPtr ]
136+ Block pseudo.Accessor [* Block , BlockExtraPtr ]
125137 StateAccount pseudo.Accessor [StateOrSlimAccount , SA ] // Also provides [SlimAccount] access.
126138}
127139
128- func (ExtraPayloads [HPtr , BodyExtraPtr , SA ]) cloneStateAccount (s * StateAccountExtra ) * StateAccountExtra {
140+ func (ExtraPayloads [HPtr , BodyExtraPtr , BlockExtraPtr , SA ]) cloneStateAccount (s * StateAccountExtra ) * StateAccountExtra {
129141 v := pseudo.MustNewValue [SA ](s .t )
130142 return & StateAccountExtra {
131143 t : pseudo .From (v .Get ()).Type ,
0 commit comments