Refactor interactive-tx construction and uses - #4123

Merged
wpaulino merged 6 commits into
lightningdevkit:mainfrom
jkczyz:2025-09-negotiation-error
Oct 1, 2025
Merged

Refactor interactive-tx construction and uses#4123
wpaulino merged 6 commits into
lightningdevkit:mainfrom
jkczyz:2025-09-negotiation-error

Conversation

@jkczyz

@jkczyzjkczyz commented Sep 25, 2025

Copy link
Copy Markdown
Contributor

Interactive transaction construction currently fails with an AbortReason. However, in order to produce SpliceFailed events in #4077, the contributed inputs and outputs need to be accessible. That is, they cannot be consumed if returning an error. This PR refactors interactive-tx construction code and uses to avoid consuming InteractiveTxConstruction until all error checking has completed.

An upcoming commit will include the contributed inputs and outputs in
an error whenever ConstructedTransaction::new fails. In order to DRY up
that logic, this commit updates the constructor to create the resulting
object prior to performing any checks. This way a conversion method can
be added that extracts the necessary input and output data.
Both NegotiationContext::validate_tx and ConstructedTransaction::new
contain validity checks. Move the former into the latter in order to
consolidate the checks in a single place. This will also allow for
reusing error construction in an upcoming commit.
@ldk-reviews-bot

ldk-reviews-bot commented Sep 25, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @wpaulino as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@jkczyzjkczyz self-assigned this Sep 25, 2025
@jkczyzjkczyz added this to the 0.2 milestone Sep 25, 2025
@jkczyz
jkczyzforce-pushed the 2025-09-negotiation-error branch from a7638af to 59f7debCompareSeptember 25, 2025 02:15
@codecov

codecovBot commented Sep 25, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 61.01695% with 92 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.59%. Comparing base (dea125a) to head (0956efd).
⚠️ Report is 64 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/interactivetxs.rs65.43%55 Missing and 1 partial ⚠️
lightning/src/ln/channel.rs51.35%34 Missing and 2 partials ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #4123 +/- ##
==========================================
+ Coverage 88.50% 88.59% +0.08% 
==========================================
Files 179 180 +1 Lines 134270 134977 +707 Branches 134270 134977 +707 ==========================================
+ Hits 118837 119584 +747 + Misses 12682 12631 -51 - Partials 2751 2762 +11 
FlagCoverage Δ
fuzzing21.73% <0.00%> (-0.06%)⬇️
tests88.43% <61.01%> (+0.09%)⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ 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.

wpaulino
wpaulino previously approved these changes Sep 25, 2025
Comment threadlightning/src/ln/channel.rs Outdated
None => Err(AbortReason::InternalError(
"Received unexpected interactive transaction negotiation message",
)),
None => Err(NegotiationError {

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.

Relevant for the follow-up PR: we should be careful to not emit a SpliceFailed event here. We probably only should when pending_splice.is_some().

@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.

Instead of popping each input and output to contribute during an
interactive tx session, clone the necessary parts and keep around the
original inputs and outputs. This will let us reuse them later when
constructing an error. The tradeoff is using additional memory to avoid
more code complexity required to extract the sent input and outputs from
NegotiationContext.
Currently, only the shared input index is stored in
ConstructedTransaction. This will be used later to filter out the shared
input when constructing an error during interactive tx negotiation.
Store the shared output index as well so that the shared output can be
filtered out as well.
The number of inputs allowed during an interactive-tx construction
session is limited to 4096, so a u16 can be used instead of u32 when
serializing ConstructedTransaction.
InteractiveTxConstructor contains the users contributed inputs. When an
interactive tx sessions is aborted, the user will need to be notified
with an event indicating which inputs and outputs were contributed. This
allows them to re-use inputs that are no longer in use. This commit
ensures the InteractiveTxConstructor is only consumed after all error
checking. That way, in the case of a failure, we're able to produce an
event from its input data.
@jkczyz
jkczyzforce-pushed the 2025-09-negotiation-error branch from 18d3bd7 to 0956efdCompareSeptember 30, 2025 14:16
@jkczyzjkczyz changed the title Introduce NegotiationError for interactive-tx constructionsRefactor interactive-tx construction and usesSep 30, 2025
@wpaulino
wpaulino merged commit 81495c6 into lightningdevkit:mainOct 1, 2025
25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@jkczyz@ldk-reviews-bot@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

Refactor interactive-tx construction and uses - #4123

Merged
wpaulino merged 6 commits into
lightningdevkit:mainfrom
jkczyz:2025-09-negotiation-error
Oct 1, 2025
Merged

Refactor interactive-tx construction and uses#4123
wpaulino merged 6 commits into
lightningdevkit:mainfrom
jkczyz:2025-09-negotiation-error

Conversation

@jkczyz

@jkczyzjkczyz commented Sep 25, 2025

Copy link
Copy Markdown
Contributor

Interactive transaction construction currently fails with an AbortReason. However, in order to produce SpliceFailed events in #4077, the contributed inputs and outputs need to be accessible. That is, they cannot be consumed if returning an error. This PR refactors interactive-tx construction code and uses to avoid consuming InteractiveTxConstruction until all error checking has completed.

An upcoming commit will include the contributed inputs and outputs in
an error whenever ConstructedTransaction::new fails. In order to DRY up
that logic, this commit updates the constructor to create the resulting
object prior to performing any checks. This way a conversion method can
be added that extracts the necessary input and output data.
Both NegotiationContext::validate_tx and ConstructedTransaction::new
contain validity checks. Move the former into the latter in order to
consolidate the checks in a single place. This will also allow for
reusing error construction in an upcoming commit.
@ldk-reviews-bot

ldk-reviews-bot commented Sep 25, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @wpaulino as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@jkczyzjkczyz self-assigned this Sep 25, 2025
@jkczyzjkczyz added this to the 0.2 milestone Sep 25, 2025
@jkczyz
jkczyzforce-pushed the 2025-09-negotiation-error branch from a7638af to 59f7debCompareSeptember 25, 2025 02:15
@codecov

codecovBot commented Sep 25, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 61.01695% with 92 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.59%. Comparing base (dea125a) to head (0956efd).
⚠️ Report is 64 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/interactivetxs.rs65.43%55 Missing and 1 partial ⚠️
lightning/src/ln/channel.rs51.35%34 Missing and 2 partials ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #4123 +/- ##
==========================================
+ Coverage 88.50% 88.59% +0.08% 
==========================================
Files 179 180 +1 Lines 134270 134977 +707 Branches 134270 134977 +707 ==========================================
+ Hits 118837 119584 +747 + Misses 12682 12631 -51 - Partials 2751 2762 +11 
FlagCoverage Δ
fuzzing21.73% <0.00%> (-0.06%)⬇️
tests88.43% <61.01%> (+0.09%)⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ 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.

wpaulino
wpaulino previously approved these changes Sep 25, 2025
Comment threadlightning/src/ln/channel.rs Outdated
None => Err(AbortReason::InternalError(
"Received unexpected interactive transaction negotiation message",
)),
None => Err(NegotiationError {

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.

Relevant for the follow-up PR: we should be careful to not emit a SpliceFailed event here. We probably only should when pending_splice.is_some().

@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.

Instead of popping each input and output to contribute during an
interactive tx session, clone the necessary parts and keep around the
original inputs and outputs. This will let us reuse them later when
constructing an error. The tradeoff is using additional memory to avoid
more code complexity required to extract the sent input and outputs from
NegotiationContext.
Currently, only the shared input index is stored in
ConstructedTransaction. This will be used later to filter out the shared
input when constructing an error during interactive tx negotiation.
Store the shared output index as well so that the shared output can be
filtered out as well.
The number of inputs allowed during an interactive-tx construction
session is limited to 4096, so a u16 can be used instead of u32 when
serializing ConstructedTransaction.
InteractiveTxConstructor contains the users contributed inputs. When an
interactive tx sessions is aborted, the user will need to be notified
with an event indicating which inputs and outputs were contributed. This
allows them to re-use inputs that are no longer in use. This commit
ensures the InteractiveTxConstructor is only consumed after all error
checking. That way, in the case of a failure, we're able to produce an
event from its input data.
@jkczyz
jkczyzforce-pushed the 2025-09-negotiation-error branch from 18d3bd7 to 0956efdCompareSeptember 30, 2025 14:16
@jkczyzjkczyz changed the title Introduce NegotiationError for interactive-tx constructionsRefactor interactive-tx construction and usesSep 30, 2025
@wpaulino
wpaulino merged commit 81495c6 into lightningdevkit:mainOct 1, 2025
25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@jkczyz@ldk-reviews-bot@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

Refactor interactive-tx construction and uses - #4123

Merged
wpaulino merged 6 commits into
lightningdevkit:mainfrom
jkczyz:2025-09-negotiation-error
Oct 1, 2025
Merged

Refactor interactive-tx construction and uses#4123
wpaulino merged 6 commits into
lightningdevkit:mainfrom
jkczyz:2025-09-negotiation-error

Conversation

@jkczyz

@jkczyzjkczyz commented Sep 25, 2025

Copy link
Copy Markdown
Contributor

Interactive transaction construction currently fails with an AbortReason. However, in order to produce SpliceFailed events in #4077, the contributed inputs and outputs need to be accessible. That is, they cannot be consumed if returning an error. This PR refactors interactive-tx construction code and uses to avoid consuming InteractiveTxConstruction until all error checking has completed.

An upcoming commit will include the contributed inputs and outputs in
an error whenever ConstructedTransaction::new fails. In order to DRY up
that logic, this commit updates the constructor to create the resulting
object prior to performing any checks. This way a conversion method can
be added that extracts the necessary input and output data.
Both NegotiationContext::validate_tx and ConstructedTransaction::new
contain validity checks. Move the former into the latter in order to
consolidate the checks in a single place. This will also allow for
reusing error construction in an upcoming commit.
@ldk-reviews-bot

ldk-reviews-bot commented Sep 25, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @wpaulino as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@jkczyzjkczyz self-assigned this Sep 25, 2025
@jkczyzjkczyz added this to the 0.2 milestone Sep 25, 2025
@jkczyz
jkczyzforce-pushed the 2025-09-negotiation-error branch from a7638af to 59f7debCompareSeptember 25, 2025 02:15
@codecov

codecovBot commented Sep 25, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 61.01695% with 92 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.59%. Comparing base (dea125a) to head (0956efd).
⚠️ Report is 64 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/interactivetxs.rs65.43%55 Missing and 1 partial ⚠️
lightning/src/ln/channel.rs51.35%34 Missing and 2 partials ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #4123 +/- ##
==========================================
+ Coverage 88.50% 88.59% +0.08% 
==========================================
Files 179 180 +1 Lines 134270 134977 +707 Branches 134270 134977 +707 ==========================================
+ Hits 118837 119584 +747 + Misses 12682 12631 -51 - Partials 2751 2762 +11 
FlagCoverage Δ
fuzzing21.73% <0.00%> (-0.06%)⬇️
tests88.43% <61.01%> (+0.09%)⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ 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.

wpaulino
wpaulino previously approved these changes Sep 25, 2025
Comment threadlightning/src/ln/channel.rs Outdated
None => Err(AbortReason::InternalError(
"Received unexpected interactive transaction negotiation message",
)),
None => Err(NegotiationError {

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.

Relevant for the follow-up PR: we should be careful to not emit a SpliceFailed event here. We probably only should when pending_splice.is_some().

@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.

Instead of popping each input and output to contribute during an
interactive tx session, clone the necessary parts and keep around the
original inputs and outputs. This will let us reuse them later when
constructing an error. The tradeoff is using additional memory to avoid
more code complexity required to extract the sent input and outputs from
NegotiationContext.
Currently, only the shared input index is stored in
ConstructedTransaction. This will be used later to filter out the shared
input when constructing an error during interactive tx negotiation.
Store the shared output index as well so that the shared output can be
filtered out as well.
The number of inputs allowed during an interactive-tx construction
session is limited to 4096, so a u16 can be used instead of u32 when
serializing ConstructedTransaction.
InteractiveTxConstructor contains the users contributed inputs. When an
interactive tx sessions is aborted, the user will need to be notified
with an event indicating which inputs and outputs were contributed. This
allows them to re-use inputs that are no longer in use. This commit
ensures the InteractiveTxConstructor is only consumed after all error
checking. That way, in the case of a failure, we're able to produce an
event from its input data.
@jkczyz
jkczyzforce-pushed the 2025-09-negotiation-error branch from 18d3bd7 to 0956efdCompareSeptember 30, 2025 14:16
@jkczyzjkczyz changed the title Introduce NegotiationError for interactive-tx constructionsRefactor interactive-tx construction and usesSep 30, 2025
@wpaulino
wpaulino merged commit 81495c6 into lightningdevkit:mainOct 1, 2025
25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@jkczyz@ldk-reviews-bot@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

Refactor interactive-tx construction and uses - #4123

Merged
wpaulino merged 6 commits into
lightningdevkit:mainfrom
jkczyz:2025-09-negotiation-error
Oct 1, 2025
Merged

Refactor interactive-tx construction and uses#4123
wpaulino merged 6 commits into
lightningdevkit:mainfrom
jkczyz:2025-09-negotiation-error

Conversation

@jkczyz

@jkczyzjkczyz commented Sep 25, 2025

Copy link
Copy Markdown
Contributor

Interactive transaction construction currently fails with an AbortReason. However, in order to produce SpliceFailed events in #4077, the contributed inputs and outputs need to be accessible. That is, they cannot be consumed if returning an error. This PR refactors interactive-tx construction code and uses to avoid consuming InteractiveTxConstruction until all error checking has completed.

An upcoming commit will include the contributed inputs and outputs in
an error whenever ConstructedTransaction::new fails. In order to DRY up
that logic, this commit updates the constructor to create the resulting
object prior to performing any checks. This way a conversion method can
be added that extracts the necessary input and output data.
Both NegotiationContext::validate_tx and ConstructedTransaction::new
contain validity checks. Move the former into the latter in order to
consolidate the checks in a single place. This will also allow for
reusing error construction in an upcoming commit.
@ldk-reviews-bot

ldk-reviews-bot commented Sep 25, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @wpaulino as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@jkczyzjkczyz self-assigned this Sep 25, 2025
@jkczyzjkczyz added this to the 0.2 milestone Sep 25, 2025
@jkczyz
jkczyzforce-pushed the 2025-09-negotiation-error branch from a7638af to 59f7debCompareSeptember 25, 2025 02:15
@codecov

codecovBot commented Sep 25, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 61.01695% with 92 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.59%. Comparing base (dea125a) to head (0956efd).
⚠️ Report is 64 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/interactivetxs.rs65.43%55 Missing and 1 partial ⚠️
lightning/src/ln/channel.rs51.35%34 Missing and 2 partials ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #4123 +/- ##
==========================================
+ Coverage 88.50% 88.59% +0.08% 
==========================================
Files 179 180 +1 Lines 134270 134977 +707 Branches 134270 134977 +707 ==========================================
+ Hits 118837 119584 +747 + Misses 12682 12631 -51 - Partials 2751 2762 +11 
FlagCoverage Δ
fuzzing21.73% <0.00%> (-0.06%)⬇️
tests88.43% <61.01%> (+0.09%)⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ 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.

wpaulino
wpaulino previously approved these changes Sep 25, 2025
Comment threadlightning/src/ln/channel.rs Outdated
None => Err(AbortReason::InternalError(
"Received unexpected interactive transaction negotiation message",
)),
None => Err(NegotiationError {

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.

Relevant for the follow-up PR: we should be careful to not emit a SpliceFailed event here. We probably only should when pending_splice.is_some().

@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.

Instead of popping each input and output to contribute during an
interactive tx session, clone the necessary parts and keep around the
original inputs and outputs. This will let us reuse them later when
constructing an error. The tradeoff is using additional memory to avoid
more code complexity required to extract the sent input and outputs from
NegotiationContext.
Currently, only the shared input index is stored in
ConstructedTransaction. This will be used later to filter out the shared
input when constructing an error during interactive tx negotiation.
Store the shared output index as well so that the shared output can be
filtered out as well.
The number of inputs allowed during an interactive-tx construction
session is limited to 4096, so a u16 can be used instead of u32 when
serializing ConstructedTransaction.
InteractiveTxConstructor contains the users contributed inputs. When an
interactive tx sessions is aborted, the user will need to be notified
with an event indicating which inputs and outputs were contributed. This
allows them to re-use inputs that are no longer in use. This commit
ensures the InteractiveTxConstructor is only consumed after all error
checking. That way, in the case of a failure, we're able to produce an
event from its input data.
@jkczyz
jkczyzforce-pushed the 2025-09-negotiation-error branch from 18d3bd7 to 0956efdCompareSeptember 30, 2025 14:16
@jkczyzjkczyz changed the title Introduce NegotiationError for interactive-tx constructionsRefactor interactive-tx construction and usesSep 30, 2025
@wpaulino
wpaulino merged commit 81495c6 into lightningdevkit:mainOct 1, 2025
25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@jkczyz@ldk-reviews-bot@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

Refactor interactive-tx construction and uses - #4123

Merged
wpaulino merged 6 commits into
lightningdevkit:mainfrom
jkczyz:2025-09-negotiation-error
Oct 1, 2025
Merged

Refactor interactive-tx construction and uses#4123
wpaulino merged 6 commits into
lightningdevkit:mainfrom
jkczyz:2025-09-negotiation-error

Conversation

@jkczyz

@jkczyzjkczyz commented Sep 25, 2025

Copy link
Copy Markdown
Contributor

Interactive transaction construction currently fails with an AbortReason. However, in order to produce SpliceFailed events in #4077, the contributed inputs and outputs need to be accessible. That is, they cannot be consumed if returning an error. This PR refactors interactive-tx construction code and uses to avoid consuming InteractiveTxConstruction until all error checking has completed.

An upcoming commit will include the contributed inputs and outputs in
an error whenever ConstructedTransaction::new fails. In order to DRY up
that logic, this commit updates the constructor to create the resulting
object prior to performing any checks. This way a conversion method can
be added that extracts the necessary input and output data.
Both NegotiationContext::validate_tx and ConstructedTransaction::new
contain validity checks. Move the former into the latter in order to
consolidate the checks in a single place. This will also allow for
reusing error construction in an upcoming commit.
@ldk-reviews-bot

ldk-reviews-bot commented Sep 25, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @wpaulino as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@jkczyzjkczyz self-assigned this Sep 25, 2025
@jkczyzjkczyz added this to the 0.2 milestone Sep 25, 2025
@jkczyz
jkczyzforce-pushed the 2025-09-negotiation-error branch from a7638af to 59f7debCompareSeptember 25, 2025 02:15
@codecov

codecovBot commented Sep 25, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 61.01695% with 92 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.59%. Comparing base (dea125a) to head (0956efd).
⚠️ Report is 64 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/interactivetxs.rs65.43%55 Missing and 1 partial ⚠️
lightning/src/ln/channel.rs51.35%34 Missing and 2 partials ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #4123 +/- ##
==========================================
+ Coverage 88.50% 88.59% +0.08% 
==========================================
Files 179 180 +1 Lines 134270 134977 +707 Branches 134270 134977 +707 ==========================================
+ Hits 118837 119584 +747 + Misses 12682 12631 -51 - Partials 2751 2762 +11 
FlagCoverage Δ
fuzzing21.73% <0.00%> (-0.06%)⬇️
tests88.43% <61.01%> (+0.09%)⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ 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.

wpaulino
wpaulino previously approved these changes Sep 25, 2025
Comment threadlightning/src/ln/channel.rs Outdated
None => Err(AbortReason::InternalError(
"Received unexpected interactive transaction negotiation message",
)),
None => Err(NegotiationError {

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.

Relevant for the follow-up PR: we should be careful to not emit a SpliceFailed event here. We probably only should when pending_splice.is_some().

@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.

Instead of popping each input and output to contribute during an
interactive tx session, clone the necessary parts and keep around the
original inputs and outputs. This will let us reuse them later when
constructing an error. The tradeoff is using additional memory to avoid
more code complexity required to extract the sent input and outputs from
NegotiationContext.
Currently, only the shared input index is stored in
ConstructedTransaction. This will be used later to filter out the shared
input when constructing an error during interactive tx negotiation.
Store the shared output index as well so that the shared output can be
filtered out as well.
The number of inputs allowed during an interactive-tx construction
session is limited to 4096, so a u16 can be used instead of u32 when
serializing ConstructedTransaction.
InteractiveTxConstructor contains the users contributed inputs. When an
interactive tx sessions is aborted, the user will need to be notified
with an event indicating which inputs and outputs were contributed. This
allows them to re-use inputs that are no longer in use. This commit
ensures the InteractiveTxConstructor is only consumed after all error
checking. That way, in the case of a failure, we're able to produce an
event from its input data.
@jkczyz
jkczyzforce-pushed the 2025-09-negotiation-error branch from 18d3bd7 to 0956efdCompareSeptember 30, 2025 14:16
@jkczyzjkczyz changed the title Introduce NegotiationError for interactive-tx constructionsRefactor interactive-tx construction and usesSep 30, 2025
@wpaulino
wpaulino merged commit 81495c6 into lightningdevkit:mainOct 1, 2025
25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@jkczyz@ldk-reviews-bot@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

Refactor interactive-tx construction and uses - #4123

Merged
wpaulino merged 6 commits into
lightningdevkit:mainfrom
jkczyz:2025-09-negotiation-error
Oct 1, 2025
Merged

Refactor interactive-tx construction and uses#4123
wpaulino merged 6 commits into
lightningdevkit:mainfrom
jkczyz:2025-09-negotiation-error

Conversation

@jkczyz

@jkczyzjkczyz commented Sep 25, 2025

Copy link
Copy Markdown
Contributor

Interactive transaction construction currently fails with an AbortReason. However, in order to produce SpliceFailed events in #4077, the contributed inputs and outputs need to be accessible. That is, they cannot be consumed if returning an error. This PR refactors interactive-tx construction code and uses to avoid consuming InteractiveTxConstruction until all error checking has completed.

An upcoming commit will include the contributed inputs and outputs in
an error whenever ConstructedTransaction::new fails. In order to DRY up
that logic, this commit updates the constructor to create the resulting
object prior to performing any checks. This way a conversion method can
be added that extracts the necessary input and output data.
Both NegotiationContext::validate_tx and ConstructedTransaction::new
contain validity checks. Move the former into the latter in order to
consolidate the checks in a single place. This will also allow for
reusing error construction in an upcoming commit.
@ldk-reviews-bot

ldk-reviews-bot commented Sep 25, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @wpaulino as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@jkczyzjkczyz self-assigned this Sep 25, 2025
@jkczyzjkczyz added this to the 0.2 milestone Sep 25, 2025
@jkczyz
jkczyzforce-pushed the 2025-09-negotiation-error branch from a7638af to 59f7debCompareSeptember 25, 2025 02:15
@codecov

codecovBot commented Sep 25, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 61.01695% with 92 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.59%. Comparing base (dea125a) to head (0956efd).
⚠️ Report is 64 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/interactivetxs.rs65.43%55 Missing and 1 partial ⚠️
lightning/src/ln/channel.rs51.35%34 Missing and 2 partials ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #4123 +/- ##
==========================================
+ Coverage 88.50% 88.59% +0.08% 
==========================================
Files 179 180 +1 Lines 134270 134977 +707 Branches 134270 134977 +707 ==========================================
+ Hits 118837 119584 +747 + Misses 12682 12631 -51 - Partials 2751 2762 +11 
FlagCoverage Δ
fuzzing21.73% <0.00%> (-0.06%)⬇️
tests88.43% <61.01%> (+0.09%)⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ 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.

wpaulino
wpaulino previously approved these changes Sep 25, 2025
Comment threadlightning/src/ln/channel.rs Outdated
None => Err(AbortReason::InternalError(
"Received unexpected interactive transaction negotiation message",
)),
None => Err(NegotiationError {

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.

Relevant for the follow-up PR: we should be careful to not emit a SpliceFailed event here. We probably only should when pending_splice.is_some().

@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.

Instead of popping each input and output to contribute during an
interactive tx session, clone the necessary parts and keep around the
original inputs and outputs. This will let us reuse them later when
constructing an error. The tradeoff is using additional memory to avoid
more code complexity required to extract the sent input and outputs from
NegotiationContext.
Currently, only the shared input index is stored in
ConstructedTransaction. This will be used later to filter out the shared
input when constructing an error during interactive tx negotiation.
Store the shared output index as well so that the shared output can be
filtered out as well.
The number of inputs allowed during an interactive-tx construction
session is limited to 4096, so a u16 can be used instead of u32 when
serializing ConstructedTransaction.
InteractiveTxConstructor contains the users contributed inputs. When an
interactive tx sessions is aborted, the user will need to be notified
with an event indicating which inputs and outputs were contributed. This
allows them to re-use inputs that are no longer in use. This commit
ensures the InteractiveTxConstructor is only consumed after all error
checking. That way, in the case of a failure, we're able to produce an
event from its input data.
@jkczyz
jkczyzforce-pushed the 2025-09-negotiation-error branch from 18d3bd7 to 0956efdCompareSeptember 30, 2025 14:16
@jkczyzjkczyz changed the title Introduce NegotiationError for interactive-tx constructionsRefactor interactive-tx construction and usesSep 30, 2025
@wpaulino
wpaulino merged commit 81495c6 into lightningdevkit:mainOct 1, 2025
25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@jkczyz@ldk-reviews-bot@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

Refactor interactive-tx construction and uses - #4123

Merged
wpaulino merged 6 commits into
lightningdevkit:mainfrom
jkczyz:2025-09-negotiation-error
Oct 1, 2025
Merged

Refactor interactive-tx construction and uses#4123
wpaulino merged 6 commits into
lightningdevkit:mainfrom
jkczyz:2025-09-negotiation-error

Conversation

@jkczyz

@jkczyzjkczyz commented Sep 25, 2025

Copy link
Copy Markdown
Contributor

Interactive transaction construction currently fails with an AbortReason. However, in order to produce SpliceFailed events in #4077, the contributed inputs and outputs need to be accessible. That is, they cannot be consumed if returning an error. This PR refactors interactive-tx construction code and uses to avoid consuming InteractiveTxConstruction until all error checking has completed.

An upcoming commit will include the contributed inputs and outputs in
an error whenever ConstructedTransaction::new fails. In order to DRY up
that logic, this commit updates the constructor to create the resulting
object prior to performing any checks. This way a conversion method can
be added that extracts the necessary input and output data.
Both NegotiationContext::validate_tx and ConstructedTransaction::new
contain validity checks. Move the former into the latter in order to
consolidate the checks in a single place. This will also allow for
reusing error construction in an upcoming commit.
@ldk-reviews-bot

ldk-reviews-bot commented Sep 25, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @wpaulino as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@jkczyzjkczyz self-assigned this Sep 25, 2025
@jkczyzjkczyz added this to the 0.2 milestone Sep 25, 2025
@jkczyz
jkczyzforce-pushed the 2025-09-negotiation-error branch from a7638af to 59f7debCompareSeptember 25, 2025 02:15
@codecov

codecovBot commented Sep 25, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 61.01695% with 92 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.59%. Comparing base (dea125a) to head (0956efd).
⚠️ Report is 64 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/interactivetxs.rs65.43%55 Missing and 1 partial ⚠️
lightning/src/ln/channel.rs51.35%34 Missing and 2 partials ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #4123 +/- ##
==========================================
+ Coverage 88.50% 88.59% +0.08% 
==========================================
Files 179 180 +1 Lines 134270 134977 +707 Branches 134270 134977 +707 ==========================================
+ Hits 118837 119584 +747 + Misses 12682 12631 -51 - Partials 2751 2762 +11 
FlagCoverage Δ
fuzzing21.73% <0.00%> (-0.06%)⬇️
tests88.43% <61.01%> (+0.09%)⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ 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.

wpaulino
wpaulino previously approved these changes Sep 25, 2025
Comment threadlightning/src/ln/channel.rs Outdated
None => Err(AbortReason::InternalError(
"Received unexpected interactive transaction negotiation message",
)),
None => Err(NegotiationError {

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.

Relevant for the follow-up PR: we should be careful to not emit a SpliceFailed event here. We probably only should when pending_splice.is_some().

@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.

Instead of popping each input and output to contribute during an
interactive tx session, clone the necessary parts and keep around the
original inputs and outputs. This will let us reuse them later when
constructing an error. The tradeoff is using additional memory to avoid
more code complexity required to extract the sent input and outputs from
NegotiationContext.
Currently, only the shared input index is stored in
ConstructedTransaction. This will be used later to filter out the shared
input when constructing an error during interactive tx negotiation.
Store the shared output index as well so that the shared output can be
filtered out as well.
The number of inputs allowed during an interactive-tx construction
session is limited to 4096, so a u16 can be used instead of u32 when
serializing ConstructedTransaction.
InteractiveTxConstructor contains the users contributed inputs. When an
interactive tx sessions is aborted, the user will need to be notified
with an event indicating which inputs and outputs were contributed. This
allows them to re-use inputs that are no longer in use. This commit
ensures the InteractiveTxConstructor is only consumed after all error
checking. That way, in the case of a failure, we're able to produce an
event from its input data.
@jkczyz
jkczyzforce-pushed the 2025-09-negotiation-error branch from 18d3bd7 to 0956efdCompareSeptember 30, 2025 14:16
@jkczyzjkczyz changed the title Introduce NegotiationError for interactive-tx constructionsRefactor interactive-tx construction and usesSep 30, 2025
@wpaulino
wpaulino merged commit 81495c6 into lightningdevkit:mainOct 1, 2025
25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@jkczyz@ldk-reviews-bot@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

Refactor interactive-tx construction and uses - #4123

Merged
wpaulino merged 6 commits into
lightningdevkit:mainfrom
jkczyz:2025-09-negotiation-error
Oct 1, 2025
Merged

Refactor interactive-tx construction and uses#4123
wpaulino merged 6 commits into
lightningdevkit:mainfrom
jkczyz:2025-09-negotiation-error

Conversation

@jkczyz

@jkczyzjkczyz commented Sep 25, 2025

Copy link
Copy Markdown
Contributor

Interactive transaction construction currently fails with an AbortReason. However, in order to produce SpliceFailed events in #4077, the contributed inputs and outputs need to be accessible. That is, they cannot be consumed if returning an error. This PR refactors interactive-tx construction code and uses to avoid consuming InteractiveTxConstruction until all error checking has completed.

An upcoming commit will include the contributed inputs and outputs in
an error whenever ConstructedTransaction::new fails. In order to DRY up
that logic, this commit updates the constructor to create the resulting
object prior to performing any checks. This way a conversion method can
be added that extracts the necessary input and output data.
Both NegotiationContext::validate_tx and ConstructedTransaction::new
contain validity checks. Move the former into the latter in order to
consolidate the checks in a single place. This will also allow for
reusing error construction in an upcoming commit.
@ldk-reviews-bot

ldk-reviews-bot commented Sep 25, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @wpaulino as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@jkczyzjkczyz self-assigned this Sep 25, 2025
@jkczyzjkczyz added this to the 0.2 milestone Sep 25, 2025
@jkczyz
jkczyzforce-pushed the 2025-09-negotiation-error branch from a7638af to 59f7debCompareSeptember 25, 2025 02:15
@codecov

codecovBot commented Sep 25, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 61.01695% with 92 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.59%. Comparing base (dea125a) to head (0956efd).
⚠️ Report is 64 commits behind head on main.

Files with missing linesPatch %Lines
lightning/src/ln/interactivetxs.rs65.43%55 Missing and 1 partial ⚠️
lightning/src/ln/channel.rs51.35%34 Missing and 2 partials ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #4123 +/- ##
==========================================
+ Coverage 88.50% 88.59% +0.08% 
==========================================
Files 179 180 +1 Lines 134270 134977 +707 Branches 134270 134977 +707 ==========================================
+ Hits 118837 119584 +747 + Misses 12682 12631 -51 - Partials 2751 2762 +11 
FlagCoverage Δ
fuzzing21.73% <0.00%> (-0.06%)⬇️
tests88.43% <61.01%> (+0.09%)⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ 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.

wpaulino
wpaulino previously approved these changes Sep 25, 2025
Comment threadlightning/src/ln/channel.rs Outdated
None => Err(AbortReason::InternalError(
"Received unexpected interactive transaction negotiation message",
)),
None => Err(NegotiationError {

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.

Relevant for the follow-up PR: we should be careful to not emit a SpliceFailed event here. We probably only should when pending_splice.is_some().

@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.

Instead of popping each input and output to contribute during an
interactive tx session, clone the necessary parts and keep around the
original inputs and outputs. This will let us reuse them later when
constructing an error. The tradeoff is using additional memory to avoid
more code complexity required to extract the sent input and outputs from
NegotiationContext.
Currently, only the shared input index is stored in
ConstructedTransaction. This will be used later to filter out the shared
input when constructing an error during interactive tx negotiation.
Store the shared output index as well so that the shared output can be
filtered out as well.
The number of inputs allowed during an interactive-tx construction
session is limited to 4096, so a u16 can be used instead of u32 when
serializing ConstructedTransaction.
InteractiveTxConstructor contains the users contributed inputs. When an
interactive tx sessions is aborted, the user will need to be notified
with an event indicating which inputs and outputs were contributed. This
allows them to re-use inputs that are no longer in use. This commit
ensures the InteractiveTxConstructor is only consumed after all error
checking. That way, in the case of a failure, we're able to produce an
event from its input data.
@jkczyz
jkczyzforce-pushed the 2025-09-negotiation-error branch from 18d3bd7 to 0956efdCompareSeptember 30, 2025 14:16
@jkczyzjkczyz changed the title Introduce NegotiationError for interactive-tx constructionsRefactor interactive-tx construction and usesSep 30, 2025
@wpaulino
wpaulino merged commit 81495c6 into lightningdevkit:mainOct 1, 2025
25 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@jkczyz@ldk-reviews-bot@wpaulino