Skip to content

Add pending SpliceDetails to ChannelDetails#4687

Open
jkczyz wants to merge 6 commits into
lightningdevkit:mainfrom
jkczyz:2026-06-splice-details-fable
Open

Add pending SpliceDetails to ChannelDetails#4687
jkczyz wants to merge 6 commits into
lightningdevkit:mainfrom
jkczyz:2026-06-splice-details-fable

Conversation

@jkczyz

@jkczyz jkczyz commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Wallets like LDK Node need to show a channel's pending splice state (e.g., when displaying channel details), but it is currently only observable by tracking events or the broadcaster's TransactionType::InteractiveFunding, neither of which can be queried on demand.

This adds an optional splice_details field to ChannelDetails exposing that state: any splice/RBF round under negotiation (status, feerate, our contribution, txid and post-splice value once known) and any negotiated candidates awaiting confirmations, along with the splice_locked txids exchanged.

The first commit refactors PendingFunding to store each round's contribution with its negotiated candidate instead of in a tail-aligned parallel list, which every consumer had to realign (and which this API initially got wrong). The on-disk format is unchanged and remains readable by LDK 0.2.

@ldk-reviews-bot

ldk-reviews-bot commented Jun 12, 2026

Copy link
Copy Markdown

👋 Thanks for assigning @joostjager 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.

Comment thread lightning/src/ln/channel.rs Outdated
Comment on lines +3121 to +3130
// Data written before the in-flight round's contribution was stored separately kept it
// as the last entry while a negotiation was pending.
if negotiation_contribution.is_none() && contributions.len() > fundings.len() {
negotiation_contribution = contributions.pop();
}
// An in-flight contribution is only meaningful while its negotiation round is alive;
// rounds not surviving serialization round trips have their events handled separately.
if funding_negotiation.is_none() {
negotiation_contribution = None;
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This heuristic for recovering the in-flight contribution from LDK 0.2 data is insufficient when there are leading counterparty-only (None) candidates.

In the old format the in-flight (AwaitingSignatures) round's contribution was appended as the last entry of contributions while a negotiation was pending, but it is not in negotiated_candidates yet. Since contributions form a suffix, with K contributed prior candidates and M total prior candidates (M >= K), the old contributions length is K + 1 (the +1 being the in-flight). This heuristic only pops when K + 1 > M, i.e. only when K == M (no leading None candidates).

When M > K (at least one leading counterparty-only candidate), K + 1 <= M, so the pop is skipped and:

  • negotiation_contribution stays None (the in-flight contribution is lost), and
  • contrib_offset = M - (K+1) mis-assigns: one prior candidate at contrib_offset wrongly receives a contribution and the in-flight contribution is consumed into the candidate list.

Concrete minimal case from old 0.2 data: candidates=[None] (counterparty-only splice) followed by a we-contribute RBF round at AwaitingSignatures → old bytes are fundings=[f0], contributions=[c]. Here 1 > 1 is false, so this reads back as candidate[0].contribution = Some(c) and negotiation_contribution = None, both incorrect (should be candidate[0].contribution = None, negotiation_contribution = Some(c)). This is exactly the first-contribution-on-RBF flow exercised by the new test, and would corrupt contribution tracking / splice_funding_failed and later trip the suffix debug_assert! in splice_funding_negotiated.

The presence of an in-flight contribution in old data can't be detected by length alone here; it needs to be tied to funding_negotiation.is_some() together with the suffix structure.

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.

I don't think this is an issue, 0.2 doesn't support RBF so it can't have multiple candidates/contributions.

@ldk-claude-review-bot

ldk-claude-review-bot commented Jun 12, 2026

Copy link
Copy Markdown
Collaborator

No Edit tool available; I'll skip the memory update and finalize the review.

I re-reviewed the current state (commit 1e1ecb7), focusing on changes since my prior pass: the serialization redesign, the to_details/SpliceDetails API, the prior-version splice rejection, the pending_funding() iterator refactor, and the cross-version tests.

No new issues found.

Verified in this pass:

  • to_details has no panic paths — funding_feerate_sat_per_1000_weight() is total over all FundingNegotiation variants, new_channel_value_satoshis/txid correctly resolve to None for AwaitingAck, and minimum_depth(...).expect(...) is only reached for a ready FundedChannel.
  • The new splice_channel "prior LDK version" rejection (channel.rs:12939-12952) fires only for 0.2-inherited data: in 0.3, last_funding_feerate_sat_per_1000_weight is set in on_tx_signatures_exchange whenever a candidate exists, and an in-flight negotiation always carries a feerate, so prev_feerate is always Some. No spurious failures in 0.3.
  • prior_contributed_inputs/prior_contributed_outputs now iterate only negotiated_candidates contributions; they are only called from maybe_splice_funding_failed, which requires an in-flight negotiation, so "candidates == prior rounds" matches the old [..len-1] semantics.
  • pending_funding() now returns an ExactSizeIterator; all call sites were updated (the .len() at channel.rs:8898 is valid), and no stale references to the removed .contributions field remain.
  • Write/read is_rbf gate consistency, the leading-None + in-flight round case, and the legacy TLV-3 fallback all round-trip correctly.

The two issues from my earlier passes (even field for the in-flight contribution; the length-based 0.2-recovery heuristic) remain resolved by the redesign.

Cross-cutting carry-over (raised previously, not re-posted): the 8 → 9 renumber of last_funding_feerate_sat_per_1000_weight is only safe if no released LDK 0.2 build ever persisted the old even field 8 for a pending splice. The reasoning that the feerate is 0.3-only plus the passing upgrade_single_splice_from_0_2 test is consistent with this, but it cannot be verified from this repo alone and warrants maintainer confirmation.

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

Comment thread lightning/src/ln/channel.rs Outdated
Comment on lines +3121 to +3130
// Data written before the in-flight round's contribution was stored separately kept it
// as the last entry while a negotiation was pending.
if negotiation_contribution.is_none() && contributions.len() > fundings.len() {
negotiation_contribution = contributions.pop();
}
// An in-flight contribution is only meaningful while its negotiation round is alive;
// rounds not surviving serialization round trips have their events handled separately.
if funding_negotiation.is_none() {
negotiation_contribution = None;
}

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.

I don't think this is an issue, 0.2 doesn't support RBF so it can't have multiple candidates/contributions.

Comment thread lightning/src/ln/channel_state.rs Outdated
@wpaulino wpaulino requested a review from TheBlueMatt June 15, 2026 18:43
@jkczyz jkczyz mentioned this pull request Jun 15, 2026
50 tasks
@jkczyz jkczyz requested a review from wpaulino June 15, 2026 23:08
Comment thread lightning/src/ln/channel.rs Outdated
Comment thread lightning/src/ln/channel_state.rs Outdated
@jkczyz jkczyz force-pushed the 2026-06-splice-details-fable branch from 30fdc02 to 3f954c5 Compare June 16, 2026 23:12
@jkczyz jkczyz requested a review from wpaulino June 16, 2026 23:13
@jkczyz jkczyz added this to the 0.3 milestone Jun 17, 2026
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

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

}

#[test]
fn upgrade_single_splice_from_0_2() {

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 expand this test to also attempt an RBF after upgrading?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Hmm, seems like we won't be able to RBF as we can't determine if we've contributed. At least we can't without losing our prior contributions. I added a guard to prevent this, which was previously a debug_assert on the last funding feerate.

}

#[test]
fn downgrade_single_splice_loads_on_0_2() {

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.

Can we still RBF if we negotiate the splice on 0.3, downgrade to 0.2, and upgrade back? I assume no since we're missing the contribution.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yeah, same as upgrading from 0.2. See other comment.

/// Note that a negotiation which has not yet reached
/// [`SpliceNegotiationStatus::AwaitingSignatures`] does not survive a restart, so this only
/// reflects in-memory negotiation state.
pub negotiation: Option<SpliceNegotiationDetails>,

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 it be possible to also surface the state after funding_contributed but before actual splice negotiation? This might be useful to tighten fuzz invariants.

Suggestion from #4699 (comment)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yeah, good idea. If they called funding_contributed successfully, it should show up here even if we haven't reached quiescence.

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.

Great, will then tighten the invariant SpliceDetails when this lands

@jkczyz jkczyz force-pushed the 2026-06-splice-details-fable branch from 22eba7d to 984f4cc Compare June 18, 2026 16:12
@jkczyz jkczyz requested review from joostjager and wpaulino June 18, 2026 16:13
@wpaulino

Copy link
Copy Markdown
Contributor

LGTM after squash+rebase

@jkczyz jkczyz self-assigned this Jun 18, 2026
Comment thread lightning/src/ln/channel.rs
@jkczyz jkczyz force-pushed the 2026-06-splice-details-fable branch 3 times, most recently from 0b47b8b to 6bec475 Compare June 18, 2026 21:34
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 2nd Reminder

Hey @TheBlueMatt @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

🔔 1st Reminder

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

@jkczyz jkczyz force-pushed the 2026-06-splice-details-fable branch from 0c00583 to a9861ef Compare June 24, 2026 17:03
@jkczyz jkczyz requested a review from joostjager June 24, 2026 17:04
@codecov

codecov Bot commented Jun 24, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 96.86275% with 8 lines in your changes missing coverage. Please review.
✅ Project coverage is 86.96%. Comparing base (e225350) to head (1e1ecb7).
⚠️ Report is 3228 commits behind head on main.

Files with missing lines Patch % Lines
lightning/src/ln/channel.rs 96.49% 8 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #4687      +/-   ##
==========================================
+ Coverage   84.51%   86.96%   +2.44%     
==========================================
  Files         137      161      +24     
  Lines       77446   111828   +34382     
  Branches    77446   111828   +34382     
==========================================
+ Hits        65456    97252   +31796     
- Misses       9949    12065    +2116     
- Partials     2041     2511     +470     
Flag Coverage Δ
fuzzing-fake-hashes 8.41% <0.00%> (?)
fuzzing-real-hashes 32.56% <91.30%> (?)
tests 86.29% <96.86%> (?)

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

☔ View full report in Codecov by Harness.
📢 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.

joostjager
joostjager previously approved these changes Jun 25, 2026

@joostjager joostjager left a comment

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.

Looks good! No blockers

Comment thread lightning/src/ln/channel.rs Outdated
Comment thread lightning/src/ln/splicing_tests.rs Outdated
let (funding_tx, channel_id) =
open_zero_conf_channel_with_value(&nodes[0], &nodes[1], None, initial_channel_value_sat, 0);
mine_transaction(&nodes[0], &funding_tx);
mine_transaction(&nodes[1], &funding_tx);

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.

Isn't the sharper version of this test also not mining the original finding?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yeah, just needed to unroll the helpers. Claude wanted to be lazy.

Comment thread lightning/src/ln/splicing_tests.rs
Comment thread lightning/src/ln/channel_state.rs
Comment thread lightning-tests/src/upgrade_downgrade_tests.rs Outdated
@jkczyz jkczyz force-pushed the 2026-06-splice-details-fable branch from a9861ef to 9619e39 Compare June 25, 2026 15:19
joostjager
joostjager previously approved these changes Jun 26, 2026
Comment thread lightning/src/ln/splicing_tests.rs Outdated
} else {
panic!("expected FundingTransactionReadyForSigning, got {event:?}");
};
let partially_signed = nodes[0].wallet_source.sign_tx(unsigned_tx).unwrap();

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.

Using the unconfirmed funding expands the test quite a bit. Seeing that, I am not sure it is worth it for just testing SpliceDetails. Perhaps the helper could be adapted instead. Or go back to the confirmed funding shape. But can also leave as is.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Added a parameter for this and then tacked on a refactor commit to make the call sites more readable with a SignInteractiveFundingTxArgs builder.

Comment thread lightning/src/ln/channel.rs Outdated
// An in-flight contribution is only meaningful while its negotiation round is alive;
// rounds not surviving serialization round trips have their events handled separately.
if funding_negotiation.is_none() {
negotiation_contribution = None;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Shouldn't this just err? we have explicit handling for this on the write side and this isn't allowed.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yeah, good point.

Comment thread lightning/src/ln/channel.rs Outdated
PendingFunding tracked our splice contributions in a compact list
implicitly aligned to the tail of the negotiated candidates, with the
in-flight negotiation round's contribution as the implicit last entry.
Every consumer had to re-derive this positional relationship, which is
easy to get wrong -- e.g., attributing an in-flight round's
contribution to a completed counterparty-only candidate.

Instead, store each candidate's contribution with the candidate itself
and give the in-flight round's contribution its own field, making such
misattribution unrepresentable. The contributions still form a suffix
of the candidates -- once a round includes our contribution, every
subsequent round carries it forward (possibly feerate-adjusted) so the
splice intention is never lost -- which is now asserted when a round
completes.

Serialize this so a single (non-RBF) pending splice stays loadable by
LDK 0.2 while RBF is refused loudly. 0.2 predates per-candidate
contributions, the in-flight contribution, and the last-negotiated
feerate, so writing any of them in an even (required) TLV would make 0.2
refuse even a single splice it can otherwise operate. The legacy TLV 3
therefore carries only the first candidate's funding -- the single-splice
view 0.2 reads -- while the full candidate list, the in-flight
contribution, and the feerate go in odd TLVs that 0.2 skips. An even gate
TLV is written only when there is more than one negotiation round (RBF),
so 0.2 loads single splices and refuses RBF, which it cannot operate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@jkczyz jkczyz force-pushed the 2026-06-splice-details-fable branch from 9619e39 to b3f17bb Compare June 26, 2026 15:45
jkczyz and others added 5 commits June 26, 2026 10:47
A channel may have splice attempts in progress: a contribution we have
committed but not yet begun negotiating, one under negotiation with the
counterparty, and any negotiated transactions (the original splice and
any RBF replacements) waiting on confirmations. This state was only
observable through events and the broadcaster's
TransactionType::InteractiveFunding, neither of which can be queried on
demand.

Add an optional splice_details field to ChannelDetails exposing: the
negotiation status and our contribution to it; a contribution queued
ahead of negotiation; the negotiated candidates (txid, post-splice
channel value, and our contribution); the single candidate that has
confirmed, with its confirmation progress and whether we have sent
splice_locked for it; and the txid of any splice_locked received from
the counterparty.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add tests exercising the 0.2/current wire boundary for pending splices:
- A current node with a single pending splice (whether or not we
  contributed to it) is loadable by LDK 0.2.
- A current node with a splice under RBF is refused by 0.2 via the even
  RBF-gate TLV.
- A single pending splice written by 0.2 is read by current with no
  contribution recorded, since 0.2 never tracked one.

The downgrade reload configs enable anchors so 0.2 accepts the current
channel type rather than refusing it before the splice state is reached.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rsion

A pending splice negotiated before an upgrade from a prior LDK version
(e.g. 0.2) returns without its feerate or our contribution: 0.2 persists
neither and drops the odd TLVs that carry them. splice_channel derives the
RBF feerate floor from the prior splice's feerate and assumed it was always
present via a debug assertion, so attempting to splice such a channel
tripped that assertion.

Return a clean error instead, refusing to splice a channel whose pending
splice lacks the metadata to reconstruct the prior request.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The signing helper had accumulated four boolean/option parameters beyond the
two nodes, so call sites passed opaque positional `false`s and bare `None`s
whose meaning was unclear without consulting the signature.

Replace the two overloaded functions with a single `sign_interactive_funding_tx`
taking a `SignInteractiveFundingTxArgs` builder, mirroring `PassAlongPathArgs`:
`new(initiator, acceptor)` defaults to a first-attempt splice on a confirmed
channel with no acceptor contribution, and each non-default behavior is opted
into by a named method (`zero_conf`, `with_acceptor_contribution`, `replacing`,
`with_unconfirmed_prior_funding`).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@jkczyz jkczyz force-pushed the 2026-06-splice-details-fable branch from b3f17bb to 1e1ecb7 Compare June 26, 2026 15:53

@jkczyz jkczyz left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Went ahead and squashed the fixup

Comment thread lightning/src/ln/channel.rs Outdated
// An in-flight contribution is only meaningful while its negotiation round is alive;
// rounds not surviving serialization round trips have their events handled separately.
if funding_negotiation.is_none() {
negotiation_contribution = None;

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yeah, good point.

Comment thread lightning/src/ln/splicing_tests.rs Outdated
} else {
panic!("expected FundingTransactionReadyForSigning, got {event:?}");
};
let partially_signed = nodes[0].wallet_source.sign_tx(unsigned_tx).unwrap();

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Added a parameter for this and then tacked on a refactor commit to make the call sites more readable with a SignInteractiveFundingTxArgs builder.

@jkczyz jkczyz requested review from TheBlueMatt and joostjager June 26, 2026 15:54
@joostjager

joostjager commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

@jkczyz do you have a diff link with the changes? This is a big PR. Tried to find the diff, but it looks like there might have been a rebase too. That refactor commit might be better in a follow up maybe, at this stage of the PR.

@joostjager

joostjager commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

Ok, got the diff. Not a rebase, just confused by the added commit.

@joostjager joostjager left a comment

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.

Changes look good to me. I just skimmed the final refactor commit. As mentioned above, I think it is better to leave out at this stage.


let tx = {
let mut initiator_txn = initiator.tx_broadcaster.txn_broadcast_with_types();
if let Some(prior_funding_txid) = prior_funding_txid {

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.

The word prior, isn't that a splice-specific term? Aren't we just talking about the unconf'ed funding tx?

/// Arguments for [`sign_interactive_funding_tx`]. [`SignInteractiveFundingTxArgs::new`] defaults to a
/// first-attempt splice on a confirmed channel where only the initiator contributes; augment with the
/// builder methods as the scenario requires.
pub struct SignInteractiveFundingTxArgs<'a, 'b, 'c, 'd> {

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.

It's generally cleaner to do a refactor commit first, and then actual changes that the PR is about. To avoid rewriting things.

pub struct SignInteractiveFundingTxArgs<'a, 'b, 'c, 'd> {
pub initiator: &'a Node<'b, 'c, 'd>,
pub acceptor: &'a Node<'b, 'c, 'd>,
pub is_0conf: bool,

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.

Make private because there are already methods to set this?

@TheBlueMatt TheBlueMatt left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Sorry it took me a bit to get through this.

///
/// [`ChannelManager::funding_contributed`]: crate::ln::channelmanager::ChannelManager::funding_contributed
/// [`negotiation`]: Self::negotiation
pub queued_contribution: Option<FundingContribution>,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Why isn't this just a state and this returned in negotiation? Most of the fields in SpliceNegotiationDetails are Options already, its not really all that different.

Comment on lines +830 to +834
pub confirmations_required: u32,
/// Whether we have sent `splice_locked` for this candidate, i.e., we consider it to have
/// sufficient confirmations. The `splice_locked` we sent always refers to this confirmed
/// candidate, so it is tracked here rather than as a separate txid.
pub splice_locked_sent: bool,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Its a bit confusing, and not really explained, that in fact we might consider a splice locked and ready to confirm but the counterparty might not. I also don't really love making explicit reference to the lightning P2P message that we happen to be using - we never really explain what "sending splice_locked" actually means anywhere here.


// Drain the counterparty's pending `splice_locked` so teardown is clean; completing the lock is
// exercised elsewhere.
nodes[1].node.get_and_clear_pending_msg_events();

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

In general please don't write tests that just fetch messages and ignore them. Its not more LoC to write get_event_msg!(nodes[1], MessageSendEvent::SpliceLocked, node_a_id).

But specifically for this test I don't see any tests that check the state of the splice details set after a 0conf is locked in, so it seems like this really should be extended.

})
}

fn to_details<SP: SignerProvider>(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Might be worth making sure chanmon_consistency calls list_channels (maybe via the check-invariants function) after each step so hit this in as many states as possible.

}

#[test]
#[should_panic(expected = "UnknownRequiredFeature")]

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

nit: might be nicer to do a catch_panic on the line we expect the error on so that its contained.

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

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

6 participants