Skip to content

tests: add xfail-strict reproducer for funder-side stuck CHANNELD_AWAITING_LOCKIN#9113

Open
ksedgwic wants to merge 2 commits intoElementsProject:masterfrom
ksedgwic:stuck-awaiting-lockin-test
Open

tests: add xfail-strict reproducer for funder-side stuck CHANNELD_AWAITING_LOCKIN#9113
ksedgwic wants to merge 2 commits intoElementsProject:masterfrom
ksedgwic:stuck-awaiting-lockin-test

Conversation

@ksedgwic
Copy link
Copy Markdown
Collaborator

@ksedgwic ksedgwic commented May 5, 2026

When a node is the funder of a channel whose funding tx never confirms (broadcast rejected at ATMP, evicted from mempool, or simply never broadcast), the channel record stays in CHANNELD_AWAITING_LOCKIN indefinitely. CLN already implements the BOLT 2 fundee-side forget rule (PR #1468, --max-funding-unconfirmed-blocks, default 2016) but has no equivalent on the funder side.

The test asserts the desired post-fix behavior (state has moved beyond CHANNELD_AWAITING_LOCKIN) and is marked @pytest.mark.xfail(strict=True) so:

  • CI reports XFAIL today (acceptable; documents the open bug)
  • When the bug is fixed, the test reports XPASS, which strict=True promotes to a hard failure to alert the dev to remove the marker.

Reproduces #9112

…ITING_LOCKIN

When a node is the funder of a channel whose funding tx never confirms
(broadcast rejected at ATMP, evicted from mempool, or simply never
broadcast), the channel record stays in CHANNELD_AWAITING_LOCKIN
indefinitely. CLN already implements the BOLT 2 fundee-side forget
rule (PR ElementsProject#1468, --max-funding-unconfirmed-blocks, default 2016) but
has no equivalent on the funder side.

The test asserts the desired post-fix behavior (state has moved beyond
CHANNELD_AWAITING_LOCKIN) and is marked @pytest.mark.xfail(strict=True)
so:

  - CI reports XFAIL today (acceptable; documents the open bug)
  - When the bug is fixed, the test reports XPASS, which strict=True
    promotes to a hard failure to alert the dev to remove the marker.

Changelog-None
…LATERAL

Same root cause as the previous test_funder_stuck_no_funding_confirm
(funding tx unbroadcastable/unconfirmable, no funder-side cleanup).
This variant covers the second symptom: when the operator (or an
automation like CLBOSS's spenderp) issues `close` on the AWAITING_LOCKIN
channel, CLN transitions to AWAITING_UNILATERAL and tries to broadcast
a commitment tx that spends the (non-existent) funding output. That
commit tx can never confirm either, so the channel record now sits
stuck in AWAITING_UNILATERAL indefinitely.

Stops l2 before close to force unilateral and avoid mutual close
racing in.

Marked xfail-strict so the bug is documented without breaking CI.

Changelog-None
@ksedgwic
Copy link
Copy Markdown
Collaborator Author

ksedgwic commented May 5, 2026

Adds a second xfail-strict reproducer for the same root cause:
test_funder_stuck_close_before_funding_confirm.

If the operator (or an automation like CLBOSS's spenderp) issues
close while the funder is in CHANNELD_AWAITING_LOCKIN with an
unbroadcastable funding tx, the channel transitions to
AWAITING_UNILATERAL and CLN tries to broadcast a commitment tx that
spends the (non-existent) funding output. That commit tx can never
confirm either, so the channel record sits stuck in
AWAITING_UNILATERAL indefinitely.

Same setup as the first test (mock_rpc on sendrawtransaction +
dev-max-funding-unconfirmed-blocks=10); diverges by stopping l2 and
calling close with unilateraltimeout=1 to force AWAITING_UNILATERAL,
then asserts the channel is no longer in that state after THRESHOLD+5
blocks.

Kept as a separate commit so it can be split off if maintainers prefer
to address the two stuck states independently.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant