mirror of
https://github.com/sparrowwallet/sparrow.git
synced 2025-11-05 11:56:37 +00:00
fix issue with random ordering of keystore origins on labels import
This commit is contained in:
parent
27e21c890f
commit
289a4453a4
1 changed files with 51 additions and 2 deletions
|
|
@ -2,9 +2,11 @@ package com.sparrowwallet.sparrow.io;
|
||||||
|
|
||||||
import com.csvreader.CsvReader;
|
import com.csvreader.CsvReader;
|
||||||
import com.google.gson.*;
|
import com.google.gson.*;
|
||||||
|
import com.sparrowwallet.drongo.KeyDerivation;
|
||||||
import com.sparrowwallet.drongo.KeyPurpose;
|
import com.sparrowwallet.drongo.KeyPurpose;
|
||||||
import com.sparrowwallet.drongo.OutputDescriptor;
|
import com.sparrowwallet.drongo.OutputDescriptor;
|
||||||
import com.sparrowwallet.drongo.Utils;
|
import com.sparrowwallet.drongo.Utils;
|
||||||
|
import com.sparrowwallet.drongo.protocol.ScriptType;
|
||||||
import com.sparrowwallet.drongo.protocol.Sha256Hash;
|
import com.sparrowwallet.drongo.protocol.Sha256Hash;
|
||||||
import com.sparrowwallet.drongo.protocol.Transaction;
|
import com.sparrowwallet.drongo.protocol.Transaction;
|
||||||
import com.sparrowwallet.drongo.wallet.*;
|
import com.sparrowwallet.drongo.wallet.*;
|
||||||
|
|
@ -27,6 +29,8 @@ import java.text.DateFormat;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
|
@ -203,7 +207,7 @@ public class WalletLabels implements WalletImport, WalletExport {
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputDescriptor outputDescriptor = OutputDescriptor.getOutputDescriptor(wallet);
|
OutputDescriptor outputDescriptor = OutputDescriptor.getOutputDescriptor(wallet);
|
||||||
String origin = outputDescriptor.toString(true, false, false);
|
Origin origin = Origin.fromOutputDescriptor(outputDescriptor);
|
||||||
|
|
||||||
List<Entry> transactionEntries = walletForm.getWalletTransactionsEntry().getChildren();
|
List<Entry> transactionEntries = walletForm.getWalletTransactionsEntry().getChildren();
|
||||||
List<Entry> addressEntries = new ArrayList<>();
|
List<Entry> addressEntries = new ArrayList<>();
|
||||||
|
|
@ -212,7 +216,7 @@ public class WalletLabels implements WalletImport, WalletExport {
|
||||||
List<Entry> utxoEntries = walletForm.getWalletUtxosEntry().getChildren();
|
List<Entry> utxoEntries = walletForm.getWalletUtxosEntry().getChildren();
|
||||||
|
|
||||||
for(Label label : labels) {
|
for(Label label : labels) {
|
||||||
if(label.origin != null && !label.origin.equals(origin)) {
|
if(label.origin != null && !Origin.fromString(label.origin).equals(origin)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -494,4 +498,49 @@ public class WalletLabels implements WalletImport, WalletExport {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class Origin {
|
||||||
|
private static final Pattern KEY_ORIGIN_PATTERN = Pattern.compile("\\[([A-Fa-f0-9]{8})([/\\d'hH]+)?\\]");
|
||||||
|
|
||||||
|
private ScriptType scriptType;
|
||||||
|
private Set<KeyDerivation> keyDerivations;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final boolean equals(Object o) {
|
||||||
|
if(this == o) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if(!(o instanceof Origin origin)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return scriptType == origin.scriptType && keyDerivations.equals(origin.keyDerivations);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
int result = Objects.hashCode(scriptType);
|
||||||
|
result = 31 * result + keyDerivations.hashCode();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Origin fromOutputDescriptor(OutputDescriptor outputDescriptor) {
|
||||||
|
Origin origin = new Origin();
|
||||||
|
origin.scriptType = outputDescriptor.getScriptType();
|
||||||
|
origin.keyDerivations = new HashSet<>(outputDescriptor.getExtendedPublicKeysMap().values());
|
||||||
|
return origin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Origin fromString(String strOrigin) {
|
||||||
|
Origin origin = new Origin();
|
||||||
|
origin.scriptType = ScriptType.fromDescriptor(strOrigin);
|
||||||
|
origin.keyDerivations = new HashSet<>();
|
||||||
|
Matcher keyOriginMatcher = KEY_ORIGIN_PATTERN.matcher(strOrigin);
|
||||||
|
while(keyOriginMatcher.find()) {
|
||||||
|
byte[] masterFingerprintBytes = keyOriginMatcher.group(1) != null ? Utils.hexToBytes(keyOriginMatcher.group(1)) : new byte[4];
|
||||||
|
origin.keyDerivations.add(new KeyDerivation(Utils.bytesToHex(masterFingerprintBytes), KeyDerivation.writePath(KeyDerivation.parsePath(keyOriginMatcher.group(2)))));
|
||||||
|
}
|
||||||
|
return origin;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue