Background
In lnd, RBF cooperative close was being selected purely from the peer-level RBF feature bits, with no per-channel exclusion. The RBF close state machine does not invoke any of the aux closer hooks: the Shutdown it sends carries no aux custom records, and the close transaction it negotiates contains no aux outputs. For a taproot asset (overlay) channel this means the funding output — which anchors the asset commitment — is spent by a transaction that does not re-commit the assets, irrevocably destroying them on-chain. The aux closer is then unable to finalize the confirmed close, leaving the channel stuck in waiting-close.
As a stopgap, lnd now excludes aux channels from the RBF coop close flow and falls them back to the legacy (aux-aware) negotiate closer:
Request
Add support for the RBF cooperative close flow to aux channels so they no longer have to fall back to the legacy negotiate closer. This requires the RBF close state machine to invoke the aux closer hooks (aux shutdown records + aux close outputs / vPacket production) the same way the legacy closer does, so that the negotiated close transaction re-commits the assets and the aux closer can finalize it once confirmed.
Once implemented on the taproot-assets side, the corresponding per-channel exclusion in lnd (rbfCoopCloseAllowedForChan / the initRbfChanCloser backstop) can be relaxed.
Background
In lnd, RBF cooperative close was being selected purely from the peer-level RBF feature bits, with no per-channel exclusion. The RBF close state machine does not invoke any of the aux closer hooks: the
Shutdownit sends carries no aux custom records, and the close transaction it negotiates contains no aux outputs. For a taproot asset (overlay) channel this means the funding output — which anchors the asset commitment — is spent by a transaction that does not re-commit the assets, irrevocably destroying them on-chain. The aux closer is then unable to finalize the confirmed close, leaving the channel stuck in waiting-close.As a stopgap, lnd now excludes aux channels from the RBF coop close flow and falls them back to the legacy (aux-aware) negotiate closer:
Request
Add support for the RBF cooperative close flow to aux channels so they no longer have to fall back to the legacy negotiate closer. This requires the RBF close state machine to invoke the aux closer hooks (aux shutdown records + aux close outputs / vPacket production) the same way the legacy closer does, so that the negotiated close transaction re-commits the assets and the aux closer can finalize it once confirmed.
Once implemented on the taproot-assets side, the corresponding per-channel exclusion in lnd (
rbfCoopCloseAllowedForChan/ theinitRbfChanCloserbackstop) can be relaxed.