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 ;
2023-11-29 18:51:40 +09:00
using BTCPayServer.Configuration ;
using BTCPayServer.Logging ;
using Microsoft.AspNetCore.DataProtection.KeyManagement ;
using Microsoft.AspNetCore.HttpOverrides ;
using Microsoft.Extensions.Configuration ;
using Microsoft.Extensions.Logging ;
2017-12-21 15:52:04 +09:00
using NBitcoin ;
2018-01-12 11:54:57 +09:00
using NBXplorer ;
2023-11-29 18:51:40 +09:00
using StandardConfiguration ;
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
2021-01-27 14:39:38 +09:00
public ChainName NetworkType { get ; private set ; }
2023-11-29 18:51:40 +09:00
public BTCPayNetworkProvider (
IEnumerable < BTCPayNetworkBase > networks ,
SelectedChains selectedChains ,
NBXplorerNetworkProvider nbxplorerNetworkProvider ,
2023-12-22 09:25:04 +01:00
Logs logs )
2018-01-12 11:54:57 +09:00
{
2023-12-22 09:25:04 +01:00
var networksList = networks . ToList ( ) ;
2023-11-29 18:51:40 +09:00
#if ! ALTCOINS
2023-12-22 09:25:04 +01:00
var onlyBTC = networksList . Count = = 1 & & networksList . First ( ) . IsBTC ;
2023-11-29 18:51:40 +09:00
if ( ! onlyBTC )
2023-12-22 09:25:04 +01:00
throw new ConfigException ( $"This build of BTCPay Server does not support altcoins. Configured networks: {string.Join(',', networksList.Select(n => n.CryptoCode).ToArray())}" ) ;
2023-11-29 18:51:40 +09:00
#endif
_NBXplorerNetworkProvider = nbxplorerNetworkProvider ;
NetworkType = nbxplorerNetworkProvider . NetworkType ;
2023-12-22 09:25:04 +01:00
foreach ( var network in networksList )
2019-05-09 17:51:46 +09:00
{
2023-11-29 18:51:40 +09:00
_Networks . Add ( network . CryptoCode . ToUpperInvariant ( ) , network ) ;
2019-05-09 17:51:46 +09:00
}
2023-11-29 18:51:40 +09:00
foreach ( var chain in selectedChains . ExplicitlySelected )
{
if ( GetNetwork < BTCPayNetworkBase > ( chain ) = = null )
throw new ConfigException ( $"Invalid chains \" { chain } \ "" ) ;
}
2017-12-21 15:52:04 +09:00
2023-12-22 09:25:04 +01:00
logs . Configuration . LogInformation ( "Supported chains: {Chains}" , string . Join ( ',' , _Networks . Select ( n = > n . Key ) . ToArray ( ) ) ) ;
2018-02-26 00:48:12 +09:00
}
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 ( ) ;
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
}