Skip to content

Commit d4a1b0c

Browse files
Persist update_add sender skimmed fee in Channel
1 parent 2aefc75 commit d4a1b0c

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,
@@ -5042,6 +5045,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
50425045
cltv_expiry,
50435046
source,
50445047
onion_routing_packet,
5048+
skimmed_fee_msat: None,
50455049
});
50465050
return Ok(None);
50475051
}
@@ -5053,6 +5057,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
50535057
cltv_expiry,
50545058
state: OutboundHTLCState::LocalAnnounced(Box::new(onion_routing_packet.clone())),
50555059
source,
5060+
skimmed_fee_msat: None,
50565061
});
50575062

50585063
let res = msgs::UpdateAddHTLC {
@@ -6612,9 +6617,10 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for Channel<Signer> {
66126617
}
66136618

66146619
let mut preimages: Vec<&Option<PaymentPreimage>> = vec![];
6620+
let mut pending_outbound_skimmed_fees: Vec<Option<u64>> = Vec::new();
66156621

66166622
(self.context.pending_outbound_htlcs.len() as u64).write(writer)?;
6617-
for htlc in self.context.pending_outbound_htlcs.iter() {
6623+
for (idx, htlc) in self.context.pending_outbound_htlcs.iter().enumerate() {
66186624
htlc.htlc_id.write(writer)?;
66196625
htlc.amount_msat.write(writer)?;
66206626
htlc.cltv_expiry.write(writer)?;
@@ -6650,18 +6656,37 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for Channel<Signer> {
66506656
reason.write(writer)?;
66516657
}
66526658
}
6659+
if let Some(skimmed_fee) = htlc.skimmed_fee_msat {
6660+
if pending_outbound_skimmed_fees.is_empty() {
6661+
for _ in 0..idx { pending_outbound_skimmed_fees.push(None); }
6662+
}
6663+
pending_outbound_skimmed_fees.push(Some(skimmed_fee));
6664+
} else if !pending_outbound_skimmed_fees.is_empty() {
6665+
pending_outbound_skimmed_fees.push(None);
6666+
}
66536667
}
66546668

6669+
let mut holding_cell_skimmed_fees: Vec<Option<u64>> = Vec::new();
66556670
(self.context.holding_cell_htlc_updates.len() as u64).write(writer)?;
6656-
for update in self.context.holding_cell_htlc_updates.iter() {
6671+
for (idx, update) in self.context.holding_cell_htlc_updates.iter().enumerate() {
66576672
match update {
6658-
&HTLCUpdateAwaitingACK::AddHTLC { ref amount_msat, ref cltv_expiry, ref payment_hash, ref source, ref onion_routing_packet } => {
6673+
&HTLCUpdateAwaitingACK::AddHTLC {
6674+
ref amount_msat, ref cltv_expiry, ref payment_hash, ref source, ref onion_routing_packet,
6675+
skimmed_fee_msat,
6676+
} => {
66596677
0u8.write(writer)?;
66606678
amount_msat.write(writer)?;
66616679
cltv_expiry.write(writer)?;
66626680
payment_hash.write(writer)?;
66636681
source.write(writer)?;
66646682
onion_routing_packet.write(writer)?;
6683+
6684+
if let Some(skimmed_fee) = skimmed_fee_msat {
6685+
if holding_cell_skimmed_fees.is_empty() {
6686+
for _ in 0..idx { holding_cell_skimmed_fees.push(None); }
6687+
}
6688+
holding_cell_skimmed_fees.push(Some(skimmed_fee));
6689+
} else if !holding_cell_skimmed_fees.is_empty() { holding_cell_skimmed_fees.push(None); }
66656690
},
66666691
&HTLCUpdateAwaitingACK::ClaimHTLC { ref payment_preimage, ref htlc_id } => {
66676692
1u8.write(writer)?;
@@ -6828,6 +6853,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for Channel<Signer> {
68286853
(29, self.context.temporary_channel_id, option),
68296854
(31, channel_pending_event_emitted, option),
68306855
(33, self.context.pending_monitor_updates, vec_type),
6856+
(35, pending_outbound_skimmed_fees, optional_vec),
6857+
(37, holding_cell_skimmed_fees, optional_vec),
68316858
});
68326859

68336860
Ok(())
@@ -6938,6 +6965,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
69386965
},
69396966
_ => return Err(DecodeError::InvalidValue),
69406967
},
6968+
skimmed_fee_msat: None,
69416969
});
69426970
}
69436971

@@ -6951,6 +6979,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
69516979
payment_hash: Readable::read(reader)?,
69526980
source: Readable::read(reader)?,
69536981
onion_routing_packet: Readable::read(reader)?,
6982+
skimmed_fee_msat: None,
69546983
},
69556984
1 => HTLCUpdateAwaitingACK::ClaimHTLC {
69566985
payment_preimage: Readable::read(reader)?,
@@ -7106,6 +7135,9 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
71067135

71077136
let mut pending_monitor_updates = Some(Vec::new());
71087137

7138+
let mut pending_outbound_skimmed_fees_opt: Option<Vec<Option<u64>>> = None;
7139+
let mut holding_cell_skimmed_fees_opt: Option<Vec<Option<u64>>> = None;
7140+
71097141
read_tlv_fields!(reader, {
71107142
(0, announcement_sigs, option),
71117143
(1, minimum_depth, option),
@@ -7129,6 +7161,8 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
71297161
(29, temporary_channel_id, option),
71307162
(31, channel_pending_event_emitted, option),
71317163
(33, pending_monitor_updates, vec_type),
7164+
(35, pending_outbound_skimmed_fees_opt, optional_vec),
7165+
(37, holding_cell_skimmed_fees_opt, optional_vec),
71327166
});
71337167

71347168
let (channel_keys_id, holder_signer) = if let Some(channel_keys_id) = channel_keys_id {
@@ -7183,6 +7217,25 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
71837217

71847218
let holder_max_accepted_htlcs = holder_max_accepted_htlcs.unwrap_or(DEFAULT_MAX_HTLCS);
71857219

7220+
if let Some(skimmed_fees) = pending_outbound_skimmed_fees_opt {
7221+
let mut iter = skimmed_fees.into_iter();
7222+
for htlc in pending_outbound_htlcs.iter_mut() {
7223+
htlc.skimmed_fee_msat = iter.next().ok_or(DecodeError::InvalidValue)?;
7224+
}
7225+
// We expect all skimmed fees to be consumed above
7226+
if iter.next().is_some() { return Err(DecodeError::InvalidValue) }
7227+
}
7228+
if let Some(skimmed_fees) = holding_cell_skimmed_fees_opt {
7229+
let mut iter = skimmed_fees.into_iter();
7230+
for htlc in holding_cell_htlc_updates.iter_mut() {
7231+
if let HTLCUpdateAwaitingACK::AddHTLC { ref mut skimmed_fee_msat, .. } = htlc {
7232+
*skimmed_fee_msat = iter.next().ok_or(DecodeError::InvalidValue)?;
7233+
}
7234+
}
7235+
// We expect all skimmed fees to be consumed above
7236+
if iter.next().is_some() { return Err(DecodeError::InvalidValue) }
7237+
}
7238+
71867239
Ok(Channel {
71877240
context: ChannelContext {
71887241
user_id,
@@ -7525,7 +7578,8 @@ mod tests {
75257578
session_priv: SecretKey::from_slice(&hex::decode("0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").unwrap()[..]).unwrap(),
75267579
first_hop_htlc_msat: 548,
75277580
payment_id: PaymentId([42; 32]),
7528-
}
7581+
},
7582+
skimmed_fee_msat: None,
75297583
});
75307584

75317585
// Make sure when Node A calculates their local commitment transaction, none of the HTLCs pass
@@ -8082,6 +8136,7 @@ mod tests {
80828136
payment_hash: PaymentHash([0; 32]),
80838137
state: OutboundHTLCState::Committed,
80848138
source: HTLCSource::dummy(),
8139+
skimmed_fee_msat: None,
80858140
};
80868141
out.payment_hash.0 = Sha256::hash(&hex::decode("0202020202020202020202020202020202020202020202020202020202020202").unwrap()).into_inner();
80878142
out
@@ -8094,6 +8149,7 @@ mod tests {
80948149
payment_hash: PaymentHash([0; 32]),
80958150
state: OutboundHTLCState::Committed,
80968151
source: HTLCSource::dummy(),
8152+
skimmed_fee_msat: None,
80978153
};
80988154
out.payment_hash.0 = Sha256::hash(&hex::decode("0303030303030303030303030303030303030303030303030303030303030303").unwrap()).into_inner();
80998155
out
@@ -8495,6 +8551,7 @@ mod tests {
84958551
payment_hash: PaymentHash([0; 32]),
84968552
state: OutboundHTLCState::Committed,
84978553
source: HTLCSource::dummy(),
8554+
skimmed_fee_msat: None,
84988555
};
84998556
out.payment_hash.0 = Sha256::hash(&hex::decode("0505050505050505050505050505050505050505050505050505050505050505").unwrap()).into_inner();
85008557
out
@@ -8507,6 +8564,7 @@ mod tests {
85078564
payment_hash: PaymentHash([0; 32]),
85088565
state: OutboundHTLCState::Committed,
85098566
source: HTLCSource::dummy(),
8567+
skimmed_fee_msat: None,
85108568
};
85118569
out.payment_hash.0 = Sha256::hash(&hex::decode("0505050505050505050505050505050505050505050505050505050505050505").unwrap()).into_inner();
85128570
out

0 commit comments

Comments
 (0)