Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
953ac60
Accept tx_init_rbf for pending splice transactions
jkczyz Feb 18, 2026
78619be
f - Also check sent_funding_txid in validate_tx_init_rbf
jkczyz Mar 5, 2026
b99dd74
f - Remove redundant holder_is_quiescence_initiator field
jkczyz Mar 5, 2026
f34d9f8
f - Remove unnecessary debug_assert in internal_tx_init_rbf
jkczyz Mar 5, 2026
0097459
f - DRY up splice_init and tx_init_rbf acceptor paths
jkczyz Mar 5, 2026
e276b42
f - Use last negotiated candidate in validate_tx_init_rbf
jkczyz Mar 6, 2026
74a8b1b
f - Use ChannelError::Abort for negotiation rejections in validate_tx…
jkczyz Mar 6, 2026
9bc7257
Allow multiple RBF splice candidates in channel monitor
jkczyz Feb 19, 2026
90b44f2
f - Document dual-funded channel locking property in comment
jkczyz Mar 6, 2026
d2dd300
Add rbf_channel API for initiating splice RBF
jkczyz Feb 19, 2026
cbacc68
f - Also check received_funding_txid in can_initiate_rbf
jkczyz Mar 5, 2026
3d8fb40
Send tx_init_rbf instead of splice_init when a splice is pending
jkczyz Feb 19, 2026
90aa3f5
Handle tx_ack_rbf on the initiator side
jkczyz Feb 19, 2026
8ab8917
f - Extract awaiting_ack_context and begin_funding_negotiation helpers
jkczyz Mar 5, 2026
3c849b6
f - Replace begin_funding_negotiation with FundingNegotiation::for_in…
jkczyz Mar 5, 2026
e19793e
f - Use specific expect messages in tx_ack_rbf and splice_ack
jkczyz Mar 5, 2026
f51e1fa
f - Add test_splice_rbf_not_quiescence_initiator test
jkczyz Mar 5, 2026
03fa24e
f - Update test_splice_rbf_not_quiescence_initiator to expect tx_abort
jkczyz Mar 6, 2026
149346c
f - Remove unnecessary debug_assert in internal_tx_ack_rbf
jkczyz Mar 5, 2026
3931402
f - Use last negotiated candidate in validate_tx_ack_rbf
jkczyz Mar 6, 2026
d67118b
Allow acceptor contribution to RBF splice via tx_init_rbf
jkczyz Feb 19, 2026
4e4f00e
f - DRY up lock_rbf_splice_after_blocks by reusing lock_splice
jkczyz Mar 6, 2026
e1cf62a
f - Clean up discarded funding watches in lock_splice
jkczyz Mar 6, 2026
6fe4c54
Preserve our funding contribution across counterparty RBF attempts
jkczyz Feb 23, 2026
20594f2
f - Remove redundant debug_assert in send_tx_init_rbf path
jkczyz Mar 6, 2026
8054570
f - Use ChannelError::Abort for prior contribution failures in tx_ini…
jkczyz Mar 6, 2026
30c9b5a
f - Remove redundant manual cleanup from splicing tests
jkczyz Mar 6, 2026
9c2f382
Consider prior contributions when filtering unique inputs/outputs
jkczyz Feb 24, 2026
6d9276f
Filter prior contributions from SpliceFundingFailed events
jkczyz Feb 25, 2026
b52a2b5
f - Compare script_pubkey instead of entire TxOut when filtering outputs
jkczyz Mar 9, 2026
e48133e
Handle FeeRateAdjustmentError variants in splice acceptor path
jkczyz Feb 25, 2026
743630e
f - Simplify FeeRateAdjustmentError match by moving suffixes into Dis…
jkczyz Mar 5, 2026
f662eea
f - Use ChannelError::Abort for FeeRateTooHigh in resolve_queued_cont…
jkczyz Mar 6, 2026
d51dbd0
f - test rejecting RBF when fee rate is too high
jkczyz Feb 25, 2026
e9cbe71
f - Update test_splice_rbf_tiebreak_feerate_too_high_rejected to expe…
jkczyz Mar 6, 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
13 changes: 10 additions & 3 deletions lightning/src/chain/channelmonitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4039,9 +4039,16 @@ 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. This also ensures a dual-funded channel has exchanged
// `channel_ready` (implying funding is confirmed) before allowing a splice,
// since unconfirmed initial funding has no splice parent.
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
Loading
Loading