protected override async Task <ILightningClient> GetLightningClient(string cryptoCode, bool doingAdminThings) { var network = _btcPayNetworkProvider.GetNetwork <BTCPayNetwork>(cryptoCode); var store = HttpContext.GetStoreData(); if (network == null || store == null) { return(null); } var id = new PaymentMethodId(cryptoCode, PaymentTypes.LightningLike); var existing = store.GetSupportedPaymentMethods(_btcPayNetworkProvider) .OfType <LightningSupportedPaymentMethod>() .FirstOrDefault(d => d.PaymentId == id); if (existing == null) { return(null); } if (existing.GetExternalLightningUrl() is LightningConnectionString connectionString) { return(_lightningClientFactory.Create(connectionString, network)); } else if ( await CanUseInternalLightning(doingAdminThings) && _lightningNetworkOptions.Value.InternalLightningByCryptoCode.TryGetValue(network.CryptoCode, out var internalLightningNode)) { return(_lightningClientFactory.Create(internalLightningNode, network)); } return(null); }
public override async Task <IPaymentMethodDetails> CreatePaymentMethodDetails( InvoiceLogs logs, LightningSupportedPaymentMethod supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject) { //direct casting to (BTCPayNetwork) is fixed in other pull requests with better generic interfacing for handlers var storeBlob = store.GetStoreBlob(); var test = GetNodeInfo(paymentMethod.PreferOnion, supportedPaymentMethod, (BTCPayNetwork)network); var invoice = paymentMethod.ParentEntity; var due = Extensions.RoundUp(invoice.ProductInformation.Price / paymentMethod.Rate, network.Divisibility); var client = _lightningClientFactory.Create(supportedPaymentMethod.GetLightningUrl(), (BTCPayNetwork)network); var expiry = invoice.ExpirationTime - DateTimeOffset.UtcNow; if (expiry < TimeSpan.Zero) { expiry = TimeSpan.FromSeconds(1); } LightningInvoice lightningInvoice = null; string description = storeBlob.LightningDescriptionTemplate; description = description.Replace("{StoreName}", store.StoreName ?? "", StringComparison.OrdinalIgnoreCase) .Replace("{ItemDescription}", invoice.ProductInformation.ItemDesc ?? "", StringComparison.OrdinalIgnoreCase) .Replace("{OrderId}", invoice.OrderId ?? "", StringComparison.OrdinalIgnoreCase); using (var cts = new CancellationTokenSource(LIGHTNING_TIMEOUT)) { try { var request = new CreateInvoiceParams(new LightMoney(due, LightMoneyUnit.BTC), description, expiry); request.PrivateRouteHints = storeBlob.LightningPrivateRouteHints; lightningInvoice = await client.CreateInvoice(request, cts.Token); } catch (OperationCanceledException) when(cts.IsCancellationRequested) { throw new PaymentMethodUnavailableException($"The lightning node did not reply in a timely manner"); } catch (Exception ex) { throw new PaymentMethodUnavailableException($"Impossible to create lightning invoice ({ex.Message})", ex); } } var nodeInfo = await test; return(new LightningLikePaymentMethodDetails() { BOLT11 = lightningInvoice.BOLT11, InvoiceId = lightningInvoice.Id, NodeInfo = nodeInfo.ToString() }); }
protected override Task <ILightningClient> GetLightningClient(string cryptoCode, bool doingAdminThings) { _btcPayServerOptions.InternalLightningByCryptoCode.TryGetValue(cryptoCode, out var internalLightningNode); var network = _btcPayNetworkProvider.GetNetwork <BTCPayNetwork>(cryptoCode); var store = HttpContext.GetStoreData(); if (network == null || store == null) { return(null); } var id = new PaymentMethodId(cryptoCode, PaymentTypes.LightningLike); var existing = store.GetSupportedPaymentMethods(_btcPayNetworkProvider) .OfType <LightningSupportedPaymentMethod>() .FirstOrDefault(d => d.PaymentId == id); if (existing == null || (existing.GetLightningUrl().IsInternalNode(internalLightningNode) && !CanUseInternalLightning(doingAdminThings))) { return(null); } return(Task.FromResult(_lightningClientFactory.Create(existing.GetLightningUrl(), network))); }
private ILightningClient CreateLightningClient(LightningSupportedPaymentMethod supportedPaymentMethod, BTCPayNetwork network) { var external = supportedPaymentMethod.GetExternalLightningUrl(); if (external != null) { return(_lightningClientFactory.Create(external, network)); } else { if (!Options.Value.InternalLightningByCryptoCode.TryGetValue(network.CryptoCode, out var connectionString)) { throw new PaymentMethodUnavailableException("No internal node configured"); } return(_lightningClientFactory.Create(connectionString, network)); } }
public static ILightningClient CreateLightningClient(this LightningSupportedPaymentMethod supportedPaymentMethod, BTCPayNetwork network, LightningNetworkOptions options, LightningClientFactoryService lightningClientFactory) { var external = supportedPaymentMethod.GetExternalLightningUrl(); if (external != null) { return(lightningClientFactory.Create(external, network)); } else { if (!options.InternalLightningByCryptoCode.TryGetValue(network.CryptoCode, out var connectionString)) { throw new PaymentMethodUnavailableException("No internal node configured"); } return(lightningClientFactory.Create(connectionString, network)); } }
protected override Task <ILightningClient> GetLightningClient(string cryptoCode, bool doingAdminThings) { var network = _btcPayNetworkProvider.GetNetwork <BTCPayNetwork>(cryptoCode); if (network == null) { throw ErrorCryptoCodeNotFound(); } var store = HttpContext.GetStoreData(); if (store == null) { throw new JsonHttpException(StoreNotFound()); } var id = new PaymentMethodId(cryptoCode, PaymentTypes.LightningLike); var existing = store.GetSupportedPaymentMethods(_btcPayNetworkProvider) .OfType <LightningSupportedPaymentMethod>() .FirstOrDefault(d => d.PaymentId == id); if (existing == null) { throw ErrorLightningNodeNotConfiguredForStore(); } if (existing.GetExternalLightningUrl() is LightningConnectionString connectionString) { return(Task.FromResult(_lightningClientFactory.Create(connectionString, network))); } else if (existing.IsInternalNode && _lightningNetworkOptions.Value.InternalLightningByCryptoCode.TryGetValue(network.CryptoCode, out var internalLightningNode)) { if (!User.IsInRole(Roles.ServerAdmin) && doingAdminThings) { throw ErrorShouldBeAdminForInternalNode(); } return(Task.FromResult(_lightningClientFactory.Create(internalLightningNode, network))); } throw ErrorLightningNodeNotConfiguredForStore(); }
protected override Task <ILightningClient> GetLightningClient(string cryptoCode, bool doingAdminThings) { _lightningNetworkOptions.Value.InternalLightningByCryptoCode.TryGetValue(cryptoCode, out var internalLightningNode); var network = _btcPayNetworkProvider.GetNetwork <BTCPayNetwork>(cryptoCode); if (network == null || !CanUseInternalLightning(doingAdminThings) || internalLightningNode == null) { return(null); } return(Task.FromResult(_lightningClientFactory.Create(internalLightningNode, network))); }
private ILightningClient GetLightningClient(StoreData store, string cryptoCode) { var network = _networkProvider.GetNetwork <BTCPayNetwork>(cryptoCode); var id = new PaymentMethodId(cryptoCode, PaymentTypes.LightningLike); var existing = store.GetSupportedPaymentMethods(_networkProvider) .OfType <LightningSupportedPaymentMethod>() .FirstOrDefault(d => d.PaymentId == id); if (existing == null) { return(null); } if (existing.GetExternalLightningUrl() is {} connectionString) { return(_lightningClientFactory.Create(connectionString, network)); } if (existing.IsInternalNode && _lightningNetworkOptions.Value.InternalLightningByCryptoCode.TryGetValue(cryptoCode, out var internalLightningNode)) { return(_lightningClientFactory.Create(internalLightningNode, network)); } return(null); }
protected override async Task <ILightningClient> GetLightningClient(string cryptoCode, bool doingAdminThings) { var network = _btcPayNetworkProvider.GetNetwork <BTCPayNetwork>(cryptoCode); if (network is null) { throw ErrorCryptoCodeNotFound(); } if (!_lightningNetworkOptions.Value.InternalLightningByCryptoCode.TryGetValue(network.CryptoCode, out var internalLightningNode)) { throw ErrorInternalLightningNodeNotConfigured(); } if (!await CanUseInternalLightning(doingAdminThings)) { throw ErrorShouldBeAdminForInternalNode(); } return(_lightningClientFactory.Create(internalLightningNode, network)); }