Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
47b72fc
Add expect_splice_failed_events helper
jkczyz Feb 6, 2026
8a64a1b
Extract contributed_{inputs|outputs} iterators
jkczyz Feb 20, 2026
4069f75
Split DiscardFunding from SpliceFailed event
jkczyz Feb 5, 2026
a530287
Print unexpected events upon assertion failure
jkczyz Feb 23, 2026
df1f54a
Add pending changelog for SpliceFailed / DiscardFunding split
jkczyz Feb 20, 2026
a29f681
Stop persisting QuiescentAction and remove legacy code
jkczyz Feb 10, 2026
92ea43e
Split InteractiveTxConstructor::new into outbound/inbound variants
jkczyz Feb 12, 2026
abde595
Adjust FundingContribution for acceptor
jkczyz Feb 19, 2026
bd663ea
Include change output weight in estimate_transaction_fee
jkczyz Feb 23, 2026
658f332
Contribute to splice as acceptor
jkczyz Feb 10, 2026
514e048
Accept tx_init_rbf for pending splice transactions
jkczyz Feb 18, 2026
e7fd507
Allow multiple RBF splice candidates in channel monitor
jkczyz Feb 19, 2026
7fd1f42
Add rbf_channel API for initiating splice RBF
jkczyz Feb 19, 2026
a907ac2
Send tx_init_rbf instead of splice_init when a splice is pending
jkczyz Feb 19, 2026
ab8eb05
Handle tx_ack_rbf on the initiator side
jkczyz Feb 19, 2026
89ff3b9
Test end-to-end RBF splice initiator flow
jkczyz Feb 19, 2026
ccd709e
Allow acceptor contribution to RBF splice via tx_init_rbf
jkczyz Feb 19, 2026
1b2d96d
Preserve our funding contribution across counterparty RBF attempts
jkczyz Feb 23, 2026
7d1c3e1
Add tests for re-using prior contribution on counterparty RBF
jkczyz Feb 23, 2026
08c05f6
Add test for sequential RBF splice attempts
jkczyz Feb 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions lightning/src/chain/channelmonitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4039,9 +4039,14 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
}

if let Some(parent_funding_txid) = channel_parameters.splice_parent_funding_txid.as_ref() {
// Only one splice can be negotiated at a time after we've exchanged `channel_ready`
// (implying our funding is confirmed) that spends our currently locked funding.
if !self.pending_funding.is_empty() {
// Multiple RBF candidates for the same splice are allowed (they share the same
// parent funding txid). A new splice with a different parent while one is pending
// is not allowed.
let has_different_parent = self.pending_funding.iter().any(|funding| {
funding.channel_parameters.splice_parent_funding_txid.as_ref()
!= Some(parent_funding_txid)
});
if has_different_parent {
log_error!(
logger,
"Negotiated splice while channel is pending channel_ready/splice_locked"
Expand Down
23 changes: 11 additions & 12 deletions lightning/src/events/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,13 @@ pub enum FundingInfo {
/// The outpoint of the funding
outpoint: transaction::OutPoint,
},
/// The contributions used for a dual funding or splice funding transaction.
Contribution {
/// UTXOs spent as inputs contributed to the funding transaction.
inputs: Vec<OutPoint>,
/// Outputs contributed to the funding transaction.
outputs: Vec<TxOut>,
},
}

impl_writeable_tlv_based_enum!(FundingInfo,
Expand All @@ -85,6 +92,10 @@ impl_writeable_tlv_based_enum!(FundingInfo,
},
(1, OutPoint) => {
(1, outpoint, required)
},
(2, Contribution) => {
(1, inputs, optional_vec),
(3, outputs, optional_vec),
}
);

Expand Down Expand Up @@ -1561,10 +1572,6 @@ pub enum Event {
abandoned_funding_txo: Option<OutPoint>,
/// The features that this channel will operate with, if available.
channel_type: Option<ChannelTypeFeatures>,
/// UTXOs spent as inputs contributed to the splice transaction.
contributed_inputs: Vec<OutPoint>,
/// Outputs contributed to the splice transaction.
contributed_outputs: Vec<TxOut>,
},
/// Used to indicate to the user that they can abandon the funding transaction and recycle the
/// inputs for another purpose.
Expand Down Expand Up @@ -2326,8 +2333,6 @@ impl Writeable for Event {
ref counterparty_node_id,
ref abandoned_funding_txo,
ref channel_type,
ref contributed_inputs,
ref contributed_outputs,
} => {
52u8.write(writer)?;
write_tlv_fields!(writer, {
Expand All @@ -2336,8 +2341,6 @@ impl Writeable for Event {
(5, user_channel_id, required),
(7, counterparty_node_id, required),
(9, abandoned_funding_txo, option),
(11, *contributed_inputs, optional_vec),
(13, *contributed_outputs, optional_vec),
});
},
// Note that, going forward, all new events must only write data inside of
Expand Down Expand Up @@ -2964,8 +2967,6 @@ impl MaybeReadable for Event {
(5, user_channel_id, required),
(7, counterparty_node_id, required),
(9, abandoned_funding_txo, option),
(11, contributed_inputs, optional_vec),
(13, contributed_outputs, optional_vec),
});

Ok(Some(Event::SpliceFailed {
Expand All @@ -2974,8 +2975,6 @@ impl MaybeReadable for Event {
counterparty_node_id: counterparty_node_id.0.unwrap(),
abandoned_funding_txo,
channel_type,
contributed_inputs: contributed_inputs.unwrap_or_default(),
contributed_outputs: contributed_outputs.unwrap_or_default(),
}))
};
f()
Expand Down
Loading
Loading