diff --git a/BTCPayServer.Tests/UnitTest1.cs b/BTCPayServer.Tests/UnitTest1.cs index baa7bd6ea..ae0ba47f1 100644 --- a/BTCPayServer.Tests/UnitTest1.cs +++ b/BTCPayServer.Tests/UnitTest1.cs @@ -1582,11 +1582,17 @@ namespace BTCPayServer.Tests derivationVM = (DerivationSchemeViewModel)Assert.IsType(controller.AddDerivationScheme(user.StoreId, derivationVM, "BTC").GetAwaiter().GetResult()).Model; Assert.True(derivationVM.Confirmation); - // Can we upload coldcard settings? + // Can we upload coldcard settings? (Should fail, we are giving a mainnet file to a testnet network) derivationVM = (DerivationSchemeViewModel)Assert.IsType(controller.AddDerivationScheme(user.StoreId, "BTC")).Model; - string filename = "wallet.json"; string content = "{\"keystore\": {\"ckcc_xpub\": \"xpub661MyMwAqRbcGVBsTGeNZN6QGVHmMHLdSA4FteGsRrEriu4pnVZMZWnruFFFXkMnyoBjyHndD3Qwcfz4MPzBUxjSevweNFQx7SAYZATtcDw\", \"xpub\": \"ypub6WWc2gWwHbdnAAyJDnR4SPL1phRh7REqrPBfZeizaQ1EmTshieRXJC3Z5YoU4wkcdKHEjQGkh6AYEzCQC1Kz3DNaWSwdc1pc8416hAjzqyD\", \"label\": \"Coldcard Import 0x60d1af8b\", \"ckcc_xfp\": 1624354699, \"type\": \"hardware\", \"hw_type\": \"coldcard\", \"derivation\": \"m/49'/0'/0'\"}, \"wallet_type\": \"standard\", \"use_encryption\": false, \"seed_version\": 17}"; - derivationVM.ColdcardPublicFile = TestUtils.GetFormFile(filename, content); + derivationVM.ColdcardPublicFile = TestUtils.GetFormFile("wallet.json", content); + derivationVM = (DerivationSchemeViewModel)Assert.IsType(controller.AddDerivationScheme(user.StoreId, derivationVM, "BTC").GetAwaiter().GetResult()).Model; + Assert.False(derivationVM.Confirmation); // Should fail, we are giving a mainnet file to a testnet network + + // And with a good file? (upub) + content = "{\"keystore\": {\"ckcc_xpub\": \"tpubD6NzVbkrYhZ4YHNiuTdTmHRmbcPRLfqgyneZFCL1mkzkUBjXriQShxTh9HL34FK2mhieasJVk9EzJrUfkFqRNQBjiXgx3n5BhPkxKBoFmaS\", \"xpub\": \"upub5DBYp1qGgsTrkzCptMGZc2x18pquLwGrBw6nS59T4NViZ4cni1mGowQzziy85K8vzkp1jVtWrSkLhqk9KDfvrGeB369wGNYf39kX8rQfiLn\", \"label\": \"Coldcard Import 0x60d1af8b\", \"ckcc_xfp\": 1624354699, \"type\": \"hardware\", \"hw_type\": \"coldcard\", \"derivation\": \"m/49'/0'/0'\"}, \"wallet_type\": \"standard\", \"use_encryption\": false, \"seed_version\": 17}"; + derivationVM = (DerivationSchemeViewModel)Assert.IsType(controller.AddDerivationScheme(user.StoreId, "BTC")).Model; + derivationVM.ColdcardPublicFile = TestUtils.GetFormFile("wallet2.json", content); derivationVM = (DerivationSchemeViewModel)Assert.IsType(controller.AddDerivationScheme(user.StoreId, derivationVM, "BTC").GetAwaiter().GetResult()).Model; Assert.True(derivationVM.Confirmation); Assert.IsType(controller.AddDerivationScheme(user.StoreId, derivationVM, "BTC").GetAwaiter().GetResult()); diff --git a/BTCPayServer/BTCPayNetworkProvider.cs b/BTCPayServer/BTCPayNetworkProvider.cs index be0c4970d..1d9a6e92a 100644 --- a/BTCPayServer/BTCPayNetworkProvider.cs +++ b/BTCPayServer/BTCPayNetworkProvider.cs @@ -56,6 +56,22 @@ namespace BTCPayServer InitGroestlcoin(); InitViacoin(); + // Assume that electrum mappings are same as BTC if not specified + foreach (var network in _Networks) + { + if(network.Value.ElectrumMapping.Count == 0) + { + network.Value.ElectrumMapping = GetNetwork("BTC").ElectrumMapping; + if (!network.Value.NBitcoinNetwork.Consensus.SupportSegwit) + { + network.Value.ElectrumMapping = + network.Value.ElectrumMapping + .Where(kv => kv.Value.Contains("legacy")) + .ToDictionary(k => k.Key, k => k.Value); + } + } + } + // Disabled because of https://twitter.com/Cryptopia_NZ/status/1085084168852291586 //InitPolis(); //InitBitcoinplus(); diff --git a/BTCPayServer/DerivationSchemeParser.cs b/BTCPayServer/DerivationSchemeParser.cs index e0fd20008..0e97ae40b 100644 --- a/BTCPayServer/DerivationSchemeParser.cs +++ b/BTCPayServer/DerivationSchemeParser.cs @@ -17,14 +17,17 @@ namespace BTCPayServer public Network Network => BtcPayNetwork.NBitcoinNetwork; public Script HintScriptPubKey { get; set; } + + Dictionary ElectrumMapping = new Dictionary(); public DerivationSchemeParser(BTCPayNetwork expectedNetwork) { + if (expectedNetwork == null) + throw new ArgumentNullException(nameof(expectedNetwork)); BtcPayNetwork = expectedNetwork; } - public DerivationStrategyBase ParseElectrum(string str) {