Exemple #1
0
    protected override async Task Process(ISupportedPaymentMethod paymentMethod, PayoutData[] payouts)
    {
        await using var ctx = _applicationDbContextFactory.CreateContext();


        var lightningSupportedPaymentMethod = (LightningSupportedPaymentMethod)paymentMethod;

        if (lightningSupportedPaymentMethod.IsInternalNode &&
            !(await Task.WhenAll((await _storeRepository.GetStoreUsers(_PayoutProcesserSettings.StoreId))
                                 .Where(user => user.Role == StoreRoles.Owner).Select(user => user.Id)
                                 .Select(s => _userService.IsAdminUser(s)))).Any(b => b))
        {
            return;
        }

        var client =
            lightningSupportedPaymentMethod.CreateLightningClient(_network, _options.Value,
                                                                  _lightningClientFactoryService);



        foreach (var payoutData in payouts)
        {
            var blob  = payoutData.GetBlob(_btcPayNetworkJsonSerializerSettings);
            var claim = await _payoutHandler.ParseClaimDestination(PaymentMethodId, blob.Destination);

            try
            {
                switch (claim.destination)
                {
                case LNURLPayClaimDestinaton lnurlPayClaimDestinaton:
                    var endpoint   = LNURL.LNURL.Parse(lnurlPayClaimDestinaton.LNURL, out var tag);
                    var httpClient = _payoutHandler.CreateClient(endpoint);
                    var lnurlInfo  =
                        (LNURLPayRequest)await LNURL.LNURL.FetchInformation(endpoint, "payRequest",
                                                                            httpClient);

                    var lm = new LightMoney(blob.CryptoAmount.Value, LightMoneyUnit.BTC);
                    if (lm > lnurlInfo.MaxSendable || lm < lnurlInfo.MinSendable)
                    {
                        continue;
                    }
                    else
                    {
                        try
                        {
                            var lnurlPayRequestCallbackResponse =
                                await lnurlInfo.SendRequest(lm, _network.NBitcoinNetwork, httpClient);

                            if (await TrypayBolt(client, blob, payoutData,
                                                 lnurlPayRequestCallbackResponse
                                                 .GetPaymentRequest(_network.NBitcoinNetwork)))
                            {
                                ctx.Attach(payoutData);
                                payoutData.State = PayoutState.Completed;
                            }
                        }
                        catch (LNUrlException)
                        {
                            continue;
                        }
                    }

                    break;

                case BoltInvoiceClaimDestination item1:
                    if (await TrypayBolt(client, blob, payoutData, item1.PaymentRequest))
                    {
                        ctx.Attach(payoutData);
                        payoutData.State = PayoutState.Completed;
                    }

                    break;
                }
            }
            catch (Exception e)
            {
                Logs.PayServer.LogError(e, $"Could not process payout {payoutData.Id}");
            }
        }


        await ctx.SaveChangesAsync();
    }
Exemple #2
0
    protected override async Task Process(ISupportedPaymentMethod paymentMethod, PayoutData[] payouts)
    {
        await using var ctx = _applicationDbContextFactory.CreateContext();


        var lightningSupportedPaymentMethod = (LightningSupportedPaymentMethod)paymentMethod;

        if (lightningSupportedPaymentMethod.IsInternalNode &&
            !(await Task.WhenAll((await _storeRepository.GetStoreUsers(_PayoutProcesserSettings.StoreId))
                                 .Where(user => user.Role == StoreRoles.Owner).Select(user => user.Id)
                                 .Select(s => _userService.IsAdminUser(s)))).Any(b => b))
        {
            return;
        }

        var client =
            lightningSupportedPaymentMethod.CreateLightningClient(_network, _options.Value,
                                                                  _lightningClientFactoryService);



        foreach (var payoutData in payouts)
        {
            var blob  = payoutData.GetBlob(_btcPayNetworkJsonSerializerSettings);
            var claim = await _payoutHandler.ParseClaimDestination(PaymentMethodId, blob.Destination);

            try
            {
                switch (claim.destination)
                {
                case LNURLPayClaimDestinaton lnurlPayClaimDestinaton:
                    var lnurlResult = await UILightningLikePayoutController.GetInvoiceFromLNURL(payoutData, _payoutHandler, blob,
                                                                                                lnurlPayClaimDestinaton, _network.NBitcoinNetwork);

                    if (lnurlResult.Item2 is not null)
                    {
                        continue;
                    }

                    if (await TrypayBolt(client, blob, payoutData,
                                         lnurlResult.Item1))
                    {
                        ctx.Attach(payoutData);
                        payoutData.State = PayoutState.Completed;
                    }

                    break;

                case BoltInvoiceClaimDestination item1:
                    if (await TrypayBolt(client, blob, payoutData, item1.PaymentRequest))
                    {
                        ctx.Attach(payoutData);
                        payoutData.State = PayoutState.Completed;
                    }

                    break;
                }
            }
            catch (Exception e)
            {
                Logs.PayServer.LogError(e, $"Could not process payout {payoutData.Id}");
            }
        }


        await ctx.SaveChangesAsync();
    }