Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion bindings/ldk_node.udl
Original file line number Diff line number Diff line change
Expand Up @@ -422,7 +422,7 @@ interface ClosureReason {

[Enum]
interface PaymentKind {
Onchain(Txid txid, ConfirmationStatus status);
Onchain(Txid txid, ConfirmationStatus status, sequence<Txid> conflicting_txids);
Bolt11(PaymentHash hash, PaymentPreimage? preimage, PaymentSecret? secret);
Bolt11Jit(PaymentHash hash, PaymentPreimage? preimage, PaymentSecret? secret, u64? counterparty_skimmed_fee_msat, LSPFeeLimits lsp_fee_limits);
Bolt12Offer(PaymentHash? hash, PaymentPreimage? preimage, PaymentSecret? secret, OfferId offer_id, UntrustedString? payer_note, u64? quantity);
Expand Down
23 changes: 20 additions & 3 deletions src/payment/store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,15 @@ impl StorableObject for PaymentDetails {
}
}

if let Some(conflicting_txids_opt) = &update.conflicting_txids {
match self.kind {
PaymentKind::Onchain { ref mut conflicting_txids, .. } => {
update_if_necessary!(*conflicting_txids, conflicting_txids_opt.to_vec());
},
_ => {},
}
}

if updated {
self.latest_update_timestamp = SystemTime::now()
.duration_since(UNIX_EPOCH)
Expand Down Expand Up @@ -351,6 +360,8 @@ pub enum PaymentKind {
txid: Txid,
/// The confirmation status of this payment.
status: ConfirmationStatus,
/// Transaction IDs that have replaced or conflict with this payment.
conflicting_txids: Vec<Txid>,
},
/// A [BOLT 11] payment.
///
Expand Down Expand Up @@ -448,6 +459,7 @@ pub enum PaymentKind {
impl_writeable_tlv_based_enum!(PaymentKind,
(0, Onchain) => {
(0, txid, required),
(1, conflicting_txids, optional_vec),
(2, status, required),
},
(2, Bolt11) => {
Expand Down Expand Up @@ -540,6 +552,7 @@ pub(crate) struct PaymentDetailsUpdate {
pub direction: Option<PaymentDirection>,
pub status: Option<PaymentStatus>,
pub confirmation_status: Option<ConfirmationStatus>,
pub conflicting_txids: Option<Vec<Txid>>,
}

impl PaymentDetailsUpdate {
Expand All @@ -555,6 +568,7 @@ impl PaymentDetailsUpdate {
direction: None,
status: None,
confirmation_status: None,
conflicting_txids: None,
}
}
}
Expand All @@ -570,9 +584,11 @@ impl From<&PaymentDetails> for PaymentDetailsUpdate {
_ => (None, None, None),
};

let confirmation_status = match value.kind {
PaymentKind::Onchain { status, .. } => Some(status),
_ => None,
let (confirmation_status, conflicting_txids) = match &value.kind {
PaymentKind::Onchain { status, conflicting_txids, .. } => {
(Some(*status), conflicting_txids.clone())
},
_ => (None, Vec::new()),
};

let counterparty_skimmed_fee_msat = match value.kind {
Expand All @@ -593,6 +609,7 @@ impl From<&PaymentDetails> for PaymentDetailsUpdate {
direction: Some(value.direction),
status: Some(value.status),
confirmation_status,
conflicting_txids: Some(conflicting_txids),
}
}
}
Expand Down
Loading