< Summary - Combined Code Coverage

Information
Class: NLightning.Infrastructure.Bitcoin.Outputs.BaseOutput
Assembly: NLightning.Infrastructure.Bitcoin
File(s): /home/runner/work/nlightning/nlightning/src/NLightning.Infrastructure.Bitcoin/Outputs/BaseOutput.cs
Tag: 36_15743069263
Line coverage
61%
Covered lines: 27
Uncovered lines: 17
Coverable lines: 44
Total lines: 111
Line coverage: 61.3%
Branch coverage
56%
Covered branches: 9
Total branches: 16
Branch coverage: 56.2%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Amount()100%11100%
set_Amount(...)100%210%
get_BitcoinScriptPubKey()100%210%
set_BitcoinScriptPubKey(...)100%210%
get_RedeemBitcoinScript()100%11100%
set_RedeemBitcoinScript(...)100%210%
get_TransactionId()100%11100%
set_TransactionId(...)100%11100%
get_Index()100%11100%
.ctor(...)100%210%
.ctor(...)66.67%6.06688.24%
ToTxOut()100%11100%
ToCoin()50%12.1860%
CompareTo(...)50%22100%

File(s)

/home/runner/work/nlightning/nlightning/src/NLightning.Infrastructure.Bitcoin/Outputs/BaseOutput.cs

#LineLine coverage
 1using NBitcoin;
 2
 3namespace NLightning.Infrastructure.Bitcoin.Outputs;
 4
 5using Comparers;
 6using Domain.Bitcoin.Outputs;
 7using Domain.Bitcoin.ValueObjects;
 8using Domain.Money;
 9
 10/// <summary>
 11/// Represents a transaction output.
 12/// </summary>
 13public abstract class BaseOutput : IOutput
 14{
 15    internal Script ScriptPubKey;
 16    internal uint256 TxIdHash;
 17    internal Script RedeemScript;
 18    internal Money NBitcoinAmount;
 19
 20    /// <inheritdoc />
 21    public LightningMoney Amount
 22    {
 145623        get => LightningMoney.Satoshis(NBitcoinAmount.Satoshi);
 024        set => Money.Satoshis(value.Satoshi);
 25    }
 26
 27    /// <inheritdoc />
 28    public BitcoinScript BitcoinScriptPubKey
 29    {
 030        get => ScriptPubKey.ToBytes();
 031        set => ScriptPubKey = new Script(value);
 32    }
 33
 34    /// <inheritdoc />
 35    public BitcoinScript RedeemBitcoinScript
 36    {
 2837        get => RedeemScript.ToBytes();
 038        set => RedeemScript = new Script(value);
 39    }
 40
 41    /// <summary>
 42    /// Gets or sets the transaction ID of the output.
 43    /// </summary>
 44    public TxId TransactionId
 45    {
 446        get => TxIdHash.ToBytes();
 13647        set => TxIdHash = new uint256(value);
 48    }
 49
 50    /// <inheritdoc />
 14451    public uint Index { get; set; }
 52
 53    public abstract ScriptType ScriptType { get; }
 54
 055    protected BaseOutput(LightningMoney amount, Script redeemScript, Script scriptPubKey)
 56    {
 057        ArgumentNullException.ThrowIfNull(redeemScript);
 058        ArgumentNullException.ThrowIfNull(scriptPubKey);
 059        ArgumentNullException.ThrowIfNull(amount);
 60
 061        NBitcoinAmount = Money.Satoshis(amount.Satoshi);
 062        RedeemScript = redeemScript;
 063        ScriptPubKey = scriptPubKey;
 064        TxIdHash = uint256.Zero;
 065    }
 66
 50067    protected BaseOutput(LightningMoney amount, Script redeemScript)
 68    {
 50069        ArgumentNullException.ThrowIfNull(redeemScript);
 50070        ArgumentNullException.ThrowIfNull(amount);
 71
 50072        NBitcoinAmount = Money.Satoshis(amount.Satoshi);
 50073        RedeemScript = redeemScript;
 50074        ScriptPubKey = ScriptType switch
 50075        {
 50076            ScriptType.P2WPKH
 50077             or ScriptType.P2WSH
 61278                when redeemScript.ToString().StartsWith("0 ") => redeemScript,
 50079            ScriptType.P2WPKH
 38880             or ScriptType.P2WSH => redeemScript.WitHash.ScriptPubKey,
 081            ScriptType.P2SH => redeemScript.Hash.ScriptPubKey,
 082            _ => redeemScript.PaymentScript
 50083        };
 50084        TxIdHash = uint256.Zero;
 50085    }
 86
 87    /// <summary>
 88    /// Converts the output to a NBitcoin.TxOut.
 89    /// </summary>
 90    /// <returns>TxOut object.</returns>
 91    public TxOut ToTxOut()
 92    {
 39293        return new TxOut(Money.Satoshis(Amount.Satoshi), ScriptPubKey);
 94    }
 95
 96    public ScriptCoin ToCoin()
 97    {
 498        if (TxIdHash is null || TxIdHash == uint256.Zero || TxIdHash == uint256.One)
 099            throw new InvalidOperationException("Transaction ID is not set. Sign the transaction first.");
 100
 4101        if (Amount.IsZero)
 0102            throw new InvalidOperationException("You can't spend a zero amount output.");
 103
 4104        return new ScriptCoin(TxIdHash, Index, Money.Satoshis(Amount.Satoshi), ScriptPubKey, RedeemScript);
 105    }
 106
 107    public int CompareTo(IOutput? other) =>
 4108        other is BaseOutput baseOutput
 4109            ? TransactionOutputComparer.Instance.Compare(this, baseOutput)
 4110            : 1;
 111}