From f697dac422c61da3e89a5c1a86e8eb8bc9a9373f Mon Sep 17 00:00:00 2001 From: Gianluigi Davassi Date: Fri, 2 Dec 2016 23:57:44 +0100 Subject: [PATCH 1/5] @pinpong fixed getNewAddress (#4) * implemented toTrytes and toStrings * added TrytesConverterTest * WIP * added checksum calculation, pls review * updated checksum * updated tests * fixed getnewaddress --- node_config.properties | 2 +- .../response/AnalyzeTransactionResponse.java | 83 ++-------------- .../jota/dto/response/GetBundleResponse.java | 90 ++--------------- .../dto/response/GetNeighborsResponse.java | 33 ++----- .../dto/response/GetTransfersResponse.java | 43 ++------ src/main/java/jota/model/Neighbor.java | 36 +++++++ src/main/java/jota/model/Transaction.java | 99 +++++++++++++++++++ src/main/java/jota/model/Transfer.java | 50 ++++++++++ src/main/java/jota/utils/Checksum.java | 42 ++++++++ src/main/java/jota/utils/Constants.java | 13 +++ src/main/java/jota/utils/Converter.java | 17 +++- src/main/java/jota/utils/Curl.java | 5 +- src/main/java/jota/utils/InputValidator.java | 22 +++++ src/main/java/jota/utils/IotaAPIUtils.java | 5 + src/main/java/jota/utils/Signing.java | 18 ++-- src/main/java/jota/utils/TrytesConverter.java | 90 +++++++++++++++++ src/test/java/jota/AddressGenerationTest.java | 20 ++++ src/test/java/jota/ChecksumTest.java | 26 +++++ src/test/java/jota/InputValidatorTest.java | 30 ++++++ src/test/java/jota/IotaAPIProxyTest.java | 8 +- src/test/java/jota/TrytesConverterTest.java | 21 ++++ 21 files changed, 511 insertions(+), 242 deletions(-) create mode 100644 src/main/java/jota/model/Neighbor.java create mode 100644 src/main/java/jota/model/Transaction.java create mode 100644 src/main/java/jota/model/Transfer.java create mode 100644 src/main/java/jota/utils/Checksum.java create mode 100644 src/main/java/jota/utils/Constants.java create mode 100644 src/main/java/jota/utils/InputValidator.java create mode 100644 src/main/java/jota/utils/TrytesConverter.java create mode 100644 src/test/java/jota/AddressGenerationTest.java create mode 100644 src/test/java/jota/ChecksumTest.java create mode 100644 src/test/java/jota/InputValidatorTest.java create mode 100644 src/test/java/jota/TrytesConverterTest.java diff --git a/node_config.properties b/node_config.properties index f3c3793..e5e5a5a 100644 --- a/node_config.properties +++ b/node_config.properties @@ -1,5 +1,5 @@ iota.node.protocol=http #iota.node.host=138.68.126.141 -iota.node.host=127.0.0.1 +iota.node.host=node.iotawallet.info iota.node.port=14265 diff --git a/src/main/java/jota/dto/response/AnalyzeTransactionResponse.java b/src/main/java/jota/dto/response/AnalyzeTransactionResponse.java index fdb7059..53081ff 100644 --- a/src/main/java/jota/dto/response/AnalyzeTransactionResponse.java +++ b/src/main/java/jota/dto/response/AnalyzeTransactionResponse.java @@ -1,86 +1,15 @@ package jota.dto.response; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; +import jota.model.Transaction; + +import java.util.ArrayList; +import java.util.List; public class AnalyzeTransactionResponse extends AbstractResponse { - private Transactions[] transactions; + private List transactions = new ArrayList(); - public Transactions[] getTransactions() { + public List getTransactions() { return transactions; } - - static class Transactions { - private String signatureMessageChunk; - private String index; - private String approvalNonce; - private String hash; - private String digest; - private String type; - private String timestamp; - private String trunkTransaction; - private String branchTransaction; - private String signatureNonce; - private String address; - private String value; - private String bundle; - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); - } - - public String getValue() { - return value; - } - - public String getDigest() { - return digest; - } - - public String getTrunkTransaction() { - return trunkTransaction; - } - - public String getTimestamp() { - return timestamp; - } - - public String getSignatureNonce() { - return signatureNonce; - } - - public String getType() { - return type; - } - - public String getAddress() { - return address; - } - - public String getApprovalNonce() { - return approvalNonce; - } - - public String getBranchTransaction() { - return branchTransaction; - } - - public String getBundle() { - return bundle; - } - - public String getHash() { - return hash; - } - - public String getIndex() { - return index; - } - - public String getSignatureMessageChunk() { - return signatureMessageChunk; - } - } } diff --git a/src/main/java/jota/dto/response/GetBundleResponse.java b/src/main/java/jota/dto/response/GetBundleResponse.java index c508f78..278631f 100644 --- a/src/main/java/jota/dto/response/GetBundleResponse.java +++ b/src/main/java/jota/dto/response/GetBundleResponse.java @@ -1,93 +1,15 @@ package jota.dto.response; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; +import jota.model.Transaction; + +import java.util.ArrayList; +import java.util.List; public class GetBundleResponse extends AbstractResponse { - public Transactions[] transactions; + private List transactions = new ArrayList<>(); - private String warning; - - public String getWarning() { - return warning; - } - - public Transactions[] getTransactions() { + public List getTransactions() { return transactions; } - - public static class Transactions { - private String signatureMessageChunk; - private String index; - private String approvalNonce; - private String hash; - private String digest; - private String type; - private String timestamp; - private String trunkTransaction; - private String branchTransaction; - private String signatureNonce; - private String address; - private String value; - private String bundle; - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); - } - - public String getAddress() { - return address; - } - - public String getApprovalNonce() { - return approvalNonce; - } - - public String getBranchTransaction() { - return branchTransaction; - } - - public String getBundle() { - return bundle; - } - - public String getDigest() { - return digest; - } - - public String getHash() { - return hash; - } - - public String getIndex() { - return index; - } - - public String getSignatureMessageChunk() { - return signatureMessageChunk; - } - - public String getSignatureNonce() { - return signatureNonce; - } - - public String getTimestamp() { - return timestamp; - } - - public String getType() { - return type; - } - - public String getTrunkTransaction() { - return trunkTransaction; - } - - public String getValue() { - return value; - } - - } } diff --git a/src/main/java/jota/dto/response/GetNeighborsResponse.java b/src/main/java/jota/dto/response/GetNeighborsResponse.java index 550a546..3740307 100644 --- a/src/main/java/jota/dto/response/GetNeighborsResponse.java +++ b/src/main/java/jota/dto/response/GetNeighborsResponse.java @@ -1,34 +1,15 @@ package jota.dto.response; +import jota.model.Neighbor; + +import java.util.ArrayList; +import java.util.List; + public class GetNeighborsResponse extends AbstractResponse { - public Neighbors[] neighbors; + private List neighbors = new ArrayList<>(); - public Neighbors[] getNeighbors() { + public List getNeighbors() { return neighbors; } - - public static class Neighbors { - - private String address; - private Integer numberOfAllTransactions; - private Integer numberOfInvalidTransactions; - private Integer numberOfNewTransactions; - - public String getAddress() { - return address; - } - - public Integer getNumberOfAllTransactions() { - return numberOfAllTransactions; - } - - public Integer getNumberOfInvalidTransactions() { - return numberOfInvalidTransactions; - } - - public Integer getNumberOfNewTransactions() { - return numberOfNewTransactions; - } - } } diff --git a/src/main/java/jota/dto/response/GetTransfersResponse.java b/src/main/java/jota/dto/response/GetTransfersResponse.java index 4046ad4..441ccea 100644 --- a/src/main/java/jota/dto/response/GetTransfersResponse.java +++ b/src/main/java/jota/dto/response/GetTransfersResponse.java @@ -1,46 +1,15 @@ package jota.dto.response; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; +import jota.model.Transfer; + +import java.util.ArrayList; +import java.util.List; public class GetTransfersResponse extends AbstractResponse { - private Transfers[] transfers; + private List transfers = new ArrayList<>(); - public Transfers[] getTransfers() { + public List getTransfers() { return transfers; } - - public static class Transfers { - private String timestamp; - private String address; - private String hash; - private Integer persistence; - private long value; - - public String getAddress() { - return address; - } - - public String getHash() { - return hash; - } - - public Integer getPersistence() { - return persistence; - } - - public String getTimestamp() { - return timestamp; - } - - public long getValue() { - return value; - } - - @Override - public String toString() { - return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); - } - } } diff --git a/src/main/java/jota/model/Neighbor.java b/src/main/java/jota/model/Neighbor.java new file mode 100644 index 0000000..2eee719 --- /dev/null +++ b/src/main/java/jota/model/Neighbor.java @@ -0,0 +1,36 @@ +package jota.model; + +/** + * Created by pinpong on 02.12.16. + */ +public class Neighbor { + + private String address; + private Integer numberOfAllTransactions; + private Integer numberOfInvalidTransactions; + private Integer numberOfNewTransactions; + + public Neighbor(String address, Integer numberOfAllTransactions, Integer numberOfInvalidTransactions, Integer numberOfNewTransactions) { + this.address = address; + this.numberOfAllTransactions = numberOfAllTransactions; + this.numberOfInvalidTransactions = numberOfInvalidTransactions; + this.numberOfNewTransactions = numberOfNewTransactions; + } + + public String getAddress() { + return address; + } + + public Integer getNumberOfAllTransactions() { + return numberOfAllTransactions; + } + + public Integer getNumberOfInvalidTransactions() { + return numberOfInvalidTransactions; + } + + public Integer getNumberOfNewTransactions() { + return numberOfNewTransactions; + } + +} diff --git a/src/main/java/jota/model/Transaction.java b/src/main/java/jota/model/Transaction.java new file mode 100644 index 0000000..4cf5e89 --- /dev/null +++ b/src/main/java/jota/model/Transaction.java @@ -0,0 +1,99 @@ +package jota.model; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * Created by pinpong on 02.12.16. + */ +public class Transaction { + + private String signatureMessageChunk; + private String index; + private String approvalNonce; + private String hash; + private String digest; + private String type; + private String timestamp; + private String trunkTransaction; + private String branchTransaction; + private String signatureNonce; + private String address; + private String value; + private String bundle; + + public Transaction(String signatureMessageChunk, String index, String approvalNonce, String hash, String digest, String type, String timestamp, String trunkTransaction, String branchTransaction, String signatureNonce, String address, String value, String bundle) { + + this.hash = hash; + this.type = type; + this.signatureMessageChunk = signatureMessageChunk; + this.digest = digest; + this.address = address; + this.value = value; + this.timestamp = timestamp; + this.index = index; + this.bundle = bundle; + this.signatureNonce = signatureNonce; + this.approvalNonce = approvalNonce; + this.trunkTransaction = trunkTransaction; + this.branchTransaction = branchTransaction; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + } + + public String getValue() { + return value; + } + + public String getDigest() { + return digest; + } + + public String getTrunkTransaction() { + return trunkTransaction; + } + + public String getTimestamp() { + return timestamp; + } + + public String getSignatureNonce() { + return signatureNonce; + } + + public String getType() { + return type; + } + + public String getAddress() { + return address; + } + + public String getApprovalNonce() { + return approvalNonce; + } + + public String getBranchTransaction() { + return branchTransaction; + } + + public String getBundle() { + return bundle; + } + + public String getHash() { + return hash; + } + + public String getIndex() { + return index; + } + + public String getSignatureMessageChunk() { + return signatureMessageChunk; + } + +} diff --git a/src/main/java/jota/model/Transfer.java b/src/main/java/jota/model/Transfer.java new file mode 100644 index 0000000..fa149ee --- /dev/null +++ b/src/main/java/jota/model/Transfer.java @@ -0,0 +1,50 @@ +package jota.model; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * Created by pinpong on 02.12.16. + */ +public class Transfer { + + private String timestamp; + private String address; + private String hash; + private Integer persistence; + private long value; + + public Transfer(String timestamp, String address, String hash, Integer persistence, long value) { + + this.timestamp = timestamp; + this.address = address; + this.hash = hash; + this.persistence = persistence; + this.value = value; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); + } + + public String getAddress() { + return address; + } + + public String getHash() { + return hash; + } + + public Integer getPersistence() { + return persistence; + } + + public String getTimestamp() { + return timestamp; + } + + public long getValue() { + return value; + } +} diff --git a/src/main/java/jota/utils/Checksum.java b/src/main/java/jota/utils/Checksum.java new file mode 100644 index 0000000..47e5567 --- /dev/null +++ b/src/main/java/jota/utils/Checksum.java @@ -0,0 +1,42 @@ +package jota.utils; + +/** + * Created by pinpong on 02.12.16. + */ +public class Checksum { + + public static String addChecksum(String address) { + InputValidator.checkAddress(address); + String addressWithChecksum = address; + addressWithChecksum += calculateChecksum(address); + return addressWithChecksum; + } + + public static String removeChecksum(String addressWithChecksum) { + if (isAddressWithChecksum(addressWithChecksum)) { + return getAddress(addressWithChecksum); + } else return ""; + } + + private static String getAddress(String addressWithChecksum) { + return addressWithChecksum.substring(0, Constants.addressLengthWithoutChecksum); + } + + public static boolean isValidChecksum(String addressWithChecksum) { + String addressWithoutChecksum = removeChecksum(addressWithChecksum); + String addressWithRecalculateChecksum = addressWithChecksum += calculateChecksum(addressWithoutChecksum); + return addressWithRecalculateChecksum.equals(addressWithChecksum); + } + + private static boolean isAddressWithChecksum(String addressWithChecksum) { + return InputValidator.checkAddress(addressWithChecksum) && addressWithChecksum.length() == Constants.addressLengthWithChecksum; + } + + public static String calculateChecksum(String address) { + Curl curl = new Curl(); + curl.reset(); + curl.setState(Converter.copyTrits(address, curl.getState())); + curl.transform(); + return Converter.trytes(curl.getState()).substring(0, 9); + } +} diff --git a/src/main/java/jota/utils/Constants.java b/src/main/java/jota/utils/Constants.java new file mode 100644 index 0000000..997b296 --- /dev/null +++ b/src/main/java/jota/utils/Constants.java @@ -0,0 +1,13 @@ +package jota.utils; + +/** + * Created by pinpong on 02.12.16. + */ +public class Constants { + + public static final String TRYTE_ALPHABET = "9ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + public static int addressLengthWithoutChecksum = 81; + public static int addressLengthWithChecksum = 90; + +} diff --git a/src/main/java/jota/utils/Converter.java b/src/main/java/jota/utils/Converter.java index be5313f..a43388f 100644 --- a/src/main/java/jota/utils/Converter.java +++ b/src/main/java/jota/utils/Converter.java @@ -9,7 +9,6 @@ public class Converter { public static final int NUMBER_OF_TRITS_IN_A_BYTE = 5; public static final int NUMBER_OF_TRITS_IN_A_TRYTE = 3; - public static final String TRYTE_ALPHABET = "9ABCDEFGHIJKLMNOPQRSTUVWXYZ"; static final int[][] BYTE_TO_TRITS_MAPPINGS = new int[243][]; static final int[][] TRYTE_TO_TRITS_MAPPINGS = new int[27][]; @@ -63,7 +62,7 @@ public class Converter { final int[] trits = new int[trytes.length() * NUMBER_OF_TRITS_IN_A_TRYTE]; for (int i = 0; i < trytes.length(); i++) { - System.arraycopy(TRYTE_TO_TRITS_MAPPINGS[TRYTE_ALPHABET.indexOf(trytes.charAt(i))], 0, trits, i * NUMBER_OF_TRITS_IN_A_TRYTE, NUMBER_OF_TRITS_IN_A_TRYTE); + System.arraycopy(TRYTE_TO_TRITS_MAPPINGS[Constants.TRYTE_ALPHABET.indexOf(trytes.charAt(i))], 0, trits, i * NUMBER_OF_TRITS_IN_A_TRYTE, NUMBER_OF_TRITS_IN_A_TRYTE); } return trits; @@ -92,6 +91,16 @@ public class Converter { } } + public static int[] copyTrits(final String input, final int[] destination) { + for (int i = 0; i < input.length(); i++) { + int index = Constants.TRYTE_ALPHABET.indexOf(input.charAt(i)); + destination[i * 3] = TRYTE_TO_TRITS_MAPPINGS [index][0]; + destination[i * 3 + 1] = TRYTE_TO_TRITS_MAPPINGS[index][1]; + destination[i * 3 + 2] = TRYTE_TO_TRITS_MAPPINGS[index][2]; + } + return destination; + } + public static String trytes(final int[] trits, final int offset, final int size) { StringBuilder trytes = new StringBuilder(); @@ -100,9 +109,9 @@ public class Converter { int j = trits[offset + i * 3] + trits[offset + i * 3 + 1] * 3 + trits[offset + i * 3 + 2] * 9; if (j < 0) { - j += TRYTE_ALPHABET.length(); + j += Constants.TRYTE_ALPHABET.length(); } - trytes.append(TRYTE_ALPHABET.charAt(j)); + trytes.append(Constants.TRYTE_ALPHABET.charAt(j)); } return trytes.toString(); } diff --git a/src/main/java/jota/utils/Curl.java b/src/main/java/jota/utils/Curl.java index b07236f..2c296e8 100644 --- a/src/main/java/jota/utils/Curl.java +++ b/src/main/java/jota/utils/Curl.java @@ -13,7 +13,7 @@ public class Curl { private static final int NUMBER_OF_ROUNDS = 27; private static final int[] TRUTH_TABLE = {1, 0, -1, 1, -1, 0, -1, 1, 0}; - private final int[] state = new int[STATE_LENGTH]; + private int[] state = new int[STATE_LENGTH]; public void absorb(final int[] trits, int offset, int length) { @@ -35,7 +35,7 @@ public class Curl { return state; } - private void transform() { + public void transform() { final int[] scratchpad = new int[STATE_LENGTH]; int scratchpadIndex = 0; @@ -56,4 +56,5 @@ public class Curl { public int[] getState() { return state; } + public void setState(int[] state) { this.state = state; } } diff --git a/src/main/java/jota/utils/InputValidator.java b/src/main/java/jota/utils/InputValidator.java new file mode 100644 index 0000000..277a0ca --- /dev/null +++ b/src/main/java/jota/utils/InputValidator.java @@ -0,0 +1,22 @@ +package jota.utils; + +/** + * Created by pinpong on 02.12.16. + */ +public class InputValidator { + + public static boolean isAddress(String address) { + return (address.length() == Constants.addressLengthWithoutChecksum || + address.length() == Constants.addressLengthWithChecksum) && isTrytes(address, address.length()); + } + + public static boolean checkAddress(String address) { + if (!isAddress(address)) + throw new RuntimeException("Invalid address: " + address); + return true; + } + + public static boolean isTrytes(String trytes, int length) { + return trytes.matches("^[A-Z9]{" + (length == 0 ? "0," : length) + "}$"); + } +} diff --git a/src/main/java/jota/utils/IotaAPIUtils.java b/src/main/java/jota/utils/IotaAPIUtils.java index dd47181..5bcc294 100644 --- a/src/main/java/jota/utils/IotaAPIUtils.java +++ b/src/main/java/jota/utils/IotaAPIUtils.java @@ -18,8 +18,13 @@ public class IotaAPIUtils { public static GetNewAddressResponse getNewAddress(final String seed, final int index) { final int[] key = Signing.key(Converter.trits(seed), index, 2); + System.out.println("Length = "+ key.length ); final int[] digests = Signing.digests(key); + System.out.println("Length = "+ digests.length ); + final int[] addressTrits = Signing.address(digests); + System.out.println("Length = "+ addressTrits.length ); + final String address = Converter.trytes(addressTrits); return GetNewAddressResponse.create(address); diff --git a/src/main/java/jota/utils/Signing.java b/src/main/java/jota/utils/Signing.java index 639a006..3cff61c 100644 --- a/src/main/java/jota/utils/Signing.java +++ b/src/main/java/jota/utils/Signing.java @@ -21,8 +21,10 @@ public class Signing { } Curl curl = new Curl(); - //curl.absorb(subseed, state); - //curl.squeeze(subseed, state); + curl.reset(); + curl.absorb(subseed, 0, subseed.length); + curl.squeeze(subseed, 0, subseed.length); + curl.reset(); curl.absorb(subseed, 0, subseed.length); List key = new ArrayList<>(); @@ -33,7 +35,7 @@ public class Signing { for (int i = 0; i < 27; i++) { - curl.squeeze(buffer, 0, buffer.length); + curl.squeeze(buffer, offset, buffer.length); for (int j = 0; j < 243; j++) { key.add(buffer[j]); } @@ -54,8 +56,8 @@ public class Signing { public static int[] digests(int[] key) { final Curl curl = new Curl(); - int[] digests = new int[key.length]; - int[] buffer = new int[key.length]; + int[] digests = new int[(int) Math.floor(key.length / 6561) * 243]; + int[] buffer = new int[243]; for (int i = 0; i < Math.floor(key.length / 6561); i++) { int[] keyFragment = Arrays.copyOfRange(key, i * 6561, (i + 1) * 6561); @@ -64,7 +66,7 @@ public class Signing { buffer = Arrays.copyOfRange(keyFragment, j * 243, (j + 1) * 243); for (int k = 0; k < 26; k++) { - + curl.reset(); curl.absorb(buffer, 0, buffer.length); curl.squeeze(buffer, 0, buffer.length); } @@ -74,6 +76,7 @@ public class Signing { } } + curl.reset(); curl.absorb(keyFragment, 0, keyFragment.length); curl.squeeze(buffer, 0, buffer.length); @@ -86,7 +89,8 @@ public class Signing { public static int[] address(int[] digests) { final Curl curl = new Curl(); - int[] address = new int[digests.length]; + int[] address = new int[243]; + curl.reset(); curl.absorb(digests, 0, digests.length); curl.squeeze(address, 0, address.length); return address; diff --git a/src/main/java/jota/utils/TrytesConverter.java b/src/main/java/jota/utils/TrytesConverter.java new file mode 100644 index 0000000..4751b4a --- /dev/null +++ b/src/main/java/jota/utils/TrytesConverter.java @@ -0,0 +1,90 @@ +package jota.utils; + +/** + * Created by pinpong on 01.12.16. + */ +public class TrytesConverter { + + /** + * Conversion of ascii encoded bytes to trytes. + * Input is a string (can be stringified JSON object), return value is Trytes + *

+ * How the conversion works: + * 2 Trytes === 1 Byte + * There are a total of 27 different tryte values: 9ABCDEFGHIJKLMNOPQRSTUVWXYZ + *

+ * 1. We get the decimal value of an individual ASCII character + * 2. From the decimal value, we then derive the two tryte values by basically calculating the tryte equivalent (e.g. 100 === 19 + 3 * 27) + * a. The first tryte value is the decimal value modulo 27 (27 trytes) + * b. The second value is the remainder (decimal value - first value), divided by 27 + * 3. The two values returned from Step 2. are then input as indices into the available values list ('9ABCDEFGHIJKLMNOPQRSTUVWXYZ') to get the correct tryte value + *

+ * EXAMPLES + * Lets say we want to convert the ASCII character "Z". + * 1. 'Z' has a decimal value of 90. + * 2. 90 can be represented as 9 + 3 * 27. To make it simpler: + * a. First value: 90 modulo 27 is 9. This is now our first value + * b. Second value: (90 - 9) / 27 is 3. This is our second value. + * 3. Our two values are now 9 and 3. To get the tryte value now we simply insert it as indices into '9ABCDEFGHIJKLMNOPQRSTUVWXYZ' + * a. The first tryte value is '9ABCDEFGHIJKLMNOPQRSTUVWXYZ'[9] === "I" + * b. The second tryte value is '9ABCDEFGHIJKLMNOPQRSTUVWXYZ'[3] === "C" + * Our tryte pair is "IC" + *

+ * RESULT: + * The ASCII char "Z" is represented as "IC" in trytes. + */ + + public static String toTrytes(String inputString) { + + String trytes = ""; + + for (int i = 0; i < inputString.length(); i++) { + + char asciiValue = inputString.charAt(i); + + // If not recognizable ASCII character, replace with space + if (asciiValue > 255) { + asciiValue = 32; + } + + int firstValue = asciiValue % 27; + int secondValue = (asciiValue - firstValue) / 27; + + String trytesValue = String.valueOf(Constants.TRYTE_ALPHABET.charAt(firstValue) + String.valueOf(Constants.TRYTE_ALPHABET.charAt(secondValue))); + + trytes += trytesValue; + } + + return trytes; + } + + /** + * Trytes to bytes + * Reverse operation from the byteToTrytes function in send.js + * 2 Trytes == 1 Byte + * We assume that the trytes are a JSON encoded object thus for our encoding: + * First character = { + * Last character = } + * Everything after that is 9's padding + */ + + public static String toString(String inputTrytes) { + + String string = ""; + + for (int i = 0; i < inputTrytes.length(); i += 2) { + // get a trytes pair + + int firstValue = Constants.TRYTE_ALPHABET.indexOf(inputTrytes.charAt(i)); + int secondValue = Constants.TRYTE_ALPHABET.indexOf(inputTrytes.charAt(i + 1)); + + int decimalValue = firstValue + secondValue * 27; + + String character = Character.toString((char) decimalValue); + + string += character; + } + + return string; + } +} diff --git a/src/test/java/jota/AddressGenerationTest.java b/src/test/java/jota/AddressGenerationTest.java new file mode 100644 index 0000000..a9cc6ce --- /dev/null +++ b/src/test/java/jota/AddressGenerationTest.java @@ -0,0 +1,20 @@ +package jota; + +import jota.utils.IotaAPIUtils; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * Created by Adrian on 02.12.2016. + */ +public class AddressGenerationTest { + private static String TEST_SEED = "ZEB99QTOMYDSKIFCXTLTVSWQFKO9CRKQKMRDR9HWVOVSGZMWPFQIMSCXXWUULHD9MZKMFJZAYZHZYA9VZ"; + private static String FIRST_ADDRESS = "LCZXWAQUHBXST9IEPPMJICTWLKJA9HVASXWDIRCVNM9TUAGZY9SRRJLZMZQIZKBAESXXNABFATUAYQYYW"; + + @Test + public void shouldAddChecksum() { + assertEquals(IotaAPIUtils.getNewAddress(TEST_SEED,0),FIRST_ADDRESS); + } + +} diff --git a/src/test/java/jota/ChecksumTest.java b/src/test/java/jota/ChecksumTest.java new file mode 100644 index 0000000..2efaec0 --- /dev/null +++ b/src/test/java/jota/ChecksumTest.java @@ -0,0 +1,26 @@ +package jota; + +import jota.utils.Checksum; +import jota.utils.InputValidator; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * Created by pinpong on 02.12.16. + */ +public class ChecksumTest { + + private static final String TEST_ADDRESS_WITHOUT_CHECKSUM = "RVORZ9SIIP9RCYMREUIXXVPQIPHVCNPQ9HZWYKFWYWZRE9JQKG9REPKIASHUUECPSQO9JT9XNMVKWYGVA"; + private static final String TEST_ADDRESS_WITH_CHECKSUM = "RVORZ9SIIP9RCYMREUIXXVPQIPHVCNPQ9HZWYKFWYWZRE9JQKG9REPKIASHUUECPSQO9JT9XNMVKWYGVAFOXM9MUBX"; + + @Test + public void shouldAddChecksum() { + assertEquals(Checksum.addChecksum(TEST_ADDRESS_WITHOUT_CHECKSUM), TEST_ADDRESS_WITH_CHECKSUM); + } + + @Test + public void shouldRemoveChecksum() { + assertEquals(Checksum.removeChecksum(TEST_ADDRESS_WITH_CHECKSUM), TEST_ADDRESS_WITHOUT_CHECKSUM); + } +} diff --git a/src/test/java/jota/InputValidatorTest.java b/src/test/java/jota/InputValidatorTest.java new file mode 100644 index 0000000..5f4795e --- /dev/null +++ b/src/test/java/jota/InputValidatorTest.java @@ -0,0 +1,30 @@ +package jota; + +import jota.utils.InputValidator; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * Created by pinpong on 02.12.16. + */ +public class InputValidatorTest { + + private static final String TEST_ADDRESS_WITHOUT_CHECKSUM = "PNGMCSNRCTRHCHPXYTPKEJYPCOWKOMRXZFHH9N9VDIKMNVAZCMIYRHVJIAZARZTUETJVFDMBEBIQE9QTHBFWDAOEFA"; + private static final String TEST_TRYTES = "BYSWEAUTWXHXZ9YBZISEK9LUHWGMHXCGEVNZHRLUWQFCUSDXZHOFHWHL9MQPVJXXZLIXPXPXF9KYEREFSKCPKYIIKPZVLHUTDFQKKVVBBN9ATTLPCNPJDWDEVIYYLGPZGCWXOBDXMLJC9VO9QXTTBLAXTTBFUAROYEGQIVB9MJWJKXJMCUPTWAUGFZBTZCSJVRBGMYXTVBDDS9MYUJCPZ9YDWWQNIPUAIJXXSNLKUBSCOIJPCLEFPOXFJREXQCUVUMKSDOVQGGHRNILCO9GNCLWFM9APMNMWYASHXQAYBEXF9QRIHIBHYEJOYHRQJAOKAQ9AJJFQ9WEIWIJOTZATIBOXQLBMIJU9PCGBLVDDVFP9CFFSXTDUXMEGOOFXWRTLFGV9XXMYWEMGQEEEDBTIJ9OJOXFAPFQXCDAXOUDMLVYRMRLUDBETOLRJQAEDDLNVIRQJUBZBO9CCFDHIX9MSQCWYAXJVWHCUPTRSXJDESISQPRKZAFKFRULCGVRSBLVFOPEYLEE99JD9SEBALQINPDAZHFAB9RNBH9AZWIJOTLBZVIEJIAYGMC9AZGNFWGRSWAXTYSXVROVNKCOQQIWGPNQZKHUNODGYADPYLZZZUQRTJRTODOUKAOITNOMWNGHJBBA99QUMBHRENGBHTH9KHUAOXBVIVDVYYZMSEYSJWIOGGXZVRGN999EEGQMCOYVJQRIRROMPCQBLDYIGQO9AMORPYFSSUGACOJXGAQSPDY9YWRRPESNXXBDQ9OZOXVIOMLGTSWAMKMTDRSPGJKGBXQIVNRJRFRYEZ9VJDLHIKPSKMYC9YEGHFDS9SGVDHRIXBEMLFIINOHVPXIFAZCJKBHVMQZEVWCOSNWQRDYWVAIBLSCBGESJUIBWZECPUCAYAWMTQKRMCHONIPKJYYTEGZCJYCT9ABRWTJLRQXKMWY9GWZMHYZNWPXULNZAPVQLPMYQZCYNEPOCGOHBJUZLZDPIXVHLDMQYJUUBEDXXPXFLNRGIPWBRNQQZJSGSJTTYHIGGFAWJVXWL9THTPWOOHTNQWCNYOYZXALHAZXVMIZE9WMQUDCHDJMIBWKTYH9AC9AFOT9DPCADCV9ZWUTE9QNOMSZPTZDJLJZCJGHXUNBJFUBJWQUEZDMHXGBPTNSPZBR9TGSKVOHMOQSWPGFLSWNESFKSAZY9HHERAXALZCABFYPOVLAHMIHVDBGKUMDXC9WHHTIRYHZVWNXSVQUWCR9M9RAGMFEZZKZ9XEOQGOSLFQCHHOKLDSA9QCMDGCGMRYJZLBVIFOLBIJPROKMHOYTBTJIWUZWJMCTKCJKKTR9LCVYPVJI9AHGI9JOWMIWZAGMLDFJA9WU9QAMEFGABIBEZNNAL9OXSBFLOEHKDGHWFQSHMPLYFCNXAAZYJLMQDEYRGL9QKCEUEJ9LLVUOINVSZZQHCIKPAGMT9CAYIIMTTBCPKWTYHOJIIY9GYNPAJNUJ9BKYYXSV9JSPEXYMCFAIKTGNRSQGUNIYZCRT9FOWENSZQPD9ALUPYYAVICHVYELYFPUYDTWUSWNIYFXPX9MICCCOOZIWRNJIDALWGWRATGLJXNAYTNIZWQ9YTVDBOFZRKO9CFWRPAQQRXTPACOWCPRLYRYSJARRKSQPR9TCFXDVIXLP9XVL99ERRDSOHBFJDJQQGGGCZNDQ9NYCTQJWVZIAELCRBJJFDMCNZU9FIZRPGNURTXOCDSQGXTQHKHUECGWFUUYS9J9NYQ9U9P9UUP9YMZHWWWCIASCFLCMSKTELZWUGCDE9YOKVOVKTAYPHDF9ZCCQAYPJIJNGSHUIHHCOSSOOBUDOKE9CJZGYSSGNCQJVBEFTZFJ9SQUHOASKRRGBSHWKBCBWBTJHOGQ9WOMQFHWJVEG9NYX9KWBTCAIXNXHEBDIOFO9ALYMFGRICLCKKLG9FOBOX9PDWNQRGHBKHGKKRLWTBEQMCWQRLHAVYYZDIIPKVQTHYTWQMTOACXZOQCDTJTBAAUWXSGJF9PNQIJ9AJRUMUVCPWYVYVARKR9RKGOUHHNKNVGGPDDLGKPQNOYHNKAVVKCXWXOQPZNSLATUJT9AUWRMPPSWHSTTYDFAQDXOCYTZHOYYGAIM9CELMZ9AZPWB9MJXGHOKDNNSZVUDAGXTJJSSZCPZVPZBYNNTUQABSXQWZCHDQSLGK9UOHCFKBIBNETK999999999999999999999999999999999999999999999999999999999999999999999999999999999NOXDXXKUDWLOFJLIPQIBRBMGDYCPGDNLQOLQS99EQYKBIU9VHCJVIPFUYCQDNY9APGEVYLCENJIOBLWNB999999999XKBRHUD99C99999999NKZKEKWLDKMJCI9N9XQOLWEPAYWSH9999999999999999999999999KDDTGZLIPBNZKMLTOLOXQVNGLASESDQVPTXALEKRMIOHQLUHD9ELQDBQETS9QFGTYOYWLNTSKKMVJAUXSIROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999IROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999"; + + @Test + public void shouldIsAddress() { + assertEquals(InputValidator.isAddress(TEST_ADDRESS_WITHOUT_CHECKSUM), true); + } + + @Test + public void shouldCheckAddress() { + assertEquals(InputValidator.checkAddress(TEST_ADDRESS_WITHOUT_CHECKSUM), true); + } + + @Test + public void shouldIsTrytes() { + assertEquals(InputValidator.isTrytes(TEST_TRYTES, TEST_TRYTES.length()), true); + } +} diff --git a/src/test/java/jota/IotaAPIProxyTest.java b/src/test/java/jota/IotaAPIProxyTest.java index 5a9d1e4..cb5dda3 100644 --- a/src/test/java/jota/IotaAPIProxyTest.java +++ b/src/test/java/jota/IotaAPIProxyTest.java @@ -20,7 +20,8 @@ public class IotaAPIProxyTest { private static Gson gson = new GsonBuilder().create(); private static final String TEST_SEED = "AAA999999999999999999999999999999999999999999999999999999999999999999999999999999"; - private static final String TEST_ADDRESS = "RVORZ9SIIP9RCYMREUIXXVPQIPHVCNPQ9HZWYKFWYWZRE9JQKG9REPKIASHUUECPSQO9JT9XNMVKWYGVAZETAIRPTM"; + private static final String TEST_ADDRESS_WITHOUT_CHECKSUM = "PNGMCSNRCTRHCHPXYTPKEJYPCOWKOMRXZFHH9N9VDIKMNVAZCMIYRHVJIAZARZTUETJVFDMBEBIQE9QTH"; + private static final String TEST_ADDRESS_WITH_CHECKSUM = "PNGMCSNRCTRHCHPXYTPKEJYPCOWKOMRXZFHH9N9VDIKMNVAZCMIYRHVJIAZARZTUETJVFDMBEBIQE9QTHBFWDAOEFA"; private static final String TEST_HASH = "OAATQS9VQLSXCLDJVJJVYUGONXAXOFMJOZNSYWRZSWECMXAQQURHQBJNLD9IOFEPGZEPEMPXCIVRX9999"; private static final String TEST_TRYTES = "BYSWEAUTWXHXZ9YBZISEK9LUHWGMHXCGEVNZHRLUWQFCUSDXZHOFHWHL9MQPVJXXZLIXPXPXF9KYEREFSKCPKYIIKPZVLHUTDFQKKVVBBN9ATTLPCNPJDWDEVIYYLGPZGCWXOBDXMLJC9VO9QXTTBLAXTTBFUAROYEGQIVB9MJWJKXJMCUPTWAUGFZBTZCSJVRBGMYXTVBDDS9MYUJCPZ9YDWWQNIPUAIJXXSNLKUBSCOIJPCLEFPOXFJREXQCUVUMKSDOVQGGHRNILCO9GNCLWFM9APMNMWYASHXQAYBEXF9QRIHIBHYEJOYHRQJAOKAQ9AJJFQ9WEIWIJOTZATIBOXQLBMIJU9PCGBLVDDVFP9CFFSXTDUXMEGOOFXWRTLFGV9XXMYWEMGQEEEDBTIJ9OJOXFAPFQXCDAXOUDMLVYRMRLUDBETOLRJQAEDDLNVIRQJUBZBO9CCFDHIX9MSQCWYAXJVWHCUPTRSXJDESISQPRKZAFKFRULCGVRSBLVFOPEYLEE99JD9SEBALQINPDAZHFAB9RNBH9AZWIJOTLBZVIEJIAYGMC9AZGNFWGRSWAXTYSXVROVNKCOQQIWGPNQZKHUNODGYADPYLZZZUQRTJRTODOUKAOITNOMWNGHJBBA99QUMBHRENGBHTH9KHUAOXBVIVDVYYZMSEYSJWIOGGXZVRGN999EEGQMCOYVJQRIRROMPCQBLDYIGQO9AMORPYFSSUGACOJXGAQSPDY9YWRRPESNXXBDQ9OZOXVIOMLGTSWAMKMTDRSPGJKGBXQIVNRJRFRYEZ9VJDLHIKPSKMYC9YEGHFDS9SGVDHRIXBEMLFIINOHVPXIFAZCJKBHVMQZEVWCOSNWQRDYWVAIBLSCBGESJUIBWZECPUCAYAWMTQKRMCHONIPKJYYTEGZCJYCT9ABRWTJLRQXKMWY9GWZMHYZNWPXULNZAPVQLPMYQZCYNEPOCGOHBJUZLZDPIXVHLDMQYJUUBEDXXPXFLNRGIPWBRNQQZJSGSJTTYHIGGFAWJVXWL9THTPWOOHTNQWCNYOYZXALHAZXVMIZE9WMQUDCHDJMIBWKTYH9AC9AFOT9DPCADCV9ZWUTE9QNOMSZPTZDJLJZCJGHXUNBJFUBJWQUEZDMHXGBPTNSPZBR9TGSKVOHMOQSWPGFLSWNESFKSAZY9HHERAXALZCABFYPOVLAHMIHVDBGKUMDXC9WHHTIRYHZVWNXSVQUWCR9M9RAGMFEZZKZ9XEOQGOSLFQCHHOKLDSA9QCMDGCGMRYJZLBVIFOLBIJPROKMHOYTBTJIWUZWJMCTKCJKKTR9LCVYPVJI9AHGI9JOWMIWZAGMLDFJA9WU9QAMEFGABIBEZNNAL9OXSBFLOEHKDGHWFQSHMPLYFCNXAAZYJLMQDEYRGL9QKCEUEJ9LLVUOINVSZZQHCIKPAGMT9CAYIIMTTBCPKWTYHOJIIY9GYNPAJNUJ9BKYYXSV9JSPEXYMCFAIKTGNRSQGUNIYZCRT9FOWENSZQPD9ALUPYYAVICHVYELYFPUYDTWUSWNIYFXPX9MICCCOOZIWRNJIDALWGWRATGLJXNAYTNIZWQ9YTVDBOFZRKO9CFWRPAQQRXTPACOWCPRLYRYSJARRKSQPR9TCFXDVIXLP9XVL99ERRDSOHBFJDJQQGGGCZNDQ9NYCTQJWVZIAELCRBJJFDMCNZU9FIZRPGNURTXOCDSQGXTQHKHUECGWFUUYS9J9NYQ9U9P9UUP9YMZHWWWCIASCFLCMSKTELZWUGCDE9YOKVOVKTAYPHDF9ZCCQAYPJIJNGSHUIHHCOSSOOBUDOKE9CJZGYSSGNCQJVBEFTZFJ9SQUHOASKRRGBSHWKBCBWBTJHOGQ9WOMQFHWJVEG9NYX9KWBTCAIXNXHEBDIOFO9ALYMFGRICLCKKLG9FOBOX9PDWNQRGHBKHGKKRLWTBEQMCWQRLHAVYYZDIIPKVQTHYTWQMTOACXZOQCDTJTBAAUWXSGJF9PNQIJ9AJRUMUVCPWYVYVARKR9RKGOUHHNKNVGGPDDLGKPQNOYHNKAVVKCXWXOQPZNSLATUJT9AUWRMPPSWHSTTYDFAQDXOCYTZHOYYGAIM9CELMZ9AZPWB9MJXGHOKDNNSZVUDAGXTJJSSZCPZVPZBYNNTUQABSXQWZCHDQSLGK9UOHCFKBIBNETK999999999999999999999999999999999999999999999999999999999999999999999999999999999NOXDXXKUDWLOFJLIPQIBRBMGDYCPGDNLQOLQS99EQYKBIU9VHCJVIPFUYCQDNY9APGEVYLCENJIOBLWNB999999999XKBRHUD99C99999999NKZKEKWLDKMJCI9N9XQOLWEPAYWSH9999999999999999999999999KDDTGZLIPBNZKMLTOLOXQVNGLASESDQVPTXALEKRMIOHQLUHD9ELQDBQETS9QFGTYOYWLNTSKKMVJAUXSIROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999IROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999"; private static final String TEST_MILESTONE = "SMYMAKKPSUKCKDRUEYCGZJTYCZ9HHDMDUWBAPXARGURPQRHTAJDASRWMIDTPTBNDKDEFBUTBGGAFX9999"; @@ -65,7 +66,7 @@ public class IotaAPIProxyTest { @Test public void shouldFindTransactionsByAddresses() { - FindTransactionResponse trans = proxy.findTransactionsByAddresses(TEST_ADDRESS); + FindTransactionResponse trans = proxy.findTransactionsByAddresses(TEST_ADDRESS_WITH_CHECKSUM); System.err.println(gson.toJson(trans)); assertThat(trans, IsNull.notNullValue()); } @@ -99,7 +100,7 @@ public class IotaAPIProxyTest { @Test public void shouldGetInclusionStates() { - GetInclusionStateResponse res = proxy.getInclusionStates(new String[]{TEST_ADDRESS}, + GetInclusionStateResponse res = proxy.getInclusionStates(new String[]{TEST_ADDRESS_WITH_CHECKSUM}, new String[]{"123"}); assertThat(res, IsNull.notNullValue()); } @@ -128,5 +129,4 @@ public class IotaAPIProxyTest { GetNewAddressResponse res = IotaAPIUtils.getNewAddress(TEST_SEED, 2); System.err.println(res); } - } \ No newline at end of file diff --git a/src/test/java/jota/TrytesConverterTest.java b/src/test/java/jota/TrytesConverterTest.java new file mode 100644 index 0000000..7741cff --- /dev/null +++ b/src/test/java/jota/TrytesConverterTest.java @@ -0,0 +1,21 @@ +package jota; + +import jota.utils.TrytesConverter; +import org.junit.Test; +import static org.junit.Assert.assertEquals; + +/** + * Created by pinpong on 01.12.16. + */ +public class TrytesConverterTest { + + @Test + public void shouldConvertStringToTrytes() { + assertEquals(TrytesConverter.toTrytes("Z"), "IC"); + } + @Test + public void shouldConvertTrytesToString() { + assertEquals(TrytesConverter.toString("IC"), "Z"); + } + +} From 2cb221c227324ea1be653fb5b447892545569e25 Mon Sep 17 00:00:00 2001 From: davassi Date: Sat, 3 Dec 2016 00:01:21 +0100 Subject: [PATCH 2/5] updated getNewAddress Test --- src/main/java/jota/utils/IotaAPIUtils.java | 9 +++++---- src/test/java/jota/IotaAPIProxyTest.java | 6 ++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/jota/utils/IotaAPIUtils.java b/src/main/java/jota/utils/IotaAPIUtils.java index 5bcc294..bc26d80 100644 --- a/src/main/java/jota/utils/IotaAPIUtils.java +++ b/src/main/java/jota/utils/IotaAPIUtils.java @@ -18,12 +18,13 @@ public class IotaAPIUtils { public static GetNewAddressResponse getNewAddress(final String seed, final int index) { final int[] key = Signing.key(Converter.trits(seed), index, 2); - System.out.println("Length = "+ key.length ); + log.debug("key Length = {}", key.length ); + final int[] digests = Signing.digests(key); - System.out.println("Length = "+ digests.length ); - + log.debug("digests Length = {}", digests.length ); + final int[] addressTrits = Signing.address(digests); - System.out.println("Length = "+ addressTrits.length ); + log.debug("addressTrits Length = {}", addressTrits.length ); final String address = Converter.trytes(addressTrits); diff --git a/src/test/java/jota/IotaAPIProxyTest.java b/src/test/java/jota/IotaAPIProxyTest.java index cb5dda3..bac2d3d 100644 --- a/src/test/java/jota/IotaAPIProxyTest.java +++ b/src/test/java/jota/IotaAPIProxyTest.java @@ -4,6 +4,8 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import jota.dto.response.*; import jota.utils.IotaAPIUtils; + +import org.hamcrest.core.Is; import org.hamcrest.core.IsNull; import org.junit.Before; import org.junit.Test; @@ -126,7 +128,7 @@ public class IotaAPIProxyTest { @Test public void shouldCreateANewAddress() { - GetNewAddressResponse res = IotaAPIUtils.getNewAddress(TEST_SEED, 2); - System.err.println(res); + GetNewAddressResponse res = IotaAPIUtils.getNewAddress(TEST_SEED, 4); + assertThat(res.getAddress(), Is.is("GBPQGDMZ99FRNUBLCCIAXOEWNED9T9AMEHCGMMMFYTP9VINCVSNPAXUXBHQ9DIPTOOTP9XXUAUBDBMWMP")); } } \ No newline at end of file From cad499448b589658b772fdde7c90d155799b46a0 Mon Sep 17 00:00:00 2001 From: Gianluigi Davassi Date: Mon, 5 Dec 2016 23:49:35 +0100 Subject: [PATCH 3/5] Pinpong PR + refactoring (#7) * implemented toTrytes and toStrings * added TrytesConverterTest * WIP * added checksum calculation, pls review * updated checksum * updated tests * fixed getnewaddress * fixed test * updated node config * updated tests * newAddress * improved newAddress --- src/main/java/jota/IotaAPIProxy.java | 4 +- .../dto/response/GetNewAddressResponse.java | 16 ++-- src/main/java/jota/utils/IotaAPIUtils.java | 85 +++++++++++++++++-- src/main/java/jota/utils/IotaUnits.java | 4 + src/main/java/jota/utils/Signing.java | 27 +++--- src/test/java/jota/ChecksumTest.java | 6 +- src/test/java/jota/IotaAPIProxyTest.java | 5 +- 7 files changed, 114 insertions(+), 33 deletions(-) diff --git a/src/main/java/jota/IotaAPIProxy.java b/src/main/java/jota/IotaAPIProxy.java index b742299..b1a07d3 100644 --- a/src/main/java/jota/IotaAPIProxy.java +++ b/src/main/java/jota/IotaAPIProxy.java @@ -195,8 +195,8 @@ public class IotaAPIProxy { return IotaAPIUtils.getBundle(transaction); } - public GetNewAddressResponse getNewAddress(String seed, Integer securityLevel) { - return IotaAPIUtils.getNewAddress(seed, securityLevel); + public GetNewAddressResponse getNewAddress(String seed, Integer index, boolean checksum, int total, boolean returnAll) { + return IotaAPIUtils.getNewAddress(seed, index, checksum, total, returnAll); } public static class Builder { diff --git a/src/main/java/jota/dto/response/GetNewAddressResponse.java b/src/main/java/jota/dto/response/GetNewAddressResponse.java index dab7d86..b54384d 100644 --- a/src/main/java/jota/dto/response/GetNewAddressResponse.java +++ b/src/main/java/jota/dto/response/GetNewAddressResponse.java @@ -1,16 +1,18 @@ package jota.dto.response; +import java.util.List; + public class GetNewAddressResponse extends AbstractResponse { - private String address; + private List addresses; - public String getAddress() { - return address; - } - - public static GetNewAddressResponse create(String address) { + public static GetNewAddressResponse create(List addresses) { GetNewAddressResponse res = new GetNewAddressResponse(); - res.address = address; + res.addresses = addresses; return res; } + + public List getAddress() { + return addresses; + } } diff --git a/src/main/java/jota/utils/IotaAPIUtils.java b/src/main/java/jota/utils/IotaAPIUtils.java index bc26d80..8713502 100644 --- a/src/main/java/jota/utils/IotaAPIUtils.java +++ b/src/main/java/jota/utils/IotaAPIUtils.java @@ -1,11 +1,16 @@ package jota.utils; +import jota.IotaAPIProxy; +import jota.dto.response.FindTransactionResponse; import jota.dto.response.GetBundleResponse; import jota.dto.response.GetNewAddressResponse; import org.apache.commons.lang3.NotImplementedException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; +import java.util.List; + /** * Client Side computation service * @@ -15,7 +20,75 @@ public class IotaAPIUtils { private static final Logger log = LoggerFactory.getLogger(IotaAPIUtils.class); - public static GetNewAddressResponse getNewAddress(final String seed, final int index) { + /** + * Generates a new address from a seed and returns the remainderAddress. + * This is either done deterministically, or by providing the index of the new remainderAddress + * + * @param seed Tryte-encoded seed. It should be noted that this seed is not transferred + * @param index Optional (default null). Key index to start search from. If the index is provided, the generation of the address is not deterministic. + * @param checksum Optional (default false). Adds 9-tryte address checksum + * @param total Optional (default 1)Total number of addresses to generate + * @param returnAll If true, it returns all addresses which were deterministically generated (until findTransactions returns null) + * @return an array of strings with the specifed number of addresses + */ + + public static GetNewAddressResponse getNewAddress(final String seed, final int index, final boolean checksum, final int total, final boolean returnAll) { + + final List allAddresses = new ArrayList<>(); + // Case 1: total + // + // If total number of addresses to generate is supplied, simply generate + // and return the list of all addresses + // + // + if (total != 0) { + // Increase index with each iteration + for (int i = index; i < index + total; i++) { + allAddresses.add(newAddress(seed, i, checksum)); + } + } + // Case 2: no total provided + // + // Continue calling findTransactions to see if address was already created + // if null, return list of addresses + // + else { + + // TODO init with params + IotaAPIProxy proxy = new IotaAPIProxy.Builder().build(); + + for (int i = index; ; i++) { + String newAddress = newAddress(seed, i, checksum); + + FindTransactionResponse response = proxy.findTransactions(null, new String[]{newAddress}, null, null); + + // If returnAll, return list of allAddresses + // else return only the last address that was generated + + if (!returnAll) { + allAddresses.clear(); + } + + allAddresses.add(newAddress); + + if (response.getHashes().length == 0) { + break; + } + } + } + + return GetNewAddressResponse.create(allAddresses); + } + + /** + * Generates a new address + * + * @param seed + * @param index + * @param checksum + * @return an String with address + */ + private static String newAddress(String seed, int index, boolean checksum) { final int[] key = Signing.key(Converter.trits(seed), index, 2); log.debug("key Length = {}", key.length ); @@ -24,14 +97,16 @@ public class IotaAPIUtils { log.debug("digests Length = {}", digests.length ); final int[] addressTrits = Signing.address(digests); - log.debug("addressTrits Length = {}", addressTrits.length ); + String address = Converter.trytes(addressTrits); - final String address = Converter.trytes(addressTrits); - - return GetNewAddressResponse.create(address); + if (checksum) { + address = Checksum.addChecksum(address); + } + return address; } public static GetBundleResponse getBundle(final String transaction) { throw new NotImplementedException("Not yet implemented"); } } + diff --git a/src/main/java/jota/utils/IotaUnits.java b/src/main/java/jota/utils/IotaUnits.java index f3fbfe0..28e52f3 100644 --- a/src/main/java/jota/utils/IotaUnits.java +++ b/src/main/java/jota/utils/IotaUnits.java @@ -3,6 +3,10 @@ package jota.utils; /** * Created by pinpong on 30.11.16. */ + +/** + * Table of IOTA units based off of the standard system of Units + **/ public enum IotaUnits { IOTA("i", 0), KILO_IOTA("Ki", 3), diff --git a/src/main/java/jota/utils/Signing.java b/src/main/java/jota/utils/Signing.java index 3cff61c..025529e 100644 --- a/src/main/java/jota/utils/Signing.java +++ b/src/main/java/jota/utils/Signing.java @@ -8,27 +8,25 @@ public class Signing { static int[] key(int[] seed, int index, int length) { - final int[] subseed = seed; - for (int i = 0; i < index; i++) { for (int j = 0; j < 243; j++) { - if (++subseed[j] > 1) { - subseed[j] = -1; + if (++seed[j] > 1) { + seed[j] = -1; } else { break; } } } - Curl curl = new Curl(); + final Curl curl = new Curl(); curl.reset(); - curl.absorb(subseed, 0, subseed.length); - curl.squeeze(subseed, 0, subseed.length); + curl.absorb(seed, 0, seed.length); + curl.squeeze(seed, 0, seed.length); curl.reset(); - curl.absorb(subseed, 0, subseed.length); + curl.absorb(seed, 0, seed.length); - List key = new ArrayList<>(); - int[] buffer = new int[subseed.length]; + final List key = new ArrayList<>(); + int[] buffer = new int[seed.length]; int offset = 0; while (length-- > 0) { @@ -70,19 +68,14 @@ public class Signing { curl.absorb(buffer, 0, buffer.length); curl.squeeze(buffer, 0, buffer.length); } - for (int k = 0; k < 243; k++) { - - keyFragment[j * 243 + k] = buffer[k]; - } + System.arraycopy(buffer, 0, keyFragment, j * 243, 243); } curl.reset(); curl.absorb(keyFragment, 0, keyFragment.length); curl.squeeze(buffer, 0, buffer.length); - for (int j = 0; j < 243; j++) { - digests[i * 243 + j] = buffer[j]; - } + System.arraycopy(buffer, 0, digests, i * 243, 243); } return digests; } diff --git a/src/test/java/jota/ChecksumTest.java b/src/test/java/jota/ChecksumTest.java index 2efaec0..1413f69 100644 --- a/src/test/java/jota/ChecksumTest.java +++ b/src/test/java/jota/ChecksumTest.java @@ -1,7 +1,6 @@ package jota; import jota.utils.Checksum; -import jota.utils.InputValidator; import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -23,4 +22,9 @@ public class ChecksumTest { public void shouldRemoveChecksum() { assertEquals(Checksum.removeChecksum(TEST_ADDRESS_WITH_CHECKSUM), TEST_ADDRESS_WITHOUT_CHECKSUM); } + + @Test + public void shouldIsValidChecksum() { + assertEquals(Checksum.isValidChecksum(TEST_ADDRESS_WITH_CHECKSUM), true); + } } diff --git a/src/test/java/jota/IotaAPIProxyTest.java b/src/test/java/jota/IotaAPIProxyTest.java index bac2d3d..b588479 100644 --- a/src/test/java/jota/IotaAPIProxyTest.java +++ b/src/test/java/jota/IotaAPIProxyTest.java @@ -10,6 +10,9 @@ import org.hamcrest.core.IsNull; import org.junit.Before; import org.junit.Test; +import java.util.Collections; + +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; /** @@ -128,7 +131,7 @@ public class IotaAPIProxyTest { @Test public void shouldCreateANewAddress() { - GetNewAddressResponse res = IotaAPIUtils.getNewAddress(TEST_SEED, 4); + final GetNewAddressResponse res = IotaAPIUtils.getNewAddress(TEST_SEED, 4); assertThat(res.getAddress(), Is.is("GBPQGDMZ99FRNUBLCCIAXOEWNED9T9AMEHCGMMMFYTP9VINCVSNPAXUXBHQ9DIPTOOTP9XXUAUBDBMWMP")); } } \ No newline at end of file From d0dbff07fe1b813e694643e2ca13147a3a7a6c43 Mon Sep 17 00:00:00 2001 From: davassi Date: Tue, 6 Dec 2016 00:21:39 +0100 Subject: [PATCH 4/5] refactoring, moving getNewAddress to Proxy class --- src/main/java/jota/IotaAPIProxy.java | 60 ++++++++++++++-- src/main/java/jota/utils/Checksum.java | 5 +- src/main/java/jota/utils/InputValidator.java | 3 +- src/main/java/jota/utils/IotaAPIUtils.java | 71 ++----------------- src/main/java/jota/utils/TrytesConverter.java | 6 +- src/test/java/jota/AddressGenerationTest.java | 2 +- src/test/java/jota/IotaAPIProxyTest.java | 6 +- 7 files changed, 73 insertions(+), 80 deletions(-) diff --git a/src/main/java/jota/IotaAPIProxy.java b/src/main/java/jota/IotaAPIProxy.java index b1a07d3..617de2e 100644 --- a/src/main/java/jota/IotaAPIProxy.java +++ b/src/main/java/jota/IotaAPIProxy.java @@ -14,7 +14,9 @@ import retrofit2.converter.gson.GsonConverterFactory; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import java.util.Properties; import java.util.concurrent.TimeUnit; @@ -184,19 +186,69 @@ public class IotaAPIProxy { return wrapCheckedException(res).body(); } - // end of proxied calls. - public BroadcastTransactionsResponse broadcastTransactions(String... trytes) { final Call res = service.broadcastTransactions(IotaBroadcastTransactionRequest.createBroadcastTransactionsRequest(trytes)); return wrapCheckedException(res).body(); } + // end of proxied calls. + public GetBundleResponse getBundle(String transaction) { return IotaAPIUtils.getBundle(transaction); } + + /** + * Generates a new address from a seed and returns the remainderAddress. + * This is either done deterministically, or by providing the index of the new remainderAddress + * + * @param seed Tryte-encoded seed. It should be noted that this seed is not transferred + * @param index Optional (default null). Key index to start search from. If the index is provided, the generation of the address is not deterministic. + * @param checksum Optional (default false). Adds 9-tryte address checksum + * @param total Optional (default 1)Total number of addresses to generate + * @param returnAll If true, it returns all addresses which were deterministically generated (until findTransactions returns null) + * @return an array of strings with the specifed number of addresses + */ - public GetNewAddressResponse getNewAddress(String seed, Integer index, boolean checksum, int total, boolean returnAll) { - return IotaAPIUtils.getNewAddress(seed, index, checksum, total, returnAll); + public GetNewAddressResponse getNewAddress(final String seed, final int index, final boolean checksum, final int total, final boolean returnAll) { + + final List allAddresses = new ArrayList<>(); + // Case 1: total + // + // If total number of addresses to generate is supplied, simply generate + // and return the list of all addresses + + if (total != 0) { + // Increase index with each iteration + for (int i = index; i < index + total; i++) { + allAddresses.add(IotaAPIUtils.newAddress(seed, i, checksum)); + } + return GetNewAddressResponse.create(allAddresses); + } + + // Case 2: no total provided + // + // Continue calling findTransactions to see if address was already created + // if null, return list of addresses + + for (int i = index; ; i++) { + String newAddress = IotaAPIUtils.newAddress(seed, i, checksum); + + final FindTransactionResponse response = findTransactionsByAddresses(new String[]{newAddress}); + + allAddresses.add(newAddress); + + if (response.getHashes().length == 0) { + break; + } + } + + // If returnAll, return list of allAddresses + // else return only the last address that was generated + if (!returnAll) { + allAddresses.subList(0, allAddresses.size()-1).clear(); + } + + return GetNewAddressResponse.create(allAddresses); } public static class Builder { diff --git a/src/main/java/jota/utils/Checksum.java b/src/main/java/jota/utils/Checksum.java index 47e5567..10a49de 100644 --- a/src/main/java/jota/utils/Checksum.java +++ b/src/main/java/jota/utils/Checksum.java @@ -1,5 +1,7 @@ package jota.utils; +import org.apache.commons.lang3.StringUtils; + /** * Created by pinpong on 02.12.16. */ @@ -15,7 +17,8 @@ public class Checksum { public static String removeChecksum(String addressWithChecksum) { if (isAddressWithChecksum(addressWithChecksum)) { return getAddress(addressWithChecksum); - } else return ""; + } + return StringUtils.EMPTY; } private static String getAddress(String addressWithChecksum) { diff --git a/src/main/java/jota/utils/InputValidator.java b/src/main/java/jota/utils/InputValidator.java index 277a0ca..ed5f2ef 100644 --- a/src/main/java/jota/utils/InputValidator.java +++ b/src/main/java/jota/utils/InputValidator.java @@ -11,8 +11,9 @@ public class InputValidator { } public static boolean checkAddress(String address) { - if (!isAddress(address)) + if (!isAddress(address)) { throw new RuntimeException("Invalid address: " + address); + } return true; } diff --git a/src/main/java/jota/utils/IotaAPIUtils.java b/src/main/java/jota/utils/IotaAPIUtils.java index 8713502..d53fba5 100644 --- a/src/main/java/jota/utils/IotaAPIUtils.java +++ b/src/main/java/jota/utils/IotaAPIUtils.java @@ -1,15 +1,10 @@ package jota.utils; -import jota.IotaAPIProxy; -import jota.dto.response.FindTransactionResponse; -import jota.dto.response.GetBundleResponse; -import jota.dto.response.GetNewAddressResponse; import org.apache.commons.lang3.NotImplementedException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.List; +import jota.dto.response.GetBundleResponse; /** * Client Side computation service @@ -20,66 +15,6 @@ public class IotaAPIUtils { private static final Logger log = LoggerFactory.getLogger(IotaAPIUtils.class); - /** - * Generates a new address from a seed and returns the remainderAddress. - * This is either done deterministically, or by providing the index of the new remainderAddress - * - * @param seed Tryte-encoded seed. It should be noted that this seed is not transferred - * @param index Optional (default null). Key index to start search from. If the index is provided, the generation of the address is not deterministic. - * @param checksum Optional (default false). Adds 9-tryte address checksum - * @param total Optional (default 1)Total number of addresses to generate - * @param returnAll If true, it returns all addresses which were deterministically generated (until findTransactions returns null) - * @return an array of strings with the specifed number of addresses - */ - - public static GetNewAddressResponse getNewAddress(final String seed, final int index, final boolean checksum, final int total, final boolean returnAll) { - - final List allAddresses = new ArrayList<>(); - // Case 1: total - // - // If total number of addresses to generate is supplied, simply generate - // and return the list of all addresses - // - // - if (total != 0) { - // Increase index with each iteration - for (int i = index; i < index + total; i++) { - allAddresses.add(newAddress(seed, i, checksum)); - } - } - // Case 2: no total provided - // - // Continue calling findTransactions to see if address was already created - // if null, return list of addresses - // - else { - - // TODO init with params - IotaAPIProxy proxy = new IotaAPIProxy.Builder().build(); - - for (int i = index; ; i++) { - String newAddress = newAddress(seed, i, checksum); - - FindTransactionResponse response = proxy.findTransactions(null, new String[]{newAddress}, null, null); - - // If returnAll, return list of allAddresses - // else return only the last address that was generated - - if (!returnAll) { - allAddresses.clear(); - } - - allAddresses.add(newAddress); - - if (response.getHashes().length == 0) { - break; - } - } - } - - return GetNewAddressResponse.create(allAddresses); - } - /** * Generates a new address * @@ -88,7 +23,7 @@ public class IotaAPIUtils { * @param checksum * @return an String with address */ - private static String newAddress(String seed, int index, boolean checksum) { + public static String newAddress(String seed, int index, boolean checksum) { final int[] key = Signing.key(Converter.trits(seed), index, 2); log.debug("key Length = {}", key.length ); @@ -97,6 +32,8 @@ public class IotaAPIUtils { log.debug("digests Length = {}", digests.length ); final int[] addressTrits = Signing.address(digests); + log.debug("addressTrits Length = {}", addressTrits.length ); + String address = Converter.trytes(addressTrits); if (checksum) { diff --git a/src/main/java/jota/utils/TrytesConverter.java b/src/main/java/jota/utils/TrytesConverter.java index 4751b4a..21f560e 100644 --- a/src/main/java/jota/utils/TrytesConverter.java +++ b/src/main/java/jota/utils/TrytesConverter.java @@ -36,7 +36,7 @@ public class TrytesConverter { public static String toTrytes(String inputString) { - String trytes = ""; + StringBuilder trytes = new StringBuilder(); for (int i = 0; i < inputString.length(); i++) { @@ -52,10 +52,10 @@ public class TrytesConverter { String trytesValue = String.valueOf(Constants.TRYTE_ALPHABET.charAt(firstValue) + String.valueOf(Constants.TRYTE_ALPHABET.charAt(secondValue))); - trytes += trytesValue; + trytes.append(trytesValue); } - return trytes; + return trytes.toString(); } /** diff --git a/src/test/java/jota/AddressGenerationTest.java b/src/test/java/jota/AddressGenerationTest.java index a9cc6ce..3dfddea 100644 --- a/src/test/java/jota/AddressGenerationTest.java +++ b/src/test/java/jota/AddressGenerationTest.java @@ -14,7 +14,7 @@ public class AddressGenerationTest { @Test public void shouldAddChecksum() { - assertEquals(IotaAPIUtils.getNewAddress(TEST_SEED,0),FIRST_ADDRESS); + assertEquals(IotaAPIUtils.newAddress(TEST_SEED,0, false),FIRST_ADDRESS); } } diff --git a/src/test/java/jota/IotaAPIProxyTest.java b/src/test/java/jota/IotaAPIProxyTest.java index b588479..6a153ab 100644 --- a/src/test/java/jota/IotaAPIProxyTest.java +++ b/src/test/java/jota/IotaAPIProxyTest.java @@ -129,9 +129,9 @@ public class IotaAPIProxyTest { assertThat(proxy, IsNull.notNullValue()); } - @Test + /*@Test TODO Fix me public void shouldCreateANewAddress() { - final GetNewAddressResponse res = IotaAPIUtils.getNewAddress(TEST_SEED, 4); + final GetNewAddressResponse res = proxy.newAddress(TEST_SEED, 4, false); assertThat(res.getAddress(), Is.is("GBPQGDMZ99FRNUBLCCIAXOEWNED9T9AMEHCGMMMFYTP9VINCVSNPAXUXBHQ9DIPTOOTP9XXUAUBDBMWMP")); - } + }*/ } \ No newline at end of file From 60d2664e04622c296ce2112b1da31810a7c1f0ee Mon Sep 17 00:00:00 2001 From: pinpong Date: Tue, 6 Dec 2016 21:45:41 +0100 Subject: [PATCH 5/5] updated tests --- src/main/java/jota/utils/IotaAPIUtils.java | 10 ++------ src/test/java/jota/AddressGenerationTest.java | 20 --------------- src/test/java/jota/IotaAPIProxyTest.java | 25 ++++++++----------- 3 files changed, 13 insertions(+), 42 deletions(-) delete mode 100644 src/test/java/jota/AddressGenerationTest.java diff --git a/src/main/java/jota/utils/IotaAPIUtils.java b/src/main/java/jota/utils/IotaAPIUtils.java index d53fba5..3da5c2d 100644 --- a/src/main/java/jota/utils/IotaAPIUtils.java +++ b/src/main/java/jota/utils/IotaAPIUtils.java @@ -1,11 +1,10 @@ package jota.utils; +import jota.dto.response.GetBundleResponse; import org.apache.commons.lang3.NotImplementedException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import jota.dto.response.GetBundleResponse; - /** * Client Side computation service * @@ -26,14 +25,9 @@ public class IotaAPIUtils { public static String newAddress(String seed, int index, boolean checksum) { final int[] key = Signing.key(Converter.trits(seed), index, 2); - log.debug("key Length = {}", key.length ); - final int[] digests = Signing.digests(key); - log.debug("digests Length = {}", digests.length ); - final int[] addressTrits = Signing.address(digests); - log.debug("addressTrits Length = {}", addressTrits.length ); - + String address = Converter.trytes(addressTrits); if (checksum) { diff --git a/src/test/java/jota/AddressGenerationTest.java b/src/test/java/jota/AddressGenerationTest.java deleted file mode 100644 index 3dfddea..0000000 --- a/src/test/java/jota/AddressGenerationTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package jota; - -import jota.utils.IotaAPIUtils; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -/** - * Created by Adrian on 02.12.2016. - */ -public class AddressGenerationTest { - private static String TEST_SEED = "ZEB99QTOMYDSKIFCXTLTVSWQFKO9CRKQKMRDR9HWVOVSGZMWPFQIMSCXXWUULHD9MZKMFJZAYZHZYA9VZ"; - private static String FIRST_ADDRESS = "LCZXWAQUHBXST9IEPPMJICTWLKJA9HVASXWDIRCVNM9TUAGZY9SRRJLZMZQIZKBAESXXNABFATUAYQYYW"; - - @Test - public void shouldAddChecksum() { - assertEquals(IotaAPIUtils.newAddress(TEST_SEED,0, false),FIRST_ADDRESS); - } - -} diff --git a/src/test/java/jota/IotaAPIProxyTest.java b/src/test/java/jota/IotaAPIProxyTest.java index 6a153ab..9b16cda 100644 --- a/src/test/java/jota/IotaAPIProxyTest.java +++ b/src/test/java/jota/IotaAPIProxyTest.java @@ -3,8 +3,6 @@ package jota; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import jota.dto.response.*; -import jota.utils.IotaAPIUtils; - import org.hamcrest.core.Is; import org.hamcrest.core.IsNull; import org.junit.Before; @@ -12,7 +10,6 @@ import org.junit.Test; import java.util.Collections; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; /** @@ -78,19 +75,19 @@ public class IotaAPIProxyTest { @Test public void shouldFindTransactionsByApprovees() { - FindTransactionResponse trans = proxy.findTransactionsByApprovees(new String[]{"123ABC"}); + FindTransactionResponse trans = proxy.findTransactionsByApprovees(new String[]{TEST_HASH}); assertThat(trans, IsNull.notNullValue()); } @Test public void shouldFindTransactionsByBundles() { - FindTransactionResponse trans = proxy.findTransactionsByBundles(new String[]{"123ABC"}); + FindTransactionResponse trans = proxy.findTransactionsByBundles(TEST_HASH); assertThat(trans, IsNull.notNullValue()); } @Test public void shouldFindTransactionsByDigests() { - FindTransactionResponse trans = proxy.findTransactionsByDigests(new String[]{"123ABC"}); + FindTransactionResponse trans = proxy.findTransactionsByDigests(TEST_HASH); assertThat(trans, IsNull.notNullValue()); } @@ -100,13 +97,13 @@ public class IotaAPIProxyTest { @Test public void shouldGetTrytes() { GetTrytesResponse res = proxy.getTrytes(TEST_HASH); - assertThat(res, IsNull.nullValue()); + assertThat(res, IsNull.notNullValue()); + } @Test public void shouldGetInclusionStates() { - GetInclusionStateResponse res = proxy.getInclusionStates(new String[]{TEST_ADDRESS_WITH_CHECKSUM}, - new String[]{"123"}); + GetInclusionStateResponse res = proxy.getInclusionStates(new String[]{TEST_ADDRESS_WITH_CHECKSUM}, new String[]{"DNSBRJWNOVUCQPILOQIFDKBFJMVOTGHLIMLLRXOHFTJZGRHJUEDAOWXQRYGDI9KHYFGYDWQJZKX999999"}); assertThat(res, IsNull.notNullValue()); } @@ -118,7 +115,7 @@ public class IotaAPIProxyTest { @Test public void shouldGetBalances() { - GetBalancesResponse res = proxy.getBalances(100, new String[]{"HBBYKAKTILIPVUKFOTSLHGENPTXYBNKXZFQFR9VQFWNBMTQNRVOUKPVPRNBSZVVILMAFBKOTBLGLWLOHQ"}); + GetBalancesResponse res = proxy.getBalances(100, new String[]{TEST_ADDRESS_WITH_CHECKSUM}); System.err.println(res); assertThat(res, IsNull.notNullValue()); } @@ -129,9 +126,9 @@ public class IotaAPIProxyTest { assertThat(proxy, IsNull.notNullValue()); } - /*@Test TODO Fix me + @Test public void shouldCreateANewAddress() { - final GetNewAddressResponse res = proxy.newAddress(TEST_SEED, 4, false); - assertThat(res.getAddress(), Is.is("GBPQGDMZ99FRNUBLCCIAXOEWNED9T9AMEHCGMMMFYTP9VINCVSNPAXUXBHQ9DIPTOOTP9XXUAUBDBMWMP")); - }*/ + final GetNewAddressResponse res = proxy.getNewAddress(TEST_SEED, 0, false, 1, false); + assertThat(res.getAddress(), Is.is(Collections.singletonList(TEST_ADDRESS_WITHOUT_CHECKSUM))); + } } \ No newline at end of file