From 999090dbdbd0fd5472c966b8fe1d6b14a3b09dff Mon Sep 17 00:00:00 2001 From: Umar Bolatov Date: Wed, 17 Aug 2022 22:55:21 -0700 Subject: [PATCH] Add Yadio exchange rate provider Yadio is a service which provides exchange rates for many currencies such as the Lebanese Pound which have the real exchange rate which differs from the official rate significantly (32,525 LBP for USD real rate vs 1,510 official rate). See more details here: https://yadio.io/info.html See discussions here: https://github.com/btcpayserver/btcpayserver/discussions/4001 https://github.com/btcpayserver/btcpayserver/discussions/2489#discussioncomment-3102370 --- .../Providers/YadioRateProvider.cs | 42 +++++++++++++++++++ .../Services/RateProviderFactory.cs | 2 + BTCPayServer.Tests/ThirdPartyTests.cs | 6 +++ 3 files changed, 50 insertions(+) create mode 100644 BTCPayServer.Rating/Providers/YadioRateProvider.cs diff --git a/BTCPayServer.Rating/Providers/YadioRateProvider.cs b/BTCPayServer.Rating/Providers/YadioRateProvider.cs new file mode 100644 index 000000000..b5bf177d7 --- /dev/null +++ b/BTCPayServer.Rating/Providers/YadioRateProvider.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using BTCPayServer.Rating; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json; + +namespace BTCPayServer.Services.Rates +{ + public class YadioRateProvider : IRateProvider + { + private readonly HttpClient _httpClient; + public YadioRateProvider(HttpClient httpClient) + { + _httpClient = httpClient ?? new HttpClient(); + } + + public async Task GetRatesAsync(CancellationToken cancellationToken) + { + var response = await _httpClient.GetAsync("https://api.yadio.io/exrates/BTC", cancellationToken); + response.EnsureSuccessStatusCode(); + var jobj = await response.Content.ReadAsAsync(cancellationToken); + var results = jobj["BTC"]; + var list = new List(); + foreach (var item in results) + { + + string name = ((JProperty)item).Name; + int value = results[name].Value(); + + list.Add(new PairRate(new CurrencyPair("BTC", name), new BidAsk(value))); + } + + return list.ToArray(); + } + } +} diff --git a/BTCPayServer.Rating/Services/RateProviderFactory.cs b/BTCPayServer.Rating/Services/RateProviderFactory.cs index b1d3808ac..ce9fbf9fd 100644 --- a/BTCPayServer.Rating/Services/RateProviderFactory.cs +++ b/BTCPayServer.Rating/Services/RateProviderFactory.cs @@ -84,6 +84,7 @@ namespace BTCPayServer.Services.Rates yield return new AvailableRateProvider("coinbasepro", "Coinbase Pro", "https://api.pro.coinbase.com/products"); yield return new AvailableRateProvider("argoneum", "Argoneum", "https://rates.argoneum.net/rates"); + yield return new AvailableRateProvider("yadio", "Yadio", "https://api.yadio.io/exrates/BTC"); } void InitExchanges() { @@ -104,6 +105,7 @@ namespace BTCPayServer.Services.Rates Providers.Add("ripio", new RipioExchangeProvider(_httpClientFactory?.CreateClient("EXCHANGE_RIPIO"))); Providers.Add("cryptomarket", new CryptoMarketExchangeRateProvider(_httpClientFactory?.CreateClient("EXCHANGE_CRYPTOMARKET"))); Providers.Add("bitflyer", new BitflyerRateProvider(_httpClientFactory?.CreateClient("EXCHANGE_BITFLYER"))); + Providers.Add("yadio", new YadioRateProvider(_httpClientFactory?.CreateClient("EXCHANGE_YADIO"))); // Providers.Add("argoneum", new ArgoneumRateProvider(_httpClientFactory?.CreateClient("EXCHANGE_ARGONEUM"))); diff --git a/BTCPayServer.Tests/ThirdPartyTests.cs b/BTCPayServer.Tests/ThirdPartyTests.cs index 94dd9a711..4b0f6ed8a 100644 --- a/BTCPayServer.Tests/ThirdPartyTests.cs +++ b/BTCPayServer.Tests/ThirdPartyTests.cs @@ -126,6 +126,12 @@ namespace BTCPayServer.Tests e => e.CurrencyPair == new CurrencyPair("BTC", "CLP") && e.BidAsk.Bid > 1.0m); // 1 BTC will always be more than 1 CLP } + else if (name == "yadio") + { + Assert.Contains(exchangeRates.ByExchange[name], + e => e.CurrencyPair == new CurrencyPair("BTC", "LBP") && + e.BidAsk.Bid > 1.0m); // 1 BTC will always be more than 1 LBP (I hope) + } else { if (name == "kraken")