From 0a7f3469196e4d1248dfd83b11478394b02a9bb3 Mon Sep 17 00:00:00 2001 From: Andreas Schildbach Date: Fri, 2 Mar 2018 10:36:50 +0100 Subject: [PATCH] Move WrongNetworkException to AddressFormatException.WrongNetwork. --- .../main/java/org/bitcoinj/core/Address.java | 6 ++-- .../bitcoinj/core/AddressFormatException.java | 16 +++++++++ .../org/bitcoinj/core/DumpedPrivateKey.java | 6 ++-- .../java/org/bitcoinj/core/LegacyAddress.java | 6 ++-- .../java/org/bitcoinj/core/SegwitAddress.java | 2 +- .../bitcoinj/core/WrongNetworkException.java | 33 ------------------- .../bitcoinj/core/DumpedPrivateKeyTest.java | 2 +- .../org/bitcoinj/core/LegacyAddressTest.java | 6 ++-- .../java/org/bitcoinj/tools/WalletTool.java | 8 ++--- 9 files changed, 34 insertions(+), 51 deletions(-) delete mode 100644 core/src/main/java/org/bitcoinj/core/WrongNetworkException.java diff --git a/core/src/main/java/org/bitcoinj/core/Address.java b/core/src/main/java/org/bitcoinj/core/Address.java index f97c159cc..48c6cce00 100644 --- a/core/src/main/java/org/bitcoinj/core/Address.java +++ b/core/src/main/java/org/bitcoinj/core/Address.java @@ -47,19 +47,19 @@ public abstract class Address extends PrefixedChecksummedBytes { * @return constructed address * @throws AddressFormatException * if the given string doesn't parse or the checksum is invalid - * @throws WrongNetworkException + * @throws AddressFormatException.WrongNetwork * if the given string is valid but not for the expected network (eg testnet vs mainnet) */ public static Address fromString(@Nullable NetworkParameters params, String str) throws AddressFormatException { try { return LegacyAddress.fromBase58(params, str); - } catch (WrongNetworkException x) { + } catch (AddressFormatException.WrongNetwork x) { throw x; } catch (AddressFormatException x) { try { return SegwitAddress.fromBech32(params, str); - } catch (WrongNetworkException x2) { + } catch (AddressFormatException.WrongNetwork x2) { throw x; } catch (AddressFormatException x2) { throw new AddressFormatException(str); diff --git a/core/src/main/java/org/bitcoinj/core/AddressFormatException.java b/core/src/main/java/org/bitcoinj/core/AddressFormatException.java index 865282543..9954ecdd5 100644 --- a/core/src/main/java/org/bitcoinj/core/AddressFormatException.java +++ b/core/src/main/java/org/bitcoinj/core/AddressFormatException.java @@ -26,4 +26,20 @@ public class AddressFormatException extends IllegalArgumentException { public AddressFormatException(String message) { super(message); } + + /** + * This exception is thrown by the {@link PrefixedChecksummedBytes} hierarchy of classes when you try and decode an + * address with a version header that isn't used by that network. You shouldn't allow the user to proceed in this + * case as they are trying to send money across different chains, an operation that is guaranteed to destroy the + * money. + */ + public static class WrongNetwork extends AddressFormatException { + public WrongNetwork(int versionHeader) { + super("Version code of address did not match acceptable versions for network: " + versionHeader); + } + + public WrongNetwork(String hrp) { + super("Human readable part of address did not match acceptable HRPs for network: " + hrp); + } + } } diff --git a/core/src/main/java/org/bitcoinj/core/DumpedPrivateKey.java b/core/src/main/java/org/bitcoinj/core/DumpedPrivateKey.java index 3b3fa613c..59b3afcb2 100644 --- a/core/src/main/java/org/bitcoinj/core/DumpedPrivateKey.java +++ b/core/src/main/java/org/bitcoinj/core/DumpedPrivateKey.java @@ -40,11 +40,11 @@ public class DumpedPrivateKey extends PrefixedChecksummedBytes { * The textual form of the private key. * @throws AddressFormatException * if the given base58 doesn't parse or the checksum is invalid - * @throws WrongNetworkException + * @throws AddressFormatException.WrongNetwork * if the given private key is valid but for a different chain (eg testnet vs mainnet) */ public static DumpedPrivateKey fromBase58(@Nullable NetworkParameters params, String base58) - throws AddressFormatException { + throws AddressFormatException, AddressFormatException.WrongNetwork { byte[] versionAndDataBytes = Base58.decodeChecked(base58); int version = versionAndDataBytes[0] & 0xFF; byte[] bytes = Arrays.copyOfRange(versionAndDataBytes, 1, versionAndDataBytes.length); @@ -56,7 +56,7 @@ public class DumpedPrivateKey extends PrefixedChecksummedBytes { } else { if (version == params.getDumpedPrivateKeyHeader()) return new DumpedPrivateKey(params, bytes); - throw new WrongNetworkException(version); + throw new AddressFormatException.WrongNetwork(version); } } diff --git a/core/src/main/java/org/bitcoinj/core/LegacyAddress.java b/core/src/main/java/org/bitcoinj/core/LegacyAddress.java index 12ad980e2..ebf879a4b 100644 --- a/core/src/main/java/org/bitcoinj/core/LegacyAddress.java +++ b/core/src/main/java/org/bitcoinj/core/LegacyAddress.java @@ -135,11 +135,11 @@ public class LegacyAddress extends Address { * base58-encoded textual form of the address * @throws AddressFormatException * if the given base58 doesn't parse or the checksum is invalid - * @throws WrongNetworkException + * @throws AddressFormatException.WrongNetwork * if the given address is valid but for a different chain (eg testnet vs mainnet) */ public static LegacyAddress fromBase58(@Nullable NetworkParameters params, String base58) - throws AddressFormatException, WrongNetworkException { + throws AddressFormatException, AddressFormatException.WrongNetwork { byte[] versionAndDataBytes = Base58.decodeChecked(base58); int version = versionAndDataBytes[0] & 0xFF; byte[] bytes = Arrays.copyOfRange(versionAndDataBytes, 1, versionAndDataBytes.length); @@ -156,7 +156,7 @@ public class LegacyAddress extends Address { return new LegacyAddress(params, false, bytes); else if (version == params.getP2SHHeader()) return new LegacyAddress(params, true, bytes); - throw new WrongNetworkException(version); + throw new AddressFormatException.WrongNetwork(version); } } diff --git a/core/src/main/java/org/bitcoinj/core/SegwitAddress.java b/core/src/main/java/org/bitcoinj/core/SegwitAddress.java index 34bf80381..47654f6f3 100644 --- a/core/src/main/java/org/bitcoinj/core/SegwitAddress.java +++ b/core/src/main/java/org/bitcoinj/core/SegwitAddress.java @@ -180,7 +180,7 @@ public class SegwitAddress extends Address { } else { if (bechData.hrp.equals(params.getSegwitAddressHrp())) return new SegwitAddress(params, bechData.data); - throw new WrongNetworkException(bechData.hrp); + throw new AddressFormatException.WrongNetwork(bechData.hrp); } } diff --git a/core/src/main/java/org/bitcoinj/core/WrongNetworkException.java b/core/src/main/java/org/bitcoinj/core/WrongNetworkException.java deleted file mode 100644 index 22b60bb2e..000000000 --- a/core/src/main/java/org/bitcoinj/core/WrongNetworkException.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2012 Google Inc. - * Copyright 2018 Andreas Schildbach - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.bitcoinj.core; - -/** - * This exception is thrown by the address class when you try and decode an address with a version code that isn't - * used by that network. You shouldn't allow the user to proceed in this case as they are trying to send money across - * different chains, an operation that is guaranteed to destroy the money. - */ -public class WrongNetworkException extends AddressFormatException { - public WrongNetworkException(int verCode) { - super("Version code of address did not match acceptable versions for network: " + verCode); - } - - public WrongNetworkException(String hrp) { - super("Human readable part of address did not match acceptable HRPs for network: " + hrp); - } -} diff --git a/core/src/test/java/org/bitcoinj/core/DumpedPrivateKeyTest.java b/core/src/test/java/org/bitcoinj/core/DumpedPrivateKeyTest.java index cc01f8dc2..922594188 100644 --- a/core/src/test/java/org/bitcoinj/core/DumpedPrivateKeyTest.java +++ b/core/src/test/java/org/bitcoinj/core/DumpedPrivateKeyTest.java @@ -40,7 +40,7 @@ public class DumpedPrivateKeyTest { DumpedPrivateKey.fromBase58(MAINNET, "5HtUCLMFWNueqN9unpgX2DzjMg6SDNZyKRb8s3LJgpFg5ubuMrk"); } - @Test(expected = WrongNetworkException.class) + @Test(expected = AddressFormatException.WrongNetwork.class) public void checkNetworkWrong() throws Exception { DumpedPrivateKey.fromBase58(TESTNET, "5HtUCLMFWNueqN9unpgX2DzjMg6SDNZyKRb8s3LJgpFg5ubuMrk"); } diff --git a/core/src/test/java/org/bitcoinj/core/LegacyAddressTest.java b/core/src/test/java/org/bitcoinj/core/LegacyAddressTest.java index 8112656b7..973002f24 100644 --- a/core/src/test/java/org/bitcoinj/core/LegacyAddressTest.java +++ b/core/src/test/java/org/bitcoinj/core/LegacyAddressTest.java @@ -83,7 +83,7 @@ public class LegacyAddressTest { try { LegacyAddress.fromBase58(TESTNET, "this is not a valid address!"); fail(); - } catch (WrongNetworkException e) { + } catch (AddressFormatException.WrongNetwork e) { fail(); } catch (AddressFormatException e) { // Success. @@ -93,7 +93,7 @@ public class LegacyAddressTest { try { LegacyAddress.fromBase58(TESTNET, ""); fail(); - } catch (WrongNetworkException e) { + } catch (AddressFormatException.WrongNetwork e) { fail(); } catch (AddressFormatException e) { // Success. @@ -103,7 +103,7 @@ public class LegacyAddressTest { try { LegacyAddress.fromBase58(TESTNET, "17kzeh4N8g49GFvdDzSf8PjaPfyoD1MndL"); fail(); - } catch (WrongNetworkException e) { + } catch (AddressFormatException.WrongNetwork e) { // Success. } catch (AddressFormatException e) { fail(); diff --git a/tools/src/main/java/org/bitcoinj/tools/WalletTool.java b/tools/src/main/java/org/bitcoinj/tools/WalletTool.java index 1fedcab4c..f93d3dcd9 100644 --- a/tools/src/main/java/org/bitcoinj/tools/WalletTool.java +++ b/tools/src/main/java/org/bitcoinj/tools/WalletTool.java @@ -603,7 +603,7 @@ public class WalletTool { } else { t.addOutput(outputSpec.value, outputSpec.key); } - } catch (WrongNetworkException e) { + } catch (AddressFormatException.WrongNetwork e) { System.err.println("Malformed output specification, address is for a different network: " + spec); return; } catch (AddressFormatException e) { @@ -725,7 +725,7 @@ public class WalletTool { value = outputSpec.value; byte[] refundPubKey = new BigInteger(refund, 16).toByteArray(); refundKey = ECKey.fromPublicOnly(refundPubKey); - } catch (WrongNetworkException e) { + } catch (AddressFormatException.WrongNetwork e) { System.err.println("Malformed output specification, address is for a different network."); return; } catch (AddressFormatException e) { @@ -805,7 +805,7 @@ public class WalletTool { try { outputSpec = new OutputSpec(output); value = outputSpec.value; - } catch (WrongNetworkException e) { + } catch (AddressFormatException.WrongNetwork e) { System.err.println("Malformed output specification, address is for a different network."); return; } catch (AddressFormatException e) { @@ -909,7 +909,7 @@ public class WalletTool { try { outputSpec = new OutputSpec(output); value = outputSpec.value; - } catch (WrongNetworkException e) { + } catch (AddressFormatException.WrongNetwork e) { System.err.println("Malformed output specification, address is for a different network."); return; } catch (AddressFormatException e) {