From bf7ae178ef6ee7c13f3579d165380e66d7d1a7b3 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Sun, 17 Dec 2017 02:28:37 +0900 Subject: [PATCH] Fix #18, fix electrum format not recognizing standard p2pkh on testnet --- BTCPayServer/BTCPayServer.csproj | 2 +- BTCPayServer/Controllers/StoresController.cs | 4 +- .../Services/Rates/CoinAverageRateProvider.cs | 90 +++++-------------- 3 files changed, 27 insertions(+), 69 deletions(-) diff --git a/BTCPayServer/BTCPayServer.csproj b/BTCPayServer/BTCPayServer.csproj index 09e3c3255..0210f171c 100644 --- a/BTCPayServer/BTCPayServer.csproj +++ b/BTCPayServer/BTCPayServer.csproj @@ -2,7 +2,7 @@ Exe netcoreapp2.0 - 1.0.0.39 + 1.0.0.40 diff --git a/BTCPayServer/Controllers/StoresController.cs b/BTCPayServer/Controllers/StoresController.cs index cc4398098..a9918d39a 100644 --- a/BTCPayServer/Controllers/StoresController.cs +++ b/BTCPayServer/Controllers/StoresController.cs @@ -262,7 +262,7 @@ namespace BTCPayServer.Controllers //var p2wsh = 0x2aa7ed3U; Dictionary electrumMapping = new Dictionary(); //Source https://github.com/spesmilo/electrum/blob/9edffd17542de5773e7284a8c8a2673c766bb3c3/lib/bitcoin.py - var standard = 0x0488b21eU; + var standard = _Network == Network.Main ? 0x0488b21eU : 0x043587cf; electrumMapping.Add(standard, new[] { "legacy" }); var p2wpkh_p2sh = 0x049d7cb2U; electrumMapping.Add(p2wpkh_p2sh, new string[] { "p2sh" }); @@ -280,7 +280,7 @@ namespace BTCPayServer.Controllers for (int i = 0; i < 4; i++) data[i] = standardPrefix[i]; - derivationScheme = new BitcoinExtPubKey(Encoders.Base58Check.EncodeData(data), Network.Main).ToNetwork(_Network).ToString(); + derivationScheme = new BitcoinExtPubKey(Encoders.Base58Check.EncodeData(data), _Network).ToString(); foreach (var label in labels) { derivationScheme = derivationScheme + $"-[{label}]"; diff --git a/BTCPayServer/Services/Rates/CoinAverageRateProvider.cs b/BTCPayServer/Services/Rates/CoinAverageRateProvider.cs index da24ef519..6001a37c9 100644 --- a/BTCPayServer/Services/Rates/CoinAverageRateProvider.cs +++ b/BTCPayServer/Services/Rates/CoinAverageRateProvider.cs @@ -17,61 +17,6 @@ namespace BTCPayServer.Services.Rates } public class CoinAverageRateProvider : IRateProvider { - public class RatesJson - { - public class RateJson - { - public string Code - { - get; set; - } - public decimal Rate - { - get; set; - } - } - - [JsonProperty("rates")] - public JObject RatesInternal - { - get; set; - } - [JsonIgnore] - public List Rates - { - get; set; - } - - [JsonIgnore] - public Dictionary RatesByCurrency - { - get; set; - } - - public decimal GetRate(string currency) - { - if (!RatesByCurrency.TryGetValue(currency.ToUpperInvariant(), out decimal currUSD)) - throw new RateUnavailableException(currency); - - if (!RatesByCurrency.TryGetValue("BTC", out decimal btcUSD)) - throw new RateUnavailableException(currency); - - return currUSD / btcUSD; - } - public void CalculateDictionary() - { - RatesByCurrency = new Dictionary(); - Rates = new List(); - foreach (var rate in RatesInternal.OfType()) - { - var rateJson = new RateJson(); - rateJson.Code = rate.Name; - rateJson.Rate = decimal.Parse(rate.Value["rate"].Value(), System.Globalization.NumberStyles.AllowExponent | System.Globalization.NumberStyles.AllowDecimalPoint); - RatesByCurrency.Add(rate.Name, rateJson.Rate); - Rates.Add(rateJson); - } - } - } static HttpClient _Client = new HttpClient(); public string Market @@ -80,13 +25,20 @@ namespace BTCPayServer.Services.Rates } = "global"; public async Task GetRateAsync(string currency) { - RatesJson rates = await GetRatesCore(); - return rates.GetRate(currency); + var rates = await GetRatesCore(); + return GetRate(rates, currency); } - private async Task GetRatesCore() + private decimal GetRate(Dictionary rates, string currency) { - var resp = await _Client.GetAsync("https://apiv2.bitcoinaverage.com/constants/exchangerates/" + Market); + if (rates.TryGetValue(currency, out decimal result)) + return result; + throw new RateUnavailableException(currency); + } + + private async Task> GetRatesCore() + { + var resp = await _Client.GetAsync($"https://apiv2.bitcoinaverage.com/indices/{Market}/ticker/short"); using (resp) { @@ -97,19 +49,25 @@ namespace BTCPayServer.Services.Rates if ((int)resp.StatusCode == 403) throw new CoinAverageException("Unauthorized access to the API, premium plan needed"); resp.EnsureSuccessStatusCode(); - var rates = JsonConvert.DeserializeObject(await resp.Content.ReadAsStringAsync()); - rates.CalculateDictionary(); - return rates; + var rates = JObject.Parse(await resp.Content.ReadAsStringAsync()); + return rates.Properties() + .Where(p => p.Name.StartsWith("BTC", StringComparison.OrdinalIgnoreCase)) + .ToDictionary(p => p.Name.Substring(3, 3), p => ToDecimal(p.Value["last"])); } } + private decimal ToDecimal(JToken token) + { + return decimal.Parse(token.Value(), System.Globalization.NumberStyles.AllowExponent | System.Globalization.NumberStyles.AllowDecimalPoint); + } + public async Task> GetRatesAsync() { - RatesJson rates = await GetRatesCore(); - return rates.Rates.Select(o => new Rate() + var rates = await GetRatesCore(); + return rates.Select(o => new Rate() { - Currency = o.Code, - Value = rates.GetRate(o.Code) + Currency = o.Key, + Value = o.Value }).ToList(); } }