Bump and fix rate providers (#3813)

* Bump and fix rate providers

* fix
This commit is contained in:
Andrew Camilleri 2022-06-06 11:56:50 +02:00 committed by GitHub
parent a443426d83
commit ae10d0c7fd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 27 additions and 27 deletions

View file

@ -8,7 +8,7 @@
<PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="5.2.7" />
<PackageReference Include="NBitcoin" Version="7.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="DigitalRuby.ExchangeSharp" Version="0.6.3" />
<PackageReference Include="DigitalRuby.ExchangeSharp" Version="1.0.2" />
</ItemGroup>
<ItemGroup>

View file

@ -10,26 +10,20 @@ using ExchangeSharp;
namespace BTCPayServer.Services.Rates
{
public class ExchangeSharpRateProvider<T> : IRateProvider where T : ExchangeAPI, new()
public class ExchangeSharpRateProvider<T> : IRateProvider where T : ExchangeAPI
{
readonly HttpClient _httpClient;
public ExchangeSharpRateProvider(HttpClient httpClient, bool reverseCurrencyPair = false)
public ExchangeSharpRateProvider(HttpClient httpClient)
{
ArgumentNullException.ThrowIfNull(httpClient);
ReverseCurrencyPair = reverseCurrencyPair;
_httpClient = httpClient;
}
public bool ReverseCurrencyPair
{
get; set;
}
public async Task<PairRate[]> GetRatesAsync(CancellationToken cancellationToken)
{
await new SynchronizationContextRemover();
var exchangeAPI = new T();
var exchangeAPI = (T) await ExchangeAPI.GetExchangeAPIAsync<T>();
exchangeAPI.RequestMaker = new HttpClientRequestMaker(exchangeAPI, _httpClient, cancellationToken);
var rates = await exchangeAPI.GetTickersAsync();
@ -52,14 +46,20 @@ namespace BTCPayServer.Services.Rates
return null;
try
{
var tickerName = await exchangeAPI.ExchangeMarketSymbolToGlobalMarketSymbolAsync(ticker.Key);
if (!CurrencyPair.TryParse(tickerName, out var pair))
CurrencyPair pair;
if (ticker.Value.Volume.BaseCurrency is not null && ticker.Value.Volume.QuoteCurrency is not null)
{
notFoundSymbols.TryAdd(ticker.Key, ticker.Key);
return null;
pair = new CurrencyPair(ticker.Value.Volume.BaseCurrency, ticker.Value.Volume.QuoteCurrency);
}
else
{
var tickerName = await exchangeAPI.ExchangeMarketSymbolToGlobalMarketSymbolAsync(ticker.Key);
if (!CurrencyPair.TryParse(tickerName, out pair))
{
notFoundSymbols.TryAdd(ticker.Key, ticker.Key);
return null;
}
}
if (ReverseCurrencyPair)
pair = new CurrencyPair(pair.Right, pair.Left);
return new PairRate(pair, new BidAsk(ticker.Value.Bid, ticker.Value.Ask));
}
catch (ArgumentException)

View file

@ -108,7 +108,7 @@ namespace BTCPayServer.Services.Rates
set;
}
public async Task<string> MakeRequestAsync(string url, string baseUrl = null, Dictionary<string, object> payload = null, string method = null)
public async Task<IAPIRequestMaker.RequestResult<string>> MakeRequestAsync(string url, string baseUrl = null, Dictionary<string, object> payload = null, string method = null)
{
await default(SynchronizationContextRemover);
await api.RateLimit.WaitToProceedAsync();
@ -170,7 +170,11 @@ namespace BTCPayServer.Services.Rates
{
response?.Dispose();
}
return responseString;
return new IAPIRequestMaker.RequestResult<string>()
{
Response = responseString,
HTTPHeaderDate = response.Headers.Date
};
}
}
}

View file

@ -16,12 +16,7 @@ namespace BTCPayServer.Services.Rates
// Make sure that only one request is sent to kraken in general
public class KrakenExchangeRateProvider : IRateProvider
{
public KrakenExchangeRateProvider()
{
_Helper = new ExchangeKrakenAPI();
}
readonly ExchangeKrakenAPI _Helper;
public HttpClient HttpClient
{
get
@ -88,7 +83,8 @@ namespace BTCPayServer.Services.Rates
{
var result = new List<PairRate>();
var symbols = await GetSymbolsAsync(cancellationToken);
var normalizedPairsList = symbols.Where(s => !notFoundSymbols.ContainsKey(s)).Select(s => _Helper.NormalizeMarketSymbol(s)).ToList();
var helper = (ExchangeKrakenAPI)await ExchangeAPI.GetExchangeAPIAsync<ExchangeKrakenAPI>();
var normalizedPairsList = symbols.Where(s => !notFoundSymbols.ContainsKey(s)).Select(s => helper.NormalizeMarketSymbol(s)).ToList();
var csvPairsList = string.Join(",", normalizedPairsList);
JToken apiTickers = await MakeJsonRequestAsync<JToken>("/0/public/Ticker", null, new Dictionary<string, object> { { "pair", csvPairsList } }, cancellationToken: cancellationToken);
var tickers = new List<KeyValuePair<string, ExchangeTicker>>();
@ -111,7 +107,7 @@ namespace BTCPayServer.Services.Rates
}
else
{
global = await _Helper.ExchangeMarketSymbolToGlobalMarketSymbolAsync(symbol);
global = await helper.ExchangeMarketSymbolToGlobalMarketSymbolAsync(symbol);
}
if (CurrencyPair.TryParse(global, out var pair))
result.Add(new PairRate(pair.Inverse(), new BidAsk(ticker.Bid, ticker.Ask)));

View file

@ -141,9 +141,9 @@ namespace BTCPayServer.Services.Rates
}
}
private IRateProvider AddExchangeSharpProviders<T>(string providerName) where T : ExchangeAPI, new()
private IRateProvider AddExchangeSharpProviders<T>(string providerName) where T : ExchangeAPI
{
var provider = new ExchangeSharpRateProvider<T>(_httpClientFactory.CreateClient($"EXCHANGE_{providerName}".ToUpperInvariant()), true);
var provider = new ExchangeSharpRateProvider<T>(_httpClientFactory.CreateClient($"EXCHANGE_{providerName}".ToUpperInvariant()));
Providers.Add(providerName, provider);
return provider;
}