Skip to content

Commit 742f5e5

Browse files
Merge pull request #1419 from atalw/2022-03-paymentforwarded-event
Expose more info in `PaymentForwarded` event
2 parents e0b9b74 + e53c5bd commit 742f5e5

8 files changed

+57
-23
lines changed

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,7 +1102,7 @@ fn test_monitor_update_fail_reestablish() {
11021102
assert!(updates.update_fee.is_none());
11031103
assert_eq!(updates.update_fulfill_htlcs.len(), 1);
11041104
nodes[1].node.handle_update_fulfill_htlc(&nodes[2].node.get_our_node_id(), &updates.update_fulfill_htlcs[0]);
1105-
expect_payment_forwarded!(nodes[1], Some(1000), false);
1105+
expect_payment_forwarded!(nodes[1], nodes[0], Some(1000), false);
11061106
check_added_monitors!(nodes[1], 1);
11071107
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
11081108
commitment_signed_dance!(nodes[1], nodes[2], updates.commitment_signed, false);
@@ -2087,7 +2087,7 @@ fn test_fail_htlc_on_broadcast_after_claim() {
20872087
nodes[1].node.handle_update_fulfill_htlc(&nodes[2].node.get_our_node_id(), &cs_updates.update_fulfill_htlcs[0]);
20882088
let bs_updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
20892089
check_added_monitors!(nodes[1], 1);
2090-
expect_payment_forwarded!(nodes[1], Some(1000), false);
2090+
expect_payment_forwarded!(nodes[1], nodes[0], Some(1000), false);
20912091

20922092
mine_transaction(&nodes[1], &bs_txn[0]);
20932093
check_closed_event!(nodes[1], 1, ClosureReason::CommitmentTxConfirmed);
@@ -2423,7 +2423,7 @@ fn do_test_reconnect_dup_htlc_claims(htlc_status: HTLCStatusAtDupClaim, second_f
24232423
let mut nodes = create_network(3, &node_cfgs, &node_chanmgrs);
24242424

24252425
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
2426-
let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known()).2;
2426+
let chan_id_2 = create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known()).2;
24272427

24282428
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 100_000);
24292429

@@ -2450,7 +2450,7 @@ fn do_test_reconnect_dup_htlc_claims(htlc_status: HTLCStatusAtDupClaim, second_f
24502450
}
24512451

24522452
let fulfill_msg = msgs::UpdateFulfillHTLC {
2453-
channel_id: chan_2,
2453+
channel_id: chan_id_2,
24542454
htlc_id: 0,
24552455
payment_preimage,
24562456
};
@@ -2468,7 +2468,7 @@ fn do_test_reconnect_dup_htlc_claims(htlc_status: HTLCStatusAtDupClaim, second_f
24682468
assert_eq!(fulfill_msg, cs_updates.update_fulfill_htlcs[0]);
24692469
}
24702470
nodes[1].node.handle_update_fulfill_htlc(&nodes[2].node.get_our_node_id(), &fulfill_msg);
2471-
expect_payment_forwarded!(nodes[1], Some(1000), false);
2471+
expect_payment_forwarded!(nodes[1], nodes[0], Some(1000), false);
24722472
check_added_monitors!(nodes[1], 1);
24732473

24742474
let mut bs_updates = None;

lightning/src/ln/channelmanager.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4022,7 +4022,10 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
40224022
} else { None };
40234023

40244024
let mut pending_events = self.pending_events.lock().unwrap();
4025+
4026+
let source_channel_id = Some(prev_outpoint.to_channel_id());
40254027
pending_events.push(events::Event::PaymentForwarded {
4028+
source_channel_id,
40264029
fee_earned_msat,
40274030
claim_from_onchain_tx: from_onchain,
40284031
});

lightning/src/ln/functional_test_utils.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,12 +1327,16 @@ macro_rules! expect_payment_path_successful {
13271327
}
13281328

13291329
macro_rules! expect_payment_forwarded {
1330-
($node: expr, $expected_fee: expr, $upstream_force_closed: expr) => {
1330+
($node: expr, $source_node: expr, $expected_fee: expr, $upstream_force_closed: expr) => {
13311331
let events = $node.node.get_and_clear_pending_events();
13321332
assert_eq!(events.len(), 1);
13331333
match events[0] {
1334-
Event::PaymentForwarded { fee_earned_msat, claim_from_onchain_tx } => {
1334+
Event::PaymentForwarded { fee_earned_msat, source_channel_id, claim_from_onchain_tx } => {
13351335
assert_eq!(fee_earned_msat, $expected_fee);
1336+
if fee_earned_msat.is_some() {
1337+
// Is the event channel_id in one of the channels between the two nodes?
1338+
assert!($node.node.list_channels().iter().any(|x| x.counterparty.node_id == $source_node.node.get_our_node_id() && x.channel_id == source_channel_id.unwrap()));
1339+
}
13361340
assert_eq!(claim_from_onchain_tx, $upstream_force_closed);
13371341
},
13381342
_ => panic!("Unexpected event"),
@@ -1571,11 +1575,11 @@ pub fn do_claim_payment_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>,
15711575
}
15721576
}
15731577
macro_rules! mid_update_fulfill_dance {
1574-
($node: expr, $prev_node: expr, $new_msgs: expr) => {
1578+
($node: expr, $prev_node: expr, $next_node: expr, $new_msgs: expr) => {
15751579
{
15761580
$node.node.handle_update_fulfill_htlc(&$prev_node.node.get_our_node_id(), &next_msgs.as_ref().unwrap().0);
15771581
let fee = $node.node.channel_state.lock().unwrap().by_id.get(&next_msgs.as_ref().unwrap().0.channel_id).unwrap().config.forwarding_fee_base_msat;
1578-
expect_payment_forwarded!($node, Some(fee as u64), false);
1582+
expect_payment_forwarded!($node, $next_node, Some(fee as u64), false);
15791583
expected_total_fee_msat += fee as u64;
15801584
check_added_monitors!($node, 1);
15811585
let new_next_msgs = if $new_msgs {
@@ -1599,7 +1603,14 @@ pub fn do_claim_payment_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>,
15991603
assert_eq!(expected_next_node, node.node.get_our_node_id());
16001604
let update_next_msgs = !skip_last || idx != expected_route.len() - 1;
16011605
if next_msgs.is_some() {
1602-
mid_update_fulfill_dance!(node, prev_node, update_next_msgs);
1606+
// Since we are traversing in reverse, next_node is actually the previous node
1607+
let next_node: &Node;
1608+
if idx == expected_route.len() - 1 {
1609+
next_node = origin_node;
1610+
} else {
1611+
next_node = expected_route[expected_route.len() - 1 - idx - 1];
1612+
}
1613+
mid_update_fulfill_dance!(node, prev_node, next_node, update_next_msgs);
16031614
} else {
16041615
assert!(!update_next_msgs);
16051616
assert!(node.node.get_and_clear_pending_msg_events().is_empty());

lightning/src/ln/functional_tests.rs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2684,10 +2684,23 @@ fn test_htlc_on_chain_success() {
26842684
Event::ChannelClosed { reason: ClosureReason::CommitmentTxConfirmed, .. } => {}
26852685
_ => panic!("Unexpected event"),
26862686
}
2687-
if let Event::PaymentForwarded { fee_earned_msat: Some(1000), claim_from_onchain_tx: true } = forwarded_events[1] {
2688-
} else { panic!(); }
2689-
if let Event::PaymentForwarded { fee_earned_msat: Some(1000), claim_from_onchain_tx: true } = forwarded_events[2] {
2690-
} else { panic!(); }
2687+
let chan_id = Some(chan_1.2);
2688+
match forwarded_events[1] {
2689+
Event::PaymentForwarded { fee_earned_msat, source_channel_id, claim_from_onchain_tx } => {
2690+
assert_eq!(fee_earned_msat, Some(1000));
2691+
assert_eq!(source_channel_id, chan_id);
2692+
assert_eq!(claim_from_onchain_tx, true);
2693+
},
2694+
_ => panic!()
2695+
}
2696+
match forwarded_events[2] {
2697+
Event::PaymentForwarded { fee_earned_msat, source_channel_id, claim_from_onchain_tx } => {
2698+
assert_eq!(fee_earned_msat, Some(1000));
2699+
assert_eq!(source_channel_id, chan_id);
2700+
assert_eq!(claim_from_onchain_tx, true);
2701+
},
2702+
_ => panic!()
2703+
}
26912704
let events = nodes[1].node.get_and_clear_pending_msg_events();
26922705
{
26932706
let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
@@ -5104,8 +5117,9 @@ fn test_onchain_to_onchain_claim() {
51045117
_ => panic!("Unexpected event"),
51055118
}
51065119
match events[1] {
5107-
Event::PaymentForwarded { fee_earned_msat, claim_from_onchain_tx } => {
5120+
Event::PaymentForwarded { fee_earned_msat, source_channel_id, claim_from_onchain_tx } => {
51085121
assert_eq!(fee_earned_msat, Some(1000));
5122+
assert_eq!(source_channel_id, Some(chan_1.2));
51095123
assert_eq!(claim_from_onchain_tx, true);
51105124
},
51115125
_ => panic!("Unexpected event"),
@@ -5273,7 +5287,7 @@ fn test_duplicate_payment_hash_one_failure_one_success() {
52735287
// Note that the fee paid is effectively double as the HTLC value (including the nodes[1] fee
52745288
// and nodes[2] fee) is rounded down and then claimed in full.
52755289
mine_transaction(&nodes[1], &htlc_success_txn[0]);
5276-
expect_payment_forwarded!(nodes[1], Some(196*2), true);
5290+
expect_payment_forwarded!(nodes[1], nodes[0], Some(196*2), true);
52775291
let updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
52785292
assert!(updates.update_add_htlcs.is_empty());
52795293
assert!(updates.update_fail_htlcs.is_empty());
@@ -8855,7 +8869,7 @@ fn do_test_onchain_htlc_settlement_after_close(broadcast_alice: bool, go_onchain
88558869
assert_eq!(carol_updates.update_fulfill_htlcs.len(), 1);
88568870

88578871
nodes[1].node.handle_update_fulfill_htlc(&nodes[2].node.get_our_node_id(), &carol_updates.update_fulfill_htlcs[0]);
8858-
expect_payment_forwarded!(nodes[1], if go_onchain_before_fulfill || force_closing_node == 1 { None } else { Some(1000) }, false);
8872+
expect_payment_forwarded!(nodes[1], nodes[0], if go_onchain_before_fulfill || force_closing_node == 1 { None } else { Some(1000) }, false);
88598873
// If Alice broadcasted but Bob doesn't know yet, here he prepares to tell her about the preimage.
88608874
if !go_onchain_before_fulfill && broadcast_alice {
88618875
let events = nodes[1].node.get_and_clear_pending_msg_events();

lightning/src/ln/payment_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -495,7 +495,7 @@ fn do_retry_with_no_persist(confirm_before_reload: bool) {
495495
let bs_htlc_claim_txn = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0);
496496
assert_eq!(bs_htlc_claim_txn.len(), 1);
497497
check_spends!(bs_htlc_claim_txn[0], as_commitment_tx);
498-
expect_payment_forwarded!(nodes[1], None, false);
498+
expect_payment_forwarded!(nodes[1], nodes[0], None, false);
499499

500500
if !confirm_before_reload {
501501
mine_transaction(&nodes[0], &as_commitment_tx);

lightning/src/ln/reorg_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ fn do_test_onchain_htlc_reorg(local_commitment: bool, claim: bool) {
138138
// ChannelManager only polls chain::Watch::release_pending_monitor_events when we
139139
// probe it for events, so we probe non-message events here (which should just be the
140140
// PaymentForwarded event).
141-
expect_payment_forwarded!(nodes[1], Some(1000), true);
141+
expect_payment_forwarded!(nodes[1], nodes[0], Some(1000), true);
142142
} else {
143143
// Confirm the timeout tx and check that we fail the HTLC backwards
144144
let block = Block {

lightning/src/ln/shutdown_tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ fn updates_shutdown_wait() {
110110
assert!(updates.update_fee.is_none());
111111
assert_eq!(updates.update_fulfill_htlcs.len(), 1);
112112
nodes[1].node.handle_update_fulfill_htlc(&nodes[2].node.get_our_node_id(), &updates.update_fulfill_htlcs[0]);
113-
expect_payment_forwarded!(nodes[1], Some(1000), false);
113+
expect_payment_forwarded!(nodes[1], nodes[0], Some(1000), false);
114114
check_added_monitors!(nodes[1], 1);
115115
let updates_2 = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
116116
commitment_signed_dance!(nodes[1], nodes[2], updates.commitment_signed, false);
@@ -279,7 +279,7 @@ fn do_test_shutdown_rebroadcast(recv_count: u8) {
279279
assert!(updates.update_fee.is_none());
280280
assert_eq!(updates.update_fulfill_htlcs.len(), 1);
281281
nodes[1].node.handle_update_fulfill_htlc(&nodes[2].node.get_our_node_id(), &updates.update_fulfill_htlcs[0]);
282-
expect_payment_forwarded!(nodes[1], Some(1000), false);
282+
expect_payment_forwarded!(nodes[1], nodes[0], Some(1000), false);
283283
check_added_monitors!(nodes[1], 1);
284284
let updates_2 = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
285285
commitment_signed_dance!(nodes[1], nodes[2], updates.commitment_signed, false);

lightning/src/util/events.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,9 @@ pub enum Event {
343343
/// This event is generated when a payment has been successfully forwarded through us and a
344344
/// forwarding fee earned.
345345
PaymentForwarded {
346+
/// The channel between the source node and us. Optional because versions prior to 0.0.107
347+
/// do not serialize this field.
348+
source_channel_id: Option<[u8; 32]>,
346349
/// The fee, in milli-satoshis, which was earned as a result of the payment.
347350
///
348351
/// Note that if we force-closed the channel over which we forwarded an HTLC while the HTLC
@@ -520,10 +523,11 @@ impl Writeable for Event {
520523
(0, VecWriteWrapper(outputs), required),
521524
});
522525
},
523-
&Event::PaymentForwarded { fee_earned_msat, claim_from_onchain_tx } => {
526+
&Event::PaymentForwarded { fee_earned_msat, source_channel_id, claim_from_onchain_tx } => {
524527
7u8.write(writer)?;
525528
write_tlv_fields!(writer, {
526529
(0, fee_earned_msat, option),
530+
(1, source_channel_id, option),
527531
(2, claim_from_onchain_tx, required),
528532
});
529533
},
@@ -684,12 +688,14 @@ impl MaybeReadable for Event {
684688
7u8 => {
685689
let f = || {
686690
let mut fee_earned_msat = None;
691+
let mut source_channel_id = None;
687692
let mut claim_from_onchain_tx = false;
688693
read_tlv_fields!(reader, {
689694
(0, fee_earned_msat, option),
695+
(1, source_channel_id, option),
690696
(2, claim_from_onchain_tx, required),
691697
});
692-
Ok(Some(Event::PaymentForwarded { fee_earned_msat, claim_from_onchain_tx }))
698+
Ok(Some(Event::PaymentForwarded { fee_earned_msat, source_channel_id, claim_from_onchain_tx }))
693699
};
694700
f()
695701
},

0 commit comments

Comments
 (0)