|
17 | 17 | use crate::chain::keysinterface::SpendableOutputDescriptor;
|
18 | 18 | #[cfg(anchors)]
|
19 | 19 | use crate::ln::chan_utils::HTLCOutputInCommitment;
|
20 |
| -use crate::ln::channelmanager::PaymentId; |
| 20 | +use crate::ln::channelmanager::{InterceptId, PaymentId}; |
21 | 21 | use crate::ln::channel::FUNDING_CONF_DEADLINE_BLOCKS;
|
22 | 22 | use crate::ln::features::ChannelTypeFeatures;
|
23 | 23 | use crate::ln::msgs;
|
@@ -288,6 +288,18 @@ pub enum BumpTransactionEvent {
|
288 | 288 | },
|
289 | 289 | }
|
290 | 290 |
|
| 291 | +/// Will be used in [`Event::HTLCIntercepted`] to identify the next hop in the HTLC's path. |
| 292 | +/// Currently only used in serialization for the sake of maintaining compatibility. More variants |
| 293 | +/// will be added for general-purpose HTLC forward intercepts as well as trampoline forward |
| 294 | +/// intercepts in upcoming work. |
| 295 | +enum InterceptNextHop { |
| 296 | + FakeScid(u64), |
| 297 | +} |
| 298 | + |
| 299 | +impl_writeable_tlv_based_enum!(InterceptNextHop, ; |
| 300 | + (0, FakeScid) |
| 301 | +); |
| 302 | + |
291 | 303 | /// An Event which you should probably take some action in response to.
|
292 | 304 | ///
|
293 | 305 | /// Note that while Writeable and Readable are implemented for Event, you probably shouldn't use
|
@@ -566,6 +578,20 @@ pub enum Event {
|
566 | 578 | /// now + 5*time_forwardable).
|
567 | 579 | time_forwardable: Duration,
|
568 | 580 | },
|
| 581 | + /// Used to indicate that we've intercepted an HTLC forward. |
| 582 | + HTLCIntercepted { |
| 583 | + /// The fake scid that was programmed as the next hop's scid. |
| 584 | + requested_next_hop_scid: u64, |
| 585 | + /// The payment hash used for this HTLC. |
| 586 | + payment_hash: PaymentHash, |
| 587 | + /// How many msats are to be received on the inbound edge of this HTLC. |
| 588 | + inbound_amount_msat: u64, |
| 589 | + /// How many msats the payer intended to route to the next node. Depending on the reason you are |
| 590 | + /// intercepting this payment, you might take a fee by forwarding less than this amount. |
| 591 | + expected_outbound_amount_msat: u64, |
| 592 | + /// A id to help LDK identify which HTLC is being forwarded or failed. |
| 593 | + intercept_id: InterceptId |
| 594 | + }, |
569 | 595 | /// Used to indicate that an output which you should know how to spend was confirmed on chain
|
570 | 596 | /// and is now spendable.
|
571 | 597 | /// Such an output will *not* ever be spent by rust-lightning, and are not at risk of your
|
@@ -802,6 +828,17 @@ impl Writeable for Event {
|
802 | 828 | (0, WithoutLength(outputs), required),
|
803 | 829 | });
|
804 | 830 | },
|
| 831 | + &Event::HTLCIntercepted { requested_next_hop_scid, payment_hash, inbound_amount_msat, expected_outbound_amount_msat, intercept_id } => { |
| 832 | + 6u8.write(writer)?; |
| 833 | + let intercept_scid = InterceptNextHop::FakeScid(requested_next_hop_scid); |
| 834 | + write_tlv_fields!(writer, { |
| 835 | + (0, intercept_scid, required), |
| 836 | + (2, payment_hash, required), |
| 837 | + (4, inbound_amount_msat, required), |
| 838 | + (6, expected_outbound_amount_msat, required), |
| 839 | + (8, intercept_id, required) |
| 840 | + }); |
| 841 | + } |
805 | 842 | &Event::PaymentForwarded { fee_earned_msat, prev_channel_id, claim_from_onchain_tx, next_channel_id } => {
|
806 | 843 | 7u8.write(writer)?;
|
807 | 844 | write_tlv_fields!(writer, {
|
@@ -1015,6 +1052,30 @@ impl MaybeReadable for Event {
|
1015 | 1052 | };
|
1016 | 1053 | f()
|
1017 | 1054 | },
|
| 1055 | + 6u8 => { |
| 1056 | + let mut payment_hash = PaymentHash([0; 32]); |
| 1057 | + let mut intercept_id = InterceptId([0; 32]); |
| 1058 | + let mut requested_next_hop_scid = InterceptNextHop::FakeScid(0); |
| 1059 | + let mut inbound_amount_msat = 0; |
| 1060 | + let mut expected_outbound_amount_msat = 0; |
| 1061 | + read_tlv_fields!(reader, { |
| 1062 | + (0, requested_next_hop_scid, required), |
| 1063 | + (2, payment_hash, required), |
| 1064 | + (4, inbound_amount_msat, required), |
| 1065 | + (6, expected_outbound_amount_msat, required), |
| 1066 | + (8, intercept_id, required) |
| 1067 | + }); |
| 1068 | + let next_scid = match requested_next_hop_scid { |
| 1069 | + InterceptNextHop::FakeScid(scid) => scid |
| 1070 | + }; |
| 1071 | + Ok(Some(Event::HTLCIntercepted { |
| 1072 | + payment_hash, |
| 1073 | + requested_next_hop_scid: next_scid, |
| 1074 | + inbound_amount_msat, |
| 1075 | + expected_outbound_amount_msat, |
| 1076 | + intercept_id, |
| 1077 | + })) |
| 1078 | + }, |
1018 | 1079 | 7u8 => {
|
1019 | 1080 | let f = || {
|
1020 | 1081 | let mut fee_earned_msat = None;
|
|
0 commit comments