Update NBitcoin, NetworkType => ChainName, signet support (#2224)

This commit is contained in:
Nicolas Dorier
2021-01-27 14:39:38 +09:00
committed by GitHub
parent 994301ea4c
commit db0854f203
40 changed files with 125 additions and 116 deletions

View File

@@ -27,7 +27,7 @@
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" /> <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="NBitcoin" Version="5.0.68" /> <PackageReference Include="NBitcoin" Version="5.0.73" />
<PackageReference Include="BTCPayServer.Lightning.Common" Version="1.2.0" /> <PackageReference Include="BTCPayServer.Lightning.Common" Version="1.2.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup> </ItemGroup>

View File

@@ -17,7 +17,7 @@ namespace BTCPayServer.Client.Models
Description = description; Description = description;
Expiry = expiry; Expiry = expiry;
} }
[JsonConverter(typeof(LightMoneyJsonConverter))] [JsonConverter(typeof(BTCPayServer.Client.JsonConverters.LightMoneyJsonConverter))]
public LightMoney Amount { get; set; } public LightMoney Amount { get; set; }
public string Description { get; set; } public string Description { get; set; }
[JsonConverter(typeof(JsonConverters.TimeSpanJsonConverter.Seconds))] [JsonConverter(typeof(JsonConverters.TimeSpanJsonConverter.Seconds))]

View File

@@ -11,7 +11,7 @@ namespace BTCPayServer
{ {
CryptoCode = nbxplorerNetwork.CryptoCode, CryptoCode = nbxplorerNetwork.CryptoCode,
DisplayName = "Argoneum", DisplayName = "Argoneum",
BlockExplorerLink = NetworkType == NetworkType.Mainnet BlockExplorerLink = NetworkType == ChainName.Mainnet
? "https://chainz.cryptoid.info/agm/tx.dws?{0}" ? "https://chainz.cryptoid.info/agm/tx.dws?{0}"
: "https://chainz.cryptoid.info/agm-test/tx.dws?{0}", : "https://chainz.cryptoid.info/agm-test/tx.dws?{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
@@ -23,7 +23,7 @@ namespace BTCPayServer
}, },
CryptoImagePath = "imlegacy/argoneum.png", CryptoImagePath = "imlegacy/argoneum.png",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("421'") CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("421'")
: new KeyPath("1'") : new KeyPath("1'")
}); });
} }

View File

@@ -11,7 +11,7 @@ namespace BTCPayServer
{ {
CryptoCode = nbxplorerNetwork.CryptoCode, CryptoCode = nbxplorerNetwork.CryptoCode,
DisplayName = "BGold", DisplayName = "BGold",
BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://btgexplorer.com/tx/{0}" : "https://testnet.btgexplorer.com/tx/{0}", BlockExplorerLink = NetworkType == ChainName.Mainnet ? "https://btgexplorer.com/tx/{0}" : "https://testnet.btgexplorer.com/tx/{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
UriScheme = "bitcoingold", UriScheme = "bitcoingold",
DefaultRateRules = new[] DefaultRateRules = new[]
@@ -22,7 +22,7 @@ namespace BTCPayServer
CryptoImagePath = "imlegacy/btg.svg", CryptoImagePath = "imlegacy/btg.svg",
LightningImagePath = "imlegacy/btg-lightning.svg", LightningImagePath = "imlegacy/btg-lightning.svg",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("156'") : new KeyPath("1'") CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("156'") : new KeyPath("1'")
}); });
} }
} }

View File

@@ -12,7 +12,7 @@ namespace BTCPayServer
{ {
CryptoCode = nbxplorerNetwork.CryptoCode, CryptoCode = nbxplorerNetwork.CryptoCode,
DisplayName = "BPlus", DisplayName = "BPlus",
BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://chainz.cryptoid.info/xbc/tx.dws?{0}" : "https://chainz.cryptoid.info/xbc/tx.dws?{0}", BlockExplorerLink = NetworkType == ChainName.Mainnet ? "https://chainz.cryptoid.info/xbc/tx.dws?{0}" : "https://chainz.cryptoid.info/xbc/tx.dws?{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
UriScheme = "bplus-fix-it", UriScheme = "bplus-fix-it",
DefaultRateRules = new[] DefaultRateRules = new[]
@@ -22,7 +22,7 @@ namespace BTCPayServer
}, },
CryptoImagePath = "imlegacy/xbc.png", CryptoImagePath = "imlegacy/xbc.png",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("65'") : new KeyPath("1'") CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("65'") : new KeyPath("1'")
}); });
} }
} }

View File

@@ -12,7 +12,7 @@ namespace BTCPayServer
{ {
CryptoCode = nbxplorerNetwork.CryptoCode, CryptoCode = nbxplorerNetwork.CryptoCode,
DisplayName = "Bitcore", DisplayName = "Bitcore",
BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://insight.bitcore.cc/tx/{0}" : "https://insight.bitcore.cc/tx/{0}", BlockExplorerLink = NetworkType == ChainName.Mainnet ? "https://insight.bitcore.cc/tx/{0}" : "https://insight.bitcore.cc/tx/{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
UriScheme = "bitcore", UriScheme = "bitcore",
DefaultRateRules = new[] DefaultRateRules = new[]
@@ -23,7 +23,7 @@ namespace BTCPayServer
CryptoImagePath = "imlegacy/bitcore.svg", CryptoImagePath = "imlegacy/bitcore.svg",
LightningImagePath = "imlegacy/bitcore-lightning.svg", LightningImagePath = "imlegacy/bitcore-lightning.svg",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("160'") : new KeyPath("1'") CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("160'") : new KeyPath("1'")
}); });
} }
} }

View File

@@ -11,7 +11,7 @@ namespace BTCPayServer
{ {
CryptoCode = nbxplorerNetwork.CryptoCode, CryptoCode = nbxplorerNetwork.CryptoCode,
DisplayName = "Chaincoin", DisplayName = "Chaincoin",
BlockExplorerLink = NetworkType == NetworkType.Mainnet BlockExplorerLink = NetworkType == ChainName.Mainnet
? "https://explorer.chaincoin.org/Explorer/Transaction/{0}" ? "https://explorer.chaincoin.org/Explorer/Transaction/{0}"
: "https://test.explorer.chaincoin.org/Explorer/Transaction/tx/{0}", : "https://test.explorer.chaincoin.org/Explorer/Transaction/tx/{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
@@ -24,7 +24,7 @@ namespace BTCPayServer
CryptoImagePath = "imlegacy/chaincoin.png", CryptoImagePath = "imlegacy/chaincoin.png",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
//https://github.com/satoshilabs/slips/blob/master/slip-0044.md //https://github.com/satoshilabs/slips/blob/master/slip-0044.md
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("711'") CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("711'")
: new KeyPath("1'") : new KeyPath("1'")
}); });
} }

View File

@@ -12,7 +12,7 @@ namespace BTCPayServer
{ {
CryptoCode = nbxplorerNetwork.CryptoCode, CryptoCode = nbxplorerNetwork.CryptoCode,
DisplayName = "Dash", DisplayName = "Dash",
BlockExplorerLink = NetworkType == NetworkType.Mainnet BlockExplorerLink = NetworkType == ChainName.Mainnet
? "https://insight.dash.org/insight/tx/{0}" ? "https://insight.dash.org/insight/tx/{0}"
: "https://testnet-insight.dashevo.org/insight/tx/{0}", : "https://testnet-insight.dashevo.org/insight/tx/{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
@@ -25,7 +25,7 @@ namespace BTCPayServer
CryptoImagePath = "imlegacy/dash.png", CryptoImagePath = "imlegacy/dash.png",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
//https://github.com/satoshilabs/slips/blob/master/slip-0044.md //https://github.com/satoshilabs/slips/blob/master/slip-0044.md
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("5'") CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("5'")
: new KeyPath("1'") : new KeyPath("1'")
}); });
} }

View File

@@ -12,7 +12,7 @@ namespace BTCPayServer
{ {
CryptoCode = nbxplorerNetwork.CryptoCode, CryptoCode = nbxplorerNetwork.CryptoCode,
DisplayName = "Dogecoin", DisplayName = "Dogecoin",
BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://dogechain.info/tx/{0}" : "https://dogechain.info/tx/{0}", BlockExplorerLink = NetworkType == ChainName.Mainnet ? "https://dogechain.info/tx/{0}" : "https://dogechain.info/tx/{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
UriScheme = "dogecoin", UriScheme = "dogecoin",
DefaultRateRules = new[] DefaultRateRules = new[]
@@ -22,7 +22,7 @@ namespace BTCPayServer
}, },
CryptoImagePath = "imlegacy/dogecoin.png", CryptoImagePath = "imlegacy/dogecoin.png",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("3'") : new KeyPath("1'") CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("3'") : new KeyPath("1'")
}); });
} }
} }

View File

@@ -12,7 +12,7 @@ namespace BTCPayServer
{ {
CryptoCode = nbxplorerNetwork.CryptoCode, CryptoCode = nbxplorerNetwork.CryptoCode,
DisplayName = "Feathercoin", DisplayName = "Feathercoin",
BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://explorer.feathercoin.com/tx/{0}" : "https://explorer.feathercoin.com/tx/{0}", BlockExplorerLink = NetworkType == ChainName.Mainnet ? "https://explorer.feathercoin.com/tx/{0}" : "https://explorer.feathercoin.com/tx/{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
UriScheme = "feathercoin", UriScheme = "feathercoin",
DefaultRateRules = new[] DefaultRateRules = new[]
@@ -22,7 +22,7 @@ namespace BTCPayServer
}, },
CryptoImagePath = "imlegacy/feathercoin.png", CryptoImagePath = "imlegacy/feathercoin.png",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("8'") : new KeyPath("1'") CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("8'") : new KeyPath("1'")
}); });
} }
} }

View File

@@ -11,7 +11,7 @@ namespace BTCPayServer
{ {
CryptoCode = nbxplorerNetwork.CryptoCode, CryptoCode = nbxplorerNetwork.CryptoCode,
DisplayName = "Groestlcoin", DisplayName = "Groestlcoin",
BlockExplorerLink = NetworkType == NetworkType.Mainnet BlockExplorerLink = NetworkType == ChainName.Mainnet
? "https://chainz.cryptoid.info/grs/tx.dws?{0}.htm" ? "https://chainz.cryptoid.info/grs/tx.dws?{0}.htm"
: "https://chainz.cryptoid.info/grs-test/tx.dws?{0}.htm", : "https://chainz.cryptoid.info/grs-test/tx.dws?{0}.htm",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
@@ -24,7 +24,7 @@ namespace BTCPayServer
CryptoImagePath = "imlegacy/groestlcoin.png", CryptoImagePath = "imlegacy/groestlcoin.png",
LightningImagePath = "imlegacy/groestlcoin-lightning.svg", LightningImagePath = "imlegacy/groestlcoin-lightning.svg",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("17'") : new KeyPath("1'"), CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("17'") : new KeyPath("1'"),
SupportRBF = true, SupportRBF = true,
SupportPayJoin = true SupportPayJoin = true
}); });

View File

@@ -13,7 +13,7 @@ namespace BTCPayServer
{ {
CryptoCode = nbxplorerNetwork.CryptoCode, CryptoCode = nbxplorerNetwork.CryptoCode,
DisplayName = "Litecoin", DisplayName = "Litecoin",
BlockExplorerLink = NetworkType == NetworkType.Mainnet BlockExplorerLink = NetworkType == ChainName.Mainnet
? "https://live.blockcypher.com/ltc/tx/{0}/" ? "https://live.blockcypher.com/ltc/tx/{0}/"
: "http://explorer.litecointools.com/tx/{0}", : "http://explorer.litecointools.com/tx/{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
@@ -26,9 +26,9 @@ namespace BTCPayServer
CryptoImagePath = "imlegacy/litecoin.svg", CryptoImagePath = "imlegacy/litecoin.svg",
LightningImagePath = "imlegacy/litecoin-lightning.svg", LightningImagePath = "imlegacy/litecoin-lightning.svg",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("2'") : new KeyPath("1'"), CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("2'") : new KeyPath("1'"),
//https://github.com/pooler/electrum-ltc/blob/0d6989a9d2fb2edbea421c116e49d1015c7c5a91/electrum_ltc/constants.py //https://github.com/pooler/electrum-ltc/blob/0d6989a9d2fb2edbea421c116e49d1015c7c5a91/electrum_ltc/constants.py
ElectrumMapping = NetworkType == NetworkType.Mainnet ElectrumMapping = NetworkType == ChainName.Mainnet
? new Dictionary<uint, DerivationType>() ? new Dictionary<uint, DerivationType>()
{ {
{0x0488b21eU, DerivationType.Legacy }, {0x0488b21eU, DerivationType.Legacy },

View File

@@ -12,7 +12,7 @@ namespace BTCPayServer
{ {
CryptoCode = nbxplorerNetwork.CryptoCode, CryptoCode = nbxplorerNetwork.CryptoCode,
DisplayName = "Monacoin", DisplayName = "Monacoin",
BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://mona.insight.monaco-ex.org/insight/tx/{0}" : "https://testnet-mona.insight.monaco-ex.org/insight/tx/{0}", BlockExplorerLink = NetworkType == ChainName.Mainnet ? "https://mona.insight.monaco-ex.org/insight/tx/{0}" : "https://testnet-mona.insight.monaco-ex.org/insight/tx/{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
UriScheme = "monacoin", UriScheme = "monacoin",
DefaultRateRules = new[] DefaultRateRules = new[]
@@ -23,7 +23,7 @@ namespace BTCPayServer
CryptoImagePath = "imlegacy/monacoin.png", CryptoImagePath = "imlegacy/monacoin.png",
LightningImagePath = "imlegacy/mona-lightning.svg", LightningImagePath = "imlegacy/mona-lightning.svg",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("22'") : new KeyPath("1'") CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("22'") : new KeyPath("1'")
}); });
} }
} }

View File

@@ -12,7 +12,7 @@ namespace BTCPayServer
{ {
CryptoCode = nbxplorerNetwork.CryptoCode, CryptoCode = nbxplorerNetwork.CryptoCode,
DisplayName = "MonetaryUnit", DisplayName = "MonetaryUnit",
BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://explorer.monetaryunit.org/#/MUE/mainnet/tx/{0}" : "https://explorer.monetaryunit.org/#/MUE/mainnet/tx/{0}", BlockExplorerLink = NetworkType == ChainName.Mainnet ? "https://explorer.monetaryunit.org/#/MUE/mainnet/tx/{0}" : "https://explorer.monetaryunit.org/#/MUE/mainnet/tx/{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
UriScheme = "monetaryunit", UriScheme = "monetaryunit",
DefaultRateRules = new[] DefaultRateRules = new[]
@@ -22,7 +22,7 @@ namespace BTCPayServer
}, },
CryptoImagePath = "imlegacy/monetaryunit.png", CryptoImagePath = "imlegacy/monetaryunit.png",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("31'") : new KeyPath("1'") CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("31'") : new KeyPath("1'")
}); });
} }
} }

View File

@@ -12,7 +12,7 @@ namespace BTCPayServer
{ {
CryptoCode = nbxplorerNetwork.CryptoCode, CryptoCode = nbxplorerNetwork.CryptoCode,
DisplayName = "Polis", DisplayName = "Polis",
BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://blockbook.polispay.org/tx/{0}" : "https://blockbook.polispay.org/tx/{0}", BlockExplorerLink = NetworkType == ChainName.Mainnet ? "https://blockbook.polispay.org/tx/{0}" : "https://blockbook.polispay.org/tx/{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
UriScheme = "polis", UriScheme = "polis",
DefaultRateRules = new[] DefaultRateRules = new[]
@@ -22,7 +22,7 @@ namespace BTCPayServer
}, },
CryptoImagePath = "imlegacy/polis.png", CryptoImagePath = "imlegacy/polis.png",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("1997'") : new KeyPath("1'") CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("1997'") : new KeyPath("1'")
}); });
} }
} }

View File

@@ -12,7 +12,7 @@ namespace BTCPayServer
{ {
CryptoCode = nbxplorerNetwork.CryptoCode, CryptoCode = nbxplorerNetwork.CryptoCode,
DisplayName = "Ufo", DisplayName = "Ufo",
BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://chainz.cryptoid.info/ufo/tx.dws?{0}" : "https://chainz.cryptoid.info/ufo/tx.dws?{0}", BlockExplorerLink = NetworkType == ChainName.Mainnet ? "https://chainz.cryptoid.info/ufo/tx.dws?{0}" : "https://chainz.cryptoid.info/ufo/tx.dws?{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
UriScheme = "ufo", UriScheme = "ufo",
DefaultRateRules = new[] DefaultRateRules = new[]
@@ -22,7 +22,7 @@ namespace BTCPayServer
}, },
CryptoImagePath = "imlegacy/ufo.png", CryptoImagePath = "imlegacy/ufo.png",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("202'") : new KeyPath("1'") CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("202'") : new KeyPath("1'")
}); });
} }
} }

View File

@@ -12,7 +12,7 @@ namespace BTCPayServer
{ {
CryptoCode = nbxplorerNetwork.CryptoCode, CryptoCode = nbxplorerNetwork.CryptoCode,
DisplayName = "Viacoin", DisplayName = "Viacoin",
BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://explorer.viacoin.org/tx/{0}" : "https://explorer.viacoin.org/tx/{0}", BlockExplorerLink = NetworkType == ChainName.Mainnet ? "https://explorer.viacoin.org/tx/{0}" : "https://explorer.viacoin.org/tx/{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
UriScheme = "viacoin", UriScheme = "viacoin",
DefaultRateRules = new[] DefaultRateRules = new[]
@@ -22,7 +22,7 @@ namespace BTCPayServer
}, },
CryptoImagePath = "imlegacy/viacoin.png", CryptoImagePath = "imlegacy/viacoin.png",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("14'") : new KeyPath("1'") CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("14'") : new KeyPath("1'")
}); });
} }
} }

View File

@@ -13,20 +13,20 @@ namespace BTCPayServer
DisplayName = "Ethereum", DisplayName = "Ethereum",
DefaultRateRules = new[] {"ETH_X = ETH_BTC * BTC_X", "ETH_BTC = kraken(ETH_BTC)"}, DefaultRateRules = new[] {"ETH_X = ETH_BTC * BTC_X", "ETH_BTC = kraken(ETH_BTC)"},
BlockExplorerLink = BlockExplorerLink =
NetworkType == NetworkType.Mainnet NetworkType == ChainName.Mainnet
? "https://etherscan.io/address/{0}" ? "https://etherscan.io/address/{0}"
: "https://ropsten.etherscan.io/address/{0}", : "https://ropsten.etherscan.io/address/{0}",
CryptoImagePath = "/imlegacy/eth.png", CryptoImagePath = "/imlegacy/eth.png",
ShowSyncSummary = true, ShowSyncSummary = true,
CoinType = NetworkType == NetworkType.Mainnet? 60 : 1, CoinType = NetworkType == ChainName.Mainnet? 60 : 1,
ChainId = NetworkType == NetworkType.Mainnet ? 1 : 3, ChainId = NetworkType == ChainName.Mainnet ? 1 : 3,
Divisibility = 18, Divisibility = 18,
}); });
} }
public void InitERC20() public void InitERC20()
{ {
if (NetworkType != NetworkType.Mainnet) if (NetworkType != ChainName.Mainnet)
{ {
Add(new ERC20BTCPayNetwork() Add(new ERC20BTCPayNetwork()
{ {
@@ -60,13 +60,13 @@ namespace BTCPayServer
"USDT20_BTC = bitfinex(UST_BTC)", "USDT20_BTC = bitfinex(UST_BTC)",
}, },
BlockExplorerLink = BlockExplorerLink =
NetworkType == NetworkType.Mainnet NetworkType == ChainName.Mainnet
? "https://etherscan.io/address/{0}#tokentxns" ? "https://etherscan.io/address/{0}#tokentxns"
: "https://ropsten.etherscan.io/address/{0}#tokentxns", : "https://ropsten.etherscan.io/address/{0}#tokentxns",
CryptoImagePath = "/imlegacy/liquid-tether.svg", CryptoImagePath = "/imlegacy/liquid-tether.svg",
ShowSyncSummary = false, ShowSyncSummary = false,
CoinType = NetworkType == NetworkType.Mainnet? 60 : 1, CoinType = NetworkType == ChainName.Mainnet? 60 : 1,
ChainId = NetworkType == NetworkType.Mainnet ? 1 : 3, ChainId = NetworkType == ChainName.Mainnet ? 1 : 3,
SmartContractAddress = "0xdAC17F958D2ee523a2206206994597C13D831ec7", SmartContractAddress = "0xdAC17F958D2ee523a2206206994597C13D831ec7",
Divisibility = 6 Divisibility = 6
}); });

View File

@@ -13,7 +13,7 @@ namespace BTCPayServer
var nbxplorerNetwork = NBXplorerNetworkProvider.GetFromCryptoCode("LBTC"); var nbxplorerNetwork = NBXplorerNetworkProvider.GetFromCryptoCode("LBTC");
Add(new ElementsBTCPayNetwork() Add(new ElementsBTCPayNetwork()
{ {
AssetId = NetworkType == NetworkType.Mainnet ? ElementsParams<Liquid>.PeggedAssetId : ElementsParams<Liquid.LiquidRegtest>.PeggedAssetId, AssetId = NetworkType == ChainName.Mainnet ? ElementsParams<Liquid>.PeggedAssetId : ElementsParams<Liquid.LiquidRegtest>.PeggedAssetId,
CryptoCode = "LBTC", CryptoCode = "LBTC",
NetworkCryptoCode = "LBTC", NetworkCryptoCode = "LBTC",
DisplayName = "Liquid Bitcoin", DisplayName = "Liquid Bitcoin",
@@ -22,12 +22,12 @@ namespace BTCPayServer
"LBTC_X = LBTC_BTC * BTC_X", "LBTC_X = LBTC_BTC * BTC_X",
"LBTC_BTC = 1", "LBTC_BTC = 1",
}, },
BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://blockstream.info/liquid/tx/{0}" : "https://blockstream.info/testnet/liquid/tx/{0}", BlockExplorerLink = NetworkType == ChainName.Mainnet ? "https://blockstream.info/liquid/tx/{0}" : "https://blockstream.info/testnet/liquid/tx/{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
UriScheme = "liquidnetwork", UriScheme = "liquidnetwork",
CryptoImagePath = "imlegacy/liquid.png", CryptoImagePath = "imlegacy/liquid.png",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("1776'") : new KeyPath("1'"), CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("1776'") : new KeyPath("1'"),
SupportRBF = true SupportRBF = true
}); });
} }

View File

@@ -21,12 +21,12 @@ namespace BTCPayServer
}, },
AssetId = new uint256("ce091c998b83c78bb71a632313ba3760f1763d9cfcffae02258ffa9865a37bd2"), AssetId = new uint256("ce091c998b83c78bb71a632313ba3760f1763d9cfcffae02258ffa9865a37bd2"),
DisplayName = "Liquid Tether", DisplayName = "Liquid Tether",
BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://blockstream.info/liquid/tx/{0}" : "https://blockstream.info/testnet/liquid/tx/{0}", BlockExplorerLink = NetworkType == ChainName.Mainnet ? "https://blockstream.info/liquid/tx/{0}" : "https://blockstream.info/testnet/liquid/tx/{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
UriScheme = "liquidnetwork", UriScheme = "liquidnetwork",
CryptoImagePath = "imlegacy/liquid-tether.svg", CryptoImagePath = "imlegacy/liquid-tether.svg",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("1776'") : new KeyPath("1'"), CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("1776'") : new KeyPath("1'"),
SupportRBF = true, SupportRBF = true,
SupportLightning = false SupportLightning = false
}); });
@@ -45,12 +45,12 @@ namespace BTCPayServer
Divisibility = 2, Divisibility = 2,
AssetId = new uint256("aa775044c32a7df391902b3659f46dfe004ccb2644ce2ddc7dba31e889391caf"), AssetId = new uint256("aa775044c32a7df391902b3659f46dfe004ccb2644ce2ddc7dba31e889391caf"),
DisplayName = "Ethiopian Birr", DisplayName = "Ethiopian Birr",
BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://blockstream.info/liquid/tx/{0}" : "https://blockstream.info/testnet/liquid/tx/{0}", BlockExplorerLink = NetworkType == ChainName.Mainnet ? "https://blockstream.info/liquid/tx/{0}" : "https://blockstream.info/testnet/liquid/tx/{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
UriScheme = "liquidnetwork", UriScheme = "liquidnetwork",
CryptoImagePath = "imlegacy/etb.png", CryptoImagePath = "imlegacy/etb.png",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("1776'") : new KeyPath("1'"), CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("1776'") : new KeyPath("1'"),
SupportRBF = true, SupportRBF = true,
SupportLightning = false SupportLightning = false
}); });
@@ -68,12 +68,12 @@ namespace BTCPayServer
}, },
AssetId = new uint256("0e99c1a6da379d1f4151fb9df90449d40d0608f6cb33a5bcbfc8c265f42bab0a"), AssetId = new uint256("0e99c1a6da379d1f4151fb9df90449d40d0608f6cb33a5bcbfc8c265f42bab0a"),
DisplayName = "Liquid CAD", DisplayName = "Liquid CAD",
BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://blockstream.info/liquid/tx/{0}" : "https://blockstream.info/testnet/liquid/tx/{0}", BlockExplorerLink = NetworkType == ChainName.Mainnet ? "https://blockstream.info/liquid/tx/{0}" : "https://blockstream.info/testnet/liquid/tx/{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
UriScheme = "liquidnetwork", UriScheme = "liquidnetwork",
CryptoImagePath = "imlegacy/lcad.png", CryptoImagePath = "imlegacy/lcad.png",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("1776'") : new KeyPath("1'"), CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("1776'") : new KeyPath("1'"),
SupportRBF = true, SupportRBF = true,
SupportLightning = false SupportLightning = false
}); });

View File

@@ -12,7 +12,7 @@ namespace BTCPayServer
DisplayName = "Monero", DisplayName = "Monero",
Divisibility = 12, Divisibility = 12,
BlockExplorerLink = BlockExplorerLink =
NetworkType == NetworkType.Mainnet NetworkType == ChainName.Mainnet
? "https://www.exploremonero.com/transaction/{0}" ? "https://www.exploremonero.com/transaction/{0}"
: "https://testnet.xmrchain.net/tx/{0}", : "https://testnet.xmrchain.net/tx/{0}",
DefaultRateRules = new[] DefaultRateRules = new[]

View File

@@ -18,25 +18,29 @@ namespace BTCPayServer
{ {
static BTCPayDefaultSettings() static BTCPayDefaultSettings()
{ {
_Settings = new Dictionary<NetworkType, BTCPayDefaultSettings>(); _Settings = new Dictionary<ChainName, BTCPayDefaultSettings>();
foreach (var chainType in new[] { NetworkType.Mainnet, NetworkType.Testnet, NetworkType.Regtest }) }
static readonly Dictionary<ChainName, BTCPayDefaultSettings> _Settings;
public static BTCPayDefaultSettings GetDefaultSettings(ChainName chainType)
{
if (_Settings.TryGetValue(chainType, out var v))
return v;
lock (_Settings)
{ {
if (_Settings.TryGetValue(chainType, out v))
return v;
var settings = new BTCPayDefaultSettings(); var settings = new BTCPayDefaultSettings();
_Settings.Add(chainType, settings); _Settings.Add(chainType, settings);
settings.DefaultDataDirectory = StandardConfiguration.DefaultDataDirectory.GetDirectory("BTCPayServer", NBXplorerDefaultSettings.GetFolderName(chainType)); settings.DefaultDataDirectory = StandardConfiguration.DefaultDataDirectory.GetDirectory("BTCPayServer", NBXplorerDefaultSettings.GetFolderName(chainType));
settings.DefaultPluginDirectory = settings.DefaultPluginDirectory =
StandardConfiguration.DefaultDataDirectory.GetDirectory("BTCPayServer", "Plugins"); StandardConfiguration.DefaultDataDirectory.GetDirectory("BTCPayServer", "Plugins");
settings.DefaultConfigurationFile = Path.Combine(settings.DefaultDataDirectory, "settings.config"); settings.DefaultConfigurationFile = Path.Combine(settings.DefaultDataDirectory, "settings.config");
settings.DefaultPort = (chainType == NetworkType.Mainnet ? 23000 : settings.DefaultPort = (chainType == ChainName.Mainnet ? 23000 :
chainType == NetworkType.Regtest ? 23002 : chainType == ChainName.Regtest ? 23002
chainType == NetworkType.Testnet ? 23001 : throw new NotSupportedException(chainType.ToString())); : 23001);
} }
}
static readonly Dictionary<NetworkType, BTCPayDefaultSettings> _Settings;
public static BTCPayDefaultSettings GetDefaultSettings(NetworkType chainType)
{
return _Settings[chainType]; return _Settings[chainType];
} }

View File

@@ -13,17 +13,19 @@ namespace BTCPayServer
{ {
CryptoCode = nbxplorerNetwork.CryptoCode, CryptoCode = nbxplorerNetwork.CryptoCode,
DisplayName = "Bitcoin", DisplayName = "Bitcoin",
BlockExplorerLink = NetworkType == NetworkType.Mainnet ? "https://blockstream.info/tx/{0}" : "https://blockstream.info/testnet/tx/{0}", BlockExplorerLink = NetworkType == ChainName.Mainnet ? "https://blockstream.info/tx/{0}" :
NetworkType == Bitcoin.Instance.Signet.ChainName ? "https://explorer.bc-2.jp/"
: "https://blockstream.info/testnet/tx/{0}",
NBXplorerNetwork = nbxplorerNetwork, NBXplorerNetwork = nbxplorerNetwork,
UriScheme = "bitcoin", UriScheme = "bitcoin",
CryptoImagePath = "imlegacy/bitcoin.svg", CryptoImagePath = "imlegacy/bitcoin.svg",
LightningImagePath = "imlegacy/bitcoin-lightning.svg", LightningImagePath = "imlegacy/bitcoin-lightning.svg",
DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType),
CoinType = NetworkType == NetworkType.Mainnet ? new KeyPath("0'") : new KeyPath("1'"), CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("0'") : new KeyPath("1'"),
SupportRBF = true, SupportRBF = true,
SupportPayJoin = true, SupportPayJoin = true,
//https://github.com/spesmilo/electrum/blob/11733d6bc271646a00b69ff07657119598874da4/electrum/constants.py //https://github.com/spesmilo/electrum/blob/11733d6bc271646a00b69ff07657119598874da4/electrum/constants.py
ElectrumMapping = NetworkType == NetworkType.Mainnet ElectrumMapping = NetworkType == ChainName.Mainnet
? new Dictionary<uint, DerivationType>() ? new Dictionary<uint, DerivationType>()
{ {
{0x0488b21eU, DerivationType.Legacy }, // xpub {0x0488b21eU, DerivationType.Legacy }, // xpub

View File

@@ -35,8 +35,8 @@ namespace BTCPayServer
} }
public NetworkType NetworkType { get; private set; } public ChainName NetworkType { get; private set; }
public BTCPayNetworkProvider(NetworkType networkType) public BTCPayNetworkProvider(ChainName networkType)
{ {
_NBXplorerNetworkProvider = new NBXplorerNetworkProvider(networkType); _NBXplorerNetworkProvider = new NBXplorerNetworkProvider(networkType);
NetworkType = networkType; NetworkType = networkType;

View File

@@ -1,10 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<Import Project="../Build/Version.csproj" Condition="Exists('../Build/Version.csproj')" /> <Import Project="../Build/Version.csproj" Condition="Exists('../Build/Version.csproj')" />
<Import Project="../Build/Common.csproj" /> <Import Project="../Build/Common.csproj" />
<ItemGroup> <ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" /> <FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="NBXplorer.Client" Version="3.0.19" /> <PackageReference Include="NBXplorer.Client" Version="3.0.20" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition="'$(Altcoins)' != 'true'"> <ItemGroup Condition="'$(Altcoins)' != 'true'">
<Compile Remove="Altcoins\**\*.cs"></Compile> <Compile Remove="Altcoins\**\*.cs"></Compile>

View File

@@ -6,7 +6,7 @@
<FrameworkReference Include="Microsoft.AspNetCore.App" /> <FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.6.0" /> <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.6.0" />
<PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="5.2.7" /> <PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="5.2.7" />
<PackageReference Include="NBitcoin" Version="5.0.68" /> <PackageReference Include="NBitcoin" Version="5.0.73" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="DigitalRuby.ExchangeSharp" Version="0.6.3" /> <PackageReference Include="DigitalRuby.ExchangeSharp" Version="0.6.3" />
</ItemGroup> </ItemGroup>

View File

@@ -872,7 +872,7 @@ normal:
{ {
#pragma warning disable CS0618 #pragma warning disable CS0618
var dummy = new Key().PubKey.GetAddress(ScriptPubKeyType.Legacy, Network.RegTest).ToString(); var dummy = new Key().PubKey.GetAddress(ScriptPubKeyType.Legacy, Network.RegTest).ToString();
var networkProvider = new BTCPayNetworkProvider(NetworkType.Regtest); var networkProvider = new BTCPayNetworkProvider(ChainName.Regtest);
var paymentMethodHandlerDictionary = new PaymentMethodHandlerDictionary(new IPaymentMethodHandler[] var paymentMethodHandlerDictionary = new PaymentMethodHandlerDictionary(new IPaymentMethodHandler[]
{ {
new BitcoinLikePaymentHandler(null, networkProvider, null, null, null), new BitcoinLikePaymentHandler(null, networkProvider, null, null, null),
@@ -952,9 +952,9 @@ normal:
[Trait("Altcoins", "Altcoins")] [Trait("Altcoins", "Altcoins")]
public void CanParseDerivationScheme() public void CanParseDerivationScheme()
{ {
var testnetNetworkProvider = new BTCPayNetworkProvider(NetworkType.Testnet); var testnetNetworkProvider = new BTCPayNetworkProvider(ChainName.Testnet);
var regtestNetworkProvider = new BTCPayNetworkProvider(NetworkType.Regtest); var regtestNetworkProvider = new BTCPayNetworkProvider(ChainName.Regtest);
var mainnetNetworkProvider = new BTCPayNetworkProvider(NetworkType.Mainnet); var mainnetNetworkProvider = new BTCPayNetworkProvider(ChainName.Mainnet);
var testnetParser = new DerivationSchemeParser(testnetNetworkProvider.GetNetwork<BTCPayNetwork>("BTC")); var testnetParser = new DerivationSchemeParser(testnetNetworkProvider.GetNetwork<BTCPayNetwork>("BTC"));
var mainnetParser = new DerivationSchemeParser(mainnetNetworkProvider.GetNetwork<BTCPayNetwork>("BTC")); var mainnetParser = new DerivationSchemeParser(mainnetNetworkProvider.GetNetwork<BTCPayNetwork>("BTC"));
NBXplorer.DerivationStrategy.DerivationStrategyBase result; NBXplorer.DerivationStrategy.DerivationStrategyBase result;

View File

@@ -91,7 +91,7 @@ namespace BTCPayServer.Tests
{ {
if (!Directory.Exists(_Directory)) if (!Directory.Exists(_Directory))
Directory.CreateDirectory(_Directory); Directory.CreateDirectory(_Directory);
string chain = NBXplorerDefaultSettings.GetFolderName(NetworkType.Regtest); string chain = NBXplorerDefaultSettings.GetFolderName(ChainName.Regtest);
string chainDirectory = Path.Combine(_Directory, chain); string chainDirectory = Path.Combine(_Directory, chain);
if (!Directory.Exists(chainDirectory)) if (!Directory.Exists(chainDirectory))
Directory.CreateDirectory(chainDirectory); Directory.CreateDirectory(chainDirectory);

View File

@@ -1080,7 +1080,7 @@ namespace BTCPayServer.Tests
} }
} }
[Fact(Timeout = 60 * 2 * 1000)] [Fact(Timeout = 60 * 20 * 1000)]
[Trait("Integration", "Integration")] [Trait("Integration", "Integration")]
[Trait("Lightning", "Lightning")] [Trait("Lightning", "Lightning")]
public async Task CanUseLightningAPI() public async Task CanUseLightningAPI()
@@ -1098,7 +1098,7 @@ namespace BTCPayServer.Tests
merchant.GrantAccess(true); merchant.GrantAccess(true);
merchant.RegisterLightningNode("BTC", LightningConnectionType.LndREST); merchant.RegisterLightningNode("BTC", LightningConnectionType.LndREST);
var merchantClient = await merchant.CreateClient($"{Policies.CanUseLightningNodeInStore}:{merchant.StoreId}"); var merchantClient = await merchant.CreateClient($"{Policies.CanUseLightningNodeInStore}:{merchant.StoreId}");
var merchantInvoice = await merchantClient.CreateLightningInvoice(merchant.StoreId, "BTC", new CreateLightningInvoiceRequest(new LightMoney(1_000), "hey", TimeSpan.FromSeconds(60))); var merchantInvoice = await merchantClient.CreateLightningInvoice(merchant.StoreId, "BTC", new CreateLightningInvoiceRequest(LightMoney.Satoshis(1_000), "hey", TimeSpan.FromSeconds(60)));
tester.PayTester.GetService<BTCPayServerEnvironment>().DevelopmentOverride = false; tester.PayTester.GetService<BTCPayServerEnvironment>().DevelopmentOverride = false;
// The default client is using charge, so we should not be able to query channels // The default client is using charge, so we should not be able to query channels
var client = await user.CreateClient(Policies.CanUseInternalLightningNode); var client = await user.CreateClient(Policies.CanUseInternalLightningNode);

View File

@@ -33,7 +33,7 @@ namespace BTCPayServer.Tests
if (!Directory.Exists(_Directory)) if (!Directory.Exists(_Directory))
Directory.CreateDirectory(_Directory); Directory.CreateDirectory(_Directory);
NetworkProvider = new BTCPayNetworkProvider(NetworkType.Regtest); NetworkProvider = new BTCPayNetworkProvider(ChainName.Regtest);
ExplorerNode = new RPCClient(RPCCredentialString.Parse(GetEnvironment("TESTS_BTCRPCCONNECTION", "server=http://127.0.0.1:43782;ceiwHEbqWI83:DwubwWsoo3")), NetworkProvider.GetNetwork<BTCPayNetwork>("BTC").NBitcoinNetwork); ExplorerNode = new RPCClient(RPCCredentialString.Parse(GetEnvironment("TESTS_BTCRPCCONNECTION", "server=http://127.0.0.1:43782;ceiwHEbqWI83:DwubwWsoo3")), NetworkProvider.GetNetwork<BTCPayNetwork>("BTC").NBitcoinNetwork);
ExplorerNode.ScanRPCCapabilities(); ExplorerNode.ScanRPCCapabilities();

View File

@@ -407,7 +407,7 @@ namespace BTCPayServer.Tests
[Trait("Fast", "Fast")] [Trait("Fast", "Fast")]
public void CanCalculateCryptoDue() public void CanCalculateCryptoDue()
{ {
var networkProvider = new BTCPayNetworkProvider(NetworkType.Regtest); var networkProvider = new BTCPayNetworkProvider(ChainName.Regtest);
var paymentMethodHandlerDictionary = new PaymentMethodHandlerDictionary(new IPaymentMethodHandler[] var paymentMethodHandlerDictionary = new PaymentMethodHandlerDictionary(new IPaymentMethodHandler[]
{ {
new BitcoinLikePaymentHandler(null, networkProvider, null, null, null), new BitcoinLikePaymentHandler(null, networkProvider, null, null, null),
@@ -695,7 +695,7 @@ namespace BTCPayServer.Tests
[Trait("Fast", "Fast")] [Trait("Fast", "Fast")]
public void CanAcceptInvoiceWithTolerance() public void CanAcceptInvoiceWithTolerance()
{ {
var networkProvider = new BTCPayNetworkProvider(NetworkType.Regtest); var networkProvider = new BTCPayNetworkProvider(ChainName.Regtest);
var paymentMethodHandlerDictionary = new PaymentMethodHandlerDictionary(new IPaymentMethodHandler[] var paymentMethodHandlerDictionary = new PaymentMethodHandlerDictionary(new IPaymentMethodHandler[]
{ {
new BitcoinLikePaymentHandler(null, networkProvider, null, null, null), new BitcoinLikePaymentHandler(null, networkProvider, null, null, null),
@@ -873,7 +873,7 @@ namespace BTCPayServer.Tests
[Trait("Fast", "Fast")] [Trait("Fast", "Fast")]
public async Task CanEnumerateTorServices() public async Task CanEnumerateTorServices()
{ {
var tor = new TorServices(new BTCPayNetworkProvider(NetworkType.Regtest), var tor = new TorServices(new BTCPayNetworkProvider(ChainName.Regtest),
new BTCPayServerOptions() { TorrcFile = TestUtils.GetTestDataFullPath("Tor/torrc") }); new BTCPayServerOptions() { TorrcFile = TestUtils.GetTestDataFullPath("Tor/torrc") });
await tor.Refresh(); await tor.Refresh();
@@ -1170,7 +1170,7 @@ namespace BTCPayServer.Tests
[Trait("Integration", "Integration")] [Trait("Integration", "Integration")]
public void CanSolveTheDogesRatesOnKraken() public void CanSolveTheDogesRatesOnKraken()
{ {
var provider = new BTCPayNetworkProvider(NetworkType.Mainnet); var provider = new BTCPayNetworkProvider(ChainName.Mainnet);
var factory = CreateBTCPayRateFactory(); var factory = CreateBTCPayRateFactory();
var fetcher = new RateFetcher(factory); var fetcher = new RateFetcher(factory);
@@ -2048,7 +2048,7 @@ namespace BTCPayServer.Tests
[Trait("Fast", "Fast")] [Trait("Fast", "Fast")]
public void HasCurrencyDataForNetworks() public void HasCurrencyDataForNetworks()
{ {
var btcPayNetworkProvider = new BTCPayNetworkProvider(NetworkType.Regtest); var btcPayNetworkProvider = new BTCPayNetworkProvider(ChainName.Regtest);
foreach (var network in btcPayNetworkProvider.GetAll()) foreach (var network in btcPayNetworkProvider.GetAll())
{ {
var cd = CurrencyNameTable.Instance.GetCurrencyData(network.CryptoCode, false); var cd = CurrencyNameTable.Instance.GetCurrencyData(network.CryptoCode, false);
@@ -2986,7 +2986,7 @@ namespace BTCPayServer.Tests
[Trait("Integration", "Integration")] [Trait("Integration", "Integration")]
public void CanGetRateCryptoCurrenciesByDefault() public void CanGetRateCryptoCurrenciesByDefault()
{ {
var provider = new BTCPayNetworkProvider(NetworkType.Mainnet); var provider = new BTCPayNetworkProvider(ChainName.Mainnet);
var factory = CreateBTCPayRateFactory(); var factory = CreateBTCPayRateFactory();
var fetcher = new RateFetcher(factory); var fetcher = new RateFetcher(factory);
var pairs = var pairs =
@@ -3058,35 +3058,35 @@ namespace BTCPayServer.Tests
var unusedUri = new Uri("https://toto.com"); var unusedUri = new Uri("https://toto.com");
Assert.True(ExternalConnectionString.TryParse("server=/test", out var connStr, out var error)); Assert.True(ExternalConnectionString.TryParse("server=/test", out var connStr, out var error));
var expanded = await connStr.Expand(new Uri("https://toto.com"), ExternalServiceTypes.Charge, var expanded = await connStr.Expand(new Uri("https://toto.com"), ExternalServiceTypes.Charge,
NetworkType.Mainnet); ChainName.Mainnet);
Assert.Equal(new Uri("https://toto.com/test"), expanded.Server); Assert.Equal(new Uri("https://toto.com/test"), expanded.Server);
expanded = await connStr.Expand(new Uri("http://toto.onion"), ExternalServiceTypes.Charge, expanded = await connStr.Expand(new Uri("http://toto.onion"), ExternalServiceTypes.Charge,
NetworkType.Mainnet); ChainName.Mainnet);
Assert.Equal(new Uri("http://toto.onion/test"), expanded.Server); Assert.Equal(new Uri("http://toto.onion/test"), expanded.Server);
await Assert.ThrowsAsync<SecurityException>(() => await Assert.ThrowsAsync<SecurityException>(() =>
connStr.Expand(new Uri("http://toto.com"), ExternalServiceTypes.Charge, NetworkType.Mainnet)); connStr.Expand(new Uri("http://toto.com"), ExternalServiceTypes.Charge, ChainName.Mainnet));
await connStr.Expand(new Uri("http://toto.com"), ExternalServiceTypes.Charge, NetworkType.Testnet); await connStr.Expand(new Uri("http://toto.com"), ExternalServiceTypes.Charge, ChainName.Testnet);
// Make sure absolute paths are not expanded // Make sure absolute paths are not expanded
Assert.True(ExternalConnectionString.TryParse("server=https://tow/test", out connStr, out error)); Assert.True(ExternalConnectionString.TryParse("server=https://tow/test", out connStr, out error));
expanded = await connStr.Expand(new Uri("https://toto.com"), ExternalServiceTypes.Charge, expanded = await connStr.Expand(new Uri("https://toto.com"), ExternalServiceTypes.Charge,
NetworkType.Mainnet); ChainName.Mainnet);
Assert.Equal(new Uri("https://tow/test"), expanded.Server); Assert.Equal(new Uri("https://tow/test"), expanded.Server);
// Error if directory not exists // Error if directory not exists
Assert.True(ExternalConnectionString.TryParse($"server={unusedUri};macaroondirectorypath=pouet", Assert.True(ExternalConnectionString.TryParse($"server={unusedUri};macaroondirectorypath=pouet",
out connStr, out error)); out connStr, out error));
await Assert.ThrowsAsync<DirectoryNotFoundException>(() => await Assert.ThrowsAsync<DirectoryNotFoundException>(() =>
connStr.Expand(unusedUri, ExternalServiceTypes.LNDGRPC, NetworkType.Mainnet)); connStr.Expand(unusedUri, ExternalServiceTypes.LNDGRPC, ChainName.Mainnet));
await Assert.ThrowsAsync<DirectoryNotFoundException>(() => await Assert.ThrowsAsync<DirectoryNotFoundException>(() =>
connStr.Expand(unusedUri, ExternalServiceTypes.LNDRest, NetworkType.Mainnet)); connStr.Expand(unusedUri, ExternalServiceTypes.LNDRest, ChainName.Mainnet));
await connStr.Expand(unusedUri, ExternalServiceTypes.Charge, NetworkType.Mainnet); await connStr.Expand(unusedUri, ExternalServiceTypes.Charge, ChainName.Mainnet);
var macaroonDirectory = CreateDirectory(); var macaroonDirectory = CreateDirectory();
Assert.True(ExternalConnectionString.TryParse( Assert.True(ExternalConnectionString.TryParse(
$"server={unusedUri};macaroondirectorypath={macaroonDirectory}", out connStr, out error)); $"server={unusedUri};macaroondirectorypath={macaroonDirectory}", out connStr, out error));
await connStr.Expand(unusedUri, ExternalServiceTypes.LNDGRPC, NetworkType.Mainnet); await connStr.Expand(unusedUri, ExternalServiceTypes.LNDGRPC, ChainName.Mainnet);
expanded = await connStr.Expand(unusedUri, ExternalServiceTypes.LNDRest, NetworkType.Mainnet); expanded = await connStr.Expand(unusedUri, ExternalServiceTypes.LNDRest, ChainName.Mainnet);
Assert.NotNull(expanded.Macaroons); Assert.NotNull(expanded.Macaroons);
Assert.Null(expanded.MacaroonFilePath); Assert.Null(expanded.MacaroonFilePath);
Assert.Null(expanded.Macaroons.AdminMacaroon); Assert.Null(expanded.Macaroons.AdminMacaroon);
@@ -3096,7 +3096,7 @@ namespace BTCPayServer.Tests
File.WriteAllBytes($"{macaroonDirectory}/admin.macaroon", new byte[] { 0xaa }); File.WriteAllBytes($"{macaroonDirectory}/admin.macaroon", new byte[] { 0xaa });
File.WriteAllBytes($"{macaroonDirectory}/invoice.macaroon", new byte[] { 0xab }); File.WriteAllBytes($"{macaroonDirectory}/invoice.macaroon", new byte[] { 0xab });
File.WriteAllBytes($"{macaroonDirectory}/readonly.macaroon", new byte[] { 0xac }); File.WriteAllBytes($"{macaroonDirectory}/readonly.macaroon", new byte[] { 0xac });
expanded = await connStr.Expand(unusedUri, ExternalServiceTypes.LNDRest, NetworkType.Mainnet); expanded = await connStr.Expand(unusedUri, ExternalServiceTypes.LNDRest, ChainName.Mainnet);
Assert.NotNull(expanded.Macaroons.AdminMacaroon); Assert.NotNull(expanded.Macaroons.AdminMacaroon);
Assert.NotNull(expanded.Macaroons.InvoiceMacaroon); Assert.NotNull(expanded.Macaroons.InvoiceMacaroon);
Assert.Equal("ab", expanded.Macaroons.InvoiceMacaroon.Hex); Assert.Equal("ab", expanded.Macaroons.InvoiceMacaroon.Hex);
@@ -3106,7 +3106,7 @@ namespace BTCPayServer.Tests
Assert.True(ExternalConnectionString.TryParse( Assert.True(ExternalConnectionString.TryParse(
$"server={unusedUri};cookiefilepath={macaroonDirectory}/charge.cookie", out connStr, out error)); $"server={unusedUri};cookiefilepath={macaroonDirectory}/charge.cookie", out connStr, out error));
File.WriteAllText($"{macaroonDirectory}/charge.cookie", "apitoken"); File.WriteAllText($"{macaroonDirectory}/charge.cookie", "apitoken");
expanded = await connStr.Expand(unusedUri, ExternalServiceTypes.Charge, NetworkType.Mainnet); expanded = await connStr.Expand(unusedUri, ExternalServiceTypes.Charge, ChainName.Mainnet);
Assert.Equal("apitoken", expanded.APIToken); Assert.Equal("apitoken", expanded.APIToken);
} }
@@ -3191,7 +3191,7 @@ namespace BTCPayServer.Tests
[Trait("Fast", "Fast")] [Trait("Fast", "Fast")]
public void ParseDerivationSchemeSettings() public void ParseDerivationSchemeSettings()
{ {
var mainnet = new BTCPayNetworkProvider(NetworkType.Mainnet).GetNetwork<BTCPayNetwork>("BTC"); var mainnet = new BTCPayNetworkProvider(ChainName.Mainnet).GetNetwork<BTCPayNetwork>("BTC");
var root = new Mnemonic( var root = new Mnemonic(
"usage fever hen zero slide mammal silent heavy donate budget pulse say brain thank sausage brand craft about save attract muffin advance illegal cabbage") "usage fever hen zero slide mammal silent heavy donate budget pulse say brain thank sausage brand craft about save attract muffin advance illegal cabbage")
.DeriveExtKey(); .DeriveExtKey();
@@ -3209,7 +3209,7 @@ namespace BTCPayServer.Tests
Assert.Equal(root.Derive(new KeyPath("m/49'/0'/0'")).Neuter().PubKey.WitHash.ScriptPubKey.Hash.ScriptPubKey, Assert.Equal(root.Derive(new KeyPath("m/49'/0'/0'")).Neuter().PubKey.WitHash.ScriptPubKey.Hash.ScriptPubKey,
settings.AccountDerivation.GetDerivation().ScriptPubKey); settings.AccountDerivation.GetDerivation().ScriptPubKey);
var testnet = new BTCPayNetworkProvider(NetworkType.Testnet).GetNetwork<BTCPayNetwork>("BTC"); var testnet = new BTCPayNetworkProvider(ChainName.Testnet).GetNetwork<BTCPayNetwork>("BTC");
// Should be legacy // Should be legacy
Assert.True(DerivationSchemeSettings.TryParseFromWalletFile( Assert.True(DerivationSchemeSettings.TryParseFromWalletFile(

View File

@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web">  <Project Sdk="Microsoft.NET.Sdk.Web">
<Import Project="../Build/Version.csproj" Condition="Exists('../Build/Version.csproj')" /> <Import Project="../Build/Version.csproj" Condition="Exists('../Build/Version.csproj')" />
<Import Project="../Build/Common.csproj" /> <Import Project="../Build/Common.csproj" />
@@ -45,7 +45,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="BTCPayServer.Hwi" Version="1.1.3" /> <PackageReference Include="BTCPayServer.Hwi" Version="1.1.3" />
<PackageReference Include="BTCPayServer.Lightning.All" Version="1.2.4" /> <PackageReference Include="BTCPayServer.Lightning.All" Version="1.2.6" />
<PackageReference Include="BuildBundlerMinifier" Version="3.2.435" /> <PackageReference Include="BuildBundlerMinifier" Version="3.2.435" />
<PackageReference Include="BundlerMinifier.Core" Version="3.2.435" /> <PackageReference Include="BundlerMinifier.Core" Version="3.2.435" />
<PackageReference Include="BundlerMinifier.TagHelpers" Version="3.2.435" /> <PackageReference Include="BundlerMinifier.TagHelpers" Version="3.2.435" />

View File

@@ -13,7 +13,7 @@ namespace BTCPayServer.Configuration
{ {
public class BTCPayServerOptions public class BTCPayServerOptions
{ {
public NetworkType NetworkType public ChainName NetworkType
{ {
get; set; get; set;
} }
@@ -61,7 +61,7 @@ namespace BTCPayServer.Configuration
Logs.Configuration.LogInformation("Network: " + NetworkType.ToString()); Logs.Configuration.LogInformation("Network: " + NetworkType.ToString());
if (conf.GetOrDefault<bool>("launchsettings", false) && NetworkType != NetworkType.Regtest) if (conf.GetOrDefault<bool>("launchsettings", false) && NetworkType != ChainName.Regtest)
throw new ConfigException($"You need to run BTCPayServer with the run.sh or run.ps1 script"); throw new ConfigException($"You need to run BTCPayServer with the run.sh or run.ps1 script");

View File

@@ -12,7 +12,7 @@ namespace BTCPayServer.Configuration
{ {
protected override CommandLineApplication CreateCommandLineApplicationCore() protected override CommandLineApplication CreateCommandLineApplicationCore()
{ {
var provider = new BTCPayNetworkProvider(NetworkType.Mainnet); var provider = new BTCPayNetworkProvider(ChainName.Mainnet);
var chains = string.Join(",", provider.GetAll().Select(n => n.CryptoCode.ToLowerInvariant()).ToArray()); var chains = string.Join(",", provider.GetAll().Select(n => n.CryptoCode.ToLowerInvariant()).ToArray());
CommandLineApplication app = new CommandLineApplication(true) CommandLineApplication app = new CommandLineApplication(true)
{ {
@@ -23,6 +23,7 @@ namespace BTCPayServer.Configuration
app.Option("-n | --network", $"Set the network among (mainnet,testnet,regtest) (default: mainnet)", CommandOptionType.SingleValue); app.Option("-n | --network", $"Set the network among (mainnet,testnet,regtest) (default: mainnet)", CommandOptionType.SingleValue);
app.Option("--testnet | -testnet", $"Use testnet (deprecated, use --network instead)", CommandOptionType.BoolValue); app.Option("--testnet | -testnet", $"Use testnet (deprecated, use --network instead)", CommandOptionType.BoolValue);
app.Option("--regtest | -regtest", $"Use regtest (deprecated, use --network instead)", CommandOptionType.BoolValue); app.Option("--regtest | -regtest", $"Use regtest (deprecated, use --network instead)", CommandOptionType.BoolValue);
app.Option("--signet | -signet", $"Use signet (deprecated, use --network instead)", CommandOptionType.BoolValue);
app.Option("--allow-admin-registration", $"For debug only, will show a checkbox when a new user register to add himself as admin. (default: false)", CommandOptionType.BoolValue); app.Option("--allow-admin-registration", $"For debug only, will show a checkbox when a new user register to add himself as admin. (default: false)", CommandOptionType.BoolValue);
app.Option("--chains | -c", $"Chains to support as a comma separated (default: btc; available: {chains})", CommandOptionType.SingleValue); app.Option("--chains | -c", $"Chains to support as a comma separated (default: btc; available: {chains})", CommandOptionType.SingleValue);
app.Option("--postgres", $"Connection string to a PostgreSQL database", CommandOptionType.SingleValue); app.Option("--postgres", $"Connection string to a PostgreSQL database", CommandOptionType.SingleValue);
@@ -89,7 +90,7 @@ namespace BTCPayServer.Configuration
return Path.Combine(chainDir, fileName); return Path.Combine(chainDir, fileName);
} }
public static NetworkType GetNetworkType(IConfiguration conf) public static ChainName GetNetworkType(IConfiguration conf)
{ {
var network = conf.GetOrDefault<string>("network", null); var network = conf.GetOrDefault<string>("network", null);
if (network != null) if (network != null)
@@ -99,10 +100,12 @@ namespace BTCPayServer.Configuration
{ {
throw new ConfigException($"Invalid network parameter '{network}'"); throw new ConfigException($"Invalid network parameter '{network}'");
} }
return n.NetworkType; return n.ChainName;
} }
var net = conf.GetOrDefault<bool>("regtest", false) ? NetworkType.Regtest : var net = conf.GetOrDefault<bool>("regtest", false) ? ChainName.Regtest :
conf.GetOrDefault<bool>("testnet", false) ? NetworkType.Testnet : NetworkType.Mainnet; conf.GetOrDefault<bool>("testnet", false) ? ChainName.Testnet :
conf.GetOrDefault<bool>("signet", false) ? Bitcoin.Instance.Signet.ChainName :
ChainName.Mainnet;
return net; return net;
} }

View File

@@ -30,12 +30,12 @@ namespace BTCPayServer.Configuration
/// Return a connectionString which does not depends on external resources or information like relative path or file path /// Return a connectionString which does not depends on external resources or information like relative path or file path
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public async Task<ExternalConnectionString> Expand(Uri absoluteUrlBase, ExternalServiceTypes serviceType, NetworkType network) public async Task<ExternalConnectionString> Expand(Uri absoluteUrlBase, ExternalServiceTypes serviceType, ChainName network)
{ {
var connectionString = this.Clone(); var connectionString = this.Clone();
// Transform relative URI into absolute URI // Transform relative URI into absolute URI
var serviceUri = connectionString.Server.IsAbsoluteUri ? connectionString.Server : ToRelative(absoluteUrlBase, connectionString.Server.ToString()); var serviceUri = connectionString.Server.IsAbsoluteUri ? connectionString.Server : ToRelative(absoluteUrlBase, connectionString.Server.ToString());
var isSecure = network != NetworkType.Mainnet || var isSecure = network != ChainName.Mainnet ||
serviceUri.Scheme == "https" || serviceUri.Scheme == "https" ||
serviceUri.DnsSafeHost.EndsWith(".onion", StringComparison.OrdinalIgnoreCase) || serviceUri.DnsSafeHost.EndsWith(".onion", StringComparison.OrdinalIgnoreCase) ||
Extensions.IsLocalNetwork(serviceUri.DnsSafeHost); Extensions.IsLocalNetwork(serviceUri.DnsSafeHost);

View File

@@ -119,7 +119,7 @@ namespace BTCPayServer.Controllers
[HttpGet] [HttpGet]
public async Task<IActionResult> Generate(string version) public async Task<IActionResult> Generate(string version)
{ {
if (_env.NetworkType != NBitcoin.NetworkType.Regtest) if (_env.NetworkType != NBitcoin.ChainName.Regtest)
return NotFound(); return NotFound();
await _notificationSender.SendNotification(new AdminScope(), new NewVersionNotification(version)); await _notificationSender.SendNotification(new AdminScope(), new NewVersionNotification(version));
return RedirectToAction(nameof(Index)); return RedirectToAction(nameof(Index));

View File

@@ -189,8 +189,8 @@ namespace BTCPayServer.HostedServices
if (status != null && error == null) if (status != null && error == null)
{ {
if (status.NetworkType != _Network.NBitcoinNetwork.NetworkType) if (status.NetworkType != _Network.NBitcoinNetwork.ChainName)
error = $"{_Network.CryptoCode}: NBXplorer is on a different ChainType (actual: {status.NetworkType}, expected: {_Network.NBitcoinNetwork.NetworkType})"; error = $"{_Network.CryptoCode}: NBXplorer is on a different ChainType (actual: {status.NetworkType}, expected: {_Network.NBitcoinNetwork.ChainName})";
} }
if (error != null) if (error != null)

View File

@@ -363,7 +363,7 @@ namespace BTCPayServer.Hosting
services.TryAddSingleton<ExplorerClientProvider>(); services.TryAddSingleton<ExplorerClientProvider>();
services.TryAddSingleton<Bitpay>(o => services.TryAddSingleton<Bitpay>(o =>
{ {
if (o.GetRequiredService<BTCPayServerOptions>().NetworkType == NetworkType.Mainnet) if (o.GetRequiredService<BTCPayServerOptions>().NetworkType == ChainName.Mainnet)
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

@@ -43,7 +43,7 @@ namespace BTCPayServer.Services
public string OnionUrl => this.torServices.Services.Where(s => s.ServiceType == TorServiceType.BTCPayServer) public string OnionUrl => this.torServices.Services.Where(s => s.ServiceType == TorServiceType.BTCPayServer)
.Select(s => $"http://{s.OnionHost}").FirstOrDefault(); .Select(s => $"http://{s.OnionHost}").FirstOrDefault();
public NetworkType NetworkType { get; set; } public ChainName NetworkType { get; set; }
public string Version public string Version
{ {
get; set; get; set;
@@ -58,7 +58,7 @@ namespace BTCPayServer.Services
{ {
get get
{ {
return DevelopmentOverride?? NetworkType == NetworkType.Regtest && Environment.IsDevelopment(); return DevelopmentOverride?? NetworkType == ChainName.Regtest && Environment.IsDevelopment();
} }
} }
@@ -66,7 +66,7 @@ namespace BTCPayServer.Services
{ {
get get
{ {
return NetworkType != NetworkType.Mainnet || return NetworkType != ChainName.Mainnet ||
httpContext.HttpContext.Request.Scheme == "https" || httpContext.HttpContext.Request.Scheme == "https" ||
httpContext.HttpContext.Request.Host.Host.EndsWith(".onion", StringComparison.OrdinalIgnoreCase) || httpContext.HttpContext.Request.Host.Host.EndsWith(".onion", StringComparison.OrdinalIgnoreCase) ||
Extensions.IsLocalNetwork(httpContext.HttpContext.Request.Host.Host); Extensions.IsLocalNetwork(httpContext.HttpContext.Request.Host.Host);

View File

@@ -30,7 +30,7 @@
<a class="navbar-brand js-scroll-trigger" href="~/"> <a class="navbar-brand js-scroll-trigger" href="~/">
<svg class="logo" viewBox="0 0 192 84" xmlns="http://www.w3.org/2000/svg"><g><path d="M5.206 83.433a4.86 4.86 0 01-4.859-4.861V5.431a4.86 4.86 0 119.719 0v73.141a4.861 4.861 0 01-4.86 4.861" fill="#CEDC21" class="logo-brand-light" /><path d="M5.209 83.433a4.862 4.862 0 01-2.086-9.253L32.43 60.274 2.323 38.093a4.861 4.861 0 015.766-7.826l36.647 26.999a4.864 4.864 0 01-.799 8.306L7.289 82.964a4.866 4.866 0 01-2.08.469" fill="#51B13E" class="logo-brand-medium" /><path d="M5.211 54.684a4.86 4.86 0 01-2.887-8.774L32.43 23.73 3.123 9.821a4.861 4.861 0 014.166-8.784l36.648 17.394a4.86 4.86 0 01.799 8.305l-36.647 27a4.844 4.844 0 01-2.878.948" fill="#CEDC21" class="logo-brand-light" /><path d="M10.066 31.725v20.553L24.01 42.006z" fill="#1E7A44" class="logo-brand-dark" /><path d="M10.066 5.431A4.861 4.861 0 005.206.57 4.86 4.86 0 00.347 5.431v61.165h9.72V5.431h-.001z" fill="#CEDC21" class="logo-brand-light" /><path d="M74.355 41.412c3.114.884 4.84 3.704 4.84 7.238 0 5.513-3.368 8.082-7.955 8.082H60.761V27.271h9.259c4.504 0 7.997 2.146 7.997 7.743 0 2.821-1.179 5.43-3.662 6.398m-4.293-.716c3.324 0 6.018-1.179 6.018-5.724 0-4.586-2.776-5.808-6.145-5.808h-7.197v11.531h7.324v.001zm1.052 14.099c3.366 0 6.06-1.768 6.06-6.145 0-4.713-3.072-6.144-6.901-6.144h-7.534v12.288h8.375v.001zM98.893 27.271v1.81h-8.122v27.651h-1.979V29.081h-8.123v-1.81zM112.738 26.85c5.01 0 9.554 2.524 10.987 8.543h-1.895c-1.348-4.923-5.303-6.732-9.134-6.732-6.944 0-10.605 5.681-10.605 13.341 0 8.08 3.661 13.256 10.646 13.256 4.125 0 7.828-1.85 9.26-7.279h1.895c-1.264 6.271-6.229 9.174-11.154 9.174-7.87 0-12.583-5.808-12.583-15.15 0-8.966 4.969-15.153 12.583-15.153M138.709 27.271c5.091 0 8.795 3.326 8.795 9.764 0 6.06-3.704 9.722-8.795 9.722h-7.746v9.976h-1.935V27.271h9.681zm0 17.549c3.745 0 6.816-2.397 6.816-7.827 0-5.429-2.947-7.869-6.816-7.869h-7.746V44.82h7.746zM147.841 56.732v-.255l11.741-29.29h.885l11.615 29.29v.255h-2.062l-3.322-8.501H153.27l-3.324 8.501h-2.105zm12.164-26.052l-6.059 15.697h12.078l-6.019-15.697zM189.551 27.271h2.104v.293l-9.176 16.92v12.248h-2.02V44.484l-9.216-16.961v-.252h2.147l3.997 7.492 4.043 7.786h.04l4.081-7.786z" class="logo-brand-text" /></g></svg> <svg class="logo" viewBox="0 0 192 84" xmlns="http://www.w3.org/2000/svg"><g><path d="M5.206 83.433a4.86 4.86 0 01-4.859-4.861V5.431a4.86 4.86 0 119.719 0v73.141a4.861 4.861 0 01-4.86 4.861" fill="#CEDC21" class="logo-brand-light" /><path d="M5.209 83.433a4.862 4.862 0 01-2.086-9.253L32.43 60.274 2.323 38.093a4.861 4.861 0 015.766-7.826l36.647 26.999a4.864 4.864 0 01-.799 8.306L7.289 82.964a4.866 4.866 0 01-2.08.469" fill="#51B13E" class="logo-brand-medium" /><path d="M5.211 54.684a4.86 4.86 0 01-2.887-8.774L32.43 23.73 3.123 9.821a4.861 4.861 0 014.166-8.784l36.648 17.394a4.86 4.86 0 01.799 8.305l-36.647 27a4.844 4.844 0 01-2.878.948" fill="#CEDC21" class="logo-brand-light" /><path d="M10.066 31.725v20.553L24.01 42.006z" fill="#1E7A44" class="logo-brand-dark" /><path d="M10.066 5.431A4.861 4.861 0 005.206.57 4.86 4.86 0 00.347 5.431v61.165h9.72V5.431h-.001z" fill="#CEDC21" class="logo-brand-light" /><path d="M74.355 41.412c3.114.884 4.84 3.704 4.84 7.238 0 5.513-3.368 8.082-7.955 8.082H60.761V27.271h9.259c4.504 0 7.997 2.146 7.997 7.743 0 2.821-1.179 5.43-3.662 6.398m-4.293-.716c3.324 0 6.018-1.179 6.018-5.724 0-4.586-2.776-5.808-6.145-5.808h-7.197v11.531h7.324v.001zm1.052 14.099c3.366 0 6.06-1.768 6.06-6.145 0-4.713-3.072-6.144-6.901-6.144h-7.534v12.288h8.375v.001zM98.893 27.271v1.81h-8.122v27.651h-1.979V29.081h-8.123v-1.81zM112.738 26.85c5.01 0 9.554 2.524 10.987 8.543h-1.895c-1.348-4.923-5.303-6.732-9.134-6.732-6.944 0-10.605 5.681-10.605 13.341 0 8.08 3.661 13.256 10.646 13.256 4.125 0 7.828-1.85 9.26-7.279h1.895c-1.264 6.271-6.229 9.174-11.154 9.174-7.87 0-12.583-5.808-12.583-15.15 0-8.966 4.969-15.153 12.583-15.153M138.709 27.271c5.091 0 8.795 3.326 8.795 9.764 0 6.06-3.704 9.722-8.795 9.722h-7.746v9.976h-1.935V27.271h9.681zm0 17.549c3.745 0 6.816-2.397 6.816-7.827 0-5.429-2.947-7.869-6.816-7.869h-7.746V44.82h7.746zM147.841 56.732v-.255l11.741-29.29h.885l11.615 29.29v.255h-2.062l-3.322-8.501H153.27l-3.324 8.501h-2.105zm12.164-26.052l-6.059 15.697h12.078l-6.019-15.697zM189.551 27.271h2.104v.293l-9.176 16.92v12.248h-2.02V44.484l-9.216-16.961v-.252h2.147l3.997 7.492 4.043 7.786h.04l4.081-7.786z" class="logo-brand-text" /></g></svg>
@if (env.NetworkType != NBitcoin.NetworkType.Mainnet) @if (env.NetworkType != NBitcoin.ChainName.Mainnet)
{ {
<span class="badge badge-warning" style="font-size:10px;">@env.NetworkType.ToString()</span> <span class="badge badge-warning" style="font-size:10px;">@env.NetworkType.ToString()</span>
} }