diff --git a/src/main/java/com/sparrowwallet/sparrow/AppController.java b/src/main/java/com/sparrowwallet/sparrow/AppController.java index d7a2d3d8..a95a3f48 100644 --- a/src/main/java/com/sparrowwallet/sparrow/AppController.java +++ b/src/main/java/com/sparrowwallet/sparrow/AppController.java @@ -3051,6 +3051,8 @@ public class AppController implements Initializable { public void requestWalletOpen(RequestWalletOpenEvent event) { if(tabs.getScene().getWindow().equals(event.getWindow())) { if(event.getFile() != null) { + Optional optExisting = tabs.getTabs().stream().filter(tab -> tab.getUserData() instanceof WalletTabData walletTabData && walletTabData.getStorage().getWalletFile().equals(event.getFile())).findFirst(); + optExisting.ifPresent(tab -> tabs.getTabs().remove(tab)); openWalletFile(event.getFile(), true); } else { openWallet(true); diff --git a/src/main/java/com/sparrowwallet/sparrow/wallet/WalletForm.java b/src/main/java/com/sparrowwallet/sparrow/wallet/WalletForm.java index c3b5f6ac..ff4cc38f 100644 --- a/src/main/java/com/sparrowwallet/sparrow/wallet/WalletForm.java +++ b/src/main/java/com/sparrowwallet/sparrow/wallet/WalletForm.java @@ -20,6 +20,8 @@ import javafx.beans.property.BooleanProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleObjectProperty; +import javafx.scene.control.ButtonBar; +import javafx.scene.control.ButtonType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -164,6 +166,20 @@ public class WalletForm { }); historyService.setOnFailed(workerStateEvent -> { if(workerStateEvent.getSource().getException() instanceof AllHistoryChangedException) { + if(getWallet().isMasterWallet() && getWallet().getKeystores().stream().anyMatch(Keystore::needsPassphrase)) { + Optional optType = AppServices.showWarningDialog("Reopen " + getWallet().getMasterName() + "?", + "It appears that the history of this wallet has changed, which may be caused by an incorrect passphrase. " + + "Note that any typos when entering the passphrase will create an entirely different wallet, with a correspondingly different history.\n\n" + + "You can proceed with a full refresh of this wallet, or you can reopen it to enter the passphrase again.", + new ButtonType("Refresh Wallet", ButtonBar.ButtonData.CANCEL_CLOSE), + new ButtonType("Reopen Wallet", ButtonBar.ButtonData.OK_DONE)); + + if(optType.isPresent() && optType.get().getButtonData() == ButtonBar.ButtonData.OK_DONE) { + EventManager.get().post(new RequestWalletOpenEvent(AppServices.get().getWindowForWallet(getWalletId()), getStorage().getWalletFile())); + return; + } + } + try { storage.backupWallet(); } catch(IOException e) {