@@ -6500,9 +6500,10 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for Channel<Signer> {
65006500 }
65016501
65026502 let mut preimages: Vec < & Option < PaymentPreimage > > = vec ! [ ] ;
6503+ let mut pending_outbound_skimmed_fees: Vec < Option < u64 > > = Vec :: new ( ) ;
65036504
65046505 ( self . pending_outbound_htlcs . len ( ) as u64 ) . write ( writer) ?;
6505- for htlc in self . pending_outbound_htlcs . iter ( ) {
6506+ for ( idx , htlc) in self . pending_outbound_htlcs . iter ( ) . enumerate ( ) {
65066507 htlc. htlc_id . write ( writer) ?;
65076508 htlc. amount_msat . write ( writer) ?;
65086509 htlc. cltv_expiry . write ( writer) ?;
@@ -6538,23 +6539,37 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for Channel<Signer> {
65386539 reason. write ( writer) ?;
65396540 }
65406541 }
6541- htlc. skimmed_fee_msat . write ( writer) ?;
6542+ if let Some ( skimmed_fee) = htlc. skimmed_fee_msat {
6543+ if pending_outbound_skimmed_fees. is_empty ( ) {
6544+ for _ in 0 ..idx { pending_outbound_skimmed_fees. push ( None ) ; }
6545+ }
6546+ pending_outbound_skimmed_fees. push ( Some ( skimmed_fee) ) ;
6547+ } else if !pending_outbound_skimmed_fees. is_empty ( ) {
6548+ pending_outbound_skimmed_fees. push ( None ) ;
6549+ }
65426550 }
65436551
6552+ let mut holding_cell_skimmed_fees: Vec < Option < u64 > > = Vec :: new ( ) ;
65446553 ( self . holding_cell_htlc_updates . len ( ) as u64 ) . write ( writer) ?;
6545- for update in self . holding_cell_htlc_updates . iter ( ) {
6554+ for ( idx , update) in self . holding_cell_htlc_updates . iter ( ) . enumerate ( ) {
65466555 match update {
65476556 & HTLCUpdateAwaitingACK :: AddHTLC {
65486557 ref amount_msat, ref cltv_expiry, ref payment_hash, ref source, ref onion_routing_packet,
6549- ref skimmed_fee_msat,
6558+ skimmed_fee_msat,
65506559 } => {
65516560 0u8 . write ( writer) ?;
65526561 amount_msat. write ( writer) ?;
65536562 cltv_expiry. write ( writer) ?;
65546563 payment_hash. write ( writer) ?;
65556564 source. write ( writer) ?;
65566565 onion_routing_packet. write ( writer) ?;
6557- skimmed_fee_msat. write ( writer) ?;
6566+
6567+ if let Some ( skimmed_fee) = skimmed_fee_msat {
6568+ if holding_cell_skimmed_fees. is_empty ( ) {
6569+ for _ in 0 ..idx { holding_cell_skimmed_fees. push ( None ) ; }
6570+ }
6571+ holding_cell_skimmed_fees. push ( Some ( skimmed_fee) ) ;
6572+ } else if !holding_cell_skimmed_fees. is_empty ( ) { holding_cell_skimmed_fees. push ( None ) ; }
65586573 } ,
65596574 & HTLCUpdateAwaitingACK :: ClaimHTLC { ref payment_preimage, ref htlc_id } => {
65606575 1u8 . write ( writer) ?;
@@ -6721,6 +6736,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for Channel<Signer> {
67216736 ( 29 , self . temporary_channel_id, option) ,
67226737 ( 31 , channel_pending_event_emitted, option) ,
67236738 ( 33 , self . pending_monitor_updates, vec_type) ,
6739+ ( 35 , pending_outbound_skimmed_fees, optional_vec) ,
6740+ ( 37 , holding_cell_skimmed_fees, optional_vec) ,
67246741 } ) ;
67256742
67266743 Ok ( ( ) )
@@ -6831,7 +6848,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
68316848 } ,
68326849 _ => return Err ( DecodeError :: InvalidValue ) ,
68336850 } ,
6834- skimmed_fee_msat : Readable :: read ( reader ) ? ,
6851+ skimmed_fee_msat : None ,
68356852 } ) ;
68366853 }
68376854
@@ -6845,7 +6862,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
68456862 payment_hash : Readable :: read ( reader) ?,
68466863 source : Readable :: read ( reader) ?,
68476864 onion_routing_packet : Readable :: read ( reader) ?,
6848- skimmed_fee_msat : Readable :: read ( reader ) ? ,
6865+ skimmed_fee_msat : None ,
68496866 } ,
68506867 1 => HTLCUpdateAwaitingACK :: ClaimHTLC {
68516868 payment_preimage : Readable :: read ( reader) ?,
@@ -7001,6 +7018,9 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
70017018
70027019 let mut pending_monitor_updates = Some ( Vec :: new ( ) ) ;
70037020
7021+ let mut pending_outbound_skimmed_fees_opt: Option < Vec < Option < u64 > > > = None ;
7022+ let mut holding_cell_skimmed_fees_opt: Option < Vec < Option < u64 > > > = None ;
7023+
70047024 read_tlv_fields ! ( reader, {
70057025 ( 0 , announcement_sigs, option) ,
70067026 ( 1 , minimum_depth, option) ,
@@ -7024,6 +7044,8 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
70247044 ( 29 , temporary_channel_id, option) ,
70257045 ( 31 , channel_pending_event_emitted, option) ,
70267046 ( 33 , pending_monitor_updates, vec_type) ,
7047+ ( 35 , pending_outbound_skimmed_fees_opt, optional_vec) ,
7048+ ( 37 , holding_cell_skimmed_fees_opt, optional_vec) ,
70277049 } ) ;
70287050
70297051 let ( channel_keys_id, holder_signer) = if let Some ( channel_keys_id) = channel_keys_id {
@@ -7078,6 +7100,25 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
70787100
70797101 let holder_max_accepted_htlcs = holder_max_accepted_htlcs. unwrap_or ( DEFAULT_MAX_HTLCS ) ;
70807102
7103+ if let Some ( skimmed_fees) = pending_outbound_skimmed_fees_opt {
7104+ let mut iter = skimmed_fees. into_iter ( ) ;
7105+ for htlc in pending_outbound_htlcs. iter_mut ( ) {
7106+ htlc. skimmed_fee_msat = iter. next ( ) . ok_or ( DecodeError :: InvalidValue ) ?;
7107+ }
7108+ // We expect all skimmed fees to be consumed above
7109+ if iter. next ( ) . is_some ( ) { return Err ( DecodeError :: InvalidValue ) }
7110+ }
7111+ if let Some ( skimmed_fees) = holding_cell_skimmed_fees_opt {
7112+ let mut iter = skimmed_fees. into_iter ( ) ;
7113+ for htlc in holding_cell_htlc_updates. iter_mut ( ) {
7114+ if let HTLCUpdateAwaitingACK :: AddHTLC { ref mut skimmed_fee_msat, .. } = htlc {
7115+ * skimmed_fee_msat = iter. next ( ) . ok_or ( DecodeError :: InvalidValue ) ?;
7116+ }
7117+ }
7118+ // We expect all skimmed fees to be consumed above
7119+ if iter. next ( ) . is_some ( ) { return Err ( DecodeError :: InvalidValue ) }
7120+ }
7121+
70817122 Ok ( Channel {
70827123 user_id,
70837124
0 commit comments