< Summary - Combined Code Coverage

Information
Class: NLightning.Domain.Node.Options.FeatureOptions
Assembly: NLightning.Domain
File(s): /home/runner/work/nlightning/nlightning/src/NLightning.Domain/Node/Options/FeatureOptions.cs
Tag: 36_15743069263
Line coverage
8%
Covered lines: 14
Uncovered lines: 154
Coverable lines: 168
Total lines: 379
Line coverage: 8.3%
Branch coverage
0%
Covered branches: 0
Total branches: 120
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_DataLossProtect()100%11100%
get_InitialRoutingSync()100%210%
get_UpfrontShutdownScript()100%11100%
get_GossipQueries()100%11100%
get_ExpandedGossipQueries()100%11100%
get_StaticRemoteKey()100%11100%
get_PaymentSecret()100%11100%
get_BasicMpp()100%11100%
get_LargeChannels()100%11100%
get_AnchorOutputs()100%11100%
get_ZeroFeeAnchorTx()100%210%
get_RouteBlinding()100%11100%
get_BeyondSegwitShutdown()100%210%
get_DualFund()100%11100%
get_OnionMessages()100%210%
get_ChannelType()100%11100%
get_ScidAlias()100%11100%
get_PaymentMetadata()100%210%
get_ZeroConf()100%210%
get_ChainHashes()100%11100%
get_RemoteAddress()100%210%
GetNodeFeatures()0%1482380%
GetInitTlvs()0%620%
GetNodeOptions(...)0%6480800%

File(s)

/home/runner/work/nlightning/nlightning/src/NLightning.Domain/Node/Options/FeatureOptions.cs

#LineLine coverage
 1using System.Net;
 2
 3namespace NLightning.Domain.Node.Options;
 4
 5using Domain.Crypto.Constants;
 6using Domain.Protocol.ValueObjects;
 7using Enums;
 8using Protocol.Constants;
 9using Protocol.Models;
 10using Protocol.Tlv;
 11
 12public class FeatureOptions
 13{
 14    /// <summary>
 15    /// Enable data loss protection.
 16    /// </summary>
 20017    public FeatureSupport DataLossProtect { get; set; } = FeatureSupport.Compulsory;
 18
 19    /// <summary>
 20    /// Enable initial routing sync.
 21    /// </summary>
 022    public FeatureSupport InitialRoutingSync { get; set; } = FeatureSupport.No;
 23
 24    /// <summary>
 25    /// Enable upfront shutdown script.
 26    /// </summary>
 20027    public FeatureSupport UpfrontShutdownScript { get; set; } = FeatureSupport.Optional;
 28
 29    /// <summary>
 30    /// Enable gossip queries.
 31    /// </summary>
 20032    public FeatureSupport GossipQueries { get; set; } = FeatureSupport.Optional;
 33
 34    /// <summary>
 35    /// Enable expanded gossip queries.
 36    /// </summary>
 20037    public FeatureSupport ExpandedGossipQueries { get; set; } = FeatureSupport.Optional;
 38
 39    /// <summary>
 40    /// Enable static remote key.
 41    /// </summary>
 20042    public FeatureSupport StaticRemoteKey { get; set; } = FeatureSupport.Compulsory;
 43
 44    /// <summary>
 45    /// Enable payment secret.
 46    /// </summary>
 20047    public FeatureSupport PaymentSecret { get; set; } = FeatureSupport.Compulsory;
 48
 49    /// <summary>
 50    /// Enable basic MPP.
 51    /// </summary>
 20052    public FeatureSupport BasicMpp { get; set; } = FeatureSupport.Optional;
 53
 54    /// <summary>
 55    /// Enable large channels.
 56    /// </summary>
 20057    public FeatureSupport LargeChannels { get; set; } = FeatureSupport.Optional;
 58
 59    /// <summary>
 60    /// Enable anchor outputs.
 61    /// </summary>
 20062    public FeatureSupport AnchorOutputs { get; set; } = FeatureSupport.Optional;
 63
 64    /// <summary>
 65    /// Enable zero fee anchor tx.
 66    /// </summary>
 067    public FeatureSupport ZeroFeeAnchorTx { get; set; } = FeatureSupport.No;
 68
 69    /// <summary>
 70    /// Enable route blinding.
 71    /// </summary>
 20072    public FeatureSupport RouteBlinding { get; set; } = FeatureSupport.Optional;
 73
 74    /// <summary>
 75    /// Enable beyond segwit shutdown.
 76    /// </summary>
 077    public FeatureSupport BeyondSegwitShutdown { get; set; } = FeatureSupport.No;
 78
 79    /// <summary>
 80    /// Enable dual fund.
 81    /// </summary>
 20082    public FeatureSupport DualFund { get; set; } = FeatureSupport.Optional;
 83
 84    /// <summary>
 85    /// Enable onion messages.
 86    /// </summary>
 087    public FeatureSupport OnionMessages { get; set; } = FeatureSupport.No;
 88
 89    /// <summary>
 90    /// Enable channel type.
 91    /// </summary>
 20092    public FeatureSupport ChannelType { get; set; } = FeatureSupport.Optional;
 93
 94    /// <summary>
 95    /// Enable scid alias.
 96    /// </summary>
 20097    public FeatureSupport ScidAlias { get; set; } = FeatureSupport.Optional;
 98
 99    /// <summary>
 100    /// Enable payment metadata.
 101    /// </summary>
 0102    public FeatureSupport PaymentMetadata { get; set; } = FeatureSupport.No;
 103
 104    /// <summary>
 105    /// Enable zero conf.
 106    /// </summary>
 0107    public FeatureSupport ZeroConf { get; set; } = FeatureSupport.No;
 108
 109    /// <summary>
 110    /// The chain hashes of the node.
 111    /// </summary>
 112    /// <remarks>
 113    /// Initialized as Mainnet if not set.
 114    /// </remarks>
 200115    public IEnumerable<ChainHash> ChainHashes { get; set; } = [];
 116
 117    /// <summary>
 118    /// The remote address of the node.
 119    /// </summary>
 120    /// <remarks>
 121    /// This is used to connect to our node.
 122    /// </remarks>
 0123    public IPAddress? RemoteAddress { get; set; } = null;
 124
 125    /// <summary>
 126    /// Get Features set for the node.
 127    /// </summary>
 128    /// <returns>The features set for the node.</returns>
 129    /// <remarks>
 130    /// All features set as Optional.
 131    /// </remarks>
 132    public FeatureSet GetNodeFeatures()
 133    {
 0134        var features = new FeatureSet();
 135
 136        // Set default features
 0137        if (DataLossProtect != FeatureSupport.No)
 138        {
 0139            features.SetFeature(Feature.OptionDataLossProtect, DataLossProtect == FeatureSupport.Compulsory);
 140        }
 141
 0142        if (InitialRoutingSync != FeatureSupport.No)
 143        {
 0144            features.SetFeature(Feature.InitialRoutingSync, InitialRoutingSync == FeatureSupport.Compulsory);
 145        }
 146
 0147        if (UpfrontShutdownScript != FeatureSupport.No)
 148        {
 0149            features.SetFeature(Feature.OptionUpfrontShutdownScript,
 0150                                UpfrontShutdownScript == FeatureSupport.Compulsory);
 151        }
 152
 0153        if (GossipQueries != FeatureSupport.No)
 154        {
 0155            features.SetFeature(Feature.GossipQueries, GossipQueries == FeatureSupport.Compulsory);
 156        }
 157
 0158        if (ExpandedGossipQueries != FeatureSupport.No)
 159        {
 0160            features.SetFeature(Feature.GossipQueriesEx, ExpandedGossipQueries == FeatureSupport.Compulsory);
 161        }
 162
 0163        if (StaticRemoteKey != FeatureSupport.No)
 164        {
 0165            features.SetFeature(Feature.OptionStaticRemoteKey, StaticRemoteKey == FeatureSupport.Compulsory);
 166        }
 167
 0168        if (PaymentSecret != FeatureSupport.No)
 169        {
 0170            features.SetFeature(Feature.PaymentSecret, PaymentSecret == FeatureSupport.Compulsory);
 171        }
 172
 0173        if (BasicMpp != FeatureSupport.No)
 174        {
 0175            features.SetFeature(Feature.BasicMpp, BasicMpp == FeatureSupport.Compulsory);
 176        }
 177
 0178        if (LargeChannels != FeatureSupport.No)
 179        {
 0180            features.SetFeature(Feature.OptionSupportLargeChannel, LargeChannels == FeatureSupport.Compulsory);
 181        }
 182
 0183        if (AnchorOutputs != FeatureSupport.No)
 184        {
 0185            features.SetFeature(Feature.OptionAnchorOutputs, AnchorOutputs == FeatureSupport.Compulsory);
 186        }
 187
 0188        if (ZeroFeeAnchorTx != FeatureSupport.No)
 189        {
 0190            features.SetFeature(Feature.OptionAnchorsZeroFeeHtlcTx, ZeroFeeAnchorTx == FeatureSupport.Compulsory);
 191        }
 192
 0193        if (RouteBlinding != FeatureSupport.No)
 194        {
 0195            features.SetFeature(Feature.OptionRouteBlinding, RouteBlinding == FeatureSupport.Compulsory);
 196        }
 197
 0198        if (BeyondSegwitShutdown != FeatureSupport.No)
 199        {
 0200            features.SetFeature(Feature.OptionShutdownAnySegwit, BeyondSegwitShutdown == FeatureSupport.Compulsory);
 201        }
 202
 0203        if (DualFund != FeatureSupport.No)
 204        {
 0205            features.SetFeature(Feature.OptionDualFund, DualFund == FeatureSupport.Compulsory);
 206        }
 207
 0208        if (OnionMessages != FeatureSupport.No)
 209        {
 0210            features.SetFeature(Feature.OptionOnionMessages, OnionMessages == FeatureSupport.Compulsory);
 211        }
 212
 0213        if (ChannelType != FeatureSupport.No)
 214        {
 0215            features.SetFeature(Feature.OptionChannelType, ChannelType == FeatureSupport.Compulsory);
 216        }
 217
 0218        if (ScidAlias != FeatureSupport.No)
 219        {
 0220            features.SetFeature(Feature.OptionScidAlias, ScidAlias == FeatureSupport.Compulsory);
 221        }
 222
 0223        if (PaymentMetadata != FeatureSupport.No)
 224        {
 0225            features.SetFeature(Feature.OptionPaymentMetadata, PaymentMetadata == FeatureSupport.Compulsory);
 226        }
 227
 0228        if (ZeroConf != FeatureSupport.No)
 229        {
 0230            features.SetFeature(Feature.OptionZeroconf, ZeroConf == FeatureSupport.Compulsory);
 231        }
 232
 0233        return features;
 234    }
 235
 236    /// <summary>
 237    /// Get the Init extension for the node.
 238    /// </summary>
 239    /// <returns>The Init extension for the node.</returns>
 240    /// <remarks>
 241    /// If there are no ChainHashes, Mainnet is used as default.
 242    /// </remarks>
 243    internal NetworksTlv GetInitTlvs()
 244    {
 245        // If there are no ChainHashes, use Mainnet as default
 0246        if (!ChainHashes.Any())
 247        {
 0248            ChainHashes = [ChainConstants.Main];
 249        }
 250
 0251        return new NetworksTlv(ChainHashes);
 252
 253        // TODO: Review this when implementing BOLT7
 254        // // If RemoteAddress is set, add it to the extension
 255        // if (RemoteAddress != null)
 256        // {
 257        //     extension.Add(new(new BigSize(3), RemoteAddress.GetAddressBytes()));
 258        // }
 259    }
 260
 261    /// <summary>
 262    /// Get the node options from the features and extension.
 263    /// </summary>
 264    /// <param name="featureSet">The features of the node.</param>
 265    /// <param name="extension">The extension of the node.</param>
 266    /// <returns>The node options.</returns>
 267    public static FeatureOptions GetNodeOptions(FeatureSet featureSet, TlvStream? extension)
 268    {
 0269        var options = new FeatureOptions
 0270        {
 0271            DataLossProtect = featureSet.IsFeatureSet(Feature.OptionDataLossProtect, true)
 0272                                  ? FeatureSupport.Compulsory
 0273                                  : featureSet.IsFeatureSet(Feature.OptionDataLossProtect, false)
 0274                                      ? FeatureSupport.Optional
 0275                                      : FeatureSupport.No,
 0276            InitialRoutingSync = featureSet.IsFeatureSet(Feature.InitialRoutingSync, true)
 0277                                     ? FeatureSupport.Compulsory
 0278                                     : featureSet.IsFeatureSet(Feature.InitialRoutingSync, false)
 0279                                         ? FeatureSupport.Optional
 0280                                         : FeatureSupport.No,
 0281            UpfrontShutdownScript = featureSet.IsFeatureSet(Feature.OptionUpfrontShutdownScript, true)
 0282                                        ? FeatureSupport.Compulsory
 0283                                        : featureSet.IsFeatureSet(Feature.OptionUpfrontShutdownScript, false)
 0284                                            ? FeatureSupport.Optional
 0285                                            : FeatureSupport.No,
 0286            GossipQueries = featureSet.IsFeatureSet(Feature.GossipQueries, true)
 0287                                ? FeatureSupport.Compulsory
 0288                                : featureSet.IsFeatureSet(Feature.GossipQueries, false)
 0289                                    ? FeatureSupport.Optional
 0290                                    : FeatureSupport.No,
 0291            ExpandedGossipQueries = featureSet.IsFeatureSet(Feature.GossipQueriesEx, true)
 0292                                        ? FeatureSupport.Compulsory
 0293                                        : featureSet.IsFeatureSet(Feature.GossipQueriesEx, false)
 0294                                            ? FeatureSupport.Optional
 0295                                            : FeatureSupport.No,
 0296            StaticRemoteKey = featureSet.IsFeatureSet(Feature.OptionStaticRemoteKey, true)
 0297                                  ? FeatureSupport.Compulsory
 0298                                  : featureSet.IsFeatureSet(Feature.OptionStaticRemoteKey, false)
 0299                                      ? FeatureSupport.Optional
 0300                                      : FeatureSupport.No,
 0301            PaymentSecret = featureSet.IsFeatureSet(Feature.PaymentSecret, true)
 0302                                ? FeatureSupport.Compulsory
 0303                                : featureSet.IsFeatureSet(Feature.PaymentSecret, false)
 0304                                    ? FeatureSupport.Optional
 0305                                    : FeatureSupport.No,
 0306            BasicMpp = featureSet.IsFeatureSet(Feature.BasicMpp, true)
 0307                           ? FeatureSupport.Compulsory
 0308                           : featureSet.IsFeatureSet(Feature.BasicMpp, false)
 0309                               ? FeatureSupport.Optional
 0310                               : FeatureSupport.No,
 0311            LargeChannels = featureSet.IsFeatureSet(Feature.OptionSupportLargeChannel, true)
 0312                                ? FeatureSupport.Compulsory
 0313                                : featureSet.IsFeatureSet(Feature.OptionSupportLargeChannel, false)
 0314                                    ? FeatureSupport.Optional
 0315                                    : FeatureSupport.No,
 0316            AnchorOutputs = featureSet.IsFeatureSet(Feature.OptionAnchorOutputs, true)
 0317                                ? FeatureSupport.Compulsory
 0318                                : featureSet.IsFeatureSet(Feature.OptionAnchorOutputs, false)
 0319                                    ? FeatureSupport.Optional
 0320                                    : FeatureSupport.No,
 0321            ZeroFeeAnchorTx = featureSet.IsFeatureSet(Feature.OptionAnchorsZeroFeeHtlcTx, true)
 0322                                  ? FeatureSupport.Compulsory
 0323                                  : featureSet.IsFeatureSet(Feature.OptionAnchorsZeroFeeHtlcTx, false)
 0324                                      ? FeatureSupport.Optional
 0325                                      : FeatureSupport.No,
 0326            RouteBlinding = featureSet.IsFeatureSet(Feature.OptionRouteBlinding, true)
 0327                                ? FeatureSupport.Compulsory
 0328                                : featureSet.IsFeatureSet(Feature.OptionRouteBlinding, false)
 0329                                    ? FeatureSupport.Optional
 0330                                    : FeatureSupport.No,
 0331            BeyondSegwitShutdown = featureSet.IsFeatureSet(Feature.OptionShutdownAnySegwit, true)
 0332                                       ? FeatureSupport.Compulsory
 0333                                       : featureSet.IsFeatureSet(Feature.OptionShutdownAnySegwit, false)
 0334                                           ? FeatureSupport.Optional
 0335                                           : FeatureSupport.No,
 0336            DualFund = featureSet.IsFeatureSet(Feature.OptionDualFund, true)
 0337                           ? FeatureSupport.Compulsory
 0338                           : featureSet.IsFeatureSet(Feature.OptionDualFund, false)
 0339                               ? FeatureSupport.Optional
 0340                               : FeatureSupport.No,
 0341            OnionMessages = featureSet.IsFeatureSet(Feature.OptionOnionMessages, true)
 0342                                ? FeatureSupport.Compulsory
 0343                                : featureSet.IsFeatureSet(Feature.OptionOnionMessages, false)
 0344                                    ? FeatureSupport.Optional
 0345                                    : FeatureSupport.No,
 0346            ChannelType = featureSet.IsFeatureSet(Feature.OptionChannelType, true)
 0347                              ? FeatureSupport.Compulsory
 0348                              : featureSet.IsFeatureSet(Feature.OptionChannelType, false)
 0349                                  ? FeatureSupport.Optional
 0350                                  : FeatureSupport.No,
 0351            ScidAlias = featureSet.IsFeatureSet(Feature.OptionScidAlias, true)
 0352                            ? FeatureSupport.Compulsory
 0353                            : featureSet.IsFeatureSet(Feature.OptionScidAlias, false)
 0354                                ? FeatureSupport.Optional
 0355                                : FeatureSupport.No,
 0356            PaymentMetadata = featureSet.IsFeatureSet(Feature.OptionPaymentMetadata, true)
 0357                                  ? FeatureSupport.Compulsory
 0358                                  : featureSet.IsFeatureSet(Feature.OptionPaymentMetadata, false)
 0359                                      ? FeatureSupport.Optional
 0360                                      : FeatureSupport.No,
 0361            ZeroConf = featureSet.IsFeatureSet(Feature.OptionZeroconf, true)
 0362                           ? FeatureSupport.Compulsory
 0363                           : featureSet.IsFeatureSet(Feature.OptionZeroconf, false)
 0364                               ? FeatureSupport.Optional
 0365                               : FeatureSupport.No
 0366        };
 367
 0368        if (extension?.TryGetTlv(new BigSize(1), out var chainHashes) ?? false)
 369        {
 0370            options.ChainHashes = Enumerable.Range(0, chainHashes!.Value.Length / CryptoConstants.Sha256HashLen)
 0371                                            .Select(i => new ChainHash(
 0372                                                        chainHashes.Value.Skip(i * 32).Take(32).ToArray()));
 373        }
 374
 375        // TODO: Add network when implementing BOLT7
 376
 0377        return options;
 378    }
 379}