diff --git a/BTCPayServer/Controllers/InvoiceController.cs b/BTCPayServer/Controllers/InvoiceController.cs index ef1ef1645..ebe7b2322 100644 --- a/BTCPayServer/Controllers/InvoiceController.cs +++ b/BTCPayServer/Controllers/InvoiceController.cs @@ -83,12 +83,23 @@ namespace BTCPayServer.Controllers .Select(c => (Handler: (IPaymentMethodHandler)_ServiceProvider.GetService(typeof(IPaymentMethodHandler<>).MakeGenericType(c.GetType())), SupportedPaymentMethod: c, - Network: _NetworkProvider.GetNetwork(c.PaymentId.CryptoCode))) - .Where(c => - c.Network != null && - c.Handler.IsAvailable(c.SupportedPaymentMethod, c.Network)) - .ToArray(); - if (supportedPaymentMethods.Length == 0) + Network: _NetworkProvider.GetNetwork(c.PaymentId.CryptoCode), + IsAvailable: Task.FromResult(false))) + .Where(c => c.Network != null) + .Select(c => + { + c.IsAvailable = c.Handler.IsAvailable(c.SupportedPaymentMethod, c.Network); + return c; + }) + .ToList(); + foreach(var supportedPaymentMethod in supportedPaymentMethods.ToList()) + { + if(!await supportedPaymentMethod.IsAvailable) + { + supportedPaymentMethods.Remove(supportedPaymentMethod); + } + } + if (supportedPaymentMethods.Count == 0) throw new BitpayHttpException(400, "No derivation strategy are available now for this store"); var entity = new InvoiceEntity { diff --git a/BTCPayServer/Payments/Bitcoin/BitcoinLikePaymentHandler.cs b/BTCPayServer/Payments/Bitcoin/BitcoinLikePaymentHandler.cs index de8dd1468..47e9a2410 100644 --- a/BTCPayServer/Payments/Bitcoin/BitcoinLikePaymentHandler.cs +++ b/BTCPayServer/Payments/Bitcoin/BitcoinLikePaymentHandler.cs @@ -38,9 +38,9 @@ namespace BTCPayServer.Payments.Bitcoin return onchainMethod; } - public override bool IsAvailable(DerivationStrategy supportedPaymentMethod, BTCPayNetwork network) + public override Task IsAvailable(DerivationStrategy supportedPaymentMethod, BTCPayNetwork network) { - return _ExplorerProvider.IsAvailable(network); + return Task.FromResult(_ExplorerProvider.IsAvailable(network)); } } } diff --git a/BTCPayServer/Payments/IPaymentMethodHandler.cs b/BTCPayServer/Payments/IPaymentMethodHandler.cs index 77b78ae37..db9884e2d 100644 --- a/BTCPayServer/Payments/IPaymentMethodHandler.cs +++ b/BTCPayServer/Payments/IPaymentMethodHandler.cs @@ -17,7 +17,7 @@ namespace BTCPayServer.Payments /// /// /// true if this payment method is available - bool IsAvailable(ISupportedPaymentMethod supportedPaymentMethod, BTCPayNetwork network); + Task IsAvailable(ISupportedPaymentMethod supportedPaymentMethod, BTCPayNetwork network); /// /// Create needed to track payments of this invoice @@ -31,7 +31,7 @@ namespace BTCPayServer.Payments public interface IPaymentMethodHandler : IPaymentMethodHandler where T : ISupportedPaymentMethod { - bool IsAvailable(T supportedPaymentMethod, BTCPayNetwork network); + Task IsAvailable(T supportedPaymentMethod, BTCPayNetwork network); Task CreatePaymentMethodDetails(T supportedPaymentMethod, PaymentMethod paymentMethod, BTCPayNetwork network); } @@ -48,15 +48,15 @@ namespace BTCPayServer.Payments throw new NotSupportedException("Invalid supportedPaymentMethod"); } - public abstract bool IsAvailable(T supportedPaymentMethod, BTCPayNetwork network); + public abstract Task IsAvailable(T supportedPaymentMethod, BTCPayNetwork network); - bool IPaymentMethodHandler.IsAvailable(ISupportedPaymentMethod supportedPaymentMethod, BTCPayNetwork network) + Task IPaymentMethodHandler.IsAvailable(ISupportedPaymentMethod supportedPaymentMethod, BTCPayNetwork network) { if(supportedPaymentMethod is T method) { return IsAvailable(method, network); } - return false; + return Task.FromResult(false); } } }