mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2026-01-05 23:24:27 +01:00
Handle LNURL Payouts failing due to amount restriction (#6061)
* Handle LNURL payouts better when amount is not allowee * docker-compose: Add missing restart for merchant CLN container * show sats not msats --------- Co-authored-by: Dennis Reimann <mail@dennisreimann.de>
This commit is contained in:
@@ -89,7 +89,11 @@ namespace BTCPayServer.Data.Payouts.LightningLike
|
||||
{
|
||||
using var timeout = new CancellationTokenSource(TimeSpan.FromSeconds(30));
|
||||
using var t = CancellationTokenSource.CreateLinkedTokenSource(timeout.Token, cancellationToken);
|
||||
var info = (LNURLPayRequest)(await LNURL.LNURL.FetchInformation(lnurl, CreateClient(lnurl), t.Token));
|
||||
var rawInfo = await LNURL.LNURL.FetchInformation(lnurl, CreateClient(lnurl), t.Token);
|
||||
if(rawInfo is null)
|
||||
return (null, "The LNURL / Lightning Address provided was not online.");
|
||||
if(rawInfo is not LNURLPayRequest info)
|
||||
return (null, "The LNURL was not a valid LNURL Pay request.");
|
||||
lnurlTag = info.Tag;
|
||||
}
|
||||
|
||||
@@ -159,9 +163,27 @@ namespace BTCPayServer.Data.Payouts.LightningLike
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public Task<decimal> GetMinimumPayoutAmount(IClaimDestination claimDestination)
|
||||
public async Task<decimal> GetMinimumPayoutAmount(IClaimDestination claimDestination)
|
||||
{
|
||||
return Task.FromResult(Money.Satoshis(1).ToDecimal(MoneyUnit.BTC));
|
||||
if(claimDestination is LNURLPayClaimDestinaton lnurlPayClaimDestinaton)
|
||||
{
|
||||
try
|
||||
{
|
||||
var lnurl = lnurlPayClaimDestinaton.LNURL.IsValidEmail()
|
||||
? LNURL.LNURL.ExtractUriFromInternetIdentifier(lnurlPayClaimDestinaton.LNURL)
|
||||
: LNURL.LNURL.Parse(lnurlPayClaimDestinaton.LNURL, out var lnurlTag);
|
||||
|
||||
using var timeout = new CancellationTokenSource(TimeSpan.FromSeconds(30));
|
||||
var rawInfo = await LNURL.LNURL.FetchInformation(lnurl, CreateClient(lnurl), timeout.Token);
|
||||
if (rawInfo is LNURLPayRequest info)
|
||||
return info.MinSendable.ToDecimal(LightMoneyUnit.BTC);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// ignored
|
||||
}
|
||||
}
|
||||
return Money.Satoshis(1).ToDecimal(MoneyUnit.BTC);
|
||||
}
|
||||
|
||||
public Dictionary<PayoutState, List<(string Action, string Text)>> GetPayoutSpecificActions()
|
||||
|
||||
@@ -245,13 +245,15 @@ namespace BTCPayServer.Data.Payouts.LightningLike
|
||||
var lm = new LightMoney(blob.CryptoAmount.Value, LightMoneyUnit.BTC);
|
||||
if (lm > lnurlInfo.MaxSendable || lm < lnurlInfo.MinSendable)
|
||||
{
|
||||
|
||||
payoutData.State = PayoutState.Cancelled;
|
||||
return (null, new ResultVM
|
||||
{
|
||||
PayoutId = payoutData.Id,
|
||||
Result = PayResult.Error,
|
||||
Destination = blob.Destination,
|
||||
Message =
|
||||
$"The LNURL provided would not generate an invoice of {lm.MilliSatoshi}msats"
|
||||
$"The LNURL provided would not generate an invoice of {lm.ToDecimal(LightMoneyUnit.Satoshi)} sats"
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user