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();
}
}