@@ -224,6 +224,7 @@ struct OutboundHTLCOutput {
224224 payment_hash: PaymentHash,
225225 state: OutboundHTLCState,
226226 source: HTLCSource,
227+ skimmed_fee_msat: Option<u64>,
227228}
228229
229230/// See AwaitingRemoteRevoke ChannelState for more info
@@ -235,6 +236,8 @@ enum HTLCUpdateAwaitingACK {
235236 payment_hash: PaymentHash,
236237 source: HTLCSource,
237238 onion_routing_packet: msgs::OnionPacket,
239+ // The extra fee we're skimming off the top of this HTLC.
240+ skimmed_fee_msat: Option<u64>,
238241 },
239242 ClaimHTLC {
240243 payment_preimage: PaymentPreimage,
@@ -5126,6 +5129,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
51265129 cltv_expiry,
51275130 source,
51285131 onion_routing_packet,
5132+ skimmed_fee_msat: None,
51295133 });
51305134 return Ok(None);
51315135 }
@@ -5137,6 +5141,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
51375141 cltv_expiry,
51385142 state: OutboundHTLCState::LocalAnnounced(Box::new(onion_routing_packet.clone())),
51395143 source,
5144+ skimmed_fee_msat: None,
51405145 });
51415146
51425147 let res = msgs::UpdateAddHTLC {
@@ -6611,9 +6616,10 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for Channel<Signer> {
66116616 }
66126617
66136618 let mut preimages: Vec<&Option<PaymentPreimage>> = vec![];
6619+ let mut pending_outbound_skimmed_fees: Vec<Option<u64>> = Vec::new();
66146620
66156621 (self.context.pending_outbound_htlcs.len() as u64).write(writer)?;
6616- for htlc in self . context . pending_outbound_htlcs . iter ( ) {
6622+ for (idx, htlc) in self.context.pending_outbound_htlcs.iter().enumerate () {
66176623 htlc.htlc_id.write(writer)?;
66186624 htlc.amount_msat.write(writer)?;
66196625 htlc.cltv_expiry.write(writer)?;
@@ -6649,18 +6655,37 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for Channel<Signer> {
66496655 reason.write(writer)?;
66506656 }
66516657 }
6658+ if let Some(skimmed_fee) = htlc.skimmed_fee_msat {
6659+ if pending_outbound_skimmed_fees.is_empty() {
6660+ for _ in 0..idx { pending_outbound_skimmed_fees.push(None); }
6661+ }
6662+ pending_outbound_skimmed_fees.push(Some(skimmed_fee));
6663+ } else if !pending_outbound_skimmed_fees.is_empty() {
6664+ pending_outbound_skimmed_fees.push(None);
6665+ }
66526666 }
66536667
6668+ let mut holding_cell_skimmed_fees: Vec<Option<u64>> = Vec::new();
66546669 (self.context.holding_cell_htlc_updates.len() as u64).write(writer)?;
6655- for update in self . context . holding_cell_htlc_updates . iter ( ) {
6670+ for (idx, update) in self.context.holding_cell_htlc_updates.iter().enumerate () {
66566671 match update {
6657- & HTLCUpdateAwaitingACK :: AddHTLC { ref amount_msat, ref cltv_expiry, ref payment_hash, ref source, ref onion_routing_packet } => {
6672+ &HTLCUpdateAwaitingACK::AddHTLC {
6673+ ref amount_msat, ref cltv_expiry, ref payment_hash, ref source, ref onion_routing_packet,
6674+ skimmed_fee_msat,
6675+ } => {
66586676 0u8.write(writer)?;
66596677 amount_msat.write(writer)?;
66606678 cltv_expiry.write(writer)?;
66616679 payment_hash.write(writer)?;
66626680 source.write(writer)?;
66636681 onion_routing_packet.write(writer)?;
6682+
6683+ if let Some(skimmed_fee) = skimmed_fee_msat {
6684+ if holding_cell_skimmed_fees.is_empty() {
6685+ for _ in 0..idx { holding_cell_skimmed_fees.push(None); }
6686+ }
6687+ holding_cell_skimmed_fees.push(Some(skimmed_fee));
6688+ } else if !holding_cell_skimmed_fees.is_empty() { holding_cell_skimmed_fees.push(None); }
66646689 },
66656690 &HTLCUpdateAwaitingACK::ClaimHTLC { ref payment_preimage, ref htlc_id } => {
66666691 1u8.write(writer)?;
@@ -6827,6 +6852,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for Channel<Signer> {
68276852 (29, self.context.temporary_channel_id, option),
68286853 (31, channel_pending_event_emitted, option),
68296854 (33, self.context.pending_monitor_updates, vec_type),
6855+ (35, pending_outbound_skimmed_fees, optional_vec),
6856+ (37, holding_cell_skimmed_fees, optional_vec),
68306857 });
68316858
68326859 Ok(())
@@ -6937,6 +6964,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
69376964 },
69386965 _ => return Err(DecodeError::InvalidValue),
69396966 },
6967+ skimmed_fee_msat: None,
69406968 });
69416969 }
69426970
@@ -6950,6 +6978,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
69506978 payment_hash: Readable::read(reader)?,
69516979 source: Readable::read(reader)?,
69526980 onion_routing_packet: Readable::read(reader)?,
6981+ skimmed_fee_msat: None,
69536982 },
69546983 1 => HTLCUpdateAwaitingACK::ClaimHTLC {
69556984 payment_preimage: Readable::read(reader)?,
@@ -7105,6 +7134,9 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
71057134
71067135 let mut pending_monitor_updates = Some(Vec::new());
71077136
7137+ let mut pending_outbound_skimmed_fees_opt: Option<Vec<Option<u64>>> = None;
7138+ let mut holding_cell_skimmed_fees_opt: Option<Vec<Option<u64>>> = None;
7139+
71087140 read_tlv_fields!(reader, {
71097141 (0, announcement_sigs, option),
71107142 (1, minimum_depth, option),
@@ -7128,6 +7160,8 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
71287160 (29, temporary_channel_id, option),
71297161 (31, channel_pending_event_emitted, option),
71307162 (33, pending_monitor_updates, vec_type),
7163+ (35, pending_outbound_skimmed_fees_opt, optional_vec),
7164+ (37, holding_cell_skimmed_fees_opt, optional_vec),
71317165 });
71327166
71337167 let (channel_keys_id, holder_signer) = if let Some(channel_keys_id) = channel_keys_id {
@@ -7182,6 +7216,25 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
71827216
71837217 let holder_max_accepted_htlcs = holder_max_accepted_htlcs.unwrap_or(DEFAULT_MAX_HTLCS);
71847218
7219+ if let Some(skimmed_fees) = pending_outbound_skimmed_fees_opt {
7220+ let mut iter = skimmed_fees.into_iter();
7221+ for htlc in pending_outbound_htlcs.iter_mut() {
7222+ htlc.skimmed_fee_msat = iter.next().ok_or(DecodeError::InvalidValue)?;
7223+ }
7224+ // We expect all skimmed fees to be consumed above
7225+ if iter.next().is_some() { return Err(DecodeError::InvalidValue) }
7226+ }
7227+ if let Some(skimmed_fees) = holding_cell_skimmed_fees_opt {
7228+ let mut iter = skimmed_fees.into_iter();
7229+ for htlc in holding_cell_htlc_updates.iter_mut() {
7230+ if let HTLCUpdateAwaitingACK::AddHTLC { ref mut skimmed_fee_msat, .. } = htlc {
7231+ *skimmed_fee_msat = iter.next().ok_or(DecodeError::InvalidValue)?;
7232+ }
7233+ }
7234+ // We expect all skimmed fees to be consumed above
7235+ if iter.next().is_some() { return Err(DecodeError::InvalidValue) }
7236+ }
7237+
71857238 Ok(Channel {
71867239 context: ChannelContext {
71877240 user_id,
@@ -7524,7 +7577,8 @@ mod tests {
75247577 session_priv: SecretKey::from_slice(&hex::decode("0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").unwrap()[..]).unwrap(),
75257578 first_hop_htlc_msat: 548,
75267579 payment_id: PaymentId([42; 32]),
7527- }
7580+ },
7581+ skimmed_fee_msat: None,
75287582 });
75297583
75307584 // Make sure when Node A calculates their local commitment transaction, none of the HTLCs pass
@@ -8081,6 +8135,7 @@ mod tests {
80818135 payment_hash: PaymentHash([0; 32]),
80828136 state: OutboundHTLCState::Committed,
80838137 source: HTLCSource::dummy(),
8138+ skimmed_fee_msat: None,
80848139 };
80858140 out.payment_hash.0 = Sha256::hash(&hex::decode("0202020202020202020202020202020202020202020202020202020202020202").unwrap()).into_inner();
80868141 out
@@ -8093,6 +8148,7 @@ mod tests {
80938148 payment_hash: PaymentHash([0; 32]),
80948149 state: OutboundHTLCState::Committed,
80958150 source: HTLCSource::dummy(),
8151+ skimmed_fee_msat: None,
80968152 };
80978153 out.payment_hash.0 = Sha256::hash(&hex::decode("0303030303030303030303030303030303030303030303030303030303030303").unwrap()).into_inner();
80988154 out
@@ -8494,6 +8550,7 @@ mod tests {
84948550 payment_hash: PaymentHash([0; 32]),
84958551 state: OutboundHTLCState::Committed,
84968552 source: HTLCSource::dummy(),
8553+ skimmed_fee_msat: None,
84978554 };
84988555 out.payment_hash.0 = Sha256::hash(&hex::decode("0505050505050505050505050505050505050505050505050505050505050505").unwrap()).into_inner();
84998556 out
@@ -8506,6 +8563,7 @@ mod tests {
85068563 payment_hash: PaymentHash([0; 32]),
85078564 state: OutboundHTLCState::Committed,
85088565 source: HTLCSource::dummy(),
8566+ skimmed_fee_msat: None,
85098567 };
85108568 out.payment_hash.0 = Sha256::hash(&hex::decode("0505050505050505050505050505050505050505050505050505050505050505").unwrap()).into_inner();
85118569 out
0 commit comments