@@ -155,6 +155,11 @@ pub enum PendingHTLCRouting {
155
155
/// [`Event::PaymentClaimable::onion_fields`] as
156
156
/// [`RecipientOnionFields::payment_metadata`].
157
157
payment_metadata: Option<Vec<u8>>,
158
+ /// The context of the payment included by the recipient in a blinded path, or `None` if a
159
+ /// blinded path was not used.
160
+ ///
161
+ /// Used in part to determine the [`events::PaymentPurpose`].
162
+ payment_context: Option<PaymentContext>,
158
163
/// CLTV expiry of the received HTLC.
159
164
///
160
165
/// Used to track when we should expire pending HTLCs that go unclaimed.
@@ -352,6 +357,11 @@ enum OnionPayload {
352
357
/// This is only here for backwards-compatibility in serialization, in the future it can be
353
358
/// removed, breaking clients running 0.0.106 and earlier.
354
359
_legacy_hop_data: Option<msgs::FinalOnionHopData>,
360
+ /// The context of the payment included by the recipient in a blinded path, or `None` if a
361
+ /// blinded path was not used.
362
+ ///
363
+ /// Used in part to determine the [`events::PaymentPurpose`].
364
+ payment_context: Option<PaymentContext>,
355
365
},
356
366
/// Contains the payer-provided preimage.
357
367
Spontaneous(PaymentPreimage),
@@ -5336,13 +5346,14 @@ where
5336
5346
let blinded_failure = routing.blinded_failure();
5337
5347
let (cltv_expiry, onion_payload, payment_data, phantom_shared_secret, mut onion_fields) = match routing {
5338
5348
PendingHTLCRouting::Receive {
5339
- payment_data, payment_metadata, incoming_cltv_expiry, phantom_shared_secret,
5340
- custom_tlvs, requires_blinded_error: _
5349
+ payment_data, payment_metadata, payment_context,
5350
+ incoming_cltv_expiry, phantom_shared_secret, custom_tlvs,
5351
+ requires_blinded_error: _
5341
5352
} => {
5342
5353
let _legacy_hop_data = Some(payment_data.clone());
5343
5354
let onion_fields = RecipientOnionFields { payment_secret: Some(payment_data.payment_secret),
5344
5355
payment_metadata, custom_tlvs };
5345
- (incoming_cltv_expiry, OnionPayload::Invoice { _legacy_hop_data },
5356
+ (incoming_cltv_expiry, OnionPayload::Invoice { _legacy_hop_data, payment_context },
5346
5357
Some(payment_data), phantom_shared_secret, onion_fields)
5347
5358
},
5348
5359
PendingHTLCRouting::ReceiveKeysend {
@@ -10677,6 +10688,7 @@ impl_writeable_tlv_based_enum!(PendingHTLCRouting,
10677
10688
(3, payment_metadata, option),
10678
10689
(5, custom_tlvs, optional_vec),
10679
10690
(7, requires_blinded_error, (default_value, false)),
10691
+ (9, payment_context, option),
10680
10692
},
10681
10693
(2, ReceiveKeysend) => {
10682
10694
(0, payment_preimage, required),
@@ -10791,9 +10803,11 @@ impl_writeable_tlv_based!(HTLCPreviousHopData, {
10791
10803
10792
10804
impl Writeable for ClaimableHTLC {
10793
10805
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
10794
- let (payment_data, keysend_preimage) = match &self.onion_payload {
10795
- OnionPayload::Invoice { _legacy_hop_data } => (_legacy_hop_data.as_ref(), None),
10796
- OnionPayload::Spontaneous(preimage) => (None, Some(preimage)),
10806
+ let (payment_data, keysend_preimage, payment_context) = match &self.onion_payload {
10807
+ OnionPayload::Invoice { _legacy_hop_data, payment_context } => {
10808
+ (_legacy_hop_data.as_ref(), None, payment_context.as_ref())
10809
+ },
10810
+ OnionPayload::Spontaneous(preimage) => (None, Some(preimage), None),
10797
10811
};
10798
10812
write_tlv_fields!(writer, {
10799
10813
(0, self.prev_hop, required),
@@ -10805,6 +10819,7 @@ impl Writeable for ClaimableHTLC {
10805
10819
(6, self.cltv_expiry, required),
10806
10820
(8, keysend_preimage, option),
10807
10821
(10, self.counterparty_skimmed_fee_msat, option),
10822
+ (11, payment_context, option),
10808
10823
});
10809
10824
Ok(())
10810
10825
}
@@ -10822,6 +10837,7 @@ impl Readable for ClaimableHTLC {
10822
10837
(6, cltv_expiry, required),
10823
10838
(8, keysend_preimage, option),
10824
10839
(10, counterparty_skimmed_fee_msat, option),
10840
+ (11, payment_context, option),
10825
10841
});
10826
10842
let payment_data: Option<msgs::FinalOnionHopData> = payment_data_opt;
10827
10843
let value = value_ser.0.unwrap();
@@ -10842,7 +10858,7 @@ impl Readable for ClaimableHTLC {
10842
10858
}
10843
10859
total_msat = Some(payment_data.as_ref().unwrap().total_msat);
10844
10860
}
10845
- OnionPayload::Invoice { _legacy_hop_data: payment_data }
10861
+ OnionPayload::Invoice { _legacy_hop_data: payment_data, payment_context }
10846
10862
},
10847
10863
};
10848
10864
Ok(Self {
@@ -12079,7 +12095,7 @@ where
12079
12095
return Err(DecodeError::InvalidValue);
12080
12096
}
12081
12097
let purpose = match &htlcs[0].onion_payload {
12082
- OnionPayload::Invoice { _legacy_hop_data } => {
12098
+ OnionPayload::Invoice { _legacy_hop_data, payment_context: _ } => {
12083
12099
if let Some(hop_data) = _legacy_hop_data {
12084
12100
events::PaymentPurpose::InvoicePayment {
12085
12101
payment_preimage: match pending_inbound_payments.get(&payment_hash) {
0 commit comments