@@ -64,6 +64,139 @@ func VersionDecoder(r io.Reader, val any, buf *[8]byte, l uint64) error {
64
64
return tlv .NewTypeForDecodingErr (val , "TransitionVersion" , l , 1 )
65
65
}
66
66
67
+ func FragmentVersionEncoder (w io.Writer , val any , buf * [8 ]byte ) error {
68
+ if t , ok := val .(* SendFragmentVersion ); ok {
69
+ return tlv .EUint8T (w , uint8 (* t ), buf )
70
+ }
71
+ return tlv .NewTypeForEncodingErr (val , "SendFragmentVersion" )
72
+ }
73
+
74
+ func FragmentVersionDecoder (r io.Reader , val any , buf * [8 ]byte ,
75
+ l uint64 ) error {
76
+
77
+ if typ , ok := val .(* SendFragmentVersion ); ok {
78
+ var t uint8
79
+ if err := tlv .DUint8 (r , & t , buf , l ); err != nil {
80
+ return err
81
+ }
82
+ * typ = SendFragmentVersion (t )
83
+ return nil
84
+ }
85
+ return tlv .NewTypeForDecodingErr (val , "SendFragmentVersion" , l , 1 )
86
+ }
87
+
88
+ func SendOutputEncoder (w io.Writer , val any , buf * [8 ]byte ) error {
89
+ if t , ok := val .(* SendOutput ); ok {
90
+ err := tlv .EUint8T (w , uint8 (t .AssetVersion ), buf )
91
+ if err != nil {
92
+ return err
93
+ }
94
+ if err := tlv .EUint64T (w , t .Amount , buf ); err != nil {
95
+ return err
96
+ }
97
+ err = tlv .EUint8T (w , uint8 (t .DerivationMethod ), buf )
98
+ if err != nil {
99
+ return err
100
+ }
101
+
102
+ keyArr := ([btcec .PubKeyBytesLenCompressed ]byte )(t .ScriptKey )
103
+ return tlv .EBytes33 (w , & keyArr , buf )
104
+ }
105
+ return tlv .NewTypeForEncodingErr (val , "*SendOutput" )
106
+ }
107
+
108
+ func SendOutputDecoder (r io.Reader , val any , buf * [8 ]byte ) error {
109
+ if typ , ok := val .(* SendOutput ); ok {
110
+ var assetVersion uint8
111
+ if err := tlv .DUint8 (r , & assetVersion , buf , 1 ); err != nil {
112
+ return err
113
+ }
114
+ typ .AssetVersion = asset .Version (assetVersion )
115
+
116
+ if err := tlv .DUint64 (r , & typ .Amount , buf , 8 ); err != nil {
117
+ return err
118
+ }
119
+
120
+ var derivationMethod uint8
121
+ if err := tlv .DUint8 (r , & derivationMethod , buf , 1 ); err != nil {
122
+ return err
123
+ }
124
+ typ .DerivationMethod = asset .ScriptKeyDerivationMethod (
125
+ derivationMethod ,
126
+ )
127
+
128
+ keyArr := ([btcec .PubKeyBytesLenCompressed ]byte )(typ .ScriptKey )
129
+ if err := tlv .DBytes33 (
130
+ r , & keyArr , buf , btcec .PubKeyBytesLenCompressed ,
131
+ ); err != nil {
132
+ return err
133
+ }
134
+ typ .ScriptKey = keyArr
135
+
136
+ return nil
137
+ }
138
+ return tlv .NewTypeForEncodingErr (val , "*SendOutput" )
139
+ }
140
+
141
+ func SendOutputsEncoder (w io.Writer , val any , buf * [8 ]byte ) error {
142
+ if t , ok := val .(* map [asset.ID ]SendOutput ); ok {
143
+ numOutputs := uint64 (len (* t ))
144
+ if err := tlv .WriteVarInt (w , numOutputs , buf ); err != nil {
145
+ return err
146
+ }
147
+
148
+ for id , output := range * t {
149
+ idArr := ([32 ]byte )(id )
150
+ if err := tlv .EBytes32 (w , & idArr , buf ); err != nil {
151
+ return err
152
+ }
153
+
154
+ err := SendOutputEncoder (w , & output , buf )
155
+ if err != nil {
156
+ return err
157
+ }
158
+ }
159
+ return nil
160
+ }
161
+ return tlv .NewTypeForEncodingErr (val , "map[asset.ID]SendOutput" )
162
+ }
163
+
164
+ func SendOutputsDecoder (r io.Reader , val any , buf * [8 ]byte , l uint64 ) error {
165
+ if typ , ok := val .(* map [asset.ID ]SendOutput ); ok {
166
+ numOutputs , err := tlv .ReadVarInt (r , buf )
167
+ if err != nil {
168
+ return err
169
+ }
170
+
171
+ // Avoid OOM by limiting the number of send outputs we accept.
172
+ if numOutputs > MaxSendFragmentOutputs {
173
+ return fmt .Errorf ("%w: too many send outputs" ,
174
+ ErrProofInvalid )
175
+ }
176
+
177
+ result := make (map [asset.ID ]SendOutput , numOutputs )
178
+ for i := uint64 (0 ); i < numOutputs ; i ++ {
179
+ var id [32 ]byte
180
+ if err := tlv .DBytes32 (r , & id , buf , 32 ); err != nil {
181
+ return err
182
+ }
183
+
184
+ var output SendOutput
185
+ err := SendOutputDecoder (r , & output , buf )
186
+ if err != nil {
187
+ return err
188
+ }
189
+
190
+ result [id ] = output
191
+ }
192
+
193
+ * typ = result
194
+
195
+ return nil
196
+ }
197
+ return tlv .NewTypeForEncodingErr (val , "map[asset.ID]SendOutput" )
198
+ }
199
+
67
200
func BlockHeaderEncoder (w io.Writer , val any , buf * [8 ]byte ) error {
68
201
if t , ok := val .(* wire.BlockHeader ); ok {
69
202
return t .Serialize (w )
0 commit comments