2020-06-28 21:44:35 -05:00
|
|
|
using System;
|
2017-12-21 15:52:04 +09:00
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Linq;
|
|
|
|
using NBitcoin;
|
2018-01-12 11:54:57 +09:00
|
|
|
using NBXplorer;
|
2017-12-21 15:52:04 +09:00
|
|
|
|
|
|
|
namespace BTCPayServer
|
|
|
|
{
|
2018-01-12 11:54:57 +09:00
|
|
|
public partial class BTCPayNetworkProvider
|
2017-12-21 15:52:04 +09:00
|
|
|
{
|
2021-01-07 14:49:53 +01:00
|
|
|
protected readonly Dictionary<string, BTCPayNetworkBase> _Networks = new Dictionary<string, BTCPayNetworkBase>();
|
2017-12-21 15:52:04 +09:00
|
|
|
|
2018-01-12 11:54:57 +09:00
|
|
|
private readonly NBXplorerNetworkProvider _NBXplorerNetworkProvider;
|
|
|
|
public NBXplorerNetworkProvider NBXplorerNetworkProvider
|
|
|
|
{
|
|
|
|
get
|
2017-12-21 15:52:04 +09:00
|
|
|
{
|
2018-01-12 11:54:57 +09:00
|
|
|
return _NBXplorerNetworkProvider;
|
2017-12-21 15:52:04 +09:00
|
|
|
}
|
2018-01-12 11:54:57 +09:00
|
|
|
}
|
2018-01-11 22:52:28 +09:00
|
|
|
|
2019-06-04 09:16:18 +09:00
|
|
|
BTCPayNetworkProvider(BTCPayNetworkProvider unfiltered, string[] cryptoCodes)
|
2018-02-26 00:48:12 +09:00
|
|
|
{
|
2019-06-04 09:16:18 +09:00
|
|
|
NetworkType = unfiltered.NetworkType;
|
|
|
|
_NBXplorerNetworkProvider = new NBXplorerNetworkProvider(unfiltered.NetworkType);
|
2019-05-29 09:43:50 +00:00
|
|
|
_Networks = new Dictionary<string, BTCPayNetworkBase>();
|
2018-02-26 00:48:12 +09:00
|
|
|
cryptoCodes = cryptoCodes.Select(c => c.ToUpperInvariant()).ToArray();
|
2019-06-04 09:16:18 +09:00
|
|
|
foreach (var network in unfiltered._Networks)
|
2018-02-26 00:48:12 +09:00
|
|
|
{
|
2020-06-28 17:55:27 +09:00
|
|
|
if (cryptoCodes.Contains(network.Key))
|
2018-02-26 00:48:12 +09:00
|
|
|
{
|
|
|
|
_Networks.Add(network.Key, network.Value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-04 09:16:18 +09:00
|
|
|
|
2021-01-27 14:39:38 +09:00
|
|
|
public ChainName NetworkType { get; private set; }
|
|
|
|
public BTCPayNetworkProvider(ChainName networkType)
|
2018-01-12 11:54:57 +09:00
|
|
|
{
|
2018-04-19 16:54:25 +09:00
|
|
|
_NBXplorerNetworkProvider = new NBXplorerNetworkProvider(networkType);
|
|
|
|
NetworkType = networkType;
|
2018-01-12 11:54:57 +09:00
|
|
|
InitBitcoin();
|
2020-08-03 19:17:15 +03:00
|
|
|
#if ALTCOINS
|
2019-12-24 08:20:44 +01:00
|
|
|
InitLiquid();
|
|
|
|
InitLiquidAssets();
|
2018-01-12 11:54:57 +09:00
|
|
|
InitLitecoin();
|
2019-01-16 22:04:24 +00:00
|
|
|
InitBitcore();
|
2018-04-10 19:07:57 +09:00
|
|
|
InitDogecoin();
|
2020-12-02 23:34:38 -06:00
|
|
|
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();
|
2021-04-25 19:31:00 -07:00
|
|
|
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();
|
2022-02-14 16:04:34 +08:00
|
|
|
InitZcash();
|
2020-06-22 15:41:20 +10:00
|
|
|
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
|
2020-02-12 21:44:31 -08:00
|
|
|
|
2019-05-09 17:51:46 +09:00
|
|
|
// Assume that electrum mappings are same as BTC if not specified
|
2019-05-29 09:43:50 +00:00
|
|
|
foreach (var network in _Networks.Values.OfType<BTCPayNetwork>())
|
2019-05-09 17:51:46 +09:00
|
|
|
{
|
2020-06-28 17:55:27 +09:00
|
|
|
if (network.ElectrumMapping.Count == 0)
|
2019-05-09 17:51:46 +09:00
|
|
|
{
|
2019-05-29 09:43:50 +00:00
|
|
|
network.ElectrumMapping = GetNetwork<BTCPayNetwork>("BTC").ElectrumMapping;
|
|
|
|
if (!network.NBitcoinNetwork.Consensus.SupportSegwit)
|
2019-05-09 17:51:46 +09:00
|
|
|
{
|
2019-05-29 09:43:50 +00:00
|
|
|
network.ElectrumMapping =
|
|
|
|
network.ElectrumMapping
|
2019-05-09 19:05:08 +09:00
|
|
|
.Where(kv => kv.Value == DerivationType.Legacy)
|
2019-05-09 17:51:46 +09:00
|
|
|
.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
|
2020-12-02 23:34:38 -06:00
|
|
|
//InitBPlus();
|
2018-07-01 16:11:29 +09:00
|
|
|
//InitUfo();
|
2020-08-03 19:17:15 +03:00
|
|
|
#endif
|
2017-12-21 15:52:04 +09:00
|
|
|
}
|
|
|
|
|
2018-02-26 00:48:12 +09:00
|
|
|
/// <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);
|
|
|
|
}
|
|
|
|
|
2019-05-29 09:43:50 +00:00
|
|
|
public BTCPayNetwork BTC => GetNetwork<BTCPayNetwork>("BTC");
|
2022-02-10 12:43:26 +09:00
|
|
|
public BTCPayNetworkBase DefaultNetwork => BTC ?? GetAll().First();
|
2018-01-06 18:57:56 +09:00
|
|
|
|
2019-12-24 08:20:44 +01:00
|
|
|
public void Add(BTCPayNetwork network)
|
|
|
|
{
|
|
|
|
if (network.NBitcoinNetwork == null)
|
|
|
|
return;
|
|
|
|
Add(network as BTCPayNetworkBase);
|
|
|
|
}
|
2019-05-29 09:43:50 +00:00
|
|
|
public void Add(BTCPayNetworkBase network)
|
2017-12-21 15:52:04 +09:00
|
|
|
{
|
2018-02-26 00:48:12 +09:00
|
|
|
_Networks.Add(network.CryptoCode.ToUpperInvariant(), network);
|
2017-12-21 15:52:04 +09:00
|
|
|
}
|
|
|
|
|
2019-05-29 09:43:50 +00:00
|
|
|
public IEnumerable<BTCPayNetworkBase> GetAll()
|
2018-01-08 02:36:41 +09:00
|
|
|
{
|
|
|
|
return _Networks.Values.ToArray();
|
|
|
|
}
|
|
|
|
|
2018-02-26 00:48:12 +09:00
|
|
|
public bool Support(string cryptoCode)
|
|
|
|
{
|
|
|
|
return _Networks.ContainsKey(cryptoCode.ToUpperInvariant());
|
|
|
|
}
|
2019-06-04 09:52:06 +09:00
|
|
|
public BTCPayNetworkBase GetNetwork(string cryptoCode)
|
|
|
|
{
|
2019-12-24 08:20:44 +01:00
|
|
|
return GetNetwork<BTCPayNetworkBase>(cryptoCode.ToUpperInvariant());
|
2019-06-04 09:52:06 +09:00
|
|
|
}
|
2020-06-28 17:55:27 +09:00
|
|
|
public T GetNetwork<T>(string cryptoCode) where T : BTCPayNetworkBase
|
2017-12-21 15:52:04 +09:00
|
|
|
{
|
2021-12-28 17:39:54 +09:00
|
|
|
ArgumentNullException.ThrowIfNull(cryptoCode);
|
2020-06-28 17:55:27 +09:00
|
|
|
if (!_Networks.TryGetValue(cryptoCode.ToUpperInvariant(), out BTCPayNetworkBase network))
|
2018-05-04 15:35:39 +09:00
|
|
|
{
|
|
|
|
if (cryptoCode == "XBT")
|
2019-05-29 09:43:50 +00:00
|
|
|
return GetNetwork<T>("BTC");
|
2018-05-04 15:35:39 +09:00
|
|
|
}
|
2019-05-29 09:43:50 +00:00
|
|
|
return network as T;
|
2017-12-21 15:52:04 +09:00
|
|
|
}
|
2021-04-18 11:26:06 +09:00
|
|
|
public bool TryGetNetwork<T>(string cryptoCode, out T network) where T : BTCPayNetworkBase
|
|
|
|
{
|
|
|
|
network = GetNetwork<T>(cryptoCode);
|
|
|
|
return network != null;
|
|
|
|
}
|
2017-12-21 15:52:04 +09:00
|
|
|
}
|
2020-12-02 23:34:38 -06:00
|
|
|
}
|