mirror of
https://github.com/sparrowwallet/drongo.git
synced 2025-11-05 11:56:38 +00:00
derive to maximum bip32 account level where child path in output descriptor contains more than two elements
This commit is contained in:
parent
abb598d3b0
commit
ad02b8a33c
1 changed files with 18 additions and 3 deletions
|
|
@ -440,15 +440,30 @@ public class OutputDescriptor {
|
||||||
KeyDerivation keyDerivation = new KeyDerivation(masterFingerprint, keyDerivationPath);
|
KeyDerivation keyDerivation = new KeyDerivation(masterFingerprint, keyDerivationPath);
|
||||||
try {
|
try {
|
||||||
ExtendedKey extendedKey = ExtendedKey.fromDescriptor(extKey);
|
ExtendedKey extendedKey = ExtendedKey.fromDescriptor(extKey);
|
||||||
|
if(childDerivationPath != null) {
|
||||||
|
try {
|
||||||
|
List<ChildNumber> childPath = KeyDerivation.parsePath(childDerivationPath.replace("<0;1>", "0"));
|
||||||
|
if(childPath.size() > 2 && (extendedKey.getKey().hasPrivKey() || childPath.stream().noneMatch(ChildNumber::isHardened))) {
|
||||||
|
childDerivationPath = childDerivationPath.substring(childDerivationPath.lastIndexOf("/", childDerivationPath.lastIndexOf("/") - 1));
|
||||||
|
childPath = childPath.subList(0, childPath.size() - 2);
|
||||||
|
keyDerivation = keyDerivation.extend(childPath);
|
||||||
|
childPath.addFirst(extendedKey.getKeyChildNumber());
|
||||||
|
DeterministicKey derivedKey = extendedKey.getKey(childPath);
|
||||||
|
extendedKey = new ExtendedKey(derivedKey, derivedKey.getParentFingerprint(), childPath.getLast());
|
||||||
|
}
|
||||||
|
} catch(Exception e) {
|
||||||
|
//ignore and continue
|
||||||
|
}
|
||||||
|
}
|
||||||
if(extendedKey.getKey().hasPrivKey()) {
|
if(extendedKey.getKey().hasPrivKey()) {
|
||||||
ExtendedKey privateExtendedKey = extendedKey;
|
ExtendedKey privateExtendedKey = extendedKey;
|
||||||
List<ChildNumber> derivation = keyDerivation.getDerivation();
|
List<ChildNumber> derivation = keyDerivation.getDerivation();
|
||||||
int depth = derivation.size() == 0 ? scriptType.getDefaultDerivation().size() : derivation.size();
|
int depth = derivation.isEmpty() ? scriptType.getDefaultDerivation().size() : derivation.size();
|
||||||
DeterministicKey prvKey = extendedKey.getKey();
|
DeterministicKey prvKey = extendedKey.getKey();
|
||||||
DeterministicKey pubKey = new DeterministicKey(prvKey.getPath(), prvKey.getChainCode(), prvKey.getPubKey(), depth, extendedKey.getParentFingerprint());
|
DeterministicKey pubKey = new DeterministicKey(List.of(prvKey.getPath().getLast()), prvKey.getChainCode(), prvKey.getPubKey(), depth, extendedKey.getParentFingerprint());
|
||||||
extendedKey = new ExtendedKey(pubKey, pubKey.getParentFingerprint(), extendedKey.getKeyChildNumber());
|
extendedKey = new ExtendedKey(pubKey, pubKey.getParentFingerprint(), extendedKey.getKeyChildNumber());
|
||||||
|
|
||||||
if(derivation.size() == 0) {
|
if(derivation.isEmpty()) {
|
||||||
masterPrivateKeyMap.put(extendedKey, privateExtendedKey);
|
masterPrivateKeyMap.put(extendedKey, privateExtendedKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue