using System; using System.Linq; using BTCPayServer.Configuration; using BTCPayServer.Contracts; using BTCPayServer.Services.Altcoins.Monero.Configuration; using BTCPayServer.Services.Altcoins.Monero.Payments; using BTCPayServer.Services.Altcoins.Monero.Services; using BTCPayServer.Payments; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace BTCPayServer.Services.Altcoins.Monero { public static class MoneroLikeExtensions { public static IServiceCollection AddMoneroLike(this IServiceCollection serviceCollection) { serviceCollection.AddSingleton(provider => provider.ConfigureMoneroLikeConfiguration()); serviceCollection.AddSingleton(); serviceCollection.AddHostedService(); serviceCollection.AddHostedService(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(provider => provider.GetService()); serviceCollection.AddSingleton(); return serviceCollection; } private static MoneroLikeConfiguration ConfigureMoneroLikeConfiguration(this IServiceProvider serviceProvider) { var configuration = serviceProvider.GetService(); var btcPayNetworkProvider = serviceProvider.GetService(); var result = new MoneroLikeConfiguration(); var supportedChains = configuration.GetOrDefault("chains", string.Empty) .Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(t => t.ToUpperInvariant()); var supportedNetworks = btcPayNetworkProvider.Filter(supportedChains.ToArray()).GetAll() .OfType(); foreach (var moneroLikeSpecificBtcPayNetwork in supportedNetworks) { var daemonUri = configuration.GetOrDefault($"{moneroLikeSpecificBtcPayNetwork.CryptoCode}_daemon_uri", null); var walletDaemonUri = configuration.GetOrDefault( $"{moneroLikeSpecificBtcPayNetwork.CryptoCode}_wallet_daemon_uri", null); var walletDaemonWalletDirectory = configuration.GetOrDefault( $"{moneroLikeSpecificBtcPayNetwork.CryptoCode}_wallet_daemon_walletdir", null); if (daemonUri == null || walletDaemonUri == null ) { throw new ConfigException($"{moneroLikeSpecificBtcPayNetwork.CryptoCode} is misconfigured"); } result.MoneroLikeConfigurationItems.Add(moneroLikeSpecificBtcPayNetwork.CryptoCode, new MoneroLikeConfigurationItem() { DaemonRpcUri = daemonUri, InternalWalletRpcUri = walletDaemonUri, WalletDirectory = walletDaemonWalletDirectory }); } return result; } } }