-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add tests, rollback pluginify FeeProvider
- Loading branch information
1 parent
a7a3d03
commit cf0bbb3
Showing
5 changed files
with
95 additions
and
113 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,73 +1,45 @@ | ||
using System; | ||
using System.Collections.Concurrent; | ||
using System.Collections.Generic; | ||
using System.Linq; | ||
using System.Net.Http; | ||
using Microsoft.AspNetCore.HttpOverrides; | ||
using Microsoft.Extensions.Caching.Memory; | ||
using Microsoft.Extensions.DependencyInjection; | ||
using NBitcoin; | ||
using NBXplorer; | ||
|
||
namespace BTCPayServer.Services.Fees; | ||
|
||
public static class FeeProviderExtensions | ||
public class FeeProviderFactory : IFeeProviderFactory | ||
{ | ||
public static IServiceCollection AddFeeProviders(this IServiceCollection services, IServiceProvider bootstrapServiceProvider) | ||
public FeeProviderFactory( | ||
BTCPayServerEnvironment Environment, | ||
ExplorerClientProvider ExplorerClients, | ||
IHttpClientFactory HttpClientFactory, | ||
IMemoryCache MemoryCache) | ||
{ | ||
var networkProvider = bootstrapServiceProvider.GetRequiredService<NBXplorerNetworkProvider>(); | ||
_FeeProviders = new (); | ||
|
||
foreach (var network in networkProvider.GetAll()) | ||
// TODO: Pluginify this | ||
foreach ((var network, var client) in ExplorerClients.GetAll()) | ||
{ | ||
|
||
if (network.CryptoCode == "BTC" && network.NBitcoinNetwork.ChainName != ChainName.Regtest) | ||
List<IFeeProvider> providers = new List<IFeeProvider>(); | ||
if (network.IsBTC && Environment.NetworkType != ChainName.Regtest) | ||
{ | ||
|
||
services.AddKeyedSingleton<IFeeProvider>(network.CryptoCode, (provider, o) => new MempoolSpaceFeeProvider( | ||
provider.GetRequiredService<IMemoryCache>(), | ||
providers.Add(new MempoolSpaceFeeProvider( | ||
MemoryCache, | ||
$"MempoolSpaceFeeProvider-{network.CryptoCode}", | ||
provider.GetRequiredService<IHttpClientFactory>(), | ||
network is { } n && | ||
HttpClientFactory, | ||
network is BTCPayNetwork n && | ||
n.NBitcoinNetwork.ChainName == ChainName.Testnet)); | ||
} | ||
|
||
services.AddKeyedSingleton<IFeeProvider>(network.CryptoCode, (provider, o) => new NBXplorerFeeProvider( | ||
provider.GetRequiredService<ExplorerClientProvider>().GetExplorerClient(network.CryptoCode))); | ||
|
||
services.AddKeyedSingleton<IFeeProvider>(network.CryptoCode, | ||
(provider, o) => new StaticFeeProvider(new FeeRate(100L, 1))); | ||
providers.Add(new NBXplorerFeeProvider(client)); | ||
providers.Add(new StaticFeeProvider(new FeeRate(100L, 1))); | ||
var fallback = new FallbackFeeProvider(providers.ToArray()); | ||
_FeeProviders.Add(network, fallback); | ||
} | ||
services.AddSingleton<IFeeProviderFactory, FeeProviderFactory>(); | ||
return services; | ||
} | ||
|
||
} | ||
|
||
public class FeeProviderFactory : IFeeProviderFactory | ||
{ | ||
private readonly IEnumerable<IFeeProvider> _feeProviders; | ||
private readonly IServiceProvider _serviceProvider; | ||
|
||
public FeeProviderFactory( | ||
ExplorerClientProvider explorerClients, | ||
IHttpClientFactory httpClientFactory, | ||
IMemoryCache memoryCache, | ||
IEnumerable<IFeeProvider> feeProviders, | ||
IServiceProvider serviceProvider) | ||
{ | ||
_feeProviders = feeProviders; | ||
_serviceProvider = serviceProvider; | ||
} | ||
|
||
private readonly ConcurrentDictionary<BTCPayNetworkBase, FallbackFeeProvider> _cached = new(); | ||
private readonly Dictionary<BTCPayNetworkBase, IFeeProvider> _FeeProviders; | ||
public IFeeProvider CreateFeeProvider(BTCPayNetworkBase network) | ||
{ | ||
return _cached.GetOrAdd(network, n => | ||
{ | ||
var feeProviders = _serviceProvider.GetKeyedServices<IFeeProvider>(network.CryptoCode).Concat(_feeProviders).ToArray(); | ||
if (!feeProviders.Any()) | ||
throw new NotSupportedException($"No fee provider for this network ({network.CryptoCode})"); | ||
return new FallbackFeeProvider(feeProviders.ToArray()); | ||
}); | ||
return _FeeProviders.TryGetValue(network, out var prov) ? prov : throw new NotSupportedException($"No fee provider for this network ({network.CryptoCode})"); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters