< Summary - Combined Code Coverage

Information
Class: NLightning.Infrastructure.Protocol.Services.DustService
Assembly: NLightning.Infrastructure
File(s): /home/runner/work/nlightning/nlightning/src/NLightning.Infrastructure/Protocol/Services/DustService.cs
Tag: 30_15166811759
Line coverage
0%
Covered lines: 0
Uncovered lines: 21
Coverable lines: 21
Total lines: 82
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/Protocol/Services/DustService.cs

#LineLine coverage
 1using NBitcoin;
 2
 3namespace NLightning.Infrastructure.Protocol.Services;
 4
 5using Domain.Bitcoin.Services;
 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 OUTPUT_SIZE = 34;
 20        const uint INPUT_SIZE = 148;
 021        return CalculateDustLimit(OUTPUT_SIZE, INPUT_SIZE);
 22    }
 23
 24    public ulong CalculateP2ShDustLimit()
 25    {
 26        const uint OUTPUT_SIZE = 32;
 27        const uint INPUT_SIZE = 148; // Lower bound
 028        return CalculateDustLimit(OUTPUT_SIZE, INPUT_SIZE);
 29    }
 30
 31    public ulong CalculateP2WpkhDustLimit()
 32    {
 33        const uint OUTPUT_SIZE = 31;
 34        const uint INPUT_SIZE = 67; // Lower bound
 035        return CalculateDustLimit(OUTPUT_SIZE, INPUT_SIZE);
 36    }
 37
 38    public ulong CalculateP2WshDustLimit()
 39    {
 40        const uint OUTPUT_SIZE = 43;
 41        const uint INPUT_SIZE = 67; // Lower bound
 042        return CalculateDustLimit(OUTPUT_SIZE, INPUT_SIZE);
 43    }
 44
 45    public ulong CalculateUnknownSegwitVersionDustLimit()
 46    {
 47        const uint OUTPUT_SIZE = 51;
 48        const uint INPUT_SIZE = 67; // Lower bound
 049        return CalculateDustLimit(OUTPUT_SIZE, INPUT_SIZE);
 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        }
 064        if (scriptPubKey.IsScriptType(ScriptType.P2SH))
 65        {
 066            return amount < CalculateP2ShDustLimit();
 67        }
 068        if (scriptPubKey.IsScriptType(ScriptType.P2WPKH))
 69        {
 070            return amount < CalculateP2WpkhDustLimit();
 71        }
 072        if (scriptPubKey.IsScriptType(ScriptType.P2WSH))
 73        {
 074            return amount < CalculateP2WshDustLimit();
 75        }
 076        if (scriptPubKey.ToBytes()[0] == (byte)OpcodeType.OP_RETURN)
 77        {
 078            return false; // OP_RETURN outputs are never dust
 79        }
 080        return amount < CalculateUnknownSegwitVersionDustLimit();
 81    }
 82}