diff --git a/BTCPayServer/BTCPayServer.csproj b/BTCPayServer/BTCPayServer.csproj
index 0f49a117d..6a1d0baa0 100644
--- a/BTCPayServer/BTCPayServer.csproj
+++ b/BTCPayServer/BTCPayServer.csproj
@@ -2,7 +2,7 @@
Exe
netcoreapp2.1
- 1.0.2.97
+ 1.0.2.98
NU1701,CA1816,CA1308,CA1810,CA2208
diff --git a/BTCPayServer/Services/Rates/BackgroundFetcherRateProvider.cs b/BTCPayServer/Services/Rates/BackgroundFetcherRateProvider.cs
index 80b655e3b..8a0871a84 100644
--- a/BTCPayServer/Services/Rates/BackgroundFetcherRateProvider.cs
+++ b/BTCPayServer/Services/Rates/BackgroundFetcherRateProvider.cs
@@ -1,9 +1,11 @@
using System;
+using Microsoft.Extensions.Logging;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.ExceptionServices;
using System.Threading.Tasks;
using BTCPayServer.Data;
+using BTCPayServer.Logging;
using BTCPayServer.Rating;
namespace BTCPayServer.Services.Rates
@@ -73,7 +75,20 @@ namespace BTCPayServer.Services.Rates
LatestFetch _Latest;
public async Task GetRatesAsync()
{
- return (_Latest ?? (await Fetch())).GetResult();
+ var latest = _Latest;
+ if(latest != null && latest.Expiration <= DateTimeOffset.UtcNow + TimeSpan.FromSeconds(1.0))
+ {
+ Logs.PayServer.LogWarning($"GetRatesAsync was called on {GetExchangeName()} when the rate is outdated. It should never happen, let BTCPayServer developers know about this.");
+ latest = null;
+ }
+ return (latest ?? (await Fetch())).GetResult();
+ }
+
+ private string GetExchangeName()
+ {
+ if (_Inner is IHasExchangeName exchangeName)
+ return exchangeName.ExchangeName ?? "???";
+ return "???";
}
private async Task Fetch()
diff --git a/BTCPayServer/Services/Rates/BitpayRateProvider.cs b/BTCPayServer/Services/Rates/BitpayRateProvider.cs
index 3571ad1b8..dc86729b1 100644
--- a/BTCPayServer/Services/Rates/BitpayRateProvider.cs
+++ b/BTCPayServer/Services/Rates/BitpayRateProvider.cs
@@ -9,7 +9,7 @@ using BTCPayServer.Rating;
namespace BTCPayServer.Services.Rates
{
- public class BitpayRateProvider : IRateProvider
+ public class BitpayRateProvider : IRateProvider, IHasExchangeName
{
public const string BitpayName = "bitpay";
Bitpay _Bitpay;
@@ -20,6 +20,8 @@ namespace BTCPayServer.Services.Rates
_Bitpay = bitpay;
}
+ public string ExchangeName => BitpayName;
+
public async Task GetRatesAsync()
{
return new ExchangeRates((await _Bitpay.GetRatesAsync().ConfigureAwait(false))
diff --git a/BTCPayServer/Services/Rates/CachedRateProvider.cs b/BTCPayServer/Services/Rates/CachedRateProvider.cs
index 416e34136..046d32bf4 100644
--- a/BTCPayServer/Services/Rates/CachedRateProvider.cs
+++ b/BTCPayServer/Services/Rates/CachedRateProvider.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.Caching.Memory;
namespace BTCPayServer.Services.Rates
{
- public class CachedRateProvider : IRateProvider
+ public class CachedRateProvider : IRateProvider, IHasExchangeName
{
private IRateProvider _Inner;
private IMemoryCache _MemoryCache;
@@ -31,7 +31,7 @@ namespace BTCPayServer.Services.Rates
}
}
- public string ExchangeName { get; set; }
+ public string ExchangeName { get; }
public TimeSpan CacheSpan
{
diff --git a/BTCPayServer/Services/Rates/CoinAverageRateProvider.cs b/BTCPayServer/Services/Rates/CoinAverageRateProvider.cs
index b0fc7b441..0bd2d27a8 100644
--- a/BTCPayServer/Services/Rates/CoinAverageRateProvider.cs
+++ b/BTCPayServer/Services/Rates/CoinAverageRateProvider.cs
@@ -49,7 +49,7 @@ namespace BTCPayServer.Services.Rates
Task AddHeader(HttpRequestMessage message);
}
- public class CoinAverageRateProvider : IRateProvider
+ public class CoinAverageRateProvider : IRateProvider, IHasExchangeName
{
public const string CoinAverageName = "coinaverage";
public CoinAverageRateProvider()
@@ -82,6 +82,8 @@ namespace BTCPayServer.Services.Rates
public ICoinAverageAuthenticator Authenticator { get; set; }
+ public string ExchangeName => Exchange ?? CoinAverageName;
+
private bool TryToBidAsk(JProperty p, out BidAsk bidAsk)
{
bidAsk = null;
diff --git a/BTCPayServer/Services/Rates/ExchangeSharpRateProvider.cs b/BTCPayServer/Services/Rates/ExchangeSharpRateProvider.cs
index 230749db2..622958a84 100644
--- a/BTCPayServer/Services/Rates/ExchangeSharpRateProvider.cs
+++ b/BTCPayServer/Services/Rates/ExchangeSharpRateProvider.cs
@@ -10,7 +10,7 @@ using ExchangeSharp;
namespace BTCPayServer.Services.Rates
{
- public class ExchangeSharpRateProvider : IRateProvider
+ public class ExchangeSharpRateProvider : IRateProvider, IHasExchangeName
{
readonly ExchangeAPI _ExchangeAPI;
readonly string _ExchangeName;
@@ -29,6 +29,8 @@ namespace BTCPayServer.Services.Rates
get; set;
}
+ public string ExchangeName => _ExchangeName;
+
public async Task GetRatesAsync()
{
await new SynchronizationContextRemover();
diff --git a/BTCPayServer/Services/Rates/IHasExchangeName.cs b/BTCPayServer/Services/Rates/IHasExchangeName.cs
new file mode 100644
index 000000000..5d9fed6c3
--- /dev/null
+++ b/BTCPayServer/Services/Rates/IHasExchangeName.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace BTCPayServer.Services.Rates
+{
+ public interface IHasExchangeName
+ {
+ string ExchangeName { get; }
+ }
+}
diff --git a/BTCPayServer/Services/Rates/KrakenExchangeRateProvider.cs b/BTCPayServer/Services/Rates/KrakenExchangeRateProvider.cs
index af95d530a..1e0ea947a 100644
--- a/BTCPayServer/Services/Rates/KrakenExchangeRateProvider.cs
+++ b/BTCPayServer/Services/Rates/KrakenExchangeRateProvider.cs
@@ -13,7 +13,7 @@ using Newtonsoft.Json.Linq;
namespace BTCPayServer.Services.Rates
{
// Make sure that only one request is sent to kraken in general
- public class KrakenExchangeRateProvider : IRateProvider
+ public class KrakenExchangeRateProvider : IRateProvider, IHasExchangeName
{
public KrakenExchangeRateProvider()
{
@@ -31,6 +31,9 @@ namespace BTCPayServer.Services.Rates
_LocalClient = null;
}
}
+
+ public string ExchangeName => "kraken";
+
HttpClient _LocalClient;
static HttpClient _Client = new HttpClient();
diff --git a/BTCPayServer/Services/Rates/QuadrigacxRateProvider.cs b/BTCPayServer/Services/Rates/QuadrigacxRateProvider.cs
index 381392ca9..477d131d2 100644
--- a/BTCPayServer/Services/Rates/QuadrigacxRateProvider.cs
+++ b/BTCPayServer/Services/Rates/QuadrigacxRateProvider.cs
@@ -9,11 +9,13 @@ using Newtonsoft.Json.Linq;
namespace BTCPayServer.Services.Rates
{
- public class QuadrigacxRateProvider : IRateProvider
+ public class QuadrigacxRateProvider : IRateProvider, IHasExchangeName
{
public const string QuadrigacxName = "quadrigacx";
static HttpClient _Client = new HttpClient();
+ public string ExchangeName => QuadrigacxName;
+
private bool TryToBidAsk(JObject p, out BidAsk v)
{
v = null;