Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Include onchain transactions in events #448

Draft
wants to merge 7 commits into
base: main
Choose a base branch
from
Draft
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Add required fields to PaymentKind::Onchain
Previously, `PaymentKind::Onchain` was simply a placeholder entry we
never actually used. Here, we extend it to include fields that are
actually useful.
tnull committed Jan 27, 2025
commit 4bcd4dcd29153ac4aec0ac0bcaf7a67a07b47c4c
8 changes: 7 additions & 1 deletion bindings/ldk_node.udl
Original file line number Diff line number Diff line change
@@ -326,7 +326,7 @@ interface ClosureReason {

[Enum]
interface PaymentKind {
Onchain();
Onchain(Txid txid, ConfirmationStatus status);
Bolt11(PaymentHash hash, PaymentPreimage? preimage, PaymentSecret? secret);
Bolt11Jit(PaymentHash hash, PaymentPreimage? preimage, PaymentSecret? secret, LSPFeeLimits lsp_fee_limits);
Bolt12Offer(PaymentHash? hash, PaymentPreimage? preimage, PaymentSecret? secret, OfferId offer_id, UntrustedString? payer_note, u64? quantity);
@@ -357,6 +357,12 @@ dictionary LSPFeeLimits {
u64? max_proportional_opening_fee_ppm_msat;
};

[Enum]
interface ConfirmationStatus {
Confirmed (BlockHash block_hash, u32 height, u64 timestamp);
Unconfirmed ();
};

dictionary PaymentDetails {
PaymentId id;
PaymentKind kind;
56 changes: 54 additions & 2 deletions src/payment/store.rs
Original file line number Diff line number Diff line change
@@ -25,6 +25,8 @@ use lightning::{

use lightning_types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};

use bitcoin::{BlockHash, Txid};

use std::collections::hash_map;
use std::collections::HashMap;
use std::ops::Deref;
@@ -148,6 +150,15 @@ impl PaymentDetails {
update_if_necessary!(self.status, status);
}

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

if updated {
self.latest_update_timestamp = SystemTime::now()
.duration_since(UNIX_EPOCH)
@@ -273,7 +284,12 @@ impl_writeable_tlv_based_enum!(PaymentStatus,
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum PaymentKind {
/// An on-chain payment.
Onchain,
Onchain {
/// The transaction identifier of this payment.
txid: Txid,
/// The confirmation status of this payment.
status: ConfirmationStatus,
},
/// A [BOLT 11] payment.
///
/// [BOLT 11]: https://github.com/lightning/bolts/blob/master/11-payment-encoding.md
@@ -362,7 +378,10 @@ pub enum PaymentKind {
}

impl_writeable_tlv_based_enum!(PaymentKind,
(0, Onchain) => {},
(0, Onchain) => {
(0, txid, required),
(2, status, required),
},
(2, Bolt11) => {
(0, hash, required),
(2, preimage, option),
@@ -395,6 +414,31 @@ impl_writeable_tlv_based_enum!(PaymentKind,
}
);

/// Represents the confirmation status of a transaction.
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum ConfirmationStatus {
/// The transaction is confirmed in the best chain.
Confirmed {
/// The hash of the block in which the transaction was confirmed.
block_hash: BlockHash,
/// The height under which the block was confirmed.
height: u32,
/// The time at which the block was confirmed.
timestamp: u64,
},
/// The transaction is unconfirmed.
Unconfirmed,
}

impl_writeable_tlv_based_enum!(ConfirmationStatus,
(0, Confirmed) => {
(0, block_hash, required),
(2, height, required),
(4, timestamp, required),
},
(2, Unconfirmed) => {},
);

/// Limits applying to how much fee we allow an LSP to deduct from the payment amount.
///
/// See [`LdkChannelConfig::accept_underpaying_htlcs`] for more information.
@@ -424,6 +468,7 @@ pub(crate) struct PaymentDetailsUpdate {
pub amount_msat: Option<Option<u64>>,
pub direction: Option<PaymentDirection>,
pub status: Option<PaymentStatus>,
pub confirmation_status: Option<ConfirmationStatus>,
}

impl PaymentDetailsUpdate {
@@ -436,6 +481,7 @@ impl PaymentDetailsUpdate {
amount_msat: None,
direction: None,
status: None,
confirmation_status: None,
}
}
}
@@ -451,6 +497,11 @@ impl From<&PaymentDetails> for PaymentDetailsUpdate {
_ => (None, None, None),
};

let confirmation_status = match value.kind {
PaymentKind::Onchain { status, .. } => Some(status),
_ => None,
};

Self {
id: value.id,
hash: Some(hash),
@@ -459,6 +510,7 @@ impl From<&PaymentDetails> for PaymentDetailsUpdate {
amount_msat: Some(value.amount_msat),
direction: Some(value.direction),
status: Some(value.status),
confirmation_status,
}
}
}
4 changes: 3 additions & 1 deletion src/uniffi_types.rs
Original file line number Diff line number Diff line change
@@ -14,7 +14,9 @@ pub use crate::config::{
default_config, AnchorChannelsConfig, EsploraSyncConfig, MaxDustHTLCExposure,
};
pub use crate::graph::{ChannelInfo, ChannelUpdateInfo, NodeAnnouncementInfo, NodeInfo};
pub use crate::payment::store::{LSPFeeLimits, PaymentDirection, PaymentKind, PaymentStatus};
pub use crate::payment::store::{
ConfirmationStatus, LSPFeeLimits, PaymentDirection, PaymentKind, PaymentStatus,
};
pub use crate::payment::{MaxTotalRoutingFeeLimit, QrPaymentResult, SendingParameters};

pub use lightning::chain::channelmonitor::BalanceSource;