diff --git a/BTCPayServer.Tests/ThirdPartyTests.cs b/BTCPayServer.Tests/ThirdPartyTests.cs index f211d43a5..f284cc084 100644 --- a/BTCPayServer.Tests/ThirdPartyTests.cs +++ b/BTCPayServer.Tests/ThirdPartyTests.cs @@ -356,13 +356,13 @@ retry: { var factory = FastTests.CreateBTCPayRateFactory(); var fetcher = new RateFetcher(factory); - var provider = CreateNetworkProvider(ChainName.Mainnet); + var provider = CreateDefaultRates(ChainName.Mainnet); var b = new StoreBlob(); string[] temporarilyBroken = Array.Empty(); foreach (var k in StoreBlob.RecommendedExchanges) { b.DefaultCurrency = k.Key; - var rules = b.GetDefaultRateRules(provider); + var rules = b.GetDefaultRateRules(provider.Select(p => p.DefaultRates)); var pairs = new[] { CurrencyPair.Parse($"BTC_{k.Key}") }.ToHashSet(); var result = fetcher.FetchRates(pairs, rules, null, default); foreach ((CurrencyPair key, Task value) in result) @@ -389,11 +389,11 @@ retry: public async Task CanGetRateCryptoCurrenciesByDefault() { using var cts = new CancellationTokenSource(60_000); - var provider = CreateNetworkProvider(ChainName.Mainnet); + var provider = CreateDefaultRates(ChainName.Mainnet); var factory = FastTests.CreateBTCPayRateFactory(); var fetcher = new RateFetcher(factory); var pairs = - provider.GetAll() + provider .Select(c => new CurrencyPair(c.CryptoCode, "USD")) .ToHashSet(); @@ -408,7 +408,7 @@ retry: } } - var rules = new StoreBlob().GetDefaultRateRules(provider); + var rules = new StoreBlob().GetDefaultRateRules(provider.Select(p => p.DefaultRates)); var result = fetcher.FetchRates(pairs, rules, null, cts.Token); foreach ((CurrencyPair key, Task value) in result) { @@ -418,6 +418,17 @@ retry: } } + private IEnumerable<(string CryptoCode, DefaultRates DefaultRates)> CreateDefaultRates(ChainName chainName) + { + var results = new List<(string CryptoCode, DefaultRates DefaultRates)>(); + var prov = CreateNetworkProvider(chainName); + foreach (var network in prov.GetAll()) + { + results.Add((network.CryptoCode, new DefaultRates(network.DefaultRateRules))); + } + return results; + } + [Fact] [Trait("Fast", "Fast")] public async Task CheckJsContent() diff --git a/BTCPayServer/Components/WalletNav/WalletNav.cs b/BTCPayServer/Components/WalletNav/WalletNav.cs index 1eb61e8ef..95426a953 100644 --- a/BTCPayServer/Components/WalletNav/WalletNav.cs +++ b/BTCPayServer/Components/WalletNav/WalletNav.cs @@ -18,6 +18,8 @@ using BTCPayServer.Services.Wallets; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; +using Microsoft.AspNetCore.Mvc.ViewComponents; +using Microsoft.AspNetCore.Mvc.ViewFeatures; using NBitcoin; using NBitcoin.Secp256k1; @@ -29,29 +31,31 @@ namespace BTCPayServer.Components.WalletNav private readonly PaymentMethodHandlerDictionary _handlers; private readonly UIWalletsController _walletsController; private readonly CurrencyNameTable _currencies; - private readonly BTCPayNetworkProvider _networkProvider; + private readonly IEnumerable _defaultRates; private readonly RateFetcher _rateFetcher; public WalletNav( BTCPayWalletProvider walletProvider, PaymentMethodHandlerDictionary handlers, - BTCPayNetworkProvider networkProvider, UIWalletsController walletsController, CurrencyNameTable currencies, + IEnumerable defaultRates, RateFetcher rateFetcher) { _walletProvider = walletProvider; _handlers = handlers; - _networkProvider = networkProvider; _walletsController = walletsController; _currencies = currencies; + _defaultRates = defaultRates; _rateFetcher = rateFetcher; } public async Task InvokeAsync(WalletId walletId) { var store = ViewContext.HttpContext.GetStoreData(); - var network = _networkProvider.GetNetwork(walletId.CryptoCode); + var network = _handlers.TryGetNetwork(PaymentTypes.CHAIN.GetPaymentMethodId(walletId.CryptoCode)); + if (network is null) + return new HtmlContentViewComponentResult(new StringHtmlContent(string.Empty)); var wallet = _walletProvider.GetWallet(network); var defaultCurrency = store.GetStoreBlob().DefaultCurrency; var derivation = store.GetDerivationSchemeSettings(_handlers, walletId.CryptoCode); @@ -72,7 +76,7 @@ namespace BTCPayServer.Components.WalletNav if (defaultCurrency != network.CryptoCode) { - var rule = store.GetStoreBlob().GetRateRules(_networkProvider)?.GetRuleFor(new Rating.CurrencyPair(network.CryptoCode, defaultCurrency)); + var rule = store.GetStoreBlob().GetRateRules(_defaultRates)?.GetRuleFor(new Rating.CurrencyPair(network.CryptoCode, defaultCurrency)); var bid = rule is null ? null : (await _rateFetcher.FetchRate(rule, new StoreIdRateContext(walletId.StoreId), HttpContext.RequestAborted)).BidAsk?.Bid; if (bid is decimal b) { diff --git a/BTCPayServer/Controllers/BitpayRateController.cs b/BTCPayServer/Controllers/BitpayRateController.cs index 7a25c081a..d1a96b249 100644 --- a/BTCPayServer/Controllers/BitpayRateController.cs +++ b/BTCPayServer/Controllers/BitpayRateController.cs @@ -30,8 +30,8 @@ namespace BTCPayServer.Controllers { readonly RateFetcher _rateProviderFactory; - readonly BTCPayNetworkProvider _networkProvider; readonly CurrencyNameTable _currencyNameTable; + private readonly IEnumerable _defaultRates; private readonly PaymentMethodHandlerDictionary _handlers; readonly StoreRepository _storeRepo; private readonly InvoiceRepository _invoiceRepository; @@ -40,17 +40,17 @@ namespace BTCPayServer.Controllers public BitpayRateController( RateFetcher rateProviderFactory, - BTCPayNetworkProvider networkProvider, StoreRepository storeRepo, InvoiceRepository invoiceRepository, CurrencyNameTable currencyNameTable, + IEnumerable defaultRates, PaymentMethodHandlerDictionary handlers) { _rateProviderFactory = rateProviderFactory ?? throw new ArgumentNullException(nameof(rateProviderFactory)); - _networkProvider = networkProvider; _storeRepo = storeRepo; _invoiceRepository = invoiceRepository; _currencyNameTable = currencyNameTable ?? throw new ArgumentNullException(nameof(currencyNameTable)); + _defaultRates = defaultRates; _handlers = handlers; } @@ -124,7 +124,7 @@ namespace BTCPayServer.Controllers } } - var rules = store.GetStoreBlob().GetRateRules(_networkProvider); + var rules = store.GetStoreBlob().GetRateRules(_defaultRates); var pairs = new HashSet(); foreach (var currency in currencyPairs.Split(',')) { diff --git a/BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs b/BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs index 491746a97..942a08ea1 100644 --- a/BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs +++ b/BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs @@ -40,7 +40,6 @@ namespace BTCPayServer.Controllers.Greenfield private readonly InvoiceRepository _invoiceRepository; private readonly LinkGenerator _linkGenerator; private readonly CurrencyNameTable _currencyNameTable; - private readonly BTCPayNetworkProvider _networkProvider; private readonly PullPaymentHostedService _pullPaymentService; private readonly RateFetcher _rateProvider; private readonly InvoiceActivator _invoiceActivator; @@ -49,11 +48,12 @@ namespace BTCPayServer.Controllers.Greenfield private readonly Dictionary _paymentLinkExtensions; private readonly PayoutMethodHandlerDictionary _payoutHandlers; private readonly PaymentMethodHandlerDictionary _handlers; + private readonly IEnumerable _defaultRates; public LanguageService LanguageService { get; } public GreenfieldInvoiceController(UIInvoiceController invoiceController, InvoiceRepository invoiceRepository, - LinkGenerator linkGenerator, LanguageService languageService, BTCPayNetworkProvider btcPayNetworkProvider, + LinkGenerator linkGenerator, LanguageService languageService, CurrencyNameTable currencyNameTable, RateFetcher rateProvider, InvoiceActivator invoiceActivator, PullPaymentHostedService pullPaymentService, @@ -61,13 +61,13 @@ namespace BTCPayServer.Controllers.Greenfield IAuthorizationService authorizationService, Dictionary paymentLinkExtensions, PayoutMethodHandlerDictionary payoutHandlers, - PaymentMethodHandlerDictionary handlers) + PaymentMethodHandlerDictionary handlers, + IEnumerable defaultRates) { _invoiceController = invoiceController; _invoiceRepository = invoiceRepository; _linkGenerator = linkGenerator; _currencyNameTable = currencyNameTable; - _networkProvider = btcPayNetworkProvider; _rateProvider = rateProvider; _invoiceActivator = invoiceActivator; _pullPaymentService = pullPaymentService; @@ -76,6 +76,7 @@ namespace BTCPayServer.Controllers.Greenfield _paymentLinkExtensions = paymentLinkExtensions; _payoutHandlers = payoutHandlers; _handlers = handlers; + _defaultRates = defaultRates; LanguageService = languageService; } @@ -429,7 +430,7 @@ namespace BTCPayServer.Controllers.Greenfield var paidCurrency = Math.Round(cryptoPaid * paymentPrompt.Rate, cdCurrency.Divisibility); var rateResult = await _rateProvider.FetchRate( new CurrencyPair(paymentPrompt.Currency, invoice.Currency), - store.GetStoreBlob().GetRateRules(_networkProvider), new StoreIdRateContext(storeId), + store.GetStoreBlob().GetRateRules(_defaultRates), new StoreIdRateContext(storeId), cancellationToken ); diff --git a/BTCPayServer/Controllers/GreenField/GreenfieldStoreRatesConfigurationController.cs b/BTCPayServer/Controllers/GreenField/GreenfieldStoreRatesConfigurationController.cs index 9fac97550..af3ca6ed7 100644 --- a/BTCPayServer/Controllers/GreenField/GreenfieldStoreRatesConfigurationController.cs +++ b/BTCPayServer/Controllers/GreenField/GreenfieldStoreRatesConfigurationController.cs @@ -10,6 +10,7 @@ using BTCPayServer.Client; using BTCPayServer.Client.Models; using BTCPayServer.Data; using BTCPayServer.Rating; +using BTCPayServer.Services.Invoices; using BTCPayServer.Services.Rates; using BTCPayServer.Services.Stores; using Microsoft.AspNetCore.Authorization; @@ -26,16 +27,16 @@ namespace BTCPayServer.Controllers.GreenField public class GreenfieldStoreRateConfigurationController : ControllerBase { private readonly RateFetcher _rateProviderFactory; - private readonly BTCPayNetworkProvider _btcPayNetworkProvider; + private readonly IEnumerable _defaultRates; private readonly StoreRepository _storeRepository; public GreenfieldStoreRateConfigurationController( RateFetcher rateProviderFactory, - BTCPayNetworkProvider btcPayNetworkProvider, + IEnumerable defaultRates, StoreRepository storeRepository) { _rateProviderFactory = rateProviderFactory; - _btcPayNetworkProvider = btcPayNetworkProvider; + _defaultRates = defaultRates; _storeRepository = storeRepository; } @@ -48,7 +49,7 @@ namespace BTCPayServer.Controllers.GreenField return Ok(new StoreRateConfiguration() { - EffectiveScript = blob.GetRateRules(_btcPayNetworkProvider, out var preferredExchange).ToString(), + EffectiveScript = blob.GetRateRules(_defaultRates, out var preferredExchange).ToString(), Spread = blob.Spread * 100.0m, IsCustomScript = blob.RateScripting, PreferredSource = preferredExchange ? blob.PreferredExchange : null @@ -117,7 +118,7 @@ namespace BTCPayServer.Controllers.GreenField return this.CreateValidationError(ModelState); PopulateBlob(configuration, blob); - var rules = blob.GetRateRules(_btcPayNetworkProvider); + var rules = blob.GetRateRules(_defaultRates); var rateTasks = _rateProviderFactory.FetchRates(parsedCurrencyPairs, rules, new StoreIdRateContext(data.Id), CancellationToken.None); @@ -155,7 +156,7 @@ namespace BTCPayServer.Controllers.GreenField { if (string.IsNullOrEmpty(configuration.EffectiveScript)) { - configuration.EffectiveScript = storeBlob.GetDefaultRateRules(_btcPayNetworkProvider).ToString(); + configuration.EffectiveScript = storeBlob.GetDefaultRateRules(_defaultRates).ToString(); } if (!RateRules.TryParse(configuration.EffectiveScript, out var r)) diff --git a/BTCPayServer/Controllers/GreenField/GreenfieldStoreRatesController.cs b/BTCPayServer/Controllers/GreenField/GreenfieldStoreRatesController.cs index b0201101c..5073faef0 100644 --- a/BTCPayServer/Controllers/GreenField/GreenfieldStoreRatesController.cs +++ b/BTCPayServer/Controllers/GreenField/GreenfieldStoreRatesController.cs @@ -9,6 +9,7 @@ using BTCPayServer.Client; using BTCPayServer.Client.Models; using BTCPayServer.Data; using BTCPayServer.Rating; +using BTCPayServer.Services.Invoices; using BTCPayServer.Services.Rates; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Cors; @@ -23,14 +24,14 @@ namespace BTCPayServer.Controllers.GreenField public class GreenfieldStoreRatesController : ControllerBase { private readonly RateFetcher _rateProviderFactory; - private readonly BTCPayNetworkProvider _btcPayNetworkProvider; + private readonly IEnumerable _defaultRates; public GreenfieldStoreRatesController( RateFetcher rateProviderFactory, - BTCPayNetworkProvider btcPayNetworkProvider) + IEnumerable defaultRates) { _rateProviderFactory = rateProviderFactory; - _btcPayNetworkProvider = btcPayNetworkProvider; + _defaultRates = defaultRates; } [HttpGet("")] @@ -61,7 +62,7 @@ namespace BTCPayServer.Controllers.GreenField } - var rules = blob.GetRateRules(_btcPayNetworkProvider); + var rules = blob.GetRateRules(_defaultRates); var rateTasks = _rateProviderFactory.FetchRates(parsedCurrencyPairs, rules, new StoreIdRateContext(data.Id), CancellationToken.None); diff --git a/BTCPayServer/Controllers/UIInvoiceController.UI.cs b/BTCPayServer/Controllers/UIInvoiceController.UI.cs index ea90acce0..f0363f1a3 100644 --- a/BTCPayServer/Controllers/UIInvoiceController.UI.cs +++ b/BTCPayServer/Controllers/UIInvoiceController.UI.cs @@ -382,7 +382,7 @@ namespace BTCPayServer.Controllers var paidCurrency = Math.Round(cryptoPaid * paymentMethod.Rate, cdCurrency.Divisibility); model.CryptoAmountThen = cryptoPaid.RoundToSignificant(paymentMethod.Divisibility); model.RateThenText = _displayFormatter.Currency(model.CryptoAmountThen, paymentMethodCurrency); - rules = store.GetStoreBlob().GetRateRules(_NetworkProvider); + rules = store.GetStoreBlob().GetRateRules(_defaultRates); rateResult = await _RateProvider.FetchRate( new CurrencyPair(paymentMethodCurrency, invoice.Currency), rules, new StoreIdRateContext(store.Id), cancellationToken); @@ -491,7 +491,7 @@ namespace BTCPayServer.Controllers return View("_RefundModal", model); } - rules = store.GetStoreBlob().GetRateRules(_NetworkProvider); + rules = store.GetStoreBlob().GetRateRules(_defaultRates); rateResult = await _RateProvider.FetchRate( new CurrencyPair(paymentMethodCurrency, model.CustomCurrency), rules, new StoreIdRateContext(store.Id), cancellationToken); diff --git a/BTCPayServer/Controllers/UIInvoiceController.cs b/BTCPayServer/Controllers/UIInvoiceController.cs index 8284110e0..3a17fb1c1 100644 --- a/BTCPayServer/Controllers/UIInvoiceController.cs +++ b/BTCPayServer/Controllers/UIInvoiceController.cs @@ -52,6 +52,7 @@ namespace BTCPayServer.Controllers readonly BTCPayNetworkProvider _NetworkProvider; private readonly PayoutMethodHandlerDictionary _payoutHandlers; private readonly PaymentMethodHandlerDictionary _handlers; + private readonly IEnumerable _defaultRates; private readonly ApplicationDbContextFactory _dbContextFactory; private readonly PullPaymentHostedService _paymentHostedService; private readonly LanguageService _languageService; @@ -93,6 +94,7 @@ namespace BTCPayServer.Controllers AppService appService, IFileService fileService, UriResolver uriResolver, + IEnumerable defaultRates, IAuthorizationService authorizationService, TransactionLinkProviders transactionLinkProviders, Dictionary paymentModelExtensions, @@ -123,6 +125,7 @@ namespace BTCPayServer.Controllers _viewProvider = viewProvider; _fileService = fileService; _uriResolver = uriResolver; + _defaultRates = defaultRates; _appService = appService; } @@ -294,7 +297,7 @@ namespace BTCPayServer.Controllers private async Task FetchRates(InvoiceCreationContext context, CancellationToken cancellationToken) { - var rateRules = context.StoreBlob.GetRateRules(_NetworkProvider); + var rateRules = context.StoreBlob.GetRateRules(_defaultRates); await context.FetchingRates(_RateProvider, rateRules, cancellationToken); } } diff --git a/BTCPayServer/Controllers/UIStoresController.Rates.cs b/BTCPayServer/Controllers/UIStoresController.Rates.cs index 21074acba..83cdb5f31 100644 --- a/BTCPayServer/Controllers/UIStoresController.Rates.cs +++ b/BTCPayServer/Controllers/UIStoresController.Rates.cs @@ -28,8 +28,8 @@ public partial class UIStoresController vm.SetExchangeRates(exchanges, storeBlob.PreferredExchange ?? storeBlob.GetRecommendedExchange()); vm.Spread = (double)(storeBlob.Spread * 100m); vm.StoreId = CurrentStore.Id; - vm.Script = storeBlob.GetRateRules(_networkProvider).ToString(); - vm.DefaultScript = storeBlob.GetDefaultRateRules(_networkProvider).ToString(); + vm.Script = storeBlob.GetRateRules(_defaultRates).ToString(); + vm.DefaultScript = storeBlob.GetDefaultRateRules(_defaultRates).ToString(); vm.AvailableExchanges = exchanges; vm.DefaultCurrencyPairs = storeBlob.GetDefaultCurrencyPairString(); vm.ShowScripting = storeBlob.RateScripting; @@ -72,7 +72,7 @@ public partial class UIStoresController model.PreferredExchange = model.PreferredExchange.Trim().ToLowerInvariant(); var blob = CurrentStore.GetStoreBlob(); - model.DefaultScript = blob.GetDefaultRateRules(_networkProvider).ToString(); + model.DefaultScript = blob.GetDefaultRateRules(_defaultRates).ToString(); model.AvailableExchanges = exchanges; blob.PreferredExchange = model.PreferredExchange; @@ -103,7 +103,7 @@ public partial class UIStoresController model.Script = blob.RateScript; } } - rules = blob.GetRateRules(_networkProvider); + rules = blob.GetRateRules(_defaultRates); if (command == "Test") { @@ -175,7 +175,7 @@ public partial class UIStoresController { var blob = CurrentStore.GetStoreBlob(); blob.RateScripting = scripting; - blob.RateScript = blob.GetDefaultRateRules(_networkProvider).ToString(); + blob.RateScript = blob.GetDefaultRateRules(_defaultRates).ToString(); CurrentStore.SetStoreBlob(blob); await _storeRepo.UpdateStore(CurrentStore); TempData[WellKnownTempData.SuccessMessage] = "Rate rules scripting " + (scripting ? "activated" : "deactivated"); diff --git a/BTCPayServer/Controllers/UIStoresController.cs b/BTCPayServer/Controllers/UIStoresController.cs index bce7d31b1..3a1bc7afc 100644 --- a/BTCPayServer/Controllers/UIStoresController.cs +++ b/BTCPayServer/Controllers/UIStoresController.cs @@ -1,4 +1,5 @@ #nullable enable +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using BTCPayServer.Abstractions.Constants; @@ -54,6 +55,7 @@ public partial class UIStoresController : Controller IOptions lightningNetworkOptions, IOptions externalServiceOptions, IHtmlHelper html, + IEnumerable defaultRates, EmailSenderFactory emailSenderFactory, WalletFileParsers onChainWalletParsers, UriResolver uriResolver, @@ -83,6 +85,7 @@ public partial class UIStoresController : Controller _settingsRepository = settingsRepository; _eventAggregator = eventAggregator; _html = html; + _defaultRates = defaultRates; _dataProtector = dataProtector.CreateProtector("ConfigProtector"); _webhookNotificationManager = webhookNotificationManager; _lightningNetworkOptions = lightningNetworkOptions.Value; @@ -101,6 +104,7 @@ public partial class UIStoresController : Controller private readonly ExplorerClientProvider _explorerProvider; private readonly LanguageService _langService; private readonly PaymentMethodHandlerDictionary _handlers; + private readonly IEnumerable _defaultRates; private readonly PoliciesSettings _policiesSettings; private readonly IAuthorizationService _authorizationService; private readonly AppService _appService; diff --git a/BTCPayServer/Controllers/UIWalletsController.cs b/BTCPayServer/Controllers/UIWalletsController.cs index 96a9aad9b..26304b45c 100644 --- a/BTCPayServer/Controllers/UIWalletsController.cs +++ b/BTCPayServer/Controllers/UIWalletsController.cs @@ -73,6 +73,7 @@ namespace BTCPayServer.Controllers private readonly PayjoinClient _payjoinClient; private readonly LabelService _labelService; private readonly PaymentMethodHandlerDictionary _handlers; + private readonly IEnumerable _defaultRates; private readonly Dictionary _paymentModelExtensions; private readonly TransactionLinkProviders _transactionLinkProviders; private readonly PullPaymentHostedService _pullPaymentHostedService; @@ -99,12 +100,14 @@ namespace BTCPayServer.Controllers IServiceProvider serviceProvider, PullPaymentHostedService pullPaymentHostedService, LabelService labelService, + IEnumerable defaultRates, PaymentMethodHandlerDictionary handlers, Dictionary paymentModelExtensions, TransactionLinkProviders transactionLinkProviders) { _currencyTable = currencyTable; _labelService = labelService; + _defaultRates = defaultRates; _handlers = handlers; _paymentModelExtensions = paymentModelExtensions; _transactionLinkProviders = transactionLinkProviders; @@ -456,7 +459,7 @@ namespace BTCPayServer.Controllers if (network == null || network.ReadonlyWallet) return NotFound(); var storeData = store.GetStoreBlob(); - var rateRules = store.GetStoreBlob().GetRateRules(NetworkProvider); + var rateRules = store.GetStoreBlob().GetRateRules(_defaultRates); rateRules.Spread = 0.0m; var currencyPair = new Rating.CurrencyPair(walletId.CryptoCode, storeData.DefaultCurrency); double.TryParse(defaultAmount, out var amount); diff --git a/BTCPayServer/Data/Payouts/BitcoinLike/BitcoinLikePayoutHandler.cs b/BTCPayServer/Data/Payouts/BitcoinLike/BitcoinLikePayoutHandler.cs index 02daee800..3c82ca1ec 100644 --- a/BTCPayServer/Data/Payouts/BitcoinLike/BitcoinLikePayoutHandler.cs +++ b/BTCPayServer/Data/Payouts/BitcoinLike/BitcoinLikePayoutHandler.cs @@ -49,6 +49,7 @@ public class BitcoinLikePayoutHandler : IPayoutHandler, IHasNetwork public PayoutMethodId PayoutMethodId { get; } public PaymentMethodId PaymentMethodId { get; } public BTCPayNetwork Network { get; } + public string[] DefaultRateRules => Network.DefaultRateRules; public WalletRepository WalletRepository { get; } public BitcoinLikePayoutHandler(BTCPayNetworkProvider btcPayNetworkProvider, diff --git a/BTCPayServer/Data/Payouts/LightningLike/LightningLikePayoutHandler.cs b/BTCPayServer/Data/Payouts/LightningLike/LightningLikePayoutHandler.cs index 5c5cd1109..f0ee56af9 100644 --- a/BTCPayServer/Data/Payouts/LightningLike/LightningLikePayoutHandler.cs +++ b/BTCPayServer/Data/Payouts/LightningLike/LightningLikePayoutHandler.cs @@ -34,6 +34,7 @@ namespace BTCPayServer.Data.Payouts.LightningLike private PaymentMethodHandlerDictionary _paymentHandlers; public BTCPayNetwork Network { get; } + public string[] DefaultRateRules => Network.DefaultRateRules; public const string LightningLikePayoutHandlerOnionNamedClient = nameof(LightningLikePayoutHandlerOnionNamedClient); diff --git a/BTCPayServer/Data/StoreBlob.cs b/BTCPayServer/Data/StoreBlob.cs index 52aa91ce9..077e87f8a 100644 --- a/BTCPayServer/Data/StoreBlob.cs +++ b/BTCPayServer/Data/StoreBlob.cs @@ -10,6 +10,7 @@ using BTCPayServer.Controllers; using BTCPayServer.JsonConverters; using BTCPayServer.Payments; using BTCPayServer.Rating; +using BTCPayServer.Services.Invoices; using BTCPayServer.Services.Mails; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -134,18 +135,18 @@ namespace BTCPayServer.Data [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] public double PaymentTolerance { get; set; } - public BTCPayServer.Rating.RateRules GetRateRules(BTCPayNetworkProvider networkProvider) + public BTCPayServer.Rating.RateRules GetRateRules(IEnumerable defaultRates) { - return GetRateRules(networkProvider, out _); + return GetRateRules(defaultRates, out _); } - public BTCPayServer.Rating.RateRules GetRateRules(BTCPayNetworkProvider networkProvider, out bool preferredSource) + public BTCPayServer.Rating.RateRules GetRateRules(IEnumerable defaultRates, out bool preferredSource) { if (!RateScripting || string.IsNullOrEmpty(RateScript) || !BTCPayServer.Rating.RateRules.TryParse(RateScript, out var rules)) { preferredSource = true; - return GetDefaultRateRules(networkProvider); + return GetDefaultRateRules(defaultRates); } else { @@ -155,15 +156,14 @@ namespace BTCPayServer.Data } } - public RateRules GetDefaultRateRules(BTCPayNetworkProvider networkProvider) + public RateRules GetDefaultRateRules(IEnumerable defaultRates) { var builder = new StringBuilder(); - foreach (var network in networkProvider.GetAll()) + foreach (var rates in defaultRates) { - if (network.DefaultRateRules.Length != 0) + if (rates.Rates is { Length: > 0 } r) { - builder.AppendLine(CultureInfo.InvariantCulture, $"// Default rate rules for {network.CryptoCode}"); - foreach (var line in network.DefaultRateRules) + foreach (var line in r) { builder.AppendLine(line); } diff --git a/BTCPayServer/DefaultRates.cs b/BTCPayServer/DefaultRates.cs new file mode 100644 index 000000000..fb92b6c36 --- /dev/null +++ b/BTCPayServer/DefaultRates.cs @@ -0,0 +1,2 @@ +namespace BTCPayServer; +public record DefaultRates(string[] Rates); diff --git a/BTCPayServer/HostedServices/PullPaymentHostedService.cs b/BTCPayServer/HostedServices/PullPaymentHostedService.cs index e7aa68e86..8a4e53671 100644 --- a/BTCPayServer/HostedServices/PullPaymentHostedService.cs +++ b/BTCPayServer/HostedServices/PullPaymentHostedService.cs @@ -279,6 +279,7 @@ namespace BTCPayServer.HostedServices EventAggregator eventAggregator, BTCPayNetworkProvider networkProvider, PayoutMethodHandlerDictionary handlers, + IEnumerable defaultRates, NotificationSender notificationSender, RateFetcher rateFetcher, ILogger logger, @@ -291,6 +292,7 @@ namespace BTCPayServer.HostedServices _eventAggregator = eventAggregator; _networkProvider = networkProvider; _handlers = handlers; + _defaultRates = defaultRates; _notificationSender = notificationSender; _rateFetcher = rateFetcher; _logger = logger; @@ -304,6 +306,7 @@ namespace BTCPayServer.HostedServices private readonly EventAggregator _eventAggregator; private readonly BTCPayNetworkProvider _networkProvider; private readonly PayoutMethodHandlerDictionary _handlers; + private readonly IEnumerable _defaultRates; private readonly NotificationSender _notificationSender; private readonly RateFetcher _rateFetcher; private readonly ILogger _logger; @@ -389,7 +392,7 @@ namespace BTCPayServer.HostedServices if (explicitRateRule is null) { var storeBlob = payout.StoreData.GetStoreBlob(); - var rules = storeBlob.GetRateRules(_networkProvider); + var rules = storeBlob.GetRateRules(_defaultRates); rules.Spread = 0.0m; rule = rules.GetRuleFor(currencyPair); } diff --git a/BTCPayServer/Hosting/BTCPayServerServices.cs b/BTCPayServer/Hosting/BTCPayServerServices.cs index 80a0a066f..ea6548727 100644 --- a/BTCPayServer/Hosting/BTCPayServerServices.cs +++ b/BTCPayServer/Hosting/BTCPayServerServices.cs @@ -563,11 +563,13 @@ o.GetRequiredService>().ToDictionary(o => o.P } public static IServiceCollection AddBTCPayNetwork(this IServiceCollection services, BTCPayNetworkBase network) { + services.AddSingleton(new DefaultRates(network.DefaultRateRules)); services.AddSingleton(network); return services; } public static IServiceCollection AddBTCPayNetwork(this IServiceCollection services, BTCPayNetwork network) { + services.AddSingleton(new DefaultRates(network.DefaultRateRules)); // BTC { var pmi = PaymentTypes.CHAIN.GetPaymentMethodId(network.CryptoCode);