From f223d2e00c10148bb03c145ca2f971a2de9c0f72 Mon Sep 17 00:00:00 2001 From: Dennis Reimann Date: Wed, 3 Feb 2021 16:33:47 +0100 Subject: [PATCH] Add Specter wallet file import Closes #2223. --- BTCPayServer.Tests/UnitTest1.cs | 12 +++++++++- BTCPayServer/DerivationSchemeSettings.cs | 23 +++++++++++++++++-- ...vationSchemes_HardwareWalletDialogs.cshtml | 4 ++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/BTCPayServer.Tests/UnitTest1.cs b/BTCPayServer.Tests/UnitTest1.cs index c3fb9f0b9..dd2315fb9 100644 --- a/BTCPayServer.Tests/UnitTest1.cs +++ b/BTCPayServer.Tests/UnitTest1.cs @@ -3195,6 +3195,8 @@ namespace BTCPayServer.Tests 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") .DeriveExtKey(); + + // ColdCard Assert.True(DerivationSchemeSettings.TryParseFromWalletFile( "{\"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}", mainnet, out var settings)); @@ -3208,7 +3210,6 @@ namespace BTCPayServer.Tests settings.AccountOriginal); Assert.Equal(root.Derive(new KeyPath("m/49'/0'/0'")).Neuter().PubKey.WitHash.ScriptPubKey.Hash.ScriptPubKey, settings.AccountDerivation.GetDerivation().ScriptPubKey); - var testnet = new BTCPayNetworkProvider(ChainName.Testnet).GetNetwork("BTC"); // Should be legacy @@ -3229,6 +3230,15 @@ namespace BTCPayServer.Tests "{\"keystore\": {\"ckcc_xpub\": \"tpubD6NzVbkrYhZ4YHNiuTdTmHRmbcPRLfqgyneZFCL1mkzkUBjXriQShxTh9HL34FK2mhieasJVk9EzJrUfkFqRNQBjiXgx3n5BhPkxKBoFmaS\", \"xpub\": \"vpub5YjYxTemJ39tFRnuAhwduyxG2tKGjoEpmvqVQRPqdYrqa6YGoeSzBtHXaJUYB19zDbXs3JjbEcVWERjQBPf9bEfUUMZNMv1QnMyHV8JPqyf\", \"label\": \"Coldcard Import 0x60d1af8b\", \"ckcc_xfp\": 1624354699, \"type\": \"hardware\", \"hw_type\": \"coldcard\", \"derivation\": \"m/84'/1'/0'\"}, \"wallet_type\": \"standard\", \"use_encryption\": false, \"seed_version\": 17}", testnet, out settings)); Assert.True(settings.AccountDerivation is DirectDerivationStrategy s3 && s3.Segwit); + + // Specter + Assert.True(DerivationSchemeSettings.TryParseFromWalletFile( + "{\"label\": \"Specter\", \"blockheight\": 123456, \"descriptor\": \"wpkh([8bafd160/49h/0h/0h]xpub661MyMwAqRbcGVBsTGeNZN6QGVHmMHLdSA4FteGsRrEriu4pnVZMZWnruFFFXkMnyoBjyHndD3Qwcfz4MPzBUxjSevweNFQx7SAYZATtcDw/0/*)#9x4vkw48\"}", + mainnet, out var specter)); + Assert.Equal(root.GetPublicKey().GetHDFingerPrint(), specter.AccountKeySettings[0].RootFingerprint); + Assert.Equal(specter.AccountKeySettings[0].RootFingerprint, hd); + Assert.Equal("49'/0'/0'", specter.AccountKeySettings[0].AccountKeyPath.ToString()); + Assert.Equal("Specter", specter.Label); } diff --git a/BTCPayServer/DerivationSchemeSettings.cs b/BTCPayServer/DerivationSchemeSettings.cs index 3124ef79f..ae7b0103e 100644 --- a/BTCPayServer/DerivationSchemeSettings.cs +++ b/BTCPayServer/DerivationSchemeSettings.cs @@ -114,7 +114,7 @@ namespace BTCPayServer return false; } - //electrum + // Electrum if (jobj.ContainsKey("keystore")) { result.Source = "ElectrumFile"; @@ -153,10 +153,29 @@ namespace BTCPayServer catch { return false; } } } + // Specter + else if (jobj.ContainsKey("descriptor") && jobj.ContainsKey("blockheight")) + { + result.Source = "SpecterFile"; + + if (!TryParseXpub(jobj["descriptor"].Value(), derivationSchemeParser, ref result, false)) + { + return false; + } + + if (jobj.ContainsKey("label")) + { + try + { + result.Label = jobj["label"].Value(); + } + catch { return false; } + } + } + // Wasabi else { result.Source = "WasabiFile"; - //wasabi format if (!jobj.ContainsKey("ExtPubKey") || !TryParseXpub(jobj["ExtPubKey"].Value(), derivationSchemeParser, ref result, false)) { diff --git a/BTCPayServer/Views/Stores/AddDerivationSchemes_HardwareWalletDialogs.cshtml b/BTCPayServer/Views/Stores/AddDerivationSchemes_HardwareWalletDialogs.cshtml index 1c04f7df3..b292c899b 100644 --- a/BTCPayServer/Views/Stores/AddDerivationSchemes_HardwareWalletDialogs.cshtml +++ b/BTCPayServer/Views/Stores/AddDerivationSchemes_HardwareWalletDialogs.cshtml @@ -48,6 +48,10 @@ Wasabi Tools ❯ Wallet Manager ❯ Open Wallets Folder + + Specter + Wallet ❯ Settings ❯ Export ❯ Export To Wallet Software ❯ Save wallet file +