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));
            }
        }
示例#5
0
        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));
            }
        }
示例#6
0
        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();
        }
示例#7
0
        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));
        }