@@ -6560,9 +6560,10 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for Channel<Signer> {
6560
6560
}
6561
6561
6562
6562
let mut preimages: Vec < & Option < PaymentPreimage > > = vec ! [ ] ;
6563
+ let mut pending_outbound_skimmed_fees: Vec < Option < u64 > > = Vec :: new ( ) ;
6563
6564
6564
6565
( self . pending_outbound_htlcs . len ( ) as u64 ) . write ( writer) ?;
6565
- for htlc in self . pending_outbound_htlcs . iter ( ) {
6566
+ for ( idx , htlc) in self . pending_outbound_htlcs . iter ( ) . enumerate ( ) {
6566
6567
htlc. htlc_id . write ( writer) ?;
6567
6568
htlc. amount_msat . write ( writer) ?;
6568
6569
htlc. cltv_expiry . write ( writer) ?;
@@ -6598,23 +6599,37 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for Channel<Signer> {
6598
6599
reason. write ( writer) ?;
6599
6600
}
6600
6601
}
6601
- htlc. skimmed_fee_msat . write ( writer) ?;
6602
+ if let Some ( skimmed_fee) = htlc. skimmed_fee_msat {
6603
+ if pending_outbound_skimmed_fees. is_empty ( ) {
6604
+ for _ in 0 ..idx { pending_outbound_skimmed_fees. push ( None ) ; }
6605
+ }
6606
+ pending_outbound_skimmed_fees. push ( Some ( skimmed_fee) ) ;
6607
+ } else if !pending_outbound_skimmed_fees. is_empty ( ) {
6608
+ pending_outbound_skimmed_fees. push ( None ) ;
6609
+ }
6602
6610
}
6603
6611
6612
+ let mut holding_cell_skimmed_fees: Vec < Option < u64 > > = Vec :: new ( ) ;
6604
6613
( self . holding_cell_htlc_updates . len ( ) as u64 ) . write ( writer) ?;
6605
- for update in self . holding_cell_htlc_updates . iter ( ) {
6614
+ for ( idx , update) in self . holding_cell_htlc_updates . iter ( ) . enumerate ( ) {
6606
6615
match update {
6607
6616
& HTLCUpdateAwaitingACK :: AddHTLC {
6608
6617
ref amount_msat, ref cltv_expiry, ref payment_hash, ref source, ref onion_routing_packet,
6609
- ref skimmed_fee_msat,
6618
+ skimmed_fee_msat,
6610
6619
} => {
6611
6620
0u8 . write ( writer) ?;
6612
6621
amount_msat. write ( writer) ?;
6613
6622
cltv_expiry. write ( writer) ?;
6614
6623
payment_hash. write ( writer) ?;
6615
6624
source. write ( writer) ?;
6616
6625
onion_routing_packet. write ( writer) ?;
6617
- skimmed_fee_msat. write ( writer) ?;
6626
+
6627
+ if let Some ( skimmed_fee) = skimmed_fee_msat {
6628
+ if holding_cell_skimmed_fees. is_empty ( ) {
6629
+ for _ in 0 ..idx { holding_cell_skimmed_fees. push ( None ) ; }
6630
+ }
6631
+ holding_cell_skimmed_fees. push ( Some ( skimmed_fee) ) ;
6632
+ } else if !holding_cell_skimmed_fees. is_empty ( ) { holding_cell_skimmed_fees. push ( None ) ; }
6618
6633
} ,
6619
6634
& HTLCUpdateAwaitingACK :: ClaimHTLC { ref payment_preimage, ref htlc_id } => {
6620
6635
1u8 . write ( writer) ?;
@@ -6781,6 +6796,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for Channel<Signer> {
6781
6796
( 29 , self . temporary_channel_id, option) ,
6782
6797
( 31 , channel_pending_event_emitted, option) ,
6783
6798
( 33 , self . pending_monitor_updates, vec_type) ,
6799
+ ( 35 , pending_outbound_skimmed_fees, optional_vec) ,
6800
+ ( 37 , holding_cell_skimmed_fees, optional_vec) ,
6784
6801
} ) ;
6785
6802
6786
6803
Ok ( ( ) )
@@ -6891,7 +6908,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
6891
6908
} ,
6892
6909
_ => return Err ( DecodeError :: InvalidValue ) ,
6893
6910
} ,
6894
- skimmed_fee_msat : Readable :: read ( reader ) ? ,
6911
+ skimmed_fee_msat : None ,
6895
6912
} ) ;
6896
6913
}
6897
6914
@@ -6905,7 +6922,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
6905
6922
payment_hash : Readable :: read ( reader) ?,
6906
6923
source : Readable :: read ( reader) ?,
6907
6924
onion_routing_packet : Readable :: read ( reader) ?,
6908
- skimmed_fee_msat : Readable :: read ( reader ) ? ,
6925
+ skimmed_fee_msat : None ,
6909
6926
} ,
6910
6927
1 => HTLCUpdateAwaitingACK :: ClaimHTLC {
6911
6928
payment_preimage : Readable :: read ( reader) ?,
@@ -7061,6 +7078,9 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
7061
7078
7062
7079
let mut pending_monitor_updates = Some ( Vec :: new ( ) ) ;
7063
7080
7081
+ let mut pending_outbound_skimmed_fees_opt: Option < Vec < Option < u64 > > > = None ;
7082
+ let mut holding_cell_skimmed_fees_opt: Option < Vec < Option < u64 > > > = None ;
7083
+
7064
7084
read_tlv_fields ! ( reader, {
7065
7085
( 0 , announcement_sigs, option) ,
7066
7086
( 1 , minimum_depth, option) ,
@@ -7084,6 +7104,8 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
7084
7104
( 29 , temporary_channel_id, option) ,
7085
7105
( 31 , channel_pending_event_emitted, option) ,
7086
7106
( 33 , pending_monitor_updates, vec_type) ,
7107
+ ( 35 , pending_outbound_skimmed_fees_opt, optional_vec) ,
7108
+ ( 37 , holding_cell_skimmed_fees_opt, optional_vec) ,
7087
7109
} ) ;
7088
7110
7089
7111
let ( channel_keys_id, holder_signer) = if let Some ( channel_keys_id) = channel_keys_id {
@@ -7138,6 +7160,25 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
7138
7160
7139
7161
let holder_max_accepted_htlcs = holder_max_accepted_htlcs. unwrap_or ( DEFAULT_MAX_HTLCS ) ;
7140
7162
7163
+ if let Some ( skimmed_fees) = pending_outbound_skimmed_fees_opt {
7164
+ let mut iter = skimmed_fees. into_iter ( ) ;
7165
+ for htlc in pending_outbound_htlcs. iter_mut ( ) {
7166
+ htlc. skimmed_fee_msat = iter. next ( ) . ok_or ( DecodeError :: InvalidValue ) ?;
7167
+ }
7168
+ // We expect all skimmed fees to be consumed above
7169
+ if iter. next ( ) . is_some ( ) { return Err ( DecodeError :: InvalidValue ) }
7170
+ }
7171
+ if let Some ( skimmed_fees) = holding_cell_skimmed_fees_opt {
7172
+ let mut iter = skimmed_fees. into_iter ( ) ;
7173
+ for htlc in holding_cell_htlc_updates. iter_mut ( ) {
7174
+ if let HTLCUpdateAwaitingACK :: AddHTLC { ref mut skimmed_fee_msat, .. } = htlc {
7175
+ * skimmed_fee_msat = iter. next ( ) . ok_or ( DecodeError :: InvalidValue ) ?;
7176
+ }
7177
+ }
7178
+ // We expect all skimmed fees to be consumed above
7179
+ if iter. next ( ) . is_some ( ) { return Err ( DecodeError :: InvalidValue ) }
7180
+ }
7181
+
7141
7182
Ok ( Channel {
7142
7183
user_id,
7143
7184
0 commit comments