From: valentinewallace Date: Wed, 20 Mar 2024 14:27:16 +0000 (-0400) Subject: Merge pull request #2924 from tnull/2024-03-add-user-channel-id-to-payment-forwarded X-Git-Tag: v0.0.123-beta~35 X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=commitdiff_plain;h=a36b529752778f519b27e62582d1b2a758ce48d6;p=rust-lightning Merge pull request #2924 from tnull/2024-03-add-user-channel-id-to-payment-forwarded Expose `{prev,next}_user_channel_id` fields in `PaymentForwarded` --- a36b529752778f519b27e62582d1b2a758ce48d6 diff --cc lightning/src/ln/functional_test_utils.rs index cb310ec95,0c8909b56..5840fead9 --- a/lightning/src/ln/functional_test_utils.rs +++ b/lightning/src/ln/functional_test_utils.rs @@@ -2227,22 -2226,14 +2227,22 @@@ macro_rules! expect_payment_path_succes pub fn expect_payment_forwarded>( event: Event, node: &H, prev_node: &H, next_node: &H, expected_fee: Option, expected_extra_fees_msat: Option, upstream_force_closed: bool, - downstream_force_closed: bool -) { + downstream_force_closed: bool, allow_1_msat_fee_overpay: bool, +) -> Option { match event { Event::PaymentForwarded { - total_fee_earned_msat, prev_channel_id, claim_from_onchain_tx, next_channel_id, - outbound_amount_forwarded_msat: _, skimmed_fee_msat + prev_channel_id, next_channel_id, prev_user_channel_id, next_user_channel_id, + total_fee_earned_msat, skimmed_fee_msat, claim_from_onchain_tx, .. } => { - assert_eq!(total_fee_earned_msat, expected_fee); + if allow_1_msat_fee_overpay { + // Aggregating fees for blinded paths may result in a rounding error, causing slight + // overpayment in fees. + let actual_fee = total_fee_earned_msat.unwrap(); + let expected_fee = expected_fee.unwrap(); + assert!(actual_fee == expected_fee || actual_fee == expected_fee + 1); + } else { + assert_eq!(total_fee_earned_msat, expected_fee); + } // Check that the (knowingly) withheld amount is always less or equal to the expected // overpaid amount. @@@ -2254,10 -2249,24 +2258,25 @@@ // We check for force closures since a force closed channel is removed from the // node's channel list if !downstream_force_closed { - assert!(node.node().list_channels().iter().any(|x| x.counterparty.node_id == next_node.node().get_our_node_id() && x.channel_id == next_channel_id.unwrap())); + // As documented, `next_user_channel_id` will only be `Some` if we didn't settle via an + // onchain transaction, just as the `total_fee_earned_msat` field. Rather than + // introducing yet another variable, we use the latter's state as a flag to detect + // this and only check if it's `Some`. + if total_fee_earned_msat.is_none() { + assert!(node.node().list_channels().iter().any(|x| + x.counterparty.node_id == next_node.node().get_our_node_id() && + x.channel_id == next_channel_id.unwrap() + )); + } else { + assert!(node.node().list_channels().iter().any(|x| + x.counterparty.node_id == next_node.node().get_our_node_id() && + x.channel_id == next_channel_id.unwrap() && + x.user_channel_id == next_user_channel_id.unwrap() + )); + } } assert_eq!(claim_from_onchain_tx, downstream_force_closed); + total_fee_earned_msat }, _ => panic!("Unexpected event"), }