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;