< 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: 57_24045730253
Line coverage
7%
Covered lines: 17
Uncovered lines: 221
Coverable lines: 238
Total lines: 382
Line coverage: 7.1%
Branch coverage
0%
Covered branches: 0
Total branches: 250
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_OptionDataLossProtect()100%11100%
get_DataLossProtect()100%210%
get_UpfrontShutdownScript()100%11100%
get_InitialRoutingSync()100%210%
get_GossipQueries()100%11100%
get_VarOnionOptIn()100%11100%
get_UpfrontShutdownScript()100%210%
get_ExpandedGossipQueries()100%11100%
get_GossipQueries()100%210%
get_OptionStaticRemoteKey()100%11100%
get_PaymentSecret()100%11100%
get_ExpandedGossipQueries()100%210%
get_BasicMpp()100%11100%
get_StaticRemoteKey()100%210%
get_LargeChannels()100%11100%
get_PaymentSecret()100%210%
get_OptionAnchors()100%210%
get_BasicMpp()100%210%
get_OptionRouteBlinding()100%11100%
get_LargeChannels()100%210%
get_BeyondSegwitShutdown()100%210%
get_AnchorOutputs()100%210%
get_DualFund()100%11100%
get_ZeroFeeAnchorTx()100%210%
get_OptionQuiesce()100%11100%
get_OptionAttributionData()100%11100%
get_RouteBlinding()100%210%
get_OptionOnionMessages()100%210%
get_OptionProvideStorage()100%11100%
get_BeyondSegwitShutdown()100%210%
get_OptionChannelType()100%11100%
get_DualFund()100%210%
get_ScidAlias()100%11100%
get_OnionMessages()100%210%
get_PaymentMetadata()100%210%
get_ChannelType()100%210%
get_ZeroConf()100%210%
get_OptionSimpleClose()100%210%
get_ScidAlias()100%210%
get_InitialRoutingSync()100%210%
get_PaymentMetadata()100%210%
get_ZeroConf()100%210%
get_ChainHashes()100%11100%
get_ChainHashes()100%210%
get_RemoteAddress()100%210%
get_RemoteAddress()100%210%
GetNodeFeatures()0%1332360%
GetNodeFeatures()0%1482380%
GetInitTlvs()0%620%
GetInitTlvs()0%620%
GetNodeOptions(...)0%8556920%
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{
 11614    public FeatureSupport OptionDataLossProtect { get; private set; } = FeatureSupport.Compulsory;
 15
 16    /// <summary>
 017    /// Enable an upfront shutdown script.
 18    /// </summary>
 11619    public FeatureSupport UpfrontShutdownScript { get; set; } = FeatureSupport.Optional;
 20
 21    /// <summary>
 022    /// Enable gossip queries.
 23    /// </summary>
 11624    public FeatureSupport GossipQueries { get; set; } = FeatureSupport.Optional;
 25
 11626    public FeatureSupport VarOnionOptIn { get; private set; } = FeatureSupport.Compulsory;
 027
 28    /// <summary>
 29    /// Enable expanded gossip queries.
 30    /// </summary>
 11631    public FeatureSupport ExpandedGossipQueries { get; set; } = FeatureSupport.Optional;
 032
 11633    public FeatureSupport OptionStaticRemoteKey { get; private set; } = FeatureSupport.Compulsory;
 34
 11635    public FeatureSupport PaymentSecret { get; private set; } = FeatureSupport.Compulsory;
 36
 037    /// <summary>
 38    /// Enable basic MPP.
 39    /// </summary>
 11640    public FeatureSupport BasicMpp { get; set; } = FeatureSupport.Optional;
 41
 042    /// <summary>
 43    /// Enable large channels.
 44    /// </summary>
 11645    public FeatureSupport LargeChannels { get; set; } = FeatureSupport.Optional;
 46
 047    /// <summary>
 48    /// Enable zero fee anchor tx.
 49    /// </summary>
 050    public FeatureSupport OptionAnchors { get; set; } = FeatureSupport.No;
 51
 052    /// <summary>
 53    /// Enable route blinding.
 54    /// </summary>
 11655    public FeatureSupport OptionRouteBlinding { get; set; } = FeatureSupport.Optional;
 56
 057    /// <summary>
 58    /// Enable beyond segwit shutdown.
 59    /// </summary>
 060    public FeatureSupport BeyondSegwitShutdown { get; set; } = FeatureSupport.No;
 61
 062    /// <summary>
 63    /// Enable dual fund.
 64    /// </summary>
 11665    public FeatureSupport DualFund { get; set; } = FeatureSupport.Optional;
 66
 11667    public FeatureSupport OptionQuiesce { get; set; } = FeatureSupport.Optional;
 68
 11669    public FeatureSupport OptionAttributionData { get; set; } = FeatureSupport.Optional;
 70
 71    /// <summary>
 072    /// Enable onion messages.
 73    /// </summary>
 074    public FeatureSupport OptionOnionMessages { get; set; } = FeatureSupport.No;
 75
 11676    public FeatureSupport OptionProvideStorage { get; set; } = FeatureSupport.Optional;
 077
 11678    public FeatureSupport OptionChannelType { get; private set; } = FeatureSupport.Compulsory;
 79
 80    /// <summary>
 81    /// Enable scid alias.
 082    /// </summary>
 11683    public FeatureSupport ScidAlias { get; set; } = FeatureSupport.Optional;
 84
 85    /// <summary>
 86    /// Enable payment metadata.
 087    /// </summary>
 088    public FeatureSupport PaymentMetadata { get; set; } = FeatureSupport.No;
 89
 90    /// <summary>
 91    /// Enable zero conf.
 092    /// </summary>
 093    public FeatureSupport ZeroConf { get; set; } = FeatureSupport.No;
 94
 095    public FeatureSupport OptionSimpleClose { get; set; } = FeatureSupport.No;
 96
 097    /// <summary>
 98    /// Enable initial routing sync.
 99    /// </summary>
 100    /// [Deprecated]
 0101    public FeatureSupport InitialRoutingSync { get; set; } = FeatureSupport.No;
 0102
 103    /// <summary>
 104    /// The chain hashes of the node.
 105    /// </summary>
 106    /// <remarks>
 0107    /// Initialized as Mainnet if not set.
 108    /// </remarks>
 116109    public IEnumerable<ChainHash> ChainHashes { get; set; } = [];
 110
 111    /// <summary>
 112    /// The remote address of the node.
 113    /// </summary>
 114    /// <remarks>
 0115    /// This is used to connect to our node.
 116    /// </remarks>
 0117    public IPAddress? RemoteAddress { get; set; } = null;
 118
 119    /// <summary>
 120    /// Get Features set for the node.
 121    /// </summary>
 122    /// <returns>The features set for the node.</returns>
 0123    /// <remarks>
 124    /// All features set as Optional.
 125    /// </remarks>
 126    public FeatureSet GetNodeFeatures()
 127    {
 0128        var features = new FeatureSet();
 129
 0130        if (UpfrontShutdownScript != FeatureSupport.No)
 131        {
 0132            features.SetFeature(Feature.OptionUpfrontShutdownScript,
 0133                                UpfrontShutdownScript == FeatureSupport.Compulsory);
 0134        }
 135
 0136        if (GossipQueries != FeatureSupport.No)
 0137        {
 0138            features.SetFeature(Feature.GossipQueries, GossipQueries == FeatureSupport.Compulsory);
 0139        }
 140
 0141        if (ExpandedGossipQueries != FeatureSupport.No)
 0142        {
 0143            features.SetFeature(Feature.GossipQueriesEx, ExpandedGossipQueries == FeatureSupport.Compulsory);
 0144        }
 145
 0146        if (BasicMpp != FeatureSupport.No)
 0147        {
 0148            features.SetFeature(Feature.BasicMpp, BasicMpp == FeatureSupport.Compulsory);
 0149        }
 0150
 0151        if (LargeChannels != FeatureSupport.No)
 152        {
 0153            features.SetFeature(Feature.OptionSupportLargeChannel, LargeChannels == FeatureSupport.Compulsory);
 154        }
 0155
 0156        if (OptionAnchors != FeatureSupport.No)
 157        {
 0158            features.SetFeature(Feature.OptionAnchors, OptionAnchors == FeatureSupport.Compulsory);
 159        }
 0160
 0161        if (OptionRouteBlinding != FeatureSupport.No)
 162        {
 0163            features.SetFeature(Feature.OptionRouteBlinding, OptionRouteBlinding == FeatureSupport.Compulsory);
 164        }
 0165
 0166        if (BeyondSegwitShutdown != FeatureSupport.No)
 167        {
 0168            features.SetFeature(Feature.OptionShutdownAnySegwit, BeyondSegwitShutdown == FeatureSupport.Compulsory);
 169        }
 0170
 0171        if (DualFund != FeatureSupport.No)
 172        {
 0173            features.SetFeature(Feature.OptionDualFund, DualFund == FeatureSupport.Compulsory);
 174        }
 0175
 0176        if (OptionQuiesce != FeatureSupport.No)
 177        {
 0178            features.SetFeature(Feature.OptionQuiesce, OptionQuiesce == FeatureSupport.Compulsory);
 179        }
 0180
 0181        if (OptionAttributionData != FeatureSupport.No)
 182        {
 0183            features.SetFeature(Feature.OptionAttributionData, OptionAttributionData == FeatureSupport.Compulsory);
 184        }
 0185
 0186        if (OptionOnionMessages != FeatureSupport.No)
 187        {
 0188            features.SetFeature(Feature.OptionOnionMessages, OptionOnionMessages == FeatureSupport.Compulsory);
 189        }
 0190
 0191        if (OptionProvideStorage != FeatureSupport.No)
 192        {
 0193            features.SetFeature(Feature.OptionProvideStorage, OptionProvideStorage == FeatureSupport.Compulsory);
 194        }
 0195
 0196        if (OptionChannelType != FeatureSupport.No)
 197        {
 0198            features.SetFeature(Feature.OptionChannelType, OptionChannelType == FeatureSupport.Compulsory);
 199        }
 0200
 0201        if (ScidAlias != FeatureSupport.No)
 202        {
 0203            features.SetFeature(Feature.OptionScidAlias, ScidAlias == FeatureSupport.Compulsory);
 204        }
 0205
 0206        if (PaymentMetadata != FeatureSupport.No)
 207        {
 0208            features.SetFeature(Feature.OptionPaymentMetadata, PaymentMetadata == FeatureSupport.Compulsory);
 209        }
 0210
 0211        if (ZeroConf != FeatureSupport.No)
 212        {
 0213            features.SetFeature(Feature.OptionZeroconf, ZeroConf == FeatureSupport.Compulsory);
 214        }
 0215
 0216        if (OptionSimpleClose != FeatureSupport.No)
 217        {
 0218            features.SetFeature(Feature.OptionSimpleClose, OptionSimpleClose == FeatureSupport.Compulsory);
 219        }
 0220
 0221        return features;
 222    }
 0223
 224    /// <summary>
 0225    /// Get the Init extension for the node.
 226    /// </summary>
 227    /// <returns>The Init extension for the node.</returns>
 0228    /// <remarks>
 229    /// If there are no ChainHashes, Mainnet is used as default.
 0230    /// </remarks>
 231    internal NetworksTlv GetInitTlvs()
 232    {
 0233        // If there are no ChainHashes, use Mainnet as default
 0234        if (!ChainHashes.Any())
 235        {
 0236            ChainHashes = [ChainConstants.Main];
 237        }
 238
 0239        return new NetworksTlv(ChainHashes);
 240
 241        // TODO: Review this when implementing BOLT7
 242        // // If RemoteAddress is set, add it to the extension
 243        // if (RemoteAddress != null)
 244        // {
 245        //     extension.Add(new(new BigSize(3), RemoteAddress.GetAddressBytes()));
 0246        // }
 247    }
 0248
 249    /// <summary>
 250    /// Get the node options from the features and extension.
 0251    /// </summary>
 252    /// <param name="featureSet">The features of the node.</param>
 253    /// <param name="extension">The extension of the node.</param>
 254    /// <returns>The node options.</returns>
 255    public static FeatureOptions GetNodeOptions(FeatureSet featureSet, TlvStream? extension)
 256    {
 0257        var options = new FeatureOptions
 0258        {
 0259            OptionDataLossProtect = featureSet.IsFeatureSet(Feature.OptionDataLossProtect, true)
 0260                                        ? FeatureSupport.Compulsory
 0261                                        : featureSet.IsFeatureSet(Feature.OptionDataLossProtect, false)
 0262                                            ? FeatureSupport.Optional
 0263                                            : FeatureSupport.No,
 0264            UpfrontShutdownScript = featureSet.IsFeatureSet(Feature.OptionUpfrontShutdownScript, true)
 0265                                        ? FeatureSupport.Compulsory
 0266                                        : featureSet.IsFeatureSet(Feature.OptionUpfrontShutdownScript, false)
 0267                                            ? FeatureSupport.Optional
 0268                                            : FeatureSupport.No,
 0269            GossipQueries = featureSet.IsFeatureSet(Feature.GossipQueries, true)
 0270                                ? FeatureSupport.Compulsory
 0271                                : featureSet.IsFeatureSet(Feature.GossipQueries, false)
 0272                                    ? FeatureSupport.Optional
 0273                                    : FeatureSupport.No,
 0274            VarOnionOptIn = featureSet.IsFeatureSet(Feature.VarOnionOptin, true)
 0275                                ? FeatureSupport.Compulsory
 0276                                : featureSet.IsFeatureSet(Feature.VarOnionOptin, false)
 0277                                    ? FeatureSupport.Optional
 0278                                    : FeatureSupport.No,
 0279            ExpandedGossipQueries = featureSet.IsFeatureSet(Feature.GossipQueriesEx, true)
 0280                                        ? FeatureSupport.Compulsory
 0281                                        : featureSet.IsFeatureSet(Feature.GossipQueriesEx, false)
 0282                                            ? FeatureSupport.Optional
 0283                                            : FeatureSupport.No,
 0284            OptionStaticRemoteKey = featureSet.IsFeatureSet(Feature.OptionStaticRemoteKey, true)
 0285                                        ? FeatureSupport.Compulsory
 0286                                        : featureSet.IsFeatureSet(Feature.OptionStaticRemoteKey, false)
 0287                                            ? FeatureSupport.Optional
 0288                                            : FeatureSupport.No,
 0289            PaymentSecret = featureSet.IsFeatureSet(Feature.PaymentSecret, true)
 0290                                ? FeatureSupport.Compulsory
 0291                                : featureSet.IsFeatureSet(Feature.PaymentSecret, false)
 0292                                    ? FeatureSupport.Optional
 0293                                    : FeatureSupport.No,
 0294            BasicMpp = featureSet.IsFeatureSet(Feature.BasicMpp, true)
 0295                           ? FeatureSupport.Compulsory
 0296                           : featureSet.IsFeatureSet(Feature.BasicMpp, false)
 0297                               ? FeatureSupport.Optional
 0298                               : FeatureSupport.No,
 0299            LargeChannels = featureSet.IsFeatureSet(Feature.OptionSupportLargeChannel, true)
 0300                                ? FeatureSupport.Compulsory
 0301                                : featureSet.IsFeatureSet(Feature.OptionSupportLargeChannel, false)
 0302                                    ? FeatureSupport.Optional
 0303                                    : FeatureSupport.No,
 0304            OptionAnchors = featureSet.IsFeatureSet(Feature.OptionAnchors, true)
 0305                                ? FeatureSupport.Compulsory
 0306                                : featureSet.IsFeatureSet(Feature.OptionAnchors, false)
 0307                                    ? FeatureSupport.Optional
 0308                                    : FeatureSupport.No,
 0309            OptionRouteBlinding = featureSet.IsFeatureSet(Feature.OptionRouteBlinding, true)
 0310                                      ? FeatureSupport.Compulsory
 0311                                      : featureSet.IsFeatureSet(Feature.OptionRouteBlinding, false)
 0312                                          ? FeatureSupport.Optional
 0313                                          : FeatureSupport.No,
 0314            BeyondSegwitShutdown = featureSet.IsFeatureSet(Feature.OptionShutdownAnySegwit, true)
 0315                                       ? FeatureSupport.Compulsory
 0316                                       : featureSet.IsFeatureSet(Feature.OptionShutdownAnySegwit, false)
 0317                                           ? FeatureSupport.Optional
 0318                                           : FeatureSupport.No,
 0319            DualFund = featureSet.IsFeatureSet(Feature.OptionDualFund, true)
 0320                           ? FeatureSupport.Compulsory
 0321                           : featureSet.IsFeatureSet(Feature.OptionDualFund, false)
 0322                               ? FeatureSupport.Optional
 0323                               : FeatureSupport.No,
 0324            OptionQuiesce = featureSet.IsFeatureSet(Feature.OptionQuiesce, true)
 0325                                ? FeatureSupport.Compulsory
 0326                                : featureSet.IsFeatureSet(Feature.OptionQuiesce, false)
 0327                                    ? FeatureSupport.Optional
 0328                                    : FeatureSupport.No,
 0329            OptionAttributionData = featureSet.IsFeatureSet(Feature.OptionAttributionData, true)
 0330                                        ? FeatureSupport.Compulsory
 0331                                        : featureSet.IsFeatureSet(Feature.OptionAttributionData, false)
 0332                                            ? FeatureSupport.Optional
 0333                                            : FeatureSupport.No,
 0334            OptionOnionMessages = featureSet.IsFeatureSet(Feature.OptionOnionMessages, true)
 0335                                      ? FeatureSupport.Compulsory
 0336                                      : featureSet.IsFeatureSet(Feature.OptionOnionMessages, false)
 0337                                          ? FeatureSupport.Optional
 0338                                          : FeatureSupport.No,
 0339            OptionProvideStorage = featureSet.IsFeatureSet(Feature.OptionProvideStorage, true)
 0340                                       ? FeatureSupport.Compulsory
 0341                                       : featureSet.IsFeatureSet(Feature.OptionProvideStorage, false)
 0342                                           ? FeatureSupport.Optional
 0343                                           : FeatureSupport.No,
 0344            OptionChannelType = featureSet.IsFeatureSet(Feature.OptionChannelType, true)
 0345                                    ? FeatureSupport.Compulsory
 0346                                    : featureSet.IsFeatureSet(Feature.OptionChannelType, false)
 0347                                        ? FeatureSupport.Optional
 0348                                        : FeatureSupport.No,
 0349            ScidAlias = featureSet.IsFeatureSet(Feature.OptionScidAlias, true)
 0350                            ? FeatureSupport.Compulsory
 0351                            : featureSet.IsFeatureSet(Feature.OptionScidAlias, false)
 0352                                ? FeatureSupport.Optional
 0353                                : FeatureSupport.No,
 0354            PaymentMetadata = featureSet.IsFeatureSet(Feature.OptionPaymentMetadata, true)
 0355                                  ? FeatureSupport.Compulsory
 0356                                  : featureSet.IsFeatureSet(Feature.OptionPaymentMetadata, false)
 0357                                      ? FeatureSupport.Optional
 0358                                      : FeatureSupport.No,
 0359            ZeroConf = featureSet.IsFeatureSet(Feature.OptionZeroconf, true)
 0360                           ? FeatureSupport.Compulsory
 0361                           : featureSet.IsFeatureSet(Feature.OptionZeroconf, false)
 0362                               ? FeatureSupport.Optional
 0363                               : FeatureSupport.No,
 0364            OptionSimpleClose = featureSet.IsFeatureSet(Feature.OptionSimpleClose, true)
 0365                                    ? FeatureSupport.Compulsory
 0366                                    : featureSet.IsFeatureSet(Feature.OptionSimpleClose, false)
 0367                                        ? FeatureSupport.Optional
 0368                                        : FeatureSupport.No,
 0369        };
 0370
 0371        if (extension?.TryGetTlv(new BigSize(1), out var chainHashes) ?? false)
 0372        {
 0373            options.ChainHashes = Enumerable.Range(0, chainHashes!.Value.Length / CryptoConstants.Sha256HashLen)
 0374                                            .Select(i => new ChainHash(
 0375                                                        chainHashes.Value.Skip(i * 32).Take(32).ToArray()));
 376        }
 0377
 378        // TODO: Add network when implementing BOLT7
 379
 0380        return options;
 381    }
 382}