Repository navigation
Dual-funded channels and Splicing Project Tracking #1621
Copy link
Copy link
Closed
Labels
Description
Overview
Project tracking and implementation status of interactive transaction construction, dual-funding (V2 channel establishment), channel quiescence, and splicing.
Specifications:
- BOLT 2: Interactive transaction construction
- BOLT 2: Dual-funding (a.k.a V2 channel establishment)
- BOLT 2: Channel quiescence
- BOLT 2: Splicing (PR).
Wire messages
- Dual funding and interactive tx construction wire messages #1794
- Remove
OptionalFieldand makeDataLossProtectfields mandatory #2253 - Add Splicing messages #2542
Interactive Transaction Construction
- Interactive Transaction Construction #2419
- Interactive TX negotiation tracks shared outputs #2989
- Support RBF for interactively constructed transactions #3281 (depends on Implement accepting dual-funded channels without contributing #3137)
Dual-funding (V2 channel establishment)
0. Refactoring
- Split prefunded
ChannelintoInbound/Outboundchannels #2077 - Address outstanding 2077 feedback #2382
1. Accept dual-funded channels
- Implement accepting dual-funded channels without contributing #3137
- Follow-ups for PR 3137 #3416
- Introduce interactive signing state flags for funded states. #3637
- Interop tests and fixes
- Release in 0.2
2. Accept dual-funded channels with contributions
- Interop tests and fixes
- Release as alpha
3. Create & accept dual-funded channels
- Move funding signing after commitment #1571
- Implement V2 channel establishment #2302 (depends on Implement accepting dual-funded channels without contributing #3137)
- (Maybe) Allow initiator and acceptor to add other outputs
- Interop tests and fixes
- Release
4. RBF support
Dual-funding implementation phase feature table
🟢 = supported
🔴 = unsupported
| Impl. phase | Accept V2 | Create V2 | RBF | Contribute funds |
|---|---|---|---|---|
| 1. Accept V2 channels | 🟢 | 🔴 | 🔴 | 🔴 |
| 2. Accept V2 channels w/con | 🟢 | 🔴 | 🔴 | 🔴 |
| 3. Create V2 channels | 🟢 | 🟢 | 🔴 | 🟢 |
| 3. RBF support | 🟢 | 🟢 | 🟢 | 🟢 |
Channel quiescence
- Enable decoding HTLC onions when fully committed #2933
- WIP based on Enable decoding HTLC onions when fully committed #2933 (should be only one PR; cc: @wpaulino)
Splicing
Draft/Prototype PRs
- [Early Draft] Splicing prototype #3274: Very old baseline (v0.0.123); prototype (not for merging). Splicing use case works, from V2, from V1, also pay-splice-pay. Also prototype support for RBF.
- [Early Draft][Splicing] Partial, perform interactive transaction negotiation for new funding #3444: Obsolete solution, uses duplicate
ChannelContextvia cloning (not for merging). Currently splicing use case works up to exchange oftx_complete's, but notcommitment_signed. - [Early Draft][Splicing] Interactive tx negotiation, with a single ChannelContext #3715: Most recent version, no
ChannelContextduplication. Currently splicing use case works up to the firsttx_complete.
Use case phases status
| Use case phase | branch or draft PR | merged/pending PRs |
|---|---|---|
Initial handshake, splice_init, splice_ack |
main | #3407 #3647 |
Tx negotiation, tx_add_input, tx_add_output |
#3715 | #3443 |
Tx negotiation completion, final tx_complete's |
#3444 | - |
| Commitment exchange | #3274 | - |
tx_signatures exchange, funding tx broadcast |
#3274 | - |
splice_locked exchange, after confirmation |
#3274 | - |
0. Preparations
- ([Splicing] Add
splicingcompile feature flag #3294 ) - [Splicing] Support shared signature in InteractiveTransaction #3295
- ([Splicing] Update Splicing msgs #3293)
- ([Splicing] Preserve
funding_transactionfor the later lifecycle of the channel #3317) ([Splicing] Make funding transaction available in funded channel #3300 ) - ([Splicing] Signer extended with method to sign prev funding transaction input #3316) ([Splicing] Signing utility for splicing #3312 )
- ([Splicing] Clone for ChannelContext #3332)
- ([Splicing] Partial, handle splice_init & splice_ack messages #3407)
- (Dual funding extension: begin_interactive_funding_tx_construction #3443)
- [Splicing] Add reserve check to splicing #3641 (non-critical)
- [Draft] Combine FundedChannel and PendingV2Channel through traits #3702
- (more to come)
1. Basic implementation
2. Additional features
- Integrate quiescence
- Splice on V1 channel
- RBF support
- Allow payment during pending splice
- Support splice-out
- Contributions from the acceptor
- Handle interruptions and restarts
- Work with other implementations
Reactions are currently unavailable
Metadata
Metadata
Labels
Type
Projects
- StatusShow more project fieldsDone
Activity
npslaney commentedon Jul 18, 2022
Thinking through LSP onboarding strategies having the ability to start with a balanced channel is a really nice option. Definitely watching this one 👀
ariard commentedon Jul 19, 2022
I think one of the first step could be to make
OnchainTxHandlerits own interface that way the reorg/fee-bumping/rebroadcast logic could be shared between ourChannelMonitorandMultipartyConstructionstuff. See : #606 (comment) for ideas.There is also an open question on how much code for doing that is already available in BDK.
dunxen commentedon Jul 19, 2022
Thanks for the comment link! I'll sync up with the BDK peeps on that open question too.
ariard commentedon Sep 17, 2022
Available to review advances in dual-funded implementation, even if it's early refactor for now. I've reviewed back recently the state of the BOLT proposal and it's sounds to be mature enough to solidify around a v0.1.
dunxen commentedon Sep 17, 2022
Great, picking up refactor next! 🙏
dunxen commentedon Oct 10, 2022
Next is now. So picking up from now :)
[-]Support dual-funded channels[/-][+]Dual-funded channels and Splicing Project Tracking[/+]ariard commentedon Aug 1, 2023
Good to have this, don’t hesitate to “review pin” like glozow doing for package relay: bitcoin/bitcoin#27463 (comment) good practice imho to allocate review bandwidth accordingly.
ariard commentedon Sep 12, 2023
FYI, current version of nversion=3 and package RBF sounds working well for both dual-funding and splicing: bitcoin/bitcoin#25038 (comment)
There is one caveat where the first splicing transaction transitioning from nversion=2 to nversion=3 might have to be signed with a compelling feerate to be able to replace a pinning nversion=2 commitment state. If correct, I think it can be documented when nversion=3 is specified on the bolt-side.
All reserves kept as both package relay / nversion=3 / dual-funding and splicing are still work in progress and non-final.
toneloc commentedon Jun 3, 2024
Hi, what is the status here?
Does LDK support dual-funding, and if it does, how? Thanks.
6 remaining items
optout21 commentedon Sep 6, 2024
Updated splice tasks (in earlier comment)
dunxen commentedon Sep 6, 2024
Thanks! Updated!
jkczyz commentedon Sep 6, 2024
I updated the quiescence section based on a discussion with @wpaulino.
optout21 commentedon Apr 8, 2025
Updated description for Splicing, added table with draft PRs / use case phases, updated PR numbers
jkczyz commentedon Jun 21, 2025
Update on splicing progress covering work this year. Everything but RBF is needed for the initial release. ETA Q3.
SplicePendingandSpliceFailedevents #4077InboundV2ChannelandOutboundV2Channel#3498ChannelPhasevariants fromChannelManager#3513Channelenum variants inside a struct #3550ChannelContextvalue fields intoFundingScope#3592ChannelTransactionParametersintoFundingScope#3604FundingScopechecks #3811PendingSplice#3911ConstructedTransactionto containTransaction#4097splice_initandsplice_ackhandling #4011commitment_signedfor splicing #4014is_pre_funded_state#4021 (comment)is_pre_funded_state#4021commitment_signedcommitment_signedhandling by check-accept #3633commitment_signedmessages for splicing #3651ChannelContext::channel_type#3678start_batchmessage batching #3793commitment_signed#3852start_batchfor missing or unexpectedmessage_type#3874splice_lockedmessages #3741splice_lockedmessages #3873channel_reestablishfor splicing #3886ChannelMonitors after splicing #3569ChannelContextvalue fields intoFundingScope#3592 (comment)commitment_signedbatch only allows for 20 anyway) Introduce FundingScope abstraction to ChannelMonitor #3663 (comment)Misc follow-ups from PR review:
ChannelContextvalue fields intoFundingScope#3592 (review)FundingScopechecks #3811 (comment)splice_lockedmessages #3741 (comment)splice_lockedmessages #3741 (comment)TheBlueMatt commentedon Sep 18, 2025
Do we have any tests of initiating a splice while a peer is disconnected, also even better both peers initiating a splice while disconnected? Also I think we never added the logic to initiate a splice/post-quiescent action when we finish the current splice/quiescent action. We should add that.
toneloc commentedon Feb 20, 2026
Hi, is this the correct place to track dual-funding? What is timeline / priority for it with LDK team? Thank you.
jkczyz commentedon Feb 23, 2026
Hi @toneloc,
We should probably make a separate tracker for dual funding. Some of the work overlaps with splicing (#4284). That issue needs to be updated as most work is done. For dual funding, however, there is a partial implementation merged. Currently finishing it is not a high priority, but we'll re-evaluate priorities for the 0.4 release. Are you looking to use it? If so, do you mind sharing your use case?
Last we chatted about this, batching channels open support (available for v1 channel opens) may not be compatible with the dual-funding (v2 channel opens) protocol in its current form. So there may need be some spec work to resolve that.
toneloc commentedon Mar 4, 2026
Thanks @jkczyz for the update.
The use-case I have is to open up a balanced channel for Stable Channels in one on-chain transaction. Stable Channels are basically LN channels that can be used for trading use-cases, so money needs to flow both ways based on updated prices.
Currently, the user can onboard to the Stable Channels wallet over Lightning with JIT channels; this is nice because we open a balanced channel from the get-go.
We want the user to also be able to onboard from on-chain. Some users don't have Lightning funds yet. The way we would make this work currently is that the user would send themselves on-chain BTC to the wallet, then open a single-side-funded channel to the LSP, then the LSP would splice in funds to make it balanced.
Not the worst flow, but extra logic and an extra transaction. Dual-funded channels would simplify this flow into one on-chain transaction.
jkczyz commentedon Mar 4, 2026
For the dual-funding case, I take it the user would still initiated the channel open, not the LSP?
toneloc commentedon May 7, 2026
Sorry @jkczyz I missed this message. Yes, in this case the user would initiate the dual-fund channel open.
[WIP][UNAPPROVED] ░░░░░░░░░░░░░░░░░░░░ transport-lightning-open2: bri…
[WIP][UNAPPROVED] ░░░░░░░░░░░░░░░░░░░░ transport-lightning-open2: bri…