remap partial batch successes to original ids, lock menu functionality when wallet is locked

This commit is contained in:
Craig Raw 2022-02-03 12:45:01 +02:00
parent cca61d281c
commit 5d823571df
5 changed files with 37 additions and 14 deletions

2
drongo

@ -1 +1 @@
Subproject commit 9618c73c50e59035cd373d932970f446032cd9e5 Subproject commit ee732fb2235fbe242d75366fc37d3f53e2082519

View file

@ -422,9 +422,8 @@ public class AppController implements Initializable {
Parent root = loader.load(); Parent root = loader.load();
AboutController controller = loader.getController(); AboutController controller = loader.getController();
Stage stage = new Stage(); Stage stage = new Stage(StageStyle.UNDECORATED);
stage.setTitle("About " + MainApp.APP_NAME); stage.setTitle("About " + MainApp.APP_NAME);
stage.initStyle(StageStyle.UNDECORATED);
stage.initOwner(tabs.getScene().getWindow()); stage.initOwner(tabs.getScene().getWindow());
stage.initModality(Modality.WINDOW_MODAL); stage.initModality(Modality.WINDOW_MODAL);
stage.setResizable(false); stage.setResizable(false);
@ -1960,7 +1959,7 @@ public class AppController implements Initializable {
saveTransaction.setVisible(true); saveTransaction.setVisible(true);
saveTransaction.setDisable(true); saveTransaction.setDisable(true);
lockWallet.setDisable(walletTabData.getWalletForm().lockedProperty().get()); lockWallet.setDisable(walletTabData.getWalletForm().lockedProperty().get());
exportWallet.setDisable(walletTabData.getWallet() == null || !walletTabData.getWallet().isValid()); exportWallet.setDisable(walletTabData.getWallet() == null || !walletTabData.getWallet().isValid() || walletTabData.getWalletForm().isLocked());
showLoadingLog.setDisable(false); showLoadingLog.setDisable(false);
showTxHex.setDisable(true); showTxHex.setDisable(true);
findMixingPartner.setDisable(exportWallet.isDisable() || !SorobanServices.canWalletMix(walletTabData.getWallet()) || !AppServices.onlineProperty().get()); findMixingPartner.setDisable(exportWallet.isDisable() || !SorobanServices.canWalletMix(walletTabData.getWallet()) || !AppServices.onlineProperty().get());
@ -1987,7 +1986,7 @@ public class AppController implements Initializable {
WalletForm selectedWalletForm = getSelectedWalletForm(); WalletForm selectedWalletForm = getSelectedWalletForm();
if(selectedWalletForm != null) { if(selectedWalletForm != null) {
if(selectedWalletForm.getWalletId().equals(event.getWalletId())) { if(selectedWalletForm.getWalletId().equals(event.getWalletId())) {
exportWallet.setDisable(!event.getWallet().isValid()); exportWallet.setDisable(!event.getWallet().isValid() || selectedWalletForm.isLocked());
findMixingPartner.setDisable(exportWallet.isDisable() || !SorobanServices.canWalletMix(event.getWallet()) || !AppServices.onlineProperty().get()); findMixingPartner.setDisable(exportWallet.isDisable() || !SorobanServices.canWalletMix(event.getWallet()) || !AppServices.onlineProperty().get());
} }
} }
@ -2476,6 +2475,7 @@ public class AppController implements Initializable {
WalletForm selectedWalletForm = getSelectedWalletForm(); WalletForm selectedWalletForm = getSelectedWalletForm();
if(selectedWalletForm != null && selectedWalletForm.getMasterWallet().equals(event.getWallet())) { if(selectedWalletForm != null && selectedWalletForm.getMasterWallet().equals(event.getWallet())) {
lockWallet.setDisable(true); lockWallet.setDisable(true);
exportWallet.setDisable(true);
} }
} }
@ -2484,6 +2484,7 @@ public class AppController implements Initializable {
WalletForm selectedWalletForm = getSelectedWalletForm(); WalletForm selectedWalletForm = getSelectedWalletForm();
if(selectedWalletForm != null && selectedWalletForm.getMasterWallet().equals(event.getWallet())) { if(selectedWalletForm != null && selectedWalletForm.getMasterWallet().equals(event.getWallet())) {
lockWallet.setDisable(false); lockWallet.setDisable(false);
exportWallet.setDisable(!event.getWallet().isValid());
} }
} }
} }

View file

@ -4,6 +4,7 @@ import com.sparrowwallet.drongo.KeyPurpose;
import com.sparrowwallet.drongo.wallet.Wallet; import com.sparrowwallet.drongo.wallet.Wallet;
import com.sparrowwallet.sparrow.AppServices; import com.sparrowwallet.sparrow.AppServices;
import com.sparrowwallet.sparrow.wallet.*; import com.sparrowwallet.sparrow.wallet.*;
import javafx.application.Platform;
import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.ListChangeListener; import javafx.collections.ListChangeListener;
import javafx.scene.control.*; import javafx.scene.control.*;
@ -134,6 +135,8 @@ public class SearchWalletDialog extends Dialog<Entry> {
}); });
setResizable(true); setResizable(true);
Platform.runLater(search::requestFocus);
} }
private void searchWallet(String searchText) { private void searchWallet(String searchText) {

View file

@ -8,10 +8,12 @@ import com.sparrowwallet.drongo.uri.BitcoinURI;
import com.sparrowwallet.drongo.wallet.*; import com.sparrowwallet.drongo.wallet.*;
import com.sparrowwallet.sparrow.AppServices; import com.sparrowwallet.sparrow.AppServices;
import com.sparrowwallet.sparrow.EventManager; import com.sparrowwallet.sparrow.EventManager;
import com.sparrowwallet.sparrow.Theme;
import com.sparrowwallet.sparrow.event.ExcludeUtxoEvent; import com.sparrowwallet.sparrow.event.ExcludeUtxoEvent;
import com.sparrowwallet.sparrow.event.ReplaceChangeAddressEvent; import com.sparrowwallet.sparrow.event.ReplaceChangeAddressEvent;
import com.sparrowwallet.sparrow.event.SorobanInitiatedEvent; import com.sparrowwallet.sparrow.event.SorobanInitiatedEvent;
import com.sparrowwallet.sparrow.glyphfont.FontAwesome5; import com.sparrowwallet.sparrow.glyphfont.FontAwesome5;
import com.sparrowwallet.sparrow.io.Config;
import com.sparrowwallet.sparrow.soroban.SorobanServices; import com.sparrowwallet.sparrow.soroban.SorobanServices;
import com.sparrowwallet.sparrow.wallet.OptimizationStrategy; import com.sparrowwallet.sparrow.wallet.OptimizationStrategy;
import javafx.beans.property.BooleanProperty; import javafx.beans.property.BooleanProperty;
@ -67,15 +69,17 @@ public class TransactionDiagram extends GridPane {
@Override @Override
public void handle(MouseEvent event) { public void handle(MouseEvent event) {
if(!event.isConsumed()) { if(!event.isConsumed()) {
Stage stage = new Stage(); Stage stage = new Stage(StageStyle.UNDECORATED);
stage.setTitle(walletTx.getPayments().iterator().next().getLabel()); stage.setTitle(walletTx.getPayments().iterator().next().getLabel());
stage.initStyle(StageStyle.UNDECORATED);
stage.initOwner(TransactionDiagram.this.getScene().getWindow()); stage.initOwner(TransactionDiagram.this.getScene().getWindow());
stage.initModality(Modality.WINDOW_MODAL); stage.initModality(Modality.WINDOW_MODAL);
stage.setResizable(false); stage.setResizable(false);
VBox vBox = new VBox(20); VBox vBox = new VBox(20);
vBox.getStylesheets().add(AppServices.class.getResource("general.css").toExternalForm()); vBox.getStylesheets().add(AppServices.class.getResource("general.css").toExternalForm());
if(Config.get().getTheme() == Theme.DARK) {
vBox.getStylesheets().add(AppServices.class.getResource("darktheme.css").toExternalForm());
}
vBox.getStylesheets().add(AppServices.class.getResource("wallet/wallet.css").toExternalForm()); vBox.getStylesheets().add(AppServices.class.getResource("wallet/wallet.css").toExternalForm());
vBox.getStylesheets().add(AppServices.class.getResource("wallet/send.css").toExternalForm()); vBox.getStylesheets().add(AppServices.class.getResource("wallet/send.css").toExternalForm());
vBox.setPadding(new Insets(20, 40, 20, 50)); vBox.setPadding(new Insets(20, 40, 20, 50));
@ -411,8 +415,9 @@ public class TransactionDiagram extends GridPane {
} else if(input instanceof AdditionalBlockTransactionHashIndex additionalReference) { } else if(input instanceof AdditionalBlockTransactionHashIndex additionalReference) {
inputValue = input.getValue(); inputValue = input.getValue();
StringJoiner joiner = new StringJoiner("\n"); StringJoiner joiner = new StringJoiner("\n");
joiner.add("Spending " + getSatsValue(inputValue) + " sats from" + (isExpanded() ? ":" : " (click to expand):"));
for(BlockTransactionHashIndex additionalInput : additionalReference.getAdditionalInputs()) { for(BlockTransactionHashIndex additionalInput : additionalReference.getAdditionalInputs()) {
joiner.add(getInputDescription(additionalInput)); joiner.add(additionalInput.getHashAsString() + ":" + additionalInput.getIndex());
} }
tooltip.setText(joiner.toString()); tooltip.setText(joiner.toString());
} else if(input instanceof InvisibleBlockTransactionHashIndex) { } else if(input instanceof InvisibleBlockTransactionHashIndex) {
@ -464,8 +469,8 @@ public class TransactionDiagram extends GridPane {
} else if(label.getText().trim().isEmpty()) { } else if(label.getText().trim().isEmpty()) {
amountLabel.setText(""); amountLabel.setText("");
} }
amountLabel.setMinWidth(TextUtils.computeTextWidth(amountLabel.getFont(), amountLabel.getText(), 0.0D) + 7); amountLabel.setMinWidth(TextUtils.computeTextWidth(amountLabel.getFont(), amountLabel.getText(), 0.0D) + 12);
amountLabel.setPadding(new Insets(0, 0, 0, 5)); amountLabel.setPadding(new Insets(0, 0, 0, 10));
inputBox.getChildren().addAll(region, amountLabel); inputBox.getChildren().addAll(region, amountLabel);
} }
@ -637,7 +642,7 @@ public class TransactionDiagram extends GridPane {
WalletNode toNode = walletTx.getWallet() != null ? walletTx.getWallet().getWalletAddresses().get(payment.getAddress()) : null; WalletNode toNode = walletTx.getWallet() != null ? walletTx.getWallet().getWalletAddresses().get(payment.getAddress()) : null;
Tooltip recipientTooltip = new Tooltip((toWallet == null ? (toNode != null ? "Consolidate " : "Pay ") : "Receive ") Tooltip recipientTooltip = new Tooltip((toWallet == null ? (toNode != null ? "Consolidate " : "Pay ") : "Receive ")
+ getSatsValue(payment.getAmount()) + " sats to " + getSatsValue(payment.getAmount()) + " sats to "
+ (payment instanceof AdditionalPayment ? "\n" + payment : (toWallet == null ? (payment.getLabel() == null ? (toNode != null ? toNode : "external address") : payment.getLabel()) : toWallet.getFullDisplayName()) + "\n" + payment.getAddress().toString())); + (payment instanceof AdditionalPayment ? (isExpanded() ? "\n" : "(click to expand)\n") + payment : (toWallet == null ? (payment.getLabel() == null ? (toNode != null ? toNode : "external address") : payment.getLabel()) : toWallet.getFullDisplayName()) + "\n" + payment.getAddress().toString()));
recipientTooltip.getStyleClass().add("recipient-label"); recipientTooltip.getStyleClass().add("recipient-label");
recipientTooltip.setShowDelay(new Duration(TOOLTIP_SHOW_DELAY)); recipientTooltip.setShowDelay(new Duration(TOOLTIP_SHOW_DELAY));
recipientTooltip.setShowDuration(Duration.INDEFINITE); recipientTooltip.setShowDuration(Duration.INDEFINITE);

View file

@ -5,6 +5,8 @@ import com.github.arteam.simplejsonrpc.client.JsonRpcClient;
import com.github.arteam.simplejsonrpc.client.Transport; import com.github.arteam.simplejsonrpc.client.Transport;
import com.github.arteam.simplejsonrpc.client.builder.AbstractBuilder; import com.github.arteam.simplejsonrpc.client.builder.AbstractBuilder;
import com.github.arteam.simplejsonrpc.client.builder.BatchRequestBuilder; import com.github.arteam.simplejsonrpc.client.builder.BatchRequestBuilder;
import com.github.arteam.simplejsonrpc.client.exception.JsonRpcBatchException;
import com.github.arteam.simplejsonrpc.core.domain.ErrorMessage;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.sparrowwallet.sparrow.io.Config; import com.sparrowwallet.sparrow.io.Config;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -122,9 +124,21 @@ public class PagedBatchRequestBuilder<K, V> extends AbstractBuilder {
batchRequest.add(request.counterId, request.method, request.params); batchRequest.add(request.counterId, request.method, request.params);
} }
Map<Long, V> pageResult = new RetryLogic<Map<Long, V>>(maxAttempts, RETRY_DELAY_SECS, List.of(IllegalStateException.class, IllegalArgumentException.class)).getResult(batchRequest::execute); try {
for(Map.Entry<Long, V> pageEntry : pageResult.entrySet()) { Map<Long, V> pageResult = new RetryLogic<Map<Long, V>>(maxAttempts, RETRY_DELAY_SECS, List.of(IllegalStateException.class, IllegalArgumentException.class)).getResult(batchRequest::execute);
allResults.put(counterIdMap.get(pageEntry.getKey()), pageEntry.getValue()); for(Map.Entry<Long, V> pageEntry : pageResult.entrySet()) {
allResults.put(counterIdMap.get(pageEntry.getKey()), pageEntry.getValue());
}
} catch(JsonRpcBatchException e) {
Map<Object, Object> mappedSuccesess = new HashMap<>();
for(Map.Entry<?, ?> successEntry : e.getSuccesses().entrySet()) {
mappedSuccesess.put(counterIdMap.get((Long)successEntry.getKey()), successEntry.getValue());
}
Map<Object, ErrorMessage> mappedErrors = new HashMap<>();
for(Map.Entry<?, ErrorMessage> errorEntry : e.getErrors().entrySet()) {
mappedErrors.put(counterIdMap.get((Long)errorEntry.getKey()), errorEntry.getValue());
}
throw new JsonRpcBatchException(e.getMessage(), mappedSuccesess, mappedErrors);
} }
} else { } else {
BatchRequestBuilder<K, V> batchRequest = client.createBatchRequest().keysType(keysType).returnType(returnType); BatchRequestBuilder<K, V> batchRequest = client.createBatchRequest().keysType(keysType).returnType(returnType);