mirror of
https://github.com/sparrowwallet/sparrow.git
synced 2026-08-09 16:24:53 +00:00
implement changes to export addresses functionality
This commit is contained in:
@@ -3,6 +3,7 @@ package com.sparrowwallet.sparrow.wallet;
|
||||
import com.csvreader.CsvWriter;
|
||||
import com.google.common.eventbus.Subscribe;
|
||||
import com.sparrowwallet.drongo.KeyPurpose;
|
||||
import com.sparrowwallet.drongo.wallet.Wallet;
|
||||
import com.sparrowwallet.drongo.wallet.WalletNode;
|
||||
import com.sparrowwallet.sparrow.AppServices;
|
||||
import com.sparrowwallet.sparrow.EventManager;
|
||||
@@ -20,10 +21,12 @@ import java.io.*;
|
||||
import java.net.URL;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
public class AddressesController extends WalletFormController implements Initializable {
|
||||
private static final Logger log = LoggerFactory.getLogger(AddressesController.class);
|
||||
public static final int DEFAULT_EXPORT_ADDRESSES_LENGTH = 250;
|
||||
|
||||
@FXML
|
||||
private AddressTreeTable receiveTable;
|
||||
@@ -96,26 +99,36 @@ public class AddressesController extends WalletFormController implements Initial
|
||||
}
|
||||
|
||||
public void exportReceiveAddresses(ActionEvent event) {
|
||||
exportFile();
|
||||
exportAddresses(KeyPurpose.RECEIVE);
|
||||
}
|
||||
|
||||
private void exportFile() {
|
||||
public void exportChangeAddresses(ActionEvent event) {
|
||||
exportAddresses(KeyPurpose.CHANGE);
|
||||
}
|
||||
|
||||
private void exportAddresses(KeyPurpose keyPurpose) {
|
||||
Stage window = new Stage();
|
||||
|
||||
FileChooser fileChooser = new FileChooser();
|
||||
fileChooser.setTitle("Export Addresses File");
|
||||
String extension = "txt";
|
||||
fileChooser.setInitialFileName(getWalletForm().getWallet().getName() + "-addresses.txt");
|
||||
fileChooser.setTitle("Export Addresses to CSV");
|
||||
fileChooser.setInitialFileName(getWalletForm().getWallet().getName() + "-" + keyPurpose.name().toLowerCase() + "-addresses.txt");
|
||||
|
||||
Wallet copy = getWalletForm().getWallet().copy();
|
||||
WalletNode purposeNode = copy.getNode(keyPurpose);
|
||||
purposeNode.fillToIndex(Math.max(purposeNode.getChildren().size(), DEFAULT_EXPORT_ADDRESSES_LENGTH));
|
||||
|
||||
File file = fileChooser.showSaveDialog(window);
|
||||
if(file != null) {
|
||||
try(FileOutputStream outputStream = new FileOutputStream(file)) {
|
||||
CsvWriter writer = new CsvWriter(outputStream, ',', StandardCharsets.UTF_8);
|
||||
writer.writeRecord(new String[] {"Index", "Payment Address"});
|
||||
for(Entry entry : getWalletForm().getNodeEntry(KeyPurpose.RECEIVE).getChildren()) {
|
||||
NodeEntry childEntry = (NodeEntry)entry;
|
||||
writer.write(childEntry.getNode().getIndex() + "");
|
||||
writer.write(childEntry.getAddress().toString());
|
||||
writer.writeRecord(new String[] {"Index", "Payment Address", "Derivation", "Label"});
|
||||
for(WalletNode indexNode : purposeNode.getChildren()) {
|
||||
writer.write(Integer.toString(indexNode.getIndex()));
|
||||
writer.write(copy.getAddress(indexNode).toString());
|
||||
writer.write(getDerivationPath(indexNode));
|
||||
Optional<Entry> optLabelEntry = getWalletForm().getNodeEntry(keyPurpose).getChildren().stream()
|
||||
.filter(entry -> ((NodeEntry)entry).getNode().getIndex() == indexNode.getIndex()).findFirst();
|
||||
writer.write(optLabelEntry.isPresent() ? optLabelEntry.get().getLabel() : "");
|
||||
writer.endRecord();
|
||||
}
|
||||
writer.close();
|
||||
|
||||
@@ -117,20 +117,7 @@ public class ReceiveController extends WalletFormController implements Initializ
|
||||
}
|
||||
|
||||
private void updateDerivationPath(NodeEntry nodeEntry) {
|
||||
KeyDerivation firstDerivation = getWalletForm().getWallet().getKeystores().get(0).getKeyDerivation();
|
||||
boolean singleDerivationPath = true;
|
||||
for(Keystore keystore : getWalletForm().getWallet().getKeystores()) {
|
||||
if(!keystore.getKeyDerivation().getDerivationPath().equals(firstDerivation.getDerivationPath())) {
|
||||
singleDerivationPath = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(singleDerivationPath) {
|
||||
derivationPath.setText(firstDerivation.extend(nodeEntry.getNode().getDerivation()).getDerivationPath());
|
||||
} else {
|
||||
derivationPath.setText(nodeEntry.getNode().getDerivationPath().replace("m", "multi"));
|
||||
}
|
||||
derivationPath.setText(getDerivationPath(nodeEntry.getNode()));
|
||||
}
|
||||
|
||||
private void updateLastUsed() {
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
package com.sparrowwallet.sparrow.wallet;
|
||||
|
||||
import com.google.common.eventbus.Subscribe;
|
||||
import com.sparrowwallet.drongo.KeyDerivation;
|
||||
import com.sparrowwallet.drongo.wallet.Keystore;
|
||||
import com.sparrowwallet.drongo.wallet.WalletNode;
|
||||
import com.sparrowwallet.sparrow.BaseController;
|
||||
import com.sparrowwallet.sparrow.EventManager;
|
||||
import com.sparrowwallet.sparrow.WalletTabData;
|
||||
@@ -30,4 +33,24 @@ public abstract class WalletFormController extends BaseController {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean isSingleDerivationPath() {
|
||||
KeyDerivation firstDerivation = getWalletForm().getWallet().getKeystores().get(0).getKeyDerivation();
|
||||
for(Keystore keystore : getWalletForm().getWallet().getKeystores()) {
|
||||
if(!keystore.getKeyDerivation().getDerivationPath().equals(firstDerivation.getDerivationPath())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
protected String getDerivationPath(WalletNode node) {
|
||||
if(isSingleDerivationPath()) {
|
||||
KeyDerivation firstDerivation = getWalletForm().getWallet().getKeystores().get(0).getKeyDerivation();
|
||||
return firstDerivation.extend(node.getDerivation()).getDerivationPath();
|
||||
}
|
||||
|
||||
return node.getDerivationPath().replace("m", "multi");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user