diff --git a/bindings/ldk_node.udl b/bindings/ldk_node.udl index c2f0166c8..4ab85d562 100644 --- a/bindings/ldk_node.udl +++ b/bindings/ldk_node.udl @@ -419,10 +419,11 @@ enum PaymentDirection { "Outbound", }; -enum PaymentStatus { - "Pending", - "Succeeded", - "Failed", +[Enum] +interface PaymentStatus { + Pending(); + Succeeded(); + Failed(PaymentFailureReason? reason); }; dictionary LSPFeeLimits { diff --git a/src/event.rs b/src/event.rs index 22848bec1..94c76a4e8 100644 --- a/src/event.rs +++ b/src/event.rs @@ -582,7 +582,7 @@ where self.channel_manager.fail_htlc_backwards(&payment_hash); let update = PaymentDetailsUpdate { - status: Some(PaymentStatus::Failed), + status: Some(PaymentStatus::Failed { reason: None }), ..PaymentDetailsUpdate::new(payment_id) }; match self.payment_store.update(&update) { @@ -606,7 +606,7 @@ where self.channel_manager.fail_htlc_backwards(&payment_hash); let update = PaymentDetailsUpdate { - status: Some(PaymentStatus::Failed), + status: Some(PaymentStatus::Failed { reason: None }), ..PaymentDetailsUpdate::new(payment_id) }; match self.payment_store.update(&update) { @@ -647,7 +647,7 @@ where let update = PaymentDetailsUpdate { hash: Some(Some(payment_hash)), - status: Some(PaymentStatus::Failed), + status: Some(PaymentStatus::Failed { reason: None }), ..PaymentDetailsUpdate::new(payment_id) }; match self.payment_store.update(&update) { @@ -834,7 +834,7 @@ where let update = PaymentDetailsUpdate { hash: Some(Some(payment_hash)), - status: Some(PaymentStatus::Failed), + status: Some(PaymentStatus::Failed { reason: None }), ..PaymentDetailsUpdate::new(payment_id) }; match self.payment_store.update(&update) { @@ -1014,7 +1014,7 @@ where let update = PaymentDetailsUpdate { hash: Some(payment_hash), - status: Some(PaymentStatus::Failed), + status: Some(PaymentStatus::Failed { reason }), ..PaymentDetailsUpdate::new(payment_id) }; match self.payment_store.update(&update) { diff --git a/src/payment/bolt11.rs b/src/payment/bolt11.rs index 052571818..22b213f16 100644 --- a/src/payment/bolt11.rs +++ b/src/payment/bolt11.rs @@ -210,7 +210,7 @@ impl Bolt11Payment { invoice.amount_milli_satoshis(), None, PaymentDirection::Outbound, - PaymentStatus::Failed, + PaymentStatus::Failed { reason: None }, ); self.payment_store.insert(payment)?; @@ -346,7 +346,7 @@ impl Bolt11Payment { Some(amount_msat), None, PaymentDirection::Outbound, - PaymentStatus::Failed, + PaymentStatus::Failed { reason: None }, ); self.payment_store.insert(payment)?; @@ -430,7 +430,7 @@ impl Bolt11Payment { let payment_id = PaymentId(payment_hash.0); let update = PaymentDetailsUpdate { - status: Some(PaymentStatus::Failed), + status: Some(PaymentStatus::Failed { reason: None }), ..PaymentDetailsUpdate::new(payment_id) }; diff --git a/src/payment/bolt12.rs b/src/payment/bolt12.rs index 8006f4bb9..841eb9349 100644 --- a/src/payment/bolt12.rs +++ b/src/payment/bolt12.rs @@ -138,7 +138,7 @@ impl Bolt12Payment { Some(offer_amount_msat), None, PaymentDirection::Outbound, - PaymentStatus::Failed, + PaymentStatus::Failed { reason: None }, ); self.payment_store.insert(payment)?; Err(Error::InvoiceRequestCreationFailed) @@ -244,7 +244,7 @@ impl Bolt12Payment { Some(amount_msat), None, PaymentDirection::Outbound, - PaymentStatus::Failed, + PaymentStatus::Failed { reason: None }, ); self.payment_store.insert(payment)?; Err(Error::PaymentSendingFailed) diff --git a/src/payment/spontaneous.rs b/src/payment/spontaneous.rs index 1508b6cd8..9057f789e 100644 --- a/src/payment/spontaneous.rs +++ b/src/payment/spontaneous.rs @@ -162,7 +162,7 @@ impl SpontaneousPayment { Some(amount_msat), None, PaymentDirection::Outbound, - PaymentStatus::Failed, + PaymentStatus::Failed { reason: None }, ); self.payment_store.insert(payment)?; diff --git a/src/payment/store.rs b/src/payment/store.rs index 75b2b1b2a..78154de02 100644 --- a/src/payment/store.rs +++ b/src/payment/store.rs @@ -5,6 +5,7 @@ // http://opensource.org/licenses/MIT>, at your option. You may not use this file except in // accordance with one or both of these licenses. +use lightning::events::PaymentFailureReason; use lightning::ln::channelmanager::PaymentId; use lightning::ln::msgs::DecodeError; use lightning::offers::offer::OfferId; @@ -280,8 +281,8 @@ impl StorableObject for PaymentDetails { } } - if let Some(status) = update.status { - update_if_necessary!(self.status, status); + if let Some(status) = &update.status { + update_if_necessary!(self.status, status.clone()); } if let Some(confirmation_status) = update.confirmation_status { @@ -323,20 +324,25 @@ impl_writeable_tlv_based_enum!(PaymentDirection, ); /// Represents the current status of a payment. -#[derive(Copy, Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum PaymentStatus { /// The payment is still pending. Pending, /// The payment succeeded. Succeeded, /// The payment failed. - Failed, + Failed { + /// The reason why the payment failed. + reason: Option, + }, } impl_writeable_tlv_based_enum!(PaymentStatus, (0, Pending) => {}, (2, Succeeded) => {}, - (4, Failed) => {} + (4, Failed) => { + (0, reason, upgradable_option), + } ); /// Represents the kind of a payment. @@ -593,7 +599,7 @@ impl From<&PaymentDetails> for PaymentDetailsUpdate { fee_paid_msat: Some(value.fee_paid_msat), counterparty_skimmed_fee_msat, direction: Some(value.direction), - status: Some(value.status), + status: Some(value.status.clone()), confirmation_status, } } diff --git a/tests/common/mod.rs b/tests/common/mod.rs index 3258df791..d67c959c6 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -826,7 +826,10 @@ pub(crate) fn do_channel_full_cycle( ); node_b.bolt11_payment().fail_for_hash(manual_fail_payment_hash).unwrap(); expect_event!(node_a, PaymentFailed); - assert_eq!(node_a.payment(&manual_fail_payment_id).unwrap().status, PaymentStatus::Failed); + assert_eq!( + node_a.payment(&manual_fail_payment_id).unwrap().status, + PaymentStatus::Failed { reason: None } + ); assert_eq!( node_a.payment(&manual_fail_payment_id).unwrap().direction, PaymentDirection::Outbound @@ -839,7 +842,10 @@ pub(crate) fn do_channel_full_cycle( node_a.payment(&manual_fail_payment_id).unwrap().kind, PaymentKind::Bolt11 { .. } )); - assert_eq!(node_b.payment(&manual_fail_payment_id).unwrap().status, PaymentStatus::Failed); + assert_eq!( + node_b.payment(&manual_fail_payment_id).unwrap().status, + PaymentStatus::Failed { reason: None } + ); assert_eq!( node_b.payment(&manual_fail_payment_id).unwrap().direction, PaymentDirection::Inbound