diff --git a/BTCPayServer/BTCPayServer.csproj b/BTCPayServer/BTCPayServer.csproj
index fc422f0a8..f0d9b42fa 100644
--- a/BTCPayServer/BTCPayServer.csproj
+++ b/BTCPayServer/BTCPayServer.csproj
@@ -2,7 +2,7 @@
Exe
netcoreapp2.0
- 1.0.0.38
+ 1.0.0.39
diff --git a/BTCPayServer/Hosting/BTCPayServerServices.cs b/BTCPayServer/Hosting/BTCPayServerServices.cs
index c970ef178..756923dd2 100644
--- a/BTCPayServer/Hosting/BTCPayServerServices.cs
+++ b/BTCPayServer/Hosting/BTCPayServerServices.cs
@@ -141,7 +141,9 @@ namespace BTCPayServer.Hosting
});
services.TryAddSingleton(o =>
{
- return new CachedRateProvider(new CoinAverageRateProvider(), o.GetRequiredService()) { CacheSpan = TimeSpan.FromMinutes(1.0) };
+ var coinaverage = new CoinAverageRateProvider();
+ var bitpay = new BitpayRateProvider(new Bitpay(new Key(), new Uri("https://bitpay.com/")));
+ return new CachedRateProvider(new FallbackRateProvider(new IRateProvider[] { coinaverage, bitpay }), o.GetRequiredService()) { CacheSpan = TimeSpan.FromMinutes(1.0) };
});
services.TryAddSingleton();
services.TryAddSingleton();
diff --git a/BTCPayServer/Services/Rates/FallbackRateProvider.cs b/BTCPayServer/Services/Rates/FallbackRateProvider.cs
new file mode 100644
index 000000000..59e57c0f3
--- /dev/null
+++ b/BTCPayServer/Services/Rates/FallbackRateProvider.cs
@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace BTCPayServer.Services.Rates
+{
+ public class FallbackRateProvider : IRateProvider
+ {
+ IRateProvider[] _Providers;
+ public FallbackRateProvider(IRateProvider[] providers)
+ {
+ if (providers == null)
+ throw new ArgumentNullException(nameof(providers));
+ _Providers = providers;
+ }
+ public async Task GetRateAsync(string currency)
+ {
+ foreach(var p in _Providers)
+ {
+ try
+ {
+ return await p.GetRateAsync(currency).ConfigureAwait(false);
+ }
+ catch { }
+ }
+ throw new RateUnavailableException(currency);
+ }
+
+ public async Task> GetRatesAsync()
+ {
+ foreach (var p in _Providers)
+ {
+ try
+ {
+ return await p.GetRatesAsync().ConfigureAwait(false);
+ }
+ catch { }
+ }
+ throw new RateUnavailableException("ALL");
+ }
+ }
+}