Move ElectrumMapping to BtcPayNetwork

This commit is contained in:
Kukks
2019-05-09 09:05:18 +02:00
committed by Nicolas Dorier
parent 5a92fe736f
commit bb3a087d39
7 changed files with 45 additions and 24 deletions

View File

@@ -1459,7 +1459,9 @@ namespace BTCPayServer.Tests
[Trait("Fast", "Fast")] [Trait("Fast", "Fast")]
public void CanParseDerivationScheme() public void CanParseDerivationScheme()
{ {
var parser = new DerivationSchemeParser(Network.TestNet); var testnetNetworkProvider = new BTCPayNetworkProvider(NetworkType.Testnet);
var regtestNetworkProvider = new BTCPayNetworkProvider(NetworkType.Regtest);
var parser = new DerivationSchemeParser(testnetNetworkProvider.GetNetwork("BTC"));
NBXplorer.DerivationStrategy.DerivationStrategyBase result; NBXplorer.DerivationStrategy.DerivationStrategyBase result;
// Passing electrum stuff // Passing electrum stuff
// Native // Native
@@ -1495,16 +1497,16 @@ namespace BTCPayServer.Tests
result = parser.Parse(tpub); result = parser.Parse(tpub);
Assert.Equal($"{tpub}-[p2sh]", result.ToString()); Assert.Equal($"{tpub}-[p2sh]", result.ToString());
parser = new DerivationSchemeParser(Network.RegTest); parser = new DerivationSchemeParser(regtestNetworkProvider.GetNetwork("BTC"));
var parsed = parser.Parse("xpub6DG1rMYXiQtCc6CfdLFD9CtxqhzzRh7j6Sq6EdE9abgYy3cfDRrniLLv2AdwqHL1exiLnnKR5XXcaoiiexf3Y9R6J6rxkJtqJHzNzMW9QMZ-[p2sh]"); var parsed = parser.Parse("xpub6DG1rMYXiQtCc6CfdLFD9CtxqhzzRh7j6Sq6EdE9abgYy3cfDRrniLLv2AdwqHL1exiLnnKR5XXcaoiiexf3Y9R6J6rxkJtqJHzNzMW9QMZ-[p2sh]");
Assert.Equal("tpubDDdeNbNDRgqestPX5XEJM8ELAq6eR5cne5RPbBHHvWSSiLHNHehsrn1kGCijMnHFSsFFQMqHcdMfGzDL3pWHRasPMhcGRqZ4tFankQ3i4ok-[p2sh]", parsed.ToString()); Assert.Equal("tpubDDdeNbNDRgqestPX5XEJM8ELAq6eR5cne5RPbBHHvWSSiLHNHehsrn1kGCijMnHFSsFFQMqHcdMfGzDL3pWHRasPMhcGRqZ4tFankQ3i4ok-[p2sh]", parsed.ToString());
// Let's make sure we can't generate segwit with dogecoin // Let's make sure we can't generate segwit with dogecoin
parser = new DerivationSchemeParser(NBitcoin.Altcoins.Dogecoin.Instance.Regtest); parser = new DerivationSchemeParser(regtestNetworkProvider.GetNetwork("DOGE"));
parsed = parser.Parse("xpub6DG1rMYXiQtCc6CfdLFD9CtxqhzzRh7j6Sq6EdE9abgYy3cfDRrniLLv2AdwqHL1exiLnnKR5XXcaoiiexf3Y9R6J6rxkJtqJHzNzMW9QMZ-[p2sh]"); parsed = parser.Parse("xpub6DG1rMYXiQtCc6CfdLFD9CtxqhzzRh7j6Sq6EdE9abgYy3cfDRrniLLv2AdwqHL1exiLnnKR5XXcaoiiexf3Y9R6J6rxkJtqJHzNzMW9QMZ-[p2sh]");
Assert.Equal("tpubDDdeNbNDRgqestPX5XEJM8ELAq6eR5cne5RPbBHHvWSSiLHNHehsrn1kGCijMnHFSsFFQMqHcdMfGzDL3pWHRasPMhcGRqZ4tFankQ3i4ok-[legacy]", parsed.ToString()); Assert.Equal("tpubDDdeNbNDRgqestPX5XEJM8ELAq6eR5cne5RPbBHHvWSSiLHNHehsrn1kGCijMnHFSsFFQMqHcdMfGzDL3pWHRasPMhcGRqZ4tFankQ3i4ok-[legacy]", parsed.ToString());
parser = new DerivationSchemeParser(NBitcoin.Altcoins.Dogecoin.Instance.Regtest); parser = new DerivationSchemeParser(regtestNetworkProvider.GetNetwork("DOGE"));
parsed = parser.Parse("tpubDDdeNbNDRgqestPX5XEJM8ELAq6eR5cne5RPbBHHvWSSiLHNHehsrn1kGCijMnHFSsFFQMqHcdMfGzDL3pWHRasPMhcGRqZ4tFankQ3i4ok-[p2sh]"); parsed = parser.Parse("tpubDDdeNbNDRgqestPX5XEJM8ELAq6eR5cne5RPbBHHvWSSiLHNHehsrn1kGCijMnHFSsFFQMqHcdMfGzDL3pWHRasPMhcGRqZ4tFankQ3i4ok-[p2sh]");
Assert.Equal("tpubDDdeNbNDRgqestPX5XEJM8ELAq6eR5cne5RPbBHHvWSSiLHNHehsrn1kGCijMnHFSsFFQMqHcdMfGzDL3pWHRasPMhcGRqZ4tFankQ3i4ok-[legacy]", parsed.ToString()); Assert.Equal("tpubDDdeNbNDRgqestPX5XEJM8ELAq6eR5cne5RPbBHHvWSSiLHNHehsrn1kGCijMnHFSsFFQMqHcdMfGzDL3pWHRasPMhcGRqZ4tFankQ3i4ok-[legacy]", parsed.ToString());
} }

View File

@@ -65,7 +65,7 @@ namespace BTCPayServer
public int MaxTrackedConfirmation { get; internal set; } = 6; public int MaxTrackedConfirmation { get; internal set; } = 6;
public string[] DefaultRateRules { get; internal set; } = Array.Empty<string>(); public string[] DefaultRateRules { get; internal set; } = Array.Empty<string>();
public bool SupportRBF { get; internal set; } public bool SupportRBF { get; internal set; }
public Dictionary<uint, string[]> ElectrumMapping = new Dictionary<uint, string[]>();
public override string ToString() public override string ToString()
{ {
return CryptoCode; return CryptoCode;

View File

@@ -26,7 +26,19 @@ namespace BTCPayServer
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 == NetworkType.Mainnet ? new KeyPath("0'") : new KeyPath("1'"),
SupportRBF = true SupportRBF = true,
ElectrumMapping = new Dictionary<uint, string[]>()
{
//https://github.com/spesmilo/electrum/blob/11733d6bc271646a00b69ff07657119598874da4/electrum/constants.py
//mainnet
{0x0488b21eU, new[] { "legacy" }},
{0x049d7cb2U, new[] { "p2sh" }},
{0x4b24746U, Array.Empty<string>()},
//testnet
{0x043587cfU, new[] { "legacy" }},
{0x044a5262U, new[] { "p2sh" }},
{0x045f1cf6U, Array.Empty<string>()}
}
}); });
} }
} }

View File

@@ -24,7 +24,19 @@ 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 == NetworkType.Mainnet ? new KeyPath("2'") : new KeyPath("1'"),
ElectrumMapping = new Dictionary<uint, string[]>()
{
//https://github.com/pooler/electrum-ltc/blob/0d6989a9d2fb2edbea421c116e49d1015c7c5a91/electrum_ltc/constants.py
//mainnet
{0x0488b21eU, new[] { "legacy" }},
{0x049d7cb2U, new[] { "p2sh" }},
{0x04b24746U, Array.Empty<string>()},
//testnet
{0x043587cfU, new[] { "legacy" }},
{0x044a5262U, new[] { "p2sh" }},
{0x045f1cf6U, Array.Empty<string>()}
}
}); });
} }
} }

View File

@@ -598,7 +598,7 @@ namespace BTCPayServer.Controllers
private DerivationSchemeSettings ParseDerivationStrategy(string derivationScheme, Script hint, BTCPayNetwork network) private DerivationSchemeSettings ParseDerivationStrategy(string derivationScheme, Script hint, BTCPayNetwork network)
{ {
var parser = new DerivationSchemeParser(network.NBitcoinNetwork); var parser = new DerivationSchemeParser(network);
parser.HintScriptPubKey = hint; parser.HintScriptPubKey = hint;
return new DerivationSchemeSettings(parser.Parse(derivationScheme), network); return new DerivationSchemeSettings(parser.Parse(derivationScheme), network);
} }

View File

@@ -12,27 +12,22 @@ namespace BTCPayServer
{ {
public class DerivationSchemeParser public class DerivationSchemeParser
{ {
public Network Network { get; set; } private BTCPayNetwork BtcPayNetwork { get; }
public Script HintScriptPubKey { get; set; }
static Dictionary<uint, string[]> electrumMapping;
static DerivationSchemeParser() public Network Network => BtcPayNetwork.NBitcoinNetwork;
public Script HintScriptPubKey { get; set; }
public DerivationSchemeParser(BTCPayNetwork expectedNetwork)
{ {
//Source https://github.com/spesmilo/electrum/blob/11733d6bc271646a00b69ff07657119598874da4/electrum/constants.py BtcPayNetwork = expectedNetwork;
electrumMapping = new Dictionary<uint, string[]>();
electrumMapping.Add(0x0488b21eU, new[] { "legacy" });
electrumMapping.Add(0x049d7cb2U, new string[] { "p2sh" });
electrumMapping.Add(0x4b24746U, Array.Empty<string>());
}
public DerivationSchemeParser(Network expectedNetwork)
{
Network = expectedNetwork;
} }
public DerivationStrategyBase ParseElectrum(string str) public DerivationStrategyBase ParseElectrum(string str)
{ {
if (str == null) if (str == null)
throw new ArgumentNullException(nameof(str)); throw new ArgumentNullException(nameof(str));
str = str.Trim(); str = str.Trim();
@@ -45,7 +40,7 @@ namespace BTCPayServer
for (int ii = 0; ii < 4; ii++) for (int ii = 0; ii < 4; ii++)
data[ii] = standardPrefix[ii]; data[ii] = standardPrefix[ii];
var extPubKey = new BitcoinExtPubKey(Network.GetBase58CheckEncoder().EncodeData(data), Network.Main).ToNetwork(Network); var extPubKey = new BitcoinExtPubKey(Network.GetBase58CheckEncoder().EncodeData(data), Network.Main).ToNetwork(Network);
if (!electrumMapping.TryGetValue(prefix, out string[] labels)) if (!BtcPayNetwork.ElectrumMapping.TryGetValue(prefix, out string[] labels))
{ {
throw new FormatException(); throw new FormatException();
} }
@@ -120,7 +115,7 @@ namespace BTCPayServer
data[ii] = standardPrefix[ii]; data[ii] = standardPrefix[ii];
var derivationScheme = new BitcoinExtPubKey(Network.GetBase58CheckEncoder().EncodeData(data), Network.Main).ToNetwork(Network).ToString(); var derivationScheme = new BitcoinExtPubKey(Network.GetBase58CheckEncoder().EncodeData(data), Network.Main).ToNetwork(Network).ToString();
electrumMapping.TryGetValue(prefix, out string[] labels); BtcPayNetwork.ElectrumMapping.TryGetValue(prefix, out string[] labels);
if (labels != null) if (labels != null)
{ {
foreach (var label in labels) foreach (var label in labels)

View File

@@ -47,7 +47,7 @@ namespace BTCPayServer
throw new ArgumentNullException(nameof(network)); throw new ArgumentNullException(nameof(network));
var result = new DerivationSchemeSettings(); var result = new DerivationSchemeSettings();
result.Source = "Coldcard"; result.Source = "Coldcard";
var derivationSchemeParser = new DerivationSchemeParser(network.NBitcoinNetwork); var derivationSchemeParser = new DerivationSchemeParser(network);
JObject jobj = null; JObject jobj = null;
try try
{ {