Skip to content

Tags: lightningdevkit/rust-lightning

Tags

v0.2.2

Toggle v0.2.2's commit message
v0.2.2 - Feb 6, 2025 - "An Async Splicing Production"

API Updates
===========

 * The `SplicePrototype` feature flag has been updated to refer to feature bit
   63 - the same as `SpliceProduction`. This resolves a compatibility issue with
   eclair nodes due to the use of the same splicing feature flag (155) they were
   using for a pre-standardization version of splicing (#4387).

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).
 * A debug assertion failure reachable when receiving an invalid splicing
   message from a peer was fixed (#4383).

v0.2.1

Toggle v0.2.1's commit message
v0.2.1 - Jan 29, 2025 - "Electrum Confirmations Logged"

API Updates
===========

 * The `AttributionData` struct is now public, correcting an issue where it was
   accidentally sealed preventing construction of some messages (#4268).
 * The async background processor now exits even if work remains to be done as
   soon as the sleeper returns the exit flag (#4259).

Bug Fixes
=========

 * The presence of unconfirmed transactions no longer causes
   `ElectrumSyncClient` to spuriously fail to sync (#4341).
 * `ChannelManager::splice_channel` now properly fails immediately if the
   peer does not support splicing (#4262, #4274).
 * A spurious debug assertion was removed which could fail in cases where an
   HTLC fails to be forwarded after being accepted (#4312).
 * Many log calls related to outbound payments were corrected to include a
   `payment_hash` field (#4342).

v0.1.9

Toggle v0.1.9's commit message
v0.1.9 - Jan 26, 2026 - "Electrum Confirmations"

Bug Fixes
=========

 * The presence of unconfirmed transactions no longer causes
   `ElectrumSyncClient` to spuriously fail to sync (#4341).

v0.2

Toggle v0.2's commit message
v0.2 - Dec 2, 2025 - "Natively Asynchronous Splicing"

API Updates
===========

 * Splicing is now supported. The current implementation is expected to be
   compatible with Eclair and future versions of CLN, but may change feature
   signaling in a future version as testing completes, breaking compatibility.
   Support for accepting splices is gated on
   `UserConfig::reject_inbound_splices`. Outbound splices can be initiated with
   `ChannelManager::splice_channel`.
 * Various APIs have been updated to offer a native Rust async API. All
   newly-async traits and structs have a `*Sync` variant which offers the
   same API but with sync methods:
   * `KVStore` has been made async. Note that `KVStore` methods are not
     `async fn`, but rather write ordering is fixed when the methods return,
     though write completion is async.
   * `BumpTransactionEventHandler` is now backed by an async `WalletSource` (and
     `Wallet`) or an async `CoinSelectionSource` and is now async. Sync versions
     are in the new `events::bump_transaction::sync` submodule (#3752).
   * `OutputSweeper` is now backed by an async `KVStore` and
     `ChangeDestinationSource` and is now async (#3819, #3734, #4131).
   * `MonitorUpdatingPersisterAsync` and `ChainMonitor::new_async_beta` were
     added for async `ChannelMonitor` persistence. Note that this feature is
     still considered beta (#4063).
 * An initial version of async payments is now supported. The current
   implementation is specific to LDK and only LDK supports paying static
   invoices. However, because BOLT 12 invoice requests will gracefully "upgrade"
   to a non-static invoice when the recipient comes online, offers backed by
   static invoices are expected to be payable by any BOLT 12 payer.
   With an LDK-based LSP, often-offline clients should set
   `UserConfig::hold_outbound_htlcs_at_next_hop` and call
   `ChannelManager::set_paths_to_static_invoice_server`.
   LDK-based LSPs wishing to support often-offline senders and recipients should
   set `UserConfig::enable_htlc_hold`, support the existing "onion message
   mailbox" feature (setting `intercept_messages_for_offline_peers` on
   `OnionMessenger` and handling `Event::OnionMessageIntercepted`s), and handle
   `Event::PersistStaticInvoice`s and `Event::StaticInvoiceRequested`s.
 * Zero-Fee-Commitment channels are now supported in LDK. These channels remove
   force-closure risk for feerate disagreements by using a fixed, zero fee on
   pre-signed transactions, relying on anchor bumps instead. They also utilize
   the new TRUC + ephemeral dust policy in Bitcoin Core 29 to substantially
   improve the lightning security model. This requires having a path of Bitcoin
   Core 29+ nodes between you and a miner for transactions to be mined. This
   only works with LDK peers, and feature signaling may change in a future
   version of LDK, breaking compatibility. This is negotiated automatically for
   manually-accepted inbound channels and negotiated for outbound channels based
   on `ChannelHandshakeConfig::negotiate_anchor_zero_fee_commitments`.
 * `Event::BumpTransaction` is now always generated even if the transaction has
   sufficient fee. This allows you to manage transaction broadcasting more
   granularly for anchor channels (#4001).
 * The local key which receives non-HTLC-encumbered funds when the counterparty
   force-closes a channel is now one of a static list of 1000 keys when using
   `KeysManager` if `v2_remote_key_derivation` is set or after splicing (#4117).
 * LSPS5 support was added, providing a push notification API for LSPS clients.
 * Client-trusts-LSP is now supported on LSPS2 service (#3838).
 * `LSPS2ClientEvent` now has events for failure events (#3804).
 * `LSPS2ServiceHandler::channel_open_abandoned` was added (#3712).
 * `Event::PendingHTLCsForwardable` has been replaced with regular calls to
   `process_pending_htlc_forwards` in the background processor while
   `ChannelManager::needs_pending_htlc_processing` is true. The delay between
   calls (and, thus, HTLC forwarding delay) is random between zero and 200ms,
   averaging 50ms, faster than the previous recommendation (#3891, #3955).
 * `Event::HTLCHandlingFailed`s now include a`LocalHTLCFailureReason`, providing
   much more granular reasons for HTLCs having been failed (#3744, etc).
 * `Event::HTLCHandlingFailed` is now generated any time forwarding an HTLC
   fails, i.e. including cases where the HTLC onion is invalid (#2933).
 * `Event::HTLCHandlingFailed::failure_type` of `UnknownNextHop` has been
   deprecated and is no longer generated (#3700).
 * `OffersMessageFlow` was introduced to make it easier to implement most of the
   BOLT 12 flows without using a `ChannelManager` (#3639).
 * `ChannelManager::pay_for_bolt11_invoice` was added (#3617).
 * `ChannelManager::pay_for_offer_from_human_readable_name` has been deprecated
   in favor of the `bitcoin-payment-instructions` and
   `ChannelManager::pay_for_offer_from_hrn`. Language bindings users may still
   wish to use the original (#3903, #4083).
 * `lightning::util::anchor_channel_reserves` was added to assist in estimating
   on-chain fund requirements for anchor channel closures (#3487).
 * Using both asynchronous and synchronous `ChannelMonitor[Update]` persistence
   on the same `ChannelManager` will now panic. This never functioned correctly
   and is now detected to prevent issues (#3737).
 * LDK can now validate if HTLC errors have been tampered with (once nodes
   upgrade). It also reports and logs the amount of time an HTLC was held so
   that (as nodes upgrade) slow nodes can be found (#2256, #3801, other fixes).
 * Repeated `Listen::block_disconnected` calls for each disconnected block in a
   reorg have been replaced with a single `blocks_disconnected` call with the
   fork point block (i.e. the highest block on both sides of the reorg, #3876).
 * `lightning::routing::scoring::CombinedScorer` was added to combine scoring
   data between remote scoring info and local payment results (#3562).
 * LDK will now store up to 1KiB of "peer storage" data in `ChannelManager` per
   peer with which we have a funded channel (#3575).
 * The `Persister` trait was removed. You can match on namespace constants in
   `KVStore` to restore custom logic for specific storage objects (#3905).
 * `BlindedMessagePath::new_with_dummy_hops` was added (but is not used by
   default, #3726). You can use `NodeIdMessageRouter` to enable dummy hops.
 * `ProbabilisticScoringFeeParameters::probing_diversity_penalty` was added to
   allow for better information gathering while probing (#3422, #3713).
 * `Persist` now takes a `MonitorName` rather than a `funding_txo` `OutPoint` to
   ensure the storage key is consistent across splices (#3569).
 * `lightning-liquidity` now supports persisting relevant state (#4059, #4118).
 * `ChannelManager::funding_transaction_generated_manual_broadcast` was added to
   open a channel without automatically broadcasting the funding transaction
   (#3838). In it and `unsafe_manual_funding_transaction_generated`
   force-closure logic has been updated to no longer automatically broadcast the
   commitment tx unless the funding transaction has been seen on-chain (#4109).
 * Various instances of channel closure which provided a
   `ClosureReason::HolderForceClosed` now provide more accurate
   `ClosureReason`s, especially `ClosureReason::ProcessingError` (#3881).
 * A new `ClosureReason::LocallyCoopClosedUnfundedChannel` was added (#3881).
 * Some arguments to `ChannelManager::pay_for_offer[_from_human_readable_name]`
   have moved behind `optional_params` (#3808, #3903).
 * `Event::PaymentSent::bolt12_invoice` was added for proof-of-payment (#3593).
 * Channel values are now synchronized via RGS, improving scoring (#3924).
 * `SendOnlyMessageHandler` was added, implemented for `ChainMonitor`, and
   an instance added to `MessageHandler`. Note that `ChainMonitor` does not yet
   send any messages, though will in the future (#3922).
 * `lightning_background_processor::NO_{ONION_MESSENGER,LIQUIDITY_MANAGER}` were
   added to simplify background processor init without some args (#4100, #4132).
 * `ChannelManager::set_current_config` was added (#4038).
 * Onion messages received to a blinded path we generated are now authenticated
   implicitly rather than explicitly in blinded path `Context`s (#3917, #4144).
 * `OMNameResolver::expire_pending_resolution` has been added for those who
   cannot or do not wish to call `new_best_block` regularly (#3900).
 * `lightning-liquidity`'s LSPS1 client now supports BOLT 12 payments (#3649).
 * `LengthReadable::read` has been renamed `read_from_fixed_length_buffer` and
   is implemented for all `Readable` (#3579).
 * `LengthReadable` is now required to read various objects which consume the
   full available buffer (#3640).
 * Structs in `lightning-liquidity` were renamed to be globally unique (#3583).
 * Renamed `SpendableOutputDescriptor::outpoint` to `spendable_outpoint` (#3634)

Performance Improvements
========================

 * `ChainMonitor::load_existing_monitor` was added and should be used on startup
   to load existing `ChannelMonitor`s rather than via `Persist`, avoiding
   re-persisting each `ChannelMonitor` during startup (#3996).
 * RGS data application was further sped up (#3581).

Bug Fixes
=========

 * `FilesystemStore::list` is now more robust against race conditions with
   simultaneous `write`/`archive` operations (#3799).
 * Pending async persistence of `ChannelMonitorUpdate`s required to forward an
   HTLC can no longer result in the HTLC being forgotten if the channel is
   force-closed (#3989).
 * `lightning-liquidity`'s service support now properly responds to the
   `ListProtocols` message (#3785).
 * A rare race which might lead `PeerManager` (and `lightning-net-tokio`) to
   stop reading from a peer until a new message is sent to that peer has been
   fixed (#4168).
 * The fields in `SocketAddress::OnionV3` are now correctly parsed, and the
   `Display` for such addresses is now lowercase (#4090).
 * `PeerManager` is now more conservative about disconnecting peers which aren't
   responding to pings in a timely manner. This may reduce disconnections
   marginally when forwarding gossip to a slow peer (#4093, #4096).
 * Blinded path serialization is now padded to better hide its contents (#3177).
 * In cases of incredibly long async monitor update or async signing operations,
   LDK may have previously spuriously disconnected peers (#3721).
 * Total dust exposure on a commitment now rounds correctly (#3572).

Backwards Compatibility
=======================

 * `ChannelMonitor`s which were created prior to LDK 0.0.110 and which saw no
   updates since LDK 0.0.116 may now fail to deserialize (#3638, #4146).
 * Setting `v2_remote_key_derivation` on `KeysManager` to true, or splicing a
   channel results in using keys which prior versions of LDK do not know how to
   derive. This may result in missing funds or panics trying to sweep closed
   channels after downgrading (#4117).
 * After upgrading to 0.2, downgrading to versions of LDK prior to 0.0.123 is no
   longer supported (#2933).
 * Upgrading from versions prior to 0.0.116 is not supported (#3604, #3678).
 * Upgrading to v0.2.0 will time out any pending async payment waiting for the
   often offline peer to come online (#3918).
 * Blinded message paths generated by previous versions of LDK, except those
   generated for inclusion in BOLT 12 `Offer`s will no longer be accepted. As
   most blinded message paths are ephemeral, this should only invalidate issued
   BOLT 12 `Refund`s in practice (#3917).
 * Once a channel has been spliced, LDK can no longer be downgraded.
   `UserConfig::reject_inbound_splices` can be set to block inbound ones (#4150)
 * Downgrading after setting `UserConfig::enable_htlc_hold` is not supported
   (#4045, #4046).
 * LDK now requires the `channel_type` feature in line with spec updates (#3896)

In total, this release features 259 files changed, 114539 insertions, 45150
deletions in 1628 commits since 0.1 from 36 authors, in alphabetical order:

 * Aditya Sharma
 * Alec Chen
 * Anonymous
 * Anyitechs
 * Arik Sosman
 * Austin Mackillop
 * Carla Kirk-Cohen
 * Chuks Agbakuru
 * Devrandom
 * Duncan Dean
 * Elias Rohrer
 * Erick Cestari
 * Fedeparma74
 * Fuyin
 * Ian Slane
 * Jeffrey Czyz
 * Jesse de Wit
 * Joost Jager
 * Leo Nash
 * Martin Saposnic
 * Matt Corallo
 * Matt Morehouse
 * Maurice Poirrier Chuden
 * Philip Kannegaard Hayes
 * Prabhat Verma
 * Valentine Wallace
 * Vincenzo Palazzo
 * Willem Van Lint
 * Wilmer Paulino
 * YI
 * benthecarman
 * elnosh
 * moisesPompilio
 * olegkubrakov
 * optout
 * shaavan

v0.1.8

Toggle v0.1.8's commit message
v0.1.8 - Dec 2, 2025 - "Async Update Completion"

Bug Fixes
=========

 * In cases where an MPP payment is claimed while one channel is waiting on a
   counterparty's `revoke_and_ack` message and the `revoke_and_ack` message is
   received prior to the asynchronous completion of the MPP-claim
   `ChannelMonitorUpdate`, the channel will no longer hang (#4236).
 * Deserializing invalid `Duration`s can no longer panic (#4172).

v0.2.0-rc2

Toggle v0.2.0-rc2's commit message
v0.2-rc2 - Nov 13, 2025 - "Natively Asynchronous Splicing"

API Updates
===========

 * Splicing is now supported. The current implementation is expected to be
   compatible with Eclair and future versions of CLN, but may change feature
   signaling in a future version as testing completes, breaking compatibility.
   Support for accepting splices is gated on
   `UserConfig::reject_inbound_splices`. Outbound splices can be initiated with
   `ChannelManager::splice_channel`.
 * Various APIs have been updated to offer a native Rust async API. All
   newly-async traits and structs have a `*Sync` variant which offers the
   same API but with sync methods:
   * `KVStore` has been made async. Note that `KVStore` methods are not
     `async fn`, but rather write ordering is fixed when the methods return,
     though write completion is async.
   * `BumpTransactionEventHandler` is now backed by an async `WalletSource` (and
     `Wallet`) or an async `CoinSelectionSource` and is now async. Sync versions
     are in the new `events::bump_transaction::sync` submodule (#3752).
   * `OutputSweeper` is now backed by an async `KVStore` and
     `ChangeDestinationSource` and is now async (#3819, #3734, #4131).
   * `MonitorUpdatingPersisterAsync` and `ChainMonitor::new_async_beta` were
     added for async `ChannelMonitor` persistence. Note that this feature is
     still considered beta (#4063).
 * An initial version of async payments is now supported. The current
   implementation is specific to LDK and only LDK supports paying static
   invoices. However, because BOLT 12 invoice requests will gracefully "upgrade"
   to a non-static invoice when the recipient comes online, offers backed by
   static invoices are expected to be payable by any BOLT 12 payer.
   With an LDK-based LSP, often-offline clients should set
   `UserConfig::hold_outbound_htlcs_at_next_hop` and call
   `ChannelManager::set_paths_to_static_invoice_server`.
   LDK-based LSPs wishing to support often-offline senders and recipients should
   set `UserConfig::enable_htlc_hold`, support the existing "onion message
   mailbox" feature (setting `intercept_messages_for_offline_peers` on
   `OnionMessenger` and handling `Event::OnionMessageIntercepted`s), and handle
   `Event::PersistStaticInvoice`s and `Event::StaticInvoiceRequested`s.
 * Zero-Fee-Commitment channels are now supported in LDK. These channels remove
   force-closure risk for feerate disagreements by using a fixed, zero fee on
   pre-signed transactions, relying on anchor bumps instead. They also utilize
   the new TRUC + ephemeral dust policy in Bitcoin Core 29 to substantially
   improve the lightning security model. This requires having a path of Bitcoin
   Core 29+ nodes between you and a miner for transactions to be mined. This
   only works with LDK peers, and feature signaling may change in a future
   version of LDK, breaking compatibility. This is negotiated automatically for
   manually-accepted inbound channels and negotiated for outbound channels based
   on `ChannelHandshakeConfig::negotiate_anchor_zero_fee_commitments`.
 * `Event::BumpTransaction` is now always generated even if the transaction has
   sufficient fee. This allows you to manage transaction broadcasting more
   granularly for anchor channels (#4001).
 * The local key which receives non-HTLC-encumbered funds when the counterparty
   force-closes a channel is now one of a static list of 1000 keys when using
   `KeysManager` if `v2_remote_key_derivation` is set or after splicing (#4117).
 * LSPS5 support was added, providing a push notification API for LSPS clients.
 * Client-trusts-LSP is now supported on LSPS2 service (#3838).
 * `LSPS2ClientEvent` now has events for failure events (#3804).
 * `LSPS2ServiceHandler::channel_open_abandoned` was added (#3712).
 * `Event::PendingHTLCsForwardable` has been replaced with regular calls to
   `process_pending_htlc_forwards` in the background processor while
   `ChannelManager::needs_pending_htlc_processing` is true. The delay between
   calls (and, thus, HTLC forwarding delay) is random between zero and 200ms,
   averaging 50ms, faster than the previous recommendation (#3891, #3955).
 * `Event::HTLCHandlingFailed`s now include a`LocalHTLCFailureReason`, providing
   much more granular reasons for HTLCs having been failed (#3744, etc).
 * `Event::HTLCHandlingFailed` is now generated any time forwarding an HTLC
   fails, i.e. including cases where the HTLC onion is invalid (#2933).
 * `Event::HTLCHandlingFailed::failure_type` of `UnknownNextHop` has been
   deprecated and is no longer generated (#3700).
 * `OffersMessageFlow` was introduced to make it easier to implement most of the
   BOLT 12 flows without using a `ChannelManager` (#3639).
 * `ChannelManager::pay_for_bolt11_invoice` was added (#3617).
 * `ChannelManager::pay_for_offer_from_human_readable_name` has been deprecated
   in favor of the `bitcoin-payment-instructions` and
   `ChannelManager::pay_for_offer_from_hrn`. Language bindings users may still
   wish to use the original (#3903, #4083).
 * `lightning::util::anchor_channel_reserves` was added to assist in estimating
   on-chain fund requirements for anchor channel closures (#3487).
 * Using both asynchronous and synchronous `ChannelMonitor[Update]` persistence
   on the same `ChannelManager` will now panic. This never functioned correctly
   and is now detected to prevent issues (#3737).
 * LDK can now validate if HTLC errors have been tampered with (once nodes
   upgrade). It also reports and logs the amount of time an HTLC was held so
   that (as nodes upgrade) slow nodes can be found (#2256, #3801, other fixes).
 * Repeated `Listen::block_disconnected` calls for each disconnected block in a
   reorg have been replaced with a single `blocks_disconnected` call with the
   fork point block (i.e. the highest block on both sides of the reorg, #3876).
 * `lightning::routing::scoring::CombinedScorer` was added to combine scoring
   data between remote scoring info and local payment results (#3562).
 * LDK will now store up to 1KiB of "peer storage" data in `ChannelManager` per
   peer with which we have a funded channel (#3575).
 * The `Persister` trait was removed. You can match on namespace constants in
   `KVStore` to restore custom logic for specific storage objects (#3905).
 * `BlindedMessagePath::new_with_dummy_hops` was added (but is not used by
   default, #3726). You can use `NodeIdMessageRouter` to enable dummy hops.
 * `ProbabilisticScoringFeeParameters::probing_diversity_penalty` was added to
   allow for better information gathering while probing (#3422, #3713).
 * `Persist` now takes a `MonitorName` rather than a `funding_txo` `OutPoint` to
   ensure the storage key is consistent across splices (#3569).
 * `lightning-liquidity` now supports persisting relevant state (#4059, #4118).
 * `ChannelManager::funding_transaction_generated_manual_broadcast` was added to
   open a channel without automatically broadcasting the funding transaction
   (#3838). In it and `unsafe_manual_funding_transaction_generated`
   force-closure logic has been updated to no longer automatically broadcast the
   commitment tx unless the funding transaction has been seen on-chain (#4109).
 * Various instances of channel closure which provided a
   `ClosureReason::HolderForceClosed` now provide more accurate
   `ClosureReason`s, especially `ClosureReason::ProcessingError` (#3881).
 * A new `ClosureReason::LocallyCoopClosedUnfundedChannel` was added (#3881).
 * Some arguments to `ChannelManager::pay_for_offer[_from_human_readable_name]`
   have moved behind `optional_params` (#3808, #3903).
 * `Event::PaymentSent::bolt12_invoice` was added for proof-of-payment (#3593).
 * Channel values are now synchronized via RGS, improving scoring (#3924).
 * `SendOnlyMessageHandler` was added, implemented for `ChainMonitor`, and
   an instance added to `MessageHandler`. Note that `ChainMonitor` does not yet
   send any messages, though will in the future (#3922).
 * `lightning_background_processor::NO_{ONION_MESSENGER,LIQUIDITY_MANAGER}` were
   added to simplify background processor init without some args (#4100, #4132).
 * `ChannelManager::set_current_config` was added (#4038).
 * Onion messages received to a blinded path we generated are now authenticated
   implicitly rather than explicitly in blinded path `Context`s (#3917, #4144).
 * `OMNameResolver::expire_pending_resolution` has been added for those who
   cannot or do not wish to call `new_best_block` regularly (#3900).
 * `lightning-liquidity`'s LSPS1 client now supports BOLT 12 payments (#3649).
 * `LengthReadable::read` has been renamed `read_from_fixed_length_buffer` and
   is implemented for all `Readable` (#3579).
 * `LengthReadable` is now required to read various objects which consume the
   full available buffer (#3640).
 * Structs in `lightning-liquidity` were renamed to be globally unique (#3583).
 * Renamed `SpendableOutputDescriptor::outpoint` to `spendable_outpoint` (#3634)

Performance Improvements
========================

 * `ChainMonitor::load_existing_monitor` was added and should be used on startup
   to load existing `ChannelMonitor`s rather than via `Persist`, avoiding
   re-persisting each `ChannelMonitor` during startup (#3996).
 * RGS data application was further sped up (#3581).

Bug Fixes
=========

 * `FilesystemStore::list` is now more robust against race conditions with
   simultaneous `write`/`archive` operations (#3799).
 * Pending async persistence of `ChannelMonitorUpdate`s required to forward an
   HTLC can no longer result in the HTLC being forgotten if the channel is
   force-closed (#3989).
 * `lightning-liquidity`'s service support now properly responds to the
   `ListProtocols` message (#3785).
 * A rare race which might lead `PeerManager` (and `lightning-net-tokio`) to
   stop reading from a peer until a new message is sent to that peer has been
   fixed (#4168).
 * The fields in `SocketAddress::OnionV3` are now correctly parsed, and the
   `Display` for such addresses is now lowercase (#4090).
 * `PeerManager` is now more conservative about disconnecting peers which aren't
   responding to pings in a timely manner. This may reduce disconnections
   marginally when forwarding gossip to a slow peer (#4093, #4096).
 * Blinded path serialization is now padded to better hide its contents (#3177).
 * In cases of incredibly long async monitor update or async signing operations,
   LDK may have previously spuriously disconnected peers (#3721).
 * Total dust exposure on a commitment now rounds correctly (#3572).

Backwards Compatibility
=======================

 * `ChannelMonitor`s which were created prior to LDK 0.0.110 and which saw no
   updates since LDK 0.0.116 may now fail to deserialize (#3638, #4146).
 * Setting `v2_remote_key_derivation` on `KeysManager` to true, or splicing a
   channel results in using keys which prior versions of LDK do not know how to
   derive. This may result in missing funds or panics trying to sweep closed
   channels after downgrading (#4117).
 * After upgrading to 0.2, downgrading to versions of LDK prior to 0.0.123 is no
   longer supported (#2933).
 * Upgrading from versions prior to 0.0.116 is not supported (#3604, #3678).
 * Upgrading to v0.2.0 will time out any pending async payment waiting for the
   often offline peer to come online (#3918).
 * Blinded message paths generated by previous versions of LDK, except those
   generated for inclusion in BOLT 12 `Offer`s will no longer be accepted. As
   most blinded message paths are ephemeral, this should only invalidate issued
   BOLT 12 `Refund`s in practice (#3917).
 * Once a channel has been spliced, LDK can no longer be downgraded.
   `UserConfig::reject_inbound_splices` can be set to block inbound ones (#4150)
 * Downgrading after setting `UserConfig::enable_htlc_hold` is not supported
   (#4045, #4046).
 * LDK now requires the `channel_type` feature in line with spec updates (#3896)

v0.2.0-rc1

Toggle v0.2.0-rc1's commit message
v0.2-rc1 - Oct 30, 2025 - "Natively Asynchronous Splicing"

API Updates
===========

 * Splicing is now supported. The current implementation is expected to be
   compatible with Eclair and future versions of CLN, but may change feature
   signaling in a future version as testing completes, breaking compatibility.
   Support for accepting splices is gated on
   `UserConfig::reject_inbound_splices`. Outbound splices can be initiated with
   `ChannelManager::splice_channel`.
 * Various APIs have been updated to offer a native Rust async API. All
   newly-async traits and structs have a `*Sync` variant which offers the
   same API but with sync methods:
   * `KVStore` has been made async. Note that `KVStore` methods are not
     `async fn`, but rather write ordering is fixed when the methods return,
     though write completion is async.
   * `BumpTransactionEventHandler` is now backed by an async `WalletSource` (and
     `Wallet`) or an async `CoinSelectionSource` and is now async. Sync versions
     are in the new `events::bump_transaction::sync` submodule (#3752).
   * `OutputSweeper` is now backed by an async `KVStore` and
     `ChangeDestinationSource` and is now async (#3819, #3734, #4131).
   * `MonitorUpdatingPersisterAsync` and `ChainMonitor::new_async_beta` were
     added for async `ChannelMonitor` persistence. Note that this feature is
     still considered beta (#4063).
 * An initial version of async payments is now supported. The current
   implementation is specific to LDK and only LDK supports paying static
   invoices. However, because BOLT 12 invoice requests will gracefully "upgrade"
   to a non-static invoice when the recipient comes online, offers backed by
   static invoices are expected to be payable by any BOLT 12 payer.
   With an LDK-based LSP, often-offline clients should set
   `UserConfig::hold_outbound_htlcs_at_next_hop` and call
   `ChannelManager::set_paths_to_static_invoice_server`.
   LDK-based LSPs wishing to support often-offline senders and recipients should
   set `UserConfig::enable_htlc_hold`, support the existing "onion message
   mailbox" feature (setting `intercept_messages_for_offline_peers` on
   `OnionMessenger` and handling `Event::OnionMessageIntercepted`s), and handle
   `Event::PersistStaticInvoice`s and `Event::StaticInvoiceRequested`s.
 * Zero-Fee-Commitment channels are now supported in LDK. These channels remove
   force-closure risk for feerate disagreements by using a fixed, zero fee on
   pre-signed transactions, relying on anchor bumps instead. They also utilize
   the new TRUC + ephemeral dust policy in Bitcoin Core 29 to substantially
   improve the lightning security model. This requires having a path of Bitcoin
   Core 29+ nodes between you and a miner for transactions to be mined. This
   only works with LDK peers, and feature signaling may change in a future
   version of LDK, breaking compatibility. This is negotiated automatically for
   manually-accepted inbound channels and negotiated for outbound channels based
   on `ChannelHandshakeConfig::negotiate_anchor_zero_fee_commitments`.
 * `Event::BumpTransaction` is now always generated even if the transaction has
   sufficient fee. This allows you to manage transaction broadcasting more
   granularly for anchor channels (#4001).
 * The local key which receives non-HTLC-encumbered funds when the counterparty
   force-closes a channel is now one of a static list of 1000 keys when using
   `KeysManager` if `v2_remote_key_derivation` is set or after splicing (#4117).
 * LSPS5 support was added, providing a push notification API for LSPS clients.
 * Client-trusts-LSP is now supported on LSPS2 service (#3838).
 * `LSPS2ClientEvent` now has events for failure events (#3804).
 * `LSPS2ServiceHandler::channel_open_abandoned` was added (#3712).
 * `Event::PendingHTLCsForwardable` has been replaced with regular calls to
   `process_pending_htlc_forwards` in the background processor while
   `ChannelManager::needs_pending_htlc_processing` is true. The delay between
   calls (and, thus, HTLC forwarding delay) is random between zero and 200ms,
   averaging 50ms, faster than the previous recommendation (#3891, #3955).
 * `Event::HTLCHandlingFailed`s now include a`LocalHTLCFailureReason`, providing
   much more granular reasons for HTLCs having been failed (#3744, etc).
 * `Event::HTLCHandlingFailed` is now generated any time forwarding an HTLC
   fails, i.e. including cases where the HTLC onion is invalid (#2933).
 * `Event::HTLCHandlingFailed::failure_type` of `UnknownNextHop` has been
   deprecated and is no longer generated (#3700).
 * `OffersMessageFlow` was introduced to make it easier to implement most of the
   BOLT 12 flows without using a `ChannelManager` (#3639).
 * `ChannelManager::pay_for_bolt11_invoice` was added (#3617).
 * `ChannelManager::pay_for_offer_from_human_readable_name` has been deprecated
   in favor of the `bitcoin-payment-instructions` and
   `ChannelManager::pay_for_offer_from_hrn`. Language bindings users may still
   wish to use the original (#3903, #4083).
 * `lightning::util::anchor_channel_reserves` was added to assist in estimating
   on-chain fund requirements for anchor channel closures (#3487).
 * Using both asynchronous and synchronous `ChannelMonitor[Update]` persistence
   on the same `ChannelManager` will now panic. This never functioned correctly
   and is now detected to prevent issues (#3737).
 * LDK can now validate if HTLC errors have been tampered with (once nodes
   upgrade). It also reports and logs the amount of time an HTLC was held so
   that (as nodes upgrade) slow nodes can be found (#2256, #3801, other fixes).
 * Repeated `Listen::block_disconnected` calls for each disconnected block in a
   reorg have been replaced with a single `blocks_disconnected` call with the
   fork point block (i.e. the highest block on both sides of the reorg, #3876).
 * `lightning::routing::scoring::CombinedScorer` was added to combine scoring
   data between remote scoring info and local payment results (#3562).
 * LDK will now store up to 1KiB of "peer storage" data in `ChannelManager` per
   peer with which we have a funded channel (#3575).
 * The `Persister` trait was removed. You can match on namespace constants in
   `KVStore` to restore custom logic for specific storage objects (#3905).
 * `BlindedMessagePath::new_with_dummy_hops` was added (but is not used by
   default, #3726). You can use `NodeIdMessageRouter` to enable dummy hops.
 * `ProbabilisticScoringFeeParameters::probing_diversity_penalty` was added to
   allow for better information gathering while probing (#3422, #3713).
 * `Persist` now takes a `MonitorName` rather than a `funding_txo` `OutPoint` to
   ensure the storage key is consistent across splices (#3569).
 * `lightning-liquidity` now supports persisting relevant state (#4059, #4118).
 * `ChannelManager::funding_transaction_generated_manual_broadcast` was added to
   open a channel without automatically broadcasting the funding transaction
   (#3838). In it and `unsafe_manual_funding_transaction_generated`
   force-closure logic has been updated to no longer automatically broadcast the
   commitment tx unless the funding transaction has been seen on-chain (#4109).
 * Various instances of channel closure which provided a
   `ClosureReason::HolderForceClosed` now provide more accurate
   `ClosureReason`s, especially `ClosureReason::ProcessingError` (#3881).
 * A new `ClosureReason::LocallyCoopClosedUnfundedChannel` was added (#3881).
 * Some arguments to `ChannelManager::pay_for_offer[_from_human_readable_name]`
   have moved behind `optional_params` (#3808, #3903).
 * `Event::PaymentSent::bolt12_invoice` was added for proof-of-payment (#3593).
 * Channel values are now synchronized via RGS, improving scoring (#3924).
 * `SendOnlyMessageHandler` was added, implemented for `ChainMonitor`, and
   an instance added to `MessageHandler`. Note that `ChainMonitor` does not yet
   send any messages, though will in the future (#3922).
 * `lightning_background_processor::NO_{ONION_MESSENGER,LIQUIDITY_MANAGER}` were
   added to simplify background processor init without some args (#4100, #4132).
 * `ChannelManager::set_current_config` was added (#4038).
 * Onion messages received to a blinded path we generated are now authenticated
   implicitly rather than explicitly in blinded path `Context`s (#3917, #4144).
 * `OMNameResolver::expire_pending_resolution` has been added for those who
   cannot or do not wish to call `new_best_block` regularly (#3900).
 * `lightning-liquidity`'s LSPS1 client now supports BOLT 12 payments (#3649).
 * `LengthReadable::read` has been renamed `read_from_fixed_length_buffer` and
   is implemented for all `Readable` (#3579).
 * `LengthReadable` is now required to read various objects which consume the
   full available buffer (#3640).
 * Structs in `lightning-liquidity` were renamed to be globally unique (#3583).
 * Renamed `SpendableOutputDescriptor::outpoint` to `spendable_outpoint` (#3634)

Performance Improvements
========================

 * `ChainMonitor::load_existing_monitor` was added and should be used on startup
   to load existing `ChannelMonitor`s rather than via `Persist`, avoiding
   re-persisting each `ChannelMonitor` during startup (#3996).
 * RGS data application was further sped up (#3581).

Bug Fixes
=========

 * `FilesystemStore::list` is now more robust against race conditions with
   simultaneous `write`/`archive` operations (#3799).
 * Pending async persistence of `ChannelMonitorUpdate`s required to forward an
   HTLC can no longer result in the HTLC being forgotten if the channel is
   force-closed (#3989).
 * `lightning-liquidity`'s service support now properly responds to the
   `ListProtocols` message (#3785).
 * A rare race which might lead `PeerManager` (and `lightning-net-tokio`) to
   stop reading from a peer until a new message is sent to that peer has been
   fixed (#4168).
 * The fields in `SocketAddress::OnionV3` are now correctly parsed, and the
   `Display` for such addresses is now lowercase (#4090).
 * `PeerManager` is now more conservative about disconnecting peers which aren't
   responding to pings in a timely manner. This may reduce disconnections
   marginally when forwarding gossip to a slow peer (#4093, #4096).
 * Blinded path serialization is now padded to better hide its contents (#3177).
 * In cases of incredibly long async monitor update or async signing operations,
   LDK may have previously spuriously disconnected peers (#3721).
 * Total dust exposure on a commitment now rounds correctly (#3572).

Backwards Compatibility
=======================

 * `ChannelMonitor`s which were created prior to LDK 0.0.110 and which saw no
   updates since LDK 0.0.116 may now fail to deserialize (#3638, #4146).
 * Setting `v2_remote_key_derivation` on `KeysManager` to true, or splicing a
   channel results in using keys which prior versions of LDK do not know how to
   derive. This may result in missing funds or panics trying to sweep closed
   channels after downgrading (#4117).
 * After upgrading to 0.2, downgrading to versions of LDK prior to 0.0.123 is no
   longer supported (#2933).
 * Upgrading from versions prior to 0.0.116 is not supported (#3604, #3678).
 * Upgrading to v0.2.0 will time out any pending async payment waiting for the
   often offline peer to come online (#3918).
 * Blinded message paths generated by previous versions of LDK, except those
   generated for inclusion in BOLT 12 `Offer`s will no longer be accepted. As
   most blinded message paths are ephemeral, this should only invalidate issued
   BOLT 12 `Refund`s in practice (#3917).
 * Once a channel has been spliced, LDK can no longer be downgraded.
   `UserConfig::reject_inbound_splices` can be set to block inbound ones (#4150)
 * Downgrading after setting `UserConfig::enable_htlc_hold` is not supported
   (#4045, #4046).
 * LDK now requires the `channel_type` feature in line with spec updates (#3896)

v0.1.7

Toggle v0.1.7's commit message
v0.1.7 - Oct 21, 2025 - "Unstable Release CI"

Bug Fixes
=========

 * Builds with the `docsrs` cfg flag (set automatically for builds on docs.rs
   but otherwise not used) were fixed.

v0.2.0-beta1

Toggle v0.2.0-beta1's commit message
v0.2.0-beta1

Release notes forthcoming

v0.1.6

Toggle v0.1.6's commit message
v0.1.6 - Oct 10, 2025 - "Async Preimage Claims"

Performance Improvements
========================

 * `NetworkGraph::remove_stale_channels_and_tracking` has been sped up by more
   than 20x in cases where many entries need to be removed (such as after
   initial gossip sync, #4080).

Bug Fixes
=========

 * Delivery of on-chain resolutions of HTLCs to `ChannelManager` has been made
   more robust to prevent loss in some exceedingly rare crash cases. This may
   marginally increase payment resolution event replays on startup (#3984).
 * Corrected forwarding of new gossip to peers which we are sending an initial
   gossip sync to (#4107).
 * A rare race condition may have resulted in outbound BOLT12 payments
   spuriously failing while processing the `Bolt12Invoice` message (#4078).
 * If a channel is updated multiple times after a payment is claimed while using
   async persistence of the `ChannelMonitorUpdate`s, and the node then restarts
   with a stale copy of its `ChannelManager`, the `PaymentClaimed` may have been
   lost (#3988).
 * If an async-persisted `ChannelMonitorUpdate` for one part of an MPP claim
   does not complete before multiple `ChannelMonitorUpdate`s for another channel
   in the same MPP claim complete, and the node restarts twice, the preimage may
   be lost and the MPP payment part may not be claimed (#3928).

Security
========
0.1.6 fixes a denial of service vulnerability and a funds-theft vulnerability.
 * When a channel has been force-closed, we have already claimed some of its
   HTLCs on-chain, and we later learn a new preimage allowing us to claim
   further HTLCs on-chain, we could in some cases generate invalid claim
   transactions leading to loss of funds (#4154).
 * When a `ChannelMonitor` is created for a channel which is never funded with
   a real transaction, `ChannelMonitor::get_claimable_balances` would never be
   empty. As a result, `ChannelMonitor::check_and_update_full_resolution_status`
   would never indicate the monitor is prunable, and thus
   `ChainMonitor::archive_fully_resolved_channel_monitors` would never remove
   it. This allows a peer which opens channels without funding them to bloat our
   memory and disk space, eventually leading to denial-of-service (#4081).