From 7d545ca6821e2e43bcb5a92bd8a20eb4a80448ba Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Fri, 17 Jan 2020 14:16:12 +0900 Subject: [PATCH] Remove ability to set custom cache, fix coinaverage not really using coinaverage --- BTCPayServer.Rating/AvailableRateProvider.cs | 8 +++- .../BackgroundFetcherRateProvider.cs | 8 +++- .../Providers/CoinAverageRateProvider.cs | 3 -- .../Services/RateProviderFactory.cs | 45 ++++++++----------- BTCPayServer/Controllers/ServerController.cs | 2 - .../HostedServices/RatesHostedService.cs | 1 - .../Models/ServerViewModels/RatesViewModel.cs | 3 -- .../Models/StoreViewModels/RatesViewModel.cs | 2 +- BTCPayServer/Views/Server/Rates.cshtml | 5 --- 9 files changed, 34 insertions(+), 43 deletions(-) diff --git a/BTCPayServer.Rating/AvailableRateProvider.cs b/BTCPayServer.Rating/AvailableRateProvider.cs index 74c636cb4..f9a024510 100644 --- a/BTCPayServer.Rating/AvailableRateProvider.cs +++ b/BTCPayServer.Rating/AvailableRateProvider.cs @@ -11,11 +11,17 @@ namespace BTCPayServer.Rating public string Name { get; } public string Url { get; } public string Id { get; } + public string SourceId { get; } public RateSource Source { get; } - public AvailableRateProvider(string id, string name, string url, RateSource source) + public AvailableRateProvider(string id, string name, string url) : this(id, id, name, url, RateSource.Direct) + { + + } + public AvailableRateProvider(string id, string sourceId, string name, string url, RateSource source) { Id = id; + SourceId = sourceId; Name = name; Url = url; Source = source; diff --git a/BTCPayServer.Rating/Providers/BackgroundFetcherRateProvider.cs b/BTCPayServer.Rating/Providers/BackgroundFetcherRateProvider.cs index d2f80d701..ea6f9335e 100644 --- a/BTCPayServer.Rating/Providers/BackgroundFetcherRateProvider.cs +++ b/BTCPayServer.Rating/Providers/BackgroundFetcherRateProvider.cs @@ -54,7 +54,7 @@ namespace BTCPayServer.Services.Rates } /// - /// This class is a decorator which handle caching and pre-emptive query to the underlying exchange + /// This class is a decorator which handle caching and pre-emptive query to the underlying rate provider /// public class BackgroundFetcherRateProvider : IRateProvider { @@ -139,6 +139,9 @@ namespace BTCPayServer.Services.Rates } TimeSpan _RefreshRate = TimeSpan.FromSeconds(30); + /// + /// The timespan after which will get the rates from the underlying rate provider + /// public TimeSpan RefreshRate { get @@ -156,6 +159,9 @@ namespace BTCPayServer.Services.Rates } TimeSpan _ValidatyTime = TimeSpan.FromMinutes(10); + /// + /// The timespan after which calls to will fails if the rate has not been updated + /// public TimeSpan ValidatyTime { get diff --git a/BTCPayServer.Rating/Providers/CoinAverageRateProvider.cs b/BTCPayServer.Rating/Providers/CoinAverageRateProvider.cs index dbd504ad3..960d5d290 100644 --- a/BTCPayServer.Rating/Providers/CoinAverageRateProvider.cs +++ b/BTCPayServer.Rating/Providers/CoinAverageRateProvider.cs @@ -23,9 +23,6 @@ namespace BTCPayServer.Services.Rates { public string PublicKey { get; set; } public string PrivateKey { get; set; } - [DefaultValue(15)] - [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] - public int CacheInMinutes { get; set; } = 15; } public interface ICoinAverageAuthenticator diff --git a/BTCPayServer.Rating/Services/RateProviderFactory.cs b/BTCPayServer.Rating/Services/RateProviderFactory.cs index e177eee12..711d21436 100644 --- a/BTCPayServer.Rating/Services/RateProviderFactory.cs +++ b/BTCPayServer.Rating/Services/RateProviderFactory.cs @@ -100,18 +100,18 @@ namespace BTCPayServer.Services.Rates } internal IEnumerable GetDirectlySupportedExchanges() { - yield return new AvailableRateProvider("binance", "Binance", "https://api.binance.com/api/v1/ticker/24hr", RateSource.Direct); - yield return new AvailableRateProvider("bittrex", "Bittrex", "https://bittrex.com/api/v1.1/public/getmarketsummaries", RateSource.Direct); - yield return new AvailableRateProvider("poloniex", "Poloniex", "https://poloniex.com/public?command=returnTicker", RateSource.Direct); - yield return new AvailableRateProvider("hitbtc", "HitBTC", "https://api.hitbtc.com/api/2/public/ticker", RateSource.Direct); - yield return new AvailableRateProvider("ndax", "NDAX", "https://ndax.io/api/returnTicker", RateSource.Direct); + yield return new AvailableRateProvider("binance", "Binance", "https://api.binance.com/api/v1/ticker/24hr"); + yield return new AvailableRateProvider("bittrex", "Bittrex", "https://bittrex.com/api/v1.1/public/getmarketsummaries"); + yield return new AvailableRateProvider("poloniex", "Poloniex", "https://poloniex.com/public?command=returnTicker"); + yield return new AvailableRateProvider("hitbtc", "HitBTC", "https://api.hitbtc.com/api/2/public/ticker"); + yield return new AvailableRateProvider("ndax", "NDAX", "https://ndax.io/api/returnTicker"); - yield return new AvailableRateProvider(CoinGeckoRateProvider.CoinGeckoName, "Coin Gecko", "https://api.coingecko.com/api/v3/exchange_rates", RateSource.Direct); - yield return new AvailableRateProvider(CoinAverageRateProvider.CoinAverageName, "Coin Average", "https://apiv2.bitcoinaverage.com/indices/global/ticker/short", RateSource.Direct); - yield return new AvailableRateProvider("kraken", "Kraken", "https://api.kraken.com/0/public/Ticker?pair=ATOMETH,ATOMEUR,ATOMUSD,ATOMXBT,BATETH,BATEUR,BATUSD,BATXBT,BCHEUR,BCHUSD,BCHXBT,DAIEUR,DAIUSD,DAIUSDT,DASHEUR,DASHUSD,DASHXBT,EOSETH,EOSXBT,ETHCHF,ETHDAI,ETHUSDC,ETHUSDT,GNOETH,GNOXBT,ICXETH,ICXEUR,ICXUSD,ICXXBT,LINKETH,LINKEUR,LINKUSD,LINKXBT,LSKETH,LSKEUR,LSKUSD,LSKXBT,NANOETH,NANOEUR,NANOUSD,NANOXBT,OMGETH,OMGEUR,OMGUSD,OMGXBT,PAXGETH,PAXGEUR,PAXGUSD,PAXGXBT,SCETH,SCEUR,SCUSD,SCXBT,USDCEUR,USDCUSD,USDCUSDT,USDTCAD,USDTEUR,USDTGBP,USDTZUSD,WAVESETH,WAVESEUR,WAVESUSD,WAVESXBT,XBTCHF,XBTDAI,XBTUSDC,XBTUSDT,XDGEUR,XDGUSD,XETCXETH,XETCXXBT,XETCZEUR,XETCZUSD,XETHXXBT,XETHZCAD,XETHZEUR,XETHZGBP,XETHZJPY,XETHZUSD,XLTCXXBT,XLTCZEUR,XLTCZUSD,XMLNXETH,XMLNXXBT,XMLNZEUR,XMLNZUSD,XREPXETH,XREPXXBT,XREPZEUR,XXBTZCAD,XXBTZEUR,XXBTZGBP,XXBTZJPY,XXBTZUSD,XXDGXXBT,XXLMXXBT,XXMRXXBT,XXMRZEUR,XXMRZUSD,XXRPXXBT,XXRPZEUR,XXRPZUSD,XZECXXBT,XZECZEUR,XZECZUSD", RateSource.Direct); - yield return new AvailableRateProvider("bylls", "Bylls", "https://bylls.com/api/price?from_currency=BTC&to_currency=CAD", RateSource.Direct); - yield return new AvailableRateProvider("bitbank", "Bitbank", "https://public.bitbank.cc/prices", RateSource.Direct); - yield return new AvailableRateProvider("bitpay", "Bitpay", "https://bitpay.com/rates", RateSource.Direct); + yield return new AvailableRateProvider(CoinGeckoRateProvider.CoinGeckoName, "Coin Gecko", "https://api.coingecko.com/api/v3/exchange_rates"); + yield return new AvailableRateProvider(CoinAverageRateProvider.CoinAverageName, "Coin Average", "https://apiv2.bitcoinaverage.com/indices/global/ticker/short"); + yield return new AvailableRateProvider("kraken", "Kraken", "https://api.kraken.com/0/public/Ticker?pair=ATOMETH,ATOMEUR,ATOMUSD,ATOMXBT,BATETH,BATEUR,BATUSD,BATXBT,BCHEUR,BCHUSD,BCHXBT,DAIEUR,DAIUSD,DAIUSDT,DASHEUR,DASHUSD,DASHXBT,EOSETH,EOSXBT,ETHCHF,ETHDAI,ETHUSDC,ETHUSDT,GNOETH,GNOXBT,ICXETH,ICXEUR,ICXUSD,ICXXBT,LINKETH,LINKEUR,LINKUSD,LINKXBT,LSKETH,LSKEUR,LSKUSD,LSKXBT,NANOETH,NANOEUR,NANOUSD,NANOXBT,OMGETH,OMGEUR,OMGUSD,OMGXBT,PAXGETH,PAXGEUR,PAXGUSD,PAXGXBT,SCETH,SCEUR,SCUSD,SCXBT,USDCEUR,USDCUSD,USDCUSDT,USDTCAD,USDTEUR,USDTGBP,USDTZUSD,WAVESETH,WAVESEUR,WAVESUSD,WAVESXBT,XBTCHF,XBTDAI,XBTUSDC,XBTUSDT,XDGEUR,XDGUSD,XETCXETH,XETCXXBT,XETCZEUR,XETCZUSD,XETHXXBT,XETHZCAD,XETHZEUR,XETHZGBP,XETHZJPY,XETHZUSD,XLTCXXBT,XLTCZEUR,XLTCZUSD,XMLNXETH,XMLNXXBT,XMLNZEUR,XMLNZUSD,XREPXETH,XREPXXBT,XREPZEUR,XXBTZCAD,XXBTZEUR,XXBTZGBP,XXBTZJPY,XXBTZUSD,XXDGXXBT,XXLMXXBT,XXMRXXBT,XXMRZEUR,XXMRZUSD,XXRPXXBT,XXRPZEUR,XXRPZUSD,XZECXXBT,XZECZEUR,XZECZUSD"); + yield return new AvailableRateProvider("bylls", "Bylls", "https://bylls.com/api/price?from_currency=BTC&to_currency=CAD"); + yield return new AvailableRateProvider("bitbank", "Bitbank", "https://public.bitbank.cc/prices"); + yield return new AvailableRateProvider("bitpay", "Bitpay", "https://bitpay.com/rates"); } void InitExchanges() { @@ -141,16 +141,8 @@ namespace BTCPayServer.Services.Rates if (provider.Key == "cryptopia") // Shitty exchange, rate often unavailable, it spams the logs continue; var prov = new BackgroundFetcherRateProvider(provider.Key, Providers[provider.Key]); - if (provider.Key == CoinGeckoRateProvider.CoinGeckoName) - { - prov.RefreshRate = CacheSpan; - prov.ValidatyTime = CacheSpan + TimeSpan.FromMinutes(1.0); - } - else - { - prov.RefreshRate = TimeSpan.FromMinutes(1.0); - prov.ValidatyTime = TimeSpan.FromMinutes(5.0); - } + prov.RefreshRate = TimeSpan.FromMinutes(1.0); + prov.ValidatyTime = TimeSpan.FromMinutes(5.0); Providers[provider.Key] = prov; } @@ -174,8 +166,9 @@ namespace BTCPayServer.Services.Rates { if (!Providers.ContainsKey(supportedExchange.Id)) { - var coinAverage = new CoinGeckoRateProvider(_httpClientFactory) + var coinAverage = new CoinAverageRateProvider() { + HttpClient = _httpClientFactory.CreateClient("RATEPROVIDER_COINAVERAGE"), Exchange = supportedExchange.Id }; var cached = new CachedRateProvider(supportedExchange.Id, coinAverage, cache) @@ -275,17 +268,17 @@ namespace BTCPayServer.Services.Rates (DisplayName: "itBit", Name: "itbit"), }) { - yield return new AvailableRateProvider(item.Name, item.DisplayName, $"https://apiv2.bitcoinaverage.com/exchanges/{item.Name}", RateSource.CoinAverage); + yield return new AvailableRateProvider(item.Name, item.Name, item.DisplayName, $"https://apiv2.bitcoinaverage.com/exchanges/{item.Name}", RateSource.CoinAverage); } - yield return new AvailableRateProvider("gdax", string.Empty, $"https://apiv2.bitcoinaverage.com/exchanges/gdax", RateSource.CoinAverage); + yield return new AvailableRateProvider("gdax", "coinbasepro", string.Empty, $"https://apiv2.bitcoinaverage.com/exchanges/coinbasepro", RateSource.CoinAverage); } internal IEnumerable GetCoinGeckoSupportedExchanges() { return JArray.Parse(CoinGeckoRateProvider.SupportedExchanges).Select(token => - new AvailableRateProvider(Normalize(token["id"].ToString().ToLowerInvariant()), token["name"].ToString(), + new AvailableRateProvider(Normalize(token["id"].ToString().ToLowerInvariant()), token["id"].ToString().ToLowerInvariant(), token["name"].ToString(), $"https://api.coingecko.com/api/v3/exchanges/{token["id"]}/tickers", RateSource.Coingecko)) - .Concat(new[] { new AvailableRateProvider("gdax", string.Empty, $"https://api.coingecko.com/api/v3/exchanges/gdax", RateSource.Coingecko) }); + .Concat(new[] { new AvailableRateProvider("gdax", "gdax", string.Empty, $"https://api.coingecko.com/api/v3/exchanges/gdax", RateSource.Coingecko) }); } private string Normalize(string name) diff --git a/BTCPayServer/Controllers/ServerController.cs b/BTCPayServer/Controllers/ServerController.cs index 2d732b0f9..066b50a81 100644 --- a/BTCPayServer/Controllers/ServerController.cs +++ b/BTCPayServer/Controllers/ServerController.cs @@ -91,7 +91,6 @@ namespace BTCPayServer.Controllers var vm = new RatesViewModel() { - CacheMinutes = rates.CacheInMinutes, PrivateKey = rates.PrivateKey, PublicKey = rates.PublicKey }; @@ -119,7 +118,6 @@ namespace BTCPayServer.Controllers var rates = (await _SettingsRepository.GetSettingAsync()) ?? new RatesSetting(); rates.PrivateKey = vm.PrivateKey; rates.PublicKey = vm.PublicKey; - rates.CacheInMinutes = vm.CacheMinutes; try { var service = GetCoinaverageService(vm, true); diff --git a/BTCPayServer/HostedServices/RatesHostedService.cs b/BTCPayServer/HostedServices/RatesHostedService.cs index b75f4f562..1b091bb88 100644 --- a/BTCPayServer/HostedServices/RatesHostedService.cs +++ b/BTCPayServer/HostedServices/RatesHostedService.cs @@ -146,7 +146,6 @@ namespace BTCPayServer.HostedServices async Task RefreshCoinAverageSettings() { var rates = (await _SettingsRepository.GetSettingAsync()) ?? new RatesSetting(); - _RateProviderFactory.CacheSpan = TimeSpan.FromMinutes(rates.CacheInMinutes); if (!string.IsNullOrWhiteSpace(rates.PrivateKey) && !string.IsNullOrWhiteSpace(rates.PublicKey)) { _coinAverageSettings.KeyPair = (rates.PublicKey, rates.PrivateKey); diff --git a/BTCPayServer/Models/ServerViewModels/RatesViewModel.cs b/BTCPayServer/Models/ServerViewModels/RatesViewModel.cs index b72f1ba49..903468cce 100644 --- a/BTCPayServer/Models/ServerViewModels/RatesViewModel.cs +++ b/BTCPayServer/Models/ServerViewModels/RatesViewModel.cs @@ -12,9 +12,6 @@ namespace BTCPayServer.Models.ServerViewModels [Display(Name = "Bitcoin average api keys")] public string PublicKey { get; set; } public string PrivateKey { get; set; } - [Display(Name = "Cache the rates for ... minutes")] - [Range(0, 60)] - public int CacheMinutes { get; set; } public GetRateLimitsResponse RateLimits { get; internal set; } } } diff --git a/BTCPayServer/Models/StoreViewModels/RatesViewModel.cs b/BTCPayServer/Models/StoreViewModels/RatesViewModel.cs index 0341ed1ab..4382208b6 100644 --- a/BTCPayServer/Models/StoreViewModels/RatesViewModel.cs +++ b/BTCPayServer/Models/StoreViewModels/RatesViewModel.cs @@ -19,7 +19,7 @@ namespace BTCPayServer.Models.StoreViewModels public void SetExchangeRates(IEnumerable supportedList, string preferredExchange) { var defaultStore = preferredExchange ?? CoinGeckoRateProvider.CoinGeckoName; - supportedList = supportedList.Select(a => new AvailableRateProvider(a.Id, GetName(a), a.Url, a.Source)).ToArray(); + supportedList = supportedList.Select(a => new AvailableRateProvider(a.Id, a.SourceId, GetName(a), a.Url, a.Source)).ToArray(); var chosen = supportedList.FirstOrDefault(f => f.Id == defaultStore) ?? supportedList.FirstOrDefault(); Exchanges = new SelectList(supportedList, nameof(chosen.Id), nameof(chosen.Name), chosen); PreferredExchange = chosen.Id; diff --git a/BTCPayServer/Views/Server/Rates.cshtml b/BTCPayServer/Views/Server/Rates.cshtml index 58e48e119..14095a9b4 100644 --- a/BTCPayServer/Views/Server/Rates.cshtml +++ b/BTCPayServer/Views/Server/Rates.cshtml @@ -28,11 +28,6 @@

You can find the information on the bitcoinaverage api key page

-
- - - -
@if(Model.RateLimits != null) {
Current Bitcoin Average Quotas: