< Summary - Combined Code Coverage

Information
Class: NLightning.Infrastructure.Bitcoin.Builders.FundingTransactionBuilder
Assembly: NLightning.Infrastructure.Bitcoin
File(s): /home/runner/work/NLightning/NLightning/src/NLightning.Infrastructure.Bitcoin/Builders/FundingTransactionBuilder.cs
Tag: 57_24045730253
Line coverage
0%
Covered lines: 0
Uncovered lines: 31
Coverable lines: 31
Total lines: 75
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 12
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)0%620%
Build(...)0%110100%

File(s)

/home/runner/work/NLightning/NLightning/src/NLightning.Infrastructure.Bitcoin/Builders/FundingTransactionBuilder.cs

#LineLine coverage
 1using Microsoft.Extensions.Logging;
 2using Microsoft.Extensions.Options;
 3using NBitcoin;
 4
 5namespace NLightning.Infrastructure.Bitcoin.Builders;
 6
 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 FundingTransactionBuilder : IFundingTransactionBuilder
 15{
 16    private readonly Network _network;
 17    private readonly IServiceProvider _serviceProvider;
 18    private readonly ILogger<FundingTransactionBuilder> _logger;
 19
 020    public FundingTransactionBuilder(IOptions<NodeOptions> nodeOptions, IServiceProvider serviceProvider,
 021                                     ILogger<FundingTransactionBuilder> logger)
 22    {
 023        _serviceProvider = serviceProvider;
 024        _logger = logger;
 025        _network = Network.GetNetwork(nodeOptions.Value.BitcoinNetwork) ??
 026                   throw new ArgumentException("Invalid Bitcoin network specified", nameof(nodeOptions));
 027    }
 28
 29    public SignedTransaction Build(FundingTransactionModel transaction)
 30    {
 031        var coins = transaction.Utxos.ToArray();
 032        if (coins.Length == 0)
 033            throw new ArgumentException("UTXO set cannot be empty");
 34
 035        var totalInputAmount = coins.Sum(x => x.Amount);
 36
 037        if (_logger.IsEnabled(LogLevel.Trace))
 038            _logger.LogTrace("Building funding transaction with {UtxoCount} UTXOs for amount {FundingAmount}",
 039                             coins.Length, transaction.FundingOutput.Amount);
 40
 41        // Create a new Bitcoin transaction
 042        var tx = Transaction.Create(_network);
 43
 44        // Set the transaction version as per BOLT spec
 045        tx.Version = TransactionConstants.FundingTransactionVersion;
 46
 47        // Add all inputs from the UTXO set
 048        foreach (var coin in coins)
 049            tx.Inputs.Add(new OutPoint(new uint256(coin.TxId), coin.Index));
 50
 51        // Convert and add the funding output
 052        var fundingOutput = new FundingOutput(transaction.FundingOutput.Amount,
 053                                              new PubKey(transaction.FundingOutput.LocalFundingPubKey),
 054                                              new PubKey(transaction.FundingOutput.RemoteFundingPubKey));
 055        tx.Outputs.Add(fundingOutput.ToTxOut());
 56
 57        // Check if we are paying a change address
 058        if (transaction.ChangeAddress is not null)
 59        {
 060            var changeAmount = totalInputAmount - transaction.Fee - fundingOutput.Amount;
 061            var bitcoinAddress = BitcoinAddress.Create(transaction.ChangeAddress.Address, _network);
 062            tx.Outputs.Add(new TxOut(new Money(changeAmount.Satoshi), bitcoinAddress));
 63        }
 64
 65        // Update the funding output info with transaction details
 066        transaction.FundingOutput.TransactionId = tx.GetHash().ToBytes();
 067        transaction.FundingOutput.Index = 0;
 68
 069        if (_logger.IsEnabled(LogLevel.Information))
 070            _logger.LogInformation("Built funding transaction {TxId} with funding output at index 0", tx.GetHash());
 71
 72        // Return as SignedTransaction (note: needs to be signed by the signer afterwards)
 073        return new SignedTransaction(tx.GetHash().ToBytes(), tx.ToBytes());
 74    }
 75}