mirror of
https://github.com/sparrowwallet/drongo.git
synced 2024-11-02 18:26:43 +00:00
support finding signing nodes from provided psbt input derivation paths
This commit is contained in:
parent
143d28166a
commit
d4bdd9f385
2 changed files with 31 additions and 2 deletions
|
@ -242,6 +242,24 @@ public class Keystore extends Persistable {
|
||||||
return getKeyDerivation().extend(keyPurpose.getPathIndex()).extend(new ChildNumber(keyIndex));
|
return getKeyDerivation().extend(keyPurpose.getPathIndex()).extend(new ChildNumber(keyIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ECKey getPubKeyForDerivation(KeyDerivation keyDerivation) {
|
||||||
|
if(keyDerivation != null) {
|
||||||
|
List<ChildNumber> derivation = keyDerivation.getDerivation();
|
||||||
|
if(derivation.size() > this.keyDerivation.getDerivation().size()) {
|
||||||
|
List<ChildNumber> xpubDerivation = derivation.subList(0, this.keyDerivation.getDerivation().size());
|
||||||
|
if(xpubDerivation.equals(this.keyDerivation.getDerivation())) {
|
||||||
|
derivation = derivation.subList(this.keyDerivation.getDerivation().size(), derivation.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(derivation.size() == 2) {
|
||||||
|
return getPubKey(new WalletNode(KeyDerivation.writePath(derivation)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isValid() {
|
public boolean isValid() {
|
||||||
try {
|
try {
|
||||||
checkKeystore();
|
checkKeystore();
|
||||||
|
|
|
@ -1490,8 +1490,8 @@ public class Wallet extends Persistable implements Comparable<Wallet> {
|
||||||
return signingNodes;
|
return signingNodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Keystore> getSigningKeystores(PSBT psbt) {
|
public Collection<Keystore> getSigningKeystores(PSBT psbt) {
|
||||||
List<Keystore> signingKeystores = new ArrayList<>();
|
Set<Keystore> signingKeystores = new LinkedHashSet<>();
|
||||||
|
|
||||||
for(Map.Entry<ExtendedKey, KeyDerivation> entry : psbt.getExtendedPublicKeys().entrySet()) {
|
for(Map.Entry<ExtendedKey, KeyDerivation> entry : psbt.getExtendedPublicKeys().entrySet()) {
|
||||||
for(Keystore keystore : getKeystores()) {
|
for(Keystore keystore : getKeystores()) {
|
||||||
|
@ -1501,6 +1501,17 @@ public class Wallet extends Persistable implements Comparable<Wallet> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(PSBTInput psbtInput : psbt.getPsbtInputs()) {
|
||||||
|
for(Map.Entry<ECKey, KeyDerivation> entry : psbtInput.getDerivedPublicKeys().entrySet()) {
|
||||||
|
for(Keystore keystore : getKeystores().stream().filter(k -> !signingKeystores.contains(k)).toList()) {
|
||||||
|
ECKey derivedKey = keystore.getPubKeyForDerivation(entry.getValue());
|
||||||
|
if(derivedKey != null && Arrays.equals(entry.getKey().getPubKey(), derivedKey.getPubKey())) {
|
||||||
|
signingKeystores.add(keystore);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return signingKeystores;
|
return signingKeystores;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue