17
17
use ln:: msgs;
18
18
use ln:: { PaymentPreimage , PaymentHash , PaymentSecret } ;
19
19
use chain:: keysinterface:: SpendableOutputDescriptor ;
20
- use util:: ser:: { Writeable , Writer , MaybeReadable , Readable } ;
20
+ use util:: ser:: { Writeable , Writer , MaybeReadable , Readable , VecReadWrapper , VecWriteWrapper } ;
21
21
22
22
use bitcoin:: blockdata:: script:: Script ;
23
23
@@ -146,14 +146,20 @@ impl Writeable for Event {
146
146
} ,
147
147
& Event :: PaymentReceived { ref payment_hash, ref payment_preimage, ref payment_secret, ref amt, ref user_payment_id } => {
148
148
1u8 . write ( writer) ?;
149
- payment_hash. write ( writer) ?;
150
- payment_preimage. write ( writer) ?;
151
- payment_secret. write ( writer) ?;
152
- amt. write ( writer) ?;
153
- user_payment_id. write ( writer) ?;
149
+ write_tlv_fields ! ( writer, {
150
+ ( 0 , payment_hash) ,
151
+ ( 2 , payment_secret) ,
152
+ ( 4 , amt) ,
153
+ ( 6 , user_payment_id) ,
154
+ } , {
155
+ ( 8 , payment_preimage) ,
156
+ } ) ;
154
157
} ,
155
158
& Event :: PaymentSent { ref payment_preimage } => {
156
159
2u8 . write ( writer) ?;
160
+ write_tlv_fields ! ( writer, {
161
+ ( 0 , payment_preimage) ,
162
+ } , { } ) ;
157
163
payment_preimage. write ( writer) ?;
158
164
} ,
159
165
& Event :: PaymentFailed { ref payment_hash, ref rejected_by_dest,
@@ -163,24 +169,26 @@ impl Writeable for Event {
163
169
ref error_data,
164
170
} => {
165
171
3u8 . write ( writer) ?;
166
- payment_hash. write ( writer) ?;
167
- rejected_by_dest. write ( writer) ?;
168
172
#[ cfg( test) ]
169
173
error_code. write ( writer) ?;
170
174
#[ cfg( test) ]
171
175
error_data. write ( writer) ?;
176
+ write_tlv_fields ! ( writer, {
177
+ ( 0 , payment_hash) ,
178
+ ( 2 , rejected_by_dest) ,
179
+ } , { } ) ;
172
180
} ,
173
181
& Event :: PendingHTLCsForwardable { time_forwardable : _ } => {
174
182
4u8 . write ( writer) ?;
183
+ write_tlv_fields ! ( writer, { } , { } ) ;
175
184
// We don't write the time_fordwardable out at all, as we presume when the user
176
185
// deserializes us at least that much time has elapsed.
177
186
} ,
178
187
& Event :: SpendableOutputs { ref outputs } => {
179
188
5u8 . write ( writer) ?;
180
- ( outputs. len ( ) as u64 ) . write ( writer) ?;
181
- for output in outputs. iter ( ) {
182
- output. write ( writer) ?;
183
- }
189
+ write_tlv_fields ! ( writer, {
190
+ ( 0 , VecWriteWrapper ( outputs) ) ,
191
+ } , { } ) ;
184
192
} ,
185
193
}
186
194
Ok ( ( ) )
@@ -190,34 +198,84 @@ impl MaybeReadable for Event {
190
198
fn read < R : :: std:: io:: Read > ( reader : & mut R ) -> Result < Option < Self > , msgs:: DecodeError > {
191
199
match Readable :: read ( reader) ? {
192
200
0u8 => Ok ( None ) ,
193
- 1u8 => Ok ( Some ( Event :: PaymentReceived {
194
- payment_hash : Readable :: read ( reader) ?,
195
- payment_preimage : Readable :: read ( reader) ?,
196
- payment_secret : Readable :: read ( reader) ?,
197
- amt : Readable :: read ( reader) ?,
198
- user_payment_id : Readable :: read ( reader) ?,
199
- } ) ) ,
200
- 2u8 => Ok ( Some ( Event :: PaymentSent {
201
- payment_preimage : Readable :: read ( reader) ?,
202
- } ) ) ,
203
- 3u8 => Ok ( Some ( Event :: PaymentFailed {
204
- payment_hash : Readable :: read ( reader) ?,
205
- rejected_by_dest : Readable :: read ( reader) ?,
201
+ 1u8 => {
202
+ let f = || {
203
+ let mut payment_hash = PaymentHash ( [ 0 ; 32 ] ) ;
204
+ let mut payment_preimage = None ;
205
+ let mut payment_secret = PaymentSecret ( [ 0 ; 32 ] ) ;
206
+ let mut amt = 0 ;
207
+ let mut user_payment_id = 0 ;
208
+ read_tlv_fields ! ( reader, {
209
+ ( 0 , payment_hash) ,
210
+ ( 2 , payment_secret) ,
211
+ ( 4 , amt) ,
212
+ ( 6 , user_payment_id) ,
213
+ } , {
214
+ ( 8 , payment_preimage) ,
215
+ } ) ;
216
+ Ok ( Some ( Event :: PaymentReceived {
217
+ payment_hash,
218
+ payment_preimage,
219
+ payment_secret,
220
+ amt,
221
+ user_payment_id,
222
+ } ) )
223
+ } ;
224
+ f ( )
225
+ } ,
226
+ 2u8 => {
227
+ let f = || {
228
+ let mut payment_preimage = PaymentPreimage ( [ 0 ; 32 ] ) ;
229
+ read_tlv_fields ! ( reader, {
230
+ ( 0 , payment_preimage) ,
231
+ } , { } ) ;
232
+ Ok ( Some ( Event :: PaymentSent {
233
+ payment_preimage,
234
+ } ) )
235
+ } ;
236
+ f ( )
237
+ } ,
238
+ 3u8 => {
239
+ let f = || {
206
240
#[ cfg( test) ]
207
- error_code : Readable :: read ( reader) ?,
241
+ let error_code = Readable :: read ( reader) ?;
208
242
#[ cfg( test) ]
209
- error_data : Readable :: read ( reader) ?,
210
- } ) ) ,
211
- 4u8 => Ok ( Some ( Event :: PendingHTLCsForwardable {
212
- time_forwardable : Duration :: from_secs ( 0 )
213
- } ) ) ,
243
+ let error_data = Readable :: read ( reader) ?;
244
+ let mut payment_hash = PaymentHash ( [ 0 ; 32 ] ) ;
245
+ let mut rejected_by_dest = false ;
246
+ read_tlv_fields ! ( reader, {
247
+ ( 0 , payment_hash) ,
248
+ ( 2 , rejected_by_dest) ,
249
+ } , { } ) ;
250
+ Ok ( Some ( Event :: PaymentFailed {
251
+ payment_hash,
252
+ rejected_by_dest,
253
+ #[ cfg( test) ]
254
+ error_code,
255
+ #[ cfg( test) ]
256
+ error_data,
257
+ } ) )
258
+ } ;
259
+ f ( )
260
+ } ,
261
+ 4u8 => {
262
+ let f = || {
263
+ read_tlv_fields ! ( reader, { } , { } ) ;
264
+ Ok ( Some ( Event :: PendingHTLCsForwardable {
265
+ time_forwardable : Duration :: from_secs ( 0 )
266
+ } ) )
267
+ } ;
268
+ f ( )
269
+ } ,
214
270
5u8 => {
215
- let outputs_len: u64 = Readable :: read ( reader) ?;
216
- let mut outputs = Vec :: new ( ) ;
217
- for _ in 0 ..outputs_len {
218
- outputs. push ( Readable :: read ( reader) ?) ;
219
- }
220
- Ok ( Some ( Event :: SpendableOutputs { outputs } ) )
271
+ let f = || {
272
+ let mut outputs = VecReadWrapper ( Vec :: new ( ) ) ;
273
+ read_tlv_fields ! ( reader, {
274
+ ( 0 , outputs) ,
275
+ } , { } ) ;
276
+ Ok ( Some ( Event :: SpendableOutputs { outputs : outputs. 0 } ) )
277
+ } ;
278
+ f ( )
221
279
} ,
222
280
_ => Err ( msgs:: DecodeError :: InvalidValue )
223
281
}
0 commit comments