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"); + } + } +}