Skip to content

Commit 88bcd5f

Browse files
committed
Merge tag 'v0.1.10' into HEAD
v0.1.10 - Jun 18, 2026 - "Loupe de Loupe" API Updates =========== * `DefaultMessageRouter` will now always generate blinded message paths that provide no privacy (where our node is the introduction node) for nodes with public channels. This works around an issue which will appear for any nodes with LND peers that enable onion messaging - such peers will refuse to forward BOLT 12 messages from unknown third parties, which most BOLT 12 payers rely on today (#4647). * Explicit `amount_msats` of 0 is rejected in BOLT 12 `Offer`s; `OfferBuilder` now maps 0-amounts to an amount of `None` (#4324). Bug Fixes ========= * Async `ChannelMonitorUpdate` persistence operations which complete, but are not marked as complete in a persisted `ChannelManager` prior to restart, followed immediately by a block connection and then another restart could result in some channel operations hanging leading for force-closures (#4377). * If an MPP payment is claimed but `ChannelMonitorUpdate`s for some parts are still being completed asynchronously, further channel updates (e.g. forwarding another payment) are pending and the node restarts, the channel could have become stuck (#4520). * The presence of unconfirmed transactions actually no longer causes `ElectrumSyncClient` to spuriously fail to sync (#4590). * `FilesystemStore::list_all_keys` will no longer fail if there are stale intermediate files lying around from a previous unclean shutdown (#4618). * When forwarding an HTLC while in a blinded path with proportional fees over 200%, LDK will no longer spuriously allow a forward that pays us 1 msat too little in fees (#4697). * Fixed a rare case where a channel could get stuck on reconnect when using both async `ChannelMonitorUpdate` persistence and async signing (#4684). * `Event::PaymentSent::fee_paid_msat` is no longer `None` in cases where `ChannelManager::abandon_payment` was called before the payment ultimately completes anyway (#4651). * Syncing a `ChainMonitor` using the `Confirm` trait will no longer write some full `ChannelMonitor`s to disk several times per block (#4544). * `OMDomainResolver` now correctly accounts for failed queries when rate limiting, ensuring we continue to respond to queries after failures (#4591). * Calling `ChannelManager::send_payment_with_route` without a `route_params` and with an invalid `Route` will no longer panic (#4707). * `lightning-custom-message`'s handling of `peer_connected` events now ensures that sub-handlers will see a `peer_disconnected` event if a different sub-handler refused the connection by `Err`ing `peer_connected` (#4595). * Incomplete MPP keysend payments will no longer see their HTLCs held until expiry (#4558). * `InvoiceRequestBuilder` will no longer accept a `quantity` of `0` for a BOLT 12 `Offer`, allowing any quantity up to a bound (#4667). * `lightning-custom-message` handlers that return `Ok(None)` when asked to deserialize a message in their defined range no longer cause panics (#4709). * Several spurious debug assertions were fixed (#4537, #4618). Security ======== 0.1.10 fixes a sanitization issue and several denial-of-service vulnerabilities. * `Bolt11Invoice::recover_payee_pub_key` no longer panics if called on an invoice which set an explicit public key, rather than relying on public key recovery. This method is called from `payment_parameters_from_invoice` and `payment_parameters_from_variable_amount_invoice` (#4717). * Maliciously-crafted unpayable invoices which have overflowing feerates will no longer cause an `unwrap` failure panic (#4716). * `possiblyrandom` did not properly generate random data except when it was explicitly configured to. By default this means LDK is vulnerable to various HashDoS attacks (#4719). * `OMNameResolver` will no longer panic when looking up payment instructions which include unicode characters at the start of a TXT record (#4718). * `PrintableString` did not properly sanitize unicode format characters, allowing an attacker to corrupt the rendering of logs or UI (#4593, #4605). * RGS data is now limited in how large of a graph it is able to cause a client to store in memory. Note that RGS data is still considered a DoS vector in general and you should only use semi-trusted RGS data (#4713). * Counterparty-provided strings in failure messages are no longer logged in full, reducing the ability of such a counterparty to spam our logs (#4714). * Reading a corrupted `ChannelManager` or `ProbabilisticScorer` can no longer cause us to allocate large amounts of memory (#4712). Thanks to Project Loupe for reporting most of the issues fixed in this release.
2 parents 49eefb0 + b6f3ad7 commit 88bcd5f

47 files changed

Lines changed: 3047 additions & 356 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
name: Unicode listing up to date
2+
on:
3+
workflow_dispatch:
4+
schedule:
5+
- cron: '42 3 * * *'
6+
7+
jobs:
8+
check-unicode:
9+
runs-on: ubuntu-latest
10+
permissions:
11+
issues: write
12+
steps:
13+
- name: Checkout source code
14+
uses: actions/checkout@v4
15+
- name: Check unicode file state
16+
env:
17+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
18+
run: |
19+
curl --proto '=https' --tlsv1.2 -fsSL -o /tmp/UnicodeData.txt https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt
20+
contrib/gen_unicode_general_category.py /tmp/UnicodeData.txt -o /tmp/unicode.rs
21+
if ! diff -u lightning-types/src/unicode.rs /tmp/unicode.rs; then
22+
TITLE="Unicode listing out of date: ${{ github.workflow }}"
23+
RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
24+
BODY="The unicode character listing is out of date, see $RUN_URL"
25+
gh issue create --title "$TITLE" --body "$BODY"
26+
fi

CHANGELOG.md

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,86 @@
1+
# 0.1.10 - Jun 18, 2026 - "Loupe de Loupe"
2+
3+
## API Updates
4+
* `DefaultMessageRouter` will now always generate blinded message paths that
5+
provide no privacy (where our node is the introduction node) for nodes with
6+
public channels. This works around an issue which will appear for any nodes
7+
with LND peers that enable onion messaging - such peers will refuse to
8+
forward BOLT 12 messages from unknown third parties, which most BOLT 12
9+
payers rely on today (#4647).
10+
* Explicit `amount_msats` of 0 is rejected in BOLT 12 `Offer`s; `OfferBuilder`
11+
now maps 0-amounts to an amount of `None` (#4324).
12+
13+
## Bug Fixes
14+
* Async `ChannelMonitorUpdate` persistence operations which complete, but are
15+
not marked as complete in a persisted `ChannelManager` prior to restart,
16+
followed immediately by a block connection and then another restart could
17+
result in some channel operations hanging leading for force-closures (#4377).
18+
* If an MPP payment is claimed but `ChannelMonitorUpdate`s for some parts are
19+
still being completed asynchronously, further channel updates (e.g.
20+
forwarding another payment) are pending and the node restarts, the channel
21+
could have become stuck (#4520).
22+
* The presence of unconfirmed transactions actually no longer causes
23+
`ElectrumSyncClient` to spuriously fail to sync (#4590).
24+
* `FilesystemStore::list_all_keys` will no longer fail if there are stale
25+
intermediate files lying around from a previous unclean shutdown (#4618).
26+
* When forwarding an HTLC while in a blinded path with proportional fees over
27+
200%, LDK will no longer spuriously allow a forward that pays us 1 msat too
28+
little in fees (#4697).
29+
* Fixed a rare case where a channel could get stuck on reconnect when using
30+
both async `ChannelMonitorUpdate` persistence and async signing (#4684).
31+
* `Event::PaymentSent::fee_paid_msat` is no longer `None` in cases where
32+
`ChannelManager::abandon_payment` was called before the payment ultimately
33+
completes anyway (#4651).
34+
* Syncing a `ChainMonitor` using the `Confirm` trait will no longer write some
35+
full `ChannelMonitor`s to disk several times per block (#4544).
36+
* `OMDomainResolver` now correctly accounts for failed queries when rate
37+
limiting, ensuring we continue to respond to queries after failures (#4591).
38+
* Calling `ChannelManager::send_payment_with_route` without a `route_params`
39+
and with an invalid `Route` will no longer panic (#4707).
40+
* `lightning-custom-message`'s handling of `peer_connected` events now ensures
41+
that sub-handlers will see a `peer_disconnected` event if a different
42+
sub-handler refused the connection by `Err`ing `peer_connected` (#4595).
43+
* Incomplete MPP keysend payments will no longer see their HTLCs held until
44+
expiry (#4558).
45+
* `InvoiceRequestBuilder` will no longer accept a `quantity` of `0` for a
46+
BOLT 12 `Offer`, allowing any quantity up to a bound (#4667).
47+
* `lightning-custom-message` handlers that return `Ok(None)` when asked to
48+
deserialize a message in their defined range no longer cause panics (#4709).
49+
* Several spurious debug assertions were fixed (#4537, #4618).
50+
51+
## Security
52+
0.1.10 fixes a sanitization issue and several denial-of-service vulnerabilities.
53+
* `Bolt11Invoice::recover_payee_pub_key` no longer panics if called on an
54+
invoice which set an explicit public key, rather than relying on public key
55+
recovery. This method is called from `payment_parameters_from_invoice` and
56+
`payment_parameters_from_variable_amount_invoice` (#4717).
57+
* Maliciously-crafted unpayable invoices which have overflowing feerates will
58+
no longer cause an `unwrap` failure panic (#4716).
59+
* `possiblyrandom` did not properly generate random data except when it was
60+
explicitly configured to. By default this means LDK is vulnerable to various
61+
HashDoS attacks (#4719).
62+
* `OMNameResolver` will no longer panic when looking up payment instructions
63+
which include unicode characters at the start of a TXT record (#4718).
64+
* `PrintableString` did not properly sanitize unicode format characters,
65+
allowing an attacker to corrupt the rendering of logs or UI (#4593, #4605).
66+
* RGS data is now limited in how large of a graph it is able to cause a client
67+
to store in memory. Note that RGS data is still considered a DoS vector in
68+
general and you should only use semi-trusted RGS data (#4713).
69+
* Counterparty-provided strings in failure messages are no longer logged in
70+
full, reducing the ability of such a counterparty to spam our logs (#4714).
71+
* Reading a corrupted `ChannelManager` or `ProbabilisticScorer` can no longer
72+
cause us to allocate large amounts of memory (#4712).
73+
74+
Thanks to Project Loupe for reporting most of the issues fixed in this release.
75+
76+
77+
# 0.1.9 - Jan 26, 2026 - "Electrum Confirmations"
78+
79+
## Bug Fixes
80+
* The presence of unconfirmed transactions no longer causes
81+
`ElectrumSyncClient` to spuriously fail to sync (#4341).
82+
83+
184
# 0.1.8 - Dec 2, 2025 - "Async Update Completion"
285

386
## Bug Fixes

ci/ci-tests.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,18 @@ function PIN_RELEASE_DEPS {
1717
# Starting with version 1.39.0, the `tokio` crate has an MSRV of rustc 1.70.0
1818
[ "$RUSTC_MINOR_VERSION" -lt 70 ] && cargo update -p tokio --precise "1.38.1" --verbose
1919

20+
# Starting with version 1.0.104, the `proc-macro2` crate has an MSRV of rustc 1.68
21+
[ "$RUSTC_MINOR_VERSION" -lt 68 ] && cargo update -p proc-macro2 --precise "1.0.103" --verbose
22+
23+
# Starting with version 1.0.146, the `serde_json` crate has an MSRV of rustc 1.68
24+
[ "$RUSTC_MINOR_VERSION" -lt 68 ] && cargo update -p serde_json --precise "1.0.145" --verbose
25+
26+
# Starting with version 1.0.16, the `itoa` crate has an MSRV of rustc 1.68
27+
[ "$RUSTC_MINOR_VERSION" -lt 68 ] && cargo update -p itoa --precise "1.0.15" --verbose
28+
29+
# Starting with version 1.0.21, the `ryu` crate has an MSRV of rustc 1.68
30+
[ "$RUSTC_MINOR_VERSION" -lt 68 ] && cargo update -p ryu --precise "1.0.20" --verbose
31+
2032
return 0 # Don't fail the script if our rustc is higher than the last check
2133
}
2234

@@ -62,6 +74,7 @@ pushd lightning-tests
6274
[ "$RUSTC_MINOR_VERSION" -lt 68 ] && cargo update -p syn --precise "2.0.106" --verbose
6375
[ "$RUSTC_MINOR_VERSION" -lt 68 ] && cargo update -p quote --precise "1.0.41" --verbose
6476
[ "$RUSTC_MINOR_VERSION" -lt 65 ] && cargo update -p regex --precise "1.9.6" --verbose
77+
[ "$RUSTC_MINOR_VERSION" -lt 68 ] && cargo update -p proc-macro2 --precise "1.0.103" --verbose
6578
cargo test
6679
[ "$CI_MINIMIZE_DISK_USAGE" != "" ] && cargo clean
6780
popd

ci/ci-tx-sync-tests.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ PIN_RELEASE_DEPS # pin the release dependencies
2020
# Starting with version 1.2.0, the `idna_adapter` crate has an MSRV of rustc 1.81.0.
2121
[ "$RUSTC_MINOR_VERSION" -lt 81 ] && cargo update -p idna_adapter --precise "1.1.0" --verbose
2222

23+
# Starting with version 2.12.1, the `indexmap` crate has an MSRV of rustc 1.82.
24+
[ "$RUSTC_MINOR_VERSION" -lt 82 ] && cargo update -p indexmap --precise "2.11.4" --verbose
25+
2326
export RUST_BACKTRACE=1
2427

2528
echo -e "\n\nChecking Transaction Sync Clients with features."

0 commit comments

Comments
 (0)