btcpayserver/BTCPayServer.Common/BTCPayNetworkProvider.cs

139 lines
4.7 KiB
C#
Raw Normal View History

2020-06-28 21:44:35 -05:00
using System;
using System.Collections.Generic;
using System.Linq;
using NBitcoin;
using NBXplorer;
namespace BTCPayServer
{
public partial class BTCPayNetworkProvider
{
protected readonly Dictionary<string, BTCPayNetworkBase> _Networks = new Dictionary<string, BTCPayNetworkBase>();
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<string, BTCPayNetworkBase>();
cryptoCodes = cryptoCodes.Select(c => c.ToUpperInvariant()).ToArray();
foreach (var network in unfiltered._Networks)
{
2020-06-28 17:55:27 +09:00
if (cryptoCodes.Contains(network.Key))
{
_Networks.Add(network.Key, network.Value);
}
}
}
public ChainName NetworkType { get; private set; }
public BTCPayNetworkProvider(ChainName networkType)
{
2018-04-19 16:54:25 +09:00
_NBXplorerNetworkProvider = new NBXplorerNetworkProvider(networkType);
NetworkType = networkType;
InitBitcoin();
2020-08-03 19:17:15 +03:00
#if ALTCOINS
2019-12-24 08:20:44 +01:00
InitLiquid();
InitLiquidAssets();
InitLitecoin();
2019-01-16 22:04:24 +00:00
InitBitcore();
2018-04-10 19:07:57 +09:00
InitDogecoin();
InitBGold();
2018-05-11 14:24:29 +09:00
InitMonacoin();
2018-07-27 21:06:19 +02:00
InitDash();
2018-06-03 14:30:43 +02:00
InitFeathercoin();
InitAlthash();
2018-06-24 00:45:57 +09:00
InitGroestlcoin();
2018-06-21 13:31:12 +02:00
InitViacoin();
2019-09-30 10:32:43 +02:00
InitMonero();
InitZcash();
InitChaincoin();
2020-09-15 16:18:42 +02:00
// InitArgoneum();//their rate source is down 9/15/20.
2022-11-14 15:59:41 +09:00
// InitMonetaryUnit(); Not supported from Bittrex from 11/23/2022, dead shitcoin
// Assume that electrum mappings are same as BTC if not specified
foreach (var network in _Networks.Values.OfType<BTCPayNetwork>())
{
2020-06-28 17:55:27 +09:00
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);
}
}
}
2019-01-25 01:03:04 +01:00
// Disabled because of https://twitter.com/Cryptopia_NZ/status/1085084168852291586
//InitBPlus();
//InitUfo();
2020-08-03 19:17:15 +03:00
#endif
}
/// <summary>
/// Keep only the specified crypto
/// </summary>
/// <param name="cryptoCodes">Crypto to support</param>
/// <returns></returns>
public BTCPayNetworkProvider Filter(string[] cryptoCodes)
{
return new BTCPayNetworkProvider(this, cryptoCodes);
}
public BTCPayNetwork BTC => GetNetwork<BTCPayNetwork>("BTC");
2022-02-10 12:43:26 +09:00
public BTCPayNetworkBase DefaultNetwork => BTC ?? GetAll().First();
2019-12-24 08:20:44 +01:00
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<BTCPayNetworkBase> GetAll()
{
return _Networks.Values.ToArray();
}
public bool Support(string cryptoCode)
{
return _Networks.ContainsKey(cryptoCode.ToUpperInvariant());
}
public BTCPayNetworkBase GetNetwork(string cryptoCode)
{
2019-12-24 08:20:44 +01:00
return GetNetwork<BTCPayNetworkBase>(cryptoCode.ToUpperInvariant());
}
2020-06-28 17:55:27 +09:00
public T GetNetwork<T>(string cryptoCode) where T : BTCPayNetworkBase
{
ArgumentNullException.ThrowIfNull(cryptoCode);
2020-06-28 17:55:27 +09:00
if (!_Networks.TryGetValue(cryptoCode.ToUpperInvariant(), out BTCPayNetworkBase network))
{
if (cryptoCode == "XBT")
return GetNetwork<T>("BTC");
}
return network as T;
}
public bool TryGetNetwork<T>(string cryptoCode, out T network) where T : BTCPayNetworkBase
{
network = GetNetwork<T>(cryptoCode);
return network != null;
}
}
}