1717use ln:: msgs;
1818use ln:: { PaymentPreimage , PaymentHash , PaymentSecret } ;
1919use chain:: keysinterface:: SpendableOutputDescriptor ;
20- use util:: ser:: { Writeable , Writer , MaybeReadable , Readable } ;
20+ use util:: ser:: { Writeable , Writer , MaybeReadable , Readable , VecReadWrapper , VecWriteWrapper } ;
2121
2222use bitcoin:: blockdata:: script:: Script ;
2323
@@ -146,14 +146,20 @@ impl Writeable for Event {
146146 } ,
147147 & Event :: PaymentReceived { ref payment_hash, ref payment_preimage, ref payment_secret, ref amt, ref user_payment_id } => {
148148 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+ } ) ;
154157 } ,
155158 & Event :: PaymentSent { ref payment_preimage } => {
156159 2u8 . write ( writer) ?;
160+ write_tlv_fields ! ( writer, {
161+ ( 0 , payment_preimage) ,
162+ } , { } ) ;
157163 payment_preimage. write ( writer) ?;
158164 } ,
159165 & Event :: PaymentFailed { ref payment_hash, ref rejected_by_dest,
@@ -163,24 +169,26 @@ impl Writeable for Event {
163169 ref error_data,
164170 } => {
165171 3u8 . write ( writer) ?;
166- payment_hash. write ( writer) ?;
167- rejected_by_dest. write ( writer) ?;
168172 #[ cfg( test) ]
169173 error_code. write ( writer) ?;
170174 #[ cfg( test) ]
171175 error_data. write ( writer) ?;
176+ write_tlv_fields ! ( writer, {
177+ ( 0 , payment_hash) ,
178+ ( 2 , rejected_by_dest) ,
179+ } , { } ) ;
172180 } ,
173181 & Event :: PendingHTLCsForwardable { time_forwardable : _ } => {
174182 4u8 . write ( writer) ?;
183+ write_tlv_fields ! ( writer, { } , { } ) ;
175184 // We don't write the time_fordwardable out at all, as we presume when the user
176185 // deserializes us at least that much time has elapsed.
177186 } ,
178187 & Event :: SpendableOutputs { ref outputs } => {
179188 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+ } , { } ) ;
184192 } ,
185193 }
186194 Ok ( ( ) )
@@ -190,34 +198,84 @@ impl MaybeReadable for Event {
190198 fn read < R : :: std:: io:: Read > ( reader : & mut R ) -> Result < Option < Self > , msgs:: DecodeError > {
191199 match Readable :: read ( reader) ? {
192200 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 = || {
206240 #[ cfg( test) ]
207- error_code : Readable :: read ( reader) ?,
241+ let error_code = Readable :: read ( reader) ?;
208242 #[ 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+ } ,
214270 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 ( )
221279 } ,
222280 _ => Err ( msgs:: DecodeError :: InvalidValue )
223281 }
0 commit comments