mirror of
https://github.com/sparrowwallet/drongo.git
synced 2024-12-26 10:06:45 +00:00
support parsing descriptors with labels and writing hd key info
This commit is contained in:
parent
6f90d0fa82
commit
78944a7114
1 changed files with 13 additions and 5 deletions
|
@ -362,6 +362,10 @@ public class OutputDescriptor {
|
||||||
|
|
||||||
// See https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md
|
// See https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md
|
||||||
public static OutputDescriptor getOutputDescriptor(String descriptor) {
|
public static OutputDescriptor getOutputDescriptor(String descriptor) {
|
||||||
|
return getOutputDescriptor(descriptor, new LinkedHashMap<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static OutputDescriptor getOutputDescriptor(String descriptor, Map<ExtendedKey, String> mapExtendedPublicKeyLabels) {
|
||||||
ScriptType scriptType = ScriptType.fromDescriptor(descriptor);
|
ScriptType scriptType = ScriptType.fromDescriptor(descriptor);
|
||||||
if(scriptType == null) {
|
if(scriptType == null) {
|
||||||
ExtendedKey.Header header = ExtendedKey.Header.fromExtendedKey(descriptor);
|
ExtendedKey.Header header = ExtendedKey.Header.fromExtendedKey(descriptor);
|
||||||
|
@ -373,7 +377,7 @@ public class OutputDescriptor {
|
||||||
}
|
}
|
||||||
|
|
||||||
int threshold = getMultisigThreshold(descriptor);
|
int threshold = getMultisigThreshold(descriptor);
|
||||||
return getOutputDescriptorImpl(scriptType, threshold, descriptor);
|
return getOutputDescriptorImpl(scriptType, threshold, descriptor, mapExtendedPublicKeyLabels);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int getMultisigThreshold(String descriptor) {
|
private static int getMultisigThreshold(String descriptor) {
|
||||||
|
@ -386,7 +390,7 @@ public class OutputDescriptor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static OutputDescriptor getOutputDescriptorImpl(ScriptType scriptType, int multisigThreshold, String descriptor) {
|
private static OutputDescriptor getOutputDescriptorImpl(ScriptType scriptType, int multisigThreshold, String descriptor, Map<ExtendedKey, String> mapExtendedPublicKeyLabels) {
|
||||||
Matcher checksumMatcher = CHECKSUM_PATTERN.matcher(descriptor);
|
Matcher checksumMatcher = CHECKSUM_PATTERN.matcher(descriptor);
|
||||||
if(checksumMatcher.find()) {
|
if(checksumMatcher.find()) {
|
||||||
String checksum = checksumMatcher.group(1);
|
String checksum = checksumMatcher.group(1);
|
||||||
|
@ -453,7 +457,7 @@ public class OutputDescriptor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new OutputDescriptor(scriptType, multisigThreshold, keyDerivationMap, keyChildDerivationMap, new LinkedHashMap<>(), masterPrivateKeyMap);
|
return new OutputDescriptor(scriptType, multisigThreshold, keyDerivationMap, keyChildDerivationMap, mapExtendedPublicKeyLabels, masterPrivateKeyMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String normalize(String descriptor) {
|
public static String normalize(String descriptor) {
|
||||||
|
@ -613,8 +617,13 @@ public class OutputDescriptor {
|
||||||
}
|
}
|
||||||
|
|
||||||
private String toString(ExtendedKey pubKey, boolean addKeyOrigin, boolean addKey) {
|
private String toString(ExtendedKey pubKey, boolean addKeyOrigin, boolean addKey) {
|
||||||
StringBuilder keyBuilder = new StringBuilder();
|
|
||||||
KeyDerivation keyDerivation = extendedPublicKeys.get(pubKey);
|
KeyDerivation keyDerivation = extendedPublicKeys.get(pubKey);
|
||||||
|
String childDerivation = mapChildrenDerivations.get(pubKey);
|
||||||
|
return writeKey(pubKey, keyDerivation, childDerivation, addKeyOrigin, addKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String writeKey(ExtendedKey pubKey, KeyDerivation keyDerivation, String childDerivation, boolean addKeyOrigin, boolean addKey) {
|
||||||
|
StringBuilder keyBuilder = new StringBuilder();
|
||||||
if(keyDerivation != null && keyDerivation.getDerivationPath() != null && addKeyOrigin) {
|
if(keyDerivation != null && keyDerivation.getDerivationPath() != null && addKeyOrigin) {
|
||||||
keyBuilder.append("[");
|
keyBuilder.append("[");
|
||||||
if(keyDerivation.getMasterFingerprint() != null) {
|
if(keyDerivation.getMasterFingerprint() != null) {
|
||||||
|
@ -630,7 +639,6 @@ public class OutputDescriptor {
|
||||||
keyBuilder.append(pubKey.toString());
|
keyBuilder.append(pubKey.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
String childDerivation = mapChildrenDerivations.get(pubKey);
|
|
||||||
if(childDerivation != null) {
|
if(childDerivation != null) {
|
||||||
if(!childDerivation.startsWith("/")) {
|
if(!childDerivation.startsWith("/")) {
|
||||||
keyBuilder.append("/");
|
keyBuilder.append("/");
|
||||||
|
|
Loading…
Reference in a new issue