From 25761b959939984a2031f3b758ae26051b3ab1cd Mon Sep 17 00:00:00 2001 From: Jeffrey Czyz Date: Thu, 29 Feb 2024 15:21:03 -0600 Subject: [PATCH] Fail request_refund_payment for unsupported chain If a Refund has an unsupported chain, ChannelManager should not send an invoice as it can't be paid on that chain. Instead, return an error when calling ChannelManager::request_refund_payment for such refunds. --- lightning/src/ln/channelmanager.rs | 4 ++++ lightning/src/ln/offers_tests.rs | 30 ++++++++++++++++++++++++++++++ lightning/src/offers/refund.rs | 5 +++++ 3 files changed, 39 insertions(+) diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index abfca35f972..46e226687ad 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -7895,6 +7895,10 @@ where let amount_msats = refund.amount_msats(); let relative_expiry = DEFAULT_RELATIVE_EXPIRY.as_secs() as u32; + if refund.chain() != self.chain_hash { + return Err(Bolt12SemanticError::UnsupportedChain); + } + match self.create_inbound_payment(Some(amount_msats), relative_expiry, None) { Ok((payment_hash, payment_secret)) => { let payment_paths = self.create_blinded_payment_paths(amount_msats, payment_secret) diff --git a/lightning/src/ln/offers_tests.rs b/lightning/src/ln/offers_tests.rs index cefb12b9b7e..b189bf3b4f5 100644 --- a/lightning/src/ln/offers_tests.rs +++ b/lightning/src/ln/offers_tests.rs @@ -694,6 +694,36 @@ fn fails_creating_invoice_request_for_unsupported_chain() { } } +/// Fails requesting a payment when the refund contains an unsupported chain. +#[test] +fn fails_sending_invoice_with_unsupported_chain_for_refund() { + let chanmon_cfgs = create_chanmon_cfgs(2); + let node_cfgs = create_node_cfgs(2, &chanmon_cfgs); + let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]); + let nodes = create_network(2, &node_cfgs, &node_chanmgrs); + + create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 10_000_000, 1_000_000_000); + + let alice = &nodes[0]; + let bob = &nodes[1]; + + let absolute_expiry = Duration::from_secs(u64::MAX); + let payment_id = PaymentId([1; 32]); + let refund = bob.node + .create_refund_builder( + "refund".to_string(), 10_000_000, absolute_expiry, payment_id, Retry::Attempts(0), None + ) + .unwrap() + .clear_chain() + .chain(Network::Signet) + .build().unwrap(); + + match alice.node.request_refund_payment(&refund) { + Ok(_) => panic!("Expected error"), + Err(e) => assert_eq!(e, Bolt12SemanticError::UnsupportedChain), + } +} + /// Fails creating an invoice request when a blinded reply path cannot be created without exposing /// the node's id. #[test] diff --git a/lightning/src/offers/refund.rs b/lightning/src/offers/refund.rs index ba3ab1d1ef3..62f56b6c9a2 100644 --- a/lightning/src/offers/refund.rs +++ b/lightning/src/offers/refund.rs @@ -302,6 +302,11 @@ impl<'a, T: secp256k1::Signing> RefundBuilder<'a, T> { self } + pub(crate) fn clear_chain(mut self) -> Self { + self.refund.chain = None; + self + } + fn features_unchecked(mut self, features: InvoiceRequestFeatures) -> Self { self.refund.features = features; self