mirror of
https://github.com/sparrowwallet/sparrow.git
synced 2024-12-25 05:06:45 +00:00
fix naming when using a subtab wallet, import and export wallets with child wallets with db persistence on sparrow exporter
This commit is contained in:
parent
02d3817cb1
commit
55e69bf263
22 changed files with 104 additions and 39 deletions
2
drongo
2
drongo
|
@ -1 +1 @@
|
||||||
Subproject commit 46e4413cf6ed052d3377550760c9ffcf64a0c68d
|
Subproject commit debafd42e8dd017779e193f609717a3eb72cd39a
|
|
@ -847,7 +847,7 @@ public class AppController implements Initializable {
|
||||||
for(Keystore copyKeystore : copy.getKeystores()) {
|
for(Keystore copyKeystore : copy.getKeystores()) {
|
||||||
if(copyKeystore.hasSeed()) {
|
if(copyKeystore.hasSeed()) {
|
||||||
if(copyKeystore.getSeed().needsPassphrase()) {
|
if(copyKeystore.getSeed().needsPassphrase()) {
|
||||||
KeystorePassphraseDialog passphraseDialog = new KeystorePassphraseDialog(wallet.getName(), copyKeystore);
|
KeystorePassphraseDialog passphraseDialog = new KeystorePassphraseDialog(wallet.getFullName(), copyKeystore);
|
||||||
Optional<String> optionalPassphrase = passphraseDialog.showAndWait();
|
Optional<String> optionalPassphrase = passphraseDialog.showAndWait();
|
||||||
if(optionalPassphrase.isPresent()) {
|
if(optionalPassphrase.isPresent()) {
|
||||||
copyKeystore.getSeed().setPassphrase(optionalPassphrase.get());
|
copyKeystore.getSeed().setPassphrase(optionalPassphrase.get());
|
||||||
|
@ -985,6 +985,14 @@ public class AppController implements Initializable {
|
||||||
checkWalletNetwork(wallet);
|
checkWalletNetwork(wallet);
|
||||||
restorePublicKeysFromSeed(wallet, null);
|
restorePublicKeysFromSeed(wallet, null);
|
||||||
addWalletTabOrWindow(storage, wallet, null, false);
|
addWalletTabOrWindow(storage, wallet, null, false);
|
||||||
|
|
||||||
|
for(Wallet childWallet : wallet.getChildWallets()) {
|
||||||
|
storage.saveWallet(childWallet);
|
||||||
|
checkWalletNetwork(childWallet);
|
||||||
|
restorePublicKeysFromSeed(childWallet, null);
|
||||||
|
addWalletTabOrWindow(storage, childWallet, null, false);
|
||||||
|
}
|
||||||
|
Platform.runLater(() -> selectTab(wallet));
|
||||||
} catch(IOException | StorageException | MnemonicException e) {
|
} catch(IOException | StorageException | MnemonicException e) {
|
||||||
log.error("Error saving imported wallet", e);
|
log.error("Error saving imported wallet", e);
|
||||||
}
|
}
|
||||||
|
@ -1004,6 +1012,15 @@ public class AppController implements Initializable {
|
||||||
checkWalletNetwork(wallet);
|
checkWalletNetwork(wallet);
|
||||||
restorePublicKeysFromSeed(wallet, key);
|
restorePublicKeysFromSeed(wallet, key);
|
||||||
addWalletTabOrWindow(storage, wallet, null, false);
|
addWalletTabOrWindow(storage, wallet, null, false);
|
||||||
|
|
||||||
|
for(Wallet childWallet : wallet.getChildWallets()) {
|
||||||
|
childWallet.encrypt(key);
|
||||||
|
storage.saveWallet(childWallet);
|
||||||
|
checkWalletNetwork(childWallet);
|
||||||
|
restorePublicKeysFromSeed(childWallet, key);
|
||||||
|
addWalletTabOrWindow(storage, childWallet, null, false);
|
||||||
|
}
|
||||||
|
Platform.runLater(() -> selectTab(wallet));
|
||||||
} catch(IOException | StorageException | MnemonicException e) {
|
} catch(IOException | StorageException | MnemonicException e) {
|
||||||
log.error("Error saving imported wallet", e);
|
log.error("Error saving imported wallet", e);
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -1140,16 +1157,21 @@ public class AppController implements Initializable {
|
||||||
subTabs.getStyleClass().add("master-only");
|
subTabs.getStyleClass().add("master-only");
|
||||||
tab.setContent(subTabs);
|
tab.setContent(subTabs);
|
||||||
|
|
||||||
|
WalletForm walletForm = addWalletSubTab(subTabs, storage, wallet, backupWallet);
|
||||||
|
TabData tabData = new WalletTabData(TabData.TabType.WALLET, walletForm);
|
||||||
|
tab.setUserData(tabData);
|
||||||
|
|
||||||
subTabs.getSelectionModel().selectedItemProperty().addListener((observable, old_val, selectedTab) -> {
|
subTabs.getSelectionModel().selectedItemProperty().addListener((observable, old_val, selectedTab) -> {
|
||||||
if(selectedTab != null) {
|
if(selectedTab != null) {
|
||||||
EventManager.get().post(new WalletTabSelectedEvent(tab));
|
EventManager.get().post(new WalletTabSelectedEvent(tab));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
WalletForm walletForm = addWalletSubTab(subTabs, storage, wallet, backupWallet);
|
subTabs.getTabs().addListener((ListChangeListener<Tab>) c -> {
|
||||||
|
if(c.next() && (c.wasAdded() || c.wasRemoved())) {
|
||||||
TabData tabData = new WalletTabData(TabData.TabType.WALLET, walletForm);
|
EventManager.get().post(new OpenWalletsEvent(tabs.getScene().getWindow(), getOpenWalletTabData()));
|
||||||
tab.setUserData(tabData);
|
}
|
||||||
|
});
|
||||||
|
|
||||||
tabs.getTabs().add(tab);
|
tabs.getTabs().add(tab);
|
||||||
tabs.getSelectionModel().select(tab);
|
tabs.getSelectionModel().select(tab);
|
||||||
|
@ -1608,7 +1630,7 @@ public class AppController implements Initializable {
|
||||||
|
|
||||||
Image image = new Image("image/sparrow-small.png", 50, 50, false, false);
|
Image image = new Image("image/sparrow-small.png", 50, 50, false, false);
|
||||||
Notifications notificationBuilder = Notifications.create()
|
Notifications notificationBuilder = Notifications.create()
|
||||||
.title("Sparrow - " + event.getWallet().getName())
|
.title("Sparrow - " + event.getWallet().getFullName())
|
||||||
.text(text)
|
.text(text)
|
||||||
.graphic(new ImageView(image))
|
.graphic(new ImageView(image))
|
||||||
.hideAfter(Duration.seconds(15))
|
.hideAfter(Duration.seconds(15))
|
||||||
|
|
|
@ -80,9 +80,11 @@ public class FileWalletExportPane extends TitledDescriptionPane {
|
||||||
FileChooser fileChooser = new FileChooser();
|
FileChooser fileChooser = new FileChooser();
|
||||||
fileChooser.setTitle("Export " + exporter.getWalletModel().toDisplayString() + " File");
|
fileChooser.setTitle("Export " + exporter.getWalletModel().toDisplayString() + " File");
|
||||||
String extension = exporter.getExportFileExtension(wallet);
|
String extension = exporter.getExportFileExtension(wallet);
|
||||||
fileChooser.setInitialFileName(wallet.getName() +
|
String fileName = wallet.getFullName() + "-" + exporter.getWalletModel().toDisplayString().toLowerCase().replace(" ", "");
|
||||||
(exporter instanceof Sparrow ? "" : "-" + exporter.getWalletModel().toDisplayString().toLowerCase().replace(" ", "")) +
|
if(exporter instanceof Sparrow) {
|
||||||
(extension == null || extension.isEmpty() ? "" : "." + extension));
|
fileName = wallet.getMasterName();
|
||||||
|
}
|
||||||
|
fileChooser.setInitialFileName(fileName + (extension == null || extension.isEmpty() ? "" : "." + extension));
|
||||||
|
|
||||||
AppServices.moveToActiveWindowScreen(window, 800, 450);
|
AppServices.moveToActiveWindowScreen(window, 800, 450);
|
||||||
File file = fileChooser.showSaveDialog(window);
|
File file = fileChooser.showSaveDialog(window);
|
||||||
|
@ -94,7 +96,7 @@ public class FileWalletExportPane extends TitledDescriptionPane {
|
||||||
private void exportWallet(File file) {
|
private void exportWallet(File file) {
|
||||||
if(wallet.isEncrypted() && exporter.walletExportRequiresDecryption()) {
|
if(wallet.isEncrypted() && exporter.walletExportRequiresDecryption()) {
|
||||||
Wallet copy = wallet.copy();
|
Wallet copy = wallet.copy();
|
||||||
WalletPasswordDialog dlg = new WalletPasswordDialog(wallet.getName(), WalletPasswordDialog.PasswordRequirement.LOAD);
|
WalletPasswordDialog dlg = new WalletPasswordDialog(wallet.getMasterName(), WalletPasswordDialog.PasswordRequirement.LOAD);
|
||||||
Optional<SecureString> password = dlg.showAndWait();
|
Optional<SecureString> password = dlg.showAndWait();
|
||||||
if(password.isPresent()) {
|
if(password.isPresent()) {
|
||||||
final String walletId = AppServices.get().getOpenWallets().get(wallet).getWalletId(wallet);
|
final String walletId = AppServices.get().getOpenWallets().get(wallet).getWalletId(wallet);
|
||||||
|
|
|
@ -399,7 +399,7 @@ public class MessageSignDialog extends Dialog<ButtonBar.ButtonData> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
WalletPasswordDialog dlg = new WalletPasswordDialog(wallet.getName(), WalletPasswordDialog.PasswordRequirement.LOAD);
|
WalletPasswordDialog dlg = new WalletPasswordDialog(wallet.getMasterName(), WalletPasswordDialog.PasswordRequirement.LOAD);
|
||||||
Optional<SecureString> password = dlg.showAndWait();
|
Optional<SecureString> password = dlg.showAndWait();
|
||||||
if(password.isPresent()) {
|
if(password.isPresent()) {
|
||||||
Storage.DecryptWalletService decryptWalletService = new Storage.DecryptWalletService(wallet.copy(), password.get());
|
Storage.DecryptWalletService decryptWalletService = new Storage.DecryptWalletService(wallet.copy(), password.get());
|
||||||
|
|
|
@ -100,7 +100,7 @@ public class CaravanMultisig implements WalletImport, WalletExport {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
CaravanFile cf = new CaravanFile();
|
CaravanFile cf = new CaravanFile();
|
||||||
cf.name = wallet.getName();
|
cf.name = wallet.getFullName();
|
||||||
cf.addressType = wallet.getScriptType().toString().replace('-', '_');
|
cf.addressType = wallet.getScriptType().toString().replace('-', '_');
|
||||||
cf.network = Network.get().getName();
|
cf.network = Network.get().getName();
|
||||||
cf.client = new Client();
|
cf.client = new Client();
|
||||||
|
|
|
@ -183,7 +183,7 @@ public class ColdcardMultisig implements WalletImport, KeystoreFileImport, Walle
|
||||||
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8));
|
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8));
|
||||||
writer.append("# " + getName() + " setup file (created by Sparrow)\n");
|
writer.append("# " + getName() + " setup file (created by Sparrow)\n");
|
||||||
writer.append("#\n");
|
writer.append("#\n");
|
||||||
writer.append("Name: ").append(wallet.getName()).append("\n");
|
writer.append("Name: ").append(wallet.getFullName()).append("\n");
|
||||||
writer.append("Policy: ").append(Integer.toString(wallet.getDefaultPolicy().getNumSignaturesRequired())).append(" of ").append(Integer.toString(wallet.getKeystores().size())).append("\n");
|
writer.append("Policy: ").append(Integer.toString(wallet.getDefaultPolicy().getNumSignaturesRequired())).append(" of ").append(Integer.toString(wallet.getKeystores().size())).append("\n");
|
||||||
if(!multipleDerivations) {
|
if(!multipleDerivations) {
|
||||||
writer.append("Derivation: ").append(wallet.getKeystores().get(0).getKeyDerivation().getDerivationPath()).append("\n");
|
writer.append("Derivation: ").append(wallet.getKeystores().get(0).getKeyDerivation().getDerivationPath()).append("\n");
|
||||||
|
|
|
@ -12,6 +12,7 @@ import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.nio.file.StandardCopyOption;
|
import java.nio.file.StandardCopyOption;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class Sparrow implements WalletImport, WalletExport {
|
public class Sparrow implements WalletImport, WalletExport {
|
||||||
private static final Logger log = LoggerFactory.getLogger(Sparrow.class);
|
private static final Logger log = LoggerFactory.getLogger(Sparrow.class);
|
||||||
|
@ -29,12 +30,20 @@ public class Sparrow implements WalletImport, WalletExport {
|
||||||
@Override
|
@Override
|
||||||
public void exportWallet(Wallet wallet, OutputStream outputStream) throws ExportException {
|
public void exportWallet(Wallet wallet, OutputStream outputStream) throws ExportException {
|
||||||
try {
|
try {
|
||||||
Storage storage = AppServices.get().getOpenWallets().get(wallet);
|
Wallet exportedWallet = !wallet.isMasterWallet() ? wallet.getMasterWallet() : wallet;
|
||||||
File tempFile = File.createTempFile(wallet.getName(), null);
|
PersistenceType persistenceType = exportedWallet.getChildWallets().isEmpty() ? PersistenceType.JSON : PersistenceType.DB;
|
||||||
Storage tempStorage = new Storage(PersistenceType.JSON, tempFile);
|
Persistence persistence = persistenceType.getInstance();
|
||||||
|
Storage storage = AppServices.get().getOpenWallets().get(exportedWallet);
|
||||||
|
File tempFile = File.createTempFile(exportedWallet.getName(), "." + persistenceType.getExtension());
|
||||||
|
tempFile.delete();
|
||||||
|
Storage tempStorage = new Storage(persistence, tempFile);
|
||||||
tempStorage.setKeyDeriver(storage.getKeyDeriver());
|
tempStorage.setKeyDeriver(storage.getKeyDeriver());
|
||||||
tempStorage.setEncryptionPubKey(storage.getEncryptionPubKey());
|
tempStorage.setEncryptionPubKey(storage.getEncryptionPubKey());
|
||||||
tempStorage.saveWallet(wallet);
|
tempStorage.saveWallet(exportedWallet);
|
||||||
|
for(Wallet childWallet : exportedWallet.getChildWallets()) {
|
||||||
|
tempStorage.saveWallet(childWallet);
|
||||||
|
}
|
||||||
|
persistence.close();
|
||||||
Files.copy(tempStorage.getWalletFile(), outputStream);
|
Files.copy(tempStorage.getWalletFile(), outputStream);
|
||||||
outputStream.flush();
|
outputStream.flush();
|
||||||
tempStorage.getWalletFile().delete();
|
tempStorage.getWalletFile().delete();
|
||||||
|
@ -53,7 +62,8 @@ public class Sparrow implements WalletImport, WalletExport {
|
||||||
public String getExportFileExtension(Wallet wallet) {
|
public String getExportFileExtension(Wallet wallet) {
|
||||||
try {
|
try {
|
||||||
Storage storage = AppServices.get().getOpenWallets().get(wallet);
|
Storage storage = AppServices.get().getOpenWallets().get(wallet);
|
||||||
return storage.isEncrypted() ? "" : PersistenceType.JSON.getExtension();
|
Wallet exportedWallet = !wallet.isMasterWallet() ? wallet.getMasterWallet() : wallet;
|
||||||
|
return !exportedWallet.getChildWallets().isEmpty() ? PersistenceType.DB.getExtension() : (storage.isEncrypted() ? "" : PersistenceType.JSON.getExtension());
|
||||||
} catch(IOException e) {
|
} catch(IOException e) {
|
||||||
//ignore
|
//ignore
|
||||||
}
|
}
|
||||||
|
@ -89,13 +99,21 @@ public class Sparrow implements WalletImport, WalletExport {
|
||||||
try {
|
try {
|
||||||
tempFile = File.createTempFile("sparrow", null);
|
tempFile = File.createTempFile("sparrow", null);
|
||||||
java.nio.file.Files.copy(inputStream, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
java.nio.file.Files.copy(inputStream, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||||
storage = new Storage(PersistenceType.JSON, tempFile);
|
PersistenceType persistenceType = Storage.detectPersistenceType(tempFile);
|
||||||
|
persistenceType = (persistenceType == null ? PersistenceType.JSON : persistenceType);
|
||||||
|
File tempTypedFile = new File(tempFile.getParentFile(), tempFile.getName() + "." + persistenceType.getExtension());
|
||||||
|
tempFile.renameTo(tempTypedFile);
|
||||||
|
tempFile = tempTypedFile;
|
||||||
|
storage = new Storage(persistenceType, tempFile);
|
||||||
if(!isEncrypted(tempFile)) {
|
if(!isEncrypted(tempFile)) {
|
||||||
wallet = storage.loadUnencryptedWallet().getWallet();
|
wallet = storage.loadUnencryptedWallet().getWallet();
|
||||||
} else {
|
} else {
|
||||||
WalletBackupAndKey walletBackupAndKey = storage.loadEncryptedWallet(password);
|
WalletBackupAndKey walletBackupAndKey = storage.loadEncryptedWallet(password);
|
||||||
wallet = walletBackupAndKey.getWallet();
|
wallet = walletBackupAndKey.getWallet();
|
||||||
wallet.decrypt(walletBackupAndKey.getKey());
|
wallet.decrypt(walletBackupAndKey.getKey());
|
||||||
|
for(Map.Entry<Storage, WalletBackupAndKey> entry : walletBackupAndKey.getChildWallets().entrySet()) {
|
||||||
|
entry.getValue().getWallet().decrypt(entry.getValue().getKey());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return wallet;
|
return wallet;
|
||||||
|
|
|
@ -69,7 +69,7 @@ public class SpecterDIY implements KeystoreFileImport, WalletExport {
|
||||||
public void exportWallet(Wallet wallet, OutputStream outputStream) throws ExportException {
|
public void exportWallet(Wallet wallet, OutputStream outputStream) throws ExportException {
|
||||||
try {
|
try {
|
||||||
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8));
|
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8));
|
||||||
writer.append("addwallet ").append(wallet.getName()).append("&").append(OutputDescriptor.getOutputDescriptor(wallet).toString().replace('\'', 'h')).append("\n");
|
writer.append("addwallet ").append(wallet.getFullName()).append("&").append(OutputDescriptor.getOutputDescriptor(wallet).toString().replace('\'', 'h')).append("\n");
|
||||||
writer.flush();
|
writer.flush();
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
log.error("Error exporting " + getName() + " wallet", e);
|
log.error("Error exporting " + getName() + " wallet", e);
|
||||||
|
|
|
@ -21,7 +21,7 @@ public class SpecterDesktop implements WalletImport, WalletExport {
|
||||||
public void exportWallet(Wallet wallet, OutputStream outputStream) throws ExportException {
|
public void exportWallet(Wallet wallet, OutputStream outputStream) throws ExportException {
|
||||||
try {
|
try {
|
||||||
SpecterWallet specterWallet = new SpecterWallet();
|
SpecterWallet specterWallet = new SpecterWallet();
|
||||||
specterWallet.label = wallet.getName();
|
specterWallet.label = wallet.getFullName();
|
||||||
specterWallet.blockheight = wallet.getTransactions().values().stream().mapToInt(BlockTransactionHash::getHeight).min().orElse(wallet.getStoredBlockHeight());
|
specterWallet.blockheight = wallet.getTransactions().values().stream().mapToInt(BlockTransactionHash::getHeight).min().orElse(wallet.getStoredBlockHeight());
|
||||||
specterWallet.descriptor = OutputDescriptor.getOutputDescriptor(wallet).toString(true);
|
specterWallet.descriptor = OutputDescriptor.getOutputDescriptor(wallet).toString(true);
|
||||||
|
|
||||||
|
|
|
@ -338,6 +338,11 @@ public class Storage {
|
||||||
return type.getInstance().isEncrypted(walletFile);
|
return type.getInstance().isEncrypted(walletFile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PersistenceType detectedType = detectPersistenceType(walletFile);
|
||||||
|
if(detectedType != null) {
|
||||||
|
return detectedType.getInstance().isEncrypted(walletFile);
|
||||||
|
}
|
||||||
} catch(IOException e) {
|
} catch(IOException e) {
|
||||||
//ignore
|
//ignore
|
||||||
}
|
}
|
||||||
|
@ -345,6 +350,24 @@ public class Storage {
|
||||||
return FileType.BINARY.equals(IOUtils.getFileType(walletFile));
|
return FileType.BINARY.equals(IOUtils.getFileType(walletFile));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static PersistenceType detectPersistenceType(File walletFile) {
|
||||||
|
try(Reader reader = new FileReader(walletFile)) {
|
||||||
|
int firstChar = reader.read();
|
||||||
|
|
||||||
|
if(firstChar == 'U' || firstChar == '{') {
|
||||||
|
return PersistenceType.JSON;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(firstChar == 'H') {
|
||||||
|
return PersistenceType.DB;
|
||||||
|
}
|
||||||
|
} catch(IOException e) {
|
||||||
|
log.error("Error detecting persistence type", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public static File getWalletsBackupDir() {
|
public static File getWalletsBackupDir() {
|
||||||
File walletsBackupDir = new File(getWalletsDir(), WALLETS_BACKUP_DIR);
|
File walletsBackupDir = new File(getWalletsDir(), WALLETS_BACKUP_DIR);
|
||||||
if(!walletsBackupDir.exists()) {
|
if(!walletsBackupDir.exists()) {
|
||||||
|
|
|
@ -180,7 +180,7 @@ public class DbPersistence implements Persistence {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
log.debug("Updating " + wallet.getName() + " on " + Thread.currentThread().getName());
|
log.debug("Updating " + wallet.getFullName() + " on " + Thread.currentThread().getName());
|
||||||
log.debug(dirtyPersistables.toString());
|
log.debug(dirtyPersistables.toString());
|
||||||
|
|
||||||
Jdbi jdbi = getJdbi(storage, password);
|
Jdbi jdbi = getJdbi(storage, password);
|
||||||
|
|
|
@ -253,7 +253,7 @@ public class ElectrumServer {
|
||||||
|
|
||||||
if(!newReferences.isEmpty()) {
|
if(!newReferences.isEmpty()) {
|
||||||
//Look for additional nodes to fetch history for by considering the inputs and outputs of new transactions found
|
//Look for additional nodes to fetch history for by considering the inputs and outputs of new transactions found
|
||||||
log.debug(wallet.getName() + " found new transactions: " + newReferences);
|
log.debug(wallet.getFullName() + " found new transactions: " + newReferences);
|
||||||
Set<WalletNode> additionalNodes = new HashSet<>();
|
Set<WalletNode> additionalNodes = new HashSet<>();
|
||||||
Map<String, WalletNode> walletScriptHashes = getAllScriptHashes(wallet);
|
Map<String, WalletNode> walletScriptHashes = getAllScriptHashes(wallet);
|
||||||
for(BlockTransactionHash reference : newReferences) {
|
for(BlockTransactionHash reference : newReferences) {
|
||||||
|
@ -394,7 +394,7 @@ public class ElectrumServer {
|
||||||
Map<String, String> pathScriptHashes = new LinkedHashMap<>();
|
Map<String, String> pathScriptHashes = new LinkedHashMap<>();
|
||||||
for(WalletNode node : nodes) {
|
for(WalletNode node : nodes) {
|
||||||
if(node == null) {
|
if(node == null) {
|
||||||
log.error("Null node for wallet " + wallet.getName() + " subscribing nodes " + nodes + " startIndex " + startIndex, new Throwable());
|
log.error("Null node for wallet " + wallet.getFullName() + " subscribing nodes " + nodes + " startIndex " + startIndex, new Throwable());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(node != null && node.getIndex() >= startIndex) {
|
if(node != null && node.getIndex() >= startIndex) {
|
||||||
|
|
|
@ -708,7 +708,7 @@ public class HeadersController extends TransactionFormController implements Init
|
||||||
String walletId = headersForm.getAvailableWallets().get(headersForm.getSigningWallet()).getWalletId(headersForm.getSigningWallet());
|
String walletId = headersForm.getAvailableWallets().get(headersForm.getSigningWallet()).getWalletId(headersForm.getSigningWallet());
|
||||||
|
|
||||||
if(copy.isEncrypted()) {
|
if(copy.isEncrypted()) {
|
||||||
WalletPasswordDialog dlg = new WalletPasswordDialog(copy.getName(), WalletPasswordDialog.PasswordRequirement.LOAD);
|
WalletPasswordDialog dlg = new WalletPasswordDialog(copy.getMasterName(), WalletPasswordDialog.PasswordRequirement.LOAD);
|
||||||
Optional<SecureString> password = dlg.showAndWait();
|
Optional<SecureString> password = dlg.showAndWait();
|
||||||
if(password.isPresent()) {
|
if(password.isPresent()) {
|
||||||
Storage.DecryptWalletService decryptWalletService = new Storage.DecryptWalletService(copy, password.get());
|
Storage.DecryptWalletService decryptWalletService = new Storage.DecryptWalletService(copy, password.get());
|
||||||
|
|
|
@ -146,7 +146,7 @@ public class InputController extends TransactionFormController implements Initia
|
||||||
String baseText = getLegendText(txInput);
|
String baseText = getLegendText(txInput);
|
||||||
if(signingWallet != null) {
|
if(signingWallet != null) {
|
||||||
if(inputForm.isWalletTxo()) {
|
if(inputForm.isWalletTxo()) {
|
||||||
inputFieldset.setText(baseText + " - " + signingWallet.getName());
|
inputFieldset.setText(baseText + " - " + signingWallet.getFullName());
|
||||||
inputFieldset.setIcon(TransactionDiagram.getTxoGlyph());
|
inputFieldset.setIcon(TransactionDiagram.getTxoGlyph());
|
||||||
} else {
|
} else {
|
||||||
inputFieldset.setText(baseText + " - Payjoin");
|
inputFieldset.setText(baseText + " - Payjoin");
|
||||||
|
|
|
@ -113,7 +113,7 @@ public class AddressesController extends WalletFormController implements Initial
|
||||||
|
|
||||||
FileChooser fileChooser = new FileChooser();
|
FileChooser fileChooser = new FileChooser();
|
||||||
fileChooser.setTitle("Export Addresses to CSV");
|
fileChooser.setTitle("Export Addresses to CSV");
|
||||||
fileChooser.setInitialFileName(getWalletForm().getWallet().getName() + "-" + keyPurpose.name().toLowerCase() + "-addresses.csv");
|
fileChooser.setInitialFileName(getWalletForm().getWallet().getFullName() + "-" + keyPurpose.name().toLowerCase() + "-addresses.csv");
|
||||||
|
|
||||||
Wallet copy = getWalletForm().getWallet().copy();
|
Wallet copy = getWalletForm().getWallet().copy();
|
||||||
WalletNode purposeNode = copy.getNode(keyPurpose);
|
WalletNode purposeNode = copy.getNode(keyPurpose);
|
||||||
|
|
|
@ -341,7 +341,7 @@ public class KeystoreController extends WalletFormController implements Initiali
|
||||||
Wallet copy = getWalletForm().getWallet().copy();
|
Wallet copy = getWalletForm().getWallet().copy();
|
||||||
|
|
||||||
if(copy.isEncrypted()) {
|
if(copy.isEncrypted()) {
|
||||||
WalletPasswordDialog dlg = new WalletPasswordDialog(copy.getName(), WalletPasswordDialog.PasswordRequirement.LOAD);
|
WalletPasswordDialog dlg = new WalletPasswordDialog(copy.getMasterName(), WalletPasswordDialog.PasswordRequirement.LOAD);
|
||||||
Optional<SecureString> password = dlg.showAndWait();
|
Optional<SecureString> password = dlg.showAndWait();
|
||||||
if(password.isPresent()) {
|
if(password.isPresent()) {
|
||||||
Storage.DecryptWalletService decryptWalletService = new Storage.DecryptWalletService(copy, password.get());
|
Storage.DecryptWalletService decryptWalletService = new Storage.DecryptWalletService(copy, password.get());
|
||||||
|
|
|
@ -406,7 +406,7 @@ public class SettingsController extends WalletFormController implements Initiali
|
||||||
}
|
}
|
||||||
|
|
||||||
if(wallet == null) {
|
if(wallet == null) {
|
||||||
throw new IllegalStateException("Cannot find child wallet " + walletForm.getWallet().getName() + " to export");
|
throw new IllegalStateException("Cannot find child wallet " + walletForm.getWallet().getFullName() + " to export");
|
||||||
}
|
}
|
||||||
|
|
||||||
WalletExportDialog dlg = new WalletExportDialog(wallet);
|
WalletExportDialog dlg = new WalletExportDialog(wallet);
|
||||||
|
|
|
@ -93,7 +93,7 @@ public class TransactionEntry extends Entry implements Comparable<TransactionEnt
|
||||||
if(optRef.isPresent()) {
|
if(optRef.isPresent()) {
|
||||||
validEntries++;
|
validEntries++;
|
||||||
if(getChildren().stream().noneMatch(entry -> ((HashIndexEntry)entry).getHashIndex().equals(optRef.get().getSpentBy()) && ((HashIndexEntry)entry).getType().equals(HashIndexEntry.Type.INPUT))) {
|
if(getChildren().stream().noneMatch(entry -> ((HashIndexEntry)entry).getHashIndex().equals(optRef.get().getSpentBy()) && ((HashIndexEntry)entry).getType().equals(HashIndexEntry.Type.INPUT))) {
|
||||||
log.warn("TransactionEntry " + blockTransaction.getHash() + " for wallet " + getWallet().getName() + " missing child for input " + optRef.get().getSpentBy() + " on output " + optRef.get());
|
log.warn("TransactionEntry " + blockTransaction.getHash() + " for wallet " + getWallet().getFullName() + " missing child for input " + optRef.get().getSpentBy() + " on output " + optRef.get());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -103,14 +103,14 @@ public class TransactionEntry extends Entry implements Comparable<TransactionEnt
|
||||||
if(optRef.isPresent()) {
|
if(optRef.isPresent()) {
|
||||||
validEntries++;
|
validEntries++;
|
||||||
if(getChildren().stream().noneMatch(entry -> ((HashIndexEntry)entry).getHashIndex().equals(optRef.get()) && ((HashIndexEntry)entry).getType().equals(HashIndexEntry.Type.OUTPUT))) {
|
if(getChildren().stream().noneMatch(entry -> ((HashIndexEntry)entry).getHashIndex().equals(optRef.get()) && ((HashIndexEntry)entry).getType().equals(HashIndexEntry.Type.OUTPUT))) {
|
||||||
log.warn("TransactionEntry " + blockTransaction.getHash() + " for wallet " + getWallet().getName() + " missing child for output " + optRef.get());
|
log.warn("TransactionEntry " + blockTransaction.getHash() + " for wallet " + getWallet().getFullName() + " missing child for output " + optRef.get());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(getChildren().size() != validEntries) {
|
if(getChildren().size() != validEntries) {
|
||||||
log.warn("TransactionEntry " + blockTransaction.getHash() + " for wallet " + getWallet().getName() + " has incorrect number of children " + getChildren().size() + " (should be " + validEntries + ")");
|
log.warn("TransactionEntry " + blockTransaction.getHash() + " for wallet " + getWallet().getFullName() + " has incorrect number of children " + getChildren().size() + " (should be " + validEntries + ")");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -102,7 +102,7 @@ public class TransactionsController extends WalletFormController implements Init
|
||||||
});
|
});
|
||||||
|
|
||||||
transactionsMasterDetail.setShowDetailNode(Config.get().isShowLoadingLog());
|
transactionsMasterDetail.setShowDetailNode(Config.get().isShowLoadingLog());
|
||||||
loadingLog.appendText("Wallet loading history for " + getWalletForm().getWallet().getName());
|
loadingLog.appendText("Wallet loading history for " + getWalletForm().getWallet().getFullName());
|
||||||
loadingLog.setEditable(false);
|
loadingLog.setEditable(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,7 +125,7 @@ public class TransactionsController extends WalletFormController implements Init
|
||||||
Stage window = new Stage();
|
Stage window = new Stage();
|
||||||
FileChooser fileChooser = new FileChooser();
|
FileChooser fileChooser = new FileChooser();
|
||||||
fileChooser.setTitle("Export Transactions as CSV");
|
fileChooser.setTitle("Export Transactions as CSV");
|
||||||
fileChooser.setInitialFileName(getWalletForm().getWallet().getName() + ".csv");
|
fileChooser.setInitialFileName(getWalletForm().getWallet().getFullName() + ".csv");
|
||||||
|
|
||||||
AppServices.moveToActiveWindowScreen(window, 800, 450);
|
AppServices.moveToActiveWindowScreen(window, 800, 450);
|
||||||
File file = fileChooser.showSaveDialog(window);
|
File file = fileChooser.showSaveDialog(window);
|
||||||
|
|
|
@ -113,7 +113,7 @@ public class UtxosController extends WalletFormController implements Initializab
|
||||||
|
|
||||||
FileChooser fileChooser = new FileChooser();
|
FileChooser fileChooser = new FileChooser();
|
||||||
fileChooser.setTitle("Export UTXOs to CSV");
|
fileChooser.setTitle("Export UTXOs to CSV");
|
||||||
fileChooser.setInitialFileName(getWalletForm().getWallet().getName() + "-utxos.csv");
|
fileChooser.setInitialFileName(getWalletForm().getWallet().getFullName() + "-utxos.csv");
|
||||||
|
|
||||||
AppServices.moveToActiveWindowScreen(window, 800, 450);
|
AppServices.moveToActiveWindowScreen(window, 800, 450);
|
||||||
File file = fileChooser.showSaveDialog(window);
|
File file = fileChooser.showSaveDialog(window);
|
||||||
|
|
|
@ -114,7 +114,7 @@ public class WalletForm {
|
||||||
public void refreshHistory(Integer blockHeight, Wallet pastWallet, WalletNode node) {
|
public void refreshHistory(Integer blockHeight, Wallet pastWallet, WalletNode node) {
|
||||||
Wallet previousWallet = wallet.copy();
|
Wallet previousWallet = wallet.copy();
|
||||||
if(wallet.isValid() && AppServices.isConnected()) {
|
if(wallet.isValid() && AppServices.isConnected()) {
|
||||||
log.debug(node == null ? wallet.getName() + " refreshing full wallet history" : wallet.getName() + " requesting node wallet history for " + node.getDerivationPath());
|
log.debug(node == null ? wallet.getFullName() + " refreshing full wallet history" : wallet.getFullName() + " requesting node wallet history for " + node.getDerivationPath());
|
||||||
ElectrumServer.TransactionHistoryService historyService = new ElectrumServer.TransactionHistoryService(wallet, getWalletTransactionNodes(node));
|
ElectrumServer.TransactionHistoryService historyService = new ElectrumServer.TransactionHistoryService(wallet, getWalletTransactionNodes(node));
|
||||||
historyService.setOnSucceeded(workerStateEvent -> {
|
historyService.setOnSucceeded(workerStateEvent -> {
|
||||||
if(historyService.getValue()) {
|
if(historyService.getValue()) {
|
||||||
|
@ -363,7 +363,7 @@ public class WalletForm {
|
||||||
if(wallet.isValid()) {
|
if(wallet.isValid()) {
|
||||||
WalletNode walletNode = event.getWalletNode(wallet);
|
WalletNode walletNode = event.getWalletNode(wallet);
|
||||||
if(walletNode != null) {
|
if(walletNode != null) {
|
||||||
log.debug(wallet.getName() + " history event for node " + walletNode + " (" + event.getScriptHash() + ")");
|
log.debug(wallet.getFullName() + " history event for node " + walletNode + " (" + event.getScriptHash() + ")");
|
||||||
refreshHistory(AppServices.getCurrentBlockHeight(), null, walletNode);
|
refreshHistory(AppServices.getCurrentBlockHeight(), null, walletNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ public abstract class WalletFormController extends BaseController {
|
||||||
for(WalletTabData tabData : event.getClosedWalletTabData()) {
|
for(WalletTabData tabData : event.getClosedWalletTabData()) {
|
||||||
if(tabData.getWalletForm() == walletForm) {
|
if(tabData.getWalletForm() == walletForm) {
|
||||||
EventManager.get().unregister(this);
|
EventManager.get().unregister(this);
|
||||||
} else if(walletForm instanceof SettingsWalletForm && tabData.getStorage() == walletForm.getStorage()) {
|
} else if(walletForm instanceof SettingsWalletForm && tabData.getStorage().getWalletId(tabData.getWallet()).equals(walletForm.getWalletId())) {
|
||||||
EventManager.get().unregister(this);
|
EventManager.get().unregister(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue