< Summary - Combined Code Coverage

Information
Class: NLightning.Domain.Money.LightningMoney
Assembly: NLightning.Domain
File(s): /home/runner/work/nlightning/nlightning/src/NLightning.Domain/Money/LightningMoney.cs
Tag: 30_15166811759
Line coverage
80%
Covered lines: 120
Uncovered lines: 29
Coverable lines: 149
Total lines: 523
Line coverage: 80.5%
Branch coverage
63%
Covered branches: 29
Total branches: 46
Branch coverage: 63%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_MilliSatoshi()100%11100%
set_MilliSatoshi(...)100%11100%
get_Satoshi()100%11100%
set_Satoshi(...)100%22100%
get_Zero()100%11100%
get_IsZero()100%11100%
.ctor(...)100%11100%
.ctor(...)100%11100%
.ctor(...)100%11100%
.ctor(...)100%11100%
TryParse(...)100%2.06275%
Parse(...)100%22100%
ToUnit(...)100%11100%
ToDecimal(...)100%11100%
Split()83.33%6.07687.5%
NBitcoin.IMoney.Split(...)100%210%
FromUnit(...)100%11100%
Coins(...)100%11100%
Bits(...)100%11100%
Cents(...)100%11100%
Satoshis(...)100%11100%
Satoshis(...)100%11100%
Satoshis(...)100%11100%
MilliSatoshis(...)100%11100%
MilliSatoshis(...)100%11100%
Equals(...)100%22100%
System.IEquatable<NBitcoin.IMoney>.Equals(...)100%210%
CompareTo(...)50%22100%
NBitcoin.IMoney.IsCompatible(...)100%11100%
CompareTo(...)50%4.59466.67%
System.IComparable.CompareTo(...)100%210%
System.IComparable<NBitcoin.IMoney>.CompareTo(...)100%11100%
op_Subtraction(...)50%2.03280%
op_UnaryNegation(...)100%210%
op_Addition(...)100%11100%
op_Multiply(...)100%210%
op_Multiply(...)100%210%
op_Multiply(...)100%210%
op_Multiply(...)100%210%
op_Division(...)100%210%
op_LessThan(...)100%11100%
op_GreaterThan(...)100%11100%
op_LessThanOrEqual(...)100%11100%
op_GreaterThanOrEqual(...)100%11100%
op_Implicit(...)100%11100%
op_Implicit(...)100%11100%
op_Implicit(...)100%11100%
op_Implicit(...)0%620%
op_Implicit(...)100%11100%
op_Implicit(...)100%11100%
op_Implicit(...)100%11100%
Equals(...)0%620%
GetHashCode()100%210%
op_Equality(...)50%8.3660%
op_Inequality(...)100%11100%
ToString()100%210%
ToString(...)100%22100%
Almost(...)100%11100%
Almost(...)50%6.29680%
Min(...)50%22100%
Max(...)50%22100%
Add(...)100%210%
Sub(...)100%210%
Negate()100%11100%
CheckLightningMoneyUnit(...)100%22100%
DivRem(...)100%11100%

File(s)

/home/runner/work/nlightning/nlightning/src/NLightning.Domain/Money/LightningMoney.cs

#LineLine coverage
 1using System.Globalization;
 2using NBitcoin;
 3
 4namespace NLightning.Domain.Money;
 5
 6using Enums;
 7
 8public class LightningMoney : IMoney
 9{
 10    // For decimal.TryParse. None of the NumberStyles' composed values is useful for bitcoin style
 11    private const NumberStyles BITCOIN_STYLE = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite
 12                                               | NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint;
 13
 14    private ulong _milliSatoshi;
 15
 16    public const ulong COIN = 100 * 1000 * 1000 * 1000UL;
 17    public const ulong CENT = COIN / 100;
 18    public const ulong NANO = CENT / 100;
 19
 20    public ulong MilliSatoshi
 21    {
 174022        get => _milliSatoshi;
 23        set
 24        {
 458825            _milliSatoshi = value;
 458826        }
 27    }
 28
 29    public long Satoshi
 30    {
 105631        get => checked((long)(_milliSatoshi / 1000));
 32        set
 33        {
 14434            if (value < 0)
 435                throw new ArgumentOutOfRangeException(nameof(value), "Satoshi value cannot be negative");
 36
 37            checked
 38            {
 14039                _milliSatoshi = (ulong)(value * 1000);
 40            }
 14041        }
 42    }
 43
 98844    public static LightningMoney Zero => 0UL;
 203645    public bool IsZero => _milliSatoshi == 0;
 46
 47    #region Constructors
 298848    public LightningMoney(ulong milliSatoshi)
 49    {
 298850        MilliSatoshi = milliSatoshi;
 298851    }
 52
 16053    public LightningMoney(decimal amount, LightningMoneyUnit unit)
 54    {
 55        // sanity check. Only valid units are allowed
 16056        CheckLightningMoneyUnit(unit, nameof(unit));
 57        checked
 58        {
 15659            var milliSats = amount * (long)unit;
 15660            MilliSatoshi = (ulong)milliSats;
 61        }
 15262    }
 63
 31664    public LightningMoney(long amount, LightningMoneyUnit unit)
 65    {
 66        // Sanity check. Only valid units are allowed
 31667        CheckLightningMoneyUnit(unit, nameof(unit));
 68        checked
 69        {
 31670            var milliSats = amount * (long)unit;
 31671            MilliSatoshi = (ulong)milliSats;
 72        }
 31673    }
 74
 113275    public LightningMoney(ulong amount, LightningMoneyUnit unit)
 76    {
 77        // Sanity check. Only valid units are allowed
 113278        CheckLightningMoneyUnit(unit, nameof(unit));
 79        checked
 80        {
 113281            var milliSats = amount * (ulong)unit;
 113282            MilliSatoshi = milliSats;
 83        }
 113284    }
 85    #endregion
 86
 87    #region Parsers
 88    /// <summary>
 89    /// Parse a bitcoin amount (Culture Invariant)
 90    /// </summary>
 91    /// <param name="bitcoin"></param>
 92    /// <param name="nRet"></param>
 93    /// <returns></returns>
 94    public static bool TryParse(string bitcoin, out LightningMoney? nRet)
 95    {
 1696        nRet = null;
 97
 1698        if (!decimal.TryParse(bitcoin, BITCOIN_STYLE, CultureInfo.InvariantCulture, out var value))
 99        {
 8100            return false;
 101        }
 102
 103        try
 104        {
 8105            nRet = new LightningMoney(value, LightningMoneyUnit.Btc);
 8106            return true;
 107        }
 0108        catch (OverflowException)
 109        {
 0110            return false;
 111        }
 8112    }
 113
 114    /// <summary>
 115    /// Parse a bitcoin amount (Culture Invariant)
 116    /// </summary>
 117    /// <param name="bitcoin"></param>
 118    /// <returns></returns>
 119    public static LightningMoney? Parse(string bitcoin)
 120    {
 8121        if (TryParse(bitcoin, out var result))
 122        {
 4123            return result;
 124        }
 4125        throw new FormatException("Impossible to parse the string in a bitcoin amount");
 126    }
 127    #endregion
 128
 129    #region Conversions
 130    /// <summary>
 131    /// Convert Money to decimal (same as ToDecimal)
 132    /// </summary>
 133    /// <param name="unit"></param>
 134    /// <returns></returns>
 135    public decimal ToUnit(LightningMoneyUnit unit)
 136    {
 184137        CheckLightningMoneyUnit(unit, nameof(unit));
 138        // overflow safe because (long / int) always fit in decimal
 139        // decimal operations are checked by default
 184140        return (decimal)MilliSatoshi / (ulong)unit;
 141    }
 142    /// <summary>
 143    /// Convert Money to decimal (same as ToUnit)
 144    /// </summary>
 145    /// <param name="unit"></param>
 146    /// <returns></returns>
 147    public decimal ToDecimal(LightningMoneyUnit unit)
 148    {
 8149        return ToUnit(unit);
 150    }
 151    #endregion
 152
 153    /// <summary>
 154    /// Split the Money in parts without loss
 155    /// </summary>
 156    /// <param name="parts">The number of parts (must be more than 0)</param>
 157    /// <returns>The split money</returns>
 158    public IEnumerable<LightningMoney> Split(int parts)
 159    {
 4160        if (parts <= 0)
 0161            throw new ArgumentOutOfRangeException(nameof(parts), "Parts should be more than 0");
 162
 4163        var result = DivRem(_milliSatoshi, (ulong)parts, out var remain);
 164
 32165        for (var i = 0; i < parts; i++)
 166        {
 12167            yield return MilliSatoshis(result + (remain > 0 ? 1UL : 0UL));
 12168            if (remain > 0)
 169            {
 4170                remain--;
 171            }
 172        }
 4173    }
 174    IEnumerable<IMoney> IMoney.Split(int parts)
 175    {
 0176        return Split(parts);
 177    }
 178
 179    #region Static Converters
 180    public static LightningMoney FromUnit(decimal amount, LightningMoneyUnit unit)
 181    {
 124182        return new LightningMoney(amount, unit);
 183    }
 184
 185    public static LightningMoney Coins(decimal coins)
 186    {
 187        // overflow safe.
 188        // decimal operations are checked by default
 4189        return new LightningMoney(coins * COIN, LightningMoneyUnit.MilliSatoshi);
 190    }
 191
 192    public static LightningMoney Bits(decimal bits)
 193    {
 194        // overflow safe.
 195        // decimal operations are checked by default
 4196        return new LightningMoney(bits * CENT, LightningMoneyUnit.MilliSatoshi);
 197    }
 198
 199    public static LightningMoney Cents(decimal cents)
 200    {
 201        // overflow safe.
 202        // decimal operations are checked by default
 4203        return new LightningMoney(cents * CENT, LightningMoneyUnit.MilliSatoshi);
 204    }
 205
 206    public static LightningMoney Satoshis(decimal sats)
 207    {
 4208        return new LightningMoney(sats, LightningMoneyUnit.Satoshi);
 209    }
 210
 211    public static LightningMoney Satoshis(ulong sats)
 212    {
 48213        return new LightningMoney(sats, LightningMoneyUnit.Satoshi);
 214    }
 215
 216    public static LightningMoney Satoshis(long sats)
 217    {
 1080218        return new LightningMoney((ulong)sats, LightningMoneyUnit.Satoshi);
 219    }
 220
 221    public static LightningMoney MilliSatoshis(ulong milliSats)
 222    {
 16223        return new LightningMoney(milliSats);
 224    }
 225
 226    public static LightningMoney MilliSatoshis(long sats)
 227    {
 28228        return new LightningMoney((ulong)sats);
 229    }
 230    #endregion
 231
 232    #region IEquatable<Money> Members
 233    public bool Equals(LightningMoney? other)
 234    {
 24235        return other is not null && _milliSatoshi.Equals(other._milliSatoshi);
 236    }
 237    bool IEquatable<IMoney>.Equals(IMoney? other)
 238    {
 0239        return Equals(other);
 240    }
 241
 242    public int CompareTo(LightningMoney? other)
 243    {
 604244        return other is null ? 1 : _milliSatoshi.CompareTo(other._milliSatoshi);
 245    }
 246
 247    bool IMoney.IsCompatible(IMoney money)
 248    {
 8249        ArgumentNullException.ThrowIfNull(money);
 250
 8251        return money is LightningMoney;
 252    }
 253    #endregion
 254
 255    #region IComparable Members
 256    public int CompareTo(object? obj)
 257    {
 128258        return obj switch
 128259        {
 0260            null => 1,
 128261            LightningMoney m => _milliSatoshi.CompareTo(m._milliSatoshi),
 0262            _ => _milliSatoshi.CompareTo((ulong)obj)
 128263        };
 264    }
 265    int IComparable.CompareTo(object? obj)
 266    {
 0267        return CompareTo(obj);
 268    }
 269    int IComparable<IMoney>.CompareTo(IMoney? other)
 270    {
 128271        return CompareTo(other);
 272    }
 273    #endregion
 274
 275    #region Unary Operators
 276    public static LightningMoney operator -(LightningMoney left, LightningMoney right)
 277    {
 236278        ArgumentNullException.ThrowIfNull(left);
 236279        ArgumentNullException.ThrowIfNull(right);
 280
 236281        if (left._milliSatoshi < right._milliSatoshi)
 0282            throw new ArithmeticException("LightningMoney does not support negative values");
 283
 236284        return new LightningMoney(checked(left._milliSatoshi - right._milliSatoshi));
 285    }
 286    public static LightningMoney operator -(LightningMoney _)
 287    {
 0288        throw new ArithmeticException("LightningMoney does not support unary negation");
 289    }
 290    public static LightningMoney operator +(LightningMoney left, LightningMoney right)
 291    {
 136292        ArgumentNullException.ThrowIfNull(left);
 136293        ArgumentNullException.ThrowIfNull(right);
 294
 136295        return new LightningMoney(checked(left._milliSatoshi + right._milliSatoshi));
 296    }
 297    public static LightningMoney operator *(ulong left, LightningMoney right)
 298    {
 0299        ArgumentNullException.ThrowIfNull(right);
 300
 0301        return MilliSatoshis(checked(left * right._milliSatoshi));
 302    }
 303
 304    public static LightningMoney operator *(LightningMoney left, ulong right)
 305    {
 0306        ArgumentNullException.ThrowIfNull(left);
 307
 0308        return MilliSatoshis(checked(left._milliSatoshi * right));
 309    }
 310    public static LightningMoney operator *(long left, LightningMoney right)
 311    {
 0312        ArgumentNullException.ThrowIfNull(right);
 313
 0314        return MilliSatoshis(checked((ulong)left * right._milliSatoshi));
 315    }
 316    public static LightningMoney operator *(LightningMoney left, long right)
 317    {
 0318        ArgumentNullException.ThrowIfNull(left);
 319
 0320        return MilliSatoshis(checked((ulong)right * left._milliSatoshi));
 321    }
 322
 323    public static LightningMoney operator /(LightningMoney left, ulong right)
 324    {
 0325        ArgumentNullException.ThrowIfNull(left);
 326
 0327        return new LightningMoney(left._milliSatoshi / right);
 328    }
 329
 330    public static bool operator <(LightningMoney left, LightningMoney right)
 331    {
 4332        ArgumentNullException.ThrowIfNull(left);
 4333        ArgumentNullException.ThrowIfNull(right);
 334
 4335        return left._milliSatoshi < right._milliSatoshi;
 336    }
 337    public static bool operator >(LightningMoney left, LightningMoney right)
 338    {
 120339        ArgumentNullException.ThrowIfNull(left);
 120340        ArgumentNullException.ThrowIfNull(right);
 341
 120342        return left._milliSatoshi > right._milliSatoshi;
 343    }
 344    public static bool operator <=(LightningMoney left, LightningMoney right)
 345    {
 148346        ArgumentNullException.ThrowIfNull(left);
 148347        ArgumentNullException.ThrowIfNull(right);
 348
 148349        return left._milliSatoshi <= right._milliSatoshi;
 350    }
 351    public static bool operator >=(LightningMoney left, LightningMoney right)
 352    {
 256353        ArgumentNullException.ThrowIfNull(left);
 256354        ArgumentNullException.ThrowIfNull(right);
 355
 256356        return left._milliSatoshi >= right._milliSatoshi;
 357    }
 358    #endregion
 359
 360    #region Implicit Operators
 361    public static implicit operator LightningMoney(long value)
 362    {
 296363        return new LightningMoney((ulong)value);
 364    }
 365    public static implicit operator LightningMoney(ulong value)
 366    {
 1804367        return new LightningMoney(value);
 368    }
 369    public static implicit operator LightningMoney(NBitcoin.Money value)
 370    {
 148371        return new LightningMoney((ulong)value.Satoshi * 1_000UL);
 372    }
 373    public static implicit operator LightningMoney(string value)
 374    {
 0375        return Parse(value) ?? throw new ArgumentException("Cannot parse value into a valid LightningMoney", nameof(valu
 376    }
 377
 378    public static implicit operator long(LightningMoney value)
 379    {
 672380        return checked((long)value.MilliSatoshi);
 381    }
 382
 383    public static implicit operator ulong(LightningMoney value)
 384    {
 32385        return value.MilliSatoshi;
 386    }
 387
 388    public static implicit operator NBitcoin.Money(LightningMoney value)
 389    {
 704390        return new NBitcoin.Money(value.Satoshi);
 391    }
 392    #endregion
 393
 394    #region Equality Operators
 395    public override bool Equals(object? obj)
 396    {
 0397        return obj is LightningMoney item && _milliSatoshi.Equals(item._milliSatoshi);
 398    }
 399
 400    public override int GetHashCode()
 401    {
 0402        return _milliSatoshi.GetHashCode();
 403    }
 404
 405    public static bool operator ==(LightningMoney? a, LightningMoney? b)
 406    {
 240407        if (ReferenceEquals(a, b))
 0408            return true;
 240409        if (a is null || b is null)
 0410            return false;
 240411        return a._milliSatoshi == b._milliSatoshi;
 412    }
 413
 414    public static bool operator !=(LightningMoney a, LightningMoney b)
 415    {
 100416        return !(a == b);
 417    }
 418    #endregion
 419
 420    #region ToString
 421    /// <summary>
 422    /// Returns a culture invariant string representation of Bitcoin amount
 423    /// </summary>
 424    /// <returns></returns>
 425    public override string ToString()
 426    {
 0427        return ToString(false);
 428    }
 429    /// <summary>
 430    /// Returns a culture invariant string representation of Bitcoin amount
 431    /// </summary>
 432    /// <param name="trimExcessZero">True if trim excess zeros</param>
 433    /// <returns></returns>
 434    public string ToString(bool trimExcessZero = true)
 435    {
 12436        var val = (decimal)_milliSatoshi / (ulong)LightningMoneyUnit.Btc;
 12437        var decPos = trimExcessZero ? 2 : 11;
 12438        var zeros = new string('0', decPos);
 12439        var rest = new string('#', 11 - decPos);
 12440        var fmt = "{0:0" + ("." + zeros + rest) + "}";
 441
 12442        return string.Format(CultureInfo.InvariantCulture, fmt, val);
 443    }
 444    #endregion
 445
 446    /// <summary>
 447    /// Tell if the amount is almost equal to this instance
 448    /// </summary>
 449    /// <param name="amount"></param>
 450    /// <param name="dust">more or less amount</param>
 451    /// <returns>true if equals, else false</returns>
 452    public bool Almost(LightningMoney amount, LightningMoney dust)
 453    {
 8454        ArgumentNullException.ThrowIfNull(amount);
 8455        ArgumentNullException.ThrowIfNull(dust);
 456
 8457        return amount - this <= dust;
 458    }
 459
 460    /// <summary>
 461    /// Tell if the amount is almost equal to this instance
 462    /// </summary>
 463    /// <param name="amount"></param>
 464    /// <param name="margin">error margin (between 0 and 1)</param>
 465    /// <returns>true if equals, else false</returns>
 466    public bool Almost(LightningMoney amount, decimal margin)
 467    {
 4468        ArgumentNullException.ThrowIfNull(amount);
 4469        if (margin is < 0.0m or > 1.0m)
 0470            throw new ArgumentOutOfRangeException(nameof(margin), "margin should be between 0 and 1");
 471
 4472        var dust = new LightningMoney(MilliSatoshi * margin, LightningMoneyUnit.MilliSatoshi);
 4473        return Almost(amount, dust);
 474    }
 475
 476    public static LightningMoney Min(LightningMoney a, LightningMoney b)
 477    {
 4478        ArgumentNullException.ThrowIfNull(a);
 4479        ArgumentNullException.ThrowIfNull(b);
 480
 4481        return a <= b ? a : b;
 482    }
 483
 484    public static LightningMoney Max(LightningMoney a, LightningMoney b)
 485    {
 4486        ArgumentNullException.ThrowIfNull(a);
 4487        ArgumentNullException.ThrowIfNull(b);
 488
 4489        return a >= b ? a : b;
 490    }
 491
 492    #region IMoney Members
 493    public IMoney Add(IMoney money)
 494    {
 0495        return this + (LightningMoney)money;
 496    }
 497
 498    public IMoney Sub(IMoney money)
 499    {
 0500        return this - (LightningMoney)money;
 501    }
 502
 503    public IMoney Negate()
 504    {
 4505        throw new ArithmeticException("LightningMoney does not support unary negation");
 506    }
 507    #endregion
 508
 509    private static void CheckLightningMoneyUnit(LightningMoneyUnit value, string paramName)
 510    {
 1792511        var typeOfMoneyUnit = typeof(LightningMoneyUnit);
 1792512        if (!Enum.IsDefined(typeOfMoneyUnit, value))
 513        {
 4514            throw new ArgumentException("Invalid value for LightningMoneyUnit", paramName);
 515        }
 1788516    }
 517
 518    private static ulong DivRem(ulong a, ulong b, out ulong result)
 519    {
 4520        result = a % b;
 4521        return a / b;
 522    }
 523}

Methods/Properties

get_MilliSatoshi()
set_MilliSatoshi(System.UInt64)
get_Satoshi()
set_Satoshi(System.Int64)
get_Zero()
get_IsZero()
.ctor(System.UInt64)
.ctor(System.Decimal,NLightning.Domain.Enums.LightningMoneyUnit)
.ctor(System.Int64,NLightning.Domain.Enums.LightningMoneyUnit)
.ctor(System.UInt64,NLightning.Domain.Enums.LightningMoneyUnit)
TryParse(System.String,NLightning.Domain.Money.LightningMoney&)
Parse(System.String)
ToUnit(NLightning.Domain.Enums.LightningMoneyUnit)
ToDecimal(NLightning.Domain.Enums.LightningMoneyUnit)
Split()
NBitcoin.IMoney.Split(System.Int32)
FromUnit(System.Decimal,NLightning.Domain.Enums.LightningMoneyUnit)
Coins(System.Decimal)
Bits(System.Decimal)
Cents(System.Decimal)
Satoshis(System.Decimal)
Satoshis(System.UInt64)
Satoshis(System.Int64)
MilliSatoshis(System.UInt64)
MilliSatoshis(System.Int64)
Equals(NLightning.Domain.Money.LightningMoney)
System.IEquatable<NBitcoin.IMoney>.Equals(NBitcoin.IMoney)
CompareTo(NLightning.Domain.Money.LightningMoney)
NBitcoin.IMoney.IsCompatible(NBitcoin.IMoney)
CompareTo(System.Object)
System.IComparable.CompareTo(System.Object)
System.IComparable<NBitcoin.IMoney>.CompareTo(NBitcoin.IMoney)
op_Subtraction(NLightning.Domain.Money.LightningMoney,NLightning.Domain.Money.LightningMoney)
op_UnaryNegation(NLightning.Domain.Money.LightningMoney)
op_Addition(NLightning.Domain.Money.LightningMoney,NLightning.Domain.Money.LightningMoney)
op_Multiply(System.UInt64,NLightning.Domain.Money.LightningMoney)
op_Multiply(NLightning.Domain.Money.LightningMoney,System.UInt64)
op_Multiply(System.Int64,NLightning.Domain.Money.LightningMoney)
op_Multiply(NLightning.Domain.Money.LightningMoney,System.Int64)
op_Division(NLightning.Domain.Money.LightningMoney,System.UInt64)
op_LessThan(NLightning.Domain.Money.LightningMoney,NLightning.Domain.Money.LightningMoney)
op_GreaterThan(NLightning.Domain.Money.LightningMoney,NLightning.Domain.Money.LightningMoney)
op_LessThanOrEqual(NLightning.Domain.Money.LightningMoney,NLightning.Domain.Money.LightningMoney)
op_GreaterThanOrEqual(NLightning.Domain.Money.LightningMoney,NLightning.Domain.Money.LightningMoney)
op_Implicit(System.Int64)
op_Implicit(System.UInt64)
op_Implicit(NBitcoin.Money)
op_Implicit(System.String)
op_Implicit(NLightning.Domain.Money.LightningMoney)
op_Implicit(NLightning.Domain.Money.LightningMoney)
op_Implicit(NLightning.Domain.Money.LightningMoney)
Equals(System.Object)
GetHashCode()
op_Equality(NLightning.Domain.Money.LightningMoney,NLightning.Domain.Money.LightningMoney)
op_Inequality(NLightning.Domain.Money.LightningMoney,NLightning.Domain.Money.LightningMoney)
ToString()
ToString(System.Boolean)
Almost(NLightning.Domain.Money.LightningMoney,NLightning.Domain.Money.LightningMoney)
Almost(NLightning.Domain.Money.LightningMoney,System.Decimal)
Min(NLightning.Domain.Money.LightningMoney,NLightning.Domain.Money.LightningMoney)
Max(NLightning.Domain.Money.LightningMoney,NLightning.Domain.Money.LightningMoney)
Add(NBitcoin.IMoney)
Sub(NBitcoin.IMoney)
Negate()
CheckLightningMoneyUnit(NLightning.Domain.Enums.LightningMoneyUnit,System.String)
DivRem(System.UInt64,System.UInt64,System.UInt64&)