From a794dafdf90c7a52f6a613b76e299af857dec0ec Mon Sep 17 00:00:00 2001 From: Michele Balistreri Date: Wed, 12 Nov 2025 23:57:38 +0900 Subject: [PATCH] add keycard shell importers for singlesig and multisig --- .../sparrow/control/WalletImportDialog.java | 2 +- .../sparrow/io/KeycardShellMultisig.java | 53 +++++++++++++++++++ .../sparrow/io/KeycardShellSinglesig.java | 44 +++++++++++++++ .../keystoreimport/HwAirgappedController.java | 4 +- .../image/walletmodel/keycard-icon-invert.svg | 12 +++++ .../image/walletmodel/keycard-icon.svg | 12 +++++ .../image/walletmodel/keycard-invert.svg | 12 +++++ .../resources/image/walletmodel/keycard.svg | 12 +++++ 8 files changed, 148 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/sparrowwallet/sparrow/io/KeycardShellMultisig.java create mode 100644 src/main/java/com/sparrowwallet/sparrow/io/KeycardShellSinglesig.java create mode 100644 src/main/resources/image/walletmodel/keycard-icon-invert.svg create mode 100644 src/main/resources/image/walletmodel/keycard-icon.svg create mode 100644 src/main/resources/image/walletmodel/keycard-invert.svg create mode 100644 src/main/resources/image/walletmodel/keycard.svg diff --git a/src/main/java/com/sparrowwallet/sparrow/control/WalletImportDialog.java b/src/main/java/com/sparrowwallet/sparrow/control/WalletImportDialog.java index eef5a156..207418fd 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/WalletImportDialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/WalletImportDialog.java @@ -52,7 +52,7 @@ public class WalletImportDialog extends Dialog { importAccordion = new Accordion(); List keystoreImporters = List.of(new ColdcardSinglesig(), new CoboVaultSinglesig(), new Jade(), new KeystoneSinglesig(), new PassportSinglesig(), - new GordianSeedTool(), new SeedSigner(), new SpecterDIY(), new Krux(), new AirGapVault(), new Samourai()); + new GordianSeedTool(), new SeedSigner(), new SpecterDIY(), new Krux(), new AirGapVault(), new Samourai(), new KeycardShellSinglesig()); for(KeystoreFileImport importer : keystoreImporters) { if(!importer.isDeprecated() || Config.get().isShowDeprecatedImportExport()) { FileWalletKeystoreImportPane importPane = new FileWalletKeystoreImportPane(importer); diff --git a/src/main/java/com/sparrowwallet/sparrow/io/KeycardShellMultisig.java b/src/main/java/com/sparrowwallet/sparrow/io/KeycardShellMultisig.java new file mode 100644 index 00000000..98dd0932 --- /dev/null +++ b/src/main/java/com/sparrowwallet/sparrow/io/KeycardShellMultisig.java @@ -0,0 +1,53 @@ +package com.sparrowwallet.sparrow.io; + +import com.sparrowwallet.drongo.protocol.ScriptType; +import com.sparrowwallet.drongo.wallet.Keystore; +import com.sparrowwallet.drongo.wallet.WalletModel; + +import java.io.InputStream; + +public class KeycardShellMultisig extends ColdcardMultisig { + @Override + public String getName() { + return "Keycard Shell Multisig"; + } + + @Override + public String getKeystoreImportDescription(int account) { + return "Import QR created on your Keycard Shell by selecting Connect software wallet > Bitcoin MultiSig"; + } + + @Override + public WalletModel getWalletModel() { + return WalletModel.KEYCARD_SHELL; + } + + @Override + public Keystore getKeystore(ScriptType scriptType, InputStream inputStream, String password) throws ImportException { + Keystore keystore = super.getKeystore(scriptType, inputStream, password); + keystore.setLabel("Keycard Shell"); + keystore.setWalletModel(getWalletModel()); + + return keystore; + } + + @Override + public boolean isFileFormatAvailable() { + return false; + } + + @Override + public boolean isWalletImportFileFormatAvailable() { + return false; + } + + @Override + public boolean isWalletImportScannable() { + return false; + } + + @Override + public boolean isWalletExportScannable() { + return false; + } +} diff --git a/src/main/java/com/sparrowwallet/sparrow/io/KeycardShellSinglesig.java b/src/main/java/com/sparrowwallet/sparrow/io/KeycardShellSinglesig.java new file mode 100644 index 00000000..dc65b597 --- /dev/null +++ b/src/main/java/com/sparrowwallet/sparrow/io/KeycardShellSinglesig.java @@ -0,0 +1,44 @@ +package com.sparrowwallet.sparrow.io; + +import com.sparrowwallet.drongo.Network; +import com.sparrowwallet.drongo.protocol.ScriptType; +import com.sparrowwallet.drongo.wallet.Keystore; +import com.sparrowwallet.drongo.wallet.WalletModel; + +import java.io.InputStream; + +public class KeycardShellSinglesig extends KeystoneSinglesig { + @Override + public String getName() { + return "Keycard Shell"; + } + + @Override + public String getKeystoreImportDescription(int account) { + return "Import QR created on your Keycard Shell by selecting Connect software wallet > Bitcoin" + (Network.getCanonical() == Network.TESTNET ? " Testnet" : ""); + } + + @Override + public WalletModel getWalletModel() { + return WalletModel.KEYCARD_SHELL; + } + + @Override + public Keystore getKeystore(ScriptType scriptType, InputStream inputStream, String password) throws ImportException { + Keystore keystore = super.getKeystore(scriptType, inputStream, password); + keystore.setLabel("Keycard Shell"); + keystore.setWalletModel(getWalletModel()); + + return keystore; + } + + @Override + public boolean isFileFormatAvailable() { + return false; + } + + @Override + public boolean isWalletImportFileFormatAvailable() { + return false; + } +} diff --git a/src/main/java/com/sparrowwallet/sparrow/keystoreimport/HwAirgappedController.java b/src/main/java/com/sparrowwallet/sparrow/keystoreimport/HwAirgappedController.java index 9a504de7..f18588d5 100644 --- a/src/main/java/com/sparrowwallet/sparrow/keystoreimport/HwAirgappedController.java +++ b/src/main/java/com/sparrowwallet/sparrow/keystoreimport/HwAirgappedController.java @@ -26,9 +26,9 @@ public class HwAirgappedController extends KeystoreImportDetailController { public void initializeView() { List fileImporters = Collections.emptyList(); if(getMasterController().getWallet().getPolicyType().equals(PolicyType.SINGLE)) { - fileImporters = List.of(new ColdcardSinglesig(), new CoboVaultSinglesig(), new Jade(), new KeystoneSinglesig(), new PassportSinglesig(), new SeedSigner(), new GordianSeedTool(), new SpecterDIY(), new Krux(), new AirGapVault()); + fileImporters = List.of(new ColdcardSinglesig(), new CoboVaultSinglesig(), new Jade(), new KeystoneSinglesig(), new PassportSinglesig(), new SeedSigner(), new GordianSeedTool(), new SpecterDIY(), new Krux(), new AirGapVault(), new KeycardShellSinglesig()); } else if(getMasterController().getWallet().getPolicyType().equals(PolicyType.MULTI)) { - fileImporters = List.of(new Bip129(), new ColdcardMultisig(), new CoboVaultMultisig(), new JadeMultisig(), new KeystoneMultisig(), new PassportMultisig(), new SeedSigner(), new GordianSeedTool(), new SpecterDIY(), new Krux()); + fileImporters = List.of(new Bip129(), new ColdcardMultisig(), new CoboVaultMultisig(), new JadeMultisig(), new KeystoneMultisig(), new PassportMultisig(), new SeedSigner(), new GordianSeedTool(), new SpecterDIY(), new Krux(), new KeycardShellMultisig()); } for(KeystoreFileImport importer : fileImporters) { diff --git a/src/main/resources/image/walletmodel/keycard-icon-invert.svg b/src/main/resources/image/walletmodel/keycard-icon-invert.svg new file mode 100644 index 00000000..59c61ab2 --- /dev/null +++ b/src/main/resources/image/walletmodel/keycard-icon-invert.svg @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/image/walletmodel/keycard-icon.svg b/src/main/resources/image/walletmodel/keycard-icon.svg new file mode 100644 index 00000000..1e45518c --- /dev/null +++ b/src/main/resources/image/walletmodel/keycard-icon.svg @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/image/walletmodel/keycard-invert.svg b/src/main/resources/image/walletmodel/keycard-invert.svg new file mode 100644 index 00000000..221f1f86 --- /dev/null +++ b/src/main/resources/image/walletmodel/keycard-invert.svg @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/image/walletmodel/keycard.svg b/src/main/resources/image/walletmodel/keycard.svg new file mode 100644 index 00000000..9ed9622c --- /dev/null +++ b/src/main/resources/image/walletmodel/keycard.svg @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file