From 2c26d558131f10a73b9ee27e17c29957ff88938b Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Thu, 30 Jul 2020 22:04:38 +0900 Subject: [PATCH] Missing files --- .../BTCPayNetworkProvider.Bitcoin.cs | 42 ++++++ BTCPayServer.Common/BTCPayNetworkProvider.cs | 133 ++++++++++++++++++ 2 files changed, 175 insertions(+) create mode 100644 BTCPayServer.Common/BTCPayNetworkProvider.Bitcoin.cs create mode 100644 BTCPayServer.Common/BTCPayNetworkProvider.cs diff --git a/BTCPayServer.Common/BTCPayNetworkProvider.Bitcoin.cs b/BTCPayServer.Common/BTCPayNetworkProvider.Bitcoin.cs new file mode 100644 index 000000000..26bce2f00 --- /dev/null +++ b/BTCPayServer.Common/BTCPayNetworkProvider.Bitcoin.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using NBitcoin; +using NBXplorer; + +namespace BTCPayServer +{ + public partial class BTCPayNetworkProvider + { + public void InitBitcoin() + { + var nbxplorerNetwork = NBXplorerNetworkProvider.GetFromCryptoCode("BTC"); + Add(new BTCPayNetwork() + { + CryptoCode = nbxplorerNetwork.CryptoCode, + DisplayName = "Bitcoin", + BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://blockstream.info/tx/{0}" : "https://blockstream.info/testnet/tx/{0}", + 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, + SupportPayJoin = true, + //https://github.com/spesmilo/electrum/blob/11733d6bc271646a00b69ff07657119598874da4/electrum/constants.py + ElectrumMapping = NetworkType == NetworkType.Mainnet + ? new Dictionary() + { + {0x0488b21eU, DerivationType.Legacy }, // xpub + {0x049d7cb2U, DerivationType.SegwitP2SH }, // ypub + {0x04b24746U, DerivationType.Segwit }, //zpub + } + : new Dictionary() + { + {0x043587cfU, DerivationType.Legacy}, // tpub + {0x044a5262U, DerivationType.SegwitP2SH}, // upub + {0x045f1cf6U, DerivationType.Segwit} // vpub + } + }); + } + } +} diff --git a/BTCPayServer.Common/BTCPayNetworkProvider.cs b/BTCPayServer.Common/BTCPayNetworkProvider.cs new file mode 100644 index 000000000..852497a84 --- /dev/null +++ b/BTCPayServer.Common/BTCPayNetworkProvider.cs @@ -0,0 +1,133 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NBitcoin; +using NBXplorer; + +namespace BTCPayServer +{ + public partial class BTCPayNetworkProvider + { + readonly Dictionary _Networks = new Dictionary(); + + + private readonly NBXplorerNetworkProvider _NBXplorerNetworkProvider; + public NBXplorerNetworkProvider NBXplorerNetworkProvider + { + get + { + return _NBXplorerNetworkProvider; + } + } + + BTCPayNetworkProvider(BTCPayNetworkProvider unfiltered, string[] cryptoCodes) + { + NetworkType = unfiltered.NetworkType; + _NBXplorerNetworkProvider = new NBXplorerNetworkProvider(unfiltered.NetworkType); + _Networks = new Dictionary(); + cryptoCodes = cryptoCodes.Select(c => c.ToUpperInvariant()).ToArray(); + foreach (var network in unfiltered._Networks) + { + if (cryptoCodes.Contains(network.Key)) + { + _Networks.Add(network.Key, network.Value); + } + } + } + + + public NetworkType NetworkType { get; private set; } + public BTCPayNetworkProvider(NetworkType networkType) + { + _NBXplorerNetworkProvider = new NBXplorerNetworkProvider(networkType); + NetworkType = networkType; + InitBitcoin(); +#if ALTCOINS + InitLiquid(); + InitLiquidAssets(); + InitLitecoin(); + InitBitcore(); + InitDogecoin(); + InitBitcoinGold(); + InitMonacoin(); + InitDash(); + InitFeathercoin(); + InitGroestlcoin(); + InitViacoin(); + InitMonero(); + InitPolis(); + InitChaincoin(); + InitArgoneum(); + + // Assume that electrum mappings are same as BTC if not specified + foreach (var network in _Networks.Values.OfType()) + { + if (network.ElectrumMapping.Count == 0) + { + network.ElectrumMapping = GetNetwork("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 + //InitBitcoinplus(); + //InitUfo(); +#endif + } + + /// + /// Keep only the specified crypto + /// + /// Crypto to support + /// + public BTCPayNetworkProvider Filter(string[] cryptoCodes) + { + return new BTCPayNetworkProvider(this, cryptoCodes); + } + + [Obsolete("To use only for legacy stuff")] + public BTCPayNetwork BTC => GetNetwork("BTC"); + + public void Add(BTCPayNetwork network) + { + if (network.NBitcoinNetwork == null) + return; + Add(network as BTCPayNetworkBase); + } + public void Add(BTCPayNetworkBase network) + { + _Networks.Add(network.CryptoCode.ToUpperInvariant(), network); + } + + public IEnumerable GetAll() + { + return _Networks.Values.ToArray(); + } + + public bool Support(string cryptoCode) + { + return _Networks.ContainsKey(cryptoCode.ToUpperInvariant()); + } + public BTCPayNetworkBase GetNetwork(string cryptoCode) + { + return GetNetwork(cryptoCode.ToUpperInvariant()); + } + public T GetNetwork(string cryptoCode) where T : BTCPayNetworkBase + { + if (cryptoCode == null) + throw new ArgumentNullException(nameof(cryptoCode)); + if (!_Networks.TryGetValue(cryptoCode.ToUpperInvariant(), out BTCPayNetworkBase network)) + { + if (cryptoCode == "XBT") + return GetNetwork("BTC"); + } + return network as T; + } + } +}