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"); + } + +}