protected override CommandLineApplication CreateCommandLineApplicationCore() { var provider = new NBXplorerNetworkProvider(ChainName.Mainnet); var chains = string.Join(",", provider.GetAll().Select(n => n.CryptoCode.ToLowerInvariant()).ToArray()); CommandLineApplication app = new CommandLineApplication(true) { FullName = "NBXplorer\r\nLightweight block explorer for tracking HD wallets", Name = "NBXplorer" }; app.HelpOption("-? | -h | --help"); app.Option("-n | --network", $"Set the network among (mainnet,testnet,regtest) (default: mainnet)", CommandOptionType.SingleValue); app.Option("--testnet | -testnet", $"Use testnet", CommandOptionType.BoolValue); app.Option("--regtest | -regtest", $"Use regtest", CommandOptionType.BoolValue); app.Option("--signet | -signet", $"Use signet", CommandOptionType.BoolValue); app.Option("--chains", $"Chains to support comma separated (default: btc, available: {chains})", CommandOptionType.SingleValue); app.Option($"--dbcache", $"If more than 0, the size of the cache for the database, in MB. Else, no limit on the size of the cache. (default: 50)", CommandOptionType.SingleValue); foreach (var network in provider.GetAll()) { var crypto = network.CryptoCode.ToLowerInvariant(); app.Option($"--{crypto}rescan", $"Rescan from startheight", CommandOptionType.BoolValue); app.Option($"--{crypto}rpcuser", $"RPC authentication method 1: The RPC user (default: using cookie auth from default network folder)", CommandOptionType.SingleValue); app.Option($"--{crypto}rpcpassword", $"RPC authentication method 1: The RPC password (default: using cookie auth from default network folder)", CommandOptionType.SingleValue); app.Option($"--{crypto}rpccookiefile", $"RPC authentication method 2: The RPC cookiefile (default: using cookie auth from default network folder)", CommandOptionType.SingleValue); app.Option($"--{crypto}rpcauth", $"RPC authentication method 3: user:password or cookiefile=path (default: using cookie auth from default network folder)", CommandOptionType.SingleValue); app.Option($"--{crypto}rpcurl", $"The RPC server url (default: default rpc server depended on the network)", CommandOptionType.SingleValue); app.Option($"--{crypto}startheight", $"The height where starting the scan (default: where your rpc server was synched when you first started this program)", CommandOptionType.SingleValue); app.Option($"--{crypto}minutxovalue", $"The minimum value of tracked UTXOs, any UTXO with value less than this is ignored. (default: 1 (satoshi))", CommandOptionType.SingleValue); app.Option($"--{crypto}nodeendpoint", $"The p2p connection to a Bitcoin node, make sure you are whitelisted (default: default p2p node on localhost, depends on network)", CommandOptionType.SingleValue); app.Option($"--{crypto}hastxindex", "If true, NBXplorer will try to fetch missing transactions from the local node (default: false)", CommandOptionType.BoolValue); app.Option($"--{crypto}exposerpc", $"Expose the node RPCs through the REST API (default: false)", CommandOptionType.SingleValue); } app.Option("--asbcnstr", "[For Azure Service Bus] Azure Service Bus Connection string. New Block and New Transaction messages will be pushed to queues when this values is set", CommandOptionType.SingleValue); app.Option("--asbblockq", "[For Azure Service Bus] Name of Queue to push new block message to. Leave blank to turn off", CommandOptionType.SingleValue); app.Option("--asbtranq", "[For Azure Service Bus] Name of Queue to push new transaction message to. Leave blank to turn off", CommandOptionType.SingleValue); app.Option("--asbblockt", "[For Azure Service Bus] Name of Topic to push new block message to. Leave blank to turn off", CommandOptionType.SingleValue); app.Option("--asbtrant", "[For Azure Service Bus] Name of Topic to push new transaction message to. Leave blank to turn off", CommandOptionType.SingleValue); app.Option("--rmqhost", "[For RabbitMq] RabbitMq host name. Leave blank to turn off", CommandOptionType.SingleValue); app.Option("--rmquser", "[For RabbitMq] RabbitMq username. Leave blank to turn off", CommandOptionType.SingleValue); app.Option("--rmqpass", "[For RabbitMq] RabbitMq password. Leave blank to turn off", CommandOptionType.SingleValue); app.Option("--rmqvirtual", "[For RabbitMq] RabbitMq virtual host.", CommandOptionType.SingleValue); app.Option("--rmqtranex", "[For RabbitMq] Name of exchange to push transaction messages.", CommandOptionType.SingleValue); app.Option("--rmqblockex", "[For RabbitMq] Name of exchange to push block messages.", CommandOptionType.SingleValue); app.Option("--customkeypathtemplate", $"Define an additional derivation path tracked by NBXplorer (Format: m/1/392/*/29, default: empty)", CommandOptionType.SingleValue); app.Option("--maxgapsize", $"The maximum gap address count on which the explorer will track derivation schemes (default: 30)", CommandOptionType.SingleValue); app.Option("--mingapsize", $"The minimum gap address count on which the explorer will track derivation schemes (default: 20)", CommandOptionType.SingleValue); app.Option("--trimevents", $"When NBXplorer starts, NBXplorer will remove old events to reach this count. No trimming if equals to less than 0 (default: -1)", CommandOptionType.SingleValue); app.Option("--signalfilesdir", $"The directory where files signaling if a chain is ready is created (default: the network specific datadir)", CommandOptionType.SingleValue); app.Option("--noauth", $"Disable cookie authentication", CommandOptionType.BoolValue); app.Option("--instancename", $"Define an instance name for this server that, if not null, will show in status response and in HTTP response headers (default: empty)", CommandOptionType.SingleValue); app.Option("--cachechain", $"Whether the chain of header is locally cached for faster startup (default: true)", CommandOptionType.SingleValue); app.Option("--rpcnotest", $"Faster start because RPC connection testing skipped (default: false)", CommandOptionType.SingleValue); app.Option("--exposerpc", $"Expose the node RPC through the REST API (default: false)", CommandOptionType.SingleValue); app.Option("-v | --verbose", $"Verbose logs (default: true)", CommandOptionType.SingleValue); return(app); }
protected override CommandLineApplication CreateCommandLineApplicationCore() { var provider = new NBXplorerNetworkProvider(NetworkType.Mainnet); var chains = string.Join(",", provider.GetAll().Select(n => n.CryptoCode.ToLowerInvariant()).ToArray()); CommandLineApplication app = new CommandLineApplication(true) { FullName = "NBXplorer\r\nLightweight block explorer for tracking HD wallets", Name = "NBXplorer" }; app.HelpOption("-? | -h | --help"); app.Option("-n | --network", $"Set the network among (mainnet,testnet,regtest) (default: mainnet)", CommandOptionType.SingleValue); app.Option("--testnet | -testnet", $"Use testnet", CommandOptionType.BoolValue); app.Option("--regtest | -regtest", $"Use regtest", CommandOptionType.BoolValue); app.Option("--chains", $"Chains to support comma separated (default: btc, available: {chains})", CommandOptionType.SingleValue); foreach (var network in provider.GetAll()) { var crypto = network.CryptoCode.ToLowerInvariant(); app.Option($"--{crypto}rescan", $"Rescan from startheight", CommandOptionType.BoolValue); app.Option($"--{crypto}rpcuser", $"RPC authentication method 1: The RPC user (default: using cookie auth from default network folder)", CommandOptionType.SingleValue); app.Option($"--{crypto}rpcpassword", $"RPC authentication method 1: The RPC password (default: using cookie auth from default network folder)", CommandOptionType.SingleValue); app.Option($"--{crypto}rpccookiefile", $"RPC authentication method 2: The RPC cookiefile (default: using cookie auth from default network folder)", CommandOptionType.SingleValue); app.Option($"--{crypto}rpcauth", $"RPC authentication method 3: user:password or cookiefile=path (default: using cookie auth from default network folder)", CommandOptionType.SingleValue); app.Option($"--{crypto}rpcurl", $"The RPC server url (default: default rpc server depended on the network)", CommandOptionType.SingleValue); app.Option($"--{crypto}startheight", $"The height where starting the scan (default: where your rpc server was synched when you first started this program)", CommandOptionType.SingleValue); app.Option($"--{crypto}nodeendpoint", $"The p2p connection to a Bitcoin node, make sure you are whitelisted (default: default p2p node on localhost, depends on network)", CommandOptionType.SingleValue); app.Option($"--{crypto}hastxindex", "If true, NBXplorer will try to fetch missing transactions from the local node (default: false)", CommandOptionType.BoolValue); } app.Option("--asbcnstr", "[For Azure Service Bus] Azure Service Bus Connection string. New Block and New Transaction messages will be pushed to queues when this values is set", CommandOptionType.SingleValue); app.Option("--asbblockq", "[For Azure Service Bus] Name of Queue to push new block message to. Leave blank to turn off", CommandOptionType.SingleValue); app.Option("--asbtranq", "[For Azure Service Bus] Name of Queue to push new transaction message to. Leave blank to turn off", CommandOptionType.SingleValue); app.Option("--asbblockt", "[For Azure Service Bus] Name of Topic to push new block message to. Leave blank to turn off", CommandOptionType.SingleValue); app.Option("--asbtrant", "[For Azure Service Bus] Name of Topic to push new transaction message to. Leave blank to turn off", CommandOptionType.SingleValue); app.Option("--customkeypathtemplate", $"Define an additional derivation path tracked by NBXplorer (Format: m/1/392/*/29, default: empty)", CommandOptionType.SingleValue); app.Option("--maxgapsize", $"The maximum gap address count on which the explorer will track derivation schemes (default: 30)", CommandOptionType.SingleValue); app.Option("--mingapsize", $"The minimum gap address count on which the explorer will track derivation schemes (default: 20)", CommandOptionType.SingleValue); app.Option("--signalfilesdir", $"The directory where files signaling if a chain is ready is created (default: the network specific datadir)", CommandOptionType.SingleValue); app.Option("--noauth", $"Disable cookie authentication", CommandOptionType.BoolValue); app.Option("--autopruning", $"EXPERIMENTAL: If getting UTXOs takes more than x seconds, NBXplorer will prune old transactions, disabled if set to -1 (default: -1)", CommandOptionType.SingleValue); app.Option("--cachechain", $"Whether the chain of header is locally cached for faster startup (default: true)", CommandOptionType.SingleValue); app.Option("--rpcnotest", $"Faster start because RPC connection testing skipped (default: false)", CommandOptionType.SingleValue); app.Option("-v | --verbose", $"Verbose logs (default: true)", CommandOptionType.SingleValue); return(app); }
public ExplorerConfiguration LoadArgs(IConfiguration config) { NetworkProvider = new NBXplorerNetworkProvider(DefaultConfiguration.GetChainType(config)); var defaultSettings = NBXplorerDefaultSettings.GetDefaultSettings(NetworkProvider.ChainType); Logs.Configuration.LogInformation("Network: " + NetworkProvider.ChainType.ToString()); var supportedChains = config.GetOrDefault <string>("chains", "btc") .Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(t => t.ToUpperInvariant()); var validChains = new List <string>(); foreach (var network in NetworkProvider.GetAll()) { if (supportedChains.Contains(network.CryptoCode)) { validChains.Add(network.CryptoCode); var chainConfiguration = new ChainConfiguration(); chainConfiguration.Rescan = config.GetOrDefault <bool>($"{network.CryptoCode}.rescan", false); chainConfiguration.CryptoCode = network.CryptoCode; var args = RPCArgs.Parse(config, network.NBitcoinNetwork, network.CryptoCode); chainConfiguration.RPC = args.ConfigureRPCClient(network); chainConfiguration.NodeEndpoint = DefaultConfiguration.ConvertToEndpoint(config.GetOrDefault <string>($"{network.CryptoCode}.node.endpoint", "127.0.0.1"), network.NBitcoinNetwork.DefaultPort); chainConfiguration.StartHeight = config.GetOrDefault <int>($"{network.CryptoCode}.startheight", -1); ChainConfigurations.Add(chainConfiguration); } } var invalidChains = String.Join(',', supportedChains.Where(s => !validChains.Contains(s)).ToArray()); if (!string.IsNullOrEmpty(invalidChains)) { throw new ConfigException($"Invalid chains {invalidChains}"); } Logs.Configuration.LogInformation("Supported chains: " + String.Join(',', supportedChains.ToArray())); BaseDataDir = config.GetOrDefault <string>("datadir", Path.GetDirectoryName(defaultSettings.DefaultDataDirectory)); MinGapSize = config.GetOrDefault <int>("mingapsize", 20); MaxGapSize = config.GetOrDefault <int>("maxgapsize", 30); if (MinGapSize >= MaxGapSize) { throw new ConfigException("mingapsize should be equal or lower than maxgapsize"); } if (!Directory.Exists(BaseDataDir)) { Directory.CreateDirectory(BaseDataDir); } DataDir = Path.Combine(BaseDataDir, NetworkProvider.ChainType.ToNetwork().Name); if (!Directory.Exists(DataDir)) { Directory.CreateDirectory(DataDir); } CacheChain = config.GetOrDefault <bool>("cachechain", true); NoAuthentication = config.GetOrDefault <bool>("noauth", false); return(this); }
public FingerprintHostedService(EventAggregator eventAggregator, NBXplorerNetworkProvider networkProvider, BitcoinDWaiters waiters) { this.eventAggregator = eventAggregator; foreach (var network in networkProvider.GetAll()) { data.Add(network, new NetworkFingerprintData() { waiter = waiters.GetWaiter(network) }); } }
public FingerprintHostedService(EventAggregator eventAggregator, NBXplorerNetworkProvider networkProvider, BitcoinDWaiters waiters) { this.eventAggregator = eventAggregator; foreach (var network in networkProvider.GetAll()) { data.Add(network, new NetworkFingerprintData() { waiter = waiters.GetWaiter(network), DefaultDistribution = network.CryptoCode == "BTC" ? _DefaultBTC : null }); } }
protected override CommandLineApplication CreateCommandLineApplicationCore() { var provider = new NBXplorerNetworkProvider(NetworkType.Mainnet); var chains = string.Join(",", provider.GetAll().Select(n => n.CryptoCode.ToLowerInvariant()).ToArray()); CommandLineApplication app = new CommandLineApplication(true) { FullName = "NBXplorer\r\nLightweight block explorer for tracking HD wallets", Name = "NBXplorer" }; app.HelpOption("-? | -h | --help"); app.Option("-n | --network", $"Set the network among (mainnet,testnet,regtest) (default: mainnet)", CommandOptionType.SingleValue); app.Option("--testnet | -testnet", $"Use testnet", CommandOptionType.BoolValue); app.Option("--regtest | -regtest", $"Use regtest", CommandOptionType.BoolValue); app.Option("--chains", $"Chains to support comma separated (default: btc, available: {chains})", CommandOptionType.SingleValue); foreach (var network in provider.GetAll()) { var crypto = network.CryptoCode.ToLowerInvariant(); app.Option($"--{crypto}rescan", $"Rescan from startheight", CommandOptionType.BoolValue); app.Option($"--{crypto}rpcuser", $"RPC authentication method 1: The RPC user (default: using cookie auth from default network folder)", CommandOptionType.SingleValue); app.Option($"--{crypto}rpcpassword", $"RPC authentication method 1: The RPC password (default: using cookie auth from default network folder)", CommandOptionType.SingleValue); app.Option($"--{crypto}rpccookiefile", $"RPC authentication method 2: The RPC cookiefile (default: using cookie auth from default network folder)", CommandOptionType.SingleValue); app.Option($"--{crypto}rpcauth", $"RPC authentication method 3: user:password or cookiefile=path (default: using cookie auth from default network folder)", CommandOptionType.SingleValue); app.Option($"--{crypto}rpcurl", $"The RPC server url (default: default rpc server depended on the network)", CommandOptionType.SingleValue); app.Option($"--{crypto}startheight", $"The height where starting the scan (default: where your rpc server was synched when you first started this program)", CommandOptionType.SingleValue); app.Option($"--{crypto}nodeendpoint", $"The p2p connection to a Bitcoin node, make sure you are whitelisted (default: default p2p node on localhost, depends on network)", CommandOptionType.SingleValue); } app.Option("--maxgapsize", $"The maximum gap address count on which the explorer will track derivation schemes (default: 30)", CommandOptionType.SingleValue); app.Option("--mingapsize", $"The minimum gap address count on which the explorer will track derivation schemes (default: 20)", CommandOptionType.SingleValue); app.Option("--noauth", $"Disable cookie authentication", CommandOptionType.BoolValue); app.Option("--cachechain", $"Whether the chain of header is locally cached for faster startup (default: true)", CommandOptionType.SingleValue); app.Option("--rpcnotest", $"Faster start because RPC connection testing skipped (default: false)", CommandOptionType.SingleValue); app.Option("-v | --verbose", $"Verbose logs (default: true)", CommandOptionType.SingleValue); return(app); }
private static CommandLineApplication CreateCommandLineApplication() { var provider = new NBXplorerNetworkProvider(NetworkType.Mainnet); var chains = string.Join(",", provider.GetAll().Select(n => n.CryptoCode.ToLowerInvariant()).ToArray()); CommandLineApplication app = new CommandLineApplication(true) { FullName = "NBXplorer NodeWaiter\r\nUtility which exit only when the NBXplorer Server is fully up", Name = "NBXplorer Waiter" }; app.HelpOption("-? | -h | --help"); app.Option("-n | --network", $"Set the network among (mainnet,testnet,regtest) (default: mainnet)", CommandOptionType.SingleValue); app.Option("--chains", $"Chains to support comma separated (default: btc, available: {chains})", CommandOptionType.SingleValue); app.Option($"--explorerurl", "The url to nbxplorer instance", CommandOptionType.SingleValue); return(app); }
public ExplorerConfiguration LoadArgs(IConfiguration config) { NetworkProvider = new NBXplorerNetworkProvider(DefaultConfiguration.GetNetworkType(config)); var defaultSettings = NBXplorerDefaultSettings.GetDefaultSettings(NetworkProvider.NetworkType); BaseDataDir = config.GetOrDefault <string>("datadir", null); if (BaseDataDir == null) { BaseDataDir = Path.GetDirectoryName(defaultSettings.DefaultDataDirectory); if (!Directory.Exists(BaseDataDir)) { Directory.CreateDirectory(BaseDataDir); } if (!Directory.Exists(defaultSettings.DefaultDataDirectory)) { Directory.CreateDirectory(defaultSettings.DefaultDataDirectory); } } Logs.Configuration.LogInformation("Network: " + NetworkProvider.NetworkType.ToString()); var supportedChains = config.GetOrDefault <string>("chains", "btc") .Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(t => t.ToUpperInvariant()); var validChains = new List <string>(); foreach (var network in NetworkProvider.GetAll()) { if (supportedChains.Contains(network.CryptoCode)) { validChains.Add(network.CryptoCode); var chainConfiguration = new ChainConfiguration(); chainConfiguration.Rescan = config.GetOrDefault <bool>($"{network.CryptoCode}.rescan", false); chainConfiguration.CryptoCode = network.CryptoCode; var args = RPCArgs.Parse(config, network.NBitcoinNetwork, network.CryptoCode); chainConfiguration.RPC = args.ConfigureRPCClient(network); if (chainConfiguration.RPC.Address.Port == network.NBitcoinNetwork.DefaultPort) { Logs.Configuration.LogWarning($"{network.CryptoCode}: It seems that the RPC port ({chainConfiguration.RPC.Address.Port}) is equal to the default P2P port ({network.NBitcoinNetwork.DefaultPort}), this is probably a misconfiguration."); } if ((chainConfiguration.RPC.CredentialString.CookieFile != null || chainConfiguration.RPC.CredentialString.UseDefault) && !network.SupportCookieAuthentication) { throw new ConfigException($"Chain {network.CryptoCode} does not support cookie file authentication,\n" + $"Please use {network.CryptoCode.ToLowerInvariant()}rpcuser and {network.CryptoCode.ToLowerInvariant()}rpcpassword settings in NBXplorer" + $"And configure rpcuser and rpcpassword in the configuration file or in commandline or your node"); } chainConfiguration.NodeEndpoint = NBitcoin.Utils.ParseEndpoint(config.GetOrDefault <string>($"{network.CryptoCode}.node.endpoint", "127.0.0.1"), network.NBitcoinNetwork.DefaultPort); if (GetPort(chainConfiguration.NodeEndpoint) == network.NBitcoinNetwork.RPCPort) { Logs.Configuration.LogWarning($"{network.CryptoCode}: It seems that the node endpoint port ({GetPort(chainConfiguration.NodeEndpoint)}) is equal to the default RPC port ({network.NBitcoinNetwork.RPCPort}), this is probably a misconfiguration."); } chainConfiguration.StartHeight = config.GetOrDefault <int>($"{network.CryptoCode}.startheight", -1); chainConfiguration.HasTxIndex = config.GetOrDefault <bool>($"{network.CryptoCode}.hastxindex", false); ChainConfigurations.Add(chainConfiguration); } } var invalidChains = String.Join(',', supportedChains.Where(s => !validChains.Contains(s)).ToArray()); if (!string.IsNullOrEmpty(invalidChains)) { throw new ConfigException($"Invalid chains {invalidChains}"); } Logs.Configuration.LogInformation("Supported chains: " + String.Join(',', supportedChains.ToArray())); MinGapSize = config.GetOrDefault <int>("mingapsize", 20); MaxGapSize = config.GetOrDefault <int>("maxgapsize", 30); if (MinGapSize >= MaxGapSize) { throw new ConfigException("mingapsize should be equal or lower than maxgapsize"); } if (!Directory.Exists(BaseDataDir)) { Directory.CreateDirectory(BaseDataDir); } DataDir = Path.Combine(BaseDataDir, NBXplorerDefaultSettings.GetFolderName(NetworkProvider.NetworkType)); if (!Directory.Exists(DataDir)) { Directory.CreateDirectory(DataDir); } SignalFilesDir = config.GetOrDefault <string>("signalfilesdir", null); SignalFilesDir = SignalFilesDir ?? DataDir; if (!Directory.Exists(SignalFilesDir)) { Directory.CreateDirectory(SignalFilesDir); } CacheChain = config.GetOrDefault <bool>("cachechain", true); NoAuthentication = config.GetOrDefault <bool>("noauth", false); var customKeyPathTemplate = config.GetOrDefault <string>("customkeypathtemplate", null); if (!string.IsNullOrEmpty(customKeyPathTemplate)) { if (!KeyPathTemplate.TryParse(customKeyPathTemplate, out var v)) { throw new ConfigException("Invalid customKeyPathTemplate"); } if (v.PostIndexes.IsHardened || v.PreIndexes.IsHardened) { throw new ConfigException("customKeyPathTemplate should not be an hardened path"); } CustomKeyPathTemplate = v; } AzureServiceBusConnectionString = config.GetOrDefault <string>("asbcnstr", ""); AzureServiceBusBlockQueue = config.GetOrDefault <string>("asbblockq", ""); AzureServiceBusTransactionQueue = config.GetOrDefault <string>("asbtranq", ""); AzureServiceBusBlockTopic = config.GetOrDefault <string>("asbblockt", ""); AzureServiceBusTransactionTopic = config.GetOrDefault <string>("asbtrant", ""); return(this); }
public ExplorerConfiguration LoadArgs(IConfiguration config) { NetworkProvider = new NBXplorerNetworkProvider(DefaultConfiguration.GetNetworkType(config)); var defaultSettings = NBXplorerDefaultSettings.GetDefaultSettings(NetworkProvider.NetworkType); BaseDataDir = config.GetOrDefault <string>("datadir", null); if (BaseDataDir == null) { BaseDataDir = Path.GetDirectoryName(defaultSettings.DefaultDataDirectory); if (!Directory.Exists(BaseDataDir)) { Directory.CreateDirectory(BaseDataDir); } if (!Directory.Exists(defaultSettings.DefaultDataDirectory)) { Directory.CreateDirectory(defaultSettings.DefaultDataDirectory); } } Logs.Configuration.LogInformation("Network: " + NetworkProvider.NetworkType.ToString()); var supportedChains = config.GetOrDefault <string>("chains", "btc") .Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(t => t.ToUpperInvariant()); var validChains = new List <string>(); foreach (var network in NetworkProvider.GetAll()) { if (supportedChains.Contains(network.CryptoCode)) { validChains.Add(network.CryptoCode); var chainConfiguration = new ChainConfiguration(); chainConfiguration.Rescan = config.GetOrDefault <bool>($"{network.CryptoCode}.rescan", false); chainConfiguration.CryptoCode = network.CryptoCode; var args = RPCArgs.Parse(config, network.NBitcoinNetwork, network.CryptoCode); chainConfiguration.RPC = args.ConfigureRPCClient(network); if ((chainConfiguration.RPC.CredentialString.CookieFile != null || chainConfiguration.RPC.CredentialString.UseDefault) && !network.SupportCookieAuthentication) { throw new ConfigException($"Chain {network.CryptoCode} does not support cookie file authentication,\n" + $"Please use {network.CryptoCode.ToLowerInvariant()}rpcuser and {network.CryptoCode.ToLowerInvariant()}rpcpassword settings in NBXplorer" + $"And configure rpcuser and rpcpassword in the configuration file or in commandline or your node"); } chainConfiguration.NodeEndpoint = DefaultConfiguration.ConvertToEndpoint(config.GetOrDefault <string>($"{network.CryptoCode}.node.endpoint", "127.0.0.1"), network.NBitcoinNetwork.DefaultPort); chainConfiguration.StartHeight = config.GetOrDefault <int>($"{network.CryptoCode}.startheight", -1); ChainConfigurations.Add(chainConfiguration); } } var invalidChains = String.Join(',', supportedChains.Where(s => !validChains.Contains(s)).ToArray()); if (!string.IsNullOrEmpty(invalidChains)) { throw new ConfigException($"Invalid chains {invalidChains}"); } Logs.Configuration.LogInformation("Supported chains: " + String.Join(',', supportedChains.ToArray())); AutoPruningTime = TimeSpan.FromSeconds(config.GetOrDefault <int>("autopruning", -1)); if (AutoPruningTime.Value < TimeSpan.Zero) { AutoPruningTime = null; } MinGapSize = config.GetOrDefault <int>("mingapsize", 20); MaxGapSize = config.GetOrDefault <int>("maxgapsize", 30); if (MinGapSize >= MaxGapSize) { throw new ConfigException("mingapsize should be equal or lower than maxgapsize"); } if (!Directory.Exists(BaseDataDir)) { Directory.CreateDirectory(BaseDataDir); } DataDir = Path.Combine(BaseDataDir, NBXplorerDefaultSettings.GetFolderName(NetworkProvider.NetworkType)); if (!Directory.Exists(DataDir)) { Directory.CreateDirectory(DataDir); } CacheChain = config.GetOrDefault <bool>("cachechain", true); NoAuthentication = config.GetOrDefault <bool>("noauth", false); AzureServiceBusConnectionString = config.GetOrDefault <string>("asbcnstr", ""); AzureServiceBusBlockQueue = config.GetOrDefault <string>("asbblockq", ""); AzureServiceBusTransactionQueue = config.GetOrDefault <string>("asbtranq", ""); AzureServiceBusBlockTopic = config.GetOrDefault <string>("asbblockt", ""); AzureServiceBusTransactionTopic = config.GetOrDefault <string>("asbtrant", ""); return(this); }