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 }); }
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); }
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); }
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); }