From de169b180a5e2d3b514bf4d506b762a01ad98f26 Mon Sep 17 00:00:00 2001 From: Craig Raw Date: Wed, 16 Sep 2026 13:18:47 +0200 Subject: [PATCH] refuse bitbox02 keystore import and discovery for legacy p2sh and p2pkh wallets it cannot sign for, and hide those script types from the device import menus --- lark | 2 +- .../sparrow/control/DevicePane.java | 19 +++++++++++++------ .../com/sparrowwallet/sparrow/io/Device.java | 9 +++++++++ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/lark b/lark index a34efcc6..b15a676e 160000 --- a/lark +++ b/lark @@ -1 +1 @@ -Subproject commit a34efcc647438fc438acced493001077e71fcb13 +Subproject commit b15a676e592f82914c1bc662481ea8d8f0c90cd0 diff --git a/src/main/java/com/sparrowwallet/sparrow/control/DevicePane.java b/src/main/java/com/sparrowwallet/sparrow/control/DevicePane.java index 4ad9117b..c9e8a9cb 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/DevicePane.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/DevicePane.java @@ -309,7 +309,9 @@ public class DevicePane extends TitledDescriptionPane { List types = new ArrayList<>(); for(PolicyType policyType : List.of(PolicyType.SINGLE_HD, PolicyType.SINGLE_SP)) { for(ScriptType scriptType : ScriptType.getAddressableScriptTypes(policyType)) { - types.add(new PolicyAndScriptType(policyType, scriptType)); + if(device.supportsScriptType(scriptType)) { + types.add(new PolicyAndScriptType(policyType, scriptType)); + } } } for(PolicyAndScriptType type : types) { @@ -323,7 +325,7 @@ public class DevicePane extends TitledDescriptionPane { importMenuButton.getItems().add(item); } } else { - List scriptTypes = ScriptType.getScriptTypesForPolicyType(wallet.getPolicyType()); + List scriptTypes = ScriptType.getScriptTypesForPolicyType(wallet.getPolicyType()).stream().filter(device::supportsScriptType).toList(); for(ScriptType scriptType : scriptTypes) { MenuItem item = new MenuItem(scriptType.getDescription()); final List derivation = scriptType.getDefaultDerivation(); @@ -753,6 +755,9 @@ public class DevicePane extends TitledDescriptionPane { setError("Import Error", e.getMessage()); importButton.setDisable(false); } + } else if(wallet.getScriptType() != null && !device.supportsScriptType(wallet.getScriptType())) { + setError("Unsupported script type", "The " + device.getModel().toDisplayString() + " cannot sign for " + wallet.getScriptType().getDescription() + " wallets."); + importButton.setDisable(false); } else if(device.getFingerprint() == null) { Hwi.EnumerateService enumerateService = new Hwi.EnumerateService(passphrase.get()); enumerateService.setOnSucceeded(workerStateEvent -> { @@ -997,10 +1002,7 @@ public class DevicePane extends TitledDescriptionPane { List discoveryAccounts = new ArrayList<>(Arrays.asList(StandardAccount.values()).subList(0, optRange.get() + 1)); Map derivationPaths = new LinkedHashMap<>(); - List scriptTypes = new ArrayList<>(ScriptType.getAddressableScriptTypes(PolicyType.SINGLE_HD)); - if(device.getModel() == WalletModel.BITBOX_02) { - scriptTypes.remove(ScriptType.P2PKH); - } + List scriptTypes = ScriptType.getAddressableScriptTypes(PolicyType.SINGLE_HD).stream().filter(device::supportsScriptType).toList(); for(ScriptType scriptType : scriptTypes) { for(StandardAccount discoveryAccount : discoveryAccounts) { derivationPaths.put(new Hwi.WalletType(scriptType, discoveryAccount), KeyDerivation.writePath(scriptType.getDefaultDerivation(discoveryAccount.getAccountNumber()))); @@ -1083,6 +1085,11 @@ public class DevicePane extends TitledDescriptionPane { return; } + if(!device.supportsScriptType(wallet.getScriptType())) { + setError("Unsupported script type", "The " + device.getModel().toDisplayString() + " cannot sign for " + wallet.getScriptType().getDescription() + " wallets."); + return; + } + discoverKeystoresButton.setDisable(true); discoverKeystoresButton.setMaxHeight(discoverKeystoresButton.getHeight()); ProgressIndicator progressIndicator = new ProgressIndicator(0); diff --git a/src/main/java/com/sparrowwallet/sparrow/io/Device.java b/src/main/java/com/sparrowwallet/sparrow/io/Device.java index 584167bd..bddaa1f1 100644 --- a/src/main/java/com/sparrowwallet/sparrow/io/Device.java +++ b/src/main/java/com/sparrowwallet/sparrow/io/Device.java @@ -1,8 +1,11 @@ package com.sparrowwallet.sparrow.io; +import com.sparrowwallet.drongo.protocol.ScriptType; import com.sparrowwallet.drongo.wallet.WalletModel; import com.sparrowwallet.lark.HardwareClient; +import java.util.Arrays; +import java.util.List; import java.util.Objects; public class Device { @@ -15,6 +18,7 @@ public class Device { private boolean card; private String[][] warnings; private String error; + private List supportedScriptTypes; public String getType() { return type; @@ -94,6 +98,10 @@ public class Device { return false; } + public boolean supportsScriptType(ScriptType scriptType) { + return supportedScriptTypes == null || supportedScriptTypes.contains(scriptType); + } + public String getError() { return error; } @@ -135,6 +143,7 @@ public class Device { device.card = hardwareClient.card(); device.warnings = hardwareClient.warnings(); device.error = hardwareClient.error(); + device.supportedScriptTypes = Arrays.stream(ScriptType.values()).filter(hardwareClient::supportsScriptType).toList(); return device; } }