Skip to content

Commit 6f5ffdc

Browse files
Persist update_add sender skimmed fee in Channel
1 parent ad9bdf4 commit 6f5ffdc

File tree

1 file changed

+62
-4
lines changed

1 file changed

+62
-4
lines changed

lightning/src/ln/channel.rs

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)