feature: add taproot final to feature bit manager
What changed, and why it matters
This commit adds a new advertised protocol feature flag for final/fully-released Taproot channels in LND. It tells other nodes that this LND node supports the finalized version of simple Taproot channels, and it wires up the same dependencies and on/off switch as the earlier 'staging' version. There is no direct security bug in the diff; it is a feature-enablement change.
Review as normal feature work. No security patch or incident response needed. If auditing Taproot channel support, verify that the final feature bit behavior matches the staging implementation and that disabling NoTaprootChans correctly suppresses both staging and final bits.
Security signals we found
No memory-safety, cryptographic, or authorization changes
Pure feature-bit advertisement registration
Depends on existing optional features (AnchorsZeroFeeHtlcTx, ExplicitChannelType)
No CVE, advisory, or vendor security disclosure referenced
Evidence from the diff
The patch registers lnwire.SimpleTaprootChannelsOptionalFinal in the feature-bit default set and dependency descriptors, and ensures cfg.NoTaprootChans also unsets the new OptionalFinal and RequiredFinal bits. It mirrors the existing SimpleTaprootChannelsOptionalStaging entry. No parsing, cryptographic, or consensus logic is changed.
Changed components
feature/default_sets.gofeature/deps.gofeature/manager.goInspect captured patch +10 / −0
diff --git a/feature/default_sets.go b/feature/default_sets.go
index a1b20e0..9b1f424 100644
--- a/feature/default_sets.go
+++ b/feature/default_sets.go
@@ -96,6 +96,10 @@ var defaultSetDesc = setDesc{
SetInit: {}, // I
SetNodeAnn: {}, // N
},
+ lnwire.SimpleTaprootChannelsOptionalFinal: {
+ SetInit: {}, // I
+ SetNodeAnn: {}, // N
+ },
lnwire.SimpleTaprootOverlayChansOptional: {
SetInit: {}, // I
SetNodeAnn: {}, // N
diff --git a/feature/deps.go b/feature/deps.go
index 0a2701e..5b10f7c 100644
--- a/feature/deps.go
+++ b/feature/deps.go
@@ -79,6 +79,10 @@ var deps = depDesc{
lnwire.AnchorsZeroFeeHtlcTxOptional: {},
lnwire.ExplicitChannelTypeOptional: {},
},
+ lnwire.SimpleTaprootChannelsOptionalFinal: {
+ lnwire.AnchorsZeroFeeHtlcTxOptional: {},
+ lnwire.ExplicitChannelTypeOptional: {},
+ },
lnwire.SimpleTaprootOverlayChansOptional: {
lnwire.SimpleTaprootChannelsOptionalStaging: {},
lnwire.TLVOnionPayloadOptional: {},
diff --git a/feature/manager.go b/feature/manager.go
index 9a0950d..b1fff33 100644
--- a/feature/manager.go
+++ b/feature/manager.go
@@ -203,6 +203,8 @@ func newManager(cfg Config, desc setDesc) (*Manager, error) {
if cfg.NoTaprootChans {
raw.Unset(lnwire.SimpleTaprootChannelsOptionalStaging)
raw.Unset(lnwire.SimpleTaprootChannelsRequiredStaging)
+ raw.Unset(lnwire.SimpleTaprootChannelsOptionalFinal)
+ raw.Unset(lnwire.SimpleTaprootChannelsRequiredFinal)
}
if cfg.NoRouteBlinding {
raw.Unset(lnwire.RouteBlindingOptional)
Why this scored 19/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.