mirror of
https://github.com/sparrowwallet/sparrow.git
synced 2024-12-24 12:46:45 +00:00
Handle importing a wallet from a crypto-account QR using the File > Import Wallet dialog
This commit is contained in:
parent
5df4e5761c
commit
a9ab4d6c78
2 changed files with 50 additions and 18 deletions
|
@ -1,6 +1,7 @@
|
||||||
package com.sparrowwallet.sparrow.control;
|
package com.sparrowwallet.sparrow.control;
|
||||||
|
|
||||||
import com.google.common.io.ByteStreams;
|
import com.google.common.io.ByteStreams;
|
||||||
|
import com.google.common.io.Files;
|
||||||
import com.google.gson.JsonParseException;
|
import com.google.gson.JsonParseException;
|
||||||
import com.sparrowwallet.drongo.policy.Policy;
|
import com.sparrowwallet.drongo.policy.Policy;
|
||||||
import com.sparrowwallet.drongo.policy.PolicyType;
|
import com.sparrowwallet.drongo.policy.PolicyType;
|
||||||
|
@ -27,6 +28,8 @@ import org.slf4j.LoggerFactory;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class FileWalletKeystoreImportPane extends FileImportPane {
|
public class FileWalletKeystoreImportPane extends FileImportPane {
|
||||||
private static final Logger log = LoggerFactory.getLogger(FileWalletKeystoreImportPane.class);
|
private static final Logger log = LoggerFactory.getLogger(FileWalletKeystoreImportPane.class);
|
||||||
|
@ -42,35 +45,62 @@ public class FileWalletKeystoreImportPane extends FileImportPane {
|
||||||
|
|
||||||
protected void importFile(String fileName, InputStream inputStream, String password) throws ImportException {
|
protected void importFile(String fileName, InputStream inputStream, String password) throws ImportException {
|
||||||
this.fileName = fileName;
|
this.fileName = fileName;
|
||||||
try {
|
|
||||||
fileBytes = ByteStreams.toByteArray(inputStream);
|
List<ScriptType> scriptTypes = ScriptType.getAddressableScriptTypes(PolicyType.SINGLE);
|
||||||
} catch(IOException e) {
|
if(wallets != null && !wallets.isEmpty()) {
|
||||||
throw new ImportException("Could not read file", e);
|
if(wallets.size() == 1 && scriptTypes.contains(wallets.get(0).getScriptType())) {
|
||||||
|
Wallet wallet = wallets.get(0);
|
||||||
|
wallet.setPolicyType(PolicyType.SINGLE);
|
||||||
|
wallet.setDefaultPolicy(Policy.getPolicy(PolicyType.SINGLE, wallet.getScriptType(), wallet.getKeystores(), null));
|
||||||
|
wallet.setName(importer.getName());
|
||||||
|
EventManager.get().post(new WalletImportEvent(wallets.get(0)));
|
||||||
|
} else {
|
||||||
|
scriptTypes.retainAll(wallets.stream().map(Wallet::getScriptType).collect(Collectors.toList()));
|
||||||
|
if(scriptTypes.isEmpty()) {
|
||||||
|
throw new ImportException("No singlesig script types present in QR code");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
fileBytes = ByteStreams.toByteArray(inputStream);
|
||||||
|
} catch(IOException e) {
|
||||||
|
throw new ImportException("Could not read file", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setContent(getScriptTypeEntry());
|
setContent(getScriptTypeEntry(scriptTypes));
|
||||||
setExpanded(true);
|
setExpanded(true);
|
||||||
importButton.setDisable(true);
|
importButton.setDisable(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void importWallet(ScriptType scriptType) throws ImportException {
|
private void importWallet(ScriptType scriptType) throws ImportException {
|
||||||
ByteArrayInputStream bais = new ByteArrayInputStream(fileBytes);
|
if(wallets != null && !wallets.isEmpty()) {
|
||||||
Keystore keystore = importer.getKeystore(scriptType, bais, "");
|
Wallet wallet = wallets.stream().filter(wallet1 -> wallet1.getScriptType() == scriptType).findFirst().orElseThrow(ImportException::new);
|
||||||
|
wallet.setName(importer.getName());
|
||||||
|
wallet.setPolicyType(PolicyType.SINGLE);
|
||||||
|
wallet.setDefaultPolicy(Policy.getPolicy(PolicyType.SINGLE, wallet.getScriptType(), wallet.getKeystores(), null));
|
||||||
|
EventManager.get().post(new WalletImportEvent(wallet));
|
||||||
|
} else {
|
||||||
|
ByteArrayInputStream bais = new ByteArrayInputStream(fileBytes);
|
||||||
|
Keystore keystore = importer.getKeystore(scriptType, bais, "");
|
||||||
|
|
||||||
Wallet wallet = new Wallet();
|
Wallet wallet = new Wallet();
|
||||||
wallet.setName(fileName);
|
wallet.setName(Files.getNameWithoutExtension(fileName));
|
||||||
wallet.setPolicyType(PolicyType.SINGLE);
|
wallet.setPolicyType(PolicyType.SINGLE);
|
||||||
wallet.setScriptType(scriptType);
|
wallet.setScriptType(scriptType);
|
||||||
wallet.getKeystores().add(keystore);
|
wallet.getKeystores().add(keystore);
|
||||||
wallet.setDefaultPolicy(Policy.getPolicy(PolicyType.SINGLE, scriptType, wallet.getKeystores(), null));
|
wallet.setDefaultPolicy(Policy.getPolicy(PolicyType.SINGLE, scriptType, wallet.getKeystores(), null));
|
||||||
|
|
||||||
EventManager.get().post(new WalletImportEvent(wallet));
|
EventManager.get().post(new WalletImportEvent(wallet));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Node getScriptTypeEntry() {
|
private Node getScriptTypeEntry(List<ScriptType> scriptTypes) {
|
||||||
Label label = new Label("Script Type:");
|
Label label = new Label("Script Type:");
|
||||||
ComboBox<ScriptType> scriptTypeComboBox = new ComboBox<>(FXCollections.observableArrayList(ScriptType.getAddressableScriptTypes(PolicyType.SINGLE)));
|
ComboBox<ScriptType> scriptTypeComboBox = new ComboBox<>(FXCollections.observableArrayList(scriptTypes));
|
||||||
scriptTypeComboBox.setValue(ScriptType.P2WPKH);
|
if(scriptTypes.contains(ScriptType.P2WPKH)) {
|
||||||
|
scriptTypeComboBox.setValue(ScriptType.P2WPKH);
|
||||||
|
}
|
||||||
|
|
||||||
HelpLabel helpLabel = new HelpLabel();
|
HelpLabel helpLabel = new HelpLabel();
|
||||||
helpLabel.setHelpText("P2WPKH is a Native Segwit type and is usually the best choice for new wallets.\nP2SH-P2WPKH is a Wrapped Segwit type and is a reasonable choice for the widest compatibility.\nP2PKH is a Legacy type and should be avoided for new wallets.\nFor existing wallets, be sure to choose the type that matches the wallet you are importing.");
|
helpLabel.setHelpText("P2WPKH is a Native Segwit type and is usually the best choice for new wallets.\nP2SH-P2WPKH is a Wrapped Segwit type and is a reasonable choice for the widest compatibility.\nP2PKH is a Legacy type and should be avoided for new wallets.\nFor existing wallets, be sure to choose the type that matches the wallet you are importing.");
|
||||||
|
|
|
@ -461,7 +461,9 @@ public class WalletForm {
|
||||||
public void walletTabsClosed(WalletTabsClosedEvent event) {
|
public void walletTabsClosed(WalletTabsClosedEvent event) {
|
||||||
for(WalletTabData tabData : event.getClosedWalletTabData()) {
|
for(WalletTabData tabData : event.getClosedWalletTabData()) {
|
||||||
if(tabData.getWalletForm() == this) {
|
if(tabData.getWalletForm() == this) {
|
||||||
storage.close();
|
if(wallet.isMasterWallet()) {
|
||||||
|
storage.close();
|
||||||
|
}
|
||||||
if(wallet.isValid()) {
|
if(wallet.isValid()) {
|
||||||
AppServices.clearTransactionHistoryCache(wallet);
|
AppServices.clearTransactionHistoryCache(wallet);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue