diff --git a/drongo b/drongo index f7d5b4fb..419ed1a6 160000 --- a/drongo +++ b/drongo @@ -1 +1 @@ -Subproject commit f7d5b4fb8fb0cbc2192a0f76fb4a1ef79a35d811 +Subproject commit 419ed1a6993de6e400de9ddc6e942f8d97b1522b diff --git a/lark b/lark index c4c7ca8d..fd7d0b7f 160000 --- a/lark +++ b/lark @@ -1 +1 @@ -Subproject commit c4c7ca8da3a26e97c181a456eff5401b1bb7c1cc +Subproject commit fd7d0b7fa58c0667e2eab2f7833591dadb19c684 diff --git a/src/main/java/com/sparrowwallet/sparrow/keystoreimport/KeystoreImportDialog.java b/src/main/java/com/sparrowwallet/sparrow/keystoreimport/KeystoreImportDialog.java index cbc49191..c02c415b 100644 --- a/src/main/java/com/sparrowwallet/sparrow/keystoreimport/KeystoreImportDialog.java +++ b/src/main/java/com/sparrowwallet/sparrow/keystoreimport/KeystoreImportDialog.java @@ -3,6 +3,7 @@ package com.sparrowwallet.sparrow.keystoreimport; import com.google.common.eventbus.Subscribe; import com.sparrowwallet.drongo.KeyDerivation; import com.sparrowwallet.drongo.Network; +import com.sparrowwallet.drongo.protocol.ScriptType; import com.sparrowwallet.drongo.wallet.Keystore; import com.sparrowwallet.drongo.wallet.KeystoreSource; import com.sparrowwallet.drongo.wallet.Wallet; @@ -10,6 +11,7 @@ import com.sparrowwallet.drongo.wallet.WalletModel; import com.sparrowwallet.sparrow.AppServices; import com.sparrowwallet.sparrow.EventManager; import com.sparrowwallet.sparrow.event.KeystoreImportEvent; +import com.sparrowwallet.sparrow.wallet.KeystoreController; import javafx.fxml.FXMLLoader; import javafx.scene.control.*; import org.controlsfx.tools.Borders; @@ -20,16 +22,18 @@ import java.util.List; public class KeystoreImportDialog extends Dialog { private final KeystoreImportController keystoreImportController; private Keystore keystore; + private final ScriptType scriptType; + private final String existingLabel; public KeystoreImportDialog(Wallet wallet) { this(wallet, KeystoreSource.HW_USB); } public KeystoreImportDialog(Wallet wallet, KeystoreSource initialSource) { - this(wallet, initialSource, null, null, false); + this(wallet, initialSource, null, null, Keystore.DEFAULT_LABEL, false); } - public KeystoreImportDialog(Wallet wallet, KeystoreSource initialSource, KeyDerivation currentDerivation, WalletModel currentModel, boolean restrictImport) { + public KeystoreImportDialog(Wallet wallet, KeystoreSource initialSource, KeyDerivation currentDerivation, WalletModel currentModel, String currentLabel, boolean restrictImport) { EventManager.get().register(this); setOnCloseRequest(event -> { EventManager.get().unregister(this); @@ -37,6 +41,8 @@ public class KeystoreImportDialog extends Dialog { final DialogPane dialogPane = getDialogPane(); AppServices.setStageIcon(dialogPane.getScene().getWindow()); + scriptType = wallet.getScriptType(); + existingLabel = currentLabel; try { FXMLLoader ksiLoader = new FXMLLoader(AppServices.class.getResource("keystoreimport/keystoreimport.fxml")); @@ -73,9 +79,10 @@ public class KeystoreImportDialog extends Dialog { private Keystore getWatchOnlyKeystore() { this.keystore = new Keystore(); + keystore.setLabel(existingLabel); keystore.setSource(KeystoreSource.SW_WATCH); keystore.setWalletModel(WalletModel.SPARROW); - keystore.setKeyDerivation(new KeyDerivation("","")); + keystore.setKeyDerivation(new KeyDerivation(KeystoreController.DEFAULT_WATCH_ONLY_FINGERPRINT, scriptType.getDefaultDerivationPath())); return keystore; } diff --git a/src/main/java/com/sparrowwallet/sparrow/wallet/KeystoreController.java b/src/main/java/com/sparrowwallet/sparrow/wallet/KeystoreController.java index 66df43a9..c2ac5b5c 100644 --- a/src/main/java/com/sparrowwallet/sparrow/wallet/KeystoreController.java +++ b/src/main/java/com/sparrowwallet/sparrow/wallet/KeystoreController.java @@ -36,10 +36,7 @@ import tornadofx.control.Field; import javax.smartcardio.CardException; import java.net.URL; -import java.util.Base64; -import java.util.Locale; -import java.util.Optional; -import java.util.ResourceBundle; +import java.util.*; import java.util.stream.Collectors; import static com.sparrowwallet.sparrow.io.CardApi.isReaderAvailable; @@ -371,7 +368,8 @@ public class KeystoreController extends WalletFormController implements Initiali boolean restrictImport = keystore.getSource() != KeystoreSource.SW_WATCH && keystoreSourceToggleGroup.getToggles().stream().anyMatch(toggle -> ((ToggleButton)toggle).isDisabled()); KeyDerivation currentDerivation = keystore.getKeyDerivation(); WalletModel currentModel = keystore.getWalletModel(); - KeystoreImportDialog dlg = new KeystoreImportDialog(getWalletForm().getWallet(), initialSource, currentDerivation, currentModel, restrictImport); + String currentLabel = keystore.getLabel(); + KeystoreImportDialog dlg = new KeystoreImportDialog(getWalletForm().getWallet(), initialSource, currentDerivation, currentModel, currentLabel, restrictImport); dlg.initOwner(selectSourcePane.getScene().getWindow()); Optional result = dlg.showAndWait(); if(result.isPresent()) { @@ -386,7 +384,12 @@ public class KeystoreController extends WalletFormController implements Initiali return; } } - walletForm.getWallet().makeLabelsUnique(importedKeystore); + if(!keystore.getLabel().equals(importedKeystore.getLabel())) { + List changedKeystores = walletForm.getWallet().makeLabelsUnique(importedKeystore); + if(!changedKeystores.isEmpty()) { + EventManager.get().post(new SettingsChangedEvent(walletForm.getWallet(), SettingsChangedEvent.Type.KEYSTORE_LABEL)); + } + } keystore.setSource(importedKeystore.getSource()); keystore.setWalletModel(importedKeystore.getWalletModel()); keystore.setLabel(importedKeystore.getLabel()); @@ -396,7 +399,7 @@ public class KeystoreController extends WalletFormController implements Initiali keystore.setSeed(importedKeystore.getSeed()); keystore.setBip47ExtendedPrivateKey(importedKeystore.getBip47ExtendedPrivateKey()); - updateType(true); + updateType(keystore.isValid()); label.setText(keystore.getLabel()); fingerprint.setText(keystore.getKeyDerivation().getMasterFingerprint()); derivation.setText(keystore.getKeyDerivation().getDerivationPath()); @@ -653,18 +656,31 @@ public class KeystoreController extends WalletFormController implements Initiali @Subscribe public void update(SettingsChangedEvent event) { - if(walletForm.getWallet().equals(event.getWallet()) && event.getType().equals(SettingsChangedEvent.Type.SCRIPT_TYPE)) { - if(keystore.getSource() == KeystoreSource.SW_WATCH && derivation.getPromptText().equals(derivation.getText())) { - derivation.setText(event.getWallet().getScriptType().getDefaultDerivationPath()); + if(walletForm.getWallet().equals(event.getWallet())) { + if(event.getType().equals(SettingsChangedEvent.Type.SCRIPT_TYPE)) { + if(keystore.getSource() == KeystoreSource.SW_WATCH && derivation.getPromptText().equals(derivation.getText())) { + derivation.setText(event.getWallet().getScriptType().getDefaultDerivationPath()); + } + derivation.setPromptText(event.getWallet().getScriptType().getDefaultDerivationPath()); + if(derivation.getText() != null && !derivation.getText().isEmpty()) { + String derivationPath = derivation.getText(); + derivation.setText(derivationPath + " "); + derivation.setText(derivationPath); + } + if(keystore.getExtendedPublicKey() != null) { + setXpubContext(keystore.getExtendedPublicKey()); + } + } else if(event.getType().equals(SettingsChangedEvent.Type.KEYSTORE_LABEL)) { + if(!keystore.getLabel().equals(label.getText())) { + label.setText(keystore.getLabel()); + } } - derivation.setPromptText(event.getWallet().getScriptType().getDefaultDerivationPath()); - if(derivation.getText() != null && !derivation.getText().isEmpty()) { - String derivationPath = derivation.getText(); - derivation.setText(derivationPath + " "); - derivation.setText(derivationPath); - } - if(keystore.getExtendedPublicKey() != null) { - setXpubContext(keystore.getExtendedPublicKey()); + + if(event.getType().equals(SettingsChangedEvent.Type.KEYSTORE_LABEL) || event.getType().equals(SettingsChangedEvent.Type.KEYSTORE_FINGERPRINT) || + event.getType().equals(SettingsChangedEvent.Type.KEYSTORE_DERIVATION) || event.getType().equals(SettingsChangedEvent.Type.KEYSTORE_XPUB)) { + if(keystore.getSource() == KeystoreSource.SW_WATCH) { + exportButton.setVisible(keystore.isValid() && getWalletForm().getWallet().getPolicyType() == PolicyType.MULTI); + } } } }