Merge pull request #57

refactoring
This commit is contained in:
Oliver Nitzschke
2017-11-10 17:17:46 +01:00
committed by GitHub
46 changed files with 948 additions and 810 deletions
+219 -261
View File
@@ -1,8 +1,7 @@
package jota;
import com.google.gson.Gson;
import jota.dto.response.*;
import jota.error.*;
import jota.error.ArgumentException;
import jota.model.*;
import jota.pow.ICurl;
import jota.pow.SpongeFactory;
@@ -13,16 +12,19 @@ import org.slf4j.LoggerFactory;
import java.util.*;
import static jota.utils.Constants.*;
/**
* IotaAPI Builder. Usage:
* <p>
* IotaApiProxy api = IotaApiProxy.Builder
* .protocol("http")
* .nodeAddress("localhost")
* .port(12345)
* .build();
* <p>
* GetNodeInfoResponse response = api.getNodeInfo();
* {@code IotaApiProxy api = IotaApiProxy.Builder}
* {@code .protocol("http")}
* {@code .nodeAddress("localhost")}
* {@code .port(12345)}
* {@code .build();}
*
* {@code GetNodeInfoResponse response = api.getNodeInfo();}
*
* @author davassi
*/
@@ -47,14 +49,9 @@ public class IotaAPI extends IotaAPICore {
* @param total Total number of addresses to generate.
* @param returnAll If <code>true</code>, it returns all addresses which were deterministically generated (until findTransactions returns null).
* @return An array of strings with the specifed number of addresses.
* @throws InvalidAddressException is thrown when the specified address is not an valid address.
* @throws InvalidSecurityLevelException is thrown when the specified security level is not valid.
* @throws ArgumentException is thrown when the specified input is not valid.
*/
public GetNewAddressResponse getNewAddress(final String seed, int security, final int index, final boolean checksum, final int total, final boolean returnAll) throws InvalidSecurityLevelException, InvalidAddressException {
if (security < 1) {
throw new InvalidSecurityLevelException();
}
public GetNewAddressResponse getNewAddress(final String seed, int security, final int index, final boolean checksum, final int total, final boolean returnAll) throws ArgumentException {
StopWatch stopWatch = new StopWatch();
@@ -99,31 +96,20 @@ public class IotaAPI extends IotaAPICore {
* @param end Ending key index.
* @param inclusionStates If <code>true</code>, it gets the inclusion states of the transfers.
* @return Bundle of transfers.
* @throws InvalidAddressException is thrown when the specified address is not an valid address.
* @throws ArgumentException is thrown when an invalid argument is provided.
* @throws InvalidBundleException is thrown if an invalid bundle was found or provided.
* @throws InvalidSignatureException is thrown when an invalid signature is encountered.
* @throws NoNodeInfoException is thrown when its not possible to get node info.
* @throws NoInclusionStatesException when it not possible to get a inclusion state.
* @throws InvalidSecurityLevelException is thrown when the specified security level is not valid.
* @throws ArgumentException is thrown when the specified input is not valid.
*/
public GetTransferResponse getTransfers(String seed, int security, Integer start, Integer end, Boolean inclusionStates) throws ArgumentException, InvalidBundleException, InvalidSignatureException, NoNodeInfoException, NoInclusionStatesException, InvalidSecurityLevelException, InvalidAddressException {
StopWatch stopWatch = new StopWatch();
public GetTransferResponse getTransfers(String seed, int security, Integer start, Integer end, Boolean inclusionStates) throws ArgumentException {
// validate seed
if ((!InputValidator.isValidSeed(seed))) {
throw new IllegalStateException("Invalid Seed");
throw new IllegalStateException(INVALID_SEED_INPUT_ERROR);
}
if (security < 1) {
throw new InvalidSecurityLevelException();
}
start = start == null ? 0 : start;
if (start > end || end > (start + 500)) {
throw new ArgumentException();
throw new ArgumentException(INVALID_INPUT_ERROR);
}
StopWatch sw = new StopWatch();
StopWatch stopWatch = new StopWatch();
GetNewAddressResponse gnr = getNewAddress(seed, security, start, false, end, true);
if (gnr != null && gnr.getAddresses() != null) {
@@ -139,15 +125,11 @@ public class IotaAPI extends IotaAPICore {
* @param addresses List of addresses.
* @param inclusionStates If <code>true</code>, it gets the inclusion states of the transfers.
* @return A Transaction objects.
* @throws ArgumentException is thrown when an invalid argument is provided.
* @throws InvalidBundleException is thrown if an invalid bundle was found or provided.
* @throws InvalidSignatureException is thrown when an invalid signature is encountered.
* @throws NoNodeInfoException is thrown when its not possible to get node info.
* @throws NoInclusionStatesException when it not possible to get a inclusion state.
* @throws ArgumentException is thrown when the specified input is not valid.
*/
public Bundle[] bundlesFromAddresses(String[] addresses, final Boolean inclusionStates) throws ArgumentException, InvalidBundleException, InvalidSignatureException, NoNodeInfoException, NoInclusionStatesException {
public Bundle[] bundlesFromAddresses(String[] addresses, final Boolean inclusionStates) throws ArgumentException {
List<Transaction> trxs = findTransactionObjects(addresses);
List<Transaction> trxs = findTransactionObjectsByAddresses(addresses);
// set of tail transactions
List<String> tailTransactions = new ArrayList<>();
List<String> nonTailBundleHashes = new ArrayList<>();
@@ -180,13 +162,9 @@ public class IotaAPI extends IotaAPICore {
// of the tail transactions, and thus the bundles
GetInclusionStateResponse gisr = null;
if (tailTxArray.length != 0 && inclusionStates) {
try {
gisr = getLatestInclusion(tailTxArray);
} catch (IllegalAccessError ignored) {
throw new NoInclusionStatesException();
}
if (gisr == null || gisr.getStates() == null || gisr.getStates().length == 0) {
throw new NoInclusionStatesException();
throw new IllegalStateException(GET_INCLUSION_STATE_RESPONSE_ERROR);
}
}
final GetInclusionStateResponse finalInclusionStates = gisr;
@@ -210,8 +188,8 @@ public class IotaAPI extends IotaAPICore {
finalBundles.add(gbr);
}
// If error returned from getBundle, simply ignore it because the bundle was most likely incorrect
} catch (InvalidBundleException | ArgumentException | InvalidSignatureException e) {
log.warn("GetBundleError: ", e);
} catch (ArgumentException e) {
log.warn(GET_BUNDLE_RESPONSE_ERROR);
}
}
});
@@ -229,15 +207,18 @@ public class IotaAPI extends IotaAPICore {
*
* @param trytes The trytes.
* @return A StoreTransactionsResponse.
* @throws BroadcastAndStoreException is thrown if its not possible to broadcast and store.
* @throws ArgumentException is thrown when the specified input is not valid.
*/
public StoreTransactionsResponse broadcastAndStore(final String... trytes) throws BroadcastAndStoreException {
public StoreTransactionsResponse broadcastAndStore(final String... trytes) throws ArgumentException {
if (!InputValidator.isArrayOfAttachedTrytes(trytes)) {
throw new ArgumentException(INVALID_TRYTES_INPUT_ERROR);
}
try {
broadcastTransactions(trytes);
} catch (Exception e) {
log.error("Impossible to broadcastAndStore, aborting.", e);
throw new BroadcastAndStoreException();
throw new ArgumentException(e.toString());
}
return storeTransactions(trytes);
}
@@ -249,18 +230,17 @@ public class IotaAPI extends IotaAPICore {
* @param depth The depth.
* @param minWeightMagnitude The minimum weight magnitude.
* @return Transactions objects.
* @throws InvalidTrytesException is thrown when invalid trytes is provided.
* @throws ArgumentException is thrown when invalid trytes is provided.
*/
public List<Transaction> sendTrytes(final String[] trytes, final int depth, final int minWeightMagnitude) throws InvalidTrytesException {
public List<Transaction> sendTrytes(final String[] trytes, final int depth, final int minWeightMagnitude) throws ArgumentException {
final GetTransactionsToApproveResponse txs = getTransactionsToApprove(depth);
// attach to tangle - do pow
System.out.println(new Gson().toJson(txs));
final GetAttachToTangleResponse res = attachToTangle(txs.getTrunkTransaction(), txs.getBranchTransaction(), minWeightMagnitude, trytes);
try {
broadcastAndStore(res.getTrytes());
} catch (BroadcastAndStoreException e) {
} catch (ArgumentException e) {
return new ArrayList<>();
}
@@ -279,10 +259,10 @@ public class IotaAPI extends IotaAPICore {
* @param hashes The hashes
* @return Transaction objects.
**/
public List<Transaction> getTransactionsObjects(String[] hashes) {
public List<Transaction> findTransactionsObjectsByHashes(String[] hashes) throws ArgumentException {
if (!InputValidator.isArrayOfHashes(hashes)) {
throw new IllegalStateException("Not an Array of Hashes: " + Arrays.toString(hashes));
throw new IllegalStateException(INVALID_HASHES_INPUT_ERROR);
}
final GetTrytesResponse trytesResponse = getTrytes(hashes);
@@ -297,83 +277,99 @@ public class IotaAPI extends IotaAPICore {
/**
* Wrapper function for findTransactions, getTrytes and transactionObjects.
* Returns the transactionObject of a transaction hash. The input can be a valid findTransactions input.
* Returns the transactionObject of a transaction hash. The input can be a list of valid addresses.
*
* @param input The inputs.
* @param addresses The addresses.
* @return Transactions.
**/
public List<Transaction> findTransactionObjects(String[] input) {
FindTransactionResponse ftr = findTransactions(input, null, null, null);
public List<Transaction> findTransactionObjectsByAddresses(String[] addresses) throws ArgumentException {
List<String> addressesWithoutChecksum = new ArrayList<>();
for (String address : addresses) {
String addressO = Checksum.removeChecksum(address);
addressesWithoutChecksum.add(addressO);
}
FindTransactionResponse ftr = findTransactions(addressesWithoutChecksum.toArray(new String[]{}), null, null, null);
if (ftr == null || ftr.getHashes() == null)
return new ArrayList<>();
// get the transaction objects of the transactions
return getTransactionsObjects(ftr.getHashes());
return findTransactionsObjectsByHashes(ftr.getHashes());
}
/**
* Wrapper function for findTransactions, getTrytes and transactionObjects.
* Returns the transactionObject of a transaction hash. The input can be a valid.
* findTransactions input
* Returns the transactionObject of a transaction hash. The input can be a list of valid tags.
*
* @param input The inputs.
* @param tags The tags.
* @return Transactions.
**/
public List<Transaction> findTransactionObjectsByBundle(String[] input) {
FindTransactionResponse ftr = findTransactions(null, null, null, input);
public List<Transaction> findTransactionObjectsByTag(String[] tags) throws ArgumentException {
FindTransactionResponse ftr = findTransactions(null, tags, null, null);
if (ftr == null || ftr.getHashes() == null)
return new ArrayList<>();
// get the transaction objects of the transactions
return findTransactionsObjectsByHashes(ftr.getHashes());
}
/**
* Wrapper function for findTransactions, getTrytes and transactionObjects.
* Returns the transactionObject of a transaction hash. The input can be a list of valid approvees.
*
* @param approvees The approvees.
* @return Transactions.
**/
public List<Transaction> findTransactionObjectsByApprovees(String[] approvees) throws ArgumentException {
FindTransactionResponse ftr = findTransactions(null, null, approvees, null);
if (ftr == null || ftr.getHashes() == null)
return new ArrayList<>();
// get the transaction objects of the transactions
return findTransactionsObjectsByHashes(ftr.getHashes());
}
/**
* Wrapper function for findTransactions, getTrytes and transactionObjects.
* Returns the transactionObject of a transaction hash. The input can be a list of valid bundles.
* findTransactions input
*
* @param bundles The bundles.
* @return Transactions.
**/
public List<Transaction> findTransactionObjectsByBundle(String[] bundles) throws ArgumentException {
FindTransactionResponse ftr = findTransactions(null, null, null, bundles);
if (ftr == null || ftr.getHashes() == null)
return new ArrayList<>();
// get the transaction objects of the transactions
return getTransactionsObjects(ftr.getHashes());
return findTransactionsObjectsByHashes(ftr.getHashes());
}
/**
* Prepares transfer by generating bundle, finding and signing inputs.
*
* @param seed 81-tryte encoded address of recipient.
* @param security The security level of private key / seed.
* @param transfers Array of transfer objects.
* @param remainder If defined, this address will be used for sending the remainder value (of the inputs) to.
* @param inputs The inputs.
* @return Returns bundle trytes.
* @throws InvalidAddressException is thrown when the specified address is not an valid address.
* @throws NotEnoughBalanceException is thrown when a transfer fails because their is not enough balance to perform the transfer.
* @throws InvalidSecurityLevelException is thrown when the specified security level is not valid.
* @throws InvalidTransferException is thrown when an invalid transfer is provided.
*/
public List<String> prepareTransfers(String seed, int security, final List<Transfer> transfers, String remainder, List<Input> inputs) throws NotEnoughBalanceException, InvalidSecurityLevelException, InvalidAddressException, InvalidTransferException {
return prepareTransfers(seed, security, transfers, remainder, inputs, true);
}
/**
* Prepares transfer by generating bundle, finding and signing inputs.
*
* @param seed 81-tryte encoded address of recipient.
* @param seed Tryte-encoded private key / seed.
* @param security The security level of private key / seed.
* @param transfers Array of transfer objects.
* @param remainder If defined, this address will be used for sending the remainder value (of the inputs) to.
* @param inputs The inputs.
* @param validateInputs whether or not to validate the balances of the provided inputs
* @return Returns bundle trytes.
* @throws InvalidAddressException is thrown when the specified address is not an valid address.
* @throws NotEnoughBalanceException is thrown when a transfer fails because their is not enough balance to perform the transfer.
* @throws InvalidSecurityLevelException is thrown when the specified security level is not valid.
* @throws InvalidTransferException is thrown when an invalid transfer is provided.
* @throws ArgumentException is thrown when the specified input is not valid.
*/
public List<String> prepareTransfers(String seed, int security, final List<Transfer> transfers, String remainder, List<Input> inputs, boolean validateInputs) throws NotEnoughBalanceException, InvalidSecurityLevelException, InvalidAddressException, InvalidTransferException {
// Input validation of transfers object
if (!InputValidator.isTransfersCollectionValid(transfers)) {
throw new InvalidTransferException();
}
public List<String> prepareTransfers(String seed, int security, final List<Transfer> transfers, String remainder, List<Input> inputs, boolean validateInputs) throws ArgumentException {
// validate seed
if ((!InputValidator.isValidSeed(seed))) {
throw new IllegalStateException("Invalid Seed");
throw new IllegalStateException(INVALID_SEED_INPUT_ERROR);
}
if (security < 1) {
throw new InvalidSecurityLevelException();
throw new ArgumentException(INVALID_SECURITY_LEVEL_INPUT_ERROR);
}
// Input validation of transfers object
if (!InputValidator.isTransfersCollectionValid(transfers)) {
throw new ArgumentException(INVALID_TRANSFERS_INPUT_ERROR);
}
// Create a new bundle
@@ -382,55 +378,58 @@ public class IotaAPI extends IotaAPICore {
long totalValue = 0;
String tag = "";
// Iterate over all transfers, get totalValue
// and prepare the signatureFragments, message and tag
for (final Transfer transfer : transfers) {
// If address with checksum then remove checksum
if (Checksum.isAddressWithChecksum(transfer.getAddress()))
// remove the checksum of the address if provided
if (Checksum.isValidChecksum(transfer.getAddress())) {
transfer.setAddress(Checksum.removeChecksum(transfer.getAddress()));
}
int signatureMessageLength = 1;
// If message longer than 2187 trytes, increase signatureMessageLength (add 2nd transaction)
if (transfer.getMessage().length() > 2187) {
if (transfer.getMessage().length() > Constants.MESSAGE_LENGTH) {
// Get total length, message / maxLength (2187 trytes)
signatureMessageLength += Math.floor(transfer.getMessage().length() / 2187);
signatureMessageLength += Math.floor(transfer.getMessage().length() / Constants.MESSAGE_LENGTH);
String msgCopy = transfer.getMessage();
// While there is still a message, copy it
while (!msgCopy.isEmpty()) {
String fragment = StringUtils.substring(msgCopy, 0, 2187);
msgCopy = StringUtils.substring(msgCopy, 2187, msgCopy.length());
String fragment = StringUtils.substring(msgCopy, 0, Constants.MESSAGE_LENGTH);
msgCopy = StringUtils.substring(msgCopy, Constants.MESSAGE_LENGTH, msgCopy.length());
// Pad remainder of fragment
fragment = StringUtils.rightPad(fragment, 2187, '9');
fragment = StringUtils.rightPad(fragment, Constants.MESSAGE_LENGTH, '9');
signatureFragments.add(fragment);
}
} else {
// Else, get single fragment with 2187 of 9's trytes
String fragment = StringUtils.substring(transfer.getMessage(), 0, 2187);
fragment = StringUtils.rightPad(fragment, 2187, '9');
String fragment = transfer.getMessage();
if (transfer.getMessage().length() < Constants.MESSAGE_LENGTH) {
fragment = StringUtils.rightPad(fragment, Constants.MESSAGE_LENGTH, '9');
}
signatureFragments.add(fragment);
}
tag = transfer.getTag();
// pad for required 27 tryte length
if (transfer.getTag().length() < Constants.TAG_LENGTH) {
tag = StringUtils.rightPad(tag, Constants.TAG_LENGTH, '9');
}
// get current timestamp in seconds
long timestamp = (long) Math.floor(Calendar.getInstance().getTimeInMillis() / 1000);
// If no tag defined, get 27 tryte tag.
tag = transfer.getTag().isEmpty() ? "999999999999999999999999999" : transfer.getTag();
// Pad for required 27 tryte length
tag = StringUtils.rightPad(tag, 27, '9');
// Add first entry to the bundle
bundle.addEntry(signatureMessageLength, transfer.getAddress(), transfer.getValue(), tag, timestamp);
// Sum up total value
@@ -439,14 +438,14 @@ public class IotaAPI extends IotaAPICore {
// Get inputs if we are sending tokens
if (totalValue != 0) {
if (!validateInputs)
return addRemainder(seed, security, inputs, bundle, tag, totalValue, remainder, signatureFragments);
// Case 1: user provided inputs
// Validate the inputs by calling getBalances
if (!validateInputs)
return addRemainder(seed, security, inputs, bundle, tag, totalValue, remainder, signatureFragments);
if (inputs != null && !inputs.isEmpty()) {
if (!validateInputs) {
return addRemainder(seed, security, inputs, bundle, tag, totalValue, remainder, signatureFragments);
}
// Get list if addresses of the provided inputs
List<String> inputsAddresses = new ArrayList<>();
for (final Input i : inputs) {
@@ -479,7 +478,7 @@ public class IotaAPI extends IotaAPICore {
// Return not enough balance error
if (totalValue > totalBalance) {
throw new IllegalStateException("Not enough balance");
throw new IllegalStateException(NOT_ENOUGH_BALANCE_ERROR);
}
return addRemainder(seed, security, confirmedInputs, bundle, tag, totalValue, remainder, signatureFragments);
@@ -493,7 +492,7 @@ public class IotaAPI extends IotaAPICore {
@SuppressWarnings("unchecked") GetBalancesAndFormatResponse newinputs = getInputs(seed, security, 0, 0, totalValue);
// If inputs with enough balance
return addRemainder(seed, security, newinputs.getInput(), bundle, tag, totalValue, remainder, signatureFragments);
return addRemainder(seed, security, newinputs.getInputs(), bundle, tag, totalValue, remainder, signatureFragments);
}
} else {
@@ -520,27 +519,27 @@ public class IotaAPI extends IotaAPICore {
* @param start Starting key index.
* @param end Ending key index.
* @param threshold Min balance required.
* @throws InvalidAddressException is thrown when the specified address is not an valid address.
* @throws InvalidSecurityLevelException is thrown when the specified security level is not valid.
* @throws ArgumentException is thrown when the specified input is not valid.
**/
public GetBalancesAndFormatResponse getInputs(String seed, int security, int start, int end, long threshold) throws InvalidSecurityLevelException, InvalidAddressException {
StopWatch stopWatch = new StopWatch();
public GetBalancesAndFormatResponse getInputs(String seed, int security, int start, int end, long threshold) throws ArgumentException {
// validate the seed
if ((!InputValidator.isValidSeed(seed))) {
throw new IllegalStateException("Invalid Seed");
throw new IllegalStateException(INVALID_SEED_INPUT_ERROR);
}
if (security < 1) {
throw new InvalidSecurityLevelException();
throw new ArgumentException(INVALID_SECURITY_LEVEL_INPUT_ERROR);
}
// If start value bigger than end, return error
// or if difference between end and start is bigger than 500 keys
if (start > end || end > (start + 500)) {
throw new IllegalStateException("Invalid inputs provided");
throw new IllegalStateException(INVALID_INPUT_ERROR);
}
StopWatch stopWatch = new StopWatch();
// Case 1: start and end
//
// If start and end is defined by the user, simply iterate through the keys
@@ -555,7 +554,7 @@ public class IotaAPI extends IotaAPICore {
allAddresses.add(address);
}
return getBalanceAndFormat(allAddresses, threshold, start, end, stopWatch, security);
return getBalanceAndFormat(allAddresses, threshold, start, stopWatch, security);
}
// Case 2: iterate till threshold || end
//
@@ -564,7 +563,7 @@ public class IotaAPI extends IotaAPICore {
// We then do getBalance, format the output and return it
else {
final GetNewAddressResponse res = getNewAddress(seed, security, start, false, 0, true);
return getBalanceAndFormat(res.getAddresses(), threshold, start, end, stopWatch, security);
return getBalanceAndFormat(res.getAddresses(), threshold, start, stopWatch, security);
}
}
@@ -574,16 +573,15 @@ public class IotaAPI extends IotaAPICore {
* @param addresses The addresses.
* @param threshold Min balance required.
* @param start Starting key index.
* @param end Ending key index.
* @param stopWatch the stopwatch.
* @param security The security level of private key / seed.
* @return Inputs object.
* @throws InvalidSecurityLevelException is thrown when the specified security level is not valid.
* @throws ArgumentException is thrown when the specified security level is not valid.
**/
public GetBalancesAndFormatResponse getBalanceAndFormat(final List<String> addresses, long threshold, int start, int end, StopWatch stopWatch, int security) throws InvalidSecurityLevelException {
public GetBalancesAndFormatResponse getBalanceAndFormat(final List<String> addresses, long threshold, int start, StopWatch stopWatch, int security) throws ArgumentException, IllegalStateException {
if (security < 1) {
throw new InvalidSecurityLevelException();
throw new ArgumentException(INVALID_SECURITY_LEVEL_INPUT_ERROR);
}
GetBalancesResponse getBalancesResponse = getBalances(100, addresses);
@@ -618,7 +616,7 @@ public class IotaAPI extends IotaAPICore {
if (thresholdReached) {
return GetBalancesAndFormatResponse.create(inputs, totalBalance, stopWatch.getElapsedTimeMili());
}
throw new IllegalStateException("Not enough balance");
throw new IllegalStateException(NOT_ENOUGH_BALANCE_ERROR);
}
/**
@@ -627,18 +625,21 @@ public class IotaAPI extends IotaAPICore {
*
* @param transaction The transaction encoded in trytes.
* @return an array of bundle, if there are multiple arrays it means that there are conflicting bundles.
* @throws ArgumentException is thrown when an invalid argument is provided.
* @throws InvalidBundleException is thrown if an invalid bundle was found or provided.
* @throws InvalidSignatureException is thrown when an invalid signature is encountered.
* @throws ArgumentException is thrown when the specified input is not valid.
*/
public GetBundleResponse getBundle(String transaction) throws ArgumentException, InvalidBundleException, InvalidSignatureException {
StopWatch stopWatch = new StopWatch();
public GetBundleResponse getBundle(String transaction) throws ArgumentException {
if (!InputValidator.isHash(transaction)) {
throw new ArgumentException(INVALID_HASHES_INPUT_ERROR);
}
Bundle bundle = traverseBundle(transaction, null, new Bundle());
if (bundle == null) {
throw new ArgumentException("Unknown Bundle");
throw new ArgumentException(INVALID_BUNDLE_ERROR);
}
StopWatch stopWatch = new StopWatch();
long totalSum = 0;
String bundleHash = bundle.getTransactions().get(0).getBundle();
@@ -653,11 +654,10 @@ public class IotaAPI extends IotaAPICore {
totalSum += bundleValue;
if (i != bundle.getTransactions().get(i).getCurrentIndex()) {
throw new ArgumentException("Invalid Bundle");
throw new ArgumentException(INVALID_BUNDLE_ERROR);
}
String trxTrytes = trx.toTrytes().substring(2187, 2187 + 162);
//System.out.println("Bundlesize "+bundle.getTransactions().size()+" "+trxTrytes);
// Absorb bundle hash + value + timestamp + lastIndex + currentIndex trytes.
curl.absorb(Converter.trits(trxTrytes));
// Check if input transaction
@@ -682,17 +682,19 @@ public class IotaAPI extends IotaAPICore {
}
// Check for total sum, if not equal 0 return error
if (totalSum != 0) throw new InvalidBundleException("Invalid Bundle Sum");
if (totalSum != 0)
throw new ArgumentException(INVALID_BUNDLE_SUM_ERROR);
int[] bundleFromTrxs = new int[243];
curl.squeeze(bundleFromTrxs);
String bundleFromTxString = Converter.trytes(bundleFromTrxs);
// Check if bundle hash is the same as returned by tx object
if (!bundleFromTxString.equals(bundleHash)) throw new InvalidBundleException("Invalid Bundle Hash");
if (!bundleFromTxString.equals(bundleHash))
throw new ArgumentException(INVALID_BUNDLE_HASH_ERROR);
// Last tx in the bundle should have currentIndex === lastIndex
bundle.setLength(bundle.getTransactions().size());
if (!(bundle.getTransactions().get(bundle.getLength() - 1).getCurrentIndex() == (bundle.getTransactions().get(bundle.getLength() - 1).getLastIndex())))
throw new InvalidBundleException("Invalid Bundle");
throw new ArgumentException(INVALID_BUNDLE_ERROR);
// Validate the signatures
for (Signature aSignaturesToValidate : signaturesToValidate) {
@@ -700,7 +702,8 @@ public class IotaAPI extends IotaAPICore {
String address = aSignaturesToValidate.getAddress();
boolean isValidSignature = new Signing(customCurl.clone()).validateSignatures(address, signatureFragments, bundleHash);
if (!isValidSignature) throw new InvalidSignatureException();
if (!isValidSignature)
throw new ArgumentException(INVALID_SIGNATURES_ERROR);
}
return GetBundleResponse.create(bundle.getTransactions(), stopWatch.getElapsedTimeMili());
@@ -719,18 +722,13 @@ public class IotaAPI extends IotaAPICore {
* @param end Ending key index.
* @param inclusionStates If <code>true</code>, it gets the inclusion states of the transfers.
* @param threshold Min balance required.
* @throws InvalidBundleException is thrown if an invalid bundle was found or provided.
* @throws ArgumentException is thrown when an invalid argument is provided.
* @throws InvalidSignatureException is thrown when an invalid signature is encountered.
* @throws InvalidTrytesException is thrown when invalid trytes is provided.
* @throws InvalidSecurityLevelException is thrown when the specified security level is not valid.
* @throws InvalidAddressException is thrown when the specified address is not an valid address.
* @throws NoInclusionStatesException is thrown when it not possible to get a inclusion state.
* @throws NoNodeInfoException is thrown when its not possible to get node info.
* @throws ArgumentException is thrown when the specified input is not valid.
*/
public GetAccountDataResponse getAccountData(String seed, int security, int index, boolean checksum, int total, boolean returnAll, int start, int end, boolean inclusionStates, long threshold)
throws InvalidBundleException, ArgumentException, InvalidSignatureException,
InvalidTrytesException, InvalidSecurityLevelException, InvalidAddressException, NoInclusionStatesException, NoNodeInfoException {
public GetAccountDataResponse getAccountData(String seed, int security, int index, boolean checksum, int total, boolean returnAll, int start, int end, boolean inclusionStates, long threshold) throws ArgumentException {
if (start > end || end > (start + 1000)) {
throw new ArgumentException(INVALID_INPUT_ERROR);
}
StopWatch stopWatch = new StopWatch();
@@ -738,7 +736,7 @@ public class IotaAPI extends IotaAPICore {
GetTransferResponse gtr = getTransfers(seed, security, start, end, inclusionStates);
GetBalancesAndFormatResponse gbr = getInputs(seed, security, start, end, threshold);
return GetAccountDataResponse.create(gna.getAddresses(), gtr.getTransfers(), gbr.getTotalBalance(), stopWatch.getElapsedTimeMili());
return GetAccountDataResponse.create(gna.getAddresses(), gtr.getTransfers(), gbr.getInputs(), gbr.getTotalBalance(), stopWatch.getElapsedTimeMili());
}
/**
@@ -748,12 +746,14 @@ public class IotaAPI extends IotaAPICore {
* @param depth The depth.
* @param minWeightMagnitude The minimum weight magnitude.
* @return Analyzed Transaction objects.
* @throws InvalidBundleException is thrown if an invalid bundle was found or provided.
* @throws ArgumentException is thrown when an invalid argument is provided.
* @throws InvalidSignatureException is thrown when an invalid signature is encountered.
* @throws InvalidTransferException is thrown when an invalid transfer is provided.
* @throws ArgumentException is thrown when the specified input is not valid.
*/
public ReplayBundleResponse replayBundle(String transaction, int depth, int minWeightMagnitude) throws InvalidBundleException, ArgumentException, InvalidSignatureException, InvalidTrytesException {
public ReplayBundleResponse replayBundle(String transaction, int depth, int minWeightMagnitude) throws ArgumentException {
if (!InputValidator.isHash(transaction)) {
throw new ArgumentException(INVALID_TAIL_HASH_INPUT_ERROR);
}
StopWatch stopWatch = new StopWatch();
List<String> bundleTrytes = new ArrayList<>();
@@ -786,11 +786,9 @@ public class IotaAPI extends IotaAPICore {
*
* @param hashes The hashes.
* @return Inclusion state.
* @throws NoNodeInfoException is thrown when its not possible to get node info.
*/
public GetInclusionStateResponse getLatestInclusion(String[] hashes) throws NoNodeInfoException {
public GetInclusionStateResponse getLatestInclusion(String[] hashes) throws ArgumentException {
GetNodeInfoResponse getNodeInfoResponse = getNodeInfo();
if (getNodeInfoResponse == null) throw new NoNodeInfoException();
String[] latestMilestone = {getNodeInfoResponse.getLatestSolidSubtangleMilestone()};
@@ -806,36 +804,26 @@ public class IotaAPI extends IotaAPICore {
* @param minWeightMagnitude The minimum weight magnitude.
* @param transfers Array of transfer objects.
* @param inputs List of inputs used for funding the transfer.
* @param remainderAddress If defined, this remainderAddress will be used for sending the remainder value (of the inputs) to.
* @return Array of Transaction objects.
* @throws InvalidAddressException is thrown when the specified remainderAddress is not an valid remainderAddress.
* @throws NotEnoughBalanceException is thrown when a transfer fails because their is not enough balance to perform the transfer.
* @throws InvalidSecurityLevelException is thrown when the specified security level is not valid.
* @throws InvalidTrytesException is thrown when invalid trytes is provided.
* @throws InvalidAddressException is thrown when the specified remainderAddress is not an valid remainderAddress.
* @throws InvalidTransferException is thrown when an invalid transfer is provided.
* @param remainderAddress If defined, this remainderAddress will be used for sending the remainder value (of the inputs) to.
* @param validateInputs Whether or not to validate the balances of the provided inputs
* @return Array of valid Transaction objects.
* @throws ArgumentException is thrown when the specified input is not valid.
*/
public SendTransferResponse sendTransfer(String seed, int security, int depth, int minWeightMagnitude, final List<Transfer> transfers, Input[] inputs, String remainderAddress) throws NotEnoughBalanceException, InvalidSecurityLevelException, InvalidTrytesException, InvalidAddressException, InvalidTransferException {
if (security < 1) {
throw new InvalidSecurityLevelException();
}
public SendTransferResponse sendTransfer(String seed, int security, int depth, int minWeightMagnitude, final List<Transfer> transfers, List<Input> inputs, String remainderAddress, boolean validateInputs) throws ArgumentException {
StopWatch stopWatch = new StopWatch();
List<String> trytes = prepareTransfers(seed, security, transfers, remainderAddress, inputs == null ? null : Arrays.asList(inputs));
List<String> trytes = prepareTransfers(seed, security, transfers, remainderAddress, inputs, validateInputs);
List<Transaction> trxs = sendTrytes(trytes.toArray(new String[trytes.size()]), depth, minWeightMagnitude);
Boolean[] successful = new Boolean[trxs.size()];
for (int i = 0; i < trxs.size(); i++) {
final FindTransactionResponse response = findTransactionsByBundles(trxs.get(i).getBundle());
successful[i] = response.getHashes().length != 0;
}
return SendTransferResponse.create(successful, stopWatch.getElapsedTimeMili());
return SendTransferResponse.create(trxs, successful, stopWatch.getElapsedTimeMili());
}
/**
@@ -847,7 +835,7 @@ public class IotaAPI extends IotaAPICore {
* @param bundleHash The bundle hashes.
* @param bundle List of bundles to be populated.
* @return Transaction objects.
* @throws ArgumentException is thrown when an invalid argument is provided.
* @throws ArgumentException is thrown when an invalid input is provided.
*/
public Bundle traverseBundle(String trunkTx, String bundleHash, Bundle bundle) throws ArgumentException {
GetTrytesResponse gtr = getTrytes(trunkTx);
@@ -855,16 +843,16 @@ public class IotaAPI extends IotaAPICore {
if (gtr != null) {
if (gtr.getTrytes().length == 0) {
throw new ArgumentException("Bundle transactions not visible");
throw new ArgumentException(INVALID_BUNDLE_ERROR);
}
Transaction trx = new Transaction(gtr.getTrytes()[0], customCurl.clone());
if (trx.getBundle() == null) {
throw new ArgumentException("Invalid trytes, could not create object");
throw new ArgumentException(INVALID_TRYTES_INPUT_ERROR);
}
// If first transaction to search is not a tail, return error
if (bundleHash == null && trx.getCurrentIndex() != 0) {
throw new ArgumentException("Invalid tail transaction supplied.");
throw new ArgumentException(INVALID_TAIL_HASH_INPUT_ERROR);
}
// If no bundle hash, define it
if (bundleHash == null) {
@@ -886,7 +874,7 @@ public class IotaAPI extends IotaAPICore {
// Continue traversing with new trunkTx
return traverseBundle(trunkTx, bundleHash, bundle);
} else {
throw new ArgumentException("Get Trytes Response was null");
throw new ArgumentException(GET_TRYTES_RESPONSE_ERROR);
}
}
@@ -899,38 +887,24 @@ public class IotaAPI extends IotaAPICore {
* @param inputAddress Array of input addresses as well as the securitySum.
* @param remainderAddress Has to be generated by the cosigners before initiating the transfer, can be null if fully spent.
* @return Bundle of transaction objects.
* @throws InvalidBundleException is thrown if an invalid bundle was found or provided.
* @throws InvalidAddressException is thrown when the specified address is not an valid address.
* @throws ArgumentException is thrown when an invalid argument is provided.
* @throws IllegalStateException is thrown when a transfer fails because their is not enough balance to perform the transfer.
*/
public List<Transaction> initiateTransfer(int securitySum, final String inputAddress, String remainderAddress,
final List<Transfer> transfers, boolean testMode) throws InvalidAddressException, InvalidBundleException, InvalidTransferException {
final List<Transfer> transfers, boolean testMode) throws ArgumentException {
// If message or tag is not supplied, provide it
// Also remove the checksum of the address if it's there
// validate input address
if (!InputValidator.isAddress(inputAddress))
throw new ArgumentException(INVALID_ADDRESSES_INPUT_ERROR);
for (Transfer transfer : transfers) {
transfer.setMessage(transfer.getMessage().isEmpty() ? StringUtils.rightPad(transfer.getMessage(), 2187, '9') : transfer.getMessage());
transfer.setTag(transfer.getTag().isEmpty() ? StringUtils.rightPad(transfer.getTag(), 27, '9') : transfer.getTag());
if (Checksum.isValidChecksum(transfer.getAddress())) {
transfer.setAddress(Checksum.removeChecksum(transfer.getAddress()));
}
// validate remainder address
if (remainderAddress != null && !InputValidator.isAddress(remainderAddress)) {
throw new ArgumentException(INVALID_ADDRESSES_INPUT_ERROR);
}
// Input validation of transfers object
if (!InputValidator.isTransfersCollectionValid(transfers)) {
throw new InvalidTransferException();
}
// validate input address
if (!InputValidator.isAddress(inputAddress))
throw new InvalidAddressException();
// validate remainder address
if (remainderAddress != null && !InputValidator.isAddress(remainderAddress)) {
throw new InvalidBundleException();
throw new ArgumentException(INVALID_TRANSFERS_INPUT_ERROR);
}
// Create a new bundle
@@ -945,50 +919,57 @@ public class IotaAPI extends IotaAPICore {
// and prepare the signatureFragments, message and tag
for (final Transfer transfer : transfers) {
// remove the checksum of the address if provided
if (Checksum.isValidChecksum(transfer.getAddress())) {
transfer.setAddress(Checksum.removeChecksum(transfer.getAddress()));
}
int signatureMessageLength = 1;
// If message longer than 2187 trytes, increase signatureMessageLength (add 2nd transaction)
if (transfer.getMessage().length() > 2187) {
// If message longer than 2187 trytes, increase signatureMessageLength (add next transaction)
if (transfer.getMessage().length() > Constants.MESSAGE_LENGTH) {
// Get total length, message / maxLength (2187 trytes)
signatureMessageLength += Math.floor(transfer.getMessage().length() / 2187);
signatureMessageLength += Math.floor(transfer.getMessage().length() / Constants.MESSAGE_LENGTH);
String msgCopy = transfer.getMessage();
// While there is still a message, copy it
while (!msgCopy.isEmpty()) {
String fragment = StringUtils.substring(msgCopy, 0, 2187);
msgCopy = StringUtils.substring(msgCopy, 2187, msgCopy.length());
String fragment = StringUtils.substring(msgCopy, 0, Constants.MESSAGE_LENGTH);
msgCopy = StringUtils.substring(msgCopy, Constants.MESSAGE_LENGTH, msgCopy.length());
// Pad remainder of fragment
fragment = StringUtils.rightPad(fragment, 2187, '9');
fragment = StringUtils.rightPad(fragment, Constants.MESSAGE_LENGTH, '9');
signatureFragments.add(fragment);
}
} else {
// Else, get single fragment with 2187 of 9's trytes
String fragment = StringUtils.substring(transfer.getMessage(), 0, 2187);
String fragment = transfer.getMessage();
fragment = StringUtils.rightPad(fragment, 2187, '9');
if (transfer.getMessage().length() < Constants.MESSAGE_LENGTH) {
fragment = StringUtils.rightPad(fragment, Constants.MESSAGE_LENGTH, '9');
}
signatureFragments.add(fragment);
}
tag = transfer.getTag();
// pad for required 27 tryte length
if (transfer.getTag().length() < Constants.TAG_LENGTH) {
tag = StringUtils.rightPad(tag, Constants.TAG_LENGTH, '9');
}
// get current timestamp in seconds
long timestamp = (long) Math.floor(Calendar.getInstance().getTimeInMillis() / 1000);
// If no tag defined, get 27 tryte tag.
tag = transfer.getTag().isEmpty() ? StringUtils.rightPad(transfer.getTag(), 27, '9') : transfer.getTag();
// Pad for required 27 tryte length
tag = StringUtils.rightPad(tag, 27, '9');
// Add first entry to the bundle
bundle.addEntry(signatureMessageLength, transfer.getAddress(), transfer.getValue(), tag, timestamp);
// Sum up total value
@@ -998,7 +979,7 @@ public class IotaAPI extends IotaAPICore {
// Get inputs if we are sending tokens
if (totalValue != 0) {
GetBalancesResponse balancesResponse = getBalances(100, new String[]{inputAddress});
GetBalancesResponse balancesResponse = getBalances(100, Collections.singletonList(inputAddress));
String[] balances = balancesResponse.getBalances();
long totalBalance = 0;
@@ -1026,7 +1007,7 @@ public class IotaAPI extends IotaAPICore {
}
// Return not enough balance error
if (totalValue > totalBalance) {
throw new IllegalStateException("Not enough balance");
throw new IllegalStateException(NOT_ENOUGH_BALANCE_ERROR);
}
// If there is a remainder value
@@ -1037,7 +1018,7 @@ public class IotaAPI extends IotaAPICore {
// Remainder bundle entry if necessary
if (remainderAddress == null) {
throw new IllegalStateException("No remainder address defined");
throw new IllegalStateException(NO_REMAINDER_ADDRESS_ERROR);
}
bundle.addEntry(1, remainderAddress, remainder, tag, timestamp);
@@ -1048,33 +1029,11 @@ public class IotaAPI extends IotaAPICore {
return bundle.getTransactions();
} else {
throw new RuntimeException("Invalid value transfer: the transfer does not require a signature.");
throw new RuntimeException(INVALID_VALUE_TRANSFER_ERROR);
}
}
/**
* @param hash The hash.
* @return A bundle.
* @throws ArgumentException is thrown when an invalid argument is provided.
*/
public String findTailTransactionHash(String hash) throws ArgumentException {
GetTrytesResponse gtr = getTrytes(hash);
if (gtr == null) throw new ArgumentException("Invalid hash");
if (gtr.getTrytes().length == 0) {
throw new ArgumentException("Bundle transactions not visible");
}
Transaction trx = new Transaction(gtr.getTrytes()[0], customCurl.clone());
if (trx.getBundle() == null) {
throw new ArgumentException("Invalid trytes, could not create object");
}
if (trx.getCurrentIndex() == 0) return trx.getHash();
else return findTailTransactionHash(trx.getBundle());
}
/**
* @param seed Tryte-encoded seed.
* @param security The security level of private key / seed.
@@ -1084,9 +1043,8 @@ public class IotaAPI extends IotaAPICore {
* @param totalValue The total value.
* @param remainderAddress If defined, this address will be used for sending the remainder value (of the inputs) to.
* @param signatureFragments The signature fragments.
* @throws NotEnoughBalanceException is thrown when a transfer fails because their is not enough balance to perform the transfer.
* @throws InvalidSecurityLevelException is thrown when the specified security level is not valid.
* @throws InvalidAddressException is thrown when the specified address is not an valid address.
* @throws ArgumentException is thrown when an invalid argument is provided.
* @throws IllegalStateException is thrown when a transfer fails because their is not enough balance to perform the transfer.
*/
public List<String> addRemainder(final String seed,
final int security,
@@ -1095,7 +1053,7 @@ public class IotaAPI extends IotaAPICore {
final String tag,
final long totalValue,
final String remainderAddress,
final List<String> signatureFragments) throws NotEnoughBalanceException, InvalidSecurityLevelException, InvalidAddressException {
final List<String> signatureFragments) throws ArgumentException {
long totalTransferValue = totalValue;
for (int i = 0; i < inputs.size(); i++) {
@@ -1139,7 +1097,7 @@ public class IotaAPI extends IotaAPICore {
totalTransferValue -= thisBalance;
}
}
throw new NotEnoughBalanceException();
throw new IllegalStateException(NOT_ENOUGH_BALANCE_ERROR);
}
public static class Builder extends IotaAPICore.Builder<Builder> {
+20 -28
View File
@@ -2,50 +2,42 @@ package jota;
/**
* IOTA's node command list
* <p>
* 'params' is not currently used.
*
*/
public enum IotaAPICommands {
GET_NODE_INFO("getNodeInfo", 0),
GET_NEIGHBORS("getNeighbors", 0),
ADD_NEIGHBORS("addNeighbors", 1),
REMOVE_NEIGHBORS("removeNeighbors", 1),
GET_TIPS("getTips", 0),
FIND_TRANSACTIONS("findTransactions", 1),
GET_TRYTES("getTrytes", 0),
GET_INCLUSIONS_STATES("getInclusionStates", 0),
GET_BALANCES("getBalances", 0),
GET_TRANSACTIONS_TO_APPROVE("getTransactionsToApprove", 0),
ATTACH_TO_TANGLE("attachToTangle", 0),
INTERRUPT_ATTACHING_TO_TANGLE("interruptAttachingToTangle", 0),
BROADCAST_TRANSACTIONS("broadcastTransactions", 0),
STORE_TRANSACTIONS("storeTransactions", 0);
GET_NODE_INFO("getNodeInfo"),
GET_NEIGHBORS("getNeighbors"),
ADD_NEIGHBORS("addNeighbors"),
REMOVE_NEIGHBORS("removeNeighbors"),
GET_TIPS("getTips"),
FIND_TRANSACTIONS("findTransactions"),
GET_TRYTES("getTrytes"),
GET_INCLUSIONS_STATES("getInclusionStates"),
GET_BALANCES("getBalances"),
GET_TRANSACTIONS_TO_APPROVE("getTransactionsToApprove"),
ATTACH_TO_TANGLE("attachToTangle"),
INTERRUPT_ATTACHING_TO_TANGLE("interruptAttachingToTangle"),
BROADCAST_TRANSACTIONS("broadcastTransactions"),
STORE_TRANSACTIONS("storeTransactions");
private String command;
private int params;
/**
* @param command
* @param params
* Initializes a new instance of the IotaAPICommands class.
*/
IotaAPICommands(String command, int params) {
IotaAPICommands(String command) {
this.command = command;
this.params = params;
}
/**
* @return
* Gets the command.
*
* @return The command.
*/
public String command() {
return command;
}
/**
* @return
*/
public int params() {
return params;
}
}
+207 -58
View File
@@ -2,9 +2,9 @@ package jota;
import jota.dto.request.*;
import jota.dto.response.*;
import jota.error.InvalidApiVersionException;
import jota.error.InvalidTrytesException;
import jota.error.ArgumentException;
import jota.model.Transaction;
import jota.utils.Checksum;
import jota.utils.InputValidator;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
@@ -19,10 +19,13 @@ import retrofit2.converter.gson.GsonConverterFactory;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import static jota.utils.Constants.*;
/**
* This class provides access to the Iota core API
*
@@ -53,29 +56,27 @@ public class IotaAPICore {
postConstruct();
}
/**
* @param call
* @param <T>
* @return
*/
protected static <T> Response<T> wrapCheckedException(final Call<T> call) {
try {
final Response<T> res = call.execute();
String error = "";
if (res.errorBody() != null) {
error = res.errorBody().string();
}
if (res.code() == 400) {
if (res.errorBody().string().contains("Invalid API Version")) {
try {
throw new InvalidApiVersionException();
} catch (InvalidApiVersionException e) {
e.printStackTrace();
}
} else {
throw new IllegalAccessError("400 " + res.errorBody().string());
try {
throw new ArgumentException(error);
} catch (ArgumentException e) {
e.printStackTrace();
}
} else if (res.code() == 401) {
throw new IllegalAccessError("401 " + res.errorBody().string());
throw new IllegalAccessError("401 " + error);
} else if (res.code() == 500) {
throw new IllegalAccessError("500 " + res.errorBody().string());
throw new IllegalAccessError("500 " + error);
}
return res;
} catch (IOException e) {
@@ -85,11 +86,6 @@ public class IotaAPICore {
}
/**
* @param env
* @param def
* @return
*/
private static String env(String env, String def) {
final String value = System.getenv(env);
if (value == null) {
@@ -101,7 +97,7 @@ public class IotaAPICore {
}
/**
* added header for IRI 1.4.1
* added header for IRI
*/
private void postConstruct() {
@@ -138,31 +134,62 @@ public class IotaAPICore {
log.debug("Jota-API Java proxy pointing to node url: '{}'", nodeUrl);
}
/**
* Get the node information.
*
* @return The information about the node.
*/
public GetNodeInfoResponse getNodeInfo() {
final Call<GetNodeInfoResponse> res = service.getNodeInfo(IotaCommandRequest.createNodeInfoRequest());
return wrapCheckedException(res).body();
}
/**
* Get the list of neighbors from the node.
*
* @return The set of neighbors the node is connected with.
*/
public GetNeighborsResponse getNeighbors() {
final Call<GetNeighborsResponse> res = service.getNeighbors(IotaCommandRequest.createGetNeighborsRequest());
return wrapCheckedException(res).body();
}
/**
* Add a list of neighbors to the node.
*
* @param uris The list of URI elements.
*/
public AddNeighborsResponse addNeighbors(String... uris) {
final Call<AddNeighborsResponse> res = service.addNeighbors(IotaNeighborsRequest.createAddNeighborsRequest(uris));
return wrapCheckedException(res).body();
}
/**
* Removes a list of neighbors from the node.
*
* @param uris The list of URI elements.
*/
public RemoveNeighborsResponse removeNeighbors(String... uris) {
final Call<RemoveNeighborsResponse> res = service.removeNeighbors(IotaNeighborsRequest.createRemoveNeighborsRequest(uris));
return wrapCheckedException(res).body();
}
/**
* Get the list of latest tips (unconfirmed transactions).
*
* @return The the list of tips.
*/
public GetTipsResponse getTips() {
final Call<GetTipsResponse> res = service.getTips(IotaCommandRequest.createGetTipsRequest());
return wrapCheckedException(res).body();
}
/**
* Find the transactions which match the specified input
*
* @return The transaction hashes which are returned depend on the input.
*/
public FindTransactionResponse findTransactions(String[] addresses, String[] tags, String[] approvees, String[] bundles) {
final IotaFindTransactionsRequest findTransRequest = IotaFindTransactionsRequest
@@ -176,55 +203,156 @@ public class IotaAPICore {
return wrapCheckedException(res).body();
}
public FindTransactionResponse findTransactionsByAddresses(final String... addresses) {
return findTransactions(addresses, null, null, null);
/**
* Find the transactions by addresses
*
* @param addresses A List of addresses.
* @return The transaction hashes which are returned depend on the input.
*/
public FindTransactionResponse findTransactionsByAddresses(final String... addresses) throws ArgumentException {
List<String> addressesWithoutChecksum = new ArrayList<>();
for (String address : addresses) {
String addressO = Checksum.removeChecksum(address);
addressesWithoutChecksum.add(addressO);
}
return findTransactions(addressesWithoutChecksum.toArray(new String[addressesWithoutChecksum.size()]), null, null, null);
}
/**
* Find the transactions by bundles
*
* @param bundles A List of bundles.
* @return The transaction hashes which are returned depend on the input.
*/
public FindTransactionResponse findTransactionsByBundles(final String... bundles) {
return findTransactions(null, null, null, bundles);
}
/**
* Find the transactions by approvees
*
* @param approvees A List of approvess.
* @return The transaction hashes which are returned depend on the input.
*/
public FindTransactionResponse findTransactionsByApprovees(final String... approvees) {
return findTransactions(null, null, approvees, null);
}
/**
* Find the transactions by digests
*
* @param digests A List of digests.
* @return The transaction hashes which are returned depend on the input.
*/
public FindTransactionResponse findTransactionsByDigests(final String... digests) {
return findTransactions(null, digests, null, null);
}
public GetInclusionStateResponse getInclusionStates(String[] transactions, String[] tips) {
/**
* Get the inclusion states of a set of transactions. This is for determining if a transaction was accepted and confirmed by the network or not.
* Search for multiple tips (and thus, milestones) to get past inclusion states of transactions.
*
* @param transactions The ist of transactions you want to get the inclusion state for.
* @param tips ThelList of tips (including milestones) you want to search for the inclusion state.
* @return The inclusion states of a set of transactions.
*/
public GetInclusionStateResponse getInclusionStates(String[] transactions, String[] tips) throws ArgumentException {
if (!InputValidator.isArrayOfHashes(transactions)) {
throw new ArgumentException(INVALID_HASHES_INPUT_ERROR);
}
if (!InputValidator.isArrayOfHashes(tips)) {
throw new ArgumentException(INVALID_HASHES_INPUT_ERROR);
}
final Call<GetInclusionStateResponse> res = service.getInclusionStates(IotaGetInclusionStateRequest
.createGetInclusionStateRequest(transactions, tips));
return wrapCheckedException(res).body();
}
public GetTrytesResponse getTrytes(String... hashes) {
/**
* Returns the raw trytes data of a transaction.
*
* @param hashes The of transaction hashes of which you want to get trytes from.
* @return The the raw transaction data (trytes) of a specific transaction.
*/
public GetTrytesResponse getTrytes(String... hashes) throws ArgumentException {
if (!InputValidator.isArrayOfHashes(hashes)) {
throw new ArgumentException(INVALID_HASHES_INPUT_ERROR);
}
final Call<GetTrytesResponse> res = service.getTrytes(IotaGetTrytesRequest.createGetTrytesRequest(hashes));
return wrapCheckedException(res).body();
}
/**
* Tip selection which returns trunkTransaction and branchTransaction. The input value is the latest coordinator milestone, as provided through the getNodeInfo API call.
*
* @param depth The number of bundles to go back to determine the transactions for approval.
* @return The Tip selection which returns trunkTransaction and branchTransaction
*/
public GetTransactionsToApproveResponse getTransactionsToApprove(Integer depth) {
final Call<GetTransactionsToApproveResponse> res = service.getTransactionsToApprove(IotaGetTransactionsToApproveRequest.createIotaGetTransactionsToApproveRequest(depth));
return wrapCheckedException(res).body();
}
public GetBalancesResponse getBalances(Integer threshold, String[] addresses) {
/**
* Similar to getInclusionStates.
*
* @param threshold The confirmation threshold, should be set to 100.
* @param addresses The array list of addresses you want to get the confirmed balance from.
* @return The confirmed balance which a list of addresses have at the latest confirmed milestone.
*/
private GetBalancesResponse getBalances(Integer threshold, String[] addresses) {
final Call<GetBalancesResponse> res = service.getBalances(IotaGetBalancesRequest.createIotaGetBalancesRequest(threshold, addresses));
return wrapCheckedException(res).body();
}
public GetBalancesResponse getBalances(Integer threshold, List<String> addresses) {
return getBalances(threshold, addresses.toArray(new String[]{}));
/**
* Similar to getInclusionStates.
*
* @param threshold The confirmation threshold, should be set to 100.
* @param addresses The list of addresses you want to get the confirmed balance from.
* @return The confirmed balance which a list of addresses have at the latest confirmed milestone.
*/
public GetBalancesResponse getBalances(Integer threshold, List<String> addresses) throws ArgumentException {
List<String> addressesWithoutChecksum = new ArrayList<>();
for (String address : addresses) {
String addressO = Checksum.removeChecksum(address);
addressesWithoutChecksum.add(addressO);
}
return getBalances(threshold, addressesWithoutChecksum.toArray(new String[]{}));
}
public InterruptAttachingToTangleResponse interruptAttachingToTangle() {
final Call<InterruptAttachingToTangleResponse> res = service.interruptAttachingToTangle(IotaCommandRequest.createInterruptAttachToTangleRequest());
return wrapCheckedException(res).body();
}
/**
* Attaches the specified transactions (trytes) to the Tangle by doing Proof of Work.
*
* @param trunkTransaction The trunk transaction to approve.
* @param branchTransaction The branch transaction to approve.
* @param minWeightMagnitude The Proof of Work intensity.
* @param trytes A List of trytes (raw transaction data) to attach to the tangle.
*/
public GetAttachToTangleResponse attachToTangle(String trunkTransaction, String branchTransaction, Integer minWeightMagnitude, String... trytes) throws ArgumentException {
if (!InputValidator.isHash(trunkTransaction)) {
throw new ArgumentException(INVALID_HASHES_INPUT_ERROR);
}
if (!InputValidator.isHash(branchTransaction)) {
throw new ArgumentException(INVALID_HASHES_INPUT_ERROR);
}
public GetAttachToTangleResponse attachToTangle(String trunkTransaction, String branchTransaction, Integer minWeightMagnitude, String... trytes) throws InvalidTrytesException {
if (!InputValidator.isArrayOfTrytes(trytes)) {
throw new InvalidTrytesException();
throw new ArgumentException(INVALID_TRYTES_INPUT_ERROR);
}
if (localPoW != null) {
@@ -249,29 +377,66 @@ public class IotaAPICore {
return wrapCheckedException(res).body();
}
/**
* Interrupts and completely aborts the attachToTangle process.
*/
public InterruptAttachingToTangleResponse interruptAttachingToTangle() {
final Call<InterruptAttachingToTangleResponse> res = service.interruptAttachingToTangle(IotaCommandRequest.createInterruptAttachToTangleRequest());
return wrapCheckedException(res).body();
}
/**
* Broadcast a list of transactions to all neighbors. The input trytes for this call are provided by attachToTangle.
*
* @param trytes The list of raw data of transactions to be rebroadcast.
*/
public BroadcastTransactionsResponse broadcastTransactions(String... trytes) throws ArgumentException {
if (!InputValidator.isArrayOfAttachedTrytes(trytes)) {
throw new ArgumentException(INVALID_ATTACHED_TRYTES_INPUT_ERROR);
}
final Call<BroadcastTransactionsResponse> res = service.broadcastTransactions(IotaBroadcastTransactionRequest.createBroadcastTransactionsRequest(trytes));
return wrapCheckedException(res).body();
}
/**
* Store transactions into the local storage. The trytes to be used for this call are returned by attachToTangle.
*
* @param trytes The list of raw data of transactions to be rebroadcast.
*/
public StoreTransactionsResponse storeTransactions(String... trytes) {
final Call<StoreTransactionsResponse> res = service.storeTransactions(IotaStoreTransactionsRequest.createStoreTransactionsRequest(trytes));
return wrapCheckedException(res).body();
}
public BroadcastTransactionsResponse broadcastTransactions(String... trytes) {
final Call<BroadcastTransactionsResponse> res = service.broadcastTransactions(IotaBroadcastTransactionRequest.createBroadcastTransactionsRequest(trytes));
return wrapCheckedException(res).body();
}
/**
* Gets the protocol.
*
* @return The protocol to use when connecting to the remote node.
*/
public String getProtocol() {
return protocol;
}
/**
* Gets the host.
*
* @return The host you want to connect to.
*/
public String getHost() {
return host;
}
/**
* Gets the port.
*
* @return The port of the host you want to connect to.
*/
public String getPort() {
return port;
}
@SuppressWarnings("unchecked")
public static class Builder<T extends Builder<T>> {
String protocol, host, port;
IotaLocalPoW localPoW;
@@ -332,37 +497,21 @@ public class IotaAPICore {
return (T) this;
}
/**
* @param host
* @return
*/
public T host(String host) {
this.host = host;
return (T) this;
}
/**
* @param port
* @return
*/
public T port(String port) {
this.port = port;
return (T) this;
}
/**
* @param protocol
* @return
*/
public T protocol(String protocol) {
this.protocol = protocol;
return (T) this;
}
/**
* @param localPoW
* @return
*/
public T localPoW(IotaLocalPoW localPoW) {
this.localPoW = localPoW;
return (T) this;
+37 -37
View File
@@ -18,42 +18,40 @@ public interface IotaAPIService {
String USER_AGENT_HEADER = "User-Agent: JOTA-API wrapper";
/**
* Returns information about your node.
* Returns information about the node.
* <p>
* curl http://localhost:14265 -X POST -H 'Content-Type: application/json'
* -d '{"command": "getNodeInfo"}'
*
* @return a {@code NodeInfoResponse} object, if succesfull.
* {@code curl http://localhost:14265 -X POST -H 'X-IOTA-API-Version: 1.4.1' -H 'Content-Type: application/json'}
* {@code -d '{"command": "getNodeInfo"}'}
*/
@Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER})
@POST("./")
Call<GetNodeInfoResponse> getNodeInfo(@Body IotaCommandRequest request);
/**
* Get the list of latest tips (unconfirmed transactions).
* Get the list of neighbors from the node.
* <p>
* curl http://localhost:14265 -X POST -H 'Content-Type: application/json'
* -d '{"command": "getNeighbors"}'
* {@code curl http://localhost:14265 -X POST -H 'X-IOTA-API-Version: 1.4.1' -H 'Content-Type: application/json'}
* {@code -d '{"command": "getNeighbors"}'}
*/
@Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER})
@POST("./")
Call<GetNeighborsResponse> getNeighbors(@Body IotaCommandRequest request);
/**
* Add a list of neighbors to your node.
* Add a list of neighbors to the node.
* <p>
* curl http://localhost:14265 -X POST -H 'Content-Type: application/json'
* -d '{"command": "addNeighbors", "uris": ["udp://8.8.8.8:14265", "udp://8.8.8.5:14265"]}'
* {@code curl http://localhost:14265 -X POST -H 'X-IOTA-API-Version: 1.4.1' -H 'Content-Type: application/json'}
* {@code -d '{"command": "addNeighbors", "uris": ["udp://8.8.8.8:14265", "udp://8.8.8.5:14265"]}'}
*/
@Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER})
@POST("./")
Call<AddNeighborsResponse> addNeighbors(@Body IotaNeighborsRequest request);
/**
* Removes a list of neighbors to your node.
* Removes a list of neighbors from the node.
* <p>
* curl http://localhost:14265 -X POST -H 'Content-Type: application/json'
* -d '{"command": "removeNeighbors", "uris": ["udp://8.8.8.8:14265", "udp://8.8.8.5:14265"]}'
* {@code curl http://localhost:14265 -X POST -H 'X-IOTA-API-Version: 1.4.1' -H 'Content-Type: application/json'}
* {@code -d '{"command": "removeNeighbors", "uris": ["udp://8.8.8.8:14265", "udp://8.8.8.5:14265"]}'}
*/
@Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER})
@POST("./")
@@ -62,18 +60,18 @@ public interface IotaAPIService {
/**
* Get the list of latest tips (unconfirmed transactions).
* <p>
* curl http://localhost:14265 -X POST -H 'Content-Type: application/json'
* -d '{"command": "getTips"}'
* {@code curl http://localhost:14265 -X POST -H 'X-IOTA-API-Version: 1.4.1' -H 'Content-Type: application/json'}
* {@code -d '{"command": "getTips"}'}
*/
@Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER})
@POST("./")
Call<GetTipsResponse> getTips(@Body IotaCommandRequest request);
/**
* Find the transactions which match the specified input and return
* Find the transactions which match the specified input and return.
* <p>
* curl http://localhost:14265 \ -X POST \ -H 'Content-Type: application/json' \
* -d '{"command": "findTransactions", "addresses": ["RVORZ9SIIP9RCYMREUIXXVPQIPHVCNPQ9HZWYKFWYWZRE9JQKG9REPKIASHUUECPSQO9JT9XNMVKWYGVAZETAIRPTM"]}'
* {@code curl http://localhost:14265 -X POST -H 'X-IOTA-API-Version: 1.4.1' -H 'Content-Type: application/json'}
* {@code -d '{"command": "findTransactions", "addresses": ["RVORZ9SIIP9RCYMREUIXXVPQIPHVCNPQ9HZWYKFWYWZRE9JQKG9REPKIASHUUECPSQO9JT9XNMVKWYGVAZETAIRPTM"]}'}
*/
@Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER})
@POST("./")
@@ -81,10 +79,11 @@ public interface IotaAPIService {
/**
* Get the inclusion states of a set of transactions. This is for determining if a transaction was accepted and confirmed by the network or not. You can search for multiple tips (and thus, milestones) to get past inclusion states of transactions.
* Get the inclusion states of a set of transactions. This is for determining if a transaction was accepted and confirmed by the network or not.
* You can search for multiple tips (and thus, milestones) to get past inclusion states of transactions.
* <p>
* curl http://localhost:14265 -X POST -H 'Content-Type: application/json'
* -d '{"command": "getInclusionStates", "transactions"Q9HZWYKFWYWZRE9JQKG9REPKIASHUUECPSQO9JT9XNMVKWYGVAZETAIRPTM"], "tips" : []}'
* {@code curl http://localhost:14265 -X POST -H 'Content-Type: application/json'}
* {@code -d '{"command": "getInclusionStates", "transactions"Q9HZWYKFWYWZRE9JQKG9REPKIASHUUECPSQO9JT9XNMVKWYGVAZETAIRPTM"], "tips" : []}'}
*/
@Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER})
@POST("./")
@@ -93,18 +92,19 @@ public interface IotaAPIService {
/**
* Returns the raw trytes data of a transaction.
* <p>
* curl http://localhost:14265 -X POST -H 'Content-Type: application/json'
* -d '{"command": "getTrytes", "hashes": ["OAATQS9VQLSXCLDJVJJVYUGONXAXOFMJOZNSYWRZSWECMXAQQURHQBJNLD9IOFEPGZEPEMPXCIVRX9999"]}'
* {@code curl http://localhost:14265 -X POST -H 'X-IOTA-API-Version: 1.4.1' -H 'Content-Type: application/json'}
* {@code -d '{"command": "getTrytes", "hashes": ["OAATQS9VQLSXCLDJVJJVYUGONXAXOFMJOZNSYWRZSWECMXAQQURHQBJNLD9IOFEPGZEPEMPXCIVRX9999"]}'}
*/
@Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER})
@POST("./")
Call<GetTrytesResponse> getTrytes(@Body IotaGetTrytesRequest request);
/**
* Tip selection which returns trunkTransaction and branchTransaction. The input value is the latest coordinator milestone, as provided through the getNodeInfo API call.
* Tip selection which returns trunkTransaction and branchTransaction.
* The input value is the latest coordinator milestone, as provided through the getNodeInfo API call.
* <p>
* curl http://localhost:14265 -X POST -H 'Content-Type: application/json'
* -d '{"command": "getTransactionsToApprove", "depth": 27}'
* {@code curl http://localhost:14265 -X POST -H 'X-IOTA-API-Version: 1.4.1' -H 'Content-Type: application/json'}
* {@code -d '{"command": "getTransactionsToApprove", "depth": 27}'}
*/
@Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER})
@POST("./")
@@ -113,8 +113,8 @@ public interface IotaAPIService {
/**
* It returns the confirmed balance which a list of addresses have at the latest confirmed milestone.
* <p>
* curl http://localhost:14265 -X POST -H 'Content-Type: application/json'
* -d '{"command": "getBalances", "addresses": ["HBBYKAKTILIPVUKFOTSLHGENPTXYBNKXZFQFR9VQFWNBMTQNRVOUKPVPRNBSZVVILMAFBKOTBLGLWLOHQ"], "threshold": 100}'
* {@code curl http://localhost:14265 -X POST -H 'X-IOTA-API-Version: 1.4.1' -H 'Content-Type: application/json'}
* {@code -d '{"command": "getBalances", "addresses": ["HBBYKAKTILIPVUKFOTSLHGENPTXYBNKXZFQFR9VQFWNBMTQNRVOUKPVPRNBSZVVILMAFBKOTBLGLWLOHQ"], "threshold": 100}'}
*/
@Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER})
@POST("./")
@@ -123,8 +123,8 @@ public interface IotaAPIService {
/**
* Attaches the specified transactions (trytes) to the Tangle by doing Proof of Work.
* <p>
* curl http://localhost:14265 -X POST -H 'Content-Type: application/json'
* -d '{"command": "attachToTangle", "trunkTransaction": "JVMTDGDPDFYHMZPMWEKKANBQSLSDTIIHAYQUMZOKHXXXGJHJDQPOMDOMNRDKYCZRUFZROZDADTHZC9999", "branchTransaction": "P9KFSJVGSPLXAEBJSHWFZLGP9GGJTIO9YITDEHATDTGAFLPLBZ9FOFWWTKMAZXZHFGQHUOXLXUALY9999", "minWeightMagnitude": 18, "trytes": ["TRYTVALUEHERE"]}'
* {@code curl http://localhost:14265 -X POST -H 'X-IOTA-API-Version: 1.4.1' -H 'Content-Type: application/json'}
* {@code -d '{"command": "attachToTangle", "trunkTransaction": "JVMTDGDPDFYHMZPMWEKKANBQSLSDTIIHAYQUMZOKHXXXGJHJDQPOMDOMNRDKYCZRUFZROZDADTHZC9999", "branchTransaction": "P9KFSJVGSPLXAEBJSHWFZLGP9GGJTIO9YITDEHATDTGAFLPLBZ9FOFWWTKMAZXZHFGQHUOXLXUALY9999", "minWeightMagnitude": 18, "trytes": ["TRYTVALUEHERE"]}'}
*/
@Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER})
@POST("./")
@@ -133,8 +133,8 @@ public interface IotaAPIService {
/**
* Interrupts and completely aborts the attachToTangle process.
* <p>
* curl http://localhost:14265 -X POST -H 'Content-Type: application/json'
* -d '{"command": "interruptAttachingToTangle" }
* {@code curl http://localhost:14265 -X POST -H 'X-IOTA-API-Version: 1.4.1' -H 'Content-Type: application/json'}
* {@code -d '{"command": "interruptAttachingToTangle"}'}
*/
@Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER})
@POST("./")
@@ -143,8 +143,8 @@ public interface IotaAPIService {
/**
* Broadcast a list of transactions to all neighbors. The input trytes for this call are provided by attachToTangle.
* <p>
* curl http://localhost:14265 -X POST -H 'Content-Type: application/json'
* -d '{"command": "broadcastTransactions", "trytes": ["BYSWEAUTWXHXZ9YBZISEK9LUHWGMHXCGEVNZHRLUWQFCUSDXZHOFHWHL9MQPVJXXZLIXPXPXF9KYEREFSKCPKYIIKPZVLHUTDFQKKVVBBN9ATTLPCNPJDWDEVIYYLGPZGCWXOBDXMLJC9VO9QXTTBLAXTTBFUAROYEGQIVB9MJWJKXJMCUPTWAUGFZBTZCSJVRBGMYXTVBDDS9MYUJCPZ9YDWWQNIPUAIJXXSNLKUBSCOIJPCLEFPOXFJREXQCUVUMKSDOVQGGHRNILCO9GNCLWFM9APMNMWYASHXQAYBEXF9QRIHIBHYEJOYHRQJAOKAQ9AJJFQ9WEIWIJOTZATIBOXQLBMIJU9PCGBLVDDVFP9CFFSXTDUXMEGOOFXWRTLFGV9XXMYWEMGQEEEDBTIJ9OJOXFAPFQXCDAXOUDMLVYRMRLUDBETOLRJQAEDDLNVIRQJUBZBO9CCFDHIX9MSQCWYAXJVWHCUPTRSXJDESISQPRKZAFKFRULCGVRSBLVFOPEYLEE99JD9SEBALQINPDAZHFAB9RNBH9AZWIJOTLBZVIEJIAYGMC9AZGNFWGRSWAXTYSXVROVNKCOQQIWGPNQZKHUNODGYADPYLZZZUQRTJRTODOUKAOITNOMWNGHJBBA99QUMBHRENGBHTH9KHUAOXBVIVDVYYZMSEYSJWIOGGXZVRGN999EEGQMCOYVJQRIRROMPCQBLDYIGQO9AMORPYFSSUGACOJXGAQSPDY9YWRRPESNXXBDQ9OZOXVIOMLGTSWAMKMTDRSPGJKGBXQIVNRJRFRYEZ9VJDLHIKPSKMYC9YEGHFDS9SGVDHRIXBEMLFIINOHVPXIFAZCJKBHVMQZEVWCOSNWQRDYWVAIBLSCBGESJUIBWZECPUCAYAWMTQKRMCHONIPKJYYTEGZCJYCT9ABRWTJLRQXKMWY9GWZMHYZNWPXULNZAPVQLPMYQZCYNEPOCGOHBJUZLZDPIXVHLDMQYJUUBEDXXPXFLNRGIPWBRNQQZJSGSJTTYHIGGFAWJVXWL9THTPWOOHTNQWCNYOYZXALHAZXVMIZE9WMQUDCHDJMIBWKTYH9AC9AFOT9DPCADCV9ZWUTE9QNOMSZPTZDJLJZCJGHXUNBJFUBJWQUEZDMHXGBPTNSPZBR9TGSKVOHMOQSWPGFLSWNESFKSAZY9HHERAXALZCABFYPOVLAHMIHVDBGKUMDXC9WHHTIRYHZVWNXSVQUWCR9M9RAGMFEZZKZ9XEOQGOSLFQCHHOKLDSA9QCMDGCGMRYJZLBVIFOLBIJPROKMHOYTBTJIWUZWJMCTKCJKKTR9LCVYPVJI9AHGI9JOWMIWZAGMLDFJA9WU9QAMEFGABIBEZNNAL9OXSBFLOEHKDGHWFQSHMPLYFCNXAAZYJLMQDEYRGL9QKCEUEJ9LLVUOINVSZZQHCIKPAGMT9CAYIIMTTBCPKWTYHOJIIY9GYNPAJNUJ9BKYYXSV9JSPEXYMCFAIKTGNRSQGUNIYZCRT9FOWENSZQPD9ALUPYYAVICHVYELYFPUYDTWUSWNIYFXPX9MICCCOOZIWRNJIDALWGWRATGLJXNAYTNIZWQ9YTVDBOFZRKO9CFWRPAQQRXTPACOWCPRLYRYSJARRKSQPR9TCFXDVIXLP9XVL99ERRDSOHBFJDJQQGGGCZNDQ9NYCTQJWVZIAELCRBJJFDMCNZU9FIZRPGNURTXOCDSQGXTQHKHUECGWFUUYS9J9NYQ9U9P9UUP9YMZHWWWCIASCFLCMSKTELZWUGCDE9YOKVOVKTAYPHDF9ZCCQAYPJIJNGSHUIHHCOSSOOBUDOKE9CJZGYSSGNCQJVBEFTZFJ9SQUHOASKRRGBSHWKBCBWBTJHOGQ9WOMQFHWJVEG9NYX9KWBTCAIXNXHEBDIOFO9ALYMFGRICLCKKLG9FOBOX9PDWNQRGHBKHGKKRLWTBEQMCWQRLHAVYYZDIIPKVQTHYTWQMTOACXZOQCDTJTBAAUWXSGJF9PNQIJ9AJRUMUVCPWYVYVARKR9RKGOUHHNKNVGGPDDLGKPQNOYHNKAVVKCXWXOQPZNSLATUJT9AUWRMPPSWHSTTYDFAQDXOCYTZHOYYGAIM9CELMZ9AZPWB9MJXGHOKDNNSZVUDAGXTJJSSZCPZVPZBYNNTUQABSXQWZCHDQSLGK9UOHCFKBIBNETK999999999999999999999999999999999999999999999999999999999999999999999999999999999NOXDXXKUDWLOFJLIPQIBRBMGDYCPGDNLQOLQS99EQYKBIU9VHCJVIPFUYCQDNY9APGEVYLCENJIOBLWNB999999999XKBRHUD99C99999999NKZKEKWLDKMJCI9N9XQOLWEPAYWSH9999999999999999999999999KDDTGZLIPBNZKMLTOLOXQVNGLASESDQVPTXALEKRMIOHQLUHD9ELQDBQETS9QFGTYOYWLNTSKKMVJAUXSIROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999IROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999"]}
* {@code curl http://localhost:14265 -X POST -H 'X-IOTA-API-Version: 1.4.1' -H 'Content-Type: application/json'}
* {@code -d '{"command": "broadcastTransactions", "trytes": ["BYSWEAUTWXHXZ9YBZISEK9LUHWGMHXCGEVNZHRLUWQFCUSDXZHOFHWHL9MQPVJXXZLIXPXPXF9KYEREFSKCPKYIIKPZVLHUTDFQKKVVBBN9ATTLPCNPJDWDEVIYYLGPZGCWXOBDXMLJC9VO9QXTTBLAXTTBFUAROYEGQIVB9MJWJKXJMCUPTWAUGFZBTZCSJVRBGMYXTVBDDS9MYUJCPZ9YDWWQNIPUAIJXXSNLKUBSCOIJPCLEFPOXFJREXQCUVUMKSDOVQGGHRNILCO9GNCLWFM9APMNMWYASHXQAYBEXF9QRIHIBHYEJOYHRQJAOKAQ9AJJFQ9WEIWIJOTZATIBOXQLBMIJU9PCGBLVDDVFP9CFFSXTDUXMEGOOFXWRTLFGV9XXMYWEMGQEEEDBTIJ9OJOXFAPFQXCDAXOUDMLVYRMRLUDBETOLRJQAEDDLNVIRQJUBZBO9CCFDHIX9MSQCWYAXJVWHCUPTRSXJDESISQPRKZAFKFRULCGVRSBLVFOPEYLEE99JD9SEBALQINPDAZHFAB9RNBH9AZWIJOTLBZVIEJIAYGMC9AZGNFWGRSWAXTYSXVROVNKCOQQIWGPNQZKHUNODGYADPYLZZZUQRTJRTODOUKAOITNOMWNGHJBBA99QUMBHRENGBHTH9KHUAOXBVIVDVYYZMSEYSJWIOGGXZVRGN999EEGQMCOYVJQRIRROMPCQBLDYIGQO9AMORPYFSSUGACOJXGAQSPDY9YWRRPESNXXBDQ9OZOXVIOMLGTSWAMKMTDRSPGJKGBXQIVNRJRFRYEZ9VJDLHIKPSKMYC9YEGHFDS9SGVDHRIXBEMLFIINOHVPXIFAZCJKBHVMQZEVWCOSNWQRDYWVAIBLSCBGESJUIBWZECPUCAYAWMTQKRMCHONIPKJYYTEGZCJYCT9ABRWTJLRQXKMWY9GWZMHYZNWPXULNZAPVQLPMYQZCYNEPOCGOHBJUZLZDPIXVHLDMQYJUUBEDXXPXFLNRGIPWBRNQQZJSGSJTTYHIGGFAWJVXWL9THTPWOOHTNQWCNYOYZXALHAZXVMIZE9WMQUDCHDJMIBWKTYH9AC9AFOT9DPCADCV9ZWUTE9QNOMSZPTZDJLJZCJGHXUNBJFUBJWQUEZDMHXGBPTNSPZBR9TGSKVOHMOQSWPGFLSWNESFKSAZY9HHERAXALZCABFYPOVLAHMIHVDBGKUMDXC9WHHTIRYHZVWNXSVQUWCR9M9RAGMFEZZKZ9XEOQGOSLFQCHHOKLDSA9QCMDGCGMRYJZLBVIFOLBIJPROKMHOYTBTJIWUZWJMCTKCJKKTR9LCVYPVJI9AHGI9JOWMIWZAGMLDFJA9WU9QAMEFGABIBEZNNAL9OXSBFLOEHKDGHWFQSHMPLYFCNXAAZYJLMQDEYRGL9QKCEUEJ9LLVUOINVSZZQHCIKPAGMT9CAYIIMTTBCPKWTYHOJIIY9GYNPAJNUJ9BKYYXSV9JSPEXYMCFAIKTGNRSQGUNIYZCRT9FOWENSZQPD9ALUPYYAVICHVYELYFPUYDTWUSWNIYFXPX9MICCCOOZIWRNJIDALWGWRATGLJXNAYTNIZWQ9YTVDBOFZRKO9CFWRPAQQRXTPACOWCPRLYRYSJARRKSQPR9TCFXDVIXLP9XVL99ERRDSOHBFJDJQQGGGCZNDQ9NYCTQJWVZIAELCRBJJFDMCNZU9FIZRPGNURTXOCDSQGXTQHKHUECGWFUUYS9J9NYQ9U9P9UUP9YMZHWWWCIASCFLCMSKTELZWUGCDE9YOKVOVKTAYPHDF9ZCCQAYPJIJNGSHUIHHCOSSOOBUDOKE9CJZGYSSGNCQJVBEFTZFJ9SQUHOASKRRGBSHWKBCBWBTJHOGQ9WOMQFHWJVEG9NYX9KWBTCAIXNXHEBDIOFO9ALYMFGRICLCKKLG9FOBOX9PDWNQRGHBKHGKKRLWTBEQMCWQRLHAVYYZDIIPKVQTHYTWQMTOACXZOQCDTJTBAAUWXSGJF9PNQIJ9AJRUMUVCPWYVYVARKR9RKGOUHHNKNVGGPDDLGKPQNOYHNKAVVKCXWXOQPZNSLATUJT9AUWRMPPSWHSTTYDFAQDXOCYTZHOYYGAIM9CELMZ9AZPWB9MJXGHOKDNNSZVUDAGXTJJSSZCPZVPZBYNNTUQABSXQWZCHDQSLGK9UOHCFKBIBNETK999999999999999999999999999999999999999999999999999999999999999999999999999999999NOXDXXKUDWLOFJLIPQIBRBMGDYCPGDNLQOLQS99EQYKBIU9VHCJVIPFUYCQDNY9APGEVYLCENJIOBLWNB999999999XKBRHUD99C99999999NKZKEKWLDKMJCI9N9XQOLWEPAYWSH9999999999999999999999999KDDTGZLIPBNZKMLTOLOXQVNGLASESDQVPTXALEKRMIOHQLUHD9ELQDBQETS9QFGTYOYWLNTSKKMVJAUXSIROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999IROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999"]}'}
*/
@Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER})
@POST("./")
@@ -153,8 +153,8 @@ public interface IotaAPIService {
/**
* Store transactions into the local storage. The trytes to be used for this call are returned by attachToTangle.
* <p>
* curl http://localhost:14265 -X POST -H 'Content-Type: application/json'
* -d '{"command": "storeTransactions", "trytes": ["BYSWEAUTWXHXZ9YBZISEK9LUHWGMHXCGEVNZHRLUWQFCUSDXZHOFHWHL9MQPVJXXZLIXPXPXF9KYEREFSKCPKYIIKPZVLHUTDFQKKVVBBN9ATTLPCNPJDWDEVIYYLGPZGCWXOBDXMLJC9VO9QXTTBLAXTTBFUAROYEGQIVB9MJWJKXJMCUPTWAUGFZBTZCSJVRBGMYXTVBDDS9MYUJCPZ9YDWWQNIPUAIJXXSNLKUBSCOIJPCLEFPOXFJREXQCUVUMKSDOVQGGHRNILCO9GNCLWFM9APMNMWYASHXQAYBEXF9QRIHIBHYEJOYHRQJAOKAQ9AJJFQ9WEIWIJOTZATIBOXQLBMIJU9PCGBLVDDVFP9CFFSXTDUXMEGOOFXWRTLFGV9XXMYWEMGQEEEDBTIJ9OJOXFAPFQXCDAXOUDMLVYRMRLUDBETOLRJQAEDDLNVIRQJUBZBO9CCFDHIX9MSQCWYAXJVWHCUPTRSXJDESISQPRKZAFKFRULCGVRSBLVFOPEYLEE99JD9SEBALQINPDAZHFAB9RNBH9AZWIJOTLBZVIEJIAYGMC9AZGNFWGRSWAXTYSXVROVNKCOQQIWGPNQZKHUNODGYADPYLZZZUQRTJRTODOUKAOITNOMWNGHJBBA99QUMBHRENGBHTH9KHUAOXBVIVDVYYZMSEYSJWIOGGXZVRGN999EEGQMCOYVJQRIRROMPCQBLDYIGQO9AMORPYFSSUGACOJXGAQSPDY9YWRRPESNXXBDQ9OZOXVIOMLGTSWAMKMTDRSPGJKGBXQIVNRJRFRYEZ9VJDLHIKPSKMYC9YEGHFDS9SGVDHRIXBEMLFIINOHVPXIFAZCJKBHVMQZEVWCOSNWQRDYWVAIBLSCBGESJUIBWZECPUCAYAWMTQKRMCHONIPKJYYTEGZCJYCT9ABRWTJLRQXKMWY9GWZMHYZNWPXULNZAPVQLPMYQZCYNEPOCGOHBJUZLZDPIXVHLDMQYJUUBEDXXPXFLNRGIPWBRNQQZJSGSJTTYHIGGFAWJVXWL9THTPWOOHTNQWCNYOYZXALHAZXVMIZE9WMQUDCHDJMIBWKTYH9AC9AFOT9DPCADCV9ZWUTE9QNOMSZPTZDJLJZCJGHXUNBJFUBJWQUEZDMHXGBPTNSPZBR9TGSKVOHMOQSWPGFLSWNESFKSAZY9HHERAXALZCABFYPOVLAHMIHVDBGKUMDXC9WHHTIRYHZVWNXSVQUWCR9M9RAGMFEZZKZ9XEOQGOSLFQCHHOKLDSA9QCMDGCGMRYJZLBVIFOLBIJPROKMHOYTBTJIWUZWJMCTKCJKKTR9LCVYPVJI9AHGI9JOWMIWZAGMLDFJA9WU9QAMEFGABIBEZNNAL9OXSBFLOEHKDGHWFQSHMPLYFCNXAAZYJLMQDEYRGL9QKCEUEJ9LLVUOINVSZZQHCIKPAGMT9CAYIIMTTBCPKWTYHOJIIY9GYNPAJNUJ9BKYYXSV9JSPEXYMCFAIKTGNRSQGUNIYZCRT9FOWENSZQPD9ALUPYYAVICHVYELYFPUYDTWUSWNIYFXPX9MICCCOOZIWRNJIDALWGWRATGLJXNAYTNIZWQ9YTVDBOFZRKO9CFWRPAQQRXTPACOWCPRLYRYSJARRKSQPR9TCFXDVIXLP9XVL99ERRDSOHBFJDJQQGGGCZNDQ9NYCTQJWVZIAELCRBJJFDMCNZU9FIZRPGNURTXOCDSQGXTQHKHUECGWFUUYS9J9NYQ9U9P9UUP9YMZHWWWCIASCFLCMSKTELZWUGCDE9YOKVOVKTAYPHDF9ZCCQAYPJIJNGSHUIHHCOSSOOBUDOKE9CJZGYSSGNCQJVBEFTZFJ9SQUHOASKRRGBSHWKBCBWBTJHOGQ9WOMQFHWJVEG9NYX9KWBTCAIXNXHEBDIOFO9ALYMFGRICLCKKLG9FOBOX9PDWNQRGHBKHGKKRLWTBEQMCWQRLHAVYYZDIIPKVQTHYTWQMTOACXZOQCDTJTBAAUWXSGJF9PNQIJ9AJRUMUVCPWYVYVARKR9RKGOUHHNKNVGGPDDLGKPQNOYHNKAVVKCXWXOQPZNSLATUJT9AUWRMPPSWHSTTYDFAQDXOCYTZHOYYGAIM9CELMZ9AZPWB9MJXGHOKDNNSZVUDAGXTJJSSZCPZVPZBYNNTUQABSXQWZCHDQSLGK9UOHCFKBIBNETK999999999999999999999999999999999999999999999999999999999999999999999999999999999NOXDXXKUDWLOFJLIPQIBRBMGDYCPGDNLQOLQS99EQYKBIU9VHCJVIPFUYCQDNY9APGEVYLCENJIOBLWNB999999999XKBRHUD99C99999999NKZKEKWLDKMJCI9N9XQOLWEPAYWSH9999999999999999999999999KDDTGZLIPBNZKMLTOLOXQVNGLASESDQVPTXALEKRMIOHQLUHD9ELQDBQETS9QFGTYOYWLNTSKKMVJAUXSIROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999IROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999"]}'
* {@code curl http://localhost:14265 -X POST -H 'X-IOTA-API-Version: 1.4.1' -H 'Content-Type: application/json'}
* {@code -d '{"command": "storeTransactions", "trytes": ["BYSWEAUTWXHXZ9YBZISEK9LUHWGMHXCGEVNZHRLUWQFCUSDXZHOFHWHL9MQPVJXXZLIXPXPXF9KYEREFSKCPKYIIKPZVLHUTDFQKKVVBBN9ATTLPCNPJDWDEVIYYLGPZGCWXOBDXMLJC9VO9QXTTBLAXTTBFUAROYEGQIVB9MJWJKXJMCUPTWAUGFZBTZCSJVRBGMYXTVBDDS9MYUJCPZ9YDWWQNIPUAIJXXSNLKUBSCOIJPCLEFPOXFJREXQCUVUMKSDOVQGGHRNILCO9GNCLWFM9APMNMWYASHXQAYBEXF9QRIHIBHYEJOYHRQJAOKAQ9AJJFQ9WEIWIJOTZATIBOXQLBMIJU9PCGBLVDDVFP9CFFSXTDUXMEGOOFXWRTLFGV9XXMYWEMGQEEEDBTIJ9OJOXFAPFQXCDAXOUDMLVYRMRLUDBETOLRJQAEDDLNVIRQJUBZBO9CCFDHIX9MSQCWYAXJVWHCUPTRSXJDESISQPRKZAFKFRULCGVRSBLVFOPEYLEE99JD9SEBALQINPDAZHFAB9RNBH9AZWIJOTLBZVIEJIAYGMC9AZGNFWGRSWAXTYSXVROVNKCOQQIWGPNQZKHUNODGYADPYLZZZUQRTJRTODOUKAOITNOMWNGHJBBA99QUMBHRENGBHTH9KHUAOXBVIVDVYYZMSEYSJWIOGGXZVRGN999EEGQMCOYVJQRIRROMPCQBLDYIGQO9AMORPYFSSUGACOJXGAQSPDY9YWRRPESNXXBDQ9OZOXVIOMLGTSWAMKMTDRSPGJKGBXQIVNRJRFRYEZ9VJDLHIKPSKMYC9YEGHFDS9SGVDHRIXBEMLFIINOHVPXIFAZCJKBHVMQZEVWCOSNWQRDYWVAIBLSCBGESJUIBWZECPUCAYAWMTQKRMCHONIPKJYYTEGZCJYCT9ABRWTJLRQXKMWY9GWZMHYZNWPXULNZAPVQLPMYQZCYNEPOCGOHBJUZLZDPIXVHLDMQYJUUBEDXXPXFLNRGIPWBRNQQZJSGSJTTYHIGGFAWJVXWL9THTPWOOHTNQWCNYOYZXALHAZXVMIZE9WMQUDCHDJMIBWKTYH9AC9AFOT9DPCADCV9ZWUTE9QNOMSZPTZDJLJZCJGHXUNBJFUBJWQUEZDMHXGBPTNSPZBR9TGSKVOHMOQSWPGFLSWNESFKSAZY9HHERAXALZCABFYPOVLAHMIHVDBGKUMDXC9WHHTIRYHZVWNXSVQUWCR9M9RAGMFEZZKZ9XEOQGOSLFQCHHOKLDSA9QCMDGCGMRYJZLBVIFOLBIJPROKMHOYTBTJIWUZWJMCTKCJKKTR9LCVYPVJI9AHGI9JOWMIWZAGMLDFJA9WU9QAMEFGABIBEZNNAL9OXSBFLOEHKDGHWFQSHMPLYFCNXAAZYJLMQDEYRGL9QKCEUEJ9LLVUOINVSZZQHCIKPAGMT9CAYIIMTTBCPKWTYHOJIIY9GYNPAJNUJ9BKYYXSV9JSPEXYMCFAIKTGNRSQGUNIYZCRT9FOWENSZQPD9ALUPYYAVICHVYELYFPUYDTWUSWNIYFXPX9MICCCOOZIWRNJIDALWGWRATGLJXNAYTNIZWQ9YTVDBOFZRKO9CFWRPAQQRXTPACOWCPRLYRYSJARRKSQPR9TCFXDVIXLP9XVL99ERRDSOHBFJDJQQGGGCZNDQ9NYCTQJWVZIAELCRBJJFDMCNZU9FIZRPGNURTXOCDSQGXTQHKHUECGWFUUYS9J9NYQ9U9P9UUP9YMZHWWWCIASCFLCMSKTELZWUGCDE9YOKVOVKTAYPHDF9ZCCQAYPJIJNGSHUIHHCOSSOOBUDOKE9CJZGYSSGNCQJVBEFTZFJ9SQUHOASKRRGBSHWKBCBWBTJHOGQ9WOMQFHWJVEG9NYX9KWBTCAIXNXHEBDIOFO9ALYMFGRICLCKKLG9FOBOX9PDWNQRGHBKHGKKRLWTBEQMCWQRLHAVYYZDIIPKVQTHYTWQMTOACXZOQCDTJTBAAUWXSGJF9PNQIJ9AJRUMUVCPWYVYVARKR9RKGOUHHNKNVGGPDDLGKPQNOYHNKAVVKCXWXOQPZNSLATUJT9AUWRMPPSWHSTTYDFAQDXOCYTZHOYYGAIM9CELMZ9AZPWB9MJXGHOKDNNSZVUDAGXTJJSSZCPZVPZBYNNTUQABSXQWZCHDQSLGK9UOHCFKBIBNETK999999999999999999999999999999999999999999999999999999999999999999999999999999999NOXDXXKUDWLOFJLIPQIBRBMGDYCPGDNLQOLQS99EQYKBIU9VHCJVIPFUYCQDNY9APGEVYLCENJIOBLWNB999999999XKBRHUD99C99999999NKZKEKWLDKMJCI9N9XQOLWEPAYWSH9999999999999999999999999KDDTGZLIPBNZKMLTOLOXQVNGLASESDQVPTXALEKRMIOHQLUHD9ELQDBQETS9QFGTYOYWLNTSKKMVJAUXSIROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999IROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999"]}'}
*/
@Headers({CONTENT_TYPE_HEADER, USER_AGENT_HEADER})
@POST("./")
@@ -4,7 +4,7 @@ import jota.IotaAPICommands;
/**
* This class represents the core API request 'attachToTangle'.
* <p>
*
* It is used to attach trytes to the tangle.
**/
public class IotaAttachToTangleRequest extends IotaCommandRequest {
@@ -4,7 +4,7 @@ import jota.IotaAPICommands;
/**
* This class represents the core API request 'broadcastTransaction'.
* <p>
*
* Broadcast a list of transactions to all neighbors. The input trytes for this call are provided by attachToTangle
**/
public class IotaBroadcastTransactionRequest extends IotaCommandRequest {
@@ -10,7 +10,7 @@ public class IotaCommandRequest {
final String command;
/**
* @param command
* Initializes a new instance of the IotaCommandRequest class.
*/
protected IotaCommandRequest(IotaAPICommands command) {
this.command = command.command();
@@ -4,7 +4,7 @@ import jota.IotaAPICommands;
/**
* This class represents the core API request 'getTransactionsToApprove'.
* <p>
*
* It stores transactions into the local storage. The trytes to be used for this call are returned by attachToTangle.
**/
public class IotaStoreTransactionsRequest extends IotaCommandRequest {
@@ -1,6 +1,7 @@
package jota.dto.response;
import jota.model.Bundle;
import jota.model.Input;
import java.util.List;
@@ -11,16 +12,18 @@ public class GetAccountDataResponse extends AbstractResponse {
private List<String> addresses;
private Bundle[] transferBundle;
private List<Input> inputs;
private long balance;
/**
* Initializes a new instance of the GetAccountDataResponse class.
*/
public static GetAccountDataResponse create(List<String> addresses, Bundle[] transferBundle, long balance, long duration) {
public static GetAccountDataResponse create(List<String> addresses, Bundle[] transferBundle, List<Input> inputs, long balance, long duration) {
GetAccountDataResponse res = new GetAccountDataResponse();
res.addresses = addresses;
res.transferBundle = transferBundle;
res.inputs = inputs;
res.balance = balance;
res.setDuration(duration);
return res;
@@ -44,6 +47,15 @@ public class GetAccountDataResponse extends AbstractResponse {
return transferBundle;
}
/**
* Gets the inputs.
*
* @return The inputs.
*/
public List<Input> getInput() {
return inputs;
}
/**
* Gets the balance.
*
@@ -9,16 +9,16 @@ import java.util.List;
**/
public class GetBalancesAndFormatResponse extends AbstractResponse {
private List<Input> input;
private List<Input> inputs;
private long totalBalance;
/**
* Initializes a new instance of the GetBalancesAndFormatResponse class.
*/
public static GetBalancesAndFormatResponse create(List<Input> inputs, long totalBalance2, long duration) {
public static GetBalancesAndFormatResponse create(List<Input> inputs, long totalBalance, long duration) {
GetBalancesAndFormatResponse res = new GetBalancesAndFormatResponse();
res.setInput(inputs);
res.setTotalBalance(totalBalance2);
res.inputs = inputs;
res.totalBalance = totalBalance;
res.setDuration(duration);
return res;
}
@@ -28,8 +28,8 @@ public class GetBalancesAndFormatResponse extends AbstractResponse {
*
* @return The transactions.
*/
public List<Input> getInput() {
return input;
public List<Input> getInputs() {
return inputs;
}
/**
@@ -37,8 +37,8 @@ public class GetBalancesAndFormatResponse extends AbstractResponse {
*
* @param input The input.
*/
public void setInput(List<Input> input) {
this.input = input;
public void setInputs(List<Input> input) {
this.inputs = inputs;
}
/**
@@ -23,7 +23,7 @@ public class GetNodeInfoResponse extends AbstractResponse {
private int transactionsToRequest;
/**
* Name of the IOTA software you're currently using (IRI stands for Initial Reference Implementation).
* The name of the IOTA software the node currently running (IRI stands for Initial Reference Implementation).
*
* @return appName
*/
@@ -32,9 +32,9 @@ public class GetNodeInfoResponse extends AbstractResponse {
}
/**
* The version of the IOTA software you're currently running.
* The version of the IOTA software the node currently running.
*
* @return The version of the IOTA software you're currently running.
* @return The version of the IOTA software the node currently running.
*/
public String getAppVersion() {
return appVersion;
@@ -50,9 +50,9 @@ public class GetNodeInfoResponse extends AbstractResponse {
}
/**
* Available cores on your machine for JRE.
* Available cores on the node currently running.
*
* @return Available cores on your machine for JRE.
* @return Available cores on the machine for JRE.
*/
public Integer getJreAvailableProcessors() {
return jreAvailableProcessors;
@@ -105,7 +105,7 @@ public class GetNodeInfoResponse extends AbstractResponse {
/**
* The latest milestone which is solid and is used for sending transactions.
* For a milestone to become solid your local node must basically approve the subtangle of coordinator-approved transactions,
* For a milestone to become solid the local node must basically approve the subtangle of coordinator-approved transactions,
* and have a consistent view of all referenced transactions.
*
* @return The latest milestone which is solid and is used for sending transactions.
@@ -124,9 +124,9 @@ public class GetNodeInfoResponse extends AbstractResponse {
}
/**
* Number of neighbors you are directly connected with.
* Number of neighbors the node connected with.
*
* @return Number of neighbors you are directly connected with.
* @return Number of neighbors the node connected with.
*/
public int getNeighbors() {
return neighbors;
@@ -15,6 +15,7 @@ public class GetTransferResponse extends AbstractResponse {
public static GetTransferResponse create(Bundle[] transferBundle, long duration) {
GetTransferResponse res = new GetTransferResponse();
res.transferBundle = transferBundle;
res.setDuration(duration);
return res;
}
@@ -1,22 +1,47 @@
package jota.dto.response;
import jota.model.Transaction;
import java.util.ArrayList;
import java.util.List;
/**
* Response of api request 'sendTransfer'.
**/
public class SendTransferResponse extends AbstractResponse {
private List<Transaction> transactions = new ArrayList<>();
private Boolean[] successfully;
/**
* Initializes a new instance of the SendTransferResponse class.
*/
public static SendTransferResponse create(Boolean[] successfully, long duration) {
public static SendTransferResponse create(List<Transaction> transactions, Boolean[] successfully, long duration) {
SendTransferResponse res = new SendTransferResponse();
res.transactions = transactions;
res.successfully = successfully;
res.setDuration(duration);
return res;
}
/**
* Gets the transactions.
*
* @return The transactions.
*/
public List<Transaction> getTransactions() {
return transactions;
}
/**
* Sets the transactions.
*
* @param transactions The transactions.
*/
public void setTransactions(List<Transaction> transactions) {
this.transactions = transactions;
}
/**
* Gets the successfully.
*
@@ -34,5 +59,4 @@ public class SendTransferResponse extends AbstractResponse {
public void setSuccessfully(Boolean[] successfully) {
this.successfully = successfully;
}
}
@@ -1,16 +0,0 @@
package jota.error;
/**
* This exceptions occurs if its not possible to broadcast and store.
*
* @author Adrian
*/
public class BroadcastAndStoreException extends BaseException {
/**
* Initializes a new instance of the BroadcastAndStoreException.
*/
public BroadcastAndStoreException() {
super("Impossible to broadcastAndStore, aborting.");
}
}
@@ -1,16 +0,0 @@
package jota.error;
/**
* This exception occurs when an invalid address is provided.
*
* @author Adrian
*/
public class InvalidAddressException extends BaseException {
/**
* Initializes a new instance of the InvalidAddressException.
*/
public InvalidAddressException() {
super("Invalid Address!");
}
}
@@ -1,16 +0,0 @@
package jota.error;
/**
* This exception occurs when invalid api version is provided.
*
* @author pinpong
*/
public class InvalidApiVersionException extends BaseException {
/**
* Initializes a new instance of the InvalidApiVersionException.
*/
public InvalidApiVersionException() {
super("Invalid api version");
}
}
@@ -1,23 +0,0 @@
package jota.error;
/**
* This exceptions occurs if an invalid bundle was found or provided.
*
* @author Adrian
*/
public class InvalidBundleException extends BaseException {
/**
* Initializes a new instance of the InvalidBundleException.
*/
public InvalidBundleException() {
super("Invalid Bundle");
}
/**
* Initializes a new instance of the InvalidBundleException.
*/
public InvalidBundleException(String msg) {
super(msg);
}
}
@@ -1,16 +0,0 @@
package jota.error;
/**
* This exception occurs when an invalid security level is provided.
*
* @author pinpong
*/
public class InvalidSecurityLevelException extends BaseException {
/**
* Initializes a new instance of the InvalidSecurityLevelException.
*/
public InvalidSecurityLevelException() {
super("Invalid security level");
}
}
@@ -1,16 +0,0 @@
package jota.error;
/**
* This exception occurs when an invalid signature is encountered.
*
* @author Adrian
*/
public class InvalidSignatureException extends BaseException {
/**
* Initializes a new instance of the InvalidSignatureException.
*/
public InvalidSignatureException() {
super("Invalid Signatures!");
}
}
@@ -1,16 +0,0 @@
package jota.error;
/**
* This exception occurs when an invalid transfer is provided.
*
* @author pinpong
*/
public class InvalidTransferException extends BaseException {
/**
* Initializes a new instance of the InvalidTransferException.
*/
public InvalidTransferException() {
super("Invalid Transfer!");
}
}
@@ -1,16 +0,0 @@
package jota.error;
/**
* This exception occurs when invalid trytes is provided.
*
* @author Adrian
*/
public class InvalidTrytesException extends BaseException {
/**
* Initializes a new instance of the InvalidTrytesException.
*/
public InvalidTrytesException() {
super("Invalid input trytes");
}
}
@@ -1,16 +0,0 @@
package jota.error;
/**
* This exception occurs when it not possible to get a inclusion state.
*
* @author Adrian
*/
public class NoInclusionStatesException extends BaseException {
/**
* Initializes a new instance of the NoInclusionStatesException.
*/
public NoInclusionStatesException() {
super("No inclusion states for the provided seed");
}
}
@@ -1,16 +0,0 @@
package jota.error;
/**
* This exception occurs when its not possible to get node info.
*
* @author Adrian
*/
public class NoNodeInfoException extends BaseException {
/**
* Initializes a new instance of the NoNodeInfoException.
*/
public NoNodeInfoException() {
super("Node info could not be retrieved");
}
}
@@ -1,21 +0,0 @@
package jota.error;
/**
* This exception occurs when a transfer fails because their is not enough balance to perform the transfer.
*
* @author Adrian
*/
public class NotEnoughBalanceException extends BaseException {
/**
* Serial version UID
*/
private static final long serialVersionUID = -3807270816402226476L;
/**
* Initializes a new instance of the NotEnoughBalanceException.
*/
public NotEnoughBalanceException() {
super("Not enough balance");
}
}
+8 -8
View File
@@ -123,14 +123,14 @@ public class Bundle implements Comparable<Bundle> {
normalizedBundleValue = normalizedBundle(hashInTrytes);
boolean foundValue = false;
for (int i = 0; i < normalizedBundleValue.length; i++) {
if (normalizedBundleValue[i] == 13) {
foundValue = true;
obsoleteTagTrits = Converter.trits(this.getTransactions().get(0).getObsoleteTag());
Converter.increment(obsoleteTagTrits, 81);
this.getTransactions().get(0).setObsoleteTag(Converter.trytes(obsoleteTagTrits));
for (int aNormalizedBundleValue : normalizedBundleValue) {
if (aNormalizedBundleValue == 13) {
foundValue = true;
obsoleteTagTrits = Converter.trits(this.getTransactions().get(0).getObsoleteTag());
Converter.increment(obsoleteTagTrits, 81);
this.getTransactions().get(0).setObsoleteTag(Converter.trytes(obsoleteTagTrits));
}
}
}
valid = !foundValue;
} while (!valid);
@@ -148,7 +148,7 @@ public class Bundle implements Comparable<Bundle> {
public void addTrytes(List<String> signatureFragments) {
String emptySignatureFragment = "";
String emptyHash = EMPTY_HASH;
long emptyTimestamp = 999999999l;
long emptyTimestamp = 999999999L;
emptySignatureFragment = StringUtils.rightPad(emptySignatureFragment, 2187, '9');
@@ -423,7 +423,7 @@ public class Transaction {
this.tag = this.tag != null && !this.tag.isEmpty() ? this.tag : this.obsoleteTag;
String trx = this.getSignatureFragments()
return this.getSignatureFragments()
+ this.getAddress()
+ Converter.trytes(valueTrits)
+ this.getObsoleteTag()
@@ -438,7 +438,6 @@ public class Transaction {
+ Converter.trytes(attachmentTimestampLowerBoundTrits)
+ Converter.trytes(attachmentTimestampUpperBoundTrits)
+ this.getNonce();
return trx;
}
/**
+12 -3
View File
@@ -29,7 +29,16 @@ public class Transfer {
this.value = value;
this.message = message;
this.tag = tag;
}
/**
* Initializes a new instance of the Transfer class.
*/
public Transfer(String address, long value) {
this.address = address;
this.value = value;
this.message = "";
this.tag = "";
}
/**
@@ -118,7 +127,7 @@ public class Transfer {
/**
* Set the timestamp.
*
* @param timestamp The timestamp.
* @param timestamp The timestamp in seconds.
*/
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
@@ -154,7 +163,7 @@ public class Transfer {
/**
* Set the message.
*
* @param message The message.
* @param message The message trytes encoded.
*/
public void setMessage(String message) {
this.message = message;
@@ -172,7 +181,7 @@ public class Transfer {
/**
* Set the tag.
*
* @param tag The tag.
* @param tag The tag max 27 trytes encoded.
*/
public void setTag(String tag) {
this.tag = tag;
+1 -1
View File
@@ -8,7 +8,7 @@ import java.util.NoSuchElementException;
/**
* (c) 2016 Come-from-Beyond
* <p>
*
* JCurl belongs to the sponge function family.
*/
public class JCurl implements ICurl {
+2 -2
View File
@@ -40,8 +40,8 @@ public class Kerl extends JCurl {
private static int sum(int[] toSum) {
int sum = 0;
for (int i = 0; i < toSum.length; i++) {
sum += toSum[i];
for (int aToSum : toSum) {
sum += aToSum;
}
return sum;
}
+19 -20
View File
@@ -1,10 +1,12 @@
package jota.utils;
import jota.error.InvalidAddressException;
import jota.error.ArgumentException;
import jota.pow.ICurl;
import jota.pow.JCurl;
import jota.pow.SpongeFactory;
import static jota.utils.Constants.INVALID_ADDRESSES_INPUT_ERROR;
/**
* This class defines utility methods to add/remove the checksum to/from an address.
*
@@ -17,9 +19,9 @@ public class Checksum {
*
* @param address The address without checksum.
* @return The address with the appended checksum.
* @throws InvalidAddressException is thrown when the specified address is not an valid address.
* @throws ArgumentException is thrown when the specified address is not an valid address.
**/
public static String addChecksum(String address) throws InvalidAddressException {
public static String addChecksum(String address) throws ArgumentException {
InputValidator.checkAddress(address);
String addressWithChecksum = address;
addressWithChecksum += calculateChecksum(address);
@@ -31,15 +33,15 @@ public class Checksum {
*
* @param address The address with checksum.
* @return The address without checksum.
* @throws InvalidAddressException is thrown when the specified address is not an address with checksum.
* @throws ArgumentException is thrown when the specified address is not an address with checksum.
**/
public static String removeChecksum(String address) throws InvalidAddressException {
public static String removeChecksum(String address) throws ArgumentException {
if (isAddressWithChecksum(address)) {
return removeChecksumFromAddress(address);
} else if (isAddressWithoutChecksum(address)) {
return address;
}
throw new InvalidAddressException();
throw new ArgumentException(INVALID_ADDRESSES_INPUT_ERROR);
}
private static String removeChecksumFromAddress(String addressWithChecksum) {
@@ -51,35 +53,33 @@ public class Checksum {
*
* @param addressWithChecksum The address with checksum.
* @return <code>true</code> if the specified address with checksum has a valid checksum [the specified address with checksum]; otherwise, <code>false</code>.
* @throws InvalidAddressException is thrown when the specified address is not an valid address.
* @throws ArgumentException is thrown when the specified address is not an valid address.
**/
public static boolean isValidChecksum(String addressWithChecksum) throws InvalidAddressException {
public static boolean isValidChecksum(String addressWithChecksum) throws ArgumentException {
String addressWithoutChecksum = removeChecksum(addressWithChecksum);
String addressWithRecalculateChecksum = addressWithoutChecksum += calculateChecksum(addressWithoutChecksum);
return addressWithRecalculateChecksum.equals(addressWithChecksum);
}
/**
* Check if specified address is a address with checksum.
* Check if specified address is an address with checksum.
*
* @param address The address to check.
* @return <code>true</code> if the specified address is with checksum ; otherwise, <code>false</code>.
* @throws InvalidAddressException is thrown when the specified address is not an valid address
* @throws ArgumentException is thrown when the specified address is not an valid address.
**/
public static boolean isAddressWithChecksum(String address) throws InvalidAddressException {
public static boolean isAddressWithChecksum(String address) throws ArgumentException {
return InputValidator.checkAddress(address) && address.length() == Constants.ADDRESS_LENGTH_WITH_CHECKSUM;
}
/**
* check if specified address is a address
* Check if specified address is an address without checksum.
*
* @param address address
* @return boolean
* @throws InvalidAddressException is thrown when the specified address is not an valid address
* @param address The address to check.
* @return <code>true</code> if the specified address is without checksum ; otherwise, <code>false</code>.
* @throws ArgumentException is thrown when the specified address is not an valid address.
**/
public static boolean isAddressWithoutChecksum(String address) throws InvalidAddressException {
public static boolean isAddressWithoutChecksum(String address) throws ArgumentException {
return InputValidator.checkAddress(address) && address.length() == Constants.ADDRESS_LENGTH_WITHOUT_CHECKSUM;
}
@@ -90,7 +90,6 @@ public class Checksum {
int[] checksumTrits = new int[JCurl.HASH_LENGTH];
curl.squeeze(checksumTrits);
String checksum = Converter.trytes(checksumTrits);
String checksumPrt = checksum.substring(72, 81);
return checksumPrt;
return checksum.substring(72, 81);
}
}
@@ -26,4 +26,37 @@ public class Constants {
* The length of an address with checksum
*/
public static int ADDRESS_LENGTH_WITH_CHECKSUM = 90;
/**
* The length of an message
*/
public static int MESSAGE_LENGTH = 2187;
/**
* The length of an tag
*/
public static int TAG_LENGTH = 27;
public static final String INVALID_TRYTES_INPUT_ERROR = "Invalid trytes provided.";
public static final String INVALID_HASHES_INPUT_ERROR = "Invalid hashes provided.";
public static final String INVALID_TAIL_HASH_INPUT_ERROR = "Invalid tail hash provided.";
public static final String INVALID_SEED_INPUT_ERROR = "Invalid seed provided.";
public static final String INVALID_SECURITY_LEVEL_INPUT_ERROR = "Invalid security level provided.";
public static final String INVALID_ATTACHED_TRYTES_INPUT_ERROR = "Invalid attached trytes provided.";
public static final String INVALID_TRANSFERS_INPUT_ERROR = "Invalid transfers provided.";
public static final String INVALID_ADDRESSES_INPUT_ERROR = "Invalid addresses provided.";
public static final String INVALID_INPUT_ERROR = "Invalid input provided.";
public static final String INVALID_BUNDLE_ERROR = "Invalid bundle.";
public static final String INVALID_BUNDLE_SUM_ERROR = "Invalid bundle sum.";
public static final String INVALID_BUNDLE_HASH_ERROR = "Invalid bundle hash.";
public static final String INVALID_SIGNATURES_ERROR = "Invalid signatures.";
public static final String INVALID_VALUE_TRANSFER_ERROR = "Invalid value transfer: the transfer does not require a signature.";
public static final String NOT_ENOUGH_BALANCE_ERROR = "Not enough balance.";
public static final String NO_REMAINDER_ADDRESS_ERROR = "No remainder address defined.";
public static final String GET_TRYTES_RESPONSE_ERROR = "Get trytes response was null.";
public static final String GET_BUNDLE_RESPONSE_ERROR = "Get bundle response was null.";
public static final String GET_INCLUSION_STATE_RESPONSE_ERROR = "Get inclusion state response was null.";
}
@@ -1,11 +1,14 @@
package jota.utils;
import jota.error.InvalidAddressException;
import jota.error.ArgumentException;
import jota.model.Transfer;
import org.apache.commons.lang3.math.NumberUtils;
import java.util.List;
import static jota.utils.Constants.INVALID_ADDRESSES_INPUT_ERROR;
import static jota.utils.Constants.INVALID_TRANSFERS_INPUT_ERROR;
/**
* This class provides methods to validate the parameters of different iota API methods.
*
@@ -24,16 +27,31 @@ public class InputValidator {
address.length() == Constants.ADDRESS_LENGTH_WITH_CHECKSUM) && isTrytes(address, address.length());
}
/**
* Determines whether the specified addresses are valid.
*
* @param addresses The address list to validate.
* @return <code>true</code> if the specified addresses are valid; otherwise, <code>false</code>.
**/
public static boolean isAddressesCollectionValid(final List<String> addresses) throws ArgumentException {
for (final String address : addresses) {
if (!checkAddress(address)) {
return false;
}
}
return true;
}
/**
* Checks whether the specified address is an address and throws and exception if the address is invalid.
*
* @param address The address to validate.
* @return <code>true</code> if the specified string is an address; otherwise, <code>false</code>.
* @throws InvalidAddressException is thrown when the specified address is not an valid address.
* @throws ArgumentException is thrown when the specified input is not valid.
**/
public static boolean checkAddress(String address) throws InvalidAddressException {
public static boolean checkAddress(String address) throws ArgumentException {
if (!isAddress(address)) {
throw new InvalidAddressException();
throw new ArgumentException(INVALID_ADDRESSES_INPUT_ERROR);
}
return true;
}
@@ -67,7 +85,7 @@ public class InputValidator {
* @return <code>true</code> the specified string represents an integer value; otherwise, <code>false</code>.
**/
public static boolean isValue(final String value) {
return NumberUtils.isNumber(value);
return NumberUtils.isCreatable(value);
}
/**
@@ -117,7 +135,12 @@ public class InputValidator {
* @param transfers The transfers list to validate.
* @return <code>true</code> if the specified transfers are valid; otherwise, <code>false</code>.
**/
public static boolean isTransfersCollectionValid(final List<Transfer> transfers) {
public static boolean isTransfersCollectionValid(final List<Transfer> transfers) throws ArgumentException {
// Input validation of transfers object
if (transfers == null || transfers.isEmpty()) {
throw new ArgumentException(INVALID_TRANSFERS_INPUT_ERROR);
}
for (final Transfer transfer : transfers) {
if (!isValidTransfer(transfer)) {
@@ -127,6 +150,7 @@ public class InputValidator {
return true;
}
/**
* Determines whether the specified transfer is valid.
*
@@ -135,21 +159,25 @@ public class InputValidator {
**/
public static boolean isValidTransfer(final Transfer transfer) {
if (transfer == null) {
return false;
}
if (!isAddress(transfer.getAddress())) {
return false;
}
// Check if message is correct trytes of any length
if (!isTrytes(transfer.getMessage(), 0)) {
// Check if message is correct trytes encoded of any length
if (transfer.getMessage() == null || !isTrytes(transfer.getMessage(), transfer.getMessage().length())) {
return false;
}
if (null == transfer.getTag() || transfer.getTag().isEmpty()) {
return true;
} else {
// Check if tag is correct trytes of {0,27} trytes
return isTrytes(transfer.getTag(), 27);
// Check if tag is correct trytes encoded and not longer than 27 trytes
if (transfer.getTag() == null || !isTrytes(transfer.getTag(), transfer.getTag().length()) || transfer.getTag().length() > Constants.TAG_LENGTH) {
return false;
}
return true;
}
/**
@@ -161,4 +189,57 @@ public class InputValidator {
public static boolean isValidSeed(String seed) {
return isTrytes(seed, seed.length());
}
/**
* Checks if input is correct hashes.
*
* @param hashes The hashes list to validate.
* @return <code>true</code> if the specified hashes are valid; otherwise, <code>false</code>.
**/
public static boolean isHashes(List<String> hashes) {
for (String hash : hashes) {
if (!isTrytes(hash, 81)) {
return false;
}
}
return true;
}
/**
* Checks if input is correct hash.
*
* @param hash The hash to validate.
* @return <code>true</code> if the specified hash are valid; otherwise, <code>false</code>.
**/
public static boolean isHash(String hash) {
if (!isTrytes(hash, 81)) {
return false;
}
return true;
}
/**
* Checks if attached trytes if last 241 trytes are non-zero
*
* @param trytes The trytes.
* @return <code>true</code> if the specified trytes are valid; otherwise, <code>false</code>.
**/
public static boolean isArrayOfAttachedTrytes(String[] trytes) {
for (String tryteValue : trytes) {
// Check if correct 2673 trytes
if (!isTrytes(tryteValue, 2673)) {
return false;
}
String lastTrytes = tryteValue.substring(2673 - (3 * 81));
if (lastTrytes.matches("[9]+")) {
return false;
}
}
return true;
}
}
@@ -1,7 +1,6 @@
package jota.utils;
import jota.error.InvalidAddressException;
import jota.error.InvalidSecurityLevelException;
import jota.error.ArgumentException;
import jota.model.Bundle;
import jota.model.Input;
import jota.model.Transaction;
@@ -12,6 +11,8 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static jota.utils.Constants.INVALID_SECURITY_LEVEL_INPUT_ERROR;
/**
* Client Side computation service.
*
@@ -28,10 +29,14 @@ public class IotaAPIUtils {
* @param checksum The adds 9-tryte address checksum
* @param curl The curl instance.
* @return An String with address.
* @throws InvalidAddressException is thrown when the specified address is not an valid address.
* @throws InvalidSecurityLevelException is thrown when the specified security level is not valid.
* @throws ArgumentException is thrown when the specified input is not valid.
*/
public static String newAddress(String seed, int security, int index, boolean checksum, ICurl curl) throws InvalidAddressException, InvalidSecurityLevelException {
public static String newAddress(String seed, int security, int index, boolean checksum, ICurl curl) throws ArgumentException {
if (security < 1) {
throw new ArgumentException(INVALID_SECURITY_LEVEL_INPUT_ERROR);
}
Signing signing = new Signing(curl);
final int[] key = signing.key(Converter.trits(seed), index, security);
final int[] digests = signing.digests(key);
@@ -48,7 +53,7 @@ public class IotaAPIUtils {
public static List<String> signInputsAndReturn(final String seed,
final List<Input> inputs,
final Bundle bundle,
final List<String> signatureFragments, ICurl curl) throws InvalidSecurityLevelException {
final List<String> signatureFragments, ICurl curl) throws ArgumentException {
bundle.finalize(curl);
bundle.addTrytes(signatureFragments);
+6 -6
View File
@@ -1,6 +1,6 @@
package jota.utils;
import jota.error.InvalidSecurityLevelException;
import jota.error.ArgumentException;
import jota.model.Bundle;
import jota.pow.ICurl;
import jota.pow.SpongeFactory;
@@ -36,9 +36,9 @@ public class Multisig {
* @param security Secuirty level of private key / seed.
* @param index Key index to start search from. If the index is provided, the generation of the address is not deterministic.
* @return trytes
* @throws InvalidSecurityLevelException is thrown when the specified security level is not valid.
* @throws ArgumentException is thrown when the specified security level is not valid.
**/
public String getDigest(String seed, int security, int index) throws InvalidSecurityLevelException {
public String getDigest(String seed, int security, int index) throws ArgumentException {
int[] key = signingInstance.key(Converter.trits(seed, 243), index, security);
return Converter.trytes(signingInstance.digests(key));
}
@@ -75,10 +75,10 @@ public class Multisig {
* @param seed Tryte-encoded seed. It should be noted that this seed is not transferred
* @param index Key index to start search from. If the index is provided, the generation of the address is not deterministic.
* @return trytes.
* @throws InvalidSecurityLevelException is thrown when the specified security level is not valid.
* @throws ArgumentException is thrown when the specified security level is not valid.
**/
public String getKey(String seed, int index, int security) throws InvalidSecurityLevelException {
public String getKey(String seed, int index, int security) throws ArgumentException {
return Converter.trytes(signingInstance.key(Converter.trits(seed, 81 * security), index, security));
}
@@ -140,7 +140,7 @@ public class Multisig {
// Get the security used for the private key
// 1 security level = 2187 trytes
int security = (keyTrytes.length() / 2187);
int security = (keyTrytes.length() / Constants.MESSAGE_LENGTH);
// convert private key trytes into trits
int[] key = Converter.trits(keyTrytes);
+13 -9
View File
@@ -1,6 +1,6 @@
package jota.utils;
import jota.error.InvalidSecurityLevelException;
import jota.error.ArgumentException;
import jota.model.Bundle;
import jota.model.Transaction;
import jota.pow.ICurl;
@@ -11,6 +11,7 @@ import java.util.Arrays;
import java.util.List;
import static jota.pow.JCurl.HASH_LENGTH;
import static jota.utils.Constants.INVALID_SECURITY_LEVEL_INPUT_ERROR;
public class Signing {
@@ -22,7 +23,7 @@ public class Signing {
* public Signing() {
* this(null);
* }
* <p>
*
* /**
*
* @param curl
@@ -36,18 +37,18 @@ public class Signing {
* @param index
* @param security
* @return
* @throws InvalidSecurityLevelException is thrown when the specified security level is not valid.
* @throws ArgumentException is thrown when the specified security level is not valid.
*/
public int[] key(final int[] inSeed, final int index, int security) throws InvalidSecurityLevelException {
public int[] key(final int[] inSeed, final int index, int security) throws ArgumentException {
if (security < 1) {
throw new InvalidSecurityLevelException();
throw new ArgumentException(INVALID_SECURITY_LEVEL_INPUT_ERROR);
}
int[] seed = inSeed.clone();
// Derive subseed.
for (int i = 0; i < index; i++) {
for (int j = 0; j < HASH_LENGTH; j++) {
for (int j = 0; j < seed.length; j++) {
if (++seed[j] > 1) {
seed[j] = -1;
} else {
@@ -59,17 +60,20 @@ public class Signing {
curl.reset();
curl.absorb(seed, 0, seed.length);
// seed[0..HASH_LENGTH] contains subseed
curl.squeeze(seed, 0, HASH_LENGTH);
curl.squeeze(seed, 0, seed.length);
curl.reset();
// absorb subseed
curl.absorb(seed, 0, HASH_LENGTH);
curl.absorb(seed, 0, seed.length);
final int[] key = new int[security * HASH_LENGTH * 27];
final int[] buffer = new int[seed.length];
int offset = 0;
while (security-- > 0) {
for (int i = 0; i < 27; i++) {
curl.squeeze(key, offset, HASH_LENGTH);
curl.squeeze(buffer, 0, seed.length);
System.arraycopy(buffer, 0, key, offset, HASH_LENGTH);
offset += HASH_LENGTH;
}
}
+6 -6
View File
@@ -10,7 +10,7 @@ public class StopWatch {
private long currentTime = 0;
/**
*
* Initializes a new instance of the StopWatch class.
*/
public StopWatch() {
this.startTime = System.currentTimeMillis();
@@ -26,7 +26,7 @@ public class StopWatch {
}
/**
* @return
*
*/
public StopWatch stop() {
this.running = false;
@@ -52,7 +52,7 @@ public class StopWatch {
/**
* Elapsed time in milliseconds.
*
* @return
* @return The elapsed time in milliseconds.
*/
public long getElapsedTimeMili() {
long elapsed = 0;
@@ -65,7 +65,7 @@ public class StopWatch {
/**
* Elapsed time in seconds.
*
* @return
* @return The elapsed time in seconds.
*/
public long getElapsedTimeSecs() {
long elapsed = 0;
@@ -78,7 +78,7 @@ public class StopWatch {
/**
* Elapsed time in minutes.
*
* @return
* @return The elapsed time in minutes.
*/
public long getElapsedTimeMin() {
long elapsed = 0;
@@ -91,7 +91,7 @@ public class StopWatch {
/**
* Elapsed time in hours.
*
* @return
* @return The elapsed time in hours.
*/
public long getElapsedTimeHour() {
long elapsed = 0;
@@ -10,20 +10,20 @@ public class TrytesConverter {
/**
* Conversion of ascii encoded bytes to trytes.
* Input is a string (can be stringified JSON object), return value is Trytes
* <p>
*
* How the conversion works:
* 2 Trytes === 1 Byte
* There are a total of 27 different tryte values: 9ABCDEFGHIJKLMNOPQRSTUVWXYZ
* <p>
*
* 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
* <p>
* <p>
*
*
* EXAMPLE
* <p>
*
* 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:
+9 -11
View File
@@ -1,6 +1,6 @@
package jota;
import jota.error.InvalidAddressException;
import jota.error.ArgumentException;
import jota.utils.Checksum;
import org.junit.Test;
@@ -11,23 +11,21 @@ import static org.junit.Assert.assertEquals;
*/
public class ChecksumTest {
private static final String TEST_ADDRESS_WITHOUT_CHECKSUM = "EUHMAFIYBYZOXAVQQYRQ9RCNMTYX9KNEZFWXYMQIYPSRZRVDOLXDPUEARYPTWSZCAXJLXRYUUQKSHIJYZ";
private static final String TEST_ADDRESS_WITHOUT_CHECKSUM2 = "P9UDUZMN9DEXCRQEKLJYSBSBZFCHOBPJSDKMLCCVJDOVOFDWMNBZRIRRZJGINOUMPJBMYYZEGRTIDUABD";
private static final String TEST_ADDRESS_WITH_CHECKSUM = "EUHMAFIYBYZOXAVQQYRQ9RCNMTYX9KNEZFWXYMQIYPSRZRVDOLXDPUEARYPTWSZCAXJLXRYUUQKSHIJYZICCXCXUHX";
private static final String TEST_ADDRESS_WITH_CHECKSUM2 = "P9UDUZMN9DEXCRQEKLJYSBSBZFCHOBPJSDKMLCCVJDOVOFDWMNBZRIRRZJGINOUMPJBMYYZEGRTIDUABDODCNSCYJD";
private static final String TEST_ADDRESS_WITHOUT_CHECKSUM = "LXQHWNY9CQOHPNMKFJFIJHGEPAENAOVFRDIBF99PPHDTWJDCGHLYETXT9NPUVSNKT9XDTDYNJKJCPQMZC";
private static final String TEST_ADDRESS_WITH_CHECKSUM = "LXQHWNY9CQOHPNMKFJFIJHGEPAENAOVFRDIBF99PPHDTWJDCGHLYETXT9NPUVSNKT9XDTDYNJKJCPQMZCCOZVXMTXC";
@Test
public void shouldAddChecksum() throws InvalidAddressException {
assertEquals(Checksum.addChecksum(TEST_ADDRESS_WITHOUT_CHECKSUM2), TEST_ADDRESS_WITH_CHECKSUM2);
public void shouldAddChecksum() throws ArgumentException {
assertEquals(Checksum.addChecksum(TEST_ADDRESS_WITHOUT_CHECKSUM), TEST_ADDRESS_WITH_CHECKSUM);
}
@Test
public void shouldRemoveChecksum() throws InvalidAddressException {
assertEquals(Checksum.removeChecksum(TEST_ADDRESS_WITH_CHECKSUM2), TEST_ADDRESS_WITHOUT_CHECKSUM2);
public void shouldRemoveChecksum() throws ArgumentException {
assertEquals(Checksum.removeChecksum(TEST_ADDRESS_WITH_CHECKSUM), TEST_ADDRESS_WITHOUT_CHECKSUM);
}
@Test
public void shouldIsValidChecksum() throws InvalidAddressException {
assertEquals(Checksum.isValidChecksum(TEST_ADDRESS_WITH_CHECKSUM2), true);
public void shouldIsValidChecksum() throws ArgumentException {
assertEquals(Checksum.isValidChecksum(TEST_ADDRESS_WITH_CHECKSUM), true);
}
}
@@ -1,6 +1,6 @@
package jota;
import jota.error.InvalidAddressException;
import jota.error.ArgumentException;
import jota.model.Transfer;
import jota.utils.InputValidator;
import org.junit.Test;
@@ -28,7 +28,7 @@ public class InputValidatorTest {
}
@Test
public void shouldCheckAddress() throws InvalidAddressException {
public void shouldCheckAddress() throws ArgumentException {
assertEquals(InputValidator.checkAddress(TEST_ADDRESS_WITHOUT_CHECKSUM), true);
}
@@ -48,12 +48,11 @@ public class InputValidatorTest {
}
@Test
public void shouldIsTransfersCollectionCorrect() {
public void shouldIsTransfersCollectionCorrect() throws ArgumentException {
List<Transfer> transfers = new ArrayList<>();
transfers.add(new jota.model.Transfer(TEST_ADDRESS_WITH_CHECKSUM, 0, TEST_MESSAGE, TEST_TAG));
transfers.add(new jota.model.Transfer(TEST_ADDRESS_WITH_CHECKSUM, 0, TEST_MESSAGE, TEST_TAG));
transfers.add(new jota.model.Transfer(TEST_ADDRESS_WITH_CHECKSUM, 0, TEST_MESSAGE, null));
transfers.add(new jota.model.Transfer(TEST_ADDRESS_WITH_CHECKSUM, 0, TEST_MESSAGE, ""));
transfers.add(new Transfer(TEST_ADDRESS_WITH_CHECKSUM, 0, TEST_MESSAGE, TEST_TAG));
transfers.add(new Transfer(TEST_ADDRESS_WITH_CHECKSUM, 0, "", ""));
transfers.add(new Transfer(TEST_ADDRESS_WITH_CHECKSUM, 0));
assertEquals(InputValidator.isTransfersCollectionValid(transfers), true);
}
}
+118 -69
View File
@@ -2,8 +2,9 @@ package jota;
import com.google.gson.Gson;
import jota.dto.response.*;
import jota.error.*;
import jota.error.ArgumentException;
import jota.model.Bundle;
import jota.model.Input;
import jota.model.Transaction;
import jota.model.Transfer;
import org.hamcrest.core.Is;
@@ -27,16 +28,16 @@ import static org.junit.Assert.assertThat;
*/
public class IotaAPITest {
private static final String TEST_SEED1 = "IHDEENZYITYVYSPKAURUZAQKGVJEREFDJMYTANNXXGPZ9GJWTEOJJ9IPMXOGZNQLSNMFDSQOTZAEETUEA";
private static final String TEST_SEED2 = "IHDEENZYITYVYSPKAURUZAQKGVJEREFDJMYTANNXXGPZ9GJWTEOJJ9IPMXOGZNQLSNMFDSQOTZAEETUEA";
private static final String TEST_ADDRESS_WITH_CHECKSUM_SECURITY_LEVEL_1 = "MALAZGDVZIAQQRTNYJDSZMY9VE9LAHQKTVCUOAGZUCX9IBUMODFFTMGUIUAXGLWZQ9CYRSLYBM9QBIBYAEIAOPKXEA";
private static final String TEST_ADDRESS_WITH_CHECKSUM_SECURITY_LEVEL_2 = "LXQHWNY9CQOHPNMKFJFIJHGEPAENAOVFRDIBF99PPHDTWJDCGHLYETXT9NPUVSNKT9XDTDYNJKJCPQMZCCOZVXMTXC";
private static final String TEST_ADDRESS_WITH_CHECKSUM_SECURITY_LEVEL_3 = "ASCZZOBQDMNHLELQKWJBMRETMHBTF9V9TNKYDIFW9PDXPUHPVVGHMSWPVMNJHSJF99QFCMNTPCPGS9DT9XAFKJVO9X";
private static final String TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_1 = "MALAZGDVZIAQQRTNYJDSZMY9VE9LAHQKTVCUOAGZUCX9IBUMODFFTMGUIUAXGLWZQ9CYRSLYBM9QBIBYA";
private static final String TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_2 = "LXQHWNY9CQOHPNMKFJFIJHGEPAENAOVFRDIBF99PPHDTWJDCGHLYETXT9NPUVSNKT9XDTDYNJKJCPQMZC";
private static final String TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_2_2 = "RXTLHYQWBSJUZQXUS9LMLBE9RLAQFNDWBMZUGYJRJRHYRQQKVXBXJKEZOJDCVKFXM9GXYNMKTESEEILAYFCTLW9DQD";
private static final String TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_3 = "ASCZZOBQDMNHLELQKWJBMRETMHBTF9V9TNKYDIFW9PDXPUHPVVGHMSWPVMNJHSJF99QFCMNTPCPGS9DT9";
private static final String TEST_HASH = "EVCNKLXUTEKHSQKYKBSBACP9SCPTCBLLYLB9IDBMNQ9HAYANSUBZOCAAIPSGIMDAYLICTGWJAFFAA9999";
private static final String TEST_HASH = "BKBALUPMEECOGEYQU9OHXTFTHV9OKEVUGHAUNNQCNETAQWIRJIKDGWSWXY9RSIMZJBPIPEIQEFEIA9999";
private static final String TEST_INVALID_TRYTES = "BYSWEAUTWXHXZ9YBZISEK9LUHWGMHXCGEVNZHRLUWQFCUSDXZHOFHWHL9MQPVJXXZLIXPXPXF9KYEREFSKCPKYIIKPZVLHUTDFQKKVVBBN9ATTLPCNPJDWDEVIYYLGPZGCWXOBDXMLJC9VO9QXTTBLAXTTBFUAROYEGQIVB9MJWJKXJMCUPTWAUGFZBTZCSJVRBGMYXTVBDDS9MYUJCPZ9YDWWQNIPUAIJXXSNLKUBSCOIJPCLEFPOXFJREXQCUVUMKSDOVQGGHRNILCO9GNCLWFM9APMNMWYASHXQAYBEXF9QRIHIBHYEJOYHRQJAOKAQ9AJJFQ9WEIWIJOTZATIBOXQLBMIJU9PCGBLVDDVFP9CFFSXTDUXMEGOOFXWRTLFGV9XXMYWEMGQEEEDBTIJ9OJOXFAPFQXCDAXOUDMLVYRMRLUDBETOLRJQAEDDLNVIRQJUBZBO9CCFDHIX9MSQCWYAXJVWHCUPTRSXJDESISQPRKZAFKFRULCGVRSBLVFOPEYLEE99JD9SEBALQINPDAZHFAB9RNBH9AZWIJOTLBZVIEJIAYGMC9AZGNFWGRSWAXTYSXVROVNKCOQQIWGPNQZKHUNODGYADPYLZZZUQRTJRTODOUKAOITNOMWNGHJBBA99QUMBHRENGBHTH9KHUAOXBVIVDVYYZMSEYSJWIOGGXZVRGN999EEGQMCOYVJQRIRROMPCQBLDYIGQO9AMORPYFSSUGACOJXGAQSPDY9YWRRPESNXXBDQ9OZOXVIOMLGTSWAMKMTDRSPGJKGBXQIVNRJRFRYEZ9VJDLHIKPSKMYC9YEGHFDS9SGVDHRIXBEMLFIINOHVPXIFAZCJKBHVMQZEVWCOSNWQRDYWVAIBLSCBGESJUIBWZECPUCAYAWMTQKRMCHONIPKJYYTEGZCJYCT9ABRWTJLRQXKMWY9GWZMHYZNWPXULNZAPVQLPMYQZCYNEPOCGOHBJUZLZDPIXVHLDMQYJUUBEDXXPXFLNRGIPWBRNQQZJSGSJTTYHIGGFAWJVXWL9THTPWOOHTNQWCNYOYZXALHAZXVMIZE9WMQUDCHDJMIBWKTYH9AC9AFOT9DPCADCV9ZWUTE9QNOMSZPTZDJLJZCJGHXUNBJFUBJWQUEZDMHXGBPTNSPZBR9TGSKVOHMOQSWPGFLSWNESFKSAZY9HHERAXALZCABFYPOVLAHMIHVDBGKUMDXC9WHHTIRYHZVWNXSVQUWCR9M9RAGMFEZZKZ9XEOQGOSLFQCHHOKLDSA9QCMDGCGMRYJZLBVIFOLBIJPROKMHOYTBTJIWUZWJMCTKCJKKTR9LCVYPVJI9AHGI9JOWMIWZAGMLDFJA9WU9QAMEFGABIBEZNNAL9OXSBFLOEHKDGHWFQSHMPLYFCNXAAZYJLMQDEYRGL9QKCEUEJ9LLVUOINVSZZQHCIKPAGMT9CAYIIMTTBCPKWTYHOJIIY9GYNPAJNUJ9BKYYXSV9JSPEXYMCFAIKTGNRSQGUNIYZCRT9FOWENSZQPD9ALUPYYAVICHVYELYFPUYDTWUSWNIYFXPX9MICCCOOZIWRNJIDALWGWRATGLJXNAYTNIZWQ9YTVDBOFZRKO9CFWRPAQQRXTPACOWCPRLYRYSJARRKSQPR9TCFXDVIXLP9XVL99ERRDSOHBFJDJQQGGGCZNDQ9NYCTQJWVZIAELCRBJJFDMCNZU9FIZRPGNURTXOCDSQGXTQHKHUECGWFUUYS9J9NYQ9U9P9UUP9YMZHWWWCIASCFLCMSKTELZWUGCDE9YOKVOVKTAYPHDF9ZCCQAYPJIJNGSHUIHHCOSSOOBUDOKE9CJZGYSSGNCQJVBEFTZFJ9SQUHOASKRRGBSHWKBCBWBTJHOGQ9WOMQFHWJVEG9NYX9KWBTCAIXNXHEBDIOFO9ALYMFGRICLCKKLG9FOBOX9PDWNQRGHBKHGKKRLWTBEQMCWQRLHAVYYZDIIPKVQTHYTWQMTOACXZOQCDTJTBAAUWXSGJF9PNQIJ9AJRUMUVCPWYVYVARKR9RKGOUHHNKNVGGPDDLGKPQNOYHNKAVVKCXWXOQPZNSLATUJT9AUWRMPPSWHSTTYDFAQDXOCYTZHOYYGAIM9CELMZ9AZPWB9MJXGHOKDNNSZVUDAGXTJJSSZCPZVPZBYNNTUQABSXQWZCHDQSLGK9UOHCFKBIBNETK999999999999999999999999999999999999999999999999999999999999999999999999999999999NOXDXXKUDWLOFJLIPQIBRBMGDYCPGDNLQOLQS99EQYKBIU9VHCJVIPFUYCQDNY9APGEVYLCENJIOBLWNB999999999XKBRHUD99C99999999NKZKEKWLDKMJCI9N9XQOLWEPAYWSH9999999999999999999999999KDDTGZLIPBNZKMLTOLOXQVNGLASESDQVPTXALEKRMIOHQLUHD9ELQDBQETS9QFGTYOYWLNTSKKMVJAUXSIROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999IROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999";
private static final String TEST_TRYTES = "9RYSLXACOTYQZAQIAMCULCVKMBIPMKINPFJCZFIZOOZMTCTKIXQHQTUTVGZMVHGKLRZGWOT9UGYQFNCGNRJWDETRKWUFIAFA9M9ZPZKVJWKOJENHFWMFBDVOLEVCGQTKCTOPNGRYQURVQPFJAZFUKCXAOORIYCVDKDINDXRFAFRSFVRXCTPETGIJULBYGXUHQMBGHAKGJLMNZUQE9EVOGTFVJ9EVSDNUYPGQLZBAJNWG9XXXDHETVT9XBBCQZEWJXFLVHEXHEQARCOSRKQQVEQKK9APNBRBJHHUWRGAWUIMLY9AFCULX9ITRJBYU9BNQPZBJKJDNHDAKIGDMNUOFCWAEDSBDRUTORPZQCHCSQRVIERZNGPYBPEOQXGFAKANGXPE9MA9ZZCLKDQANOKIAV9QDDUZILVMEIHXDSHDISEJMLQGVEUJWMCKCMIQTRRGJKJFSVMZWYNQJCFCPOEGOTJULGPFTM9GQGEONOXSYXYPQZHVFYHKYREHQMYWHYUTZE999HRWIQTOENSRFPB9NXDVFSUA9NLAKOELYAAHTFDDAYBHPKNAXXTJIPYOKXTEMYUIOKXORYUFEIIAZCFGCCINBPTXFNTGPKFOQNGEODMSCVOZKRJYLECZB9VDZJCLPMTY9UPLTLH9GVDBALFNBLQXI9ADJJXCSPQJXHNNZUOJCMFJKZZ9ZTJRQMNLDSTZYTFNXQPZKMQJLZBHF9URFHNX9MQVMTIHEMROFCCPDLUOTRCAURYL9IJ9IGTRFVIJXSFLYBJOQOASBNVRFQGVIGKA9UJUDHWUSBFFKDHDVRGLOZQYADXGS9IOGCPCVCFPNUDFTUKXCOEEUMNDZCZGUXIECIYCKL9XCPEIQMYV9VCP9JJMSREJFQB9IVXUAXWCURUADEPBIVIGERXIMFZAGQPRC9KSYYLHBZVZGQJVTZVBGMRBWYJCYRHMJWPIKJYAYTALAAZROZYCMQKWBSFUGHFSOGGTCQDHWJU9VJGCAHJLHSORFKVJKV9RSZHLJZTDJJGOXTRLKNJORWYPW9UKRZROJONZQWJNUEPBZZJYBJJNCAQOEYTHFWVUBACCFTREABOZKQEKSMDAFECVGMGELNZUFZJHWHNXLBOSHLNBPGSQDVLZLBUXWINABWYBDMZNIYNVPYLRKUULTMNNKZUFNQOQKROJSXWYTBRDSJQKTOUXLMXVCVIXEYPZWBSMEXMBGUIVACRTGKDEIYZKP9KQCQXPWRXNLGQOATRHCXJFQINXFYQIDTPUJVXKUYVRYHWDHWSNLWUFPNNJZVNMRFWPZBJCRRSHMHUG9NKKH9SOXTUJUAXBF9MHYWHJ9ZTJRUQFKRLHMNVPWX9XFXLMVJAGASMWMIFYUZFAUCEIOOYMEYWOIZTNEWFVZKOQFECWEPSMOYFSJJKEJQMPSXGE9WTYRQJVMHUQZFD9MJUFFCNSGAZCTXYPIJFNSXAUCYPGZMNWMQWSWCKAQYKXJTWINSGPPZG9HLDLEAWUWEVCTVRCBDFOXKUROXH9HXXAXVPEJFRSLOGRVGYZASTEBAQNXJJROCYRTDPYFUIQJVDHAKEG9YACV9HCPJUEUKOYFNWDXCCJBIFQKYOXGRDHVTHEQUMHO999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999DNVEZXD99A99999999A99999999BULMKQXROXEBHPBYGKQINYJTHPTL9OGKUFBFAVRHPZSNXBUDMNRJFYIIGWOFVCXSVFQRZMPGCZMZUNKCDDRWDLKTKCZXZFMIZ9CZBWNOJGSXHBKEXCFQPBNFAE9QAVRX9SWGEZQRSYAYNW9TPWVWCJXAUPQHYZ9999NBDPASDXMXDCHLMZJIBHAZREUBOTZZAYGKCWTBSBKKETULAPABDTY9AMPBSXO9KJOLCWJMJSZFKU999999999999999999999999999999999999999999999999999999999999CWJQRPBIJGTWQTCMDUVOCBUAMH";
private static final String TEST_TRYTES = "CCWCXCGDEAXCGDEAPCEAHDTCGDHDRAADTCGDGDPCVCTC9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999WITPXKWONPNUPBESJTXQTZTFXFSTDUWVGYHW9VRDULWGBKDVAAJLOSAEPUSCMSOIYLKMIZLPEKAOYAXMWFLDKQJI99999999999999999999UUC9999999999999999FUCK9YOUIVBUGXD99999999999B99999999IDPWGXASJFLLGCDGPQVXYGSNUESCZQCEKVREGLZX9FCYQVUWESEKWSMHZTGMJLGBOLKU9GILFITSJLZBWEHH9RSRNBPSKKUZBBJDSYHYWYHLJUOAFCKMXGTRFTZHKKWSVKGRHHJECSILLLZXKYJAYAQYEOINSZ9999OCYREQNINOB9XMLJOXMDFJDTXYO9PANNXQSW9HPFAAHEPTSPHTNEBOFFNRPKSUQNTKSACROOJPXF99999UUC9999999999999999FUCK9YOUPNMHCEJIE999999999L99999999IGMVBPROUATGVGQTHYIYFVQETRW";
private static final String TEST_MESSAGE = "JUSTANOTHERJOTATEST";
private static final String TEST_TAG = "JOTASPAM9999999999999999999";
private static final int MIN_WEIGHT_MAGNITUDE = 14;
@@ -64,125 +65,148 @@ public class IotaAPITest {
, "XCCPS9GMTSUB9DXPVKLTBDHOFX9PJMBYZQYQEXMRQDPGQPLWRGZGXODYJKGVFOHHYUJRCSXAIDGYSAWRB"
, "KVEBCGMEOPDPRCQBPIEMZTTXYBURGZVNH9PLHKPMM9D9FUKWIGLKZROGNSYIFHULLWQWXCNAW9HKKVIDC"};
private IotaAPI iotaClient;
private IotaAPI iotaAPI;
@Before
public void createApiClientInstance() {
iotaClient = new IotaAPI.Builder().build();
iotaAPI = new IotaAPI.Builder().build();
}
@Test
public void shouldCreateIotaApiProxyInstanceWithDefaultValues() {
IotaAPI proxy = new IotaAPI.Builder().build();
assertThat(proxy, IsNull.notNullValue());
assertThat(proxy.getHost(), Is.is("localhost"));
assertThat(proxy.getPort(), Is.is("14265"));
assertThat(proxy.getProtocol(), Is.is("http"));
iotaAPI = new IotaAPI.Builder().build();
assertThat(iotaAPI, IsNull.notNullValue());
assertThat(iotaAPI.getHost(), Is.is("node.iotawallet.info"));
assertThat(iotaAPI.getPort(), Is.is("14265"));
assertThat(iotaAPI.getProtocol(), Is.is("http"));
}
@Test
public void shouldRetainValuesFromBuilder() {
IotaAPI proxy = new IotaAPI.Builder().host("somewhere_over_the_rainbow").build();
assertThat(proxy.getHost(), Is.is("somewhere_over_the_rainbow"));
iotaAPI = new IotaAPI.Builder().host("somewhere_over_the_rainbow").build();
assertThat(iotaAPI.getHost(), Is.is("somewhere_over_the_rainbow"));
proxy = new IotaAPI.Builder().port("15515").build();
assertThat(proxy.getPort(), Is.is("15515"));
iotaAPI = new IotaAPI.Builder().port("15515").build();
assertThat(iotaAPI.getPort(), Is.is("15515"));
proxy = new IotaAPI.Builder().protocol("https").build();
assertThat(proxy.getProtocol(), Is.is("https"));
iotaAPI = new IotaAPI.Builder().protocol("https").build();
assertThat(iotaAPI.getProtocol(), Is.is("https"));
}
@Test
public void shouldGetValuesFromProperties() {
Properties properties = new Properties();
properties.put("iota.node.host", "somewhere_over_the_rainbow");
IotaAPI proxy = new IotaAPI.Builder().config(properties).build();
assertThat(proxy.getHost(), Is.is("somewhere_over_the_rainbow"));
iotaAPI = new IotaAPI.Builder().config(properties).build();
assertThat(iotaAPI.getHost(), Is.is("somewhere_over_the_rainbow"));
properties = new Properties();
properties.put("iota.node.port", "15515");
proxy = new IotaAPI.Builder().config(properties).build();
assertThat(proxy.getPort(), Is.is("15515"));
iotaAPI = new IotaAPI.Builder().config(properties).build();
assertThat(iotaAPI.getPort(), Is.is("15515"));
properties = new Properties();
properties.put("iota.node.protocol", "https");
proxy = new IotaAPI.Builder().config(properties).build();
assertThat(proxy.getProtocol(), Is.is("https"));
iotaAPI = new IotaAPI.Builder().config(properties).build();
assertThat(iotaAPI.getProtocol(), Is.is("https"));
}
@Test
public void shouldGetInputs() throws InvalidSecurityLevelException, InvalidAddressException {
GetBalancesAndFormatResponse res = iotaClient.getInputs(TEST_SEED1, 2, 0, 0, 0);
public void shouldGetInputs() throws ArgumentException {
GetBalancesAndFormatResponse res = iotaAPI.getInputs(TEST_SEED1, 2, 0, 0, 0);
System.out.println(res);
assertThat(res, IsNull.notNullValue());
assertThat(res.getTotalBalance(), IsNull.notNullValue());
assertThat(res.getInput(), IsNull.notNullValue());
assertThat(res.getInputs(), IsNull.notNullValue());
}
@Test
public void shouldCreateANewAddressWithoutChecksum() throws InvalidSecurityLevelException, InvalidAddressException {
final GetNewAddressResponse res1 = iotaClient.getNewAddress(TEST_SEED1, 1, 0, false, 5, false);
public void shouldCreateANewAddressWithChecksum() throws ArgumentException {
final GetNewAddressResponse res1 = iotaAPI.getNewAddress(TEST_SEED1, 1, 0, true, 5, false);
assertThat(res1.getAddresses().get(0), Is.is(TEST_ADDRESS_WITH_CHECKSUM_SECURITY_LEVEL_1));
final GetNewAddressResponse res2 = iotaAPI.getNewAddress(TEST_SEED1, 2, 0, true, 5, false);
assertThat(res2.getAddresses().get(0), Is.is(TEST_ADDRESS_WITH_CHECKSUM_SECURITY_LEVEL_2));
final GetNewAddressResponse res3 = iotaAPI.getNewAddress(TEST_SEED1, 3, 0, true, 5, false);
assertThat(res3.getAddresses().get(0), Is.is(TEST_ADDRESS_WITH_CHECKSUM_SECURITY_LEVEL_3));
}
@Test
public void shouldCreateANewAddressWithoutChecksum() throws ArgumentException {
final GetNewAddressResponse res1 = iotaAPI.getNewAddress(TEST_SEED1, 1, 0, false, 5, false);
assertThat(res1.getAddresses().get(0), Is.is(TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_1));
final GetNewAddressResponse res2 = iotaClient.getNewAddress(TEST_SEED1, 2, 0, false, 5, false);
final GetNewAddressResponse res2 = iotaAPI.getNewAddress(TEST_SEED1, 2, 0, false, 5, false);
assertThat(res2.getAddresses().get(0), Is.is(TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_2));
final GetNewAddressResponse res3 = iotaClient.getNewAddress(TEST_SEED1, 3, 0, false, 5, false);
final GetNewAddressResponse res3 = iotaAPI.getNewAddress(TEST_SEED1, 3, 0, false, 5, false);
assertThat(res3.getAddresses().get(0), Is.is(TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_3));
}
@Test
public void shouldCreate100Addresses() throws InvalidSecurityLevelException, InvalidAddressException {
GetNewAddressResponse res = iotaClient.getNewAddress(TEST_SEED1, 2, 0, false, 100, false);
public void shouldCreate100Addresses() throws ArgumentException {
GetNewAddressResponse res = iotaAPI.getNewAddress(TEST_SEED1, 2, 0, false, 100, false);
assertEquals(res.getAddresses().size(), 100);
}
@Test
public void shouldPrepareTransfer() throws InvalidSecurityLevelException, NotEnoughBalanceException, InvalidAddressException, InvalidTransferException {
public void shouldPrepareTransfer() throws ArgumentException {
List<Input> inputlist = new ArrayList<>();
List<Transfer> transfers = new ArrayList<>();
transfers.add(new jota.model.Transfer(TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_2, 0, TEST_MESSAGE, TEST_TAG));
transfers.add(new jota.model.Transfer(TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_2, 0, TEST_MESSAGE, TEST_TAG));
List<String> trytes = iotaClient.prepareTransfers(TEST_SEED1, 2, transfers, null, null);
Assert.assertNotNull(trytes);
assertThat(trytes.isEmpty(), Is.is(false));
GetBalancesAndFormatResponse rsp = iotaAPI.getInputs(TEST_SEED1, 2, 0, 0, 100);
for (Input input : rsp.getInputs()) {
inputlist.add(input);
}
transfers.add(new Transfer(TEST_ADDRESS_WITH_CHECKSUM_SECURITY_LEVEL_2, 0, TEST_MESSAGE, TEST_TAG));
transfers.add(new Transfer(TEST_ADDRESS_WITH_CHECKSUM_SECURITY_LEVEL_2, 0));
List<String> trytes1 = iotaAPI.prepareTransfers(TEST_SEED1, 2, transfers, null, null, false);
List<String> trytes2 = iotaAPI.prepareTransfers(TEST_SEED1, 2, transfers, null, inputlist, true);
Assert.assertNotNull(trytes1);
assertThat(trytes1.isEmpty(), Is.is(false));
Assert.assertNotNull(trytes2);
assertThat(trytes2.isEmpty(), Is.is(false));
}
@Test
public void shouldGetLastInclusionState() throws NoNodeInfoException {
GetInclusionStateResponse res = iotaClient.getLatestInclusion(new String[]{TEST_HASH});
public void shouldGetLastInclusionState() throws ArgumentException {
GetInclusionStateResponse res = iotaAPI.getLatestInclusion(new String[]{TEST_HASH});
assertThat(res.getStates(), IsNull.notNullValue());
}
@Test
public void shouldFindTransactionObjects() {
List<Transaction> ftr = iotaClient.findTransactionObjects(TEST_ADDRESSES);
public void shouldFindTransactionObjects() throws ArgumentException {
List<Transaction> ftr = iotaAPI.findTransactionObjectsByAddresses(TEST_ADDRESSES);
System.out.println(ftr);
assertThat(ftr, IsNull.notNullValue());
}
@Test
public void shouldGetAccountData() throws NoInclusionStatesException, InvalidTrytesException, NoNodeInfoException, ArgumentException, InvalidBundleException, InvalidSecurityLevelException, InvalidAddressException, InvalidSignatureException {
GetAccountDataResponse gad = iotaClient.getAccountData(TEST_SEED1, 2, 0, true, 0, true, 0, 0, true, 0);
public void shouldGetAccountData() throws ArgumentException {
GetAccountDataResponse gad = iotaAPI.getAccountData(TEST_SEED1, 2, 0, true, 0, true, 0, 0, true, 0);
assertThat(gad, IsNull.notNullValue());
}
@Test(expected = IllegalAccessError.class)
public void shouldNotGetBundle() throws InvalidBundleException, ArgumentException, InvalidSignatureException {
GetBundleResponse gbr = iotaClient.getBundle("SADASD");
@Test(expected = ArgumentException.class)
public void shouldNotGetBundle() throws ArgumentException {
GetBundleResponse gbr = iotaAPI.getBundle("SADASD");
assertThat(gbr, IsNull.notNullValue());
}
@Test
public void shouldGetBundle() throws InvalidBundleException, ArgumentException, InvalidSignatureException {
GetBundleResponse gbr = iotaClient.getBundle(TEST_HASH);
public void shouldGetBundle() throws ArgumentException {
GetBundleResponse gbr = iotaAPI.getBundle(TEST_HASH);
System.out.println(gbr);
assertThat(gbr, IsNull.notNullValue());
}
@Test
public void shouldGetTransfers() throws InvalidBundleException, ArgumentException, InvalidSignatureException, NoInclusionStatesException, NoNodeInfoException, InvalidSecurityLevelException, InvalidAddressException {
GetTransferResponse gtr = iotaClient.getTransfers(TEST_SEED1, 2, 0, 0, false);
public void shouldGetTransfers() throws ArgumentException {
GetTransferResponse gtr = iotaAPI.getTransfers(TEST_SEED1, 2, 0, 0, false);
assertThat(gtr.getTransfers(), IsNull.notNullValue());
System.out.println(gtr);
@@ -195,44 +219,69 @@ public class IotaAPITest {
@Ignore
@Test
public void shouldReplayBundle() throws InvalidTrytesException, InvalidBundleException, InvalidSignatureException, ArgumentException {
ReplayBundleResponse rbr = iotaClient.replayBundle(TEST_HASH, DEPTH, MIN_WEIGHT_MAGNITUDE);
public void shouldReplayBundle() throws ArgumentException {
ReplayBundleResponse rbr = iotaAPI.replayBundle(TEST_HASH, DEPTH, MIN_WEIGHT_MAGNITUDE);
assertThat(rbr, IsNull.notNullValue());
}
@Ignore
@Test(expected = InvalidTrytesException.class)
public void shouldNotSendTrytes() throws InvalidTrytesException {
iotaClient.sendTrytes(new String[]{TEST_INVALID_TRYTES}, DEPTH, MIN_WEIGHT_MAGNITUDE);
@Test(expected = ArgumentException.class)
public void shouldNotSendTrytes() throws ArgumentException {
iotaAPI.sendTrytes(new String[]{TEST_INVALID_TRYTES}, DEPTH, MIN_WEIGHT_MAGNITUDE);
}
@Test()
public void shouldGetTrytes() throws InvalidTrytesException {
System.out.println(iotaClient.getTrytes(TEST_HASH));
public void shouldGetTrytes() throws ArgumentException {
System.out.println(iotaAPI.getTrytes(TEST_HASH));
}
@Test()
public void shouldBroadcastAndStore() throws ArgumentException {
System.out.println(iotaAPI.broadcastAndStore(TEST_TRYTES));
}
@Ignore
@Test
public void shouldSendTrytes() throws InvalidTrytesException {
iotaClient.sendTrytes(new String[]{TEST_TRYTES}, DEPTH, MIN_WEIGHT_MAGNITUDE);
public void shouldSendTrytes() throws ArgumentException {
iotaAPI.sendTrytes(new String[]{TEST_TRYTES}, DEPTH, MIN_WEIGHT_MAGNITUDE);
}
@Ignore
@Test(expected = IllegalStateException.class)
public void shouldNotSendTransfer() throws ArgumentException, InvalidSignatureException, InvalidBundleException, NotEnoughBalanceException, InvalidSecurityLevelException, InvalidTrytesException, InvalidAddressException, InvalidTransferException {
public void shouldNotSendTransfer() throws ArgumentException {
List<Transfer> transfers = new ArrayList<>();
transfers.add(new jota.model.Transfer(TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_2, 0, TEST_MESSAGE, TEST_TAG));
SendTransferResponse str = iotaClient.sendTransfer(TEST_SEED2, 2, DEPTH, MIN_WEIGHT_MAGNITUDE, transfers, null, null);
transfers.add(new Transfer(TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_2, 2, TEST_MESSAGE, TEST_TAG));
SendTransferResponse str = iotaAPI.sendTransfer(TEST_SEED1, 2, DEPTH, MIN_WEIGHT_MAGNITUDE, transfers, null, null, false);
assertThat(str.getTransactions(), IsNull.notNullValue());
assertThat(str.getSuccessfully(), IsNull.notNullValue());
}
@Ignore
@Test
public void shouldSendTransfer() throws ArgumentException, InvalidSignatureException, InvalidBundleException, NotEnoughBalanceException, InvalidSecurityLevelException, InvalidTrytesException, InvalidAddressException, InvalidTransferException {
public void shouldSendTransferWithoutInputs() throws ArgumentException {
List<Transfer> transfers = new ArrayList<>();
transfers.add(new jota.model.Transfer(TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_2_2, 0, TEST_MESSAGE, TEST_TAG));
SendTransferResponse str = iotaClient.sendTransfer(TEST_SEED1, 2, DEPTH, MIN_WEIGHT_MAGNITUDE, transfers, null, null);
transfers.add(new Transfer(TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_2, 1, TEST_MESSAGE, TEST_TAG));
SendTransferResponse str = iotaAPI.sendTransfer(TEST_SEED1, 2, DEPTH, MIN_WEIGHT_MAGNITUDE, transfers, null, null, false);
assertThat(str.getTransactions(), IsNull.notNullValue());
assertThat(str.getSuccessfully(), IsNull.notNullValue());
}
@Ignore
@Test
public void shouldSendTransferWithInputs() throws ArgumentException {
List<Input> inputlist = new ArrayList<>();
List<Transfer> transfers = new ArrayList<>();
GetBalancesAndFormatResponse rsp = iotaAPI.getInputs(TEST_SEED1, 2, 0, 0, 1);
for (Input input : rsp.getInputs()) {
inputlist.add(input);
}
transfers.add(new Transfer(TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_2, 1, TEST_MESSAGE, TEST_TAG));
SendTransferResponse str = iotaAPI.sendTransfer(TEST_SEED1, 2, DEPTH, MIN_WEIGHT_MAGNITUDE, transfers, inputlist, null, true);
assertThat(str.getTransactions(), IsNull.notNullValue());
assertThat(str.getSuccessfully(), IsNull.notNullValue());
}
}
+12 -10
View File
@@ -2,10 +2,13 @@ package jota;
import com.google.gson.Gson;
import jota.dto.response.*;
import jota.error.ArgumentException;
import org.hamcrest.core.IsNull;
import org.junit.Before;
import org.junit.Test;
import java.util.Collections;
import static org.junit.Assert.assertThat;
/**
@@ -70,7 +73,7 @@ public class IotaCoreApiTest {
}
@Test
public void shouldFindTransactionsByAddresses() {
public void shouldFindTransactionsByAddresses() throws ArgumentException {
FindTransactionResponse trans = proxy.findTransactionsByAddresses(TEST_ADDRESS_WITH_CHECKSUM);
assertThat(trans.getHashes(), IsNull.notNullValue());
}
@@ -94,21 +97,20 @@ public class IotaCoreApiTest {
}
@Test
public void shouldGetTrytes() {
public void shouldGetTrytes() throws ArgumentException {
GetTrytesResponse res = proxy.getTrytes(TEST_HASH);
assertThat(res.getTrytes(), IsNull.notNullValue());
}
@Test(expected = IllegalAccessError.class)
public void shouldNotGetInclusionStates() {
GetInclusionStateResponse res = proxy.getInclusionStates(new String[]{"DBPECSH9YLSSTQDGERUHJBBJTKVUDBMTJLG9WPHBINGHIFOSJMDJLARTVOXXWEFQJLLBINOHCZGYFSMUEXWPPMTOFW"}, new String[]{"EJDQOQHMLJGBMFWB9WJSPRCYIGNPO9WRHDCEQXIMPVPIJ9JV9RJGVHNX9EPGXFOOKBABCVMMAAX999999"});
assertThat(res.getStates(), IsNull.notNullValue());
@Test(expected = ArgumentException.class)
public void shouldNotGetInclusionStates() throws ArgumentException {
proxy.getInclusionStates(new String[]{TEST_HASH}, new String[]{"ZIJGAJ9AADLRPWNCYNNHUHRRAC9QOUDATEDQUMTNOTABUVRPTSTFQDGZKFYUUIE9ZEBIVCCXXXLKX9999"});
}
@Test
public void shouldGetInclusionStates() {
GetInclusionStateResponse res = proxy.getInclusionStates(new String[]{TEST_ADDRESS_WITH_CHECKSUM}, new String[]{proxy.getNodeInfo().getLatestSolidSubtangleMilestone()});
public void shouldGetInclusionStates() throws ArgumentException {
GetInclusionStateResponse res = proxy.getInclusionStates(new String[]{TEST_HASH}, new String[]{proxy.getNodeInfo().getLatestSolidSubtangleMilestone()});
assertThat(res.getStates(), IsNull.notNullValue());
}
@@ -127,8 +129,8 @@ public class IotaCoreApiTest {
}
@Test
public void shouldGetBalances() {
GetBalancesResponse res = proxy.getBalances(100, new String[]{TEST_ADDRESS_WITH_CHECKSUM});
public void shouldGetBalances() throws ArgumentException {
GetBalancesResponse res = proxy.getBalances(100, Collections.singletonList(TEST_ADDRESS_WITH_CHECKSUM));
assertThat(res.getBalances(), IsNull.notNullValue());
assertThat(res.getMilestone(), IsNull.notNullValue());
assertThat(res.getMilestoneIndex(), IsNull.notNullValue());
@@ -2,7 +2,7 @@ package jota;
import cfb.pearldiver.PearlDiverLocalPoW;
import jota.dto.response.SendTransferResponse;
import jota.error.*;
import jota.error.ArgumentException;
import jota.model.Transfer;
import org.hamcrest.core.IsNull;
import org.junit.Before;
@@ -20,7 +20,7 @@ import static org.junit.Assert.assertThat;
public class IotaLocalPoWTest {
private static final String TEST_SEED1 = "IHDEENZYITYVYSPKAURUZAQKGVJEREFDJMYTANNXXGPZ9GJWTEOJJ9IPMXOGZNQLSNMFDSQOTZAEETUEA";
private static final String TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_2_2 = "RXTLHYQWBSJUZQXUS9LMLBE9RLAQFNDWBMZUGYJRJRHYRQQKVXBXJKEZOJDCVKFXM9GXYNMKTESEEILAYFCTLW9DQD";
private static final String TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_2 = "LXQHWNY9CQOHPNMKFJFIJHGEPAENAOVFRDIBF99PPHDTWJDCGHLYETXT9NPUVSNKT9XDTDYNJKJCPQMZC";
private static final String TEST_MESSAGE = "JUSTANOTHERJOTATEST";
private static final String TEST_TAG = "JOTASPAM9999999999999999999";
private static final int MIN_WEIGHT_MAGNITUDE = 14;
@@ -35,10 +35,10 @@ public class IotaLocalPoWTest {
@Ignore
@Test
public void shouldSendTransfer() throws ArgumentException, InvalidSignatureException, InvalidBundleException, NotEnoughBalanceException, InvalidSecurityLevelException, InvalidTrytesException, InvalidAddressException, InvalidTransferException {
public void shouldSendTransfer() throws ArgumentException {
List<Transfer> transfers = new ArrayList<>();
transfers.add(new jota.model.Transfer(TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_2_2, 0, TEST_MESSAGE, TEST_TAG));
SendTransferResponse str = iotaClient.sendTransfer(TEST_SEED1, 2, DEPTH, MIN_WEIGHT_MAGNITUDE, transfers, null, null);
transfers.add(new Transfer(TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_2, 0, TEST_MESSAGE, TEST_TAG));
SendTransferResponse str = iotaClient.sendTransfer(TEST_SEED1, 2, DEPTH, MIN_WEIGHT_MAGNITUDE, transfers, null, null, false);
assertThat(str.getSuccessfully(), IsNull.notNullValue());
}
}
+4 -11
View File
@@ -1,11 +1,6 @@
package jota;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import jota.error.InvalidAddressException;
import jota.error.InvalidBundleException;
import jota.error.InvalidSecurityLevelException;
import jota.error.InvalidTransferException;
import jota.error.ArgumentException;
import jota.model.Bundle;
import jota.model.Transaction;
import jota.model.Transfer;
@@ -30,8 +25,8 @@ public class IotaMultisigTest {
private static final String TEST_SEED2 = "FDSAG";
private static final String REMAINDER_ADDRESS = "NZRALDYNVGJWUVLKDWFKJVNYLWQGCWYCURJIIZRLJIKSAIVZSGEYKTZRDBGJLOA9AWYJQB9IPWRAKUC9FBDRZJZXZG";
private static final String RECEIVE_ADDRESS = "ZGHXPZYDKXPEOSQTAQOIXEEI9K9YKFKCWKYYTYAUWXK9QZAVMJXWAIZABOXHHNNBJIEBEUQRTBWGLYMTX";
private static final String TEST_TAG = "JOTASPAM9999999999999999999";
private static Gson gson = new GsonBuilder().create();
private IotaAPI iotaClient;
@Before
@@ -40,8 +35,7 @@ public class IotaMultisigTest {
}
@Test
public void basicMultiSigTest() throws InvalidBundleException, InvalidTransferException, InvalidAddressException, InvalidSecurityLevelException {
public void basicMultiSigTest() throws ArgumentException {
Multisig ms = new Multisig();
// First co-signer uses security level 3 and index 0 for the private key
@@ -66,9 +60,8 @@ public class IotaMultisigTest {
System.out.println("Is a valid multisig address " + isValidMultisigAddress);
assertTrue("Address is not a valid multisigAddress", isValidMultisigAddress);
Transfer transfer = new Transfer(RECEIVE_ADDRESS, 999, "", "");
List<Transfer> transfers = new ArrayList<>();
transfers.add(transfer);
transfers.add(new Transfer(RECEIVE_ADDRESS, 999, "", TEST_TAG));
List<Transaction> trxs = iotaClient.initiateTransfer(6, multiSigAddress, REMAINDER_ADDRESS, transfers, true);
+16 -11
View File
@@ -1,7 +1,10 @@
package jota;
import jota.error.*;
import jota.dto.response.SendTransferResponse;
import jota.error.ArgumentException;
import jota.model.Transfer;
import org.apache.commons.lang3.StringUtils;
import org.hamcrest.core.IsNull;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
@@ -9,14 +12,15 @@ import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static junit.framework.TestCase.assertEquals;
import static org.junit.Assert.assertThat;
public class SendMessageTest {
private static final String TEST_SEED1 = "IHDEENZYITYVYSPKAURUZAQKGVJEREFDJMYTANNXXGPZ9GJWTEOJJ9IPMXOGZNQLSNMFDSQOTZAEETUEA";
private static final String TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_2_2 = "RXTLHYQWBSJUZQXUS9LMLBE9RLAQFNDWBMZUGYJRJRHYRQQKVXBXJKEZOJDCVKFXM9GXYNMKTESEEILAYFCTLW9DQD";
private static final String TEST_MESSAGE = "JUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATESTJUSTANOTHERJOTATEST";
private static final String TEST_TAG = "TESTER999999999999999999999";
private static final String TEST_ADDRESS_WITH_CHECKSUM_SECURITY_LEVEL_2 = "LXQHWNY9CQOHPNMKFJFIJHGEPAENAOVFRDIBF99PPHDTWJDCGHLYETXT9NPUVSNKT9XDTDYNJKJCPQMZCCOZVXMTXC";
private static final String TEST_MESSAGE = "JUSTANOTHERJOTATEST";
private static final String TEST_TAG = "JOTASPAM9999999999999999999";
private static final int MIN_WEIGHT_MAGNITUDE = 14;
private static final int DEPTH = 9;
@@ -29,14 +33,15 @@ public class SendMessageTest {
@Ignore
@Test
public void shouldSendMessage() throws ArgumentException, InvalidSignatureException, InvalidBundleException, NotEnoughBalanceException, InvalidSecurityLevelException, InvalidTrytesException, InvalidAddressException, InvalidTransferException {
public void shouldSendMessage() throws ArgumentException {
List<Transfer> transfers = new ArrayList<>();
transfers.add(new jota.model.Transfer(TEST_ADDRESS_WITHOUT_CHECKSUM_SECURITY_LEVEL_2_2, 0, TEST_MESSAGE, TEST_TAG));
// for each 2187 trytes in a message a new transfer is necessary
List<String> trytes = iotaClient.prepareTransfers(TEST_SEED1, 2, transfers, null, null);
assertEquals(trytes.size(), 2);
// for each 2187 trytes in a message one transfer is necessary
transfers.add(new Transfer(TEST_ADDRESS_WITH_CHECKSUM_SECURITY_LEVEL_2, 0, StringUtils.rightPad(TEST_MESSAGE, 2188, '9'), TEST_TAG));
iotaClient.sendTrytes(trytes.toArray(new String[trytes.size()]), DEPTH, MIN_WEIGHT_MAGNITUDE);
SendTransferResponse str = iotaClient.sendTransfer(TEST_SEED1, 2, DEPTH, MIN_WEIGHT_MAGNITUDE, transfers, null, null, false);
assertEquals(str.getTransactions().size(), 2);
assertThat(str.getTransactions(), IsNull.notNullValue());
assertThat(str.getSuccessfully(), IsNull.notNullValue());
}
}
+24 -8
View File
@@ -1,7 +1,6 @@
package jota;
import jota.error.InvalidAddressException;
import jota.error.InvalidSecurityLevelException;
import jota.error.ArgumentException;
import jota.model.Bundle;
import jota.pow.ICurl;
import jota.pow.SpongeFactory;
@@ -24,14 +23,31 @@ public class SigningTest {
private static final String SIGNATURE1 = "PYWFM9MYTPNZ9HTLZBBB9CGQWKPALDUNAQYCAA9VMQ9UMBLLAXSPPHQSNAAKJA9MZBXBHBQBFFKMBSDHDTCVCDWLUYCEQ9YZJAJAXXXZHDWTSLWGIWRE9LJFVWAFUMOAGHDBHJQ9APNBLSX9GPTJNTO9SBJT9UKYCZXYAWVGXEBJANNWEWZSPRYHASHGIFUWOEHUFMP9MWQBYZOZESCPLVJUCWGLEJIDPMEVNPBITBNFSQ9GBWCDTQZOPLPXOWWNQAEIXQRWMHAQDH9C9KKHGNKAX9INMUVVGIK9TPGRHOMDFAB9VICYDMSHHDDBRSTEFSZXMXFJUQRRAFBSCNHSMKRNNTTCMBURKBGC9EDWKLPBSQAKYCUKKSZWRVURZGUA9QVSXXPICIYFHLPJSWEFBZPUTWWNIKSAJM9OMRFFQVFJZZHLQBSEYXM9CN9HCGHSJBTYDGWOQPXOPZZE9EPQAQFT9GDWZCSOPMZHYYZXDDZ9DJDLOOOTIFQANFANNAYVIRUNDXSB9XRNXJYRDBLTEDWSUOVISMCHGKD9KDRSFDWRSVZQQKGAMDXFAWBSLMTTUMH9RAUIVI9HJMTODACSOP9MLHOJMSIWQ9TTNGPXRNWRHLMEMAH9GZHJRNJHQNBBLWKFXIZBMGMATZIZBFDPAFDCLDIFFAIK9JUSFYYC9ANDGXCZFLZYGURTUI9SWYYRGDJAHXDDNHSJZBCENZUSQXSFZMTXSFLRK9RIYAUMHPBOBNOXCHDIMBGIBVOOHIDQ9ORHHDECDTREIEILWDUFMUWYMGIXBIKRZMKGXTYZTX9GKFP9AUXMTUUQXRHHKPYULGJFJLEEYCNKLOWULRIAFM9OYKEDFRXFVTSJMSEMOURCLNOIETIHEUCMPLWKDXDO9TAHVH99MKTBAAKCMYKLJUQIVLLSVTFUM9KDSIHYXYHPRLDADSLSSOIGLLXMPKTHS9YXUNMUTBTBPDWXA9GVTBGLTCLEZEUNNIRBBURDWOFFYXELPFSZRQARVRPHGETKJTRUZIFDDWBOHHGUZTODZFMOVMAGCYCTGBWSGAVZADIPIASCKTRKIUUMHNGUYZKDVOPKKHXD9EXVUVJ9YFNYMLIJLEEGPIZLFS9FIEMG9MIEO9FPW9JZEVDQOECMTESICSMVWXZNXXJILJLVQHEBHQWPOBHKEGRLFCPLB9ZECJOZDAB9DMU9UALBIQDABVDYRRTPMZOCQX9WNGXVNKQZWPA9ACVONQMRHQDPPIQTP9VKP9PAORNOFTZZWGC9RYBWSNLULZGYLMYIWWPDMOHPZTQWRPRCN9RAUOKDSCWBRI9NPUPLBILOZDOOPHSWQGJEGUYWAWJDEBLEOBSYYU9XSRPBHRUQXIDOWJZQQVJTMP9VLWLOGBK9FZFHYLJCNENDATNPSF99DFPVPTNNKIUMHRGEBJXNUVENAHYLFPPHYFTIKCB9DBVCCSJTDMOMISBAAEJVBVLHOADKNFG9NQGIGRDICQCWZVHGGXLTUNQKBUTLDWXIM9REWBLIXFBPTOXBLWBQQUSRLRDHTXQWARPMBQILAJSYLLTDAGTFPCXBCDITDOIZNGKPZQWWHJDZIPYCPFEYFD9CVXYOJHJNUNMCMSIAUVSKCACNNPGDYJJVTZOREJOPIBYCMBULMTSDTJPZNVNYQBQPPABOSSNZJKQQZ9LULSHJUBLHIFMYWSNPGUERCLVFV9LOEBJEERYHI9OMSMSCDFDLNHEMLQXNRJDYSNKTOYCPTAUWAWIGCPJKMAMGLXNBJMO9BZGFIHWDVJWYCNZZV9KBWIFQSMAXBPGVXDW9SLTHOLMJORRXZJSTNOQDRGNBLGTFCCNBJECYZGWTDRJKJRBAJRCULMOUBQJFWCLWMEWGAAVNZWMDWBYDKZMUCZAKXQLRQPIQJPMORKJXKSDTGXWDHAKUOSMXCFXWSZYWXODWFACBMFSWQFVMBELPZMISVWRQQQPNHOTWOEQQAQJDLXFEEBXLJQEECWG9ARRRDLTVBHTPARJMLOZHYWDCSXPTZCNZWTCRUJNZWKFZXAARPHFCBTLWSLERGJJMKIG9NEBADRMZWYNWIRGTMOBRKURUE9GDLRIEODY9BXJOZUVNCXKXFPFDXKUTMXZRJDOQ9YTV9BJDKGZBYTWGVPQQMNVCNARLPSRQWN9TRMHWLNEJZFTCSRD";
private static final String SIGNATURE2 = "URKFKLNXFEKDOGSQVMAOPEDIWSMTCKJZ9KEVWYALY9JAO9KHUGNDTMGQLKQJUIPWDIVMPEDSVPLFMDCIXDDT9WBBRTFQENL9AXLSBYHINXCDYBFGRNKJDYHAQVJKWCVOYXHTNBEZUNLVMJLUMZYJFAOW9PVVMJZNZZFJQEQFELVFZVFVWPJ9WQZJLPSGBYECHXSFVFQJGUCPFXC9GATTILVCAANNHOYMLOYX9QSUPCERYCOXPACZEEGLREBRZWXGUTTVTHB9GBRCIFEOBPIRXXPQKRSODEHDSZXLGIKXUQWNTQKIOPVDVSIK9WJUAEFOJBU9MBPBSVYSCLBMINTT9ZCTREZSMSVOPXSZOMCGFEZKMOCNLJ9QUTAPKBHRIAIYLCHUQHOINKSCMXWZVDGDXHNJQXJHPCCGBEWROVKEPAPBFFRCAVXZWIRKCRAWYHIHMDXFAGDJQNJJPYSQUHKFOOCEVQOGRQEIOQFKZWUQ9XVRNXKGMJOQEZHQZXQABWUQRBKXWHYUXEAEMDGXVY9WS9VJOCMGBQASSRNKAYJPTSPQEMYSJMTCLMDQJKDPBGQZZSFBDOKHBYY9UDRXNKTPWBCQTVKUGMEDUXL9TTKPATNIKVAGHACHPFSCRYNIRJBQC9OADPGWBFYYARSVNQCGMYQGCYLZH9KLMUIJPCLPQVS9BORXCJBXPDECJGKDNOUYWTKKFLXZARWKGUSMVMXKJTMRYZRERFCFGTZFZFCAOQSZGPQJUEZUJLJPU9QPMJUTZNLMSMPRGIFHUUZHMPMRBEBATEIIWPCOIMWOYOG9NYFBYOWFDKRXOTREBU99GNCPXKOWGI99LNVPRFFF9FCLFXI9HMUFU9NRLNJVTFNUSUJTAVOG9GKUYYEXIM9HTPIDTWIGLKRAQPKMQVZAPYMPSQIOJ9JZBWDMQHDSSRSHNCWSAJCSRORSEXLLQNZUKPXPGRLYMXOXWCCWWSBALFLXPHSGFLTOAFWPETBKJUMBLHMSKYLPJT9EJAZCPPNZWKPVCGKDJCRCLBBIAKVDSNWGONPLKFAYXZDI9FKPHDPKCB9UUPXLJVQTXOAZOQDRNSONXDVSLQGZYRIPGREYHRAUOSBFZDZPZHFNMWCZQGPXCZVLNCSASB9RQDFHOYMUVYLFKOEEWNREYCDMCTZIAFBFKLKRQWZCJHQZCZGWXIFTKRVMPHMVHAABHBDEV9WDEZBR9FLXLNBVNYKUOUFJQKNZVZVGZDDTFYNYFUVRLZKOLXXQYNV9MDVBLZSERXPGYKRIEZQZD9IBKFDT9AIYGWJJCXFWDUDURGJQLXVEJAVEOMZUVVTNCVBXEVQRDQIEHDUCSLCIJUTSCLFXEGMFYP9YLXELCZPMTBZWBIODZCFNJLVWTPQGLMQIHIABAYGJFFMOEDTCXGEDTNXMVXZYFGXRKVVRTIZ9ISXTDHAFPEKQZSM9XXQLOYBLTMD9MBERBIBEJDEXGMOLDZPZVVEPIRKJBDPAKFAWJPTCJSHZPDUKZEEHRFLMZCUGCOWFJBSTDGPHUIXSPPPHRQARMCFMTWKYPJNJQV9VSFZ9EWB9GVEAFUXHWRNUXQLCSBWROOITBATWUXUYGSMGAXKGEBP9ZJWXQWHBVPOSLDHTWXUOFQNO9EXSYPQF9LQLQAFNRU9MTIIRQLBBBYKUPANWRQKGESFARQIRUTGFMZVUKHZJYKTYOARTDOBIYBFRHJWEFHCYVHRHTLTWBRMUDVIVQVNELQMQRXYDNGVSICZINWIZCIWVFXLYOLYKWDNWCWFZUXHUWOPRDHMTSXOZX9CVHANU9ZXTJOGKEPYR9CHGOTIUQSWIALAOIKHQFXWY9ZWTSZADVXJNNZOLSCXVVFBRHLRBTGMSZOYNIXTAMABKGJTLGTZKRHOPPJMNYIQNVKRGXUQDWYEIEZYM9CSXO9YLSBJLDJUWOLUXDEKBGGEIDEXFLZMESDOITNYTNRLGOMHJH9HOLXJABUNLXCZYTXFPZMHRJPLXSVPDBJBBZX9TBIMZZFZOXUSFEJYHEXPFXGJCQTBBLPEEWAPHUETGXSXYYAF9PCCCOONRMQGAPJ9JO9BZQ9QSKTPFFYIFVHSLAZY9CWYSIMKDOSLRKWBHPGJGVEJEEMLCCWXKSOCMBMZZZJWYBBXE9FTAYJALGWITJRXAXWZEXMECTZEEIWZPHYX";
private static final String ADDR_SEED = "LIESNFZLPFNWAPWXBLKEABZEEWUDCXKTRKZIRTPCKLKWOMJSEREWKMMMODUOFWM9ELEVXADTSQWMSNFVD";
private static final String ADDR_I0_S1 = "HIPPOUPZFMHJUQBLBVWORCNJWAOSFLHDWF9IOFEYVHPTTAAF9NIBMRKBICAPHYCDKMEEOXOYHJBMONJ9D";
private static final String ADDR_I0_S2 = "BPYZABTUMEIOARZTMCDNUDAPUOFCGKNGJWUGUXUKNNBVKQARCZIXFVBZAAMDAFRS9YOIXWOTEUNSXVOG9";
private static final String ADDR_I0_S3 = "BYWHJJYSHSEGVZKKYTJTYILLEYBSIDLSPXDLDZSWQ9XTTRLOSCBCQ9TKXJYQAVASYCMUCWXZHJYRGDOBW";
private static final String ADDR_LS_I0_S1 = "VKPCVHWKSCYQNHULMPYDZTNKOQHZNPEGJVPEHPTDIUYUBFKFICDRLLSIULHCVHOHZRHJOHNASOFRWFWZC";
private static final String ADDR_LS_I0_S2 = "PTHVACKMXOKIERJOFSRPBWCNKVEXQ9CWUTIJGEUORSKWEDDJCBFQCCBQZLTYXQCXEDWLTMRQM9OQPUGNC";
private static final String ADDR_LS_I0_S3 = "AGSAAETPMSBCDOSNXFXIOBAE9MVEJCSWVP9PAULQ9VABOTWLDMXID9MXCCWQIWRTJBASWPIJDFUC9ISWD";
@Test
public void testAddressGeneration() throws InvalidAddressException, InvalidSecurityLevelException {
public void testAddressGeneration() throws ArgumentException {
assertEquals(FIRST_ADDR, IotaAPIUtils.newAddress(TEST_SEED, 2, 0, true, null));
assertEquals(SIXTH_ADDR, IotaAPIUtils.newAddress(TEST_SEED, 2, 5, true, null));
assertEquals(ADDR_I0_S1, IotaAPIUtils.newAddress(ADDR_SEED, 1, 0, false, null));
assertEquals(ADDR_I0_S2, IotaAPIUtils.newAddress(ADDR_SEED, 2, 0, false, null));
assertEquals(ADDR_I0_S3, IotaAPIUtils.newAddress(ADDR_SEED, 3, 0, false, null));
assertEquals(ADDR_LS_I0_S1, IotaAPIUtils.newAddress(ADDR_SEED + ADDR_SEED, 1, 0, false, null));
assertEquals(ADDR_LS_I0_S2, IotaAPIUtils.newAddress(ADDR_SEED + ADDR_SEED, 2, 0, false, null));
assertEquals(ADDR_LS_I0_S3, IotaAPIUtils.newAddress(ADDR_SEED + ADDR_SEED, 3, 0, false, null));
}
@Test
public void testLongSeedKeyGeneration() throws InvalidSecurityLevelException {
public void testLongSeedKeyGeneration() throws ArgumentException {
ICurl curl = SpongeFactory.create(SpongeFactory.Mode.KERL);
Signing signing = new Signing(curl);
String seed = "EV9QRJFJZVFNLYUFXWKXMCRRPNAZYQVEYB9VEPUHQNXJCWKZFVUCTQJFCUAMXAHMMIUQUJDG9UGGQBPIY";
@@ -47,7 +63,7 @@ public class SigningTest {
}
@Test
public void testSigning() throws InvalidAddressException, InvalidSecurityLevelException {
public void testSigning() throws ArgumentException {
// we can sign any hash, so for convenience we will sign the first
// address of our test seed
// (but remove the checksum) with the key of our fifth address
@@ -62,7 +78,7 @@ public class SigningTest {
}
@Test
public void testKeyLength() throws InvalidSecurityLevelException {
public void testKeyLength() throws ArgumentException {
Signing signing = new Signing(null);
int[] key = signing.key(Converter.trits(TEST_SEED), 5, 1);
assertEquals(Signing.KEY_LENGTH, key.length);
@@ -73,11 +89,11 @@ public class SigningTest {
}
@Test
public void testVerifying() throws InvalidAddressException {
public void testVerifying() throws ArgumentException {
assertTrue(new Signing(null).validateSignatures(removeChecksum(SIXTH_ADDR), new String[]{SIGNATURE1, SIGNATURE2}, removeChecksum(FIRST_ADDR)));
}
private String removeChecksum(String address) throws InvalidAddressException {
private String removeChecksum(String address) throws ArgumentException {
assertTrue(Checksum.isValidChecksum(address));
return address.substring(0, Constants.ADDRESS_LENGTH_WITHOUT_CHECKSUM);
}
@@ -27,9 +27,7 @@ public class TrytesConverterTest {
@Test
public void shouldConvertBackAndForth() {
String str = RandomStringUtils.randomAlphabetic(1000).toUpperCase();
System.err.println(str);
String back = TrytesConverter.toString(TrytesConverter.toTrytes(str));
assertTrue(str.equals(back));
}
}