contractcourt: fix HTLC success resolver phantom-input bug (#10840)#10869
contractcourt: fix HTLC success resolver phantom-input bug (#10840)#10869yyforyongyu wants to merge 6 commits into
Conversation
Summary of ChangesHello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request addresses a bug in the HTLC success resolver where foreign spends of commitment HTLC outputs were incorrectly treated as valid success transactions. By implementing stricter validation of the spending transaction's output and ensuring that expired HTLCs do not trigger the success resolution path, the changes improve the robustness of the contract resolution process and prevent unnecessary sweeper activity. Highlights
New Features🧠 You can now enable Memory (public preview) to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize the Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counterproductive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here. Footnotes
|
🔴 PR Severity: CRITICAL
🔴 Critical (2 files)
🟢 Low (1 file)
AnalysisThis PR modifies two files in the Severity bump check: 3 non-test/non-generated files (threshold: >20), 139 lines changed (threshold: >500), single distinct critical package — no bump triggered. Three test/mock files ( To override, add a |
There was a problem hiding this comment.
Code Review
This pull request addresses an issue where an incoming HTLC resolver could incorrectly treat a foreign spend of a commitment HTLC output as its own success transaction. It introduces validation of the spending transaction's expected output before sweeping, and checkpoints the resolver as failed (timeout) if a foreign spend is detected. Additionally, the resolver now avoids launching the success path for incoming HTLCs that are already expired by checking the best block height at launch. Comprehensive unit tests have been added to verify these behaviors. No review comments were provided, so there is no additional feedback.
f82a83c to
0a2f9d3
Compare
0a2f9d3 to
61fb9b4
Compare
61fb9b4 to
70db302
Compare
|
LGTM 🎯 ( |
70db302 to
2c8fa1c
Compare
|
LGTM 🚀 ( |
2c8fa1c to
f3cad96
Compare
f3cad96 to
7b2bf4b
Compare
7b2bf4b to
eee8ed9
Compare
eee8ed9 to
b6dc107
Compare
ddf4488 to
ecfcc5e
Compare
Document the user-visible fix from PR lightningnetwork#10869 in the v0.21.1 release notes. The note covers both the foreign-spend validation and the expired incoming HTLC launch guard.
ecfcc5e to
e931cf6
Compare
|
/gateway review |
|
gateway is already active on this PR. Reply with |
|
No issues found by openai/gpt-5.5 ✅ |
Document the user-visible fix from PR lightningnetwork#10869 in the v0.21.1 release notes. The note covers both the foreign-spend validation and the expired incoming HTLC launch guard.
e931cf6 to
7a39941
Compare
Document the user-visible fix from PR lightningnetwork#10869 in the v0.21.1 release notes. The note covers both the foreign-spend validation and the expired incoming HTLC launch guard.
7a39941 to
0439a8e
Compare
Document the user-visible fix from PR lightningnetwork#10869 in the v0.21.1 release notes. The note covers both the foreign-spend validation and the expired incoming HTLC launch guard.
0439a8e to
b2546b3
Compare
The success resolver previously treated any spend of the original HTLC outpoint as confirmation of our own second-level success transaction. That allowed a remote timeout reclaim to be misclassified as a phantom second-level output offered to the sweeper. Validate the spending transaction output against SweepSignDesc.Output before proceeding. If the output does not match, checkpoint the resolver as failed instead of registering the derived outpoint.
Add regression coverage for both success-resolver paths that can observe a foreign spend: the initial resolve path and the restart path after output incubation. The tests assert that no phantom second-level output is handed to the sweeper and that the final HTLC outcome is failed.
The incoming contest resolver could launch a fresh success path based on preimage availability after the HTLC CLTV had expired. Its immediate invoice-registry lookup also passed currentHeight=0, bypassing registry-side expiry checks. Fetch the current best height in Launch and pass the real height into the immediate registry lookup. After lookup, skip late fresh settlements but still allow already-known or replayed preimages to continue with the success resolver.
Add coverage for Launch after an incoming HTLC has expired. The tests assert that already-known or replayed preimages can still launch the success path, while fresh invoice settlements remain blocked after expiry. Also assert that non-expired launch-time registry lookups use the current chain height instead of zero.
Document the user-visible fix from PR lightningnetwork#10869 in the v0.21.1 release notes. The note covers both the foreign-spend validation and the expired incoming HTLC launch guard.
b2546b3 to
e262e56
Compare
|
No issues found by |
|
No issues found by openai/gpt-5.5 ✅ |
Fixes #10840.
This fixes the HTLC success resolver path that could treat any spend of the original HTLC output as our own second-level HTLC success transaction. If a remote timeout spend is observed instead, the resolver now validates the spender output against the stored sweep descriptor and fails the final HTLC outcome instead of handing a phantom output to the sweeper.
The incoming contest resolver also avoids launching the success resolver after CLTV expiry and passes the current height into the immediate invoice-registry lookup.
Companion sweeper blast-radius fix: #10842.
Testing: