public void InitThought() { //not needed: NBitcoin.Altcoins.Thought.Instance.EnsureRegistered(); var nbxplorerNetwork = NBXplorerNetworkProvider.GetFromCryptoCode("THT"); Add(new BTCPayNetwork() { CryptoCode = nbxplorerNetwork.CryptoCode, DisplayName = "Thought", BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://exp.thought.live/insight/tx/{0}" : "https://ext.thought.live/insight/tx/{0}", NBXplorerNetwork = nbxplorerNetwork, UriScheme = "thought", DefaultRateRules = new[] { "THT_X = THT_BTC * BTC_X", "THT_BTC = coinall(THT_BTC)" }, CryptoImagePath = "imlegacy/thought.png", DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), //https://github.com/satoshilabs/slips/blob/master/slip-0044.md CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("5'") : new KeyPath("1'") }); }
private static ExplorerClient CreateNBXClient(Network network) { NBXplorerNetworkProvider provider = new NBXplorerNetworkProvider(network.ChainName); ExplorerClient client = new NBXplorer.ExplorerClient(provider.GetFromCryptoCode(network.NetworkSet.CryptoCode)); return(client); }
public BTCPayNetworkProvider(ChainType chainType) { _NBXplorerNetworkProvider = new NBXplorerNetworkProvider(chainType); ChainType = chainType; InitBitcoin(); InitLitecoin(); }
public void InitChaincoin() { var nbxplorerNetwork = NBXplorerNetworkProvider.GetFromCryptoCode("CHC"); Add(new BTCPayNetwork() { CryptoCode = nbxplorerNetwork.CryptoCode, DisplayName = "Chaincoin", BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://explorer.chaincoin.org/Explorer/Transaction/{0}" : "https://test.explorer.chaincoin.org/Explorer/Transaction/tx/{0}", NBXplorerNetwork = nbxplorerNetwork, UriScheme = "chaincoin", DefaultRateRules = new[] { "CHC_X = CHC_BTC * BTC_X", "CHC_BTC = txbit(CHC_X)" }, CryptoImagePath = "imlegacy/chaincoin.png", DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), //https://github.com/satoshilabs/slips/blob/master/slip-0044.md CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("711'") : new KeyPath("1'") }); }
public NBXplorerClientProvider(NBXplorerOptions options, ILogger <NBXplorerClientProvider> logger) { _options = options; _logger = logger; _nbXplorerNetworkProvider = new NBXplorerNetworkProvider(_options.NetworkType); }
public void InitGroestlcoin() { var nbxplorerNetwork = NBXplorerNetworkProvider.GetFromCryptoCode("GRS"); Add(new BTCPayNetwork() { CryptoCode = nbxplorerNetwork.CryptoCode, DisplayName = "Groestlcoin", BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://chainz.cryptoid.info/grs/tx.dws?{0}.htm" : "https://chainz.cryptoid.info/grs-test/tx.dws?{0}.htm", NBXplorerNetwork = nbxplorerNetwork, UriScheme = "groestlcoin", DefaultRateRules = new[] { "GRS_X = GRS_BTC * BTC_X", "GRS_BTC = bittrex(GRS_BTC)" }, CryptoImagePath = "imlegacy/groestlcoin.png", LightningImagePath = "imlegacy/groestlcoin-lightning.svg", DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("17'") : new KeyPath("1'"), SupportRBF = true, SupportPayJoin = true }); }
public static void Run() { var network = new NBXplorerNetworkProvider(ChainType.Main).GetBTC(); ExplorerClient client = new ExplorerClient(network, new Uri(Config.Instance.NBXplorer.ServerUrl)); Dictionary <int, GetTransactionsResponse> lastResponseDict = new Dictionary <int, GetTransactionsResponse>(); using (Way.Lib.CLog log = new Way.Lib.CLog("runForTransactions")) { while (true) { try { //程序刚启动,把所有交易拿出来检验一遍 checkAllTransactionForInit(network, client, log); break; } catch (Exception ex) { System.Threading.Thread.Sleep(3000); using (Way.Lib.CLog logErr = new Way.Lib.CLog("handleAllTransactionForInit error", false)) { logErr.Log(ex.ToString()); } } } while (true) { try { var events = client.CreateNotificationSession(); events.ListenAllDerivationSchemes(); log.Log($"init"); while (true) { log.Log($"waiting event..."); var txEvent = events.NextEvent(); log.Log($"received event,type:{txEvent?.GetType().FullName}"); if (txEvent is NBXplorer.Models.NewTransactionEvent) { using (var db = new MainDB()) { var tranEvent = txEvent as NBXplorer.Models.NewTransactionEvent; checkTransaction(db, tranEvent.TransactionData.Transaction, tranEvent.TransactionData.Confirmations, log); } } } } catch (Exception ex) { System.Threading.Thread.Sleep(2000); using (Way.Lib.CLog logErr = new Way.Lib.CLog("runForTransactions error", false)) { logErr.Log(ex.ToString()); } } } } }
public void InitTerracoin() { //not needed: NBitcoin.Altcoins.Terracoin.Instance.EnsureRegistered(); var nbxplorerNetwork = NBXplorerNetworkProvider.GetFromCryptoCode("TRC"); Add(new BTCPayNetwork() { CryptoCode = nbxplorerNetwork.CryptoCode, DisplayName = "Terracoin", BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://insight.terracoin.io/tx/{0}" : "https://test-insight.terracoin.io/tx/{0}", NBitcoinNetwork = nbxplorerNetwork.NBitcoinNetwork, NBXplorerNetwork = nbxplorerNetwork, UriScheme = "terracoin", DefaultRateRules = new[] { "TRC_X = TRC_BTC * BTC_X", "TRC_BTC = coingecko(TRC_BTC)" }, CryptoImagePath = "imlegacy/terracoin.png", DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), //https://github.com/satoshilabs/slips/blob/master/slip-0044.md CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("83'") : new KeyPath("1'"), MinFee = Money.Satoshis(0.0001m) }); }
public void InitDash() { //not needed: NBitcoin.Altcoins.Dash.Instance.EnsureRegistered(); var nbxplorerNetwork = NBXplorerNetworkProvider.GetFromCryptoCode("DASH"); Add(new BTCPayNetwork() { CryptoCode = nbxplorerNetwork.CryptoCode, DisplayName = "Dash", BlockExplorerLink = NetworkType == ChainName.Mainnet ? "https://insight.dash.org/insight/tx/{0}" : "https://testnet-insight.dashevo.org/insight/tx/{0}", NBXplorerNetwork = nbxplorerNetwork, DefaultRateRules = new[] { "DASH_X = DASH_BTC * BTC_X", "DASH_BTC = bitfinex(DSH_BTC)" }, CryptoImagePath = "imlegacy/dash.png", DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), //https://github.com/satoshilabs/slips/blob/master/slip-0044.md CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("5'") : new KeyPath("1'") }); }
public void InitBitcoin() { var nbxplorerNetwork = NBXplorerNetworkProvider.GetFromCryptoCode("BTC"); Add(new BTCPayNetwork() { CryptoCode = nbxplorerNetwork.CryptoCode, DisplayName = "Bitcoin", BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://www.smartbit.com.au/tx/{0}" : "https://testnet.smartbit.com.au/tx/{0}", NBitcoinNetwork = nbxplorerNetwork.NBitcoinNetwork, NBXplorerNetwork = nbxplorerNetwork, UriScheme = "bitcoin", CryptoImagePath = "imlegacy/bitcoin.svg", LightningImagePath = "imlegacy/bitcoin-lightning.svg", DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("0'") : new KeyPath("1'"), SupportRBF = true, //https://github.com/spesmilo/electrum/blob/11733d6bc271646a00b69ff07657119598874da4/electrum/constants.py ElectrumMapping = NetworkType == NetworkType.Mainnet ? new Dictionary <uint, DerivationType>() { { 0x0488b21eU, DerivationType.Legacy }, // xpub { 0x049d7cb2U, DerivationType.SegwitP2SH }, // ypub { 0x4b24746U, DerivationType.Segwit }, //zpub } : new Dictionary <uint, DerivationType>() { { 0x043587cfU, DerivationType.Legacy }, { 0x044a5262U, DerivationType.SegwitP2SH }, { 0x045f1cf6U, DerivationType.Segwit } } }); }
public void InitLitecoin() { var nbxplorerNetwork = NBXplorerNetworkProvider.GetFromCryptoCode("LTC"); Add(new BTCPayNetwork() { CryptoCode = nbxplorerNetwork.CryptoCode, DisplayName = "Litecoin", BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://live.blockcypher.com/ltc/tx/{0}/" : "http://explorer.litecointools.com/tx/{0}", NBXplorerNetwork = nbxplorerNetwork, UriScheme = "litecoin", CryptoImagePath = "imlegacy/litecoin.svg", LightningImagePath = "imlegacy/litecoin-lightning.svg", DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("2'") : new KeyPath("1'"), //https://github.com/pooler/electrum-ltc/blob/0d6989a9d2fb2edbea421c116e49d1015c7c5a91/electrum_ltc/constants.py ElectrumMapping = NetworkType == NetworkType.Mainnet ? new Dictionary <uint, DerivationType>() { { 0x0488b21eU, DerivationType.Legacy }, { 0x049d7cb2U, DerivationType.SegwitP2SH }, { 0x04b24746U, DerivationType.Segwit }, } : new Dictionary <uint, DerivationType>() { { 0x043587cfU, DerivationType.Legacy }, { 0x044a5262U, DerivationType.SegwitP2SH }, { 0x045f1cf6U, DerivationType.Segwit } } }); }
public void InitVeles() { var nbxplorerNetwork = NBXplorerNetworkProvider.GetFromCryptoCode("VLS"); Add(new BTCPayNetwork() { CryptoCode = nbxplorerNetwork.CryptoCode, DisplayName = "Veles", BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://explorer.veles.network/tx/{0}" : "https://blockstream.info/testnet/tx/{0}", NBitcoinNetwork = nbxplorerNetwork.NBitcoinNetwork, NBXplorerNetwork = nbxplorerNetwork, UriScheme = "veles", CryptoImagePath = "imlegacy/veles.svg", LightningImagePath = "imlegacy/veles-lightning.svg", DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("0'") : new KeyPath("1'"), SupportRBF = true, ElectrumMapping = NetworkType == NetworkType.Mainnet ? new Dictionary <uint, DerivationType>() { { 0x0488b21eU, DerivationType.Legacy }, // xpub { 0x049d7cb2U, DerivationType.SegwitP2SH }, // ypub { 0x4b24746U, DerivationType.Segwit }, //zpub } : new Dictionary <uint, DerivationType>() { { 0x043587cfU, DerivationType.Legacy }, { 0x044a5262U, DerivationType.SegwitP2SH }, { 0x045f1cf6U, DerivationType.Segwit } } }); }
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); }
public void Start() { try { var cryptoSettings = new NBXplorerNetworkProvider(NetworkType.Regtest).GetFromCryptoCode(CryptoCode); NodeBuilder = NodeBuilder.Create(nodeDownloadData, Network, _Directory); Explorer = NodeBuilder.CreateNode(); Explorer.ConfigParameters.Add("txindex", "1"); foreach (var node in NodeBuilder.Nodes) { node.WhiteBind = true; node.CookieAuth = cryptoSettings.SupportCookieAuthentication; } NodeBuilder.StartAll(); Explorer.CreateRPCClient().EnsureGenerate(Network.Consensus.CoinbaseMaturity + 1); datadir = Path.Combine(_Directory, "explorer"); DeleteFolderRecursive(datadir); StartNBXplorer(); this.Client.WaitServerStarted(); } catch { Dispose(); throw; } }
public BTCPayNetworkProvider(NetworkType networkType) { _NBXplorerNetworkProvider = new NBXplorerNetworkProvider(networkType); NetworkType = networkType; InitBitcoin(); InitLitecoin(); InitDogecoin(); }
public BrokerHostedService(BitcoinDWaiters waiters, ChainProvider chainProvider, EventAggregator eventAggregator, IOptions <ExplorerConfiguration> config, NBXplorerNetworkProvider networks) { _EventAggregator = eventAggregator; Networks = networks; ChainProvider = chainProvider; Waiters = waiters; _config = config.Value; }
public RabbitMqBroker( NBXplorerNetworkProvider networks, ConnectionFactory connectionFactory, string newTransactionExchange, string newBlockExchange) { Networks = networks; ConnectionFactory = connectionFactory; NewTransactionExchange = newTransactionExchange; NewBlockExchange = newBlockExchange; }
public void TestMethod1() { var network = new NBXplorerNetworkProvider(ChainType.Main).GetBTC(); ExplorerClient client = new ExplorerClient(network, new System.Uri("http://47.75.159.73:24444")); //获取一个没有使用的收款地址 var info = client.GetFeeRate(2); }
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 NRustLightningNetworkProvider(NetworkType networkType) { NetworkType = networkType; nbXplorerNetworkProvider = new NBXplorerNetworkProvider(NetworkType); var invoicePrefix = networkType == NetworkType.Mainnet ? "lnbc" : networkType == NetworkType.Testnet ? "lntb" : "lnbcrt"; Add(Bitcoin.Instance, networkType, nbXplorerNetworkProvider.GetBTC(), new KeyPath("m/84'/0'"), invoicePrefix); }
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) }); } }
BTCPayNetworkProvider(BTCPayNetworkProvider filtered, string[] cryptoCodes) { NetworkType = filtered.NetworkType; _NBXplorerNetworkProvider = new NBXplorerNetworkProvider(filtered.NetworkType); _Networks = new Dictionary <string, BTCPayNetworkBase>(); cryptoCodes = cryptoCodes.Select(c => c.ToUpperInvariant()).ToArray(); foreach (var network in filtered._Networks) { if (cryptoCodes.Contains(network.Key)) { _Networks.Add(network.Key, network.Value); } } }
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 }); } }
public BTCPayNetworkProvider(NetworkType networkType) { _NBXplorerNetworkProvider = new NBXplorerNetworkProvider(networkType); NetworkType = networkType; InitBitcoin(); InitLitecoin(); InitDogecoin(); InitBitcoinGold(); InitMonacoin(); InitPolis(); InitFeathercoin(); InitGroestlcoin(); //InitUfo(); }
static async Task <int> Main(string[] args) { var validChains = string.Join(",", new NBXplorerNetworkProvider(NetworkType.Mainnet).GetAll().Select(n => n.CryptoCode.ToLowerInvariant()).ToArray()); using (CancellationTokenSource stop = new CancellationTokenSource()) using (CancelOnExit(stop)) { var provider = new CommandLineExConfigurationProvider(args, CreateCommandLineApplication); provider.Load(); if (provider.TryGet("help", out var unused)) { return(1); } if (!provider.TryGet("chains", out var chains)) { chains = "btc"; } if (!provider.TryGet("network", out var network)) { network = "mainnet"; } var networkType = GetNetworkType(network); var networkProvider = new NBXplorerNetworkProvider(networkType); var supportedChains = chains .Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(t => GetNetwork(provider, networkProvider, t, validChains)) .ToList(); var wait = TimeSpan.FromSeconds(1); while (true) { if (await AreSynchedAndStarted(supportedChains, stop.Token)) { return(0); } Write($"-----trying again in {(int)wait.TotalSeconds} seconds-----"); await Task.Delay(wait, stop.Token); wait = TimeSpan.FromTicks(2 * wait.Ticks); if (wait > TimeSpan.FromMinutes(5)) { wait = TimeSpan.FromMinutes(5); } } } }
BTCPayNetworkProvider(BTCPayNetworkProvider unfiltered, string[] bitcoinCodes) { UnfilteredNetworks = unfiltered.UnfilteredNetworks ?? unfiltered; NetworkType = unfiltered.NetworkType; _NBXplorerNetworkProvider = new NBXplorerNetworkProvider(unfiltered.NetworkType); _Networks = new Dictionary <string, BTCPayNetworkBase>(); bitcoinCodes = bitcoinCodes.Select(c => c.ToUpperInvariant()).ToArray(); foreach (var network in unfiltered._Networks) { if (bitcoinCodes.Contains(network.Key)) { _Networks.Add(network.Key, network.Value); } } }
public void InitLiquidAssets() { var nbxplorerNetwork = NBXplorerNetworkProvider.GetFromCryptoCode("LBTC"); Add(new ElementsBTCPayNetwork() { CryptoCode = "USDt", NetworkCryptoCode = "LBTC", ShowSyncSummary = false, DefaultRateRules = new[] { "USDT_UST = 1", "USDT_X = USDT_BTC * BTC_X", "USDT_BTC = bitfinex(UST_BTC)", }, AssetId = new uint256("ce091c998b83c78bb71a632313ba3760f1763d9cfcffae02258ffa9865a37bd2"), DisplayName = "Liquid Tether", BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://blockstream.info/liquid/tx/{0}" : "https://blockstream.info/testnet/liquid/tx/{0}", NBXplorerNetwork = nbxplorerNetwork, UriScheme = "liquidnetwork", CryptoImagePath = "imlegacy/liquid-tether.svg", DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("1776'") : new KeyPath("1'"), SupportRBF = true }); Add(new ElementsBTCPayNetwork() { CryptoCode = "ETB", NetworkCryptoCode = "LBTC", ShowSyncSummary = false, DefaultRateRules = new[] { "ETB_X = ETB_BTC * BTC_X", "ETB_BTC = bitpay(ETB_BTC)" }, Divisibility = 2, AssetId = new uint256("aa775044c32a7df391902b3659f46dfe004ccb2644ce2ddc7dba31e889391caf"), DisplayName = "Ethiopian Birr", BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://blockstream.info/liquid/tx/{0}" : "https://blockstream.info/testnet/liquid/tx/{0}", NBXplorerNetwork = nbxplorerNetwork, UriScheme = "liquidnetwork", CryptoImagePath = "imlegacy/etb.png", DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("1776'") : new KeyPath("1'"), SupportRBF = true }); }
public void InitLitecoin() { var nbxplorerNetwork = NBXplorerNetworkProvider.GetFromCryptoCode("LTC"); Add(new BTCPayNetwork() { CryptoCode = nbxplorerNetwork.CryptoCode, BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://live.blockcypher.com/ltc/tx/{0}/" : "http://explorer.litecointools.com/tx/{0}", NBitcoinNetwork = nbxplorerNetwork.NBitcoinNetwork, NBXplorerNetwork = nbxplorerNetwork, UriScheme = "litecoin", CryptoImagePath = "imlegacy/litecoin-symbol.svg", LightningImagePath = "imlegacy/ltc-lightning.svg", DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("2'") : new KeyPath("1'") }); }
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 BTCPayNetworkProvider(ChainName networkType) { _NBXplorerNetworkProvider = new NBXplorerNetworkProvider(networkType); NetworkType = networkType; InitBitcoin(); #if ALTCOINS InitLiquid(); InitLiquidAssets(); InitLitecoin(); InitBitcore(); InitDogecoin(); InitBGold(); InitMonacoin(); InitDash(); InitFeathercoin(); InitAlthash(); InitGroestlcoin(); InitViacoin(); InitMonero(); InitPolis(); InitChaincoin(); // InitArgoneum();//their rate source is down 9/15/20. InitMonetaryUnit(); InitEthereum(); InitERC20(); // Assume that electrum mappings are same as BTC if not specified foreach (var network in _Networks.Values.OfType <BTCPayNetwork>()) { if (network.ElectrumMapping.Count == 0) { network.ElectrumMapping = GetNetwork <BTCPayNetwork>("BTC").ElectrumMapping; if (!network.NBitcoinNetwork.Consensus.SupportSegwit) { network.ElectrumMapping = network.ElectrumMapping .Where(kv => kv.Value == DerivationType.Legacy) .ToDictionary(k => k.Key, k => k.Value); } } } // Disabled because of https://twitter.com/Cryptopia_NZ/status/1085084168852291586 //InitBPlus(); //InitUfo(); #endif }