@@ -6500,9 +6500,10 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for Channel<Signer> {
6500
6500
}
6501
6501
6502
6502
let mut preimages: Vec < & Option < PaymentPreimage > > = vec ! [ ] ;
6503
+ let mut pending_outbound_skimmed_fees: Vec < Option < u64 > > = Vec :: new ( ) ;
6503
6504
6504
6505
( 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 ( ) {
6506
6507
htlc. htlc_id . write ( writer) ?;
6507
6508
htlc. amount_msat . write ( writer) ?;
6508
6509
htlc. cltv_expiry . write ( writer) ?;
@@ -6538,23 +6539,37 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for Channel<Signer> {
6538
6539
reason. write ( writer) ?;
6539
6540
}
6540
6541
}
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
+ }
6542
6550
}
6543
6551
6552
+ let mut holding_cell_skimmed_fees: Vec < Option < u64 > > = Vec :: new ( ) ;
6544
6553
( 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 ( ) {
6546
6555
match update {
6547
6556
& HTLCUpdateAwaitingACK :: AddHTLC {
6548
6557
ref amount_msat, ref cltv_expiry, ref payment_hash, ref source, ref onion_routing_packet,
6549
- ref skimmed_fee_msat,
6558
+ skimmed_fee_msat,
6550
6559
} => {
6551
6560
0u8 . write ( writer) ?;
6552
6561
amount_msat. write ( writer) ?;
6553
6562
cltv_expiry. write ( writer) ?;
6554
6563
payment_hash. write ( writer) ?;
6555
6564
source. write ( writer) ?;
6556
6565
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 ) ; }
6558
6573
} ,
6559
6574
& HTLCUpdateAwaitingACK :: ClaimHTLC { ref payment_preimage, ref htlc_id } => {
6560
6575
1u8 . write ( writer) ?;
@@ -6721,6 +6736,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for Channel<Signer> {
6721
6736
( 29 , self . temporary_channel_id, option) ,
6722
6737
( 31 , channel_pending_event_emitted, option) ,
6723
6738
( 33 , self . pending_monitor_updates, vec_type) ,
6739
+ ( 35 , pending_outbound_skimmed_fees, optional_vec) ,
6740
+ ( 37 , holding_cell_skimmed_fees, optional_vec) ,
6724
6741
} ) ;
6725
6742
6726
6743
Ok ( ( ) )
@@ -6831,7 +6848,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
6831
6848
} ,
6832
6849
_ => return Err ( DecodeError :: InvalidValue ) ,
6833
6850
} ,
6834
- skimmed_fee_msat : Readable :: read ( reader ) ? ,
6851
+ skimmed_fee_msat : None ,
6835
6852
} ) ;
6836
6853
}
6837
6854
@@ -6845,7 +6862,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
6845
6862
payment_hash : Readable :: read ( reader) ?,
6846
6863
source : Readable :: read ( reader) ?,
6847
6864
onion_routing_packet : Readable :: read ( reader) ?,
6848
- skimmed_fee_msat : Readable :: read ( reader ) ? ,
6865
+ skimmed_fee_msat : None ,
6849
6866
} ,
6850
6867
1 => HTLCUpdateAwaitingACK :: ClaimHTLC {
6851
6868
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
7001
7018
7002
7019
let mut pending_monitor_updates = Some ( Vec :: new ( ) ) ;
7003
7020
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
+
7004
7024
read_tlv_fields ! ( reader, {
7005
7025
( 0 , announcement_sigs, option) ,
7006
7026
( 1 , minimum_depth, option) ,
@@ -7024,6 +7044,8 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
7024
7044
( 29 , temporary_channel_id, option) ,
7025
7045
( 31 , channel_pending_event_emitted, option) ,
7026
7046
( 33 , pending_monitor_updates, vec_type) ,
7047
+ ( 35 , pending_outbound_skimmed_fees_opt, optional_vec) ,
7048
+ ( 37 , holding_cell_skimmed_fees_opt, optional_vec) ,
7027
7049
} ) ;
7028
7050
7029
7051
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
7078
7100
7079
7101
let holder_max_accepted_htlcs = holder_max_accepted_htlcs. unwrap_or ( DEFAULT_MAX_HTLCS ) ;
7080
7102
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
+
7081
7122
Ok ( Channel {
7082
7123
user_id,
7083
7124
0 commit comments