< Summary - Combined Code Coverage

Information
Class: NLightning.Infrastructure.Bitcoin.Services.DustService
Assembly: NLightning.Infrastructure.Bitcoin
File(s): /home/runner/work/nlightning/nlightning/src/NLightning.Infrastructure.Bitcoin/Services/DustService.cs
Tag: 36_15743069263
Line coverage
0%
Covered lines: 0
Uncovered lines: 21
Coverable lines: 21
Total lines: 87
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 10
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(...)100%210%
CalculateP2PkhDustLimit()100%210%
CalculateP2ShDustLimit()100%210%
CalculateP2WpkhDustLimit()100%210%
CalculateP2WshDustLimit()100%210%
CalculateUnknownSegwitVersionDustLimit()100%210%
CalculateDustLimit(...)100%210%
IsDust(...)0%110100%

File(s)

/home/runner/work/nlightning/nlightning/src/NLightning.Infrastructure.Bitcoin/Services/DustService.cs

#LineLine coverage
 1using NBitcoin;
 2
 3namespace NLightning.Infrastructure.Bitcoin.Services;
 4
 5using Domain.Bitcoin.Interfaces;
 6using Domain.Protocol.Services;
 7
 8public class DustService : IDustService
 9{
 10    private readonly IFeeService _feeService;
 11
 012    public DustService(IFeeService feeService)
 13    {
 014        _feeService = feeService;
 015    }
 16
 17    public ulong CalculateP2PkhDustLimit()
 18    {
 19        const uint outputSize = 34;
 20        const uint inputSize = 148;
 021        return CalculateDustLimit(outputSize, inputSize);
 22    }
 23
 24    public ulong CalculateP2ShDustLimit()
 25    {
 26        const uint outputSize = 32;
 27        const uint inputSize = 148; // Lower bound
 028        return CalculateDustLimit(outputSize, inputSize);
 29    }
 30
 31    public ulong CalculateP2WpkhDustLimit()
 32    {
 33        const uint outputSize = 31;
 34        const uint inputSize = 67; // Lower bound
 035        return CalculateDustLimit(outputSize, inputSize);
 36    }
 37
 38    public ulong CalculateP2WshDustLimit()
 39    {
 40        const uint outputSize = 43;
 41        const uint inputSize = 67; // Lower bound
 042        return CalculateDustLimit(outputSize, inputSize);
 43    }
 44
 45    public ulong CalculateUnknownSegwitVersionDustLimit()
 46    {
 47        const uint outputSize = 51;
 48        const uint inputSize = 67; // Lower bound
 049        return CalculateDustLimit(outputSize, inputSize);
 50    }
 51
 52    private ulong CalculateDustLimit(uint outputSize, uint inputSize)
 53    {
 054        var totalSize = outputSize + inputSize;
 055        return (totalSize * _feeService.GetCachedFeeRatePerKw() / 1000);
 56    }
 57
 58    public bool IsDust(ulong amount, Script scriptPubKey)
 59    {
 060        if (scriptPubKey.IsScriptType(ScriptType.P2PKH))
 61        {
 062            return amount < CalculateP2PkhDustLimit();
 63        }
 64
 065        if (scriptPubKey.IsScriptType(ScriptType.P2SH))
 66        {
 067            return amount < CalculateP2ShDustLimit();
 68        }
 69
 070        if (scriptPubKey.IsScriptType(ScriptType.P2WPKH))
 71        {
 072            return amount < CalculateP2WpkhDustLimit();
 73        }
 74
 075        if (scriptPubKey.IsScriptType(ScriptType.P2WSH))
 76        {
 077            return amount < CalculateP2WshDustLimit();
 78        }
 79
 080        if (scriptPubKey.ToBytes()[0] == (byte)OpcodeType.OP_RETURN)
 81        {
 082            return false; // OP_RETURN outputs are never dust
 83        }
 84
 085        return amount < CalculateUnknownSegwitVersionDustLimit();
 86    }
 87}