mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-18 22:44:29 +01:00
Attempt cover scenarios of switching back to Bitcoin only after taint (#2881)
This commit is contained in:
@@ -52,7 +52,7 @@ public class BitcoinLikePayoutHandler : IPayoutHandler
|
|||||||
|
|
||||||
public bool CanHandle(PaymentMethodId paymentMethod)
|
public bool CanHandle(PaymentMethodId paymentMethod)
|
||||||
{
|
{
|
||||||
return paymentMethod.PaymentType == BitcoinPaymentType.Instance &&
|
return paymentMethod?.PaymentType == BitcoinPaymentType.Instance &&
|
||||||
_btcPayNetworkProvider.GetNetwork<BTCPayNetwork>(paymentMethod.CryptoCode)?.ReadonlyWallet is false;
|
_btcPayNetworkProvider.GetNetwork<BTCPayNetwork>(paymentMethod.CryptoCode)?.ReadonlyWallet is false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,6 +89,10 @@ public class BitcoinLikePayoutHandler : IPayoutHandler
|
|||||||
if (payout?.Proof is null)
|
if (payout?.Proof is null)
|
||||||
return null;
|
return null;
|
||||||
var paymentMethodId = payout.GetPaymentMethodId();
|
var paymentMethodId = payout.GetPaymentMethodId();
|
||||||
|
if (paymentMethodId is null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
var raw = JObject.Parse(Encoding.UTF8.GetString(payout.Proof));
|
var raw = JObject.Parse(Encoding.UTF8.GetString(payout.Proof));
|
||||||
if (raw.TryGetValue("proofType", StringComparison.InvariantCultureIgnoreCase, out var proofType) &&
|
if (raw.TryGetValue("proofType", StringComparison.InvariantCultureIgnoreCase, out var proofType) &&
|
||||||
proofType.Value<string>() == ManualPayoutProof.Type)
|
proofType.Value<string>() == ManualPayoutProof.Type)
|
||||||
@@ -161,7 +165,9 @@ public class BitcoinLikePayoutHandler : IPayoutHandler
|
|||||||
.Include(p => p.PullPaymentData.StoreData)
|
.Include(p => p.PullPaymentData.StoreData)
|
||||||
.Where(p => payoutIds.Contains(p.Id))
|
.Where(p => payoutIds.Contains(p.Id))
|
||||||
.Where(p => p.PullPaymentData.StoreId == storeId && !p.PullPaymentData.Archived && p.State == PayoutState.AwaitingPayment)
|
.Where(p => p.PullPaymentData.StoreId == storeId && !p.PullPaymentData.Archived && p.State == PayoutState.AwaitingPayment)
|
||||||
.ToListAsync()).Where(data => CanHandle(PaymentMethodId.Parse(data.PaymentMethodId)))
|
.ToListAsync()).Where(data =>
|
||||||
|
PaymentMethodId.TryParse(data.PaymentMethodId, out var paymentMethodId) &&
|
||||||
|
CanHandle(paymentMethodId))
|
||||||
.Select(data => (data, ParseProof(data) as PayoutTransactionOnChainBlob)).Where(tuple=> tuple.Item2 != null && tuple.Item2.TransactionId != null && tuple.Item2.Accounted == false);
|
.Select(data => (data, ParseProof(data) as PayoutTransactionOnChainBlob)).Where(tuple=> tuple.Item2 != null && tuple.Item2.TransactionId != null && tuple.Item2.Accounted == false);
|
||||||
foreach (var valueTuple in payouts)
|
foreach (var valueTuple in payouts)
|
||||||
{
|
{
|
||||||
@@ -185,7 +191,9 @@ public class BitcoinLikePayoutHandler : IPayoutHandler
|
|||||||
.Include(p => p.PullPaymentData.StoreData)
|
.Include(p => p.PullPaymentData.StoreData)
|
||||||
.Where(p => payoutIds.Contains(p.Id))
|
.Where(p => payoutIds.Contains(p.Id))
|
||||||
.Where(p => p.PullPaymentData.StoreId == storeId && !p.PullPaymentData.Archived && p.State == PayoutState.AwaitingPayment)
|
.Where(p => p.PullPaymentData.StoreId == storeId && !p.PullPaymentData.Archived && p.State == PayoutState.AwaitingPayment)
|
||||||
.ToListAsync()).Where(data => CanHandle(PaymentMethodId.Parse(data.PaymentMethodId)))
|
.ToListAsync()).Where(data =>
|
||||||
|
PaymentMethodId.TryParse(data.PaymentMethodId, out var paymentMethodId) &&
|
||||||
|
CanHandle(paymentMethodId))
|
||||||
.Select(data => (data, ParseProof(data) as PayoutTransactionOnChainBlob)).Where(tuple=> tuple.Item2 != null && tuple.Item2.TransactionId != null && tuple.Item2.Accounted == true);
|
.Select(data => (data, ParseProof(data) as PayoutTransactionOnChainBlob)).Where(tuple=> tuple.Item2 != null && tuple.Item2.TransactionId != null && tuple.Item2.Accounted == true);
|
||||||
foreach (var valueTuple in payouts)
|
foreach (var valueTuple in payouts)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ namespace BTCPayServer.Data
|
|||||||
|
|
||||||
public static PaymentMethodId GetPaymentMethodId(this PayoutData data)
|
public static PaymentMethodId GetPaymentMethodId(this PayoutData data)
|
||||||
{
|
{
|
||||||
return PaymentMethodId.Parse(data.PaymentMethodId);
|
return PaymentMethodId.TryParse(data.PaymentMethodId, out var paymentMethodId)? paymentMethodId : null;
|
||||||
}
|
}
|
||||||
public static PayoutBlob GetBlob(this PayoutData data, BTCPayNetworkJsonSerializerSettings serializers)
|
public static PayoutBlob GetBlob(this PayoutData data, BTCPayNetworkJsonSerializerSettings serializers)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -171,7 +171,8 @@ namespace BTCPayServer.Data
|
|||||||
#pragma warning disable CS0618 // Type or member is obsolete
|
#pragma warning disable CS0618 // Type or member is obsolete
|
||||||
if (ExcludedPaymentMethods == null || ExcludedPaymentMethods.Length == 0)
|
if (ExcludedPaymentMethods == null || ExcludedPaymentMethods.Length == 0)
|
||||||
return PaymentFilter.Never();
|
return PaymentFilter.Never();
|
||||||
return PaymentFilter.Any(ExcludedPaymentMethods.Select(p => PaymentFilter.WhereIs(PaymentMethodId.Parse(p))).ToArray());
|
|
||||||
|
return PaymentFilter.Any(ExcludedPaymentMethods.ParsePaymentMethodIds().Select(PaymentFilter.WhereIs).ToArray());
|
||||||
#pragma warning restore CS0618 // Type or member is obsolete
|
#pragma warning restore CS0618 // Type or member is obsolete
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ namespace BTCPayServer.Data
|
|||||||
public static PaymentMethodId[] GetEnabledPaymentIds(this StoreData storeData, BTCPayNetworkProvider networks)
|
public static PaymentMethodId[] GetEnabledPaymentIds(this StoreData storeData, BTCPayNetworkProvider networks)
|
||||||
{
|
{
|
||||||
var excludeFilter = storeData.GetStoreBlob().GetExcludedPaymentMethods();
|
var excludeFilter = storeData.GetStoreBlob().GetExcludedPaymentMethods();
|
||||||
var paymentMethodIds = storeData.GetSupportedPaymentMethods(networks).Select(p => p.PaymentId)
|
var paymentMethodIds = storeData.GetSupportedPaymentMethods(networks)
|
||||||
|
.Select(p => p.PaymentId)
|
||||||
.Where(a => !excludeFilter.Match(a))
|
.Where(a => !excludeFilter.Match(a))
|
||||||
.OrderByDescending(a => a.CryptoCode == "BTC")
|
.OrderByDescending(a => a.CryptoCode == "BTC")
|
||||||
.ThenBy(a => a.CryptoCode)
|
.ThenBy(a => a.CryptoCode)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
@@ -482,6 +483,15 @@ namespace BTCPayServer
|
|||||||
"Supported chains: " + String.Join(',', supportedChains.ToArray()));
|
"Supported chains: " + String.Join(',', supportedChains.ToArray()));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static PaymentMethodId[] ParsePaymentMethodIds(this string[] paymentMethods)
|
||||||
|
{
|
||||||
|
return paymentMethods.Select(s =>
|
||||||
|
{
|
||||||
|
PaymentMethodId.TryParse(s, out var parsed);
|
||||||
|
return parsed;
|
||||||
|
}).Where(id => id != null).ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
public static DataDirectories Configure(this DataDirectories dataDirectories, IConfiguration configuration)
|
public static DataDirectories Configure(this DataDirectories dataDirectories, IConfiguration configuration)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -286,8 +286,13 @@ namespace BTCPayServer.HostedServices
|
|||||||
req.Completion.SetResult(PayoutApproval.Result.OldRevision);
|
req.Completion.SetResult(PayoutApproval.Result.OldRevision);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!PaymentMethodId.TryParse(payout.PaymentMethodId, out var paymentMethod))
|
||||||
|
{
|
||||||
|
req.Completion.SetResult(PayoutApproval.Result.NotFound);
|
||||||
|
return;
|
||||||
|
}
|
||||||
payout.State = PayoutState.AwaitingPayment;
|
payout.State = PayoutState.AwaitingPayment;
|
||||||
var paymentMethod = PaymentMethodId.Parse(payout.PaymentMethodId);
|
|
||||||
if (paymentMethod.CryptoCode == payout.PullPaymentData.GetBlob().Currency)
|
if (paymentMethod.CryptoCode == payout.PullPaymentData.GetBlob().Currency)
|
||||||
req.Rate = 1.0m;
|
req.Rate = 1.0m;
|
||||||
var cryptoAmount = payoutBlob.Amount / req.Rate;
|
var cryptoAmount = payoutBlob.Amount / req.Rate;
|
||||||
|
|||||||
@@ -290,7 +290,10 @@ namespace BTCPayServer.Services.Invoices
|
|||||||
JObject strategies = JObject.Parse(DerivationStrategies);
|
JObject strategies = JObject.Parse(DerivationStrategies);
|
||||||
foreach (var strat in strategies.Properties())
|
foreach (var strat in strategies.Properties())
|
||||||
{
|
{
|
||||||
var paymentMethodId = PaymentMethodId.Parse(strat.Name);
|
if (!PaymentMethodId.TryParse(strat.Name, out var paymentMethodId))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
var network = Networks.GetNetwork<BTCPayNetworkBase>(paymentMethodId.CryptoCode);
|
var network = Networks.GetNetwork<BTCPayNetworkBase>(paymentMethodId.CryptoCode);
|
||||||
if (network != null)
|
if (network != null)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user