Contribute funding inputs on accepting dual-funded channel - #3735

Closed
dunxen wants to merge 4 commits into
lightningdevkit:mainfrom
dunxen:2025-04-contributeinputs
Closed

Contribute funding inputs on accepting dual-funded channel#3735
dunxen wants to merge 4 commits into
lightningdevkit:mainfrom
dunxen:2025-04-contributeinputs

Conversation

@dunxen

@dunxendunxen commented Apr 15, 2025

Copy link
Copy Markdown
Contributor

We introduce a ChannelManager::accept_inbound_channel_with_contribution
method allowing contributing to the overall channel capacity of an inbound
dual-funded channel by contributing inputs.

@ldk-reviews-bot

ldk-reviews-bot commented Apr 15, 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.

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from e22fa33 to fabbf86CompareApril 25, 2025 18:20
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 4 times, most recently from c42f3d0 to 186d66bCompareMay 12, 2025 10:51
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 186d66b to c7d8e89CompareMay 19, 2025 11:07
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from c7d8e89 to 540b8a7CompareJune 12, 2025 08:40
@wpaulino

Copy link
Copy Markdown
Contributor

Looks like this needs a rebase after #3637

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 540b8a7 to 94bf848CompareJune 13, 2025 05:35
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Looks like this needs a rebase after #3637

ugh right!

@wpaulino

Copy link
Copy Markdown
Contributor

Don't the first three commits need to be dropped?

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 2 times, most recently from 67504f0 to 9f276d8CompareJune 17, 2025 10:40
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Just needs node reload tests but it can still get some initial review.

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 9f276d8 to 60f58b1CompareJune 17, 2025 16:26
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
script_pubkey: funding.get_funding_redeemscript().to_p2wsh(),
};

// Optionally add change output

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.

Wouldn't this already be covered by begin_interactive_funding_tx_construction?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Oh indeed. begin_interactive_funding_tx_construction was modified to include that in a previous pre-splicing work. Thanks.

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.

Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?

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.

Regarding locktime, maybe we just throw it in UnfundedChannelContext or directly in PendingV2Channel? Using FundingNegotiation may not be ideal given it has a variant (AwaitingSignatures) where the locktime is no longer available, even though we'd never have a PendingV2Channel in that state.

@jkczyzjkczyzNov 21, 2025

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.

As mentioned offline, I added a fixup to store the locktime directly in PendingV2Channel. Using UnfundedChannelContext won't work since it is used for v1 channels, too. I considered passing the locktime to the relevant method (get_open_channel_v2) after constructing the channel. However, that method is called in some other places, too.

Comment threadlightning/src/ln/channel.rs Outdated
};

// Optionally add change output
let change_script = signer_provider.get_destination_script(context.channel_keys_id)

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.

Maybe let the user optionally provide a change address along with their inputs?

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.

Done.

@jkczyz
jkczyz self-requested a review June 18, 2025 18:19
@wpaulino

Copy link
Copy Markdown
Contributor

Since the FundingTransactionReadyForSigning work is also relevant for splicing (though it will need some minor additional changes), maybe we should split it up from the inbound contribution work, so that we can unblock testing on the splicing side once #3736 lands.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

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

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Since the FundingTransactionReadyForSigning work is also relevant for splicing (though it will need some minor additional changes), maybe we should split it up from the inbound contribution work, so that we can unblock testing on the splicing side once #3736 lands.

Agreed. Apologies for the late response. Back home now. I'll split it into a separate PR and we can discuss changes.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

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

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 2 times, most recently from 9a2a5ce to 8006303CompareJune 27, 2025 07:19
@codecov

codecovBot commented Jun 27, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 96.96133% with 11 lines in your changes missing coverage. Please review.
✅ Project coverage is 89.61%. Comparing base (9150bc8) to head (fe940d6).

Files with missing linesPatch %Lines
lightning/src/ln/dual_funding_tests.rs97.96%5 Missing and 1 partial ⚠️
lightning/src/ln/channel.rs91.66%0 Missing and 3 partials ⚠️
lightning/src/ln/channelmanager.rs90.90%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3735 +/- ##
==========================================
+ Coverage 89.32% 89.61% +0.29% 
==========================================
Files 180 181 +1 Lines 138176 138525 +349 Branches 138176 138525 +349 ==========================================
+ Hits 123424 124141 +717 + Misses 12137 11774 -363 + Partials 2615 2610 -5 
FlagCoverage Δ
fuzzing33.65% <10.00%> (+0.03%)⬆️
tests89.00% <96.96%> (+0.29%)⬆️

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.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

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

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Sorry, long time. This needs a super rebase. I see #1621 was closed. Do we need another issue for dual-funding tracking?

@jkczyz

Copy link
Copy Markdown
Contributor

Sorry, long time. This needs a super rebase. I see #1621 was closed. Do we need another issue for dual-funding tracking?

Yeah, probably best to use a fresh issue than re-open an older one that's accumulated the splicing work.

@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from c059e03 to fe940d6CompareNovember 11, 2025 22:40
@jkczyz

Copy link
Copy Markdown
Contributor

Rebased! Will take over the PR from here 🫡

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Rebased! Will take over the PR from here 🫡

Thanks, @jkczyz! I will be able to give some review this week. Blocked out some space for it.

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Just looked through the docs/comments and hope they are still valid since this PR was opened.

dunxenand others added 2 commits November 20, 2025 11:30
…annel
We introduce a `ChannelManager::accept_inbound_channel_with_contribution`
method allowing contributing to the overall channel capacity of an inbound
dual-funded channel by contributing inputs.
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines +9871 to +9872
/// portion of the channel value. Our contribution will be calculated as the total value of these
/// inputs minus the fees we need to cover for the interactive funding transaction. The witness

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.

This actually isn't accurate. The contribution is given by our_funding_satoshis, while funding_inputs must have enough for that plus any fees. The remaining value should go to change. Updated the docs accordingly.

Comment threadlightning/src/ln/channel.rs Outdated
script_pubkey: funding.get_funding_redeemscript().to_p2wsh(),
};

// Optionally add change output

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.

Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?

Comment threadlightning/src/ln/channel.rs Outdated
};

// Optionally add change output
let change_script = signer_provider.get_destination_script(context.channel_keys_id)

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.

Done.

@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from fe940d6 to ed4d8a5CompareNovember 20, 2025 17:32
@jkczyz
jkczyz requested a review from wpaulinoNovember 20, 2025 17:33
jkczyzand others added 2 commits November 20, 2025 19:30
We can now run through the case where the acceptor contributes to an
inbound channel, with either more value in inputs, or less value, leading
to a different `tx_signatures` exchange order.
We also cannot use dummy P2WPKH funding inputs and witnesses anymore as
`funding_transaction_signed` internally verifies signatures. Hence, we
create external keypairs that we can create outputs for and sign with.
@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from ed4d8a5 to 9a04ed0CompareNovember 21, 2025 23:06
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 5th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 6th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 7th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 8th Reminder

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

Comment on lines +14197 to +14198
funding_negotiation_context: None,
interactive_tx_constructor: Some(interactive_tx_constructor),

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.

Would be nice to reuse FundingNegotiation here, but it seems unclear whether the last AwaitingSignatures state can be adapted to the initial dual funding state


// TODO(dual_funding): Use real node and API for creating V2 channels as initiator when available,
// instead of manually constructing messages.
fn do_test_v2_channel_establishment(session: V2ChannelEstablishmentTestSession) {

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.

Let's just drop these until we can use the real API?

pub fn accept_inbound_channel_with_contribution(
&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey,
user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>,
our_funding_contribution: Amount, funding_inputs: Vec<FundingTxInput>,

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.

We're also allowed to include outputs, behaving similar to the mixed mode splice, so maybe it's worth waiting until we figure that out in #4261 so we can adopt it here?

@jkczyzjkczyz mentioned this pull request Mar 19, 2026
50 tasks
@ldk-reviews-bot

Copy link
Copy Markdown

Hi @dunxen,

Thanks for your contributions to rust-lightning!

After too many struggles with bugs, outages, contributor bans, and, finally, a multi-week CI ban, the rust-lightning project is moving off of GitHub for day-to-day development.

You can still file issues and access the git tree here, but PRs will now take place exclusively at https://git.rust-bitcoin.org/. As such, this PR has been migrated to https://git.rust-bitcoin.org/lightningdevkit/rust-lightning/pulls/3735

If you log in using GitHub (or otherwise link your GitHub account from https://git.rust-bitcoin.org/user/settings/security), ownership of your PRs, issues, and comments will automatically transfer. To push updates to this PR, you'll need to use git push git@gitea-ssh.bitcoin.ninja:lightningdevkit/rust-lightning YOUR_LOCAL_COMMIT_OR_BRANCH:dunxen/2025-04-contributeinputs. This may require a permissions change - if it doesn't work initially just leave a comment and we'll get you access.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@dunxen@ldk-reviews-bot@wpaulino@jkczyz
, '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

Contribute funding inputs on accepting dual-funded channel - #3735

Closed
dunxen wants to merge 4 commits into
lightningdevkit:mainfrom
dunxen:2025-04-contributeinputs
Closed

Contribute funding inputs on accepting dual-funded channel#3735
dunxen wants to merge 4 commits into
lightningdevkit:mainfrom
dunxen:2025-04-contributeinputs

Conversation

@dunxen

@dunxendunxen commented Apr 15, 2025

Copy link
Copy Markdown
Contributor

We introduce a ChannelManager::accept_inbound_channel_with_contribution
method allowing contributing to the overall channel capacity of an inbound
dual-funded channel by contributing inputs.

@ldk-reviews-bot

ldk-reviews-bot commented Apr 15, 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.

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from e22fa33 to fabbf86CompareApril 25, 2025 18:20
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 4 times, most recently from c42f3d0 to 186d66bCompareMay 12, 2025 10:51
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 186d66b to c7d8e89CompareMay 19, 2025 11:07
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from c7d8e89 to 540b8a7CompareJune 12, 2025 08:40
@wpaulino

Copy link
Copy Markdown
Contributor

Looks like this needs a rebase after #3637

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 540b8a7 to 94bf848CompareJune 13, 2025 05:35
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Looks like this needs a rebase after #3637

ugh right!

@wpaulino

Copy link
Copy Markdown
Contributor

Don't the first three commits need to be dropped?

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 2 times, most recently from 67504f0 to 9f276d8CompareJune 17, 2025 10:40
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Just needs node reload tests but it can still get some initial review.

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 9f276d8 to 60f58b1CompareJune 17, 2025 16:26
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
script_pubkey: funding.get_funding_redeemscript().to_p2wsh(),
};

// Optionally add change output

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.

Wouldn't this already be covered by begin_interactive_funding_tx_construction?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Oh indeed. begin_interactive_funding_tx_construction was modified to include that in a previous pre-splicing work. Thanks.

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.

Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?

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.

Regarding locktime, maybe we just throw it in UnfundedChannelContext or directly in PendingV2Channel? Using FundingNegotiation may not be ideal given it has a variant (AwaitingSignatures) where the locktime is no longer available, even though we'd never have a PendingV2Channel in that state.

@jkczyzjkczyzNov 21, 2025

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.

As mentioned offline, I added a fixup to store the locktime directly in PendingV2Channel. Using UnfundedChannelContext won't work since it is used for v1 channels, too. I considered passing the locktime to the relevant method (get_open_channel_v2) after constructing the channel. However, that method is called in some other places, too.

Comment threadlightning/src/ln/channel.rs Outdated
};

// Optionally add change output
let change_script = signer_provider.get_destination_script(context.channel_keys_id)

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.

Maybe let the user optionally provide a change address along with their inputs?

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.

Done.

@jkczyz
jkczyz self-requested a review June 18, 2025 18:19
@wpaulino

Copy link
Copy Markdown
Contributor

Since the FundingTransactionReadyForSigning work is also relevant for splicing (though it will need some minor additional changes), maybe we should split it up from the inbound contribution work, so that we can unblock testing on the splicing side once #3736 lands.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

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

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Since the FundingTransactionReadyForSigning work is also relevant for splicing (though it will need some minor additional changes), maybe we should split it up from the inbound contribution work, so that we can unblock testing on the splicing side once #3736 lands.

Agreed. Apologies for the late response. Back home now. I'll split it into a separate PR and we can discuss changes.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

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

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 2 times, most recently from 9a2a5ce to 8006303CompareJune 27, 2025 07:19
@codecov

codecovBot commented Jun 27, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 96.96133% with 11 lines in your changes missing coverage. Please review.
✅ Project coverage is 89.61%. Comparing base (9150bc8) to head (fe940d6).

Files with missing linesPatch %Lines
lightning/src/ln/dual_funding_tests.rs97.96%5 Missing and 1 partial ⚠️
lightning/src/ln/channel.rs91.66%0 Missing and 3 partials ⚠️
lightning/src/ln/channelmanager.rs90.90%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3735 +/- ##
==========================================
+ Coverage 89.32% 89.61% +0.29% 
==========================================
Files 180 181 +1 Lines 138176 138525 +349 Branches 138176 138525 +349 ==========================================
+ Hits 123424 124141 +717 + Misses 12137 11774 -363 + Partials 2615 2610 -5 
FlagCoverage Δ
fuzzing33.65% <10.00%> (+0.03%)⬆️
tests89.00% <96.96%> (+0.29%)⬆️

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.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

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

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Sorry, long time. This needs a super rebase. I see #1621 was closed. Do we need another issue for dual-funding tracking?

@jkczyz

Copy link
Copy Markdown
Contributor

Sorry, long time. This needs a super rebase. I see #1621 was closed. Do we need another issue for dual-funding tracking?

Yeah, probably best to use a fresh issue than re-open an older one that's accumulated the splicing work.

@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from c059e03 to fe940d6CompareNovember 11, 2025 22:40
@jkczyz

Copy link
Copy Markdown
Contributor

Rebased! Will take over the PR from here 🫡

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Rebased! Will take over the PR from here 🫡

Thanks, @jkczyz! I will be able to give some review this week. Blocked out some space for it.

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Just looked through the docs/comments and hope they are still valid since this PR was opened.

dunxenand others added 2 commits November 20, 2025 11:30
…annel
We introduce a `ChannelManager::accept_inbound_channel_with_contribution`
method allowing contributing to the overall channel capacity of an inbound
dual-funded channel by contributing inputs.
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines +9871 to +9872
/// portion of the channel value. Our contribution will be calculated as the total value of these
/// inputs minus the fees we need to cover for the interactive funding transaction. The witness

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.

This actually isn't accurate. The contribution is given by our_funding_satoshis, while funding_inputs must have enough for that plus any fees. The remaining value should go to change. Updated the docs accordingly.

Comment threadlightning/src/ln/channel.rs Outdated
script_pubkey: funding.get_funding_redeemscript().to_p2wsh(),
};

// Optionally add change output

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.

Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?

Comment threadlightning/src/ln/channel.rs Outdated
};

// Optionally add change output
let change_script = signer_provider.get_destination_script(context.channel_keys_id)

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.

Done.

@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from fe940d6 to ed4d8a5CompareNovember 20, 2025 17:32
@jkczyz
jkczyz requested a review from wpaulinoNovember 20, 2025 17:33
jkczyzand others added 2 commits November 20, 2025 19:30
We can now run through the case where the acceptor contributes to an
inbound channel, with either more value in inputs, or less value, leading
to a different `tx_signatures` exchange order.
We also cannot use dummy P2WPKH funding inputs and witnesses anymore as
`funding_transaction_signed` internally verifies signatures. Hence, we
create external keypairs that we can create outputs for and sign with.
@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from ed4d8a5 to 9a04ed0CompareNovember 21, 2025 23:06
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 5th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 6th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 7th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 8th Reminder

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

Comment on lines +14197 to +14198
funding_negotiation_context: None,
interactive_tx_constructor: Some(interactive_tx_constructor),

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.

Would be nice to reuse FundingNegotiation here, but it seems unclear whether the last AwaitingSignatures state can be adapted to the initial dual funding state


// TODO(dual_funding): Use real node and API for creating V2 channels as initiator when available,
// instead of manually constructing messages.
fn do_test_v2_channel_establishment(session: V2ChannelEstablishmentTestSession) {

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.

Let's just drop these until we can use the real API?

pub fn accept_inbound_channel_with_contribution(
&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey,
user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>,
our_funding_contribution: Amount, funding_inputs: Vec<FundingTxInput>,

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.

We're also allowed to include outputs, behaving similar to the mixed mode splice, so maybe it's worth waiting until we figure that out in #4261 so we can adopt it here?

@jkczyzjkczyz mentioned this pull request Mar 19, 2026
50 tasks
@ldk-reviews-bot

Copy link
Copy Markdown

Hi @dunxen,

Thanks for your contributions to rust-lightning!

After too many struggles with bugs, outages, contributor bans, and, finally, a multi-week CI ban, the rust-lightning project is moving off of GitHub for day-to-day development.

You can still file issues and access the git tree here, but PRs will now take place exclusively at https://git.rust-bitcoin.org/. As such, this PR has been migrated to https://git.rust-bitcoin.org/lightningdevkit/rust-lightning/pulls/3735

If you log in using GitHub (or otherwise link your GitHub account from https://git.rust-bitcoin.org/user/settings/security), ownership of your PRs, issues, and comments will automatically transfer. To push updates to this PR, you'll need to use git push git@gitea-ssh.bitcoin.ninja:lightningdevkit/rust-lightning YOUR_LOCAL_COMMIT_OR_BRANCH:dunxen/2025-04-contributeinputs. This may require a permissions change - if it doesn't work initially just leave a comment and we'll get you access.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@dunxen@ldk-reviews-bot@wpaulino@jkczyz
, '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

Contribute funding inputs on accepting dual-funded channel - #3735

Closed
dunxen wants to merge 4 commits into
lightningdevkit:mainfrom
dunxen:2025-04-contributeinputs
Closed

Contribute funding inputs on accepting dual-funded channel#3735
dunxen wants to merge 4 commits into
lightningdevkit:mainfrom
dunxen:2025-04-contributeinputs

Conversation

@dunxen

@dunxendunxen commented Apr 15, 2025

Copy link
Copy Markdown
Contributor

We introduce a ChannelManager::accept_inbound_channel_with_contribution
method allowing contributing to the overall channel capacity of an inbound
dual-funded channel by contributing inputs.

@ldk-reviews-bot

ldk-reviews-bot commented Apr 15, 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.

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from e22fa33 to fabbf86CompareApril 25, 2025 18:20
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 4 times, most recently from c42f3d0 to 186d66bCompareMay 12, 2025 10:51
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 186d66b to c7d8e89CompareMay 19, 2025 11:07
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from c7d8e89 to 540b8a7CompareJune 12, 2025 08:40
@wpaulino

Copy link
Copy Markdown
Contributor

Looks like this needs a rebase after #3637

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 540b8a7 to 94bf848CompareJune 13, 2025 05:35
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Looks like this needs a rebase after #3637

ugh right!

@wpaulino

Copy link
Copy Markdown
Contributor

Don't the first three commits need to be dropped?

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 2 times, most recently from 67504f0 to 9f276d8CompareJune 17, 2025 10:40
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Just needs node reload tests but it can still get some initial review.

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 9f276d8 to 60f58b1CompareJune 17, 2025 16:26
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
script_pubkey: funding.get_funding_redeemscript().to_p2wsh(),
};

// Optionally add change output

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.

Wouldn't this already be covered by begin_interactive_funding_tx_construction?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Oh indeed. begin_interactive_funding_tx_construction was modified to include that in a previous pre-splicing work. Thanks.

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.

Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?

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.

Regarding locktime, maybe we just throw it in UnfundedChannelContext or directly in PendingV2Channel? Using FundingNegotiation may not be ideal given it has a variant (AwaitingSignatures) where the locktime is no longer available, even though we'd never have a PendingV2Channel in that state.

@jkczyzjkczyzNov 21, 2025

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.

As mentioned offline, I added a fixup to store the locktime directly in PendingV2Channel. Using UnfundedChannelContext won't work since it is used for v1 channels, too. I considered passing the locktime to the relevant method (get_open_channel_v2) after constructing the channel. However, that method is called in some other places, too.

Comment threadlightning/src/ln/channel.rs Outdated
};

// Optionally add change output
let change_script = signer_provider.get_destination_script(context.channel_keys_id)

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.

Maybe let the user optionally provide a change address along with their inputs?

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.

Done.

@jkczyz
jkczyz self-requested a review June 18, 2025 18:19
@wpaulino

Copy link
Copy Markdown
Contributor

Since the FundingTransactionReadyForSigning work is also relevant for splicing (though it will need some minor additional changes), maybe we should split it up from the inbound contribution work, so that we can unblock testing on the splicing side once #3736 lands.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

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

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Since the FundingTransactionReadyForSigning work is also relevant for splicing (though it will need some minor additional changes), maybe we should split it up from the inbound contribution work, so that we can unblock testing on the splicing side once #3736 lands.

Agreed. Apologies for the late response. Back home now. I'll split it into a separate PR and we can discuss changes.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

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

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 2 times, most recently from 9a2a5ce to 8006303CompareJune 27, 2025 07:19
@codecov

codecovBot commented Jun 27, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 96.96133% with 11 lines in your changes missing coverage. Please review.
✅ Project coverage is 89.61%. Comparing base (9150bc8) to head (fe940d6).

Files with missing linesPatch %Lines
lightning/src/ln/dual_funding_tests.rs97.96%5 Missing and 1 partial ⚠️
lightning/src/ln/channel.rs91.66%0 Missing and 3 partials ⚠️
lightning/src/ln/channelmanager.rs90.90%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3735 +/- ##
==========================================
+ Coverage 89.32% 89.61% +0.29% 
==========================================
Files 180 181 +1 Lines 138176 138525 +349 Branches 138176 138525 +349 ==========================================
+ Hits 123424 124141 +717 + Misses 12137 11774 -363 + Partials 2615 2610 -5 
FlagCoverage Δ
fuzzing33.65% <10.00%> (+0.03%)⬆️
tests89.00% <96.96%> (+0.29%)⬆️

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.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

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

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Sorry, long time. This needs a super rebase. I see #1621 was closed. Do we need another issue for dual-funding tracking?

@jkczyz

Copy link
Copy Markdown
Contributor

Sorry, long time. This needs a super rebase. I see #1621 was closed. Do we need another issue for dual-funding tracking?

Yeah, probably best to use a fresh issue than re-open an older one that's accumulated the splicing work.

@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from c059e03 to fe940d6CompareNovember 11, 2025 22:40
@jkczyz

Copy link
Copy Markdown
Contributor

Rebased! Will take over the PR from here 🫡

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Rebased! Will take over the PR from here 🫡

Thanks, @jkczyz! I will be able to give some review this week. Blocked out some space for it.

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Just looked through the docs/comments and hope they are still valid since this PR was opened.

dunxenand others added 2 commits November 20, 2025 11:30
…annel
We introduce a `ChannelManager::accept_inbound_channel_with_contribution`
method allowing contributing to the overall channel capacity of an inbound
dual-funded channel by contributing inputs.
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines +9871 to +9872
/// portion of the channel value. Our contribution will be calculated as the total value of these
/// inputs minus the fees we need to cover for the interactive funding transaction. The witness

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.

This actually isn't accurate. The contribution is given by our_funding_satoshis, while funding_inputs must have enough for that plus any fees. The remaining value should go to change. Updated the docs accordingly.

Comment threadlightning/src/ln/channel.rs Outdated
script_pubkey: funding.get_funding_redeemscript().to_p2wsh(),
};

// Optionally add change output

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.

Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?

Comment threadlightning/src/ln/channel.rs Outdated
};

// Optionally add change output
let change_script = signer_provider.get_destination_script(context.channel_keys_id)

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.

Done.

@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from fe940d6 to ed4d8a5CompareNovember 20, 2025 17:32
@jkczyz
jkczyz requested a review from wpaulinoNovember 20, 2025 17:33
jkczyzand others added 2 commits November 20, 2025 19:30
We can now run through the case where the acceptor contributes to an
inbound channel, with either more value in inputs, or less value, leading
to a different `tx_signatures` exchange order.
We also cannot use dummy P2WPKH funding inputs and witnesses anymore as
`funding_transaction_signed` internally verifies signatures. Hence, we
create external keypairs that we can create outputs for and sign with.
@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from ed4d8a5 to 9a04ed0CompareNovember 21, 2025 23:06
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 5th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 6th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 7th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 8th Reminder

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

Comment on lines +14197 to +14198
funding_negotiation_context: None,
interactive_tx_constructor: Some(interactive_tx_constructor),

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.

Would be nice to reuse FundingNegotiation here, but it seems unclear whether the last AwaitingSignatures state can be adapted to the initial dual funding state


// TODO(dual_funding): Use real node and API for creating V2 channels as initiator when available,
// instead of manually constructing messages.
fn do_test_v2_channel_establishment(session: V2ChannelEstablishmentTestSession) {

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.

Let's just drop these until we can use the real API?

pub fn accept_inbound_channel_with_contribution(
&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey,
user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>,
our_funding_contribution: Amount, funding_inputs: Vec<FundingTxInput>,

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.

We're also allowed to include outputs, behaving similar to the mixed mode splice, so maybe it's worth waiting until we figure that out in #4261 so we can adopt it here?

@jkczyzjkczyz mentioned this pull request Mar 19, 2026
50 tasks
@ldk-reviews-bot

Copy link
Copy Markdown

Hi @dunxen,

Thanks for your contributions to rust-lightning!

After too many struggles with bugs, outages, contributor bans, and, finally, a multi-week CI ban, the rust-lightning project is moving off of GitHub for day-to-day development.

You can still file issues and access the git tree here, but PRs will now take place exclusively at https://git.rust-bitcoin.org/. As such, this PR has been migrated to https://git.rust-bitcoin.org/lightningdevkit/rust-lightning/pulls/3735

If you log in using GitHub (or otherwise link your GitHub account from https://git.rust-bitcoin.org/user/settings/security), ownership of your PRs, issues, and comments will automatically transfer. To push updates to this PR, you'll need to use git push git@gitea-ssh.bitcoin.ninja:lightningdevkit/rust-lightning YOUR_LOCAL_COMMIT_OR_BRANCH:dunxen/2025-04-contributeinputs. This may require a permissions change - if it doesn't work initially just leave a comment and we'll get you access.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@dunxen@ldk-reviews-bot@wpaulino@jkczyz
, '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

Contribute funding inputs on accepting dual-funded channel - #3735

Closed
dunxen wants to merge 4 commits into
lightningdevkit:mainfrom
dunxen:2025-04-contributeinputs
Closed

Contribute funding inputs on accepting dual-funded channel#3735
dunxen wants to merge 4 commits into
lightningdevkit:mainfrom
dunxen:2025-04-contributeinputs

Conversation

@dunxen

@dunxendunxen commented Apr 15, 2025

Copy link
Copy Markdown
Contributor

We introduce a ChannelManager::accept_inbound_channel_with_contribution
method allowing contributing to the overall channel capacity of an inbound
dual-funded channel by contributing inputs.

@ldk-reviews-bot

ldk-reviews-bot commented Apr 15, 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.

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from e22fa33 to fabbf86CompareApril 25, 2025 18:20
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 4 times, most recently from c42f3d0 to 186d66bCompareMay 12, 2025 10:51
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 186d66b to c7d8e89CompareMay 19, 2025 11:07
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from c7d8e89 to 540b8a7CompareJune 12, 2025 08:40
@wpaulino

Copy link
Copy Markdown
Contributor

Looks like this needs a rebase after #3637

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 540b8a7 to 94bf848CompareJune 13, 2025 05:35
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Looks like this needs a rebase after #3637

ugh right!

@wpaulino

Copy link
Copy Markdown
Contributor

Don't the first three commits need to be dropped?

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 2 times, most recently from 67504f0 to 9f276d8CompareJune 17, 2025 10:40
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Just needs node reload tests but it can still get some initial review.

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 9f276d8 to 60f58b1CompareJune 17, 2025 16:26
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
script_pubkey: funding.get_funding_redeemscript().to_p2wsh(),
};

// Optionally add change output

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.

Wouldn't this already be covered by begin_interactive_funding_tx_construction?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Oh indeed. begin_interactive_funding_tx_construction was modified to include that in a previous pre-splicing work. Thanks.

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.

Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?

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.

Regarding locktime, maybe we just throw it in UnfundedChannelContext or directly in PendingV2Channel? Using FundingNegotiation may not be ideal given it has a variant (AwaitingSignatures) where the locktime is no longer available, even though we'd never have a PendingV2Channel in that state.

@jkczyzjkczyzNov 21, 2025

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.

As mentioned offline, I added a fixup to store the locktime directly in PendingV2Channel. Using UnfundedChannelContext won't work since it is used for v1 channels, too. I considered passing the locktime to the relevant method (get_open_channel_v2) after constructing the channel. However, that method is called in some other places, too.

Comment threadlightning/src/ln/channel.rs Outdated
};

// Optionally add change output
let change_script = signer_provider.get_destination_script(context.channel_keys_id)

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.

Maybe let the user optionally provide a change address along with their inputs?

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.

Done.

@jkczyz
jkczyz self-requested a review June 18, 2025 18:19
@wpaulino

Copy link
Copy Markdown
Contributor

Since the FundingTransactionReadyForSigning work is also relevant for splicing (though it will need some minor additional changes), maybe we should split it up from the inbound contribution work, so that we can unblock testing on the splicing side once #3736 lands.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

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

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Since the FundingTransactionReadyForSigning work is also relevant for splicing (though it will need some minor additional changes), maybe we should split it up from the inbound contribution work, so that we can unblock testing on the splicing side once #3736 lands.

Agreed. Apologies for the late response. Back home now. I'll split it into a separate PR and we can discuss changes.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

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

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 2 times, most recently from 9a2a5ce to 8006303CompareJune 27, 2025 07:19
@codecov

codecovBot commented Jun 27, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 96.96133% with 11 lines in your changes missing coverage. Please review.
✅ Project coverage is 89.61%. Comparing base (9150bc8) to head (fe940d6).

Files with missing linesPatch %Lines
lightning/src/ln/dual_funding_tests.rs97.96%5 Missing and 1 partial ⚠️
lightning/src/ln/channel.rs91.66%0 Missing and 3 partials ⚠️
lightning/src/ln/channelmanager.rs90.90%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3735 +/- ##
==========================================
+ Coverage 89.32% 89.61% +0.29% 
==========================================
Files 180 181 +1 Lines 138176 138525 +349 Branches 138176 138525 +349 ==========================================
+ Hits 123424 124141 +717 + Misses 12137 11774 -363 + Partials 2615 2610 -5 
FlagCoverage Δ
fuzzing33.65% <10.00%> (+0.03%)⬆️
tests89.00% <96.96%> (+0.29%)⬆️

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.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

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

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Sorry, long time. This needs a super rebase. I see #1621 was closed. Do we need another issue for dual-funding tracking?

@jkczyz

Copy link
Copy Markdown
Contributor

Sorry, long time. This needs a super rebase. I see #1621 was closed. Do we need another issue for dual-funding tracking?

Yeah, probably best to use a fresh issue than re-open an older one that's accumulated the splicing work.

@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from c059e03 to fe940d6CompareNovember 11, 2025 22:40
@jkczyz

Copy link
Copy Markdown
Contributor

Rebased! Will take over the PR from here 🫡

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Rebased! Will take over the PR from here 🫡

Thanks, @jkczyz! I will be able to give some review this week. Blocked out some space for it.

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Just looked through the docs/comments and hope they are still valid since this PR was opened.

dunxenand others added 2 commits November 20, 2025 11:30
…annel
We introduce a `ChannelManager::accept_inbound_channel_with_contribution`
method allowing contributing to the overall channel capacity of an inbound
dual-funded channel by contributing inputs.
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines +9871 to +9872
/// portion of the channel value. Our contribution will be calculated as the total value of these
/// inputs minus the fees we need to cover for the interactive funding transaction. The witness

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.

This actually isn't accurate. The contribution is given by our_funding_satoshis, while funding_inputs must have enough for that plus any fees. The remaining value should go to change. Updated the docs accordingly.

Comment threadlightning/src/ln/channel.rs Outdated
script_pubkey: funding.get_funding_redeemscript().to_p2wsh(),
};

// Optionally add change output

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.

Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?

Comment threadlightning/src/ln/channel.rs Outdated
};

// Optionally add change output
let change_script = signer_provider.get_destination_script(context.channel_keys_id)

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.

Done.

@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from fe940d6 to ed4d8a5CompareNovember 20, 2025 17:32
@jkczyz
jkczyz requested a review from wpaulinoNovember 20, 2025 17:33
jkczyzand others added 2 commits November 20, 2025 19:30
We can now run through the case where the acceptor contributes to an
inbound channel, with either more value in inputs, or less value, leading
to a different `tx_signatures` exchange order.
We also cannot use dummy P2WPKH funding inputs and witnesses anymore as
`funding_transaction_signed` internally verifies signatures. Hence, we
create external keypairs that we can create outputs for and sign with.
@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from ed4d8a5 to 9a04ed0CompareNovember 21, 2025 23:06
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 5th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 6th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 7th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 8th Reminder

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

Comment on lines +14197 to +14198
funding_negotiation_context: None,
interactive_tx_constructor: Some(interactive_tx_constructor),

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.

Would be nice to reuse FundingNegotiation here, but it seems unclear whether the last AwaitingSignatures state can be adapted to the initial dual funding state


// TODO(dual_funding): Use real node and API for creating V2 channels as initiator when available,
// instead of manually constructing messages.
fn do_test_v2_channel_establishment(session: V2ChannelEstablishmentTestSession) {

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.

Let's just drop these until we can use the real API?

pub fn accept_inbound_channel_with_contribution(
&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey,
user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>,
our_funding_contribution: Amount, funding_inputs: Vec<FundingTxInput>,

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.

We're also allowed to include outputs, behaving similar to the mixed mode splice, so maybe it's worth waiting until we figure that out in #4261 so we can adopt it here?

@jkczyzjkczyz mentioned this pull request Mar 19, 2026
50 tasks
@ldk-reviews-bot

Copy link
Copy Markdown

Hi @dunxen,

Thanks for your contributions to rust-lightning!

After too many struggles with bugs, outages, contributor bans, and, finally, a multi-week CI ban, the rust-lightning project is moving off of GitHub for day-to-day development.

You can still file issues and access the git tree here, but PRs will now take place exclusively at https://git.rust-bitcoin.org/. As such, this PR has been migrated to https://git.rust-bitcoin.org/lightningdevkit/rust-lightning/pulls/3735

If you log in using GitHub (or otherwise link your GitHub account from https://git.rust-bitcoin.org/user/settings/security), ownership of your PRs, issues, and comments will automatically transfer. To push updates to this PR, you'll need to use git push git@gitea-ssh.bitcoin.ninja:lightningdevkit/rust-lightning YOUR_LOCAL_COMMIT_OR_BRANCH:dunxen/2025-04-contributeinputs. This may require a permissions change - if it doesn't work initially just leave a comment and we'll get you access.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@dunxen@ldk-reviews-bot@wpaulino@jkczyz
, '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

Contribute funding inputs on accepting dual-funded channel - #3735

Closed
dunxen wants to merge 4 commits into
lightningdevkit:mainfrom
dunxen:2025-04-contributeinputs
Closed

Contribute funding inputs on accepting dual-funded channel#3735
dunxen wants to merge 4 commits into
lightningdevkit:mainfrom
dunxen:2025-04-contributeinputs

Conversation

@dunxen

@dunxendunxen commented Apr 15, 2025

Copy link
Copy Markdown
Contributor

We introduce a ChannelManager::accept_inbound_channel_with_contribution
method allowing contributing to the overall channel capacity of an inbound
dual-funded channel by contributing inputs.

@ldk-reviews-bot

ldk-reviews-bot commented Apr 15, 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.

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from e22fa33 to fabbf86CompareApril 25, 2025 18:20
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 4 times, most recently from c42f3d0 to 186d66bCompareMay 12, 2025 10:51
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 186d66b to c7d8e89CompareMay 19, 2025 11:07
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from c7d8e89 to 540b8a7CompareJune 12, 2025 08:40
@wpaulino

Copy link
Copy Markdown
Contributor

Looks like this needs a rebase after #3637

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 540b8a7 to 94bf848CompareJune 13, 2025 05:35
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Looks like this needs a rebase after #3637

ugh right!

@wpaulino

Copy link
Copy Markdown
Contributor

Don't the first three commits need to be dropped?

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 2 times, most recently from 67504f0 to 9f276d8CompareJune 17, 2025 10:40
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Just needs node reload tests but it can still get some initial review.

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 9f276d8 to 60f58b1CompareJune 17, 2025 16:26
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
script_pubkey: funding.get_funding_redeemscript().to_p2wsh(),
};

// Optionally add change output

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.

Wouldn't this already be covered by begin_interactive_funding_tx_construction?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Oh indeed. begin_interactive_funding_tx_construction was modified to include that in a previous pre-splicing work. Thanks.

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.

Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?

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.

Regarding locktime, maybe we just throw it in UnfundedChannelContext or directly in PendingV2Channel? Using FundingNegotiation may not be ideal given it has a variant (AwaitingSignatures) where the locktime is no longer available, even though we'd never have a PendingV2Channel in that state.

@jkczyzjkczyzNov 21, 2025

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.

As mentioned offline, I added a fixup to store the locktime directly in PendingV2Channel. Using UnfundedChannelContext won't work since it is used for v1 channels, too. I considered passing the locktime to the relevant method (get_open_channel_v2) after constructing the channel. However, that method is called in some other places, too.

Comment threadlightning/src/ln/channel.rs Outdated
};

// Optionally add change output
let change_script = signer_provider.get_destination_script(context.channel_keys_id)

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.

Maybe let the user optionally provide a change address along with their inputs?

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.

Done.

@jkczyz
jkczyz self-requested a review June 18, 2025 18:19
@wpaulino

Copy link
Copy Markdown
Contributor

Since the FundingTransactionReadyForSigning work is also relevant for splicing (though it will need some minor additional changes), maybe we should split it up from the inbound contribution work, so that we can unblock testing on the splicing side once #3736 lands.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

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

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Since the FundingTransactionReadyForSigning work is also relevant for splicing (though it will need some minor additional changes), maybe we should split it up from the inbound contribution work, so that we can unblock testing on the splicing side once #3736 lands.

Agreed. Apologies for the late response. Back home now. I'll split it into a separate PR and we can discuss changes.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

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

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 2 times, most recently from 9a2a5ce to 8006303CompareJune 27, 2025 07:19
@codecov

codecovBot commented Jun 27, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 96.96133% with 11 lines in your changes missing coverage. Please review.
✅ Project coverage is 89.61%. Comparing base (9150bc8) to head (fe940d6).

Files with missing linesPatch %Lines
lightning/src/ln/dual_funding_tests.rs97.96%5 Missing and 1 partial ⚠️
lightning/src/ln/channel.rs91.66%0 Missing and 3 partials ⚠️
lightning/src/ln/channelmanager.rs90.90%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3735 +/- ##
==========================================
+ Coverage 89.32% 89.61% +0.29% 
==========================================
Files 180 181 +1 Lines 138176 138525 +349 Branches 138176 138525 +349 ==========================================
+ Hits 123424 124141 +717 + Misses 12137 11774 -363 + Partials 2615 2610 -5 
FlagCoverage Δ
fuzzing33.65% <10.00%> (+0.03%)⬆️
tests89.00% <96.96%> (+0.29%)⬆️

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.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

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

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Sorry, long time. This needs a super rebase. I see #1621 was closed. Do we need another issue for dual-funding tracking?

@jkczyz

Copy link
Copy Markdown
Contributor

Sorry, long time. This needs a super rebase. I see #1621 was closed. Do we need another issue for dual-funding tracking?

Yeah, probably best to use a fresh issue than re-open an older one that's accumulated the splicing work.

@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from c059e03 to fe940d6CompareNovember 11, 2025 22:40
@jkczyz

Copy link
Copy Markdown
Contributor

Rebased! Will take over the PR from here 🫡

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Rebased! Will take over the PR from here 🫡

Thanks, @jkczyz! I will be able to give some review this week. Blocked out some space for it.

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Just looked through the docs/comments and hope they are still valid since this PR was opened.

dunxenand others added 2 commits November 20, 2025 11:30
…annel
We introduce a `ChannelManager::accept_inbound_channel_with_contribution`
method allowing contributing to the overall channel capacity of an inbound
dual-funded channel by contributing inputs.
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines +9871 to +9872
/// portion of the channel value. Our contribution will be calculated as the total value of these
/// inputs minus the fees we need to cover for the interactive funding transaction. The witness

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.

This actually isn't accurate. The contribution is given by our_funding_satoshis, while funding_inputs must have enough for that plus any fees. The remaining value should go to change. Updated the docs accordingly.

Comment threadlightning/src/ln/channel.rs Outdated
script_pubkey: funding.get_funding_redeemscript().to_p2wsh(),
};

// Optionally add change output

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.

Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?

Comment threadlightning/src/ln/channel.rs Outdated
};

// Optionally add change output
let change_script = signer_provider.get_destination_script(context.channel_keys_id)

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.

Done.

@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from fe940d6 to ed4d8a5CompareNovember 20, 2025 17:32
@jkczyz
jkczyz requested a review from wpaulinoNovember 20, 2025 17:33
jkczyzand others added 2 commits November 20, 2025 19:30
We can now run through the case where the acceptor contributes to an
inbound channel, with either more value in inputs, or less value, leading
to a different `tx_signatures` exchange order.
We also cannot use dummy P2WPKH funding inputs and witnesses anymore as
`funding_transaction_signed` internally verifies signatures. Hence, we
create external keypairs that we can create outputs for and sign with.
@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from ed4d8a5 to 9a04ed0CompareNovember 21, 2025 23:06
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 5th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 6th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 7th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 8th Reminder

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

Comment on lines +14197 to +14198
funding_negotiation_context: None,
interactive_tx_constructor: Some(interactive_tx_constructor),

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.

Would be nice to reuse FundingNegotiation here, but it seems unclear whether the last AwaitingSignatures state can be adapted to the initial dual funding state


// TODO(dual_funding): Use real node and API for creating V2 channels as initiator when available,
// instead of manually constructing messages.
fn do_test_v2_channel_establishment(session: V2ChannelEstablishmentTestSession) {

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.

Let's just drop these until we can use the real API?

pub fn accept_inbound_channel_with_contribution(
&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey,
user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>,
our_funding_contribution: Amount, funding_inputs: Vec<FundingTxInput>,

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.

We're also allowed to include outputs, behaving similar to the mixed mode splice, so maybe it's worth waiting until we figure that out in #4261 so we can adopt it here?

@jkczyzjkczyz mentioned this pull request Mar 19, 2026
50 tasks
@ldk-reviews-bot

Copy link
Copy Markdown

Hi @dunxen,

Thanks for your contributions to rust-lightning!

After too many struggles with bugs, outages, contributor bans, and, finally, a multi-week CI ban, the rust-lightning project is moving off of GitHub for day-to-day development.

You can still file issues and access the git tree here, but PRs will now take place exclusively at https://git.rust-bitcoin.org/. As such, this PR has been migrated to https://git.rust-bitcoin.org/lightningdevkit/rust-lightning/pulls/3735

If you log in using GitHub (or otherwise link your GitHub account from https://git.rust-bitcoin.org/user/settings/security), ownership of your PRs, issues, and comments will automatically transfer. To push updates to this PR, you'll need to use git push git@gitea-ssh.bitcoin.ninja:lightningdevkit/rust-lightning YOUR_LOCAL_COMMIT_OR_BRANCH:dunxen/2025-04-contributeinputs. This may require a permissions change - if it doesn't work initially just leave a comment and we'll get you access.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@dunxen@ldk-reviews-bot@wpaulino@jkczyz
, '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

Contribute funding inputs on accepting dual-funded channel - #3735

Closed
dunxen wants to merge 4 commits into
lightningdevkit:mainfrom
dunxen:2025-04-contributeinputs
Closed

Contribute funding inputs on accepting dual-funded channel#3735
dunxen wants to merge 4 commits into
lightningdevkit:mainfrom
dunxen:2025-04-contributeinputs

Conversation

@dunxen

@dunxendunxen commented Apr 15, 2025

Copy link
Copy Markdown
Contributor

We introduce a ChannelManager::accept_inbound_channel_with_contribution
method allowing contributing to the overall channel capacity of an inbound
dual-funded channel by contributing inputs.

@ldk-reviews-bot

ldk-reviews-bot commented Apr 15, 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.

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from e22fa33 to fabbf86CompareApril 25, 2025 18:20
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 4 times, most recently from c42f3d0 to 186d66bCompareMay 12, 2025 10:51
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 186d66b to c7d8e89CompareMay 19, 2025 11:07
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from c7d8e89 to 540b8a7CompareJune 12, 2025 08:40
@wpaulino

Copy link
Copy Markdown
Contributor

Looks like this needs a rebase after #3637

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 540b8a7 to 94bf848CompareJune 13, 2025 05:35
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Looks like this needs a rebase after #3637

ugh right!

@wpaulino

Copy link
Copy Markdown
Contributor

Don't the first three commits need to be dropped?

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 2 times, most recently from 67504f0 to 9f276d8CompareJune 17, 2025 10:40
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Just needs node reload tests but it can still get some initial review.

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 9f276d8 to 60f58b1CompareJune 17, 2025 16:26
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
script_pubkey: funding.get_funding_redeemscript().to_p2wsh(),
};

// Optionally add change output

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.

Wouldn't this already be covered by begin_interactive_funding_tx_construction?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Oh indeed. begin_interactive_funding_tx_construction was modified to include that in a previous pre-splicing work. Thanks.

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.

Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?

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.

Regarding locktime, maybe we just throw it in UnfundedChannelContext or directly in PendingV2Channel? Using FundingNegotiation may not be ideal given it has a variant (AwaitingSignatures) where the locktime is no longer available, even though we'd never have a PendingV2Channel in that state.

@jkczyzjkczyzNov 21, 2025

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.

As mentioned offline, I added a fixup to store the locktime directly in PendingV2Channel. Using UnfundedChannelContext won't work since it is used for v1 channels, too. I considered passing the locktime to the relevant method (get_open_channel_v2) after constructing the channel. However, that method is called in some other places, too.

Comment threadlightning/src/ln/channel.rs Outdated
};

// Optionally add change output
let change_script = signer_provider.get_destination_script(context.channel_keys_id)

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.

Maybe let the user optionally provide a change address along with their inputs?

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.

Done.

@jkczyz
jkczyz self-requested a review June 18, 2025 18:19
@wpaulino

Copy link
Copy Markdown
Contributor

Since the FundingTransactionReadyForSigning work is also relevant for splicing (though it will need some minor additional changes), maybe we should split it up from the inbound contribution work, so that we can unblock testing on the splicing side once #3736 lands.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

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

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Since the FundingTransactionReadyForSigning work is also relevant for splicing (though it will need some minor additional changes), maybe we should split it up from the inbound contribution work, so that we can unblock testing on the splicing side once #3736 lands.

Agreed. Apologies for the late response. Back home now. I'll split it into a separate PR and we can discuss changes.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

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

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 2 times, most recently from 9a2a5ce to 8006303CompareJune 27, 2025 07:19
@codecov

codecovBot commented Jun 27, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 96.96133% with 11 lines in your changes missing coverage. Please review.
✅ Project coverage is 89.61%. Comparing base (9150bc8) to head (fe940d6).

Files with missing linesPatch %Lines
lightning/src/ln/dual_funding_tests.rs97.96%5 Missing and 1 partial ⚠️
lightning/src/ln/channel.rs91.66%0 Missing and 3 partials ⚠️
lightning/src/ln/channelmanager.rs90.90%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3735 +/- ##
==========================================
+ Coverage 89.32% 89.61% +0.29% 
==========================================
Files 180 181 +1 Lines 138176 138525 +349 Branches 138176 138525 +349 ==========================================
+ Hits 123424 124141 +717 + Misses 12137 11774 -363 + Partials 2615 2610 -5 
FlagCoverage Δ
fuzzing33.65% <10.00%> (+0.03%)⬆️
tests89.00% <96.96%> (+0.29%)⬆️

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.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

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

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Sorry, long time. This needs a super rebase. I see #1621 was closed. Do we need another issue for dual-funding tracking?

@jkczyz

Copy link
Copy Markdown
Contributor

Sorry, long time. This needs a super rebase. I see #1621 was closed. Do we need another issue for dual-funding tracking?

Yeah, probably best to use a fresh issue than re-open an older one that's accumulated the splicing work.

@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from c059e03 to fe940d6CompareNovember 11, 2025 22:40
@jkczyz

Copy link
Copy Markdown
Contributor

Rebased! Will take over the PR from here 🫡

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Rebased! Will take over the PR from here 🫡

Thanks, @jkczyz! I will be able to give some review this week. Blocked out some space for it.

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Just looked through the docs/comments and hope they are still valid since this PR was opened.

dunxenand others added 2 commits November 20, 2025 11:30
…annel
We introduce a `ChannelManager::accept_inbound_channel_with_contribution`
method allowing contributing to the overall channel capacity of an inbound
dual-funded channel by contributing inputs.
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines +9871 to +9872
/// portion of the channel value. Our contribution will be calculated as the total value of these
/// inputs minus the fees we need to cover for the interactive funding transaction. The witness

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.

This actually isn't accurate. The contribution is given by our_funding_satoshis, while funding_inputs must have enough for that plus any fees. The remaining value should go to change. Updated the docs accordingly.

Comment threadlightning/src/ln/channel.rs Outdated
script_pubkey: funding.get_funding_redeemscript().to_p2wsh(),
};

// Optionally add change output

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.

Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?

Comment threadlightning/src/ln/channel.rs Outdated
};

// Optionally add change output
let change_script = signer_provider.get_destination_script(context.channel_keys_id)

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.

Done.

@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from fe940d6 to ed4d8a5CompareNovember 20, 2025 17:32
@jkczyz
jkczyz requested a review from wpaulinoNovember 20, 2025 17:33
jkczyzand others added 2 commits November 20, 2025 19:30
We can now run through the case where the acceptor contributes to an
inbound channel, with either more value in inputs, or less value, leading
to a different `tx_signatures` exchange order.
We also cannot use dummy P2WPKH funding inputs and witnesses anymore as
`funding_transaction_signed` internally verifies signatures. Hence, we
create external keypairs that we can create outputs for and sign with.
@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from ed4d8a5 to 9a04ed0CompareNovember 21, 2025 23:06
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 5th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 6th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 7th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 8th Reminder

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

Comment on lines +14197 to +14198
funding_negotiation_context: None,
interactive_tx_constructor: Some(interactive_tx_constructor),

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.

Would be nice to reuse FundingNegotiation here, but it seems unclear whether the last AwaitingSignatures state can be adapted to the initial dual funding state


// TODO(dual_funding): Use real node and API for creating V2 channels as initiator when available,
// instead of manually constructing messages.
fn do_test_v2_channel_establishment(session: V2ChannelEstablishmentTestSession) {

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.

Let's just drop these until we can use the real API?

pub fn accept_inbound_channel_with_contribution(
&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey,
user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>,
our_funding_contribution: Amount, funding_inputs: Vec<FundingTxInput>,

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.

We're also allowed to include outputs, behaving similar to the mixed mode splice, so maybe it's worth waiting until we figure that out in #4261 so we can adopt it here?

@jkczyzjkczyz mentioned this pull request Mar 19, 2026
50 tasks
@ldk-reviews-bot

Copy link
Copy Markdown

Hi @dunxen,

Thanks for your contributions to rust-lightning!

After too many struggles with bugs, outages, contributor bans, and, finally, a multi-week CI ban, the rust-lightning project is moving off of GitHub for day-to-day development.

You can still file issues and access the git tree here, but PRs will now take place exclusively at https://git.rust-bitcoin.org/. As such, this PR has been migrated to https://git.rust-bitcoin.org/lightningdevkit/rust-lightning/pulls/3735

If you log in using GitHub (or otherwise link your GitHub account from https://git.rust-bitcoin.org/user/settings/security), ownership of your PRs, issues, and comments will automatically transfer. To push updates to this PR, you'll need to use git push git@gitea-ssh.bitcoin.ninja:lightningdevkit/rust-lightning YOUR_LOCAL_COMMIT_OR_BRANCH:dunxen/2025-04-contributeinputs. This may require a permissions change - if it doesn't work initially just leave a comment and we'll get you access.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@dunxen@ldk-reviews-bot@wpaulino@jkczyz
, '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

Contribute funding inputs on accepting dual-funded channel - #3735

Closed
dunxen wants to merge 4 commits into
lightningdevkit:mainfrom
dunxen:2025-04-contributeinputs
Closed

Contribute funding inputs on accepting dual-funded channel#3735
dunxen wants to merge 4 commits into
lightningdevkit:mainfrom
dunxen:2025-04-contributeinputs

Conversation

@dunxen

@dunxendunxen commented Apr 15, 2025

Copy link
Copy Markdown
Contributor

We introduce a ChannelManager::accept_inbound_channel_with_contribution
method allowing contributing to the overall channel capacity of an inbound
dual-funded channel by contributing inputs.

@ldk-reviews-bot

ldk-reviews-bot commented Apr 15, 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.

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from e22fa33 to fabbf86CompareApril 25, 2025 18:20
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 4 times, most recently from c42f3d0 to 186d66bCompareMay 12, 2025 10:51
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 186d66b to c7d8e89CompareMay 19, 2025 11:07
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from c7d8e89 to 540b8a7CompareJune 12, 2025 08:40
@wpaulino

Copy link
Copy Markdown
Contributor

Looks like this needs a rebase after #3637

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 540b8a7 to 94bf848CompareJune 13, 2025 05:35
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Looks like this needs a rebase after #3637

ugh right!

@wpaulino

Copy link
Copy Markdown
Contributor

Don't the first three commits need to be dropped?

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 2 times, most recently from 67504f0 to 9f276d8CompareJune 17, 2025 10:40
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Just needs node reload tests but it can still get some initial review.

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 9f276d8 to 60f58b1CompareJune 17, 2025 16:26
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
script_pubkey: funding.get_funding_redeemscript().to_p2wsh(),
};

// Optionally add change output

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.

Wouldn't this already be covered by begin_interactive_funding_tx_construction?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Oh indeed. begin_interactive_funding_tx_construction was modified to include that in a previous pre-splicing work. Thanks.

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.

Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?

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.

Regarding locktime, maybe we just throw it in UnfundedChannelContext or directly in PendingV2Channel? Using FundingNegotiation may not be ideal given it has a variant (AwaitingSignatures) where the locktime is no longer available, even though we'd never have a PendingV2Channel in that state.

@jkczyzjkczyzNov 21, 2025

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.

As mentioned offline, I added a fixup to store the locktime directly in PendingV2Channel. Using UnfundedChannelContext won't work since it is used for v1 channels, too. I considered passing the locktime to the relevant method (get_open_channel_v2) after constructing the channel. However, that method is called in some other places, too.

Comment threadlightning/src/ln/channel.rs Outdated
};

// Optionally add change output
let change_script = signer_provider.get_destination_script(context.channel_keys_id)

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.

Maybe let the user optionally provide a change address along with their inputs?

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.

Done.

@jkczyz
jkczyz self-requested a review June 18, 2025 18:19
@wpaulino

Copy link
Copy Markdown
Contributor

Since the FundingTransactionReadyForSigning work is also relevant for splicing (though it will need some minor additional changes), maybe we should split it up from the inbound contribution work, so that we can unblock testing on the splicing side once #3736 lands.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

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

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Since the FundingTransactionReadyForSigning work is also relevant for splicing (though it will need some minor additional changes), maybe we should split it up from the inbound contribution work, so that we can unblock testing on the splicing side once #3736 lands.

Agreed. Apologies for the late response. Back home now. I'll split it into a separate PR and we can discuss changes.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

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

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 2 times, most recently from 9a2a5ce to 8006303CompareJune 27, 2025 07:19
@codecov

codecovBot commented Jun 27, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 96.96133% with 11 lines in your changes missing coverage. Please review.
✅ Project coverage is 89.61%. Comparing base (9150bc8) to head (fe940d6).

Files with missing linesPatch %Lines
lightning/src/ln/dual_funding_tests.rs97.96%5 Missing and 1 partial ⚠️
lightning/src/ln/channel.rs91.66%0 Missing and 3 partials ⚠️
lightning/src/ln/channelmanager.rs90.90%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3735 +/- ##
==========================================
+ Coverage 89.32% 89.61% +0.29% 
==========================================
Files 180 181 +1 Lines 138176 138525 +349 Branches 138176 138525 +349 ==========================================
+ Hits 123424 124141 +717 + Misses 12137 11774 -363 + Partials 2615 2610 -5 
FlagCoverage Δ
fuzzing33.65% <10.00%> (+0.03%)⬆️
tests89.00% <96.96%> (+0.29%)⬆️

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.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

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

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Sorry, long time. This needs a super rebase. I see #1621 was closed. Do we need another issue for dual-funding tracking?

@jkczyz

Copy link
Copy Markdown
Contributor

Sorry, long time. This needs a super rebase. I see #1621 was closed. Do we need another issue for dual-funding tracking?

Yeah, probably best to use a fresh issue than re-open an older one that's accumulated the splicing work.

@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from c059e03 to fe940d6CompareNovember 11, 2025 22:40
@jkczyz

Copy link
Copy Markdown
Contributor

Rebased! Will take over the PR from here 🫡

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Rebased! Will take over the PR from here 🫡

Thanks, @jkczyz! I will be able to give some review this week. Blocked out some space for it.

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Just looked through the docs/comments and hope they are still valid since this PR was opened.

dunxenand others added 2 commits November 20, 2025 11:30
…annel
We introduce a `ChannelManager::accept_inbound_channel_with_contribution`
method allowing contributing to the overall channel capacity of an inbound
dual-funded channel by contributing inputs.
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines +9871 to +9872
/// portion of the channel value. Our contribution will be calculated as the total value of these
/// inputs minus the fees we need to cover for the interactive funding transaction. The witness

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.

This actually isn't accurate. The contribution is given by our_funding_satoshis, while funding_inputs must have enough for that plus any fees. The remaining value should go to change. Updated the docs accordingly.

Comment threadlightning/src/ln/channel.rs Outdated
script_pubkey: funding.get_funding_redeemscript().to_p2wsh(),
};

// Optionally add change output

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.

Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?

Comment threadlightning/src/ln/channel.rs Outdated
};

// Optionally add change output
let change_script = signer_provider.get_destination_script(context.channel_keys_id)

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.

Done.

@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from fe940d6 to ed4d8a5CompareNovember 20, 2025 17:32
@jkczyz
jkczyz requested a review from wpaulinoNovember 20, 2025 17:33
jkczyzand others added 2 commits November 20, 2025 19:30
We can now run through the case where the acceptor contributes to an
inbound channel, with either more value in inputs, or less value, leading
to a different `tx_signatures` exchange order.
We also cannot use dummy P2WPKH funding inputs and witnesses anymore as
`funding_transaction_signed` internally verifies signatures. Hence, we
create external keypairs that we can create outputs for and sign with.
@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from ed4d8a5 to 9a04ed0CompareNovember 21, 2025 23:06
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 5th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 6th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 7th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 8th Reminder

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

Comment on lines +14197 to +14198
funding_negotiation_context: None,
interactive_tx_constructor: Some(interactive_tx_constructor),

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.

Would be nice to reuse FundingNegotiation here, but it seems unclear whether the last AwaitingSignatures state can be adapted to the initial dual funding state


// TODO(dual_funding): Use real node and API for creating V2 channels as initiator when available,
// instead of manually constructing messages.
fn do_test_v2_channel_establishment(session: V2ChannelEstablishmentTestSession) {

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.

Let's just drop these until we can use the real API?

pub fn accept_inbound_channel_with_contribution(
&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey,
user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>,
our_funding_contribution: Amount, funding_inputs: Vec<FundingTxInput>,

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.

We're also allowed to include outputs, behaving similar to the mixed mode splice, so maybe it's worth waiting until we figure that out in #4261 so we can adopt it here?

@jkczyzjkczyz mentioned this pull request Mar 19, 2026
50 tasks
@ldk-reviews-bot

Copy link
Copy Markdown

Hi @dunxen,

Thanks for your contributions to rust-lightning!

After too many struggles with bugs, outages, contributor bans, and, finally, a multi-week CI ban, the rust-lightning project is moving off of GitHub for day-to-day development.

You can still file issues and access the git tree here, but PRs will now take place exclusively at https://git.rust-bitcoin.org/. As such, this PR has been migrated to https://git.rust-bitcoin.org/lightningdevkit/rust-lightning/pulls/3735

If you log in using GitHub (or otherwise link your GitHub account from https://git.rust-bitcoin.org/user/settings/security), ownership of your PRs, issues, and comments will automatically transfer. To push updates to this PR, you'll need to use git push git@gitea-ssh.bitcoin.ninja:lightningdevkit/rust-lightning YOUR_LOCAL_COMMIT_OR_BRANCH:dunxen/2025-04-contributeinputs. This may require a permissions change - if it doesn't work initially just leave a comment and we'll get you access.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@dunxen@ldk-reviews-bot@wpaulino@jkczyz
, '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

Contribute funding inputs on accepting dual-funded channel - #3735

Closed
dunxen wants to merge 4 commits into
lightningdevkit:mainfrom
dunxen:2025-04-contributeinputs
Closed

Contribute funding inputs on accepting dual-funded channel#3735
dunxen wants to merge 4 commits into
lightningdevkit:mainfrom
dunxen:2025-04-contributeinputs

Conversation

@dunxen

@dunxendunxen commented Apr 15, 2025

Copy link
Copy Markdown
Contributor

We introduce a ChannelManager::accept_inbound_channel_with_contribution
method allowing contributing to the overall channel capacity of an inbound
dual-funded channel by contributing inputs.

@ldk-reviews-bot

ldk-reviews-bot commented Apr 15, 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.

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from e22fa33 to fabbf86CompareApril 25, 2025 18:20
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 4 times, most recently from c42f3d0 to 186d66bCompareMay 12, 2025 10:51
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 186d66b to c7d8e89CompareMay 19, 2025 11:07
@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from c7d8e89 to 540b8a7CompareJune 12, 2025 08:40
@wpaulino

Copy link
Copy Markdown
Contributor

Looks like this needs a rebase after #3637

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 540b8a7 to 94bf848CompareJune 13, 2025 05:35
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Looks like this needs a rebase after #3637

ugh right!

@wpaulino

Copy link
Copy Markdown
Contributor

Don't the first three commits need to be dropped?

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 2 times, most recently from 67504f0 to 9f276d8CompareJune 17, 2025 10:40
@dunxen

Copy link
Copy Markdown
ContributorAuthor

Just needs node reload tests but it can still get some initial review.

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch from 9f276d8 to 60f58b1CompareJune 17, 2025 16:26
Comment threadlightning/src/ln/channel.rs Outdated
Comment threadlightning/src/ln/channelmanager.rs
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment threadlightning/src/ln/channel.rs Outdated
script_pubkey: funding.get_funding_redeemscript().to_p2wsh(),
};

// Optionally add change output

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.

Wouldn't this already be covered by begin_interactive_funding_tx_construction?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Oh indeed. begin_interactive_funding_tx_construction was modified to include that in a previous pre-splicing work. Thanks.

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.

Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?

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.

Regarding locktime, maybe we just throw it in UnfundedChannelContext or directly in PendingV2Channel? Using FundingNegotiation may not be ideal given it has a variant (AwaitingSignatures) where the locktime is no longer available, even though we'd never have a PendingV2Channel in that state.

@jkczyzjkczyzNov 21, 2025

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.

As mentioned offline, I added a fixup to store the locktime directly in PendingV2Channel. Using UnfundedChannelContext won't work since it is used for v1 channels, too. I considered passing the locktime to the relevant method (get_open_channel_v2) after constructing the channel. However, that method is called in some other places, too.

Comment threadlightning/src/ln/channel.rs Outdated
};

// Optionally add change output
let change_script = signer_provider.get_destination_script(context.channel_keys_id)

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.

Maybe let the user optionally provide a change address along with their inputs?

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.

Done.

@jkczyz
jkczyz self-requested a review June 18, 2025 18:19
@wpaulino

Copy link
Copy Markdown
Contributor

Since the FundingTransactionReadyForSigning work is also relevant for splicing (though it will need some minor additional changes), maybe we should split it up from the inbound contribution work, so that we can unblock testing on the splicing side once #3736 lands.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

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

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Since the FundingTransactionReadyForSigning work is also relevant for splicing (though it will need some minor additional changes), maybe we should split it up from the inbound contribution work, so that we can unblock testing on the splicing side once #3736 lands.

Agreed. Apologies for the late response. Back home now. I'll split it into a separate PR and we can discuss changes.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

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

@dunxen
dunxenforce-pushed the 2025-04-contributeinputs branch 2 times, most recently from 9a2a5ce to 8006303CompareJune 27, 2025 07:19
@codecov

codecovBot commented Jun 27, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 96.96133% with 11 lines in your changes missing coverage. Please review.
✅ Project coverage is 89.61%. Comparing base (9150bc8) to head (fe940d6).

Files with missing linesPatch %Lines
lightning/src/ln/dual_funding_tests.rs97.96%5 Missing and 1 partial ⚠️
lightning/src/ln/channel.rs91.66%0 Missing and 3 partials ⚠️
lightning/src/ln/channelmanager.rs90.90%2 Missing ⚠️
Additional details and impacted files
@@ Coverage Diff @@## main #3735 +/- ##
==========================================
+ Coverage 89.32% 89.61% +0.29% 
==========================================
Files 180 181 +1 Lines 138176 138525 +349 Branches 138176 138525 +349 ==========================================
+ Hits 123424 124141 +717 + Misses 12137 11774 -363 + Partials 2615 2610 -5 
FlagCoverage Δ
fuzzing33.65% <10.00%> (+0.03%)⬆️
tests89.00% <96.96%> (+0.29%)⬆️

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.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

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

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Sorry, long time. This needs a super rebase. I see #1621 was closed. Do we need another issue for dual-funding tracking?

@jkczyz

Copy link
Copy Markdown
Contributor

Sorry, long time. This needs a super rebase. I see #1621 was closed. Do we need another issue for dual-funding tracking?

Yeah, probably best to use a fresh issue than re-open an older one that's accumulated the splicing work.

@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from c059e03 to fe940d6CompareNovember 11, 2025 22:40
@jkczyz

Copy link
Copy Markdown
Contributor

Rebased! Will take over the PR from here 🫡

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Rebased! Will take over the PR from here 🫡

Thanks, @jkczyz! I will be able to give some review this week. Blocked out some space for it.

@dunxen

Copy link
Copy Markdown
ContributorAuthor

Just looked through the docs/comments and hope they are still valid since this PR was opened.

dunxenand others added 2 commits November 20, 2025 11:30
…annel
We introduce a `ChannelManager::accept_inbound_channel_with_contribution`
method allowing contributing to the overall channel capacity of an inbound
dual-funded channel by contributing inputs.
Comment threadlightning/src/ln/channelmanager.rs Outdated
Comment on lines +9871 to +9872
/// portion of the channel value. Our contribution will be calculated as the total value of these
/// inputs minus the fees we need to cover for the interactive funding transaction. The witness

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.

This actually isn't accurate. The contribution is given by our_funding_satoshis, while funding_inputs must have enough for that plus any fees. The remaining value should go to change. Updated the docs accordingly.

Comment threadlightning/src/ln/channel.rs Outdated
script_pubkey: funding.get_funding_redeemscript().to_p2wsh(),
};

// Optionally add change output

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.

Updated to use the new FundingNegotiationContext::into_interactive_tx_constructor. However, since this consumes self, I had to make FundingNegotiationContext an Option. Also, added some helpers to avoid unwrap. Unfortunately, it cannot be avoided for locktime, but maybe the two Options can be replaced with the FundingNegotiation enum or a dedicated one. @wpaulino Thoughts?

Comment threadlightning/src/ln/channel.rs Outdated
};

// Optionally add change output
let change_script = signer_provider.get_destination_script(context.channel_keys_id)

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.

Done.

@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from fe940d6 to ed4d8a5CompareNovember 20, 2025 17:32
@jkczyz
jkczyz requested a review from wpaulinoNovember 20, 2025 17:33
jkczyzand others added 2 commits November 20, 2025 19:30
We can now run through the case where the acceptor contributes to an
inbound channel, with either more value in inputs, or less value, leading
to a different `tx_signatures` exchange order.
We also cannot use dummy P2WPKH funding inputs and witnesses anymore as
`funding_transaction_signed` internally verifies signatures. Hence, we
create external keypairs that we can create outputs for and sign with.
@jkczyz
jkczyzforce-pushed the 2025-04-contributeinputs branch from ed4d8a5 to 9a04ed0CompareNovember 21, 2025 23:06
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 3rd Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 4th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 5th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 6th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 7th Reminder

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

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 8th Reminder

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

Comment on lines +14197 to +14198
funding_negotiation_context: None,
interactive_tx_constructor: Some(interactive_tx_constructor),

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.

Would be nice to reuse FundingNegotiation here, but it seems unclear whether the last AwaitingSignatures state can be adapted to the initial dual funding state


// TODO(dual_funding): Use real node and API for creating V2 channels as initiator when available,
// instead of manually constructing messages.
fn do_test_v2_channel_establishment(session: V2ChannelEstablishmentTestSession) {

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.

Let's just drop these until we can use the real API?

pub fn accept_inbound_channel_with_contribution(
&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey,
user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>,
our_funding_contribution: Amount, funding_inputs: Vec<FundingTxInput>,

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.

We're also allowed to include outputs, behaving similar to the mixed mode splice, so maybe it's worth waiting until we figure that out in #4261 so we can adopt it here?

@jkczyzjkczyz mentioned this pull request Mar 19, 2026
50 tasks
@ldk-reviews-bot

Copy link
Copy Markdown

Hi @dunxen,

Thanks for your contributions to rust-lightning!

After too many struggles with bugs, outages, contributor bans, and, finally, a multi-week CI ban, the rust-lightning project is moving off of GitHub for day-to-day development.

You can still file issues and access the git tree here, but PRs will now take place exclusively at https://git.rust-bitcoin.org/. As such, this PR has been migrated to https://git.rust-bitcoin.org/lightningdevkit/rust-lightning/pulls/3735

If you log in using GitHub (or otherwise link your GitHub account from https://git.rust-bitcoin.org/user/settings/security), ownership of your PRs, issues, and comments will automatically transfer. To push updates to this PR, you'll need to use git push git@gitea-ssh.bitcoin.ninja:lightningdevkit/rust-lightning YOUR_LOCAL_COMMIT_OR_BRANCH:dunxen/2025-04-contributeinputs. This may require a permissions change - if it doesn't work initially just leave a comment and we'll get you access.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@dunxen@ldk-reviews-bot@wpaulino@jkczyz