From 1879ea55e84828113db1a149c3df425448b44940 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Mon, 21 May 2018 16:49:37 +0200 Subject: [PATCH 01/11] init bitpay rates api --- BTCPayServer/Controllers/RateController.cs | 69 +++++++++++++++++++ BTCPayServer/DerivationStrategy.cs | 3 +- .../InvoiceNotificationManager.cs | 3 +- .../Payments/ISupportedPaymentMethod.cs | 1 + 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/BTCPayServer/Controllers/RateController.cs b/BTCPayServer/Controllers/RateController.cs index 9f5f9a4a2..1d10d8e01 100644 --- a/BTCPayServer/Controllers/RateController.cs +++ b/BTCPayServer/Controllers/RateController.cs @@ -31,6 +31,74 @@ namespace BTCPayServer.Controllers _CurrencyNameTable = currencyNameTable ?? throw new ArgumentNullException(nameof(currencyNameTable)); } + [Route("rates/{baseCurrency}/{currency}")] + [HttpGet] + [BitpayAPIConstraint] + public async Task GetCurrencyPairRate(string baseCurrency, string currency, string storeId) + { + storeId = storeId ?? this.HttpContext.GetStoreData()?.Id; + var result = await GetRates2($"{baseCurrency}_{currency}", storeId); + var rates = (result as JsonResult)?.Value as Rate[]; + if (rates == null) + return result; + return Json(new DataWrapper(rates.First())); + } + + + [Route("rates")] + [HttpGet] + [BitpayAPIConstraint] + public async Task GetRates() + { + var store = this.HttpContext.GetStoreData(); + var currencypairs = ""; + var supportedMethods = store.GetSupportedPaymentMethods(_NetworkProvider); + + foreach (var supportedPaymentMethod in supportedMethods) + { + if (!string.IsNullOrEmpty(currencypairs)) + { + currencypairs += ","; + } + + currencypairs += supportedPaymentMethod.CryptoCode + "_USD,"; + currencypairs += supportedPaymentMethod.CryptoCode + "_EUR"; + } + var result = await GetRates2(currencypairs, store.Id); + var rates = (result as JsonResult)?.Value as Rate[]; + if (rates == null) + return result; + return Json(new DataWrapper(rates.First())); + } + + [Route("rates/{baseCurrency}")] + [HttpGet] + [BitpayAPIConstraint] + public async Task GetRates(string baseCurrency) + { + var store = this.HttpContext.GetStoreData(); + var currencypairs = ""; + var supportedMethods = store.GetSupportedPaymentMethods(_NetworkProvider); + + currencypairs += baseCurrency + "_USD,"; + currencypairs += baseCurrency + "_EUR"; + foreach (var supportedPaymentMethod in supportedMethods) + { + if (!string.IsNullOrEmpty(currencypairs)) + { + currencypairs += ","; + } + + currencypairs += baseCurrency + "_ " +supportedPaymentMethod.CryptoCode +","; + currencypairs += baseCurrency + "_ " + supportedPaymentMethod.CryptoCode; + } + var result = await GetRates2(currencypairs, store.Id); + var rates = (result as JsonResult)?.Value as Rate[]; + if (rates == null) + return result; + return Json(new DataWrapper(rates.First())); + } + [Route("rates")] [HttpGet] [BitpayAPIConstraint] @@ -44,6 +112,7 @@ namespace BTCPayServer.Controllers return Json(new DataWrapper(rates)); } + [Route("api/rates")] [HttpGet] public async Task GetRates2(string currencyPairs, string storeId) diff --git a/BTCPayServer/DerivationStrategy.cs b/BTCPayServer/DerivationStrategy.cs index 88b8da710..f8626a68e 100644 --- a/BTCPayServer/DerivationStrategy.cs +++ b/BTCPayServer/DerivationStrategy.cs @@ -32,8 +32,9 @@ namespace BTCPayServer public BTCPayNetwork Network { get { return this._Network; } } - public DerivationStrategyBase DerivationStrategyBase { get { return this._DerivationStrategy; } } + public DerivationStrategyBase DerivationStrategyBase => this._DerivationStrategy; + public string CryptoCode => Network.CryptoCode; public PaymentMethodId PaymentId => new PaymentMethodId(Network.CryptoCode, PaymentTypes.BTCLike); public override string ToString() diff --git a/BTCPayServer/HostedServices/InvoiceNotificationManager.cs b/BTCPayServer/HostedServices/InvoiceNotificationManager.cs index 6605e11c8..8b713d973 100644 --- a/BTCPayServer/HostedServices/InvoiceNotificationManager.cs +++ b/BTCPayServer/HostedServices/InvoiceNotificationManager.cs @@ -202,7 +202,8 @@ namespace BTCPayServer.HostedServices PaymentSubtotals = dto.PaymentSubtotals, PaymentTotals = dto.PaymentTotals, AmountPaid = dto.AmountPaid, - ExchangeRates = dto.ExchangeRates + ExchangeRates = dto.ExchangeRates, + }; // We keep backward compatibility with bitpay by passing BTC info to the notification diff --git a/BTCPayServer/Payments/ISupportedPaymentMethod.cs b/BTCPayServer/Payments/ISupportedPaymentMethod.cs index 225786a04..ee7377fe5 100644 --- a/BTCPayServer/Payments/ISupportedPaymentMethod.cs +++ b/BTCPayServer/Payments/ISupportedPaymentMethod.cs @@ -13,6 +13,7 @@ namespace BTCPayServer.Payments /// public interface ISupportedPaymentMethod { + string CryptoCode { get;} PaymentMethodId PaymentId { get; } } } From 79df523bb24032e7fa7bfbc7221aa748d50cf2bc Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Mon, 28 May 2018 10:20:18 +0200 Subject: [PATCH 02/11] reorder methods --- BTCPayServer/Controllers/RateController.cs | 26 ++++++++++++---------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/BTCPayServer/Controllers/RateController.cs b/BTCPayServer/Controllers/RateController.cs index 1161a11e5..d0321cfec 100644 --- a/BTCPayServer/Controllers/RateController.cs +++ b/BTCPayServer/Controllers/RateController.cs @@ -31,18 +31,6 @@ namespace BTCPayServer.Controllers _CurrencyNameTable = currencyNameTable ?? throw new ArgumentNullException(nameof(currencyNameTable)); } - [Route("rates/{baseCurrency}/{currency}")] - [HttpGet] - [BitpayAPIConstraint] - public async Task GetCurrencyPairRate(string baseCurrency, string currency, string storeId) - { - storeId = storeId ?? this.HttpContext.GetStoreData()?.Id; - var result = await GetRates2($"{baseCurrency}_{currency}", storeId); - var rates = (result as JsonResult)?.Value as Rate[]; - if (rates == null) - return result; - return Json(new DataWrapper(rates.First())); - } [Route("rates")] @@ -99,6 +87,20 @@ namespace BTCPayServer.Controllers return Json(new DataWrapper(rates.First())); } + + [Route("rates/{baseCurrency}/{currency}")] + [HttpGet] + [BitpayAPIConstraint] + public async Task GetCurrencyPairRate(string baseCurrency, string currency, string storeId) + { + storeId = storeId ?? this.HttpContext.GetStoreData()?.Id; + var result = await GetRates2($"{baseCurrency}_{currency}", storeId); + var rates = (result as JsonResult)?.Value as Rate[]; + if (rates == null) + return result; + return Json(new DataWrapper(rates.First())); + } + [Route("rates")] [HttpGet] [BitpayAPIConstraint] From 6cf80b75334f45a59581ee38d3f978657cffd55f Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Mon, 28 May 2018 14:29:23 +0200 Subject: [PATCH 03/11] small rename --- BTCPayServer/Controllers/RateController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BTCPayServer/Controllers/RateController.cs b/BTCPayServer/Controllers/RateController.cs index d0321cfec..c7652942d 100644 --- a/BTCPayServer/Controllers/RateController.cs +++ b/BTCPayServer/Controllers/RateController.cs @@ -62,7 +62,7 @@ namespace BTCPayServer.Controllers [Route("rates/{baseCurrency}")] [HttpGet] [BitpayAPIConstraint] - public async Task GetRates(string baseCurrency) + public async Task GetBaseCurrencyRates(string baseCurrency) { var store = this.HttpContext.GetStoreData(); var currencypairs = ""; @@ -104,7 +104,7 @@ namespace BTCPayServer.Controllers [Route("rates")] [HttpGet] [BitpayAPIConstraint] - public async Task GetRates(string currencyPairs, string storeId) + public async Task GetBitPayRates(string currencyPairs, string storeId) { storeId = storeId ?? this.HttpContext.GetStoreData()?.Id; var result = await GetRates2(currencyPairs, storeId); From c8a26ce952cebcb581c42f3d82d94d9c4c68f35b Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Mon, 28 May 2018 14:55:49 +0200 Subject: [PATCH 04/11] api fixes --- BTCPayServer/Controllers/RateController.cs | 86 +++++++++++----------- 1 file changed, 45 insertions(+), 41 deletions(-) diff --git a/BTCPayServer/Controllers/RateController.cs b/BTCPayServer/Controllers/RateController.cs index c7652942d..8af41f899 100644 --- a/BTCPayServer/Controllers/RateController.cs +++ b/BTCPayServer/Controllers/RateController.cs @@ -31,54 +31,26 @@ namespace BTCPayServer.Controllers _CurrencyNameTable = currencyNameTable ?? throw new ArgumentNullException(nameof(currencyNameTable)); } - - - [Route("rates")] - [HttpGet] - [BitpayAPIConstraint] - public async Task GetRates() - { - var store = this.HttpContext.GetStoreData(); - var currencypairs = ""; - var supportedMethods = store.GetSupportedPaymentMethods(_NetworkProvider); - - foreach (var supportedPaymentMethod in supportedMethods) - { - if (!string.IsNullOrEmpty(currencypairs)) - { - currencypairs += ","; - } - - currencypairs += supportedPaymentMethod.CryptoCode + "_USD,"; - currencypairs += supportedPaymentMethod.CryptoCode + "_EUR"; - } - var result = await GetRates2(currencypairs, store.Id); - var rates = (result as JsonResult)?.Value as Rate[]; - if (rates == null) - return result; - return Json(new DataWrapper(rates.First())); - } - [Route("rates/{baseCurrency}")] [HttpGet] [BitpayAPIConstraint] public async Task GetBaseCurrencyRates(string baseCurrency) { - var store = this.HttpContext.GetStoreData(); + var store = this.HttpContext.GetStoreData(); var currencypairs = ""; var supportedMethods = store.GetSupportedPaymentMethods(_NetworkProvider); - currencypairs += baseCurrency + "_USD,"; - currencypairs += baseCurrency + "_EUR"; - foreach (var supportedPaymentMethod in supportedMethods) + var currencyCodes = supportedMethods.Where(method => !string.IsNullOrEmpty(method.CryptoCode)) + .Select(method => method.CryptoCode).Distinct(); + + + foreach (var currencyCode in currencyCodes) { if (!string.IsNullOrEmpty(currencypairs)) { currencypairs += ","; } - - currencypairs += baseCurrency + "_ " +supportedPaymentMethod.CryptoCode +","; - currencypairs += baseCurrency + "_ " + supportedPaymentMethod.CryptoCode; + currencypairs += baseCurrency + "_ " + currencyCode; } var result = await GetRates2(currencypairs, store.Id); var rates = (result as JsonResult)?.Value as Rate[]; @@ -104,7 +76,7 @@ namespace BTCPayServer.Controllers [Route("rates")] [HttpGet] [BitpayAPIConstraint] - public async Task GetBitPayRates(string currencyPairs, string storeId) + public async Task GetRates(string currencyPairs, string storeId) { storeId = storeId ?? this.HttpContext.GetStoreData()?.Id; var result = await GetRates2(currencyPairs, storeId); @@ -119,15 +91,14 @@ namespace BTCPayServer.Controllers [HttpGet] public async Task GetRates2(string currencyPairs, string storeId) { - if(storeId == null || currencyPairs == null) + if (storeId == null) { var result = Json(new BitpayErrorsModel() { Error = "You need to specify storeId (in your store settings) and currencyPairs (eg. BTC_USD,LTC_CAD)" }); result.StatusCode = 400; return result; } - var store = this.HttpContext.GetStoreData(); - if(store == null || store.Id != storeId) + if (store == null || store.Id != storeId) store = await _StoreRepo.FindStore(storeId); if (store == null) { @@ -135,12 +106,45 @@ namespace BTCPayServer.Controllers result.StatusCode = 404; return result; } + + if (currencyPairs == null) + { + currencyPairs = ""; + var supportedMethods = store.GetSupportedPaymentMethods(_NetworkProvider); + var currencyCodes = supportedMethods.Where(method => !string.IsNullOrEmpty(method.CryptoCode)) + .Select(method => method.CryptoCode).Distinct(); + + foreach (var currencyCode in currencyCodes) + { + foreach (var currencyCode2 in currencyCodes) + { + if (currencyCode == currencyCode2) + { + continue; + } + if (!string.IsNullOrEmpty(currencyPairs)) + { + currencyPairs += ","; + } + currencyPairs += $"{currencyCode}_{currencyCode2}"; + } + } + + if (string.IsNullOrEmpty(currencyPairs)) + { + var result = Json(new BitpayErrorsModel() { Error = "You need to specify storeId (in your store settings) and currencyPairs (eg. BTC_USD,LTC_CAD)" }); + result.StatusCode = 400; + return result; + } + } + + var rules = store.GetStoreBlob().GetRateRules(_NetworkProvider); HashSet pairs = new HashSet(); - foreach(var currency in currencyPairs.Split(',')) + foreach (var currency in currencyPairs.Split(',')) { - if(!CurrencyPair.TryParse(currency, out var pair)) + if (!CurrencyPair.TryParse(currency, out var pair)) { var result = Json(new BitpayErrorsModel() { Error = $"Currency pair {currency} uncorrectly formatted" }); result.StatusCode = 400; From ada6f3b8449898ed3d7fd7f7c0d6858d29d3503c Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Mon, 28 May 2018 15:30:43 +0200 Subject: [PATCH 05/11] Finish rate api --- BTCPayServer/Controllers/RateController.cs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/BTCPayServer/Controllers/RateController.cs b/BTCPayServer/Controllers/RateController.cs index 8af41f899..af8befe1b 100644 --- a/BTCPayServer/Controllers/RateController.cs +++ b/BTCPayServer/Controllers/RateController.cs @@ -33,10 +33,18 @@ namespace BTCPayServer.Controllers [Route("rates/{baseCurrency}")] [HttpGet] - [BitpayAPIConstraint] - public async Task GetBaseCurrencyRates(string baseCurrency) + public async Task GetBaseCurrencyRates(string baseCurrency, string storeId) { + storeId = storeId ?? this.HttpContext.GetStoreData()?.Id; var store = this.HttpContext.GetStoreData(); + if (store == null || store.Id != storeId) + store = await _StoreRepo.FindStore(storeId); + if (store == null) + { + var err = Json(new BitpayErrorsModel() { Error = "Store not found" }); + err.StatusCode = 404; + return err; + } var currencypairs = ""; var supportedMethods = store.GetSupportedPaymentMethods(_NetworkProvider); @@ -46,6 +54,10 @@ namespace BTCPayServer.Controllers foreach (var currencyCode in currencyCodes) { + if (baseCurrency == currencyCode) + { + continue; + } if (!string.IsNullOrEmpty(currencypairs)) { currencypairs += ","; @@ -56,13 +68,12 @@ namespace BTCPayServer.Controllers var rates = (result as JsonResult)?.Value as Rate[]; if (rates == null) return result; - return Json(new DataWrapper(rates.First())); + return Json(new DataWrapper(rates)); } [Route("rates/{baseCurrency}/{currency}")] [HttpGet] - [BitpayAPIConstraint] public async Task GetCurrencyPairRate(string baseCurrency, string currency, string storeId) { storeId = storeId ?? this.HttpContext.GetStoreData()?.Id; @@ -156,6 +167,7 @@ namespace BTCPayServer.Controllers var fetching = _RateProviderFactory.FetchRates(pairs, rules); await Task.WhenAll(fetching.Select(f => f.Value).ToArray()); return Json(pairs + .AsParallel() .Select(r => (Pair: r, Value: fetching[r].GetAwaiter().GetResult().Value)) .Where(r => r.Value.HasValue) .Select(r => From bac9ef4f930a7507fb51120a1443070299eb578a Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Tue, 29 May 2018 17:12:07 +0200 Subject: [PATCH 06/11] add some UT and fix error message + bump Nbitpayclient --- BTCPayServer.Tests/UnitTest1.cs | 35 ++++++++++++++++++++++ BTCPayServer/BTCPayServer.csproj | 2 +- BTCPayServer/Controllers/RateController.cs | 4 +-- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/BTCPayServer.Tests/UnitTest1.cs b/BTCPayServer.Tests/UnitTest1.cs index 1e8a23067..9f7c1a6c0 100644 --- a/BTCPayServer.Tests/UnitTest1.cs +++ b/BTCPayServer.Tests/UnitTest1.cs @@ -35,6 +35,7 @@ using BTCPayServer.Services.Apps; using BTCPayServer.Services.Stores; using System.Net.Http; using System.Text; +using BTCPayServer.Models; using BTCPayServer.Rating; using BTCPayServer.Validation; using ExchangeSharp; @@ -677,6 +678,40 @@ namespace BTCPayServer.Tests } } + [Fact] + public void CanGetRates() + { + using (var tester = ServerTester.Create()) + { + tester.Start(); + var acc = tester.NewAccount(); + acc.GrantAccess(); + acc.RegisterDerivationScheme("BTC"); + acc.RegisterDerivationScheme("LTC"); + + var rateController = acc.GetController(); + var GetBaseCurrencyRatesResult = JObject.Parse(((JsonResult)rateController.GetBaseCurrencyRates("BTC", acc.StoreId) + .GetAwaiter().GetResult()).ToJson()).ToObject>(); + Assert.NotNull(GetBaseCurrencyRatesResult); + Assert.NotNull(GetBaseCurrencyRatesResult.Data); + Assert.Single(GetBaseCurrencyRatesResult.Data); + Assert.Equal("LTC", GetBaseCurrencyRatesResult.Data.First().Code); + + var GetRatesResult = JObject.Parse(((JsonResult)rateController.GetRates(null, acc.StoreId) + .GetAwaiter().GetResult()).ToJson()).ToObject>(); + Assert.NotNull(GetRatesResult); + Assert.NotNull(GetRatesResult.Data); + Assert.Equal(2, GetRatesResult.Data.Length); + + var GetCurrencyPairRateResult = JObject.Parse(((JsonResult)rateController.GetCurrencyPairRate("BTC", "LTC", acc.StoreId) + .GetAwaiter().GetResult()).ToJson()).ToObject>(); + + Assert.NotNull(GetCurrencyPairRateResult); + Assert.NotNull(GetCurrencyPairRateResult.Data); + Assert.Equal("LTC", GetCurrencyPairRateResult.Data.Code); + } + } + private void AssertSearchInvoice(TestAccount acc, bool expected, string invoiceId, string filter) { var result = (Models.InvoicingModels.InvoicesModel)((ViewResult)acc.GetController().ListInvoices(filter).Result).Model; diff --git a/BTCPayServer/BTCPayServer.csproj b/BTCPayServer/BTCPayServer.csproj index bf7662173..6d16a1a98 100644 --- a/BTCPayServer/BTCPayServer.csproj +++ b/BTCPayServer/BTCPayServer.csproj @@ -41,7 +41,7 @@ - + diff --git a/BTCPayServer/Controllers/RateController.cs b/BTCPayServer/Controllers/RateController.cs index af8befe1b..1df51e8e8 100644 --- a/BTCPayServer/Controllers/RateController.cs +++ b/BTCPayServer/Controllers/RateController.cs @@ -104,7 +104,7 @@ namespace BTCPayServer.Controllers { if (storeId == null) { - var result = Json(new BitpayErrorsModel() { Error = "You need to specify storeId (in your store settings) and currencyPairs (eg. BTC_USD,LTC_CAD)" }); + var result = Json(new BitpayErrorsModel() { Error = "You need to specify storeId (in your store settings)" }); result.StatusCode = 400; return result; } @@ -143,7 +143,7 @@ namespace BTCPayServer.Controllers if (string.IsNullOrEmpty(currencyPairs)) { - var result = Json(new BitpayErrorsModel() { Error = "You need to specify storeId (in your store settings) and currencyPairs (eg. BTC_USD,LTC_CAD)" }); + var result = Json(new BitpayErrorsModel() { Error = "You need to specify currencyPairs (eg. BTC_USD,LTC_CAD)" }); result.StatusCode = 400; return result; } From 25e9a27a78e9cd2e1d3f776373c7351327c0951b Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Fri, 27 Jul 2018 06:38:54 +0200 Subject: [PATCH 07/11] add in bitpay api constraints to actions --- BTCPayServer/Controllers/RateController.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BTCPayServer/Controllers/RateController.cs b/BTCPayServer/Controllers/RateController.cs index 1df51e8e8..7334d6786 100644 --- a/BTCPayServer/Controllers/RateController.cs +++ b/BTCPayServer/Controllers/RateController.cs @@ -33,6 +33,7 @@ namespace BTCPayServer.Controllers [Route("rates/{baseCurrency}")] [HttpGet] + [BitpayAPIConstraint] public async Task GetBaseCurrencyRates(string baseCurrency, string storeId) { storeId = storeId ?? this.HttpContext.GetStoreData()?.Id; @@ -74,6 +75,7 @@ namespace BTCPayServer.Controllers [Route("rates/{baseCurrency}/{currency}")] [HttpGet] + [BitpayAPIConstraint] public async Task GetCurrencyPairRate(string baseCurrency, string currency, string storeId) { storeId = storeId ?? this.HttpContext.GetStoreData()?.Id; From 64181d1a938880973157efb2e7ae5f4e3cce2853 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Fri, 27 Jul 2018 07:54:55 +0200 Subject: [PATCH 08/11] use default crypto for /rates route --- BTCPayServer/Controllers/InvoiceController.UI.cs | 2 +- BTCPayServer/Controllers/RateController.cs | 15 +++++---------- BTCPayServer/Controllers/StoresController.cs | 4 ++-- BTCPayServer/Data/StoreData.cs | 4 ++-- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/BTCPayServer/Controllers/InvoiceController.UI.cs b/BTCPayServer/Controllers/InvoiceController.UI.cs index 76ba4f472..378f081c9 100644 --- a/BTCPayServer/Controllers/InvoiceController.UI.cs +++ b/BTCPayServer/Controllers/InvoiceController.UI.cs @@ -213,7 +213,7 @@ namespace BTCPayServer.Controllers bool isDefaultCrypto = false; if (paymentMethodIdStr == null) { - paymentMethodIdStr = store.GetDefaultCrypto(); + paymentMethodIdStr = store.GetDefaultCrypto(_NetworkProvider); isDefaultCrypto = true; } diff --git a/BTCPayServer/Controllers/RateController.cs b/BTCPayServer/Controllers/RateController.cs index 7334d6786..7dea18d5d 100644 --- a/BTCPayServer/Controllers/RateController.cs +++ b/BTCPayServer/Controllers/RateController.cs @@ -126,23 +126,18 @@ namespace BTCPayServer.Controllers var supportedMethods = store.GetSupportedPaymentMethods(_NetworkProvider); var currencyCodes = supportedMethods.Where(method => !string.IsNullOrEmpty(method.CryptoCode)) .Select(method => method.CryptoCode).Distinct(); + var defaultCrypto = store.GetDefaultCrypto(_NetworkProvider); foreach (var currencyCode in currencyCodes) { - foreach (var currencyCode2 in currencyCodes) + if (!string.IsNullOrEmpty(currencyPairs)) { - if (currencyCode == currencyCode2) - { - continue; - } - if (!string.IsNullOrEmpty(currencyPairs)) - { - currencyPairs += ","; - } - currencyPairs += $"{currencyCode}_{currencyCode2}"; + currencyPairs += ","; } + currencyPairs += $"{defaultCrypto}_{currencyCode}"; } + if (string.IsNullOrEmpty(currencyPairs)) { var result = Json(new BitpayErrorsModel() { Error = "You need to specify currencyPairs (eg. BTC_USD,LTC_CAD)" }); diff --git a/BTCPayServer/Controllers/StoresController.cs b/BTCPayServer/Controllers/StoresController.cs index daef61110..358e06ce5 100644 --- a/BTCPayServer/Controllers/StoresController.cs +++ b/BTCPayServer/Controllers/StoresController.cs @@ -317,7 +317,7 @@ namespace BTCPayServer.Controllers { var storeBlob = StoreData.GetStoreBlob(); var vm = new CheckoutExperienceViewModel(); - vm.SetCryptoCurrencies(_ExplorerProvider, StoreData.GetDefaultCrypto()); + vm.SetCryptoCurrencies(_ExplorerProvider, StoreData.GetDefaultCrypto(_NetworkProvider)); vm.SetLanguages(_LangService, storeBlob.DefaultLang); vm.LightningMaxValue = storeBlob.LightningMaxValue?.ToString() ?? ""; vm.OnChainMinValue = storeBlob.OnChainMinValue?.ToString() ?? ""; @@ -352,7 +352,7 @@ namespace BTCPayServer.Controllers } bool needUpdate = false; var blob = StoreData.GetStoreBlob(); - if (StoreData.GetDefaultCrypto() != model.DefaultCryptoCurrency) + if (StoreData.GetDefaultCrypto(_NetworkProvider) != model.DefaultCryptoCurrency) { needUpdate = true; StoreData.SetDefaultCrypto(model.DefaultCryptoCurrency); diff --git a/BTCPayServer/Data/StoreData.cs b/BTCPayServer/Data/StoreData.cs index 2aff5f446..5d2b0fb81 100644 --- a/BTCPayServer/Data/StoreData.cs +++ b/BTCPayServer/Data/StoreData.cs @@ -197,9 +197,9 @@ namespace BTCPayServer.Data public IEnumerable APIKeys { get; set; } #pragma warning disable CS0618 - public string GetDefaultCrypto() + public string GetDefaultCrypto(BTCPayNetworkProvider networkProvider = null) { - return DefaultCrypto ?? "BTC"; + return DefaultCrypto ?? (networkProvider == null? "BTC" : GetSupportedPaymentMethods(networkProvider).First().CryptoCode); } public void SetDefaultCrypto(string defaultCryptoCurrency) { From 2c6133b4f7365fadba3d470e8790122b3158b780 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Fri, 27 Jul 2018 07:55:18 +0200 Subject: [PATCH 09/11] let X_X rates show in rates api as bitpay does --- BTCPayServer/Controllers/RateController.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/BTCPayServer/Controllers/RateController.cs b/BTCPayServer/Controllers/RateController.cs index 7dea18d5d..dd6e54939 100644 --- a/BTCPayServer/Controllers/RateController.cs +++ b/BTCPayServer/Controllers/RateController.cs @@ -55,10 +55,6 @@ namespace BTCPayServer.Controllers foreach (var currencyCode in currencyCodes) { - if (baseCurrency == currencyCode) - { - continue; - } if (!string.IsNullOrEmpty(currencypairs)) { currencypairs += ","; From 42769942655dbdad68cfcf461c276f371445a354 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Fri, 27 Jul 2018 07:55:42 +0200 Subject: [PATCH 10/11] fix bitpayconstraint for rates --- BTCPayServer/Hosting/BTCpayMiddleware.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BTCPayServer/Hosting/BTCpayMiddleware.cs b/BTCPayServer/Hosting/BTCpayMiddleware.cs index a74c8d723..a6808b37b 100644 --- a/BTCPayServer/Hosting/BTCpayMiddleware.cs +++ b/BTCPayServer/Hosting/BTCpayMiddleware.cs @@ -100,7 +100,7 @@ namespace BTCPayServer.Hosting (isJson || httpContext.Request.Query.ContainsKey("token"))) return true; - if (path.Equals("/rates", StringComparison.OrdinalIgnoreCase) && + if (path.StartsWith("/rates", StringComparison.OrdinalIgnoreCase) && httpContext.Request.Method == "GET") return true; From 1a54f2d01a041b41b4e870eba3a9baaafb61ffe1 Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Fri, 27 Jul 2018 08:41:36 +0200 Subject: [PATCH 11/11] remove redundant cryptocode field in payment method interface --- BTCPayServer/Controllers/RateController.cs | 8 ++++---- BTCPayServer/Data/StoreData.cs | 2 +- BTCPayServer/DerivationStrategy.cs | 1 - BTCPayServer/Payments/ISupportedPaymentMethod.cs | 1 - 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/BTCPayServer/Controllers/RateController.cs b/BTCPayServer/Controllers/RateController.cs index dd6e54939..f595a7f49 100644 --- a/BTCPayServer/Controllers/RateController.cs +++ b/BTCPayServer/Controllers/RateController.cs @@ -49,8 +49,8 @@ namespace BTCPayServer.Controllers var currencypairs = ""; var supportedMethods = store.GetSupportedPaymentMethods(_NetworkProvider); - var currencyCodes = supportedMethods.Where(method => !string.IsNullOrEmpty(method.CryptoCode)) - .Select(method => method.CryptoCode).Distinct(); + var currencyCodes = supportedMethods.Where(method => !string.IsNullOrEmpty(method.PaymentId.CryptoCode)) + .Select(method => method.PaymentId.CryptoCode).Distinct(); foreach (var currencyCode in currencyCodes) @@ -120,8 +120,8 @@ namespace BTCPayServer.Controllers { currencyPairs = ""; var supportedMethods = store.GetSupportedPaymentMethods(_NetworkProvider); - var currencyCodes = supportedMethods.Where(method => !string.IsNullOrEmpty(method.CryptoCode)) - .Select(method => method.CryptoCode).Distinct(); + var currencyCodes = supportedMethods.Where(method => !string.IsNullOrEmpty(method.PaymentId.CryptoCode)) + .Select(method => method.PaymentId.CryptoCode).Distinct(); var defaultCrypto = store.GetDefaultCrypto(_NetworkProvider); foreach (var currencyCode in currencyCodes) diff --git a/BTCPayServer/Data/StoreData.cs b/BTCPayServer/Data/StoreData.cs index 5d2b0fb81..5fcb772ac 100644 --- a/BTCPayServer/Data/StoreData.cs +++ b/BTCPayServer/Data/StoreData.cs @@ -199,7 +199,7 @@ namespace BTCPayServer.Data #pragma warning disable CS0618 public string GetDefaultCrypto(BTCPayNetworkProvider networkProvider = null) { - return DefaultCrypto ?? (networkProvider == null? "BTC" : GetSupportedPaymentMethods(networkProvider).First().CryptoCode); + return DefaultCrypto ?? (networkProvider == null? "BTC" : GetSupportedPaymentMethods(networkProvider).First().PaymentId.CryptoCode); } public void SetDefaultCrypto(string defaultCryptoCurrency) { diff --git a/BTCPayServer/DerivationStrategy.cs b/BTCPayServer/DerivationStrategy.cs index f8626a68e..463cb4a75 100644 --- a/BTCPayServer/DerivationStrategy.cs +++ b/BTCPayServer/DerivationStrategy.cs @@ -34,7 +34,6 @@ namespace BTCPayServer public DerivationStrategyBase DerivationStrategyBase => this._DerivationStrategy; - public string CryptoCode => Network.CryptoCode; public PaymentMethodId PaymentId => new PaymentMethodId(Network.CryptoCode, PaymentTypes.BTCLike); public override string ToString() diff --git a/BTCPayServer/Payments/ISupportedPaymentMethod.cs b/BTCPayServer/Payments/ISupportedPaymentMethod.cs index ee7377fe5..225786a04 100644 --- a/BTCPayServer/Payments/ISupportedPaymentMethod.cs +++ b/BTCPayServer/Payments/ISupportedPaymentMethod.cs @@ -13,7 +13,6 @@ namespace BTCPayServer.Payments /// public interface ISupportedPaymentMethod { - string CryptoCode { get;} PaymentMethodId PaymentId { get; } } }