[RFC] move the bolt12 invoice inside HTLCSource::OutboundRoute - #3719

Merged
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
vincenzopalazzo:macros/pop-with-persistance
May 2, 2025
Merged

[RFC] move the bolt12 invoice inside HTLCSource::OutboundRoute#3719
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
vincenzopalazzo:macros/pop-with-persistance

Conversation

@vincenzopalazzo

Copy link
Copy Markdown
Member

Matt noted during the last round of review the following:

Oof. Sorry I missed this until now. This is not, in fact, "only used for retries", we use it on claims only, in fact. If a user is relying on the event field for PoP, what this can mean is that we can initiate a send, restart with a stale ChannelManager, notice the payment is pending, then when it claims fail to provide the invoice (only the preimage) to the payer.
In practice, to fix this, we'll need to include the PaidBolt12Invoice in the HTLCSource::OutboundRoute, I believe.

This commit is trying to store the PaidBolt12Invoice inside the HTLCSource::OutboundRoute, but this is not enough because we have to store the invoice also inside the PendingOutboundPayment.

Fixes: #3714

@ldk-reviews-bot

ldk-reviews-bot commented Apr 8, 2025

Copy link
Copy Markdown

👋 I see @wpaulino was un-assigned.
If you'd like another reviewer assignemnt, please click here.

@vincenzopalazzovincenzopalazzo changed the title move the bolt12 invoice inside HTLCSource::OutboundRoute[RFC] move the bolt12 invoice inside HTLCSource::OutboundRouteApr 8, 2025
@vincenzopalazzo
vincenzopalazzo marked this pull request as ready for review April 14, 2025 17:16
@wpaulino
wpaulino requested review from TheBlueMatt and removed request for wpaulinoApril 14, 2025 18:07

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, this all makes sense I think. Sorry to make you undo some of the previous patch.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

👋 The first review has been submitted!

Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch 3 times, most recently from 637983d to 5c25cafCompareApril 22, 2025 17:54
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Thanks Matt! I rebased on the main to fix the commit checks and addressed some of the review comments. We should be good for another round

@ldk-reviews-bot

Copy link
Copy Markdown

✅ Added second reviewer: @wpaulino

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Conceptually looks good, but there's still quite a few FIXMEs left, do you want to address those?

Comment threadlightning/src/ln/channelmanager.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Jumping in finishing this tomorrow, sorry for the delay!

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 94cadd5 to 19ba769CompareApril 26, 2025 12:32
@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 19ba769 to 6af45f9CompareApril 26, 2025 12:49
@codecov

codecovBot commented Apr 26, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 72.22222% with 10 lines in your changes missing coverage. Please review.

Project coverage is 89.12%. Comparing base (c6921fa) to head (d6d1c2f).
Report is 44 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/outbound_payment.rs66.66%3 Missing and 1 partial ⚠️
lightning/src/ln/channelmanager.rs80.00%2 Missing and 1 partial ⚠️
lightning/src/offers/static_invoice.rs0.00%3 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3719 +/- ##
==========================================
- Coverage 89.15% 89.12% -0.03% 
==========================================
Files 156 157 +1 Lines 123837 124125 +288 Branches 123837 124125 +288 ==========================================
+ Hits 110408 110629 +221 - Misses 10754 10807 +53 - Partials 2675 2689 +14 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 6af45f9 to b7ea0deCompareApril 26, 2025 15:21
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @TheBlueMatt@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @TheBlueMatt@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@wpaulinowpaulino left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good to squash. Also would prefer a more concise commit message as opposed to just quoting a message from Matt.

Comment threadlightning/src/ln/channelmanager.rs
@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from b7ea0de to b9a07daCompareApril 29, 2025 10:34
TheBlueMatt
TheBlueMatt previously approved these changes Apr 29, 2025

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few nits.

Comment threadlightning/src/ln/outbound_payment.rs Outdated
Comment threadlightning/src/offers/signer.rs Outdated
Comment threadlightning/src/offers/signer.rs Outdated
Comment threadlightning/src/offers/static_invoice.rs Outdated
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Mh! ok I am trying to go back to this @TheBlueMatt#3719 (comment)

Do you think that having the invoice will bring any benefit for the has function inside the OutboundRoute ? There is any case where the hash will be equal, where the invoice will change the hash instead?

In addition, we would like to keep the odd value in here or changing this to even?

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I think its best to just not because it violates the Rust API guidelines etc. We shouldn't need to hash the Invoice fields tho, because we can just impl hash to hash the bytes which are the full encoded invoice.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch 2 times, most recently from edc5f8b to c50d99cCompareApril 30, 2025 07:57
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

OK, I looked at the code implementation this morning with a fresh mind, and I think I addressed your concern. Thanks for pointing me in the right direction.

@wpaulino

Copy link
Copy Markdown
Contributor

It doesn't avoid any clones, but we should have pay_route_internal take a reference as that's what it requires.

diff --git a/lightning/src/ln/outbound_payment.rs b/lightning/src/ln/outbound_payment.rs
index ce0538931..4affbc2d6 100644
--- a/lightning/src/ln/outbound_payment.rs+++ b/lightning/src/ln/outbound_payment.rs@@ -1068,7 +1068,7 @@ impl OutboundPayments {
core::mem::drop(outbounds);
let result = self.pay_route_internal(
- &route, payment_hash, &recipient_onion, keysend_preimage, invoice_request, Some(bolt12_invoice), payment_id,+ &route, payment_hash, &recipient_onion, keysend_preimage, invoice_request, Some(&bolt12_invoice), payment_id,
Some(route_params.final_value_msat), &onion_session_privs, node_signer, best_block_height,
&send_payment_along_path
);
@@ -1523,7 +1523,7 @@ impl OutboundPayments {
}
};
let res = self.pay_route_internal(&route, payment_hash, &recipient_onion, keysend_preimage,
- invoice_request.as_ref(), bolt12_invoice, payment_id, Some(total_msat), &onion_session_privs, node_signer,+ invoice_request.as_ref(), bolt12_invoice.as_ref(), payment_id, Some(total_msat), &onion_session_privs, node_signer,
best_block_height, &send_payment_along_path);
log_info!(logger, "Result retrying payment id {}: {:?}", &payment_id, res);
if let Err(e) = res {
@@ -1868,7 +1868,7 @@ impl OutboundPayments {
fn pay_route_internal<NS: Deref, F>(
&self, route: &Route, payment_hash: PaymentHash, recipient_onion: &RecipientOnionFields,
- keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>, bolt12_invoice: Option<PaidBolt12Invoice>,+ keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>, bolt12_invoice: Option<&PaidBolt12Invoice>,
payment_id: PaymentId, recv_value_msat: Option<u64>, onion_session_privs: &Vec<[u8; 32]>,
node_signer: &NS, best_block_height: u32, send_payment_along_path: &F
) -> Result<(), PaymentSendFailure>
@@ -1924,7 +1924,7 @@ impl OutboundPayments {
let path_res = send_payment_along_path(SendAlongPathArgs {
path: &path, payment_hash: &payment_hash, recipient_onion, total_value,
cur_height, payment_id, keysend_preimage: &keysend_preimage, invoice_request,
- bolt12_invoice: bolt12_invoice.as_ref(),+ bolt12_invoice,
session_priv_bytes: *session_priv_bytes
});
results.push(path_res);

@wpaulino
wpaulino removed their request for review April 30, 2025 17:18
TheBlueMatt
TheBlueMatt previously approved these changes Apr 30, 2025

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree with @wpaulino that that nit might be very marginally nicer, but either way this LGTM.

It moves the PaidBolt12Invoice (BOLT 12 invoice)
into HTLCSource::OutboundRoute to ensure the invoice
is available for proof-of-payment and event emission,
as discussed in issue lightningdevkit#3714. The commit also updates
hashing implementations and derives to ensure correct
behavior when the invoice is present, and propagates
the invoice through relevant payment and event structures.
This fixes a potential issue where the invoice could
be lost on restart, affecting PoP reliability.
Link: lightningdevkit#3714
Signed-off-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Done, thanks for the review!

@TheBlueMatt
TheBlueMatt merged commit 8d44e80 into lightningdevkit:mainMay 2, 2025
@vincenzopalazzo
vincenzopalazzo deleted the macros/pop-with-persistance branch November 3, 2025 16:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fix (or doc, for 0.2) missing Event::PaymentSent::bolt12_invoice on payments loaded from monitors

4 participants

@vincenzopalazzo@ldk-reviews-bot@TheBlueMatt@wpaulino
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[RFC] move the bolt12 invoice inside HTLCSource::OutboundRoute - #3719

Merged
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
vincenzopalazzo:macros/pop-with-persistance
May 2, 2025
Merged

[RFC] move the bolt12 invoice inside HTLCSource::OutboundRoute#3719
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
vincenzopalazzo:macros/pop-with-persistance

Conversation

@vincenzopalazzo

Copy link
Copy Markdown
Member

Matt noted during the last round of review the following:

Oof. Sorry I missed this until now. This is not, in fact, "only used for retries", we use it on claims only, in fact. If a user is relying on the event field for PoP, what this can mean is that we can initiate a send, restart with a stale ChannelManager, notice the payment is pending, then when it claims fail to provide the invoice (only the preimage) to the payer.
In practice, to fix this, we'll need to include the PaidBolt12Invoice in the HTLCSource::OutboundRoute, I believe.

This commit is trying to store the PaidBolt12Invoice inside the HTLCSource::OutboundRoute, but this is not enough because we have to store the invoice also inside the PendingOutboundPayment.

Fixes: #3714

@ldk-reviews-bot

ldk-reviews-bot commented Apr 8, 2025

Copy link
Copy Markdown

👋 I see @wpaulino was un-assigned.
If you'd like another reviewer assignemnt, please click here.

@vincenzopalazzovincenzopalazzo changed the title move the bolt12 invoice inside HTLCSource::OutboundRoute[RFC] move the bolt12 invoice inside HTLCSource::OutboundRouteApr 8, 2025
@vincenzopalazzo
vincenzopalazzo marked this pull request as ready for review April 14, 2025 17:16
@wpaulino
wpaulino requested review from TheBlueMatt and removed request for wpaulinoApril 14, 2025 18:07

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, this all makes sense I think. Sorry to make you undo some of the previous patch.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

👋 The first review has been submitted!

Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch 3 times, most recently from 637983d to 5c25cafCompareApril 22, 2025 17:54
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Thanks Matt! I rebased on the main to fix the commit checks and addressed some of the review comments. We should be good for another round

@ldk-reviews-bot

Copy link
Copy Markdown

✅ Added second reviewer: @wpaulino

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Conceptually looks good, but there's still quite a few FIXMEs left, do you want to address those?

Comment threadlightning/src/ln/channelmanager.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Jumping in finishing this tomorrow, sorry for the delay!

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 94cadd5 to 19ba769CompareApril 26, 2025 12:32
@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 19ba769 to 6af45f9CompareApril 26, 2025 12:49
@codecov

codecovBot commented Apr 26, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 72.22222% with 10 lines in your changes missing coverage. Please review.

Project coverage is 89.12%. Comparing base (c6921fa) to head (d6d1c2f).
Report is 44 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/outbound_payment.rs66.66%3 Missing and 1 partial ⚠️
lightning/src/ln/channelmanager.rs80.00%2 Missing and 1 partial ⚠️
lightning/src/offers/static_invoice.rs0.00%3 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3719 +/- ##
==========================================
- Coverage 89.15% 89.12% -0.03% 
==========================================
Files 156 157 +1 Lines 123837 124125 +288 Branches 123837 124125 +288 ==========================================
+ Hits 110408 110629 +221 - Misses 10754 10807 +53 - Partials 2675 2689 +14 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 6af45f9 to b7ea0deCompareApril 26, 2025 15:21
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @TheBlueMatt@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @TheBlueMatt@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@wpaulinowpaulino left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good to squash. Also would prefer a more concise commit message as opposed to just quoting a message from Matt.

Comment threadlightning/src/ln/channelmanager.rs
@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from b7ea0de to b9a07daCompareApril 29, 2025 10:34
TheBlueMatt
TheBlueMatt previously approved these changes Apr 29, 2025

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few nits.

Comment threadlightning/src/ln/outbound_payment.rs Outdated
Comment threadlightning/src/offers/signer.rs Outdated
Comment threadlightning/src/offers/signer.rs Outdated
Comment threadlightning/src/offers/static_invoice.rs Outdated
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Mh! ok I am trying to go back to this @TheBlueMatt#3719 (comment)

Do you think that having the invoice will bring any benefit for the has function inside the OutboundRoute ? There is any case where the hash will be equal, where the invoice will change the hash instead?

In addition, we would like to keep the odd value in here or changing this to even?

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I think its best to just not because it violates the Rust API guidelines etc. We shouldn't need to hash the Invoice fields tho, because we can just impl hash to hash the bytes which are the full encoded invoice.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch 2 times, most recently from edc5f8b to c50d99cCompareApril 30, 2025 07:57
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

OK, I looked at the code implementation this morning with a fresh mind, and I think I addressed your concern. Thanks for pointing me in the right direction.

@wpaulino

Copy link
Copy Markdown
Contributor

It doesn't avoid any clones, but we should have pay_route_internal take a reference as that's what it requires.

diff --git a/lightning/src/ln/outbound_payment.rs b/lightning/src/ln/outbound_payment.rs
index ce0538931..4affbc2d6 100644
--- a/lightning/src/ln/outbound_payment.rs+++ b/lightning/src/ln/outbound_payment.rs@@ -1068,7 +1068,7 @@ impl OutboundPayments {
core::mem::drop(outbounds);
let result = self.pay_route_internal(
- &route, payment_hash, &recipient_onion, keysend_preimage, invoice_request, Some(bolt12_invoice), payment_id,+ &route, payment_hash, &recipient_onion, keysend_preimage, invoice_request, Some(&bolt12_invoice), payment_id,
Some(route_params.final_value_msat), &onion_session_privs, node_signer, best_block_height,
&send_payment_along_path
);
@@ -1523,7 +1523,7 @@ impl OutboundPayments {
}
};
let res = self.pay_route_internal(&route, payment_hash, &recipient_onion, keysend_preimage,
- invoice_request.as_ref(), bolt12_invoice, payment_id, Some(total_msat), &onion_session_privs, node_signer,+ invoice_request.as_ref(), bolt12_invoice.as_ref(), payment_id, Some(total_msat), &onion_session_privs, node_signer,
best_block_height, &send_payment_along_path);
log_info!(logger, "Result retrying payment id {}: {:?}", &payment_id, res);
if let Err(e) = res {
@@ -1868,7 +1868,7 @@ impl OutboundPayments {
fn pay_route_internal<NS: Deref, F>(
&self, route: &Route, payment_hash: PaymentHash, recipient_onion: &RecipientOnionFields,
- keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>, bolt12_invoice: Option<PaidBolt12Invoice>,+ keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>, bolt12_invoice: Option<&PaidBolt12Invoice>,
payment_id: PaymentId, recv_value_msat: Option<u64>, onion_session_privs: &Vec<[u8; 32]>,
node_signer: &NS, best_block_height: u32, send_payment_along_path: &F
) -> Result<(), PaymentSendFailure>
@@ -1924,7 +1924,7 @@ impl OutboundPayments {
let path_res = send_payment_along_path(SendAlongPathArgs {
path: &path, payment_hash: &payment_hash, recipient_onion, total_value,
cur_height, payment_id, keysend_preimage: &keysend_preimage, invoice_request,
- bolt12_invoice: bolt12_invoice.as_ref(),+ bolt12_invoice,
session_priv_bytes: *session_priv_bytes
});
results.push(path_res);

@wpaulino
wpaulino removed their request for review April 30, 2025 17:18
TheBlueMatt
TheBlueMatt previously approved these changes Apr 30, 2025

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree with @wpaulino that that nit might be very marginally nicer, but either way this LGTM.

It moves the PaidBolt12Invoice (BOLT 12 invoice)
into HTLCSource::OutboundRoute to ensure the invoice
is available for proof-of-payment and event emission,
as discussed in issue lightningdevkit#3714. The commit also updates
hashing implementations and derives to ensure correct
behavior when the invoice is present, and propagates
the invoice through relevant payment and event structures.
This fixes a potential issue where the invoice could
be lost on restart, affecting PoP reliability.
Link: lightningdevkit#3714
Signed-off-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Done, thanks for the review!

@TheBlueMatt
TheBlueMatt merged commit 8d44e80 into lightningdevkit:mainMay 2, 2025
@vincenzopalazzo
vincenzopalazzo deleted the macros/pop-with-persistance branch November 3, 2025 16:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fix (or doc, for 0.2) missing Event::PaymentSent::bolt12_invoice on payments loaded from monitors

4 participants

@vincenzopalazzo@ldk-reviews-bot@TheBlueMatt@wpaulino
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[RFC] move the bolt12 invoice inside HTLCSource::OutboundRoute - #3719

Merged
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
vincenzopalazzo:macros/pop-with-persistance
May 2, 2025
Merged

[RFC] move the bolt12 invoice inside HTLCSource::OutboundRoute#3719
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
vincenzopalazzo:macros/pop-with-persistance

Conversation

@vincenzopalazzo

Copy link
Copy Markdown
Member

Matt noted during the last round of review the following:

Oof. Sorry I missed this until now. This is not, in fact, "only used for retries", we use it on claims only, in fact. If a user is relying on the event field for PoP, what this can mean is that we can initiate a send, restart with a stale ChannelManager, notice the payment is pending, then when it claims fail to provide the invoice (only the preimage) to the payer.
In practice, to fix this, we'll need to include the PaidBolt12Invoice in the HTLCSource::OutboundRoute, I believe.

This commit is trying to store the PaidBolt12Invoice inside the HTLCSource::OutboundRoute, but this is not enough because we have to store the invoice also inside the PendingOutboundPayment.

Fixes: #3714

@ldk-reviews-bot

ldk-reviews-bot commented Apr 8, 2025

Copy link
Copy Markdown

👋 I see @wpaulino was un-assigned.
If you'd like another reviewer assignemnt, please click here.

@vincenzopalazzovincenzopalazzo changed the title move the bolt12 invoice inside HTLCSource::OutboundRoute[RFC] move the bolt12 invoice inside HTLCSource::OutboundRouteApr 8, 2025
@vincenzopalazzo
vincenzopalazzo marked this pull request as ready for review April 14, 2025 17:16
@wpaulino
wpaulino requested review from TheBlueMatt and removed request for wpaulinoApril 14, 2025 18:07

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, this all makes sense I think. Sorry to make you undo some of the previous patch.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

👋 The first review has been submitted!

Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch 3 times, most recently from 637983d to 5c25cafCompareApril 22, 2025 17:54
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Thanks Matt! I rebased on the main to fix the commit checks and addressed some of the review comments. We should be good for another round

@ldk-reviews-bot

Copy link
Copy Markdown

✅ Added second reviewer: @wpaulino

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Conceptually looks good, but there's still quite a few FIXMEs left, do you want to address those?

Comment threadlightning/src/ln/channelmanager.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Jumping in finishing this tomorrow, sorry for the delay!

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 94cadd5 to 19ba769CompareApril 26, 2025 12:32
@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 19ba769 to 6af45f9CompareApril 26, 2025 12:49
@codecov

codecovBot commented Apr 26, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 72.22222% with 10 lines in your changes missing coverage. Please review.

Project coverage is 89.12%. Comparing base (c6921fa) to head (d6d1c2f).
Report is 44 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/outbound_payment.rs66.66%3 Missing and 1 partial ⚠️
lightning/src/ln/channelmanager.rs80.00%2 Missing and 1 partial ⚠️
lightning/src/offers/static_invoice.rs0.00%3 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3719 +/- ##
==========================================
- Coverage 89.15% 89.12% -0.03% 
==========================================
Files 156 157 +1 Lines 123837 124125 +288 Branches 123837 124125 +288 ==========================================
+ Hits 110408 110629 +221 - Misses 10754 10807 +53 - Partials 2675 2689 +14 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 6af45f9 to b7ea0deCompareApril 26, 2025 15:21
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @TheBlueMatt@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @TheBlueMatt@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@wpaulinowpaulino left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good to squash. Also would prefer a more concise commit message as opposed to just quoting a message from Matt.

Comment threadlightning/src/ln/channelmanager.rs
@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from b7ea0de to b9a07daCompareApril 29, 2025 10:34
TheBlueMatt
TheBlueMatt previously approved these changes Apr 29, 2025

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few nits.

Comment threadlightning/src/ln/outbound_payment.rs Outdated
Comment threadlightning/src/offers/signer.rs Outdated
Comment threadlightning/src/offers/signer.rs Outdated
Comment threadlightning/src/offers/static_invoice.rs Outdated
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Mh! ok I am trying to go back to this @TheBlueMatt#3719 (comment)

Do you think that having the invoice will bring any benefit for the has function inside the OutboundRoute ? There is any case where the hash will be equal, where the invoice will change the hash instead?

In addition, we would like to keep the odd value in here or changing this to even?

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I think its best to just not because it violates the Rust API guidelines etc. We shouldn't need to hash the Invoice fields tho, because we can just impl hash to hash the bytes which are the full encoded invoice.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch 2 times, most recently from edc5f8b to c50d99cCompareApril 30, 2025 07:57
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

OK, I looked at the code implementation this morning with a fresh mind, and I think I addressed your concern. Thanks for pointing me in the right direction.

@wpaulino

Copy link
Copy Markdown
Contributor

It doesn't avoid any clones, but we should have pay_route_internal take a reference as that's what it requires.

diff --git a/lightning/src/ln/outbound_payment.rs b/lightning/src/ln/outbound_payment.rs
index ce0538931..4affbc2d6 100644
--- a/lightning/src/ln/outbound_payment.rs+++ b/lightning/src/ln/outbound_payment.rs@@ -1068,7 +1068,7 @@ impl OutboundPayments {
core::mem::drop(outbounds);
let result = self.pay_route_internal(
- &route, payment_hash, &recipient_onion, keysend_preimage, invoice_request, Some(bolt12_invoice), payment_id,+ &route, payment_hash, &recipient_onion, keysend_preimage, invoice_request, Some(&bolt12_invoice), payment_id,
Some(route_params.final_value_msat), &onion_session_privs, node_signer, best_block_height,
&send_payment_along_path
);
@@ -1523,7 +1523,7 @@ impl OutboundPayments {
}
};
let res = self.pay_route_internal(&route, payment_hash, &recipient_onion, keysend_preimage,
- invoice_request.as_ref(), bolt12_invoice, payment_id, Some(total_msat), &onion_session_privs, node_signer,+ invoice_request.as_ref(), bolt12_invoice.as_ref(), payment_id, Some(total_msat), &onion_session_privs, node_signer,
best_block_height, &send_payment_along_path);
log_info!(logger, "Result retrying payment id {}: {:?}", &payment_id, res);
if let Err(e) = res {
@@ -1868,7 +1868,7 @@ impl OutboundPayments {
fn pay_route_internal<NS: Deref, F>(
&self, route: &Route, payment_hash: PaymentHash, recipient_onion: &RecipientOnionFields,
- keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>, bolt12_invoice: Option<PaidBolt12Invoice>,+ keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>, bolt12_invoice: Option<&PaidBolt12Invoice>,
payment_id: PaymentId, recv_value_msat: Option<u64>, onion_session_privs: &Vec<[u8; 32]>,
node_signer: &NS, best_block_height: u32, send_payment_along_path: &F
) -> Result<(), PaymentSendFailure>
@@ -1924,7 +1924,7 @@ impl OutboundPayments {
let path_res = send_payment_along_path(SendAlongPathArgs {
path: &path, payment_hash: &payment_hash, recipient_onion, total_value,
cur_height, payment_id, keysend_preimage: &keysend_preimage, invoice_request,
- bolt12_invoice: bolt12_invoice.as_ref(),+ bolt12_invoice,
session_priv_bytes: *session_priv_bytes
});
results.push(path_res);

@wpaulino
wpaulino removed their request for review April 30, 2025 17:18
TheBlueMatt
TheBlueMatt previously approved these changes Apr 30, 2025

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree with @wpaulino that that nit might be very marginally nicer, but either way this LGTM.

It moves the PaidBolt12Invoice (BOLT 12 invoice)
into HTLCSource::OutboundRoute to ensure the invoice
is available for proof-of-payment and event emission,
as discussed in issue lightningdevkit#3714. The commit also updates
hashing implementations and derives to ensure correct
behavior when the invoice is present, and propagates
the invoice through relevant payment and event structures.
This fixes a potential issue where the invoice could
be lost on restart, affecting PoP reliability.
Link: lightningdevkit#3714
Signed-off-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Done, thanks for the review!

@TheBlueMatt
TheBlueMatt merged commit 8d44e80 into lightningdevkit:mainMay 2, 2025
@vincenzopalazzo
vincenzopalazzo deleted the macros/pop-with-persistance branch November 3, 2025 16:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fix (or doc, for 0.2) missing Event::PaymentSent::bolt12_invoice on payments loaded from monitors

4 participants

@vincenzopalazzo@ldk-reviews-bot@TheBlueMatt@wpaulino
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[RFC] move the bolt12 invoice inside HTLCSource::OutboundRoute - #3719

Merged
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
vincenzopalazzo:macros/pop-with-persistance
May 2, 2025
Merged

[RFC] move the bolt12 invoice inside HTLCSource::OutboundRoute#3719
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
vincenzopalazzo:macros/pop-with-persistance

Conversation

@vincenzopalazzo

Copy link
Copy Markdown
Member

Matt noted during the last round of review the following:

Oof. Sorry I missed this until now. This is not, in fact, "only used for retries", we use it on claims only, in fact. If a user is relying on the event field for PoP, what this can mean is that we can initiate a send, restart with a stale ChannelManager, notice the payment is pending, then when it claims fail to provide the invoice (only the preimage) to the payer.
In practice, to fix this, we'll need to include the PaidBolt12Invoice in the HTLCSource::OutboundRoute, I believe.

This commit is trying to store the PaidBolt12Invoice inside the HTLCSource::OutboundRoute, but this is not enough because we have to store the invoice also inside the PendingOutboundPayment.

Fixes: #3714

@ldk-reviews-bot

ldk-reviews-bot commented Apr 8, 2025

Copy link
Copy Markdown

👋 I see @wpaulino was un-assigned.
If you'd like another reviewer assignemnt, please click here.

@vincenzopalazzovincenzopalazzo changed the title move the bolt12 invoice inside HTLCSource::OutboundRoute[RFC] move the bolt12 invoice inside HTLCSource::OutboundRouteApr 8, 2025
@vincenzopalazzo
vincenzopalazzo marked this pull request as ready for review April 14, 2025 17:16
@wpaulino
wpaulino requested review from TheBlueMatt and removed request for wpaulinoApril 14, 2025 18:07

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, this all makes sense I think. Sorry to make you undo some of the previous patch.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

👋 The first review has been submitted!

Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch 3 times, most recently from 637983d to 5c25cafCompareApril 22, 2025 17:54
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Thanks Matt! I rebased on the main to fix the commit checks and addressed some of the review comments. We should be good for another round

@ldk-reviews-bot

Copy link
Copy Markdown

✅ Added second reviewer: @wpaulino

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Conceptually looks good, but there's still quite a few FIXMEs left, do you want to address those?

Comment threadlightning/src/ln/channelmanager.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Jumping in finishing this tomorrow, sorry for the delay!

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 94cadd5 to 19ba769CompareApril 26, 2025 12:32
@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 19ba769 to 6af45f9CompareApril 26, 2025 12:49
@codecov

codecovBot commented Apr 26, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 72.22222% with 10 lines in your changes missing coverage. Please review.

Project coverage is 89.12%. Comparing base (c6921fa) to head (d6d1c2f).
Report is 44 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/outbound_payment.rs66.66%3 Missing and 1 partial ⚠️
lightning/src/ln/channelmanager.rs80.00%2 Missing and 1 partial ⚠️
lightning/src/offers/static_invoice.rs0.00%3 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3719 +/- ##
==========================================
- Coverage 89.15% 89.12% -0.03% 
==========================================
Files 156 157 +1 Lines 123837 124125 +288 Branches 123837 124125 +288 ==========================================
+ Hits 110408 110629 +221 - Misses 10754 10807 +53 - Partials 2675 2689 +14 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 6af45f9 to b7ea0deCompareApril 26, 2025 15:21
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @TheBlueMatt@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @TheBlueMatt@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@wpaulinowpaulino left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good to squash. Also would prefer a more concise commit message as opposed to just quoting a message from Matt.

Comment threadlightning/src/ln/channelmanager.rs
@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from b7ea0de to b9a07daCompareApril 29, 2025 10:34
TheBlueMatt
TheBlueMatt previously approved these changes Apr 29, 2025

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few nits.

Comment threadlightning/src/ln/outbound_payment.rs Outdated
Comment threadlightning/src/offers/signer.rs Outdated
Comment threadlightning/src/offers/signer.rs Outdated
Comment threadlightning/src/offers/static_invoice.rs Outdated
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Mh! ok I am trying to go back to this @TheBlueMatt#3719 (comment)

Do you think that having the invoice will bring any benefit for the has function inside the OutboundRoute ? There is any case where the hash will be equal, where the invoice will change the hash instead?

In addition, we would like to keep the odd value in here or changing this to even?

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I think its best to just not because it violates the Rust API guidelines etc. We shouldn't need to hash the Invoice fields tho, because we can just impl hash to hash the bytes which are the full encoded invoice.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch 2 times, most recently from edc5f8b to c50d99cCompareApril 30, 2025 07:57
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

OK, I looked at the code implementation this morning with a fresh mind, and I think I addressed your concern. Thanks for pointing me in the right direction.

@wpaulino

Copy link
Copy Markdown
Contributor

It doesn't avoid any clones, but we should have pay_route_internal take a reference as that's what it requires.

diff --git a/lightning/src/ln/outbound_payment.rs b/lightning/src/ln/outbound_payment.rs
index ce0538931..4affbc2d6 100644
--- a/lightning/src/ln/outbound_payment.rs+++ b/lightning/src/ln/outbound_payment.rs@@ -1068,7 +1068,7 @@ impl OutboundPayments {
core::mem::drop(outbounds);
let result = self.pay_route_internal(
- &route, payment_hash, &recipient_onion, keysend_preimage, invoice_request, Some(bolt12_invoice), payment_id,+ &route, payment_hash, &recipient_onion, keysend_preimage, invoice_request, Some(&bolt12_invoice), payment_id,
Some(route_params.final_value_msat), &onion_session_privs, node_signer, best_block_height,
&send_payment_along_path
);
@@ -1523,7 +1523,7 @@ impl OutboundPayments {
}
};
let res = self.pay_route_internal(&route, payment_hash, &recipient_onion, keysend_preimage,
- invoice_request.as_ref(), bolt12_invoice, payment_id, Some(total_msat), &onion_session_privs, node_signer,+ invoice_request.as_ref(), bolt12_invoice.as_ref(), payment_id, Some(total_msat), &onion_session_privs, node_signer,
best_block_height, &send_payment_along_path);
log_info!(logger, "Result retrying payment id {}: {:?}", &payment_id, res);
if let Err(e) = res {
@@ -1868,7 +1868,7 @@ impl OutboundPayments {
fn pay_route_internal<NS: Deref, F>(
&self, route: &Route, payment_hash: PaymentHash, recipient_onion: &RecipientOnionFields,
- keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>, bolt12_invoice: Option<PaidBolt12Invoice>,+ keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>, bolt12_invoice: Option<&PaidBolt12Invoice>,
payment_id: PaymentId, recv_value_msat: Option<u64>, onion_session_privs: &Vec<[u8; 32]>,
node_signer: &NS, best_block_height: u32, send_payment_along_path: &F
) -> Result<(), PaymentSendFailure>
@@ -1924,7 +1924,7 @@ impl OutboundPayments {
let path_res = send_payment_along_path(SendAlongPathArgs {
path: &path, payment_hash: &payment_hash, recipient_onion, total_value,
cur_height, payment_id, keysend_preimage: &keysend_preimage, invoice_request,
- bolt12_invoice: bolt12_invoice.as_ref(),+ bolt12_invoice,
session_priv_bytes: *session_priv_bytes
});
results.push(path_res);

@wpaulino
wpaulino removed their request for review April 30, 2025 17:18
TheBlueMatt
TheBlueMatt previously approved these changes Apr 30, 2025

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree with @wpaulino that that nit might be very marginally nicer, but either way this LGTM.

It moves the PaidBolt12Invoice (BOLT 12 invoice)
into HTLCSource::OutboundRoute to ensure the invoice
is available for proof-of-payment and event emission,
as discussed in issue lightningdevkit#3714. The commit also updates
hashing implementations and derives to ensure correct
behavior when the invoice is present, and propagates
the invoice through relevant payment and event structures.
This fixes a potential issue where the invoice could
be lost on restart, affecting PoP reliability.
Link: lightningdevkit#3714
Signed-off-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Done, thanks for the review!

@TheBlueMatt
TheBlueMatt merged commit 8d44e80 into lightningdevkit:mainMay 2, 2025
@vincenzopalazzo
vincenzopalazzo deleted the macros/pop-with-persistance branch November 3, 2025 16:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fix (or doc, for 0.2) missing Event::PaymentSent::bolt12_invoice on payments loaded from monitors

4 participants

@vincenzopalazzo@ldk-reviews-bot@TheBlueMatt@wpaulino
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[RFC] move the bolt12 invoice inside HTLCSource::OutboundRoute - #3719

Merged
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
vincenzopalazzo:macros/pop-with-persistance
May 2, 2025
Merged

[RFC] move the bolt12 invoice inside HTLCSource::OutboundRoute#3719
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
vincenzopalazzo:macros/pop-with-persistance

Conversation

@vincenzopalazzo

Copy link
Copy Markdown
Member

Matt noted during the last round of review the following:

Oof. Sorry I missed this until now. This is not, in fact, "only used for retries", we use it on claims only, in fact. If a user is relying on the event field for PoP, what this can mean is that we can initiate a send, restart with a stale ChannelManager, notice the payment is pending, then when it claims fail to provide the invoice (only the preimage) to the payer.
In practice, to fix this, we'll need to include the PaidBolt12Invoice in the HTLCSource::OutboundRoute, I believe.

This commit is trying to store the PaidBolt12Invoice inside the HTLCSource::OutboundRoute, but this is not enough because we have to store the invoice also inside the PendingOutboundPayment.

Fixes: #3714

@ldk-reviews-bot

ldk-reviews-bot commented Apr 8, 2025

Copy link
Copy Markdown

👋 I see @wpaulino was un-assigned.
If you'd like another reviewer assignemnt, please click here.

@vincenzopalazzovincenzopalazzo changed the title move the bolt12 invoice inside HTLCSource::OutboundRoute[RFC] move the bolt12 invoice inside HTLCSource::OutboundRouteApr 8, 2025
@vincenzopalazzo
vincenzopalazzo marked this pull request as ready for review April 14, 2025 17:16
@wpaulino
wpaulino requested review from TheBlueMatt and removed request for wpaulinoApril 14, 2025 18:07

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, this all makes sense I think. Sorry to make you undo some of the previous patch.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

👋 The first review has been submitted!

Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch 3 times, most recently from 637983d to 5c25cafCompareApril 22, 2025 17:54
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Thanks Matt! I rebased on the main to fix the commit checks and addressed some of the review comments. We should be good for another round

@ldk-reviews-bot

Copy link
Copy Markdown

✅ Added second reviewer: @wpaulino

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Conceptually looks good, but there's still quite a few FIXMEs left, do you want to address those?

Comment threadlightning/src/ln/channelmanager.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Jumping in finishing this tomorrow, sorry for the delay!

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 94cadd5 to 19ba769CompareApril 26, 2025 12:32
@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 19ba769 to 6af45f9CompareApril 26, 2025 12:49
@codecov

codecovBot commented Apr 26, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 72.22222% with 10 lines in your changes missing coverage. Please review.

Project coverage is 89.12%. Comparing base (c6921fa) to head (d6d1c2f).
Report is 44 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/outbound_payment.rs66.66%3 Missing and 1 partial ⚠️
lightning/src/ln/channelmanager.rs80.00%2 Missing and 1 partial ⚠️
lightning/src/offers/static_invoice.rs0.00%3 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3719 +/- ##
==========================================
- Coverage 89.15% 89.12% -0.03% 
==========================================
Files 156 157 +1 Lines 123837 124125 +288 Branches 123837 124125 +288 ==========================================
+ Hits 110408 110629 +221 - Misses 10754 10807 +53 - Partials 2675 2689 +14 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 6af45f9 to b7ea0deCompareApril 26, 2025 15:21
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @TheBlueMatt@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @TheBlueMatt@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@wpaulinowpaulino left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good to squash. Also would prefer a more concise commit message as opposed to just quoting a message from Matt.

Comment threadlightning/src/ln/channelmanager.rs
@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from b7ea0de to b9a07daCompareApril 29, 2025 10:34
TheBlueMatt
TheBlueMatt previously approved these changes Apr 29, 2025

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few nits.

Comment threadlightning/src/ln/outbound_payment.rs Outdated
Comment threadlightning/src/offers/signer.rs Outdated
Comment threadlightning/src/offers/signer.rs Outdated
Comment threadlightning/src/offers/static_invoice.rs Outdated
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Mh! ok I am trying to go back to this @TheBlueMatt#3719 (comment)

Do you think that having the invoice will bring any benefit for the has function inside the OutboundRoute ? There is any case where the hash will be equal, where the invoice will change the hash instead?

In addition, we would like to keep the odd value in here or changing this to even?

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I think its best to just not because it violates the Rust API guidelines etc. We shouldn't need to hash the Invoice fields tho, because we can just impl hash to hash the bytes which are the full encoded invoice.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch 2 times, most recently from edc5f8b to c50d99cCompareApril 30, 2025 07:57
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

OK, I looked at the code implementation this morning with a fresh mind, and I think I addressed your concern. Thanks for pointing me in the right direction.

@wpaulino

Copy link
Copy Markdown
Contributor

It doesn't avoid any clones, but we should have pay_route_internal take a reference as that's what it requires.

diff --git a/lightning/src/ln/outbound_payment.rs b/lightning/src/ln/outbound_payment.rs
index ce0538931..4affbc2d6 100644
--- a/lightning/src/ln/outbound_payment.rs+++ b/lightning/src/ln/outbound_payment.rs@@ -1068,7 +1068,7 @@ impl OutboundPayments {
core::mem::drop(outbounds);
let result = self.pay_route_internal(
- &route, payment_hash, &recipient_onion, keysend_preimage, invoice_request, Some(bolt12_invoice), payment_id,+ &route, payment_hash, &recipient_onion, keysend_preimage, invoice_request, Some(&bolt12_invoice), payment_id,
Some(route_params.final_value_msat), &onion_session_privs, node_signer, best_block_height,
&send_payment_along_path
);
@@ -1523,7 +1523,7 @@ impl OutboundPayments {
}
};
let res = self.pay_route_internal(&route, payment_hash, &recipient_onion, keysend_preimage,
- invoice_request.as_ref(), bolt12_invoice, payment_id, Some(total_msat), &onion_session_privs, node_signer,+ invoice_request.as_ref(), bolt12_invoice.as_ref(), payment_id, Some(total_msat), &onion_session_privs, node_signer,
best_block_height, &send_payment_along_path);
log_info!(logger, "Result retrying payment id {}: {:?}", &payment_id, res);
if let Err(e) = res {
@@ -1868,7 +1868,7 @@ impl OutboundPayments {
fn pay_route_internal<NS: Deref, F>(
&self, route: &Route, payment_hash: PaymentHash, recipient_onion: &RecipientOnionFields,
- keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>, bolt12_invoice: Option<PaidBolt12Invoice>,+ keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>, bolt12_invoice: Option<&PaidBolt12Invoice>,
payment_id: PaymentId, recv_value_msat: Option<u64>, onion_session_privs: &Vec<[u8; 32]>,
node_signer: &NS, best_block_height: u32, send_payment_along_path: &F
) -> Result<(), PaymentSendFailure>
@@ -1924,7 +1924,7 @@ impl OutboundPayments {
let path_res = send_payment_along_path(SendAlongPathArgs {
path: &path, payment_hash: &payment_hash, recipient_onion, total_value,
cur_height, payment_id, keysend_preimage: &keysend_preimage, invoice_request,
- bolt12_invoice: bolt12_invoice.as_ref(),+ bolt12_invoice,
session_priv_bytes: *session_priv_bytes
});
results.push(path_res);

@wpaulino
wpaulino removed their request for review April 30, 2025 17:18
TheBlueMatt
TheBlueMatt previously approved these changes Apr 30, 2025

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree with @wpaulino that that nit might be very marginally nicer, but either way this LGTM.

It moves the PaidBolt12Invoice (BOLT 12 invoice)
into HTLCSource::OutboundRoute to ensure the invoice
is available for proof-of-payment and event emission,
as discussed in issue lightningdevkit#3714. The commit also updates
hashing implementations and derives to ensure correct
behavior when the invoice is present, and propagates
the invoice through relevant payment and event structures.
This fixes a potential issue where the invoice could
be lost on restart, affecting PoP reliability.
Link: lightningdevkit#3714
Signed-off-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Done, thanks for the review!

@TheBlueMatt
TheBlueMatt merged commit 8d44e80 into lightningdevkit:mainMay 2, 2025
@vincenzopalazzo
vincenzopalazzo deleted the macros/pop-with-persistance branch November 3, 2025 16:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fix (or doc, for 0.2) missing Event::PaymentSent::bolt12_invoice on payments loaded from monitors

4 participants

@vincenzopalazzo@ldk-reviews-bot@TheBlueMatt@wpaulino
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[RFC] move the bolt12 invoice inside HTLCSource::OutboundRoute - #3719

Merged
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
vincenzopalazzo:macros/pop-with-persistance
May 2, 2025
Merged

[RFC] move the bolt12 invoice inside HTLCSource::OutboundRoute#3719
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
vincenzopalazzo:macros/pop-with-persistance

Conversation

@vincenzopalazzo

Copy link
Copy Markdown
Member

Matt noted during the last round of review the following:

Oof. Sorry I missed this until now. This is not, in fact, "only used for retries", we use it on claims only, in fact. If a user is relying on the event field for PoP, what this can mean is that we can initiate a send, restart with a stale ChannelManager, notice the payment is pending, then when it claims fail to provide the invoice (only the preimage) to the payer.
In practice, to fix this, we'll need to include the PaidBolt12Invoice in the HTLCSource::OutboundRoute, I believe.

This commit is trying to store the PaidBolt12Invoice inside the HTLCSource::OutboundRoute, but this is not enough because we have to store the invoice also inside the PendingOutboundPayment.

Fixes: #3714

@ldk-reviews-bot

ldk-reviews-bot commented Apr 8, 2025

Copy link
Copy Markdown

👋 I see @wpaulino was un-assigned.
If you'd like another reviewer assignemnt, please click here.

@vincenzopalazzovincenzopalazzo changed the title move the bolt12 invoice inside HTLCSource::OutboundRoute[RFC] move the bolt12 invoice inside HTLCSource::OutboundRouteApr 8, 2025
@vincenzopalazzo
vincenzopalazzo marked this pull request as ready for review April 14, 2025 17:16
@wpaulino
wpaulino requested review from TheBlueMatt and removed request for wpaulinoApril 14, 2025 18:07

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, this all makes sense I think. Sorry to make you undo some of the previous patch.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

👋 The first review has been submitted!

Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch 3 times, most recently from 637983d to 5c25cafCompareApril 22, 2025 17:54
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Thanks Matt! I rebased on the main to fix the commit checks and addressed some of the review comments. We should be good for another round

@ldk-reviews-bot

Copy link
Copy Markdown

✅ Added second reviewer: @wpaulino

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Conceptually looks good, but there's still quite a few FIXMEs left, do you want to address those?

Comment threadlightning/src/ln/channelmanager.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Jumping in finishing this tomorrow, sorry for the delay!

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 94cadd5 to 19ba769CompareApril 26, 2025 12:32
@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 19ba769 to 6af45f9CompareApril 26, 2025 12:49
@codecov

codecovBot commented Apr 26, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 72.22222% with 10 lines in your changes missing coverage. Please review.

Project coverage is 89.12%. Comparing base (c6921fa) to head (d6d1c2f).
Report is 44 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/outbound_payment.rs66.66%3 Missing and 1 partial ⚠️
lightning/src/ln/channelmanager.rs80.00%2 Missing and 1 partial ⚠️
lightning/src/offers/static_invoice.rs0.00%3 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3719 +/- ##
==========================================
- Coverage 89.15% 89.12% -0.03% 
==========================================
Files 156 157 +1 Lines 123837 124125 +288 Branches 123837 124125 +288 ==========================================
+ Hits 110408 110629 +221 - Misses 10754 10807 +53 - Partials 2675 2689 +14 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 6af45f9 to b7ea0deCompareApril 26, 2025 15:21
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @TheBlueMatt@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @TheBlueMatt@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@wpaulinowpaulino left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good to squash. Also would prefer a more concise commit message as opposed to just quoting a message from Matt.

Comment threadlightning/src/ln/channelmanager.rs
@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from b7ea0de to b9a07daCompareApril 29, 2025 10:34
TheBlueMatt
TheBlueMatt previously approved these changes Apr 29, 2025

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few nits.

Comment threadlightning/src/ln/outbound_payment.rs Outdated
Comment threadlightning/src/offers/signer.rs Outdated
Comment threadlightning/src/offers/signer.rs Outdated
Comment threadlightning/src/offers/static_invoice.rs Outdated
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Mh! ok I am trying to go back to this @TheBlueMatt#3719 (comment)

Do you think that having the invoice will bring any benefit for the has function inside the OutboundRoute ? There is any case where the hash will be equal, where the invoice will change the hash instead?

In addition, we would like to keep the odd value in here or changing this to even?

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I think its best to just not because it violates the Rust API guidelines etc. We shouldn't need to hash the Invoice fields tho, because we can just impl hash to hash the bytes which are the full encoded invoice.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch 2 times, most recently from edc5f8b to c50d99cCompareApril 30, 2025 07:57
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

OK, I looked at the code implementation this morning with a fresh mind, and I think I addressed your concern. Thanks for pointing me in the right direction.

@wpaulino

Copy link
Copy Markdown
Contributor

It doesn't avoid any clones, but we should have pay_route_internal take a reference as that's what it requires.

diff --git a/lightning/src/ln/outbound_payment.rs b/lightning/src/ln/outbound_payment.rs
index ce0538931..4affbc2d6 100644
--- a/lightning/src/ln/outbound_payment.rs+++ b/lightning/src/ln/outbound_payment.rs@@ -1068,7 +1068,7 @@ impl OutboundPayments {
core::mem::drop(outbounds);
let result = self.pay_route_internal(
- &route, payment_hash, &recipient_onion, keysend_preimage, invoice_request, Some(bolt12_invoice), payment_id,+ &route, payment_hash, &recipient_onion, keysend_preimage, invoice_request, Some(&bolt12_invoice), payment_id,
Some(route_params.final_value_msat), &onion_session_privs, node_signer, best_block_height,
&send_payment_along_path
);
@@ -1523,7 +1523,7 @@ impl OutboundPayments {
}
};
let res = self.pay_route_internal(&route, payment_hash, &recipient_onion, keysend_preimage,
- invoice_request.as_ref(), bolt12_invoice, payment_id, Some(total_msat), &onion_session_privs, node_signer,+ invoice_request.as_ref(), bolt12_invoice.as_ref(), payment_id, Some(total_msat), &onion_session_privs, node_signer,
best_block_height, &send_payment_along_path);
log_info!(logger, "Result retrying payment id {}: {:?}", &payment_id, res);
if let Err(e) = res {
@@ -1868,7 +1868,7 @@ impl OutboundPayments {
fn pay_route_internal<NS: Deref, F>(
&self, route: &Route, payment_hash: PaymentHash, recipient_onion: &RecipientOnionFields,
- keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>, bolt12_invoice: Option<PaidBolt12Invoice>,+ keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>, bolt12_invoice: Option<&PaidBolt12Invoice>,
payment_id: PaymentId, recv_value_msat: Option<u64>, onion_session_privs: &Vec<[u8; 32]>,
node_signer: &NS, best_block_height: u32, send_payment_along_path: &F
) -> Result<(), PaymentSendFailure>
@@ -1924,7 +1924,7 @@ impl OutboundPayments {
let path_res = send_payment_along_path(SendAlongPathArgs {
path: &path, payment_hash: &payment_hash, recipient_onion, total_value,
cur_height, payment_id, keysend_preimage: &keysend_preimage, invoice_request,
- bolt12_invoice: bolt12_invoice.as_ref(),+ bolt12_invoice,
session_priv_bytes: *session_priv_bytes
});
results.push(path_res);

@wpaulino
wpaulino removed their request for review April 30, 2025 17:18
TheBlueMatt
TheBlueMatt previously approved these changes Apr 30, 2025

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree with @wpaulino that that nit might be very marginally nicer, but either way this LGTM.

It moves the PaidBolt12Invoice (BOLT 12 invoice)
into HTLCSource::OutboundRoute to ensure the invoice
is available for proof-of-payment and event emission,
as discussed in issue lightningdevkit#3714. The commit also updates
hashing implementations and derives to ensure correct
behavior when the invoice is present, and propagates
the invoice through relevant payment and event structures.
This fixes a potential issue where the invoice could
be lost on restart, affecting PoP reliability.
Link: lightningdevkit#3714
Signed-off-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Done, thanks for the review!

@TheBlueMatt
TheBlueMatt merged commit 8d44e80 into lightningdevkit:mainMay 2, 2025
@vincenzopalazzo
vincenzopalazzo deleted the macros/pop-with-persistance branch November 3, 2025 16:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fix (or doc, for 0.2) missing Event::PaymentSent::bolt12_invoice on payments loaded from monitors

4 participants

@vincenzopalazzo@ldk-reviews-bot@TheBlueMatt@wpaulino
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[RFC] move the bolt12 invoice inside HTLCSource::OutboundRoute - #3719

Merged
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
vincenzopalazzo:macros/pop-with-persistance
May 2, 2025
Merged

[RFC] move the bolt12 invoice inside HTLCSource::OutboundRoute#3719
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
vincenzopalazzo:macros/pop-with-persistance

Conversation

@vincenzopalazzo

Copy link
Copy Markdown
Member

Matt noted during the last round of review the following:

Oof. Sorry I missed this until now. This is not, in fact, "only used for retries", we use it on claims only, in fact. If a user is relying on the event field for PoP, what this can mean is that we can initiate a send, restart with a stale ChannelManager, notice the payment is pending, then when it claims fail to provide the invoice (only the preimage) to the payer.
In practice, to fix this, we'll need to include the PaidBolt12Invoice in the HTLCSource::OutboundRoute, I believe.

This commit is trying to store the PaidBolt12Invoice inside the HTLCSource::OutboundRoute, but this is not enough because we have to store the invoice also inside the PendingOutboundPayment.

Fixes: #3714

@ldk-reviews-bot

ldk-reviews-bot commented Apr 8, 2025

Copy link
Copy Markdown

👋 I see @wpaulino was un-assigned.
If you'd like another reviewer assignemnt, please click here.

@vincenzopalazzovincenzopalazzo changed the title move the bolt12 invoice inside HTLCSource::OutboundRoute[RFC] move the bolt12 invoice inside HTLCSource::OutboundRouteApr 8, 2025
@vincenzopalazzo
vincenzopalazzo marked this pull request as ready for review April 14, 2025 17:16
@wpaulino
wpaulino requested review from TheBlueMatt and removed request for wpaulinoApril 14, 2025 18:07

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, this all makes sense I think. Sorry to make you undo some of the previous patch.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

👋 The first review has been submitted!

Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch 3 times, most recently from 637983d to 5c25cafCompareApril 22, 2025 17:54
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Thanks Matt! I rebased on the main to fix the commit checks and addressed some of the review comments. We should be good for another round

@ldk-reviews-bot

Copy link
Copy Markdown

✅ Added second reviewer: @wpaulino

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Conceptually looks good, but there's still quite a few FIXMEs left, do you want to address those?

Comment threadlightning/src/ln/channelmanager.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Jumping in finishing this tomorrow, sorry for the delay!

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 94cadd5 to 19ba769CompareApril 26, 2025 12:32
@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 19ba769 to 6af45f9CompareApril 26, 2025 12:49
@codecov

codecovBot commented Apr 26, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 72.22222% with 10 lines in your changes missing coverage. Please review.

Project coverage is 89.12%. Comparing base (c6921fa) to head (d6d1c2f).
Report is 44 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/outbound_payment.rs66.66%3 Missing and 1 partial ⚠️
lightning/src/ln/channelmanager.rs80.00%2 Missing and 1 partial ⚠️
lightning/src/offers/static_invoice.rs0.00%3 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3719 +/- ##
==========================================
- Coverage 89.15% 89.12% -0.03% 
==========================================
Files 156 157 +1 Lines 123837 124125 +288 Branches 123837 124125 +288 ==========================================
+ Hits 110408 110629 +221 - Misses 10754 10807 +53 - Partials 2675 2689 +14 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 6af45f9 to b7ea0deCompareApril 26, 2025 15:21
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @TheBlueMatt@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @TheBlueMatt@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@wpaulinowpaulino left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good to squash. Also would prefer a more concise commit message as opposed to just quoting a message from Matt.

Comment threadlightning/src/ln/channelmanager.rs
@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from b7ea0de to b9a07daCompareApril 29, 2025 10:34
TheBlueMatt
TheBlueMatt previously approved these changes Apr 29, 2025

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few nits.

Comment threadlightning/src/ln/outbound_payment.rs Outdated
Comment threadlightning/src/offers/signer.rs Outdated
Comment threadlightning/src/offers/signer.rs Outdated
Comment threadlightning/src/offers/static_invoice.rs Outdated
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Mh! ok I am trying to go back to this @TheBlueMatt#3719 (comment)

Do you think that having the invoice will bring any benefit for the has function inside the OutboundRoute ? There is any case where the hash will be equal, where the invoice will change the hash instead?

In addition, we would like to keep the odd value in here or changing this to even?

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I think its best to just not because it violates the Rust API guidelines etc. We shouldn't need to hash the Invoice fields tho, because we can just impl hash to hash the bytes which are the full encoded invoice.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch 2 times, most recently from edc5f8b to c50d99cCompareApril 30, 2025 07:57
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

OK, I looked at the code implementation this morning with a fresh mind, and I think I addressed your concern. Thanks for pointing me in the right direction.

@wpaulino

Copy link
Copy Markdown
Contributor

It doesn't avoid any clones, but we should have pay_route_internal take a reference as that's what it requires.

diff --git a/lightning/src/ln/outbound_payment.rs b/lightning/src/ln/outbound_payment.rs
index ce0538931..4affbc2d6 100644
--- a/lightning/src/ln/outbound_payment.rs+++ b/lightning/src/ln/outbound_payment.rs@@ -1068,7 +1068,7 @@ impl OutboundPayments {
core::mem::drop(outbounds);
let result = self.pay_route_internal(
- &route, payment_hash, &recipient_onion, keysend_preimage, invoice_request, Some(bolt12_invoice), payment_id,+ &route, payment_hash, &recipient_onion, keysend_preimage, invoice_request, Some(&bolt12_invoice), payment_id,
Some(route_params.final_value_msat), &onion_session_privs, node_signer, best_block_height,
&send_payment_along_path
);
@@ -1523,7 +1523,7 @@ impl OutboundPayments {
}
};
let res = self.pay_route_internal(&route, payment_hash, &recipient_onion, keysend_preimage,
- invoice_request.as_ref(), bolt12_invoice, payment_id, Some(total_msat), &onion_session_privs, node_signer,+ invoice_request.as_ref(), bolt12_invoice.as_ref(), payment_id, Some(total_msat), &onion_session_privs, node_signer,
best_block_height, &send_payment_along_path);
log_info!(logger, "Result retrying payment id {}: {:?}", &payment_id, res);
if let Err(e) = res {
@@ -1868,7 +1868,7 @@ impl OutboundPayments {
fn pay_route_internal<NS: Deref, F>(
&self, route: &Route, payment_hash: PaymentHash, recipient_onion: &RecipientOnionFields,
- keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>, bolt12_invoice: Option<PaidBolt12Invoice>,+ keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>, bolt12_invoice: Option<&PaidBolt12Invoice>,
payment_id: PaymentId, recv_value_msat: Option<u64>, onion_session_privs: &Vec<[u8; 32]>,
node_signer: &NS, best_block_height: u32, send_payment_along_path: &F
) -> Result<(), PaymentSendFailure>
@@ -1924,7 +1924,7 @@ impl OutboundPayments {
let path_res = send_payment_along_path(SendAlongPathArgs {
path: &path, payment_hash: &payment_hash, recipient_onion, total_value,
cur_height, payment_id, keysend_preimage: &keysend_preimage, invoice_request,
- bolt12_invoice: bolt12_invoice.as_ref(),+ bolt12_invoice,
session_priv_bytes: *session_priv_bytes
});
results.push(path_res);

@wpaulino
wpaulino removed their request for review April 30, 2025 17:18
TheBlueMatt
TheBlueMatt previously approved these changes Apr 30, 2025

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree with @wpaulino that that nit might be very marginally nicer, but either way this LGTM.

It moves the PaidBolt12Invoice (BOLT 12 invoice)
into HTLCSource::OutboundRoute to ensure the invoice
is available for proof-of-payment and event emission,
as discussed in issue lightningdevkit#3714. The commit also updates
hashing implementations and derives to ensure correct
behavior when the invoice is present, and propagates
the invoice through relevant payment and event structures.
This fixes a potential issue where the invoice could
be lost on restart, affecting PoP reliability.
Link: lightningdevkit#3714
Signed-off-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Done, thanks for the review!

@TheBlueMatt
TheBlueMatt merged commit 8d44e80 into lightningdevkit:mainMay 2, 2025
@vincenzopalazzo
vincenzopalazzo deleted the macros/pop-with-persistance branch November 3, 2025 16:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fix (or doc, for 0.2) missing Event::PaymentSent::bolt12_invoice on payments loaded from monitors

4 participants

@vincenzopalazzo@ldk-reviews-bot@TheBlueMatt@wpaulino
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[RFC] move the bolt12 invoice inside HTLCSource::OutboundRoute - #3719

Merged
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
vincenzopalazzo:macros/pop-with-persistance
May 2, 2025
Merged

[RFC] move the bolt12 invoice inside HTLCSource::OutboundRoute#3719
TheBlueMatt merged 1 commit into
lightningdevkit:mainfrom
vincenzopalazzo:macros/pop-with-persistance

Conversation

@vincenzopalazzo

Copy link
Copy Markdown
Member

Matt noted during the last round of review the following:

Oof. Sorry I missed this until now. This is not, in fact, "only used for retries", we use it on claims only, in fact. If a user is relying on the event field for PoP, what this can mean is that we can initiate a send, restart with a stale ChannelManager, notice the payment is pending, then when it claims fail to provide the invoice (only the preimage) to the payer.
In practice, to fix this, we'll need to include the PaidBolt12Invoice in the HTLCSource::OutboundRoute, I believe.

This commit is trying to store the PaidBolt12Invoice inside the HTLCSource::OutboundRoute, but this is not enough because we have to store the invoice also inside the PendingOutboundPayment.

Fixes: #3714

@ldk-reviews-bot

ldk-reviews-bot commented Apr 8, 2025

Copy link
Copy Markdown

👋 I see @wpaulino was un-assigned.
If you'd like another reviewer assignemnt, please click here.

@vincenzopalazzovincenzopalazzo changed the title move the bolt12 invoice inside HTLCSource::OutboundRoute[RFC] move the bolt12 invoice inside HTLCSource::OutboundRouteApr 8, 2025
@vincenzopalazzo
vincenzopalazzo marked this pull request as ready for review April 14, 2025 17:16
@wpaulino
wpaulino requested review from TheBlueMatt and removed request for wpaulinoApril 14, 2025 18:07

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, this all makes sense I think. Sorry to make you undo some of the previous patch.

Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

👋 The first review has been submitted!

Do you think this PR is ready for a second reviewer? If so, click here to assign a second reviewer.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch 3 times, most recently from 637983d to 5c25cafCompareApril 22, 2025 17:54
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Thanks Matt! I rebased on the main to fix the commit checks and addressed some of the review comments. We should be good for another round

@ldk-reviews-bot

Copy link
Copy Markdown

✅ Added second reviewer: @wpaulino

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Conceptually looks good, but there's still quite a few FIXMEs left, do you want to address those?

Comment threadlightning/src/ln/channelmanager.rs Outdated
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Jumping in finishing this tomorrow, sorry for the delay!

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 94cadd5 to 19ba769CompareApril 26, 2025 12:32
@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 19ba769 to 6af45f9CompareApril 26, 2025 12:49
@codecov

codecovBot commented Apr 26, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 72.22222% with 10 lines in your changes missing coverage. Please review.

Project coverage is 89.12%. Comparing base (c6921fa) to head (d6d1c2f).
Report is 44 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/outbound_payment.rs66.66%3 Missing and 1 partial ⚠️
lightning/src/ln/channelmanager.rs80.00%2 Missing and 1 partial ⚠️
lightning/src/offers/static_invoice.rs0.00%3 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3719 +/- ##
==========================================
- Coverage 89.15% 89.12% -0.03% 
==========================================
Files 156 157 +1 Lines 123837 124125 +288 Branches 123837 124125 +288 ==========================================
+ Hits 110408 110629 +221 - Misses 10754 10807 +53 - Partials 2675 2689 +14 

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from 6af45f9 to b7ea0deCompareApril 26, 2025 15:21
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @TheBlueMatt@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @TheBlueMatt@wpaulino! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@wpaulinowpaulino left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good to squash. Also would prefer a more concise commit message as opposed to just quoting a message from Matt.

Comment threadlightning/src/ln/channelmanager.rs
@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch from b7ea0de to b9a07daCompareApril 29, 2025 10:34
TheBlueMatt
TheBlueMatt previously approved these changes Apr 29, 2025

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few nits.

Comment threadlightning/src/ln/outbound_payment.rs Outdated
Comment threadlightning/src/offers/signer.rs Outdated
Comment threadlightning/src/offers/signer.rs Outdated
Comment threadlightning/src/offers/static_invoice.rs Outdated
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Mh! ok I am trying to go back to this @TheBlueMatt#3719 (comment)

Do you think that having the invoice will bring any benefit for the has function inside the OutboundRoute ? There is any case where the hash will be equal, where the invoice will change the hash instead?

In addition, we would like to keep the odd value in here or changing this to even?

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

I think its best to just not because it violates the Rust API guidelines etc. We shouldn't need to hash the Invoice fields tho, because we can just impl hash to hash the bytes which are the full encoded invoice.

@vincenzopalazzo
vincenzopalazzoforce-pushed the macros/pop-with-persistance branch 2 times, most recently from edc5f8b to c50d99cCompareApril 30, 2025 07:57
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

OK, I looked at the code implementation this morning with a fresh mind, and I think I addressed your concern. Thanks for pointing me in the right direction.

@wpaulino

Copy link
Copy Markdown
Contributor

It doesn't avoid any clones, but we should have pay_route_internal take a reference as that's what it requires.

diff --git a/lightning/src/ln/outbound_payment.rs b/lightning/src/ln/outbound_payment.rs
index ce0538931..4affbc2d6 100644
--- a/lightning/src/ln/outbound_payment.rs+++ b/lightning/src/ln/outbound_payment.rs@@ -1068,7 +1068,7 @@ impl OutboundPayments {
core::mem::drop(outbounds);
let result = self.pay_route_internal(
- &route, payment_hash, &recipient_onion, keysend_preimage, invoice_request, Some(bolt12_invoice), payment_id,+ &route, payment_hash, &recipient_onion, keysend_preimage, invoice_request, Some(&bolt12_invoice), payment_id,
Some(route_params.final_value_msat), &onion_session_privs, node_signer, best_block_height,
&send_payment_along_path
);
@@ -1523,7 +1523,7 @@ impl OutboundPayments {
}
};
let res = self.pay_route_internal(&route, payment_hash, &recipient_onion, keysend_preimage,
- invoice_request.as_ref(), bolt12_invoice, payment_id, Some(total_msat), &onion_session_privs, node_signer,+ invoice_request.as_ref(), bolt12_invoice.as_ref(), payment_id, Some(total_msat), &onion_session_privs, node_signer,
best_block_height, &send_payment_along_path);
log_info!(logger, "Result retrying payment id {}: {:?}", &payment_id, res);
if let Err(e) = res {
@@ -1868,7 +1868,7 @@ impl OutboundPayments {
fn pay_route_internal<NS: Deref, F>(
&self, route: &Route, payment_hash: PaymentHash, recipient_onion: &RecipientOnionFields,
- keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>, bolt12_invoice: Option<PaidBolt12Invoice>,+ keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>, bolt12_invoice: Option<&PaidBolt12Invoice>,
payment_id: PaymentId, recv_value_msat: Option<u64>, onion_session_privs: &Vec<[u8; 32]>,
node_signer: &NS, best_block_height: u32, send_payment_along_path: &F
) -> Result<(), PaymentSendFailure>
@@ -1924,7 +1924,7 @@ impl OutboundPayments {
let path_res = send_payment_along_path(SendAlongPathArgs {
path: &path, payment_hash: &payment_hash, recipient_onion, total_value,
cur_height, payment_id, keysend_preimage: &keysend_preimage, invoice_request,
- bolt12_invoice: bolt12_invoice.as_ref(),+ bolt12_invoice,
session_priv_bytes: *session_priv_bytes
});
results.push(path_res);

@wpaulino
wpaulino removed their request for review April 30, 2025 17:18
TheBlueMatt
TheBlueMatt previously approved these changes Apr 30, 2025

@TheBlueMattTheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree with @wpaulino that that nit might be very marginally nicer, but either way this LGTM.

It moves the PaidBolt12Invoice (BOLT 12 invoice)
into HTLCSource::OutboundRoute to ensure the invoice
is available for proof-of-payment and event emission,
as discussed in issue lightningdevkit#3714. The commit also updates
hashing implementations and derives to ensure correct
behavior when the invoice is present, and propagates
the invoice through relevant payment and event structures.
This fixes a potential issue where the invoice could
be lost on restart, affecting PoP reliability.
Link: lightningdevkit#3714
Signed-off-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
@vincenzopalazzo

Copy link
Copy Markdown
MemberAuthor

Done, thanks for the review!

@TheBlueMatt
TheBlueMatt merged commit 8d44e80 into lightningdevkit:mainMay 2, 2025
@vincenzopalazzo
vincenzopalazzo deleted the macros/pop-with-persistance branch November 3, 2025 16:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fix (or doc, for 0.2) missing Event::PaymentSent::bolt12_invoice on payments loaded from monitors

4 participants

@vincenzopalazzo@ldk-reviews-bot@TheBlueMatt@wpaulino