From 3162371838b9c2acbaa234add5c2b06d071f0347 Mon Sep 17 00:00:00 2001 From: Craig Raw Date: Mon, 8 Jan 2024 12:12:13 +0200 Subject: [PATCH] fix order of outputs displayed in transaction diagram where there are multiple payments with the same address and amount --- .../sparrow/control/TransactionDiagram.java | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/sparrowwallet/sparrow/control/TransactionDiagram.java b/src/main/java/com/sparrowwallet/sparrow/control/TransactionDiagram.java index d71711d5..8234adbc 100644 --- a/src/main/java/com/sparrowwallet/sparrow/control/TransactionDiagram.java +++ b/src/main/java/com/sparrowwallet/sparrow/control/TransactionDiagram.java @@ -720,6 +720,7 @@ public class TransactionDiagram extends GridPane { outputNodes.add(new OutputNode(paymentBox, payment.getAddress(), payment.getAmount())); } + Set seenIndexes = new HashSet<>(); for(Map.Entry changeEntry : walletTx.getChangeMap().entrySet()) { WalletNode changeNode = changeEntry.getKey(); WalletNode defaultChangeNode = walletTx.getWallet().getFreshNode(KeyPurpose.CHANGE); @@ -765,11 +766,15 @@ public class TransactionDiagram extends GridPane { actionBox.getChildren().addAll(region, amountLabel); } - outputNodes.add(new OutputNode(actionBox, changeAddress, changeEntry.getValue())); - } - - if(isFinal()) { - Collections.sort(outputNodes); + int changeIndex = outputNodes.size(); + if(isFinal()) { + changeIndex = getOutputIndex(changeAddress, changeEntry.getValue(), seenIndexes); + seenIndexes.add(changeIndex); + if(changeIndex > outputNodes.size()) { + changeIndex = outputNodes.size(); + } + } + outputNodes.add(changeIndex, new OutputNode(actionBox, changeAddress, changeEntry.getValue())); } for(OutputNode outputNode : outputNodes) { @@ -931,7 +936,7 @@ public class TransactionDiagram extends GridPane { if(payment.getType() == Payment.Type.WHIRLPOOL_FEE) { return "Whirlpool fee"; } else if(walletTx.isPremixSend(payment)) { - int premixIndex = getOutputIndex(payment.getAddress(), payment.getAmount()) - 2; + int premixIndex = getOutputIndex(payment.getAddress(), payment.getAmount(), Collections.emptySet()) - 1; return "Premix #" + premixIndex; } else if(walletTx.isBadbankSend(payment)) { return "Badbank change"; @@ -940,8 +945,10 @@ public class TransactionDiagram extends GridPane { return null; } - private int getOutputIndex(Address address, long amount) { - return walletTx.getTransaction().getOutputs().stream().filter(txOutput -> address.equals(txOutput.getScript().getToAddress()) && txOutput.getValue() == amount).mapToInt(TransactionOutput::getIndex).findFirst().orElseThrow(); + private int getOutputIndex(Address address, long amount, Collection seenIndexes) { + List addressOutputs = walletTx.getTransaction().getOutputs().stream().filter(txOutput -> txOutput.getScript().getToAddress() != null).collect(Collectors.toList()); + TransactionOutput output = addressOutputs.stream().filter(txOutput -> address.equals(txOutput.getScript().getToAddress()) && txOutput.getValue() == amount && !seenIndexes.contains(txOutput.getIndex())).findFirst().orElseThrow(); + return addressOutputs.indexOf(output); } Wallet getToWallet(Payment payment) { @@ -1315,7 +1322,7 @@ public class TransactionDiagram extends GridPane { } } - private class OutputNode implements Comparable { + private static class OutputNode { public Pane outputLabel; public Address address; public long amount; @@ -1325,15 +1332,6 @@ public class TransactionDiagram extends GridPane { this.address = address; this.amount = amount; } - - @Override - public int compareTo(TransactionDiagram.OutputNode o) { - try { - return getOutputIndex(address, amount) - getOutputIndex(o.address, o.amount); - } catch(Exception e) { - return 0; - } - } } private class LabelContextMenu extends ContextMenu {