Replace maze of BOLT11 payment utilities with parameter generators - #2727

Merged
G8XSU merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-11-better-bolt11-utils
Nov 14, 2023
Merged

Replace maze of BOLT11 payment utilities with parameter generators#2727
G8XSU merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-11-better-bolt11-utils

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

lightning-invoice was historically responsible for actually paying invoices, handling retries and everything. However, that turned out to be buggy and hard to maintain, so the payment logic was eventually moved into ChannelManager. However, the old utilites remain.

Because our payment logic has a number of tunable parameters and there are different ways to pay a BOLT11 invoice, we ended up with six different methods to pay or probe a BOLT11 invoice, with more requested as various options still were not exposed.

Instead, here, we replace all six methods with two simple ones which return the arguments which need to be passed to ChannelManager. Those arguments can be further tweaked before passing them on, allowing more flexibility.

`lightning-invoice` was historically responsible for actually
paying invoices, handling retries and everything. However, that
turned out to be buggy and hard to maintain, so the payment logic
was eventually moved into `ChannelManager`. However, the old
utilites remain.
Because our payment logic has a number of tunable parameters and
there are different ways to pay a BOLT11 invoice, we ended up with
six different methods to pay or probe a BOLT11 invoice, with more
requested as various options still were not exposed.
Instead, here, we replace all six methods with two simple ones
which return the arguments which need to be passed to
`ChannelManager`. Those arguments can be further tweaked before
passing them on, allowing more flexibility.
@codecov-commenter

codecov-commenter commented Nov 10, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 2 lines in your changes are missing coverage. Please review.

Comparison is base (6e40e5f) 88.80% compared to head (22305a9) 89.02%.
Report is 2 commits behind head on main.

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2727 +/- ##
==========================================
+ Coverage 88.80% 89.02% +0.22% 
==========================================
Files 113 113 Lines 89170 89871 +701 Branches 89170 89871 +701 ==========================================
+ Hits 79188 80009 +821 + Misses 7729 7596 -133 - Partials 2253 2266 +13 
FilesCoverage Δ
lightning-invoice/src/payment.rs96.45% <96.42%> (+19.38%)⬆️

... and 13 files with indirect coverage changes

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

Comment threadlightning-invoice/src/payment.rs Outdated
@benthecarman

Copy link
Copy Markdown
Contributor

I think this closes #2390

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

#2390 is about send_payment_with_path (and friends), not this. I actually thought about doing that in the same PR as well but its a bit more annoying since its used everywhere in tests.

Since there's a much simpler way to go about it with
`Bolt11Invoice::expires_at`.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-11-better-bolt11-utils branch from cbf5fed to 22305a9CompareNovember 12, 2023 17:18

@shaavanshaavan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ACK

The maze has been successfully navigated!

The latest sets of functions have been clarified, making optimal use of common functions wherever possible.
Additionally, the code is also well-documented.

I have also added a summary of my analysis of this PR, which can potentially help fellow contributors in their review process.

Summary:

Let's break it down function by function:

  1. Simplifying Invoice Handling:
    • pay_zero_value_invoice has been replaced with payment_parameters_from_zero_amount_invoice.
      • Removed retry strategy and ChannelManager from params.
      • Switched to using params_from_invoice instead of the convoluted pay_zero_value_invoice_with_id.
      • Added a check for a zero-amount invoice, eliminating the need for another function (pay_zero_value_invoice_with_id).
  2. Cleaner Invoice Payment Process:
    • pay_zero_value_invoice_with_id has been removed.
    • pay_invoice_using_amount is now replaced with payment_parameters_from_invoice.
      • Instead of paying within this function, the process is sent to a common params_from_invoice function, reducing complexity.
      • The function now returns payment-related values upstream.
  3. Streamlining Probing Functions:
    • preflight_probe_invoice and preflight_probe_zero_value_invoice have been removed, as ChannelManager now handles the probing previously done here.
  4. Enhancing Code Structure:
    • Removed expiry_time_from_unix_epoch function, now using with_expiry_time defined within Payment Parameters.
  5. Testing Improvements:
    • Removed invoice and zero_value_invoice helper functions used in testing. Respective invoices are now created in their test functions.

Comment threadlightning-invoice/src/payment.rs

@valentinewallacevalentinewallace 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 wait on @G8XSU's ACK before landing.

@G8XSU
G8XSU merged commit 0456b0e into lightningdevkit:mainNov 14, 2023
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.

6 participants

@TheBlueMatt@codecov-commenter@benthecarman@G8XSU@valentinewallace@shaavan
, '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

Replace maze of BOLT11 payment utilities with parameter generators - #2727

Merged
G8XSU merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-11-better-bolt11-utils
Nov 14, 2023
Merged

Replace maze of BOLT11 payment utilities with parameter generators#2727
G8XSU merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-11-better-bolt11-utils

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

lightning-invoice was historically responsible for actually paying invoices, handling retries and everything. However, that turned out to be buggy and hard to maintain, so the payment logic was eventually moved into ChannelManager. However, the old utilites remain.

Because our payment logic has a number of tunable parameters and there are different ways to pay a BOLT11 invoice, we ended up with six different methods to pay or probe a BOLT11 invoice, with more requested as various options still were not exposed.

Instead, here, we replace all six methods with two simple ones which return the arguments which need to be passed to ChannelManager. Those arguments can be further tweaked before passing them on, allowing more flexibility.

`lightning-invoice` was historically responsible for actually
paying invoices, handling retries and everything. However, that
turned out to be buggy and hard to maintain, so the payment logic
was eventually moved into `ChannelManager`. However, the old
utilites remain.
Because our payment logic has a number of tunable parameters and
there are different ways to pay a BOLT11 invoice, we ended up with
six different methods to pay or probe a BOLT11 invoice, with more
requested as various options still were not exposed.
Instead, here, we replace all six methods with two simple ones
which return the arguments which need to be passed to
`ChannelManager`. Those arguments can be further tweaked before
passing them on, allowing more flexibility.
@codecov-commenter

codecov-commenter commented Nov 10, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 2 lines in your changes are missing coverage. Please review.

Comparison is base (6e40e5f) 88.80% compared to head (22305a9) 89.02%.
Report is 2 commits behind head on main.

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2727 +/- ##
==========================================
+ Coverage 88.80% 89.02% +0.22% 
==========================================
Files 113 113 Lines 89170 89871 +701 Branches 89170 89871 +701 ==========================================
+ Hits 79188 80009 +821 + Misses 7729 7596 -133 - Partials 2253 2266 +13 
FilesCoverage Δ
lightning-invoice/src/payment.rs96.45% <96.42%> (+19.38%)⬆️

... and 13 files with indirect coverage changes

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

Comment threadlightning-invoice/src/payment.rs Outdated
@benthecarman

Copy link
Copy Markdown
Contributor

I think this closes #2390

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

#2390 is about send_payment_with_path (and friends), not this. I actually thought about doing that in the same PR as well but its a bit more annoying since its used everywhere in tests.

Since there's a much simpler way to go about it with
`Bolt11Invoice::expires_at`.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-11-better-bolt11-utils branch from cbf5fed to 22305a9CompareNovember 12, 2023 17:18

@shaavanshaavan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ACK

The maze has been successfully navigated!

The latest sets of functions have been clarified, making optimal use of common functions wherever possible.
Additionally, the code is also well-documented.

I have also added a summary of my analysis of this PR, which can potentially help fellow contributors in their review process.

Summary:

Let's break it down function by function:

  1. Simplifying Invoice Handling:
    • pay_zero_value_invoice has been replaced with payment_parameters_from_zero_amount_invoice.
      • Removed retry strategy and ChannelManager from params.
      • Switched to using params_from_invoice instead of the convoluted pay_zero_value_invoice_with_id.
      • Added a check for a zero-amount invoice, eliminating the need for another function (pay_zero_value_invoice_with_id).
  2. Cleaner Invoice Payment Process:
    • pay_zero_value_invoice_with_id has been removed.
    • pay_invoice_using_amount is now replaced with payment_parameters_from_invoice.
      • Instead of paying within this function, the process is sent to a common params_from_invoice function, reducing complexity.
      • The function now returns payment-related values upstream.
  3. Streamlining Probing Functions:
    • preflight_probe_invoice and preflight_probe_zero_value_invoice have been removed, as ChannelManager now handles the probing previously done here.
  4. Enhancing Code Structure:
    • Removed expiry_time_from_unix_epoch function, now using with_expiry_time defined within Payment Parameters.
  5. Testing Improvements:
    • Removed invoice and zero_value_invoice helper functions used in testing. Respective invoices are now created in their test functions.

Comment threadlightning-invoice/src/payment.rs

@valentinewallacevalentinewallace 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 wait on @G8XSU's ACK before landing.

@G8XSU
G8XSU merged commit 0456b0e into lightningdevkit:mainNov 14, 2023
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.

6 participants

@TheBlueMatt@codecov-commenter@benthecarman@G8XSU@valentinewallace@shaavan
, '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

Replace maze of BOLT11 payment utilities with parameter generators - #2727

Merged
G8XSU merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-11-better-bolt11-utils
Nov 14, 2023
Merged

Replace maze of BOLT11 payment utilities with parameter generators#2727
G8XSU merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-11-better-bolt11-utils

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

lightning-invoice was historically responsible for actually paying invoices, handling retries and everything. However, that turned out to be buggy and hard to maintain, so the payment logic was eventually moved into ChannelManager. However, the old utilites remain.

Because our payment logic has a number of tunable parameters and there are different ways to pay a BOLT11 invoice, we ended up with six different methods to pay or probe a BOLT11 invoice, with more requested as various options still were not exposed.

Instead, here, we replace all six methods with two simple ones which return the arguments which need to be passed to ChannelManager. Those arguments can be further tweaked before passing them on, allowing more flexibility.

`lightning-invoice` was historically responsible for actually
paying invoices, handling retries and everything. However, that
turned out to be buggy and hard to maintain, so the payment logic
was eventually moved into `ChannelManager`. However, the old
utilites remain.
Because our payment logic has a number of tunable parameters and
there are different ways to pay a BOLT11 invoice, we ended up with
six different methods to pay or probe a BOLT11 invoice, with more
requested as various options still were not exposed.
Instead, here, we replace all six methods with two simple ones
which return the arguments which need to be passed to
`ChannelManager`. Those arguments can be further tweaked before
passing them on, allowing more flexibility.
@codecov-commenter

codecov-commenter commented Nov 10, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 2 lines in your changes are missing coverage. Please review.

Comparison is base (6e40e5f) 88.80% compared to head (22305a9) 89.02%.
Report is 2 commits behind head on main.

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2727 +/- ##
==========================================
+ Coverage 88.80% 89.02% +0.22% 
==========================================
Files 113 113 Lines 89170 89871 +701 Branches 89170 89871 +701 ==========================================
+ Hits 79188 80009 +821 + Misses 7729 7596 -133 - Partials 2253 2266 +13 
FilesCoverage Δ
lightning-invoice/src/payment.rs96.45% <96.42%> (+19.38%)⬆️

... and 13 files with indirect coverage changes

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

Comment threadlightning-invoice/src/payment.rs Outdated
@benthecarman

Copy link
Copy Markdown
Contributor

I think this closes #2390

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

#2390 is about send_payment_with_path (and friends), not this. I actually thought about doing that in the same PR as well but its a bit more annoying since its used everywhere in tests.

Since there's a much simpler way to go about it with
`Bolt11Invoice::expires_at`.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-11-better-bolt11-utils branch from cbf5fed to 22305a9CompareNovember 12, 2023 17:18

@shaavanshaavan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ACK

The maze has been successfully navigated!

The latest sets of functions have been clarified, making optimal use of common functions wherever possible.
Additionally, the code is also well-documented.

I have also added a summary of my analysis of this PR, which can potentially help fellow contributors in their review process.

Summary:

Let's break it down function by function:

  1. Simplifying Invoice Handling:
    • pay_zero_value_invoice has been replaced with payment_parameters_from_zero_amount_invoice.
      • Removed retry strategy and ChannelManager from params.
      • Switched to using params_from_invoice instead of the convoluted pay_zero_value_invoice_with_id.
      • Added a check for a zero-amount invoice, eliminating the need for another function (pay_zero_value_invoice_with_id).
  2. Cleaner Invoice Payment Process:
    • pay_zero_value_invoice_with_id has been removed.
    • pay_invoice_using_amount is now replaced with payment_parameters_from_invoice.
      • Instead of paying within this function, the process is sent to a common params_from_invoice function, reducing complexity.
      • The function now returns payment-related values upstream.
  3. Streamlining Probing Functions:
    • preflight_probe_invoice and preflight_probe_zero_value_invoice have been removed, as ChannelManager now handles the probing previously done here.
  4. Enhancing Code Structure:
    • Removed expiry_time_from_unix_epoch function, now using with_expiry_time defined within Payment Parameters.
  5. Testing Improvements:
    • Removed invoice and zero_value_invoice helper functions used in testing. Respective invoices are now created in their test functions.

Comment threadlightning-invoice/src/payment.rs

@valentinewallacevalentinewallace 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 wait on @G8XSU's ACK before landing.

@G8XSU
G8XSU merged commit 0456b0e into lightningdevkit:mainNov 14, 2023
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.

6 participants

@TheBlueMatt@codecov-commenter@benthecarman@G8XSU@valentinewallace@shaavan
, '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

Replace maze of BOLT11 payment utilities with parameter generators - #2727

Merged
G8XSU merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-11-better-bolt11-utils
Nov 14, 2023
Merged

Replace maze of BOLT11 payment utilities with parameter generators#2727
G8XSU merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-11-better-bolt11-utils

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

lightning-invoice was historically responsible for actually paying invoices, handling retries and everything. However, that turned out to be buggy and hard to maintain, so the payment logic was eventually moved into ChannelManager. However, the old utilites remain.

Because our payment logic has a number of tunable parameters and there are different ways to pay a BOLT11 invoice, we ended up with six different methods to pay or probe a BOLT11 invoice, with more requested as various options still were not exposed.

Instead, here, we replace all six methods with two simple ones which return the arguments which need to be passed to ChannelManager. Those arguments can be further tweaked before passing them on, allowing more flexibility.

`lightning-invoice` was historically responsible for actually
paying invoices, handling retries and everything. However, that
turned out to be buggy and hard to maintain, so the payment logic
was eventually moved into `ChannelManager`. However, the old
utilites remain.
Because our payment logic has a number of tunable parameters and
there are different ways to pay a BOLT11 invoice, we ended up with
six different methods to pay or probe a BOLT11 invoice, with more
requested as various options still were not exposed.
Instead, here, we replace all six methods with two simple ones
which return the arguments which need to be passed to
`ChannelManager`. Those arguments can be further tweaked before
passing them on, allowing more flexibility.
@codecov-commenter

codecov-commenter commented Nov 10, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 2 lines in your changes are missing coverage. Please review.

Comparison is base (6e40e5f) 88.80% compared to head (22305a9) 89.02%.
Report is 2 commits behind head on main.

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2727 +/- ##
==========================================
+ Coverage 88.80% 89.02% +0.22% 
==========================================
Files 113 113 Lines 89170 89871 +701 Branches 89170 89871 +701 ==========================================
+ Hits 79188 80009 +821 + Misses 7729 7596 -133 - Partials 2253 2266 +13 
FilesCoverage Δ
lightning-invoice/src/payment.rs96.45% <96.42%> (+19.38%)⬆️

... and 13 files with indirect coverage changes

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

Comment threadlightning-invoice/src/payment.rs Outdated
@benthecarman

Copy link
Copy Markdown
Contributor

I think this closes #2390

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

#2390 is about send_payment_with_path (and friends), not this. I actually thought about doing that in the same PR as well but its a bit more annoying since its used everywhere in tests.

Since there's a much simpler way to go about it with
`Bolt11Invoice::expires_at`.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-11-better-bolt11-utils branch from cbf5fed to 22305a9CompareNovember 12, 2023 17:18

@shaavanshaavan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ACK

The maze has been successfully navigated!

The latest sets of functions have been clarified, making optimal use of common functions wherever possible.
Additionally, the code is also well-documented.

I have also added a summary of my analysis of this PR, which can potentially help fellow contributors in their review process.

Summary:

Let's break it down function by function:

  1. Simplifying Invoice Handling:
    • pay_zero_value_invoice has been replaced with payment_parameters_from_zero_amount_invoice.
      • Removed retry strategy and ChannelManager from params.
      • Switched to using params_from_invoice instead of the convoluted pay_zero_value_invoice_with_id.
      • Added a check for a zero-amount invoice, eliminating the need for another function (pay_zero_value_invoice_with_id).
  2. Cleaner Invoice Payment Process:
    • pay_zero_value_invoice_with_id has been removed.
    • pay_invoice_using_amount is now replaced with payment_parameters_from_invoice.
      • Instead of paying within this function, the process is sent to a common params_from_invoice function, reducing complexity.
      • The function now returns payment-related values upstream.
  3. Streamlining Probing Functions:
    • preflight_probe_invoice and preflight_probe_zero_value_invoice have been removed, as ChannelManager now handles the probing previously done here.
  4. Enhancing Code Structure:
    • Removed expiry_time_from_unix_epoch function, now using with_expiry_time defined within Payment Parameters.
  5. Testing Improvements:
    • Removed invoice and zero_value_invoice helper functions used in testing. Respective invoices are now created in their test functions.

Comment threadlightning-invoice/src/payment.rs

@valentinewallacevalentinewallace 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 wait on @G8XSU's ACK before landing.

@G8XSU
G8XSU merged commit 0456b0e into lightningdevkit:mainNov 14, 2023
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.

6 participants

@TheBlueMatt@codecov-commenter@benthecarman@G8XSU@valentinewallace@shaavan
, '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

Replace maze of BOLT11 payment utilities with parameter generators - #2727

Merged
G8XSU merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-11-better-bolt11-utils
Nov 14, 2023
Merged

Replace maze of BOLT11 payment utilities with parameter generators#2727
G8XSU merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-11-better-bolt11-utils

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

lightning-invoice was historically responsible for actually paying invoices, handling retries and everything. However, that turned out to be buggy and hard to maintain, so the payment logic was eventually moved into ChannelManager. However, the old utilites remain.

Because our payment logic has a number of tunable parameters and there are different ways to pay a BOLT11 invoice, we ended up with six different methods to pay or probe a BOLT11 invoice, with more requested as various options still were not exposed.

Instead, here, we replace all six methods with two simple ones which return the arguments which need to be passed to ChannelManager. Those arguments can be further tweaked before passing them on, allowing more flexibility.

`lightning-invoice` was historically responsible for actually
paying invoices, handling retries and everything. However, that
turned out to be buggy and hard to maintain, so the payment logic
was eventually moved into `ChannelManager`. However, the old
utilites remain.
Because our payment logic has a number of tunable parameters and
there are different ways to pay a BOLT11 invoice, we ended up with
six different methods to pay or probe a BOLT11 invoice, with more
requested as various options still were not exposed.
Instead, here, we replace all six methods with two simple ones
which return the arguments which need to be passed to
`ChannelManager`. Those arguments can be further tweaked before
passing them on, allowing more flexibility.
@codecov-commenter

codecov-commenter commented Nov 10, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 2 lines in your changes are missing coverage. Please review.

Comparison is base (6e40e5f) 88.80% compared to head (22305a9) 89.02%.
Report is 2 commits behind head on main.

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2727 +/- ##
==========================================
+ Coverage 88.80% 89.02% +0.22% 
==========================================
Files 113 113 Lines 89170 89871 +701 Branches 89170 89871 +701 ==========================================
+ Hits 79188 80009 +821 + Misses 7729 7596 -133 - Partials 2253 2266 +13 
FilesCoverage Δ
lightning-invoice/src/payment.rs96.45% <96.42%> (+19.38%)⬆️

... and 13 files with indirect coverage changes

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

Comment threadlightning-invoice/src/payment.rs Outdated
@benthecarman

Copy link
Copy Markdown
Contributor

I think this closes #2390

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

#2390 is about send_payment_with_path (and friends), not this. I actually thought about doing that in the same PR as well but its a bit more annoying since its used everywhere in tests.

Since there's a much simpler way to go about it with
`Bolt11Invoice::expires_at`.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-11-better-bolt11-utils branch from cbf5fed to 22305a9CompareNovember 12, 2023 17:18

@shaavanshaavan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ACK

The maze has been successfully navigated!

The latest sets of functions have been clarified, making optimal use of common functions wherever possible.
Additionally, the code is also well-documented.

I have also added a summary of my analysis of this PR, which can potentially help fellow contributors in their review process.

Summary:

Let's break it down function by function:

  1. Simplifying Invoice Handling:
    • pay_zero_value_invoice has been replaced with payment_parameters_from_zero_amount_invoice.
      • Removed retry strategy and ChannelManager from params.
      • Switched to using params_from_invoice instead of the convoluted pay_zero_value_invoice_with_id.
      • Added a check for a zero-amount invoice, eliminating the need for another function (pay_zero_value_invoice_with_id).
  2. Cleaner Invoice Payment Process:
    • pay_zero_value_invoice_with_id has been removed.
    • pay_invoice_using_amount is now replaced with payment_parameters_from_invoice.
      • Instead of paying within this function, the process is sent to a common params_from_invoice function, reducing complexity.
      • The function now returns payment-related values upstream.
  3. Streamlining Probing Functions:
    • preflight_probe_invoice and preflight_probe_zero_value_invoice have been removed, as ChannelManager now handles the probing previously done here.
  4. Enhancing Code Structure:
    • Removed expiry_time_from_unix_epoch function, now using with_expiry_time defined within Payment Parameters.
  5. Testing Improvements:
    • Removed invoice and zero_value_invoice helper functions used in testing. Respective invoices are now created in their test functions.

Comment threadlightning-invoice/src/payment.rs

@valentinewallacevalentinewallace 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 wait on @G8XSU's ACK before landing.

@G8XSU
G8XSU merged commit 0456b0e into lightningdevkit:mainNov 14, 2023
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.

6 participants

@TheBlueMatt@codecov-commenter@benthecarman@G8XSU@valentinewallace@shaavan
, '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

Replace maze of BOLT11 payment utilities with parameter generators - #2727

Merged
G8XSU merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-11-better-bolt11-utils
Nov 14, 2023
Merged

Replace maze of BOLT11 payment utilities with parameter generators#2727
G8XSU merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-11-better-bolt11-utils

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

lightning-invoice was historically responsible for actually paying invoices, handling retries and everything. However, that turned out to be buggy and hard to maintain, so the payment logic was eventually moved into ChannelManager. However, the old utilites remain.

Because our payment logic has a number of tunable parameters and there are different ways to pay a BOLT11 invoice, we ended up with six different methods to pay or probe a BOLT11 invoice, with more requested as various options still were not exposed.

Instead, here, we replace all six methods with two simple ones which return the arguments which need to be passed to ChannelManager. Those arguments can be further tweaked before passing them on, allowing more flexibility.

`lightning-invoice` was historically responsible for actually
paying invoices, handling retries and everything. However, that
turned out to be buggy and hard to maintain, so the payment logic
was eventually moved into `ChannelManager`. However, the old
utilites remain.
Because our payment logic has a number of tunable parameters and
there are different ways to pay a BOLT11 invoice, we ended up with
six different methods to pay or probe a BOLT11 invoice, with more
requested as various options still were not exposed.
Instead, here, we replace all six methods with two simple ones
which return the arguments which need to be passed to
`ChannelManager`. Those arguments can be further tweaked before
passing them on, allowing more flexibility.
@codecov-commenter

codecov-commenter commented Nov 10, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 2 lines in your changes are missing coverage. Please review.

Comparison is base (6e40e5f) 88.80% compared to head (22305a9) 89.02%.
Report is 2 commits behind head on main.

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2727 +/- ##
==========================================
+ Coverage 88.80% 89.02% +0.22% 
==========================================
Files 113 113 Lines 89170 89871 +701 Branches 89170 89871 +701 ==========================================
+ Hits 79188 80009 +821 + Misses 7729 7596 -133 - Partials 2253 2266 +13 
FilesCoverage Δ
lightning-invoice/src/payment.rs96.45% <96.42%> (+19.38%)⬆️

... and 13 files with indirect coverage changes

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

Comment threadlightning-invoice/src/payment.rs Outdated
@benthecarman

Copy link
Copy Markdown
Contributor

I think this closes #2390

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

#2390 is about send_payment_with_path (and friends), not this. I actually thought about doing that in the same PR as well but its a bit more annoying since its used everywhere in tests.

Since there's a much simpler way to go about it with
`Bolt11Invoice::expires_at`.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-11-better-bolt11-utils branch from cbf5fed to 22305a9CompareNovember 12, 2023 17:18

@shaavanshaavan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ACK

The maze has been successfully navigated!

The latest sets of functions have been clarified, making optimal use of common functions wherever possible.
Additionally, the code is also well-documented.

I have also added a summary of my analysis of this PR, which can potentially help fellow contributors in their review process.

Summary:

Let's break it down function by function:

  1. Simplifying Invoice Handling:
    • pay_zero_value_invoice has been replaced with payment_parameters_from_zero_amount_invoice.
      • Removed retry strategy and ChannelManager from params.
      • Switched to using params_from_invoice instead of the convoluted pay_zero_value_invoice_with_id.
      • Added a check for a zero-amount invoice, eliminating the need for another function (pay_zero_value_invoice_with_id).
  2. Cleaner Invoice Payment Process:
    • pay_zero_value_invoice_with_id has been removed.
    • pay_invoice_using_amount is now replaced with payment_parameters_from_invoice.
      • Instead of paying within this function, the process is sent to a common params_from_invoice function, reducing complexity.
      • The function now returns payment-related values upstream.
  3. Streamlining Probing Functions:
    • preflight_probe_invoice and preflight_probe_zero_value_invoice have been removed, as ChannelManager now handles the probing previously done here.
  4. Enhancing Code Structure:
    • Removed expiry_time_from_unix_epoch function, now using with_expiry_time defined within Payment Parameters.
  5. Testing Improvements:
    • Removed invoice and zero_value_invoice helper functions used in testing. Respective invoices are now created in their test functions.

Comment threadlightning-invoice/src/payment.rs

@valentinewallacevalentinewallace 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 wait on @G8XSU's ACK before landing.

@G8XSU
G8XSU merged commit 0456b0e into lightningdevkit:mainNov 14, 2023
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.

6 participants

@TheBlueMatt@codecov-commenter@benthecarman@G8XSU@valentinewallace@shaavan
, '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

Replace maze of BOLT11 payment utilities with parameter generators - #2727

Merged
G8XSU merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-11-better-bolt11-utils
Nov 14, 2023
Merged

Replace maze of BOLT11 payment utilities with parameter generators#2727
G8XSU merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-11-better-bolt11-utils

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

lightning-invoice was historically responsible for actually paying invoices, handling retries and everything. However, that turned out to be buggy and hard to maintain, so the payment logic was eventually moved into ChannelManager. However, the old utilites remain.

Because our payment logic has a number of tunable parameters and there are different ways to pay a BOLT11 invoice, we ended up with six different methods to pay or probe a BOLT11 invoice, with more requested as various options still were not exposed.

Instead, here, we replace all six methods with two simple ones which return the arguments which need to be passed to ChannelManager. Those arguments can be further tweaked before passing them on, allowing more flexibility.

`lightning-invoice` was historically responsible for actually
paying invoices, handling retries and everything. However, that
turned out to be buggy and hard to maintain, so the payment logic
was eventually moved into `ChannelManager`. However, the old
utilites remain.
Because our payment logic has a number of tunable parameters and
there are different ways to pay a BOLT11 invoice, we ended up with
six different methods to pay or probe a BOLT11 invoice, with more
requested as various options still were not exposed.
Instead, here, we replace all six methods with two simple ones
which return the arguments which need to be passed to
`ChannelManager`. Those arguments can be further tweaked before
passing them on, allowing more flexibility.
@codecov-commenter

codecov-commenter commented Nov 10, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 2 lines in your changes are missing coverage. Please review.

Comparison is base (6e40e5f) 88.80% compared to head (22305a9) 89.02%.
Report is 2 commits behind head on main.

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2727 +/- ##
==========================================
+ Coverage 88.80% 89.02% +0.22% 
==========================================
Files 113 113 Lines 89170 89871 +701 Branches 89170 89871 +701 ==========================================
+ Hits 79188 80009 +821 + Misses 7729 7596 -133 - Partials 2253 2266 +13 
FilesCoverage Δ
lightning-invoice/src/payment.rs96.45% <96.42%> (+19.38%)⬆️

... and 13 files with indirect coverage changes

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

Comment threadlightning-invoice/src/payment.rs Outdated
@benthecarman

Copy link
Copy Markdown
Contributor

I think this closes #2390

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

#2390 is about send_payment_with_path (and friends), not this. I actually thought about doing that in the same PR as well but its a bit more annoying since its used everywhere in tests.

Since there's a much simpler way to go about it with
`Bolt11Invoice::expires_at`.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-11-better-bolt11-utils branch from cbf5fed to 22305a9CompareNovember 12, 2023 17:18

@shaavanshaavan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ACK

The maze has been successfully navigated!

The latest sets of functions have been clarified, making optimal use of common functions wherever possible.
Additionally, the code is also well-documented.

I have also added a summary of my analysis of this PR, which can potentially help fellow contributors in their review process.

Summary:

Let's break it down function by function:

  1. Simplifying Invoice Handling:
    • pay_zero_value_invoice has been replaced with payment_parameters_from_zero_amount_invoice.
      • Removed retry strategy and ChannelManager from params.
      • Switched to using params_from_invoice instead of the convoluted pay_zero_value_invoice_with_id.
      • Added a check for a zero-amount invoice, eliminating the need for another function (pay_zero_value_invoice_with_id).
  2. Cleaner Invoice Payment Process:
    • pay_zero_value_invoice_with_id has been removed.
    • pay_invoice_using_amount is now replaced with payment_parameters_from_invoice.
      • Instead of paying within this function, the process is sent to a common params_from_invoice function, reducing complexity.
      • The function now returns payment-related values upstream.
  3. Streamlining Probing Functions:
    • preflight_probe_invoice and preflight_probe_zero_value_invoice have been removed, as ChannelManager now handles the probing previously done here.
  4. Enhancing Code Structure:
    • Removed expiry_time_from_unix_epoch function, now using with_expiry_time defined within Payment Parameters.
  5. Testing Improvements:
    • Removed invoice and zero_value_invoice helper functions used in testing. Respective invoices are now created in their test functions.

Comment threadlightning-invoice/src/payment.rs

@valentinewallacevalentinewallace 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 wait on @G8XSU's ACK before landing.

@G8XSU
G8XSU merged commit 0456b0e into lightningdevkit:mainNov 14, 2023
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.

6 participants

@TheBlueMatt@codecov-commenter@benthecarman@G8XSU@valentinewallace@shaavan
, '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

Replace maze of BOLT11 payment utilities with parameter generators - #2727

Merged
G8XSU merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-11-better-bolt11-utils
Nov 14, 2023
Merged

Replace maze of BOLT11 payment utilities with parameter generators#2727
G8XSU merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2023-11-better-bolt11-utils

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

lightning-invoice was historically responsible for actually paying invoices, handling retries and everything. However, that turned out to be buggy and hard to maintain, so the payment logic was eventually moved into ChannelManager. However, the old utilites remain.

Because our payment logic has a number of tunable parameters and there are different ways to pay a BOLT11 invoice, we ended up with six different methods to pay or probe a BOLT11 invoice, with more requested as various options still were not exposed.

Instead, here, we replace all six methods with two simple ones which return the arguments which need to be passed to ChannelManager. Those arguments can be further tweaked before passing them on, allowing more flexibility.

`lightning-invoice` was historically responsible for actually
paying invoices, handling retries and everything. However, that
turned out to be buggy and hard to maintain, so the payment logic
was eventually moved into `ChannelManager`. However, the old
utilites remain.
Because our payment logic has a number of tunable parameters and
there are different ways to pay a BOLT11 invoice, we ended up with
six different methods to pay or probe a BOLT11 invoice, with more
requested as various options still were not exposed.
Instead, here, we replace all six methods with two simple ones
which return the arguments which need to be passed to
`ChannelManager`. Those arguments can be further tweaked before
passing them on, allowing more flexibility.
@codecov-commenter

codecov-commenter commented Nov 10, 2023

Copy link
Copy Markdown

Codecov Report

Attention: 2 lines in your changes are missing coverage. Please review.

Comparison is base (6e40e5f) 88.80% compared to head (22305a9) 89.02%.
Report is 2 commits behind head on main.

❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@ Coverage Diff @@## main #2727 +/- ##
==========================================
+ Coverage 88.80% 89.02% +0.22% 
==========================================
Files 113 113 Lines 89170 89871 +701 Branches 89170 89871 +701 ==========================================
+ Hits 79188 80009 +821 + Misses 7729 7596 -133 - Partials 2253 2266 +13 
FilesCoverage Δ
lightning-invoice/src/payment.rs96.45% <96.42%> (+19.38%)⬆️

... and 13 files with indirect coverage changes

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

Comment threadlightning-invoice/src/payment.rs Outdated
@benthecarman

Copy link
Copy Markdown
Contributor

I think this closes #2390

@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

#2390 is about send_payment_with_path (and friends), not this. I actually thought about doing that in the same PR as well but its a bit more annoying since its used everywhere in tests.

Since there's a much simpler way to go about it with
`Bolt11Invoice::expires_at`.
@TheBlueMatt
TheBlueMattforce-pushed the 2023-11-better-bolt11-utils branch from cbf5fed to 22305a9CompareNovember 12, 2023 17:18

@shaavanshaavan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ACK

The maze has been successfully navigated!

The latest sets of functions have been clarified, making optimal use of common functions wherever possible.
Additionally, the code is also well-documented.

I have also added a summary of my analysis of this PR, which can potentially help fellow contributors in their review process.

Summary:

Let's break it down function by function:

  1. Simplifying Invoice Handling:
    • pay_zero_value_invoice has been replaced with payment_parameters_from_zero_amount_invoice.
      • Removed retry strategy and ChannelManager from params.
      • Switched to using params_from_invoice instead of the convoluted pay_zero_value_invoice_with_id.
      • Added a check for a zero-amount invoice, eliminating the need for another function (pay_zero_value_invoice_with_id).
  2. Cleaner Invoice Payment Process:
    • pay_zero_value_invoice_with_id has been removed.
    • pay_invoice_using_amount is now replaced with payment_parameters_from_invoice.
      • Instead of paying within this function, the process is sent to a common params_from_invoice function, reducing complexity.
      • The function now returns payment-related values upstream.
  3. Streamlining Probing Functions:
    • preflight_probe_invoice and preflight_probe_zero_value_invoice have been removed, as ChannelManager now handles the probing previously done here.
  4. Enhancing Code Structure:
    • Removed expiry_time_from_unix_epoch function, now using with_expiry_time defined within Payment Parameters.
  5. Testing Improvements:
    • Removed invoice and zero_value_invoice helper functions used in testing. Respective invoices are now created in their test functions.

Comment threadlightning-invoice/src/payment.rs

@valentinewallacevalentinewallace 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 wait on @G8XSU's ACK before landing.

@G8XSU
G8XSU merged commit 0456b0e into lightningdevkit:mainNov 14, 2023
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.

6 participants

@TheBlueMatt@codecov-commenter@benthecarman@G8XSU@valentinewallace@shaavan