Example #1
0
        internal static LightningInvoice ConvertLndInvoice(LnrpcInvoice resp)
        {
            var invoice = new LightningInvoice
            {
                // TODO: Verify id corresponds to R_hash
                Id     = BitString(resp.R_hash),
                Amount = new LightMoney(ConvertInv.ToInt64(resp.Value), LightMoneyUnit.Satoshi),
                BOLT11 = resp.Payment_request,
                Status = "unpaid"
            };

            if (resp.Settle_date != null)
            {
                invoice.PaidAt = DateTimeOffset.FromUnixTimeSeconds(ConvertInv.ToInt64(resp.Settle_date));
                invoice.Status = "paid";
            }
            else
            {
                var invoiceExpiry = ConvertInv.ToInt64(resp.Creation_date) + ConvertInv.ToInt64(resp.Expiry);
                if (DateTimeOffset.FromUnixTimeSeconds(invoiceExpiry) > DateTimeOffset.UtcNow)
                {
                    invoice.Status = "expired";
                }
            }
            return(invoice);
        }
 private LightningInvoiceData ToModel(LightningInvoice invoice)
 {
     return(new LightningInvoiceData()
     {
         Amount = invoice.Amount,
         Id = invoice.Id,
         Status = invoice.Status,
         AmountReceived = invoice.AmountReceived,
         PaidAt = invoice.PaidAt,
         BOLT11 = invoice.BOLT11,
         ExpiresAt = invoice.ExpiresAt
     });
 }
Example #3
0
        public async Task <LightningInvoice> GetInvoice(string invoiceId,
                                                        CancellationToken cancellation = default(CancellationToken))
        {
            InvoiceResponse result = null;

            try
            {
                result = await _eclairClient.GetInvoice(invoiceId, cancellation);
            }
            catch (EclairClient.EclairApiException ex) when(ex.Error.Error == "Not found" || ex.Error.Error.Contains("Invalid hexadecimal", StringComparison.OrdinalIgnoreCase))
            {
                return(null);
            }

            GetReceivedInfoResponse info = null;

            try
            {
                info = await _eclairClient.GetReceivedInfo(invoiceId, null, cancellation);
            }
            catch (EclairClient.EclairApiException)
            {
            }

            var parsed    = BOLT11PaymentRequest.Parse(result.Serialized, _network);
            var lnInvoice = new LightningInvoice()
            {
                Id        = result.PaymentHash,
                Amount    = parsed.MinimumAmount,
                ExpiresAt = parsed.ExpiryDate,
                BOLT11    = result.Serialized
            };

            if (DateTimeOffset.UtcNow >= parsed.ExpiryDate)
            {
                lnInvoice.Status = LightningInvoiceStatus.Expired;
            }
            if (info != null && info.Status.Type == "received")
            {
                lnInvoice.AmountReceived = info.Status.Amount;
                lnInvoice.Status         = info.Status.Amount >= parsed.MinimumAmount ? LightningInvoiceStatus.Paid : LightningInvoiceStatus.Unpaid;
                lnInvoice.PaidAt         = info.Status.ReceivedAt;
            }
            return(lnInvoice);
        }
Example #4
0
        public async Task <LightningInvoice> CreateInvoice(LightMoney amount, string description, TimeSpan expiry,
                                                           CancellationToken cancellation = default(CancellationToken))
        {
            var result = await _eclairClient.CreateInvoice(
                description,
                amount.MilliSatoshi,
                Convert.ToInt32(expiry.TotalSeconds), null, cancellation);

            var parsed  = BOLT11PaymentRequest.Parse(result.Serialized, _network);
            var invoice = new LightningInvoice()
            {
                BOLT11    = result.Serialized,
                Amount    = amount,
                Id        = result.PaymentHash,
                Status    = LightningInvoiceStatus.Unpaid,
                ExpiresAt = parsed.ExpiryDate
            };

            return(invoice);
        }
        internal LightningInvoice GetLightningInvoiceObject(ListInvoiceResultResponse invoice, Network network)
        {
            var parsed = BOLT11PaymentRequest.Parse(invoice.Bolt11, network);

            var lightningInvoice = new LightningInvoice()
            {
                Id             = invoice.Hash,
                Amount         = invoice.AmountMsat,
                AmountReceived = invoice.AmountMsat,
                BOLT11         = invoice.Bolt11,
                Status         = ToStatus(invoice.State),
                PaidAt         = null,
                ExpiresAt      = parsed.ExpiryDate
            };

            if (invoice.State == "used")
            {
                lightningInvoice.PaidAt = parsed.ExpiryDate;
            }

            return(lightningInvoice);
        }
Example #6
0
        public async Task <LightningInvoice> CreateInvoice(LightMoney amount, string description, TimeSpan expiry,
                                                           CancellationToken cancellation = default(CancellationToken))
        {
            var strAmount = ConvertInv.ToString(amount.ToUnit(LightMoneyUnit.Satoshi));
            var strExpiry = ConvertInv.ToString(Math.Round(expiry.TotalSeconds, 0));
            // lnd requires numbers sent as strings. don't ask
            var resp = await _rpcClient.AddInvoiceAsync(new LnrpcInvoice
            {
                Value  = strAmount,
                Memo   = description,
                Expiry = strExpiry
            });

            var invoice = new LightningInvoice
            {
                Id     = BitString(resp.R_hash),
                Amount = amount,
                BOLT11 = resp.Payment_request,
                Status = "unpaid"
            };

            return(invoice);
        }
        public async Task <LightningInvoice> GetInvoice(string invoiceId,
                                                        CancellationToken cancellation = default(CancellationToken))
        {
            var result = await _eclairClient.GetInvoice(invoiceId, cancellation);

            GetReceivedInfoResponse info = null;

            try
            {
                info = await _eclairClient.GetReceivedInfo(invoiceId, null, cancellation);
            }
            catch (EclairClient.EclairApiException)
            {
            }

            var parsed    = BOLT11PaymentRequest.Parse(result.Serialized, _network);
            var lnInvoice = new LightningInvoice()
            {
                Id        = result.PaymentHash,
                Amount    = parsed.MinimumAmount,
                ExpiresAt = parsed.ExpiryDate,
                BOLT11    = result.Serialized
            };

            if (DateTimeOffset.UtcNow >= parsed.ExpiryDate)
            {
                lnInvoice.Status = LightningInvoiceStatus.Expired;
            }
            if (info != null && info.Status.Type == "received")
            {
                lnInvoice.AmountReceived = info.Status.Amount;
                lnInvoice.Status         = info.Status.Amount >= parsed.MinimumAmount ? LightningInvoiceStatus.Paid : LightningInvoiceStatus.Unpaid;
                lnInvoice.PaidAt         = info.Status.ReceivedAt;
            }
            return(lnInvoice);
        }