< Summary - Combined Code Coverage

Information
Class: NLightning.Bolt11.Models.TaggedFields.FallbackAddressTaggedField
Assembly: NLightning.Bolt11
File(s): /home/runner/work/nlightning/nlightning/src/NLightning.Bolt11/Models/TaggedFields/FallbackAddressTaggedField.cs
Tag: 36_15743069263
Line coverage
100%
Covered lines: 48
Uncovered lines: 0
Coverable lines: 48
Total lines: 120
Line coverage: 100%
Branch coverage
95%
Covered branches: 23
Total branches: 24
Branch coverage: 95.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Type()100%11100%
get_Value()100%11100%
get_Length()100%11100%
.ctor(...)100%88100%
WriteToBitWriter(...)100%11100%
IsValid()100%11100%
FromBitReader(...)93.75%1616100%

File(s)

/home/runner/work/nlightning/nlightning/src/NLightning.Bolt11/Models/TaggedFields/FallbackAddressTaggedField.cs

#LineLine coverage
 1using NBitcoin;
 2
 3namespace NLightning.Bolt11.Models.TaggedFields;
 4
 5using Domain.Protocol.ValueObjects;
 6using Domain.Utils;
 7using Enums;
 8using Interfaces;
 9
 10/// <summary>
 11/// Tagged field for the fallback address
 12/// </summary>
 13/// <remarks>
 14/// The fallback address is a Bitcoin address that can be used to pay the invoice on-chain if the payment fails.
 15/// </remarks>
 16/// <seealso cref="ITaggedField"/>
 17internal sealed class FallbackAddressTaggedField : ITaggedField
 18{
 19    private readonly byte[] _data;
 20
 59221    public TaggedFieldTypes Type => TaggedFieldTypes.FallbackAddress;
 8422    internal BitcoinAddress Value { get; }
 10823    public short Length { get; }
 24
 25    /// <summary>
 26    /// Initializes a new instance of the <see cref="DescriptionTaggedField"/> class.
 27    /// </summary>
 28    /// <param name="value">The Description</param>
 10429    internal FallbackAddressTaggedField(BitcoinAddress value)
 30    {
 10431        Value = value;
 10432        var data = new List<byte>();
 33
 34        switch (value)
 35        {
 36            case BitcoinPubKeyAddress pubKeyAddress:
 37                // P2PKH
 3638                data.Add(17);
 3639                data.AddRange(pubKeyAddress.Hash.ToBytes());
 3640                Length = 33;
 3641                break;
 42            case BitcoinScriptAddress scriptAddress:
 43                // P2SH
 2844                data.Add(18);
 2845                data.AddRange(scriptAddress.Hash.ToBytes());
 2846                Length = 33;
 2847                break;
 48            case BitcoinWitScriptAddress witScriptAddress:
 49                // P2WSH
 2050                data.Add(0);
 2051                data.AddRange(witScriptAddress.Hash.ToBytes());
 2052                Length = 53;
 2053                break;
 54            case BitcoinWitPubKeyAddress witPubKeyAddress:
 55                // P2WPKH
 2056                data.Add(0);
 2057                data.AddRange(witPubKeyAddress.Hash.ToBytes());
 2058                Length = 33;
 59                break;
 60        }
 61
 10462        _data = [.. data];
 10463    }
 64
 65    /// <inheritdoc/>
 66    public void WriteToBitWriter(BitWriter bitWriter)
 67    {
 68        // Write Address Type
 3669        bitWriter.WriteByteAsBits(_data[0], 5);
 70
 71        // Write data
 3672        bitWriter.WriteBits(_data.AsSpan()[1..], (Length - 1) * 5);
 3673    }
 74
 75    /// <inheritdoc/>
 76    public bool IsValid()
 77    {
 5678        return true;
 79    }
 80
 81    /// <summary>
 82    /// Reads a FallbackAddressTaggedField from a BitReader
 83    /// </summary>
 84    /// <param name="bitReader">The BitReader to read from</param>
 85    /// <param name="length">The length of the field</param>
 86    /// <param name="bitcoinNetwork">The network type</param>
 87    /// <returns>The FallbackAddressTaggedField</returns>
 88    /// <exception cref="ArgumentException">Thrown when the address is unknown or invalid</exception>
 89    internal static FallbackAddressTaggedField FromBitReader(BitReader bitReader, short length,
 90                                                             BitcoinNetwork bitcoinNetwork)
 91    {
 92        // Get Address Type
 4893        var addressType = bitReader.ReadByteFromBits(5);
 4894        var newLength = length - 1;
 95
 96        // Read address bytes
 4897        var data = new byte[(newLength * 5 + 7) / 8];
 4898        bitReader.ReadBits(data.AsSpan(), newLength * 5);
 99
 48100        if (newLength * 5 % 8 != 0 && data[^1] == 0)
 12101            data = data[..^1];
 102
 48103        var network = Network.GetNetwork(bitcoinNetwork) ??
 48104                      throw new ArgumentException("Network is unknown or invalid.", nameof(bitcoinNetwork));
 48105        BitcoinAddress address = addressType switch
 48106        {
 48107            // Witness P2WPKH
 24108            0 when data.Length == 20 => new WitKeyId(data).GetAddress(network),
 48109            // Witness P2WSH
 16110            0 when data.Length == 32 => new WitScriptId(data).GetAddress(network),
 48111            // P2PKH
 12112            17 => new KeyId(data).GetAddress(network),
 48113            // P2SH
 12114            18 => new ScriptId(data).GetAddress(network),
 8115            _ => throw new ArgumentException("Address is unknown or invalid.", nameof(bitReader))
 48116        };
 117
 40118        return new FallbackAddressTaggedField(address);
 119    }
 120}