mirror of
https://github.com/sparrowwallet/sparrow.git
synced 2024-12-25 05:06:45 +00:00
remap partial batch successes to original ids, lock menu functionality when wallet is locked
This commit is contained in:
parent
cca61d281c
commit
5d823571df
5 changed files with 37 additions and 14 deletions
2
drongo
2
drongo
|
@ -1 +1 @@
|
||||||
Subproject commit 9618c73c50e59035cd373d932970f446032cd9e5
|
Subproject commit ee732fb2235fbe242d75366fc37d3f53e2082519
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue