< Summary - Combined Code Coverage

Information
Class: NLightning.Infrastructure.Bitcoin.Builders.CommitmentTransactionBuilder
Assembly: NLightning.Infrastructure.Bitcoin
File(s): /home/runner/work/nlightning/nlightning/src/NLightning.Infrastructure.Bitcoin/Builders/CommitmentTransactionBuilder.cs
Tag: 36_15743069263
Line coverage
86%
Covered lines: 44
Uncovered lines: 7
Coverable lines: 51
Total lines: 123
Line coverage: 86.2%
Branch coverage
67%
Covered branches: 19
Total branches: 28
Branch coverage: 67.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)50%22100%
Build(...)69.23%28.232685.11%

File(s)

/home/runner/work/nlightning/nlightning/src/NLightning.Infrastructure.Bitcoin/Builders/CommitmentTransactionBuilder.cs

#LineLine coverage
 1using Microsoft.Extensions.Options;
 2using NBitcoin;
 3
 4namespace NLightning.Infrastructure.Bitcoin.Builders;
 5
 6using Comparers;
 7using Domain.Bitcoin.Transactions.Constants;
 8using Domain.Bitcoin.Transactions.Models;
 9using Domain.Bitcoin.ValueObjects;
 10using Domain.Node.Options;
 11using Interfaces;
 12using Outputs;
 13
 14public class CommitmentTransactionBuilder : ICommitmentTransactionBuilder
 15{
 16    private readonly Network _network;
 17
 6818    public CommitmentTransactionBuilder(IOptions<NodeOptions> nodeOptions)
 19    {
 6820        _network = Network.GetNetwork(nodeOptions.Value.BitcoinNetwork) ??
 6821                   throw new ArgumentException("Invalid Bitcoin network specified", nameof(nodeOptions));
 6822    }
 23
 24    public SignedTransaction Build(CommitmentTransactionModel transaction)
 25    {
 6826        if (transaction.FundingOutput.TransactionId is null || transaction.FundingOutput.Index is null)
 027            throw new ArgumentException("Funding output must have a valid transaction Id and index.");
 28
 29        // Create a new Bitcoin transaction
 6830        var tx = Transaction.Create(_network);
 31
 32        // Set the transaction version as per BOLT spec
 6833        tx.Version = TransactionConstants.CommitmentTransactionVersion;
 34
 35        // Set lock time derived from the commitment number
 6836        tx.LockTime = new LockTime(transaction.GetLockTime());
 37
 38        // Create an out-point for the funding transaction
 6839        var outpoint = new OutPoint(new uint256(transaction.FundingOutput.TransactionId),
 6840                                    transaction.FundingOutput.Index.Value);
 41        // Set the sequence number derived from the commitment number
 6842        tx.Inputs.Add(outpoint, null, null, new Sequence(transaction.GetSequence()));
 43
 44        // Create a list to collect all outputs
 6845        var outputs = new List<BaseOutput>();
 46
 47        // Convert and add to_local output if present
 6848        if (transaction.ToLocalOutput != null)
 49        {
 6050            var toLocalOutput = new ToLocalOutput(transaction.ToLocalOutput.Amount,
 6051                                                  new PubKey(transaction.ToLocalOutput.LocalDelayedPaymentPubKey),
 6052                                                  new PubKey(transaction.ToLocalOutput.RevocationPubKey),
 6053                                                  transaction.ToLocalOutput.ToSelfDelay);
 54
 6055            outputs.Add(toLocalOutput);
 56        }
 57
 58        // Convert and add to_remote output if present
 6859        if (transaction.ToRemoteOutput != null)
 60        {
 6861            var hasAnchors = transaction.LocalAnchorOutput != null || transaction.RemoteAnchorOutput != null;
 6862            var toRemoteOutput = new ToRemoteOutput(transaction.ToRemoteOutput.Amount, hasAnchors,
 6863                                                    new PubKey(transaction.ToRemoteOutput.RemotePaymentPubKey));
 64
 6865            outputs.Add(toRemoteOutput);
 66        }
 67
 68        // Convert and add local anchor output if present
 6869        if (transaction.LocalAnchorOutput != null)
 70        {
 071            var localAnchorOutput = new ToAnchorOutput(transaction.LocalAnchorOutput.Amount,
 072                                                       new PubKey(transaction.LocalAnchorOutput.FundingPubKey));
 73
 074            outputs.Add(localAnchorOutput);
 75        }
 76
 77        // Convert and add remote anchor output if present
 6878        if (transaction.RemoteAnchorOutput != null)
 79        {
 080            var remoteAnchorOutput = new ToAnchorOutput(transaction.RemoteAnchorOutput.Amount,
 081                                                        new PubKey(transaction.RemoteAnchorOutput.FundingPubKey));
 82
 083            outputs.Add(remoteAnchorOutput);
 84        }
 85
 86        // Convert and add offered HTLC outputs
 26487        foreach (var htlcOutput in transaction.OfferedHtlcOutputs)
 88        {
 6489            var hasAnchors = transaction.LocalAnchorOutput != null || transaction.RemoteAnchorOutput != null;
 6490            var offeredHtlc = new OfferedHtlcOutput(htlcOutput.Amount, htlcOutput.CltvExpiry, hasAnchors,
 6491                                                    new PubKey(htlcOutput.LocalHtlcPubKey),
 6492                                                    htlcOutput.PaymentHash,
 6493                                                    new PubKey(htlcOutput.RemoteHtlcPubKey),
 6494                                                    new PubKey(htlcOutput.RevocationPubKey));
 95
 6496            outputs.Add(offeredHtlc);
 97        }
 98
 99        // Convert and add received HTLC outputs
 272100        foreach (var htlcOutput in transaction.ReceivedHtlcOutputs)
 101        {
 68102            var hasAnchors = transaction.LocalAnchorOutput != null || transaction.RemoteAnchorOutput != null;
 68103            var receivedHtlc = new ReceivedHtlcOutput(htlcOutput.Amount, htlcOutput.CltvExpiry, hasAnchors,
 68104                                                      new PubKey(htlcOutput.LocalHtlcPubKey), htlcOutput.PaymentHash,
 68105                                                      new PubKey(htlcOutput.RemoteHtlcPubKey),
 68106                                                      new PubKey(htlcOutput.RevocationPubKey));
 107
 68108            outputs.Add(receivedHtlc);
 109        }
 110
 111        // Sort outputs using TransactionOutputComparer
 68112        outputs.Sort(TransactionOutputComparer.Instance);
 113
 114        // Add sorted outputs to the transaction
 656115        foreach (var output in outputs)
 116        {
 260117            tx.Outputs.Add(output.ToTxOut());
 118        }
 119
 120        // Return as SignedTransaction
 68121        return new SignedTransaction(tx.GetHash().ToBytes(), tx.ToBytes());
 122    }
 123}