make default configuration just work with multi chains

This commit is contained in:
nicolas.dorier
2018-01-11 22:52:28 +09:00
parent 223558c01d
commit 8596e16feb
15 changed files with 168 additions and 222 deletions

View File

@@ -45,21 +45,13 @@ namespace BTCPayServer.Tests
} }
public Uri LTCNBXplorerUri { get; set; } public Uri LTCNBXplorerUri { get; set; }
public string CookieFile
{
get; set;
}
public Uri ServerUri public Uri ServerUri
{ {
get; get;
set; set;
} }
public ExtKey HDPrivateKey
{
get; set;
}
public string Postgres public string Postgres
{ {
get; set; get; set;
@@ -76,15 +68,17 @@ namespace BTCPayServer.Tests
if (!Directory.Exists(_Directory)) if (!Directory.Exists(_Directory))
Directory.CreateDirectory(_Directory); Directory.CreateDirectory(_Directory);
HDPrivateKey = new ExtKey();
StringBuilder config = new StringBuilder(); StringBuilder config = new StringBuilder();
config.AppendLine($"regtest=1"); config.AppendLine($"regtest=1");
config.AppendLine($"port={Port}"); config.AppendLine($"port={Port}");
config.AppendLine($"explorer.url={NBXplorerUri.AbsoluteUri}"); config.AppendLine($"chains=btc,ltc");
config.AppendLine($"btc.explorer.url={NBXplorerUri.AbsoluteUri}");
config.AppendLine($"btc.explorer.cookiefile=0");
config.AppendLine($"ltc.explorer.url={LTCNBXplorerUri.AbsoluteUri}"); config.AppendLine($"ltc.explorer.url={LTCNBXplorerUri.AbsoluteUri}");
config.AppendLine($"explorer.cookiefile={CookieFile}"); config.AppendLine($"ltc.explorer.cookiefile=0");
config.AppendLine($"ltc.explorer.cookiefile={CookieFile}");
config.AppendLine($"hdpubkey={HDPrivateKey.Neuter().ToString(Network.RegTest)}");
if (Postgres != null) if (Postgres != null)
config.AppendLine($"postgres=" + Postgres); config.AppendLine($"postgres=" + Postgres);
File.WriteAllText(Path.Combine(_Directory, "settings.config"), config.ToString()); File.WriteAllText(Path.Combine(_Directory, "settings.config"), config.ToString());

View File

@@ -12,7 +12,7 @@ namespace BTCPayServer.Tests
public EclairTester(ServerTester parent, string environmentName, string defaultRPC, string defaultHost) public EclairTester(ServerTester parent, string environmentName, string defaultRPC, string defaultHost)
{ {
this.parent = parent; this.parent = parent;
RPC = new EclairRPCClient(new Uri(parent.GetEnvironment(environmentName, defaultRPC)), parent.Network); //RPC = new EclairRPCClient(new Uri(parent.GetEnvironment(environmentName, defaultRPC)), parent.Network);
P2PHost = parent.GetEnvironment(environmentName + "_HOST", defaultHost); P2PHost = parent.GetEnvironment(environmentName + "_HOST", defaultHost);
} }

View File

@@ -47,12 +47,12 @@ namespace BTCPayServer.Tests
Directory.CreateDirectory(_Directory); Directory.CreateDirectory(_Directory);
var network = new BTCPayNetworkProvider(Network); NetworkProvider = new BTCPayNetworkProvider(ChainType.Regtest);
ExplorerNode = new RPCClient(RPCCredentialString.Parse(GetEnvironment("TESTS_RPCCONNECTION", "server=http://127.0.0.1:43782;ceiwHEbqWI83:DwubwWsoo3")), network.GetNetwork("BTC").NBitcoinNetwork); ExplorerNode = new RPCClient(RPCCredentialString.Parse(GetEnvironment("TESTS_RPCCONNECTION", "server=http://127.0.0.1:43782;ceiwHEbqWI83:DwubwWsoo3")), NetworkProvider.GetNetwork("BTC").NBitcoinNetwork);
LTCExplorerNode = new RPCClient(RPCCredentialString.Parse(GetEnvironment("TESTS_LTCRPCCONNECTION", "server=http://127.0.0.1:43783;ceiwHEbqWI83:DwubwWsoo3")), network.GetNetwork("LTC").NBitcoinNetwork); LTCExplorerNode = new RPCClient(RPCCredentialString.Parse(GetEnvironment("TESTS_LTCRPCCONNECTION", "server=http://127.0.0.1:43783;ceiwHEbqWI83:DwubwWsoo3")), NetworkProvider.GetNetwork("LTC").NBitcoinNetwork);
ExplorerClient = new ExplorerClient(Network, new Uri(GetEnvironment("TESTS_NBXPLORERURL", "http://127.0.0.1:32838/"))); ExplorerClient = new ExplorerClient(NetworkProvider.GetNetwork("BTC").NBitcoinNetwork, new Uri(GetEnvironment("TESTS_NBXPLORERURL", "http://127.0.0.1:32838/")));
LTCExplorerClient = new ExplorerClient(Network, new Uri(GetEnvironment("TESTS_LTCNBXPLORERURL", "http://127.0.0.1:32839/"))); LTCExplorerClient = new ExplorerClient(NetworkProvider.GetNetwork("LTC").NBitcoinNetwork, new Uri(GetEnvironment("TESTS_LTCNBXPLORERURL", "http://127.0.0.1:32839/")));
PayTester = new BTCPayServerTester(Path.Combine(_Directory, "pay")) PayTester = new BTCPayServerTester(Path.Combine(_Directory, "pay"))
{ {
@@ -108,6 +108,8 @@ namespace BTCPayServer.Tests
{ {
return new TestAccount(this); return new TestAccount(this);
} }
public BTCPayNetworkProvider NetworkProvider { get; private set; }
public RPCClient ExplorerNode public RPCClient ExplorerNode
{ {
get; set; get; set;
@@ -224,12 +226,6 @@ namespace BTCPayServer.Tests
get; set; get; set;
} }
public Network Network
{
get;
set;
} = Network.RegTest;
public void Dispose() public void Dispose()
{ {
if (PayTester != null) if (PayTester != null)

View File

@@ -46,17 +46,18 @@ namespace BTCPayServer.Tests
Assert.IsType<ViewResult>(await store.RequestPairing(pairingCode.ToString())); Assert.IsType<ViewResult>(await store.RequestPairing(pairingCode.ToString()));
await store.Pair(pairingCode.ToString(), StoreId); await store.Pair(pairingCode.ToString(), StoreId);
} }
public StoresController CreateStore() public StoresController CreateStore(string cryptoCode = "BTC")
{ {
return CreateStoreAsync().GetAwaiter().GetResult(); return CreateStoreAsync(cryptoCode).GetAwaiter().GetResult();
} }
public async Task<StoresController> CreateStoreAsync() public async Task<StoresController> CreateStoreAsync(string cryptoCode = "BTC")
{ {
ExtKey = new ExtKey().GetWif(parent.Network); SupportedNetwork = parent.NetworkProvider.GetNetwork(cryptoCode);
ExtKey = new ExtKey().GetWif(SupportedNetwork.NBitcoinNetwork);
var store = parent.PayTester.GetController<StoresController>(UserId); var store = parent.PayTester.GetController<StoresController>(UserId);
await store.CreateStore(new CreateStoreViewModel() { Name = "Test Store" }); await store.CreateStore(new CreateStoreViewModel() { Name = "Test Store" });
StoreId = store.CreatedStoreId; StoreId = store.CreatedStoreId;
DerivationScheme = new DerivationStrategyFactory(parent.Network).Parse(ExtKey.Neuter().ToString() + "-[legacy]"); DerivationScheme = new DerivationStrategyFactory(SupportedNetwork.NBitcoinNetwork).Parse(ExtKey.Neuter().ToString() + "-[legacy]");
await store.UpdateStore(StoreId, new StoreViewModel() await store.UpdateStore(StoreId, new StoreViewModel()
{ {
SpeedPolicy = SpeedPolicy.MediumSpeed SpeedPolicy = SpeedPolicy.MediumSpeed
@@ -71,6 +72,8 @@ namespace BTCPayServer.Tests
return store; return store;
} }
public BTCPayNetwork SupportedNetwork { get; set; }
public void RegisterDerivationScheme(string crytoCode) public void RegisterDerivationScheme(string crytoCode)
{ {
RegisterDerivationSchemeAsync(crytoCode).GetAwaiter().GetResult(); RegisterDerivationSchemeAsync(crytoCode).GetAwaiter().GetResult();

View File

@@ -330,13 +330,13 @@ namespace BTCPayServer.Tests
false, //subtractfeefromamount false, //subtractfeefromamount
true, //replaceable true, //replaceable
}).ResultString); }).ResultString);
var invoiceAddress = BitcoinAddress.Create(invoice.BitcoinAddress, tester.Network); var invoiceAddress = BitcoinAddress.Create(invoice.BitcoinAddress, user.SupportedNetwork.NBitcoinNetwork);
Eventually(() => Eventually(() =>
{ {
invoice = user.BitPay.GetInvoice(invoice.Id); invoice = user.BitPay.GetInvoice(invoice.Id);
Assert.Equal(payment1, invoice.BtcPaid); Assert.Equal(payment1, invoice.BtcPaid);
invoiceAddress = BitcoinAddress.Create(invoice.BitcoinAddress, tester.Network); invoiceAddress = BitcoinAddress.Create(invoice.BitcoinAddress, user.SupportedNetwork.NBitcoinNetwork);
}); });
var tx = tester.ExplorerNode.GetRawTransaction(new uint256(tx1)); var tx = tester.ExplorerNode.GetRawTransaction(new uint256(tx1));

View File

@@ -39,7 +39,7 @@ services:
- postgres - postgres
bitcoin-nbxplorer: bitcoin-nbxplorer:
image: nicolasdorier/nbxplorer:1.0.0.47 image: nicolasdorier/nbxplorer:1.0.0.48
ports: ports:
- "32838:32838" - "32838:32838"
expose: expose:
@@ -57,7 +57,7 @@ services:
- bitcoind - bitcoind
litecoin-nbxplorer: litecoin-nbxplorer:
image: nicolasdorier/nbxplorer:1.0.0.47 image: nicolasdorier/nbxplorer:1.0.0.48
ports: ports:
- "32839:32839" - "32839:32839"
expose: expose:

View File

@@ -1,12 +1,54 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using BTCPayServer.Services.Rates; using BTCPayServer.Services.Rates;
using NBitcoin; using NBitcoin;
using NBXplorer.Configuration;
namespace BTCPayServer namespace BTCPayServer
{ {
public enum ChainType
{
Regtest,
Main,
Test
}
public class BTCPayDefaultSettings
{
static BTCPayDefaultSettings()
{
_Settings = new Dictionary<ChainType, BTCPayDefaultSettings>();
foreach (var chainType in new[] { ChainType.Main, ChainType.Test, ChainType.Regtest })
{
var btcNetwork = (chainType == ChainType.Main ? Network.Main :
chainType == ChainType.Regtest ? Network.RegTest :
chainType == ChainType.Test ? Network.TestNet : throw new NotSupportedException(chainType.ToString()));
var settings = new BTCPayDefaultSettings();
_Settings.Add(chainType, settings);
settings.ChainType = chainType;
settings.DefaultDataDirectory = StandardConfiguration.DefaultDataDirectory.GetDirectory("BTCPayServer", btcNetwork.Name);
settings.DefaultConfigurationFile = Path.Combine(settings.DefaultDataDirectory, "settings.config");
settings.DefaultPort = (chainType == ChainType.Main ? 23000 :
chainType == ChainType.Regtest ? 23002 :
chainType == ChainType.Test ? 23001 : throw new NotSupportedException(chainType.ToString()));
}
}
static Dictionary<ChainType, BTCPayDefaultSettings> _Settings;
public static BTCPayDefaultSettings GetDefaultSettings(ChainType chainType)
{
return _Settings[chainType];
}
public string DefaultDataDirectory { get; set; }
public string DefaultConfigurationFile { get; set; }
public ChainType ChainType { get; internal set; }
public int DefaultPort { get; set; }
}
public class BTCPayNetwork public class BTCPayNetwork
{ {
public Network NBitcoinNetwork { get; set; } public Network NBitcoinNetwork { get; set; }
@@ -25,6 +67,10 @@ namespace BTCPayServer
} }
public string CryptoImagePath { get; set; } public string CryptoImagePath { get; set; }
public NetworkInformation NBXplorerNetwork { get; set; }
public BTCPayDefaultSettings DefaultSettings { get; set; }
public override string ToString() public override string ToString()
{ {
return CryptoCode; return CryptoCode;

View File

@@ -1,11 +1,13 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using BTCPayServer.Services.Rates; using BTCPayServer.Services.Rates;
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Caching.Memory;
using NBitcoin; using NBitcoin;
using NBitpayClient; using NBitpayClient;
using NBXplorer.Configuration;
namespace BTCPayServer namespace BTCPayServer
{ {
@@ -16,14 +18,14 @@ namespace BTCPayServer
NBXplorer.Altcoins.Litecoin.Networks.EnsureRegistered(); NBXplorer.Altcoins.Litecoin.Networks.EnsureRegistered();
} }
Dictionary<string, BTCPayNetwork> _Networks = new Dictionary<string, BTCPayNetwork>(); Dictionary<string, BTCPayNetwork> _Networks = new Dictionary<string, BTCPayNetwork>();
public BTCPayNetworkProvider(Network network) public BTCPayNetworkProvider(ChainType chainType)
{ {
var coinaverage = new CoinAverageRateProvider("BTC"); var coinaverage = new CoinAverageRateProvider("BTC");
var bitpay = new BitpayRateProvider(new Bitpay(new Key(), new Uri("https://bitpay.com/"))); var bitpay = new BitpayRateProvider(new Bitpay(new Key(), new Uri("https://bitpay.com/")));
var btcRate = new FallbackRateProvider(new IRateProvider[] { coinaverage, bitpay }); var btcRate = new FallbackRateProvider(new IRateProvider[] { coinaverage, bitpay });
var ltcRate = new CoinAverageRateProvider("LTC"); var ltcRate = new CoinAverageRateProvider("LTC");
if (network == Network.Main) if (chainType == ChainType.Main)
{ {
Add(new BTCPayNetwork() Add(new BTCPayNetwork()
{ {
@@ -45,7 +47,7 @@ namespace BTCPayServer
}); });
} }
if (network == Network.TestNet) if (chainType == ChainType.Test)
{ {
Add(new BTCPayNetwork() Add(new BTCPayNetwork()
{ {
@@ -67,7 +69,7 @@ namespace BTCPayServer
}); });
} }
if (network == Network.RegTest) if (chainType == ChainType.Regtest)
{ {
Add(new BTCPayNetwork() Add(new BTCPayNetwork()
{ {
@@ -85,9 +87,15 @@ namespace BTCPayServer
NBitcoinNetwork = NBXplorer.Altcoins.Litecoin.Networks.Regtest, NBitcoinNetwork = NBXplorer.Altcoins.Litecoin.Networks.Regtest,
UriScheme = "litecoin", UriScheme = "litecoin",
DefaultRateProvider = ltcRate, DefaultRateProvider = ltcRate,
CryptoImagePath = "imlegacy/litecoin-symbol.svg" CryptoImagePath = "imlegacy/litecoin-symbol.svg",
}); });
} }
foreach(var n in _Networks)
{
n.Value.NBXplorerNetwork = NetworkInformation.GetNetworkByName(n.Value.NBitcoinNetwork.Name);
n.Value.DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(chainType);
}
} }
[Obsolete("To use only for legacy stuff")] [Obsolete("To use only for legacy stuff")]

View File

@@ -2,7 +2,7 @@
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework> <TargetFramework>netcoreapp2.0</TargetFramework>
<Version>1.0.0.65</Version> <Version>1.0.0.66</Version>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Compile Remove="Build\dockerfiles\**" /> <Compile Remove="Build\dockerfiles\**" />

View File

@@ -15,7 +15,7 @@ namespace BTCPayServer.Configuration
{ {
public class BTCPayServerOptions public class BTCPayServerOptions
{ {
public Network Network public ChainType ChainType
{ {
get; set; get; set;
} }
@@ -37,41 +37,35 @@ namespace BTCPayServer.Configuration
public void LoadArgs(IConfiguration conf) public void LoadArgs(IConfiguration conf)
{ {
var networkInfo = DefaultConfiguration.GetNetwork(conf); ChainType = DefaultConfiguration.GetChainType(conf);
Network = networkInfo?.Network; var defaultSettings = BTCPayDefaultSettings.GetDefaultSettings(ChainType);
if (Network == null) DataDir = conf.GetOrDefault<string>("datadir", defaultSettings.DefaultDataDirectory);
throw new ConfigException("Invalid network"); Logs.Configuration.LogInformation("Network: " + ChainType.ToString());
DataDir = conf.GetOrDefault<string>("datadir", networkInfo.DefaultDataDirectory); var supportedChains = conf.GetOrDefault<string>("chains", "btc")
Logs.Configuration.LogInformation("Network: " + Network); .Split(',', StringSplitOptions.RemoveEmptyEntries)
.Select(t => t.ToLowerInvariant());
var validChains = new List<string>();
bool btcHandled = false; foreach (var net in new BTCPayNetworkProvider(ChainType).GetAll())
foreach (var net in new BTCPayNetworkProvider(Network).GetAll())
{ {
var nbxplorer = NBXplorer.Configuration.NetworkInformation.GetNetworkByName(net.NBitcoinNetwork.Name); if (supportedChains.Contains(net.CryptoCode.ToLowerInvariant()))
var explorer = conf.GetOrDefault<Uri>($"{net.CryptoCode}.explorer.url", null);
var cookieFile = conf.GetOrDefault<string>($"{net.CryptoCode}.explorer.cookiefile", nbxplorer.GetDefaultCookieFile());
if (explorer != null)
{ {
#pragma warning disable CS0618 validChains.Add(net.CryptoCode.ToLowerInvariant());
if (net.IsBTC) var explorer = conf.GetOrDefault<Uri>($"{net.CryptoCode}.explorer.url", new Uri(net.NBXplorerNetwork.GetDefaultExplorerUrl()));
btcHandled = true; var cookieFile = conf.GetOrDefault<string>($"{net.CryptoCode}.explorer.cookiefile", net.NBXplorerNetwork.GetDefaultCookieFile());
#pragma warning restore CS0618 if (cookieFile.Trim() == "0")
ExplorerFactories.Add(net.CryptoCode, (n) => CreateExplorerClient(n, explorer, cookieFile)); cookieFile = null;
if (explorer != null)
{
ExplorerFactories.Add(net.CryptoCode, (n) => CreateExplorerClient(n, explorer, cookieFile));
}
} }
} }
var invalidChains = String.Join(',', supportedChains.Where(s => !validChains.Contains(s)).ToArray());
if(!string.IsNullOrEmpty(invalidChains))
throw new ConfigException($"Invalid chains {invalidChains}");
// Handle legacy explorer.url and explorer.cookiefile Logs.Configuration.LogInformation("Supported chains: " + String.Join(';', supportedChains.ToArray()));
if (!btcHandled)
{
var nbxplorer = NBXplorer.Configuration.NetworkInformation.GetNetworkByName(Network.Name); // Will get BTC info
var explorer = conf.GetOrDefault<Uri>($"explorer.url", new Uri(nbxplorer.GetDefaultExplorerUrl(), UriKind.Absolute));
var cookieFile = conf.GetOrDefault<string>($"explorer.cookiefile", nbxplorer.GetDefaultCookieFile());
ExplorerFactories.Add("BTC", (n) => CreateExplorerClient(n, explorer, cookieFile));
}
//////
PostgresConnectionString = conf.GetOrDefault<string>("postgres", null); PostgresConnectionString = conf.GetOrDefault<string>("postgres", null);
ExternalUrl = conf.GetOrDefault<Uri>("externalurl", null); ExternalUrl = conf.GetOrDefault<Uri>("externalurl", null);
} }
@@ -79,7 +73,7 @@ namespace BTCPayServer.Configuration
private static ExplorerClient CreateExplorerClient(BTCPayNetwork n, Uri uri, string cookieFile) private static ExplorerClient CreateExplorerClient(BTCPayNetwork n, Uri uri, string cookieFile)
{ {
var explorer = new ExplorerClient(n.NBitcoinNetwork, uri); var explorer = new ExplorerClient(n.NBitcoinNetwork, uri);
if (!explorer.SetCookieAuth(cookieFile)) if (cookieFile == null || !explorer.SetCookieAuth(cookieFile))
explorer.SetNoAuth(); explorer.SetNoAuth();
return explorer; return explorer;
} }

View File

@@ -17,20 +17,23 @@ namespace BTCPayServer.Configuration
{ {
protected override CommandLineApplication CreateCommandLineApplicationCore() protected override CommandLineApplication CreateCommandLineApplicationCore()
{ {
var provider = new BTCPayNetworkProvider(ChainType.Main);
var chains = string.Join(",", provider.GetAll().Select(n=>n.CryptoCode.ToLowerInvariant()).ToArray());
CommandLineApplication app = new CommandLineApplication(true) CommandLineApplication app = new CommandLineApplication(true)
{ {
FullName = "BTCPay\r\nOpen source, self-hosted payment processor.", FullName = "BTCPay\r\nOpen source, self-hosted payment processor.",
Name = "BTCPay" Name = "BTCPay"
}; };
app.HelpOption("-? | -h | --help"); app.HelpOption("-? | -h | --help");
app.Option("-n | --network", $"Set the network among ({NetworkInformation.ToStringAll()}) (default: {Network.Main.ToString()})", CommandOptionType.SingleValue); 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("--testnet | -testnet", $"Use testnet (Deprecated, use --network instead)", CommandOptionType.BoolValue);
app.Option("--regtest | -regtest", $"Use regtest", CommandOptionType.BoolValue); app.Option("--regtest | -regtest", $"Use regtest (Deprecated, use --network instead)", CommandOptionType.BoolValue);
app.Option("--chains | -c", $"Chains to support comma separated (default: btc, available: {chains})", CommandOptionType.SingleValue);
app.Option("--postgres", $"Connection string to postgres database (default: sqlite is used)", CommandOptionType.SingleValue); app.Option("--postgres", $"Connection string to postgres database (default: sqlite is used)", CommandOptionType.SingleValue);
foreach (var network in new BTCPayNetworkProvider(Network.Main).GetAll()) foreach (var network in provider.GetAll())
{ {
app.Option($"--{network.CryptoCode}explorerurl", $"Url of the NBxplorer for {network.CryptoCode} (default: If no explorer is specified, the default for Bitcoin will be selected)", CommandOptionType.SingleValue); app.Option($"--{network.CryptoCode}explorerurl", $"Url of the NBxplorer for {network.CryptoCode} (default: {network.NBXplorerNetwork.GetDefaultExplorerUrl()})", CommandOptionType.SingleValue);
app.Option($"--{network.CryptoCode}explorercookiefile", $"Path to the cookie file (default: Default setting of NBXplorer for the network)", CommandOptionType.SingleValue); app.Option($"--{network.CryptoCode}explorercookiefile", $"Path to the cookie file (default: {network.NBXplorerNetwork.GetDefaultCookieFile()})", CommandOptionType.SingleValue);
} }
app.Option("--externalurl", $"The expected external url of this service, to use if BTCPay is behind a reverse proxy (default: empty, use the incoming HTTP request to figure out)", CommandOptionType.SingleValue); app.Option("--externalurl", $"The expected external url of this service, to use if BTCPay is behind a reverse proxy (default: empty, use the incoming HTTP request to figure out)", CommandOptionType.SingleValue);
return app; return app;
@@ -40,12 +43,12 @@ namespace BTCPayServer.Configuration
protected override string GetDefaultDataDir(IConfiguration conf) protected override string GetDefaultDataDir(IConfiguration conf)
{ {
return GetNetwork(conf).DefaultDataDirectory; return BTCPayDefaultSettings.GetDefaultSettings(GetChainType(conf)).DefaultDataDirectory;
} }
protected override string GetDefaultConfigurationFile(IConfiguration conf) protected override string GetDefaultConfigurationFile(IConfiguration conf)
{ {
var network = GetNetwork(conf); var network = BTCPayDefaultSettings.GetDefaultSettings(GetChainType(conf));
var dataDir = conf["datadir"]; var dataDir = conf["datadir"];
if (dataDir == null) if (dataDir == null)
return network.DefaultConfigurationFile; return network.DefaultConfigurationFile;
@@ -53,44 +56,44 @@ namespace BTCPayServer.Configuration
return Path.Combine(dataDir, fileName); return Path.Combine(dataDir, fileName);
} }
public static NetworkInformation GetNetwork(IConfiguration conf) public static ChainType GetChainType(IConfiguration conf)
{ {
var network = conf.GetOrDefault<string>("network", null); var network = conf.GetOrDefault<string>("network", null);
if (network != null) if (network != null)
{ {
var info = NetworkInformation.GetNetworkByName(network); var n = Network.GetNetwork(network);
if (info == null) if (n == Network.Main)
throw new ConfigException($"Invalid network name {network}"); return ChainType.Main;
return info; if (n == Network.TestNet)
return ChainType.Test;
if (n == Network.RegTest)
return ChainType.Regtest;
} }
var net = conf.GetOrDefault<bool>("regtest", false) ? ChainType.Regtest:
conf.GetOrDefault<bool>("testnet", false) ? ChainType.Test : ChainType.Main;
var net = conf.GetOrDefault<bool>("regtest", false) ? Network.RegTest : return net;
conf.GetOrDefault<bool>("testnet", false) ? Network.TestNet : Network.Main;
return NetworkInformation.GetNetworkByName(net.Name);
} }
protected override string GetDefaultConfigurationFileTemplate(IConfiguration conf) protected override string GetDefaultConfigurationFileTemplate(IConfiguration conf)
{ {
var network = GetNetwork(conf); var defaultSettings = BTCPayDefaultSettings.GetDefaultSettings(GetChainType(conf));
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
builder.AppendLine("### Global settings ###"); builder.AppendLine("### Global settings ###");
builder.AppendLine("#testnet=0"); builder.AppendLine("#network=mainnet");
builder.AppendLine("#regtest=0");
builder.AppendLine(); builder.AppendLine();
builder.AppendLine("### Server settings ###"); builder.AppendLine("### Server settings ###");
builder.AppendLine("#port=" + network.DefaultPort); builder.AppendLine("#port=" + defaultSettings.DefaultPort);
builder.AppendLine("#bind=127.0.0.1"); builder.AppendLine("#bind=127.0.0.1");
builder.AppendLine(); builder.AppendLine();
builder.AppendLine("### Database ###"); builder.AppendLine("### Database ###");
builder.AppendLine("#postgres=User ID=root;Password=myPassword;Host=localhost;Port=5432;Database=myDataBase;"); builder.AppendLine("#postgres=User ID=root;Password=myPassword;Host=localhost;Port=5432;Database=myDataBase;");
builder.AppendLine(); builder.AppendLine();
builder.AppendLine("### NBXplorer settings ###"); builder.AppendLine("### NBXplorer settings ###");
foreach (var n in new BTCPayNetworkProvider(network.Network).GetAll()) foreach (var n in new BTCPayNetworkProvider(defaultSettings.ChainType).GetAll())
{ {
var nbxplorer = NBXplorer.Configuration.NetworkInformation.GetNetworkByName(n.NBitcoinNetwork.ToString()); builder.AppendLine($"#{n.CryptoCode}.explorer.url={n.NBXplorerNetwork.GetDefaultExplorerUrl()}");
builder.AppendLine($"#{n.CryptoCode}.explorer.url={nbxplorer.GetDefaultExplorerUrl()}"); builder.AppendLine($"#{n.CryptoCode}.explorer.cookiefile={ n.NBXplorerNetwork.GetDefaultCookieFile()}");
builder.AppendLine($"#{n.CryptoCode}.explorer.cookiefile={ nbxplorer.GetDefaultCookieFile()}");
} }
return builder.ToString(); return builder.ToString();
} }
@@ -99,7 +102,7 @@ namespace BTCPayServer.Configuration
protected override IPEndPoint GetDefaultEndpoint(IConfiguration conf) protected override IPEndPoint GetDefaultEndpoint(IConfiguration conf)
{ {
return new IPEndPoint(IPAddress.Parse("127.0.0.1"), GetNetwork(conf).DefaultPort); return new IPEndPoint(IPAddress.Parse("127.0.0.1"), BTCPayDefaultSettings.GetDefaultSettings(GetChainType(conf)).DefaultPort);
} }
} }
} }

View File

@@ -1,83 +0,0 @@
using Microsoft.Extensions.Configuration;
using NBitcoin;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace BTCPayServer.Configuration
{
public class NetworkInformation
{
static NetworkInformation()
{
_Networks = new Dictionary<string, NetworkInformation>();
foreach (var network in new[] { Network.Main, Network.TestNet, Network.RegTest })
{
NetworkInformation info = new NetworkInformation();
info.DefaultDataDirectory = StandardConfiguration.DefaultDataDirectory.GetDirectory("BTCPayServer", network.Name);
info.DefaultConfigurationFile = Path.Combine(info.DefaultDataDirectory, "settings.config");
info.Network = network;
info.DefaultPort = 23002;
_Networks.Add(network.Name, info);
if (network == Network.Main)
{
info.DefaultPort = 23000;
}
if (network == Network.TestNet)
{
info.DefaultPort = 23001;
}
}
}
static Dictionary<string, NetworkInformation> _Networks;
public static NetworkInformation GetNetworkByName(string name)
{
var value = _Networks.TryGet(name);
if (value != null)
return value;
//Maybe alias ?
var network = Network.GetNetwork(name);
if (network != null)
{
value = _Networks.TryGet(network.Name);
if (value != null)
return value;
}
return null;
}
public Network Network
{
get; set;
}
public string DefaultConfigurationFile
{
get;
set;
}
public string DefaultDataDirectory
{
get;
set;
}
public int DefaultPort
{
get;
private set;
}
public override string ToString()
{
return Network.ToString();
}
public static string ToStringAll()
{
return string.Join(", ", _Networks.Select(n => n.Key).ToArray());
}
}
}

View File

@@ -77,7 +77,7 @@ namespace BTCPayServer.Controllers
return NotFound(); return NotFound();
var payment = PaymentMessage.Load(Request.Body); var payment = PaymentMessage.Load(Request.Body);
var unused = wallet.BroadcastTransactionsAsync(payment.Transactions); var unused = wallet.BroadcastTransactionsAsync(payment.Transactions);
await _InvoiceRepository.AddRefundsAsync(invoiceId, payment.RefundTo.Select(p => new TxOut(p.Amount, p.Script)).ToArray()); await _InvoiceRepository.AddRefundsAsync(invoiceId, payment.RefundTo.Select(p => new TxOut(p.Amount, p.Script)).ToArray(), network.NBitcoinNetwork);
return new PaymentAckActionResult(payment.CreateACK(invoiceId + " is currently processing, thanks for your purchase...")); return new PaymentAckActionResult(payment.CreateACK(invoiceId + " is currently processing, thanks for your purchase..."));
} }
} }

View File

@@ -103,7 +103,7 @@ namespace BTCPayServer.Hosting
var dbpath = Path.Combine(opts.DataDir, "InvoiceDB"); var dbpath = Path.Combine(opts.DataDir, "InvoiceDB");
if (!Directory.Exists(dbpath)) if (!Directory.Exists(dbpath))
Directory.CreateDirectory(dbpath); Directory.CreateDirectory(dbpath);
return new InvoiceRepository(dbContext, dbpath, opts.Network); return new InvoiceRepository(dbContext, dbpath);
}); });
services.AddSingleton<BTCPayServerEnvironment>(); services.AddSingleton<BTCPayServerEnvironment>();
services.TryAddSingleton<TokenRepository>(); services.TryAddSingleton<TokenRepository>();
@@ -129,7 +129,7 @@ namespace BTCPayServer.Hosting
services.TryAddSingleton<BTCPayNetworkProvider>(o => services.TryAddSingleton<BTCPayNetworkProvider>(o =>
{ {
var opts = o.GetRequiredService<BTCPayServerOptions>(); var opts = o.GetRequiredService<BTCPayServerOptions>();
return new BTCPayNetworkProvider(opts.Network); return new BTCPayNetworkProvider(opts.ChainType);
}); });
services.TryAddSingleton<NBXplorerDashboard>(); services.TryAddSingleton<NBXplorerDashboard>();
@@ -152,7 +152,7 @@ namespace BTCPayServer.Hosting
services.TryAddSingleton<ExplorerClientProvider>(); services.TryAddSingleton<ExplorerClientProvider>();
services.TryAddSingleton<Bitpay>(o => services.TryAddSingleton<Bitpay>(o =>
{ {
if (o.GetRequiredService<BTCPayServerOptions>().Network == Network.Main) if (o.GetRequiredService<BTCPayServerOptions>().ChainType == ChainType.Main)
return new Bitpay(new Key(), new Uri("https://bitpay.com/")); return new Bitpay(new Key(), new Uri("https://bitpay.com/"));
else else
return new Bitpay(new Key(), new Uri("https://test.bitpay.com/")); return new Bitpay(new Key(), new Uri("https://test.bitpay.com/"));

View File

@@ -32,27 +32,12 @@ namespace BTCPayServer.Services.Invoices
} }
} }
Network _Network;
public Network Network
{
get
{
return _Network;
}
set
{
_Network = value;
}
}
private ApplicationDbContextFactory _ContextFactory; private ApplicationDbContextFactory _ContextFactory;
private CustomThreadPool _IndexerThread; private CustomThreadPool _IndexerThread;
public InvoiceRepository(ApplicationDbContextFactory contextFactory, string dbreezePath, Network network) public InvoiceRepository(ApplicationDbContextFactory contextFactory, string dbreezePath)
{ {
_Engine = new DBreezeEngine(dbreezePath); _Engine = new DBreezeEngine(dbreezePath);
_IndexerThread = new CustomThreadPool(1, "Invoice Indexer"); _IndexerThread = new CustomThreadPool(1, "Invoice Indexer");
_Network = network;
_ContextFactory = contextFactory; _ContextFactory = contextFactory;
} }
@@ -105,7 +90,7 @@ namespace BTCPayServer.Services.Invoices
public async Task<InvoiceEntity> CreateInvoiceAsync(string storeId, InvoiceEntity invoice, BTCPayNetworkProvider networkProvider) public async Task<InvoiceEntity> CreateInvoiceAsync(string storeId, InvoiceEntity invoice, BTCPayNetworkProvider networkProvider)
{ {
List<string> textSearch = new List<string>(); List<string> textSearch = new List<string>();
invoice = Clone(invoice); invoice = Clone(invoice, null);
invoice.Id = Encoders.Base58.EncodeData(RandomUtils.GetBytes(16)); invoice.Id = Encoders.Base58.EncodeData(RandomUtils.GetBytes(16));
#pragma warning disable CS0618 #pragma warning disable CS0618
invoice.Payments = new List<PaymentEntity>(); invoice.Payments = new List<PaymentEntity>();
@@ -118,7 +103,7 @@ namespace BTCPayServer.Services.Invoices
StoreDataId = storeId, StoreDataId = storeId,
Id = invoice.Id, Id = invoice.Id,
Created = invoice.InvoiceTime, Created = invoice.InvoiceTime,
Blob = ToBytes(invoice), Blob = ToBytes(invoice, null),
OrderId = invoice.OrderId, OrderId = invoice.OrderId,
Status = invoice.Status, Status = invoice.Status,
ItemCode = invoice.ProductInformation.ItemCode, ItemCode = invoice.ProductInformation.ItemCode,
@@ -150,8 +135,8 @@ namespace BTCPayServer.Services.Invoices
textSearch.Add(invoice.InvoiceTime.ToString(CultureInfo.InvariantCulture)); textSearch.Add(invoice.InvoiceTime.ToString(CultureInfo.InvariantCulture));
textSearch.Add(invoice.ProductInformation.Price.ToString(CultureInfo.InvariantCulture)); textSearch.Add(invoice.ProductInformation.Price.ToString(CultureInfo.InvariantCulture));
textSearch.Add(invoice.OrderId); textSearch.Add(invoice.OrderId);
textSearch.Add(ToString(invoice.BuyerInformation)); textSearch.Add(ToString(invoice.BuyerInformation, null));
textSearch.Add(ToString(invoice.ProductInformation)); textSearch.Add(ToString(invoice.ProductInformation, null));
textSearch.Add(invoice.StoreId); textSearch.Add(invoice.StoreId);
AddToTextSearch(invoice.Id, textSearch.ToArray()); AddToTextSearch(invoice.Id, textSearch.ToArray());
@@ -167,7 +152,7 @@ namespace BTCPayServer.Services.Invoices
if (invoice == null) if (invoice == null)
return false; return false;
var invoiceEntity = ToObject<InvoiceEntity>(invoice.Blob); var invoiceEntity = ToObject<InvoiceEntity>(invoice.Blob, network.NBitcoinNetwork);
var currencyData = invoiceEntity.GetCryptoData(network, null); var currencyData = invoiceEntity.GetCryptoData(network, null);
if (currencyData == null) if (currencyData == null)
return false; return false;
@@ -186,7 +171,7 @@ namespace BTCPayServer.Services.Invoices
} }
#pragma warning restore CS0618 #pragma warning restore CS0618
invoiceEntity.SetCryptoData(currencyData); invoiceEntity.SetCryptoData(currencyData);
invoice.Blob = ToBytes(invoiceEntity); invoice.Blob = ToBytes(invoiceEntity, network.NBitcoinNetwork);
context.AddressInvoices.Add(new AddressInvoiceData() { context.AddressInvoices.Add(new AddressInvoiceData() {
InvoiceDataId = invoiceId, CreatedTime = DateTimeOffset.UtcNow } InvoiceDataId = invoiceId, CreatedTime = DateTimeOffset.UtcNow }
@@ -225,7 +210,7 @@ namespace BTCPayServer.Services.Invoices
var invoiceData = await context.FindAsync<InvoiceData>(invoiceId).ConfigureAwait(false); var invoiceData = await context.FindAsync<InvoiceData>(invoiceId).ConfigureAwait(false);
if (invoiceData == null) if (invoiceData == null)
return; return;
var invoiceEntity = ToObject<InvoiceEntity>(invoiceData.Blob); var invoiceEntity = ToObject<InvoiceEntity>(invoiceData.Blob, null);
MarkUnassigned(invoiceId, invoiceEntity, context, null); MarkUnassigned(invoiceId, invoiceEntity, context, null);
try try
{ {
@@ -308,11 +293,11 @@ namespace BTCPayServer.Services.Invoices
private InvoiceEntity ToEntity(InvoiceData invoice) private InvoiceEntity ToEntity(InvoiceData invoice)
{ {
var entity = ToObject<InvoiceEntity>(invoice.Blob); var entity = ToObject<InvoiceEntity>(invoice.Blob, null);
#pragma warning disable CS0618 #pragma warning disable CS0618
entity.Payments = invoice.Payments.Select(p => entity.Payments = invoice.Payments.Select(p =>
{ {
var paymentEntity = ToObject<PaymentEntity>(p.Blob); var paymentEntity = ToObject<PaymentEntity>(p.Blob, null);
paymentEntity.Accounted = p.Accounted; paymentEntity.Accounted = p.Accounted;
return paymentEntity; return paymentEntity;
}).ToList(); }).ToList();
@@ -396,7 +381,7 @@ namespace BTCPayServer.Services.Invoices
} }
public async Task AddRefundsAsync(string invoiceId, TxOut[] outputs) public async Task AddRefundsAsync(string invoiceId, TxOut[] outputs, Network network)
{ {
if (outputs.Length == 0) if (outputs.Length == 0)
return; return;
@@ -410,14 +395,14 @@ namespace BTCPayServer.Services.Invoices
{ {
Id = invoiceId + "-" + i, Id = invoiceId + "-" + i,
InvoiceDataId = invoiceId, InvoiceDataId = invoiceId,
Blob = ToBytes(output) Blob = ToBytes(output, network)
}); });
i++; i++;
} }
await context.SaveChangesAsync().ConfigureAwait(false); await context.SaveChangesAsync().ConfigureAwait(false);
} }
var addresses = outputs.Select(o => o.ScriptPubKey.GetDestinationAddress(_Network)).Where(a => a != null).ToArray(); var addresses = outputs.Select(o => o.ScriptPubKey.GetDestinationAddress(network)).Where(a => a != null).ToArray();
AddToTextSearch(invoiceId, addresses.Select(a => a.ToString()).ToArray()); AddToTextSearch(invoiceId, addresses.Select(a => a.ToString()).ToArray());
} }
@@ -438,7 +423,7 @@ namespace BTCPayServer.Services.Invoices
PaymentData data = new PaymentData PaymentData data = new PaymentData
{ {
Id = receivedCoin.Outpoint.ToString(), Id = receivedCoin.Outpoint.ToString(),
Blob = ToBytes(entity), Blob = ToBytes(entity, null),
InvoiceDataId = invoiceId InvoiceDataId = invoiceId
}; };
@@ -468,24 +453,24 @@ namespace BTCPayServer.Services.Invoices
} }
} }
private T ToObject<T>(byte[] value) private T ToObject<T>(byte[] value, Network network)
{ {
return NBitcoin.JsonConverters.Serializer.ToObject<T>(ZipUtils.Unzip(value), Network); return NBitcoin.JsonConverters.Serializer.ToObject<T>(ZipUtils.Unzip(value), network);
} }
private byte[] ToBytes<T>(T obj) private byte[] ToBytes<T>(T obj, Network network)
{ {
return ZipUtils.Zip(NBitcoin.JsonConverters.Serializer.ToString(obj)); return ZipUtils.Zip(NBitcoin.JsonConverters.Serializer.ToString(obj, network));
} }
private T Clone<T>(T invoice) private T Clone<T>(T invoice, Network network)
{ {
return NBitcoin.JsonConverters.Serializer.ToObject<T>(ToString(invoice), Network); return NBitcoin.JsonConverters.Serializer.ToObject<T>(ToString(invoice, network), network);
} }
private string ToString<T>(T data) private string ToString<T>(T data, Network network)
{ {
return NBitcoin.JsonConverters.Serializer.ToString(data, Network); return NBitcoin.JsonConverters.Serializer.ToString(data, network);
} }
public void Dispose() public void Dispose()