support parsing xpubs encoded for a different network

This commit is contained in:
Craig Raw 2025-04-03 15:17:12 +02:00
parent 41cd6a68c0
commit 3b36947419

View file

@ -75,10 +75,14 @@ public class ExtendedKey {
} }
public static ExtendedKey fromDescriptor(String descriptor) { public static ExtendedKey fromDescriptor(String descriptor) {
return fromDescriptor(descriptor, false);
}
public static ExtendedKey fromDescriptor(String descriptor, boolean ignoreNetwork) {
byte[] serializedKey = Base58.decodeChecked(descriptor); byte[] serializedKey = Base58.decodeChecked(descriptor);
ByteBuffer buffer = ByteBuffer.wrap(serializedKey); ByteBuffer buffer = ByteBuffer.wrap(serializedKey);
int headerInt = buffer.getInt(); int headerInt = buffer.getInt();
Header header = Header.getHeader(headerInt); Header header = Header.getHeader(headerInt, ignoreNetwork);
if(header == null) { if(header == null) {
throw new IllegalArgumentException("Unknown header bytes for extended key on " + Network.getCanonical().getName() + ": " + DeterministicKey.toBase58(serializedKey).substring(0, 4)); throw new IllegalArgumentException("Unknown header bytes for extended key on " + Network.getCanonical().getName() + ": " + DeterministicKey.toBase58(serializedKey).substring(0, 4));
} }
@ -239,7 +243,7 @@ public class ExtendedKey {
return Network.get().getXpubHeader(); return Network.get().getXpubHeader();
} }
private static Header getHeader(int header) { private static Header getHeader(int header, boolean ignoreNetwork) {
for(Header extendedKeyHeader : getHeaders(Network.get())) { for(Header extendedKeyHeader : getHeaders(Network.get())) {
if(header == extendedKeyHeader.header) { if(header == extendedKeyHeader.header) {
return extendedKeyHeader; return extendedKeyHeader;
@ -249,6 +253,9 @@ public class ExtendedKey {
for(Network otherNetwork : getOtherNetworks(Network.get())) { for(Network otherNetwork : getOtherNetworks(Network.get())) {
for(Header otherNetworkKeyHeader : getHeaders(otherNetwork)) { for(Header otherNetworkKeyHeader : getHeaders(otherNetwork)) {
if(header == otherNetworkKeyHeader.header) { if(header == otherNetworkKeyHeader.header) {
if(ignoreNetwork) {
return otherNetworkKeyHeader;
}
throw new IllegalArgumentException("Provided " + otherNetworkKeyHeader.name + " extended key invalid on configured " + Network.getCanonical().getName() + " network. Use a " + otherNetwork.getName() + " configuration to use this extended key."); throw new IllegalArgumentException("Provided " + otherNetworkKeyHeader.name + " extended key invalid on configured " + Network.getCanonical().getName() + " network. Use a " + otherNetwork.getName() + " configuration to use this extended key.");
} }
} }