diff --git a/README.md b/README.md index 6df1150..9eac690 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,8 @@ The JOTA library is a simple Java8 wrapper around [[IOTA]](http://www.iotatoken. It allows to connect easily using java directly to a local or a remote [[IOTA node]](https://iota.readme.io/docs/syncing-to-the-network). * **Latest release:** 0.0.1 Snapshot -* **Compatibility:** IOTA IRI v1.0.6 -* **API coverage:** 12 of 20 commands fully implemented +* **Compatibility:** in development to be fully compatible with IOTA IRI v1.1.0 +* **API coverage:** 11 of 14 commands fully implemented * **License:** Apache License 2.0 * **Readme updated:** 2016-10-07 14:23:43 (UTC) diff --git a/node_config.properties b/node_config.properties index 1620702..5950679 100644 --- a/node_config.properties +++ b/node_config.properties @@ -1,5 +1,6 @@ iota.node.protocol=http +#iota.node.host=138.68.126.141 iota.node.host=127.0.0.1 iota.node.port=14265 diff --git a/src/main/java/jota/IotaAPICommands.java b/src/main/java/jota/IotaAPICommands.java index 98213fa..90dbfb1 100644 --- a/src/main/java/jota/IotaAPICommands.java +++ b/src/main/java/jota/IotaAPICommands.java @@ -5,26 +5,20 @@ package jota; */ public enum IotaAPICommands { - GET_NODE_INFO("getNodeInfo", 0), - GET_MILESTONE("getMilestone", 0), - GET_NEIGHBORS("getNeighbors", 0), - GET_TIPS("getTips",0), - GET_TRANSFER("getTransfers", 0), // - FIND_TRANSACTIONS("findTransactions", 0), - GET_INCLUSIONS_STATES("getInclusionStates", 0), - GET_BUNDLE("getBundle", 0), - GET_TRYTES("getTrytes", 0), - ANALYZE_TRANSACTIONS("analyzeTransactions", 0), - GET_NEW_ADDRESS("getNewAddress", 0), - PREPARE_TRANSFERS("prepareTransfers", 0), - GET_TRANSACTIONS_TO_APPROVE("getTransactionsToApprove", 0), - ATTACH_TO_TANGLE("attachToTangle", 0), - INTERRUPT_ATTACHING_TO_TANGLE("interruptAttachingToTangle", 0), - PUSH_TRANSACTIONS("pushTransactions", 0), - STORE_TRANSACTIONS("storeTransactions", 0), - TRANSFER("transfer", 0), - REPLAY_TRANSFER("replayTransfer",0), - PULL_TRANSACTIONS("pullTransactions", 0); + GET_NODE_INFO("getNodeInfo", 0), + GET_NEIGHBORS("getNeighbors", 0), + ADD_NEIGHBORS("addNeighbors", 0), + REMOVE_NEIGHBORS("removeNeighbors",0), + GET_TIPS("getTips",0), + FIND_TRANSACTIONS("findTransactions", 0), + 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); private IotaAPICommands(String command, int params) { this.command = command; diff --git a/src/main/java/jota/IotaAPIProxy.java b/src/main/java/jota/IotaAPIProxy.java index 3de0605..b9f84b1 100644 --- a/src/main/java/jota/IotaAPIProxy.java +++ b/src/main/java/jota/IotaAPIProxy.java @@ -4,7 +4,6 @@ import java.io.BufferedReader; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.Arrays; import java.util.Collection; import java.util.Optional; import java.util.Properties; @@ -74,11 +73,6 @@ public class IotaAPIProxy { return wrapCheckedException(res).body(); } - public GetMilestoneResponse getMilestone(Integer index) { - final Call res = service.getMilestone(IotaGetMilestoneRequest.createMilestoneRequest(index)); - return wrapCheckedException(res).body(); - } - public GetNeighborsResponse getNeighbors() { final Call res = service.getNeighbors(IotaCommandRequest.createGetNeighborsRequest()); return wrapCheckedException(res).body(); @@ -88,12 +82,6 @@ public class IotaAPIProxy { final Call res = service.getTips(IotaCommandRequest.createGetTipsRequest()); return wrapCheckedException(res).body(); } - - public GetTransfersResponse getTransfers(String seed, Integer securityLevel) { - final IotaGetTransferRequest tr = IotaGetTransferRequest.createGetTransferRequest(seed, securityLevel); - final Call res = service.getTransfers(tr); - return wrapCheckedException(res).body(); - } public FindTransactionResponse findTransactions(String [] addresses, String [] digests, String [] approvees, String [] bundles ) { @@ -136,26 +124,11 @@ public class IotaAPIProxy { return wrapCheckedException(res).body(); } - public GetBundleResponse getBundle(String transaction) { - final Call res = service.getBundle(IotaGetBundleRequest.createIotaGetBundleRequest(transaction)); - return wrapCheckedException(res).body(); - } - public GetTrytesResponse getTrytes(String ... hashes) { final Call res = service.getTrytes(IotaGetTrytesRequest.createGetTrytesRequest(hashes)); return wrapCheckedException(res).body(); } - public AnalyzeTransactionResponse analyseTransaction(String ... trytes) { - final Call res = service.analyzeTransactions(IotaAnalyzeTransactionRequest.createIotaAnalyzeTransactionRequest(trytes)); - return wrapCheckedException(res).body(); - } - - public GetNewAddressResponse getNewAddress(String seed, Integer securityLevel) { - final Call res = service.getNewAddress(IotaGetNewAddressRequest.createIotaGetNewAddressRequest(seed, securityLevel)); - return wrapCheckedException(res).body(); - } - public GetTransactionsToApproveResponse getTransactionsToApprove(String milestone) { final Call res = service.getTransactionsToApprove(IotaGetTransactionsToApproveRequest.createIotaGetTransactionsToApproveRequest(milestone)); return wrapCheckedException(res).body(); @@ -175,6 +148,16 @@ public class IotaAPIProxy { } } + // end of proxied calls. + + public GetBundleResponse getBundle(String transaction) { + return IotaAPIUtils.getBundle(transaction); + } + + public GetNewAddressResponse getNewAddress(String seed, Integer securityLevel) { + return IotaAPIUtils.getNewAddress(seed, securityLevel); + } + private static final String env(String env, String def) { return Optional.ofNullable(System.getenv(env)).orElseGet(() -> { log.warn("Enviroment variable '{}' is not defined, and actual value has not been specified. " diff --git a/src/main/java/jota/IotaAPIService.java b/src/main/java/jota/IotaAPIService.java index b759b91..a268ad1 100644 --- a/src/main/java/jota/IotaAPIService.java +++ b/src/main/java/jota/IotaAPIService.java @@ -20,8 +20,8 @@ public interface IotaAPIService { /** * Returns information about your node. * - * curl http://localhost:14265 \ -X POST \ -H 'Content-Type: - * application/json' \ -d '{"command": "getNodeInfo"}' + * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' + * -d '{"command": "getNodeInfo"}' * * @return a {@code NodeInfoResponse} object, if succesfull. */ @@ -29,18 +29,6 @@ public interface IotaAPIService { @POST("./") Call getNodeInfo(@Body IotaCommandRequest request); - /** - * Returns a milestone from a given index. - * - * curl http://localhost:14265 \ -X POST \ -H 'Content-Type: - * application/json' \ -d '{"command": "getMilestone", "index": 8059}' - * - * @return - */ - @Headers({ CONTENT_TYPE_HEADER, USER_AGENT_HEADER }) - @POST("./") - Call getMilestone(@Body IotaGetMilestoneRequest request); - /** * Get the list of latest tips (unconfirmed transactions). * @@ -54,24 +42,13 @@ public interface IotaAPIService { /** * Get the list of latest tips (unconfirmed transactions). * - * curl http://localhost:14265 \ -X POST \ -H 'Content-Type: - * application/json' \ -d '{"command": "getTips"}' + * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' + * -d '{"command": "getTips"}' */ @Headers({ CONTENT_TYPE_HEADER, USER_AGENT_HEADER }) @POST("./") Call getTips(@Body IotaCommandRequest request); - /** - * Get the list of transfers from a specified seed (account). - * - * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' - * -d '{"command": "getTransfers", "seed": "AAA999999999999999999999999999999999999999999999999999999999999999999999999999999", "securityLevel": 1}' - */ - @Headers({ CONTENT_TYPE_HEADER, USER_AGENT_HEADER }) - @POST("./") - Call getTransfers(@Body IotaGetTransferRequest request); - - /** * Find the transactions which match the specified input and return * @@ -93,17 +70,6 @@ public interface IotaAPIService { @POST("./") Call getInclusionStates(@Body IotaGetInclusionStateRequest request); - /** - * Get the list of transactions which were bundled with the specified tail transaction. This call returns the full value of all individual transactions, not just the hashes. - * - * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' - * -d '{"command": "getBundle", "transaction": "ZJVYUGTDRPDYFGFXMKOTV9ZWSGFK9CFPXTITQLQNLPPG9YNAARMKNKYQO9GSCSBIOTGMLJUFLZWSY9999"}' - * - */ - @Headers({ CONTENT_TYPE_HEADER, USER_AGENT_HEADER }) - @POST("./") - Call getBundle(@Body IotaGetBundleRequest request); - /** * Returns the raw trytes data of a transaction. * @@ -115,33 +81,6 @@ public interface IotaAPIService { @POST("./") Call getTrytes(@Body IotaGetTrytesRequest request); - /** - * - * Analyze a raw transaction by its trytes and return the full transaction object. - * - * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' - * -d '{"command": "analyzeTransactions", "trytes": ["BYSWEAUTWXHXZ9YBZISEK9LUHWGMHXCGEVNZHRLUWQFCUSDXZHOFHWHL9MQPVJXXZLIXPXPXF9KYEREFSKCPKYIIKPZVLHUTDFQKKVVBBN9ATTLPCNPJDWDEVIYYLGPZGCWXOBDXMLJC9VO9QXTTBLAXTTBFUAROYEGQIVB9MJWJKXJMCUPTWAUGFZBTZCSJVRBGMYXTVBDDS9MYUJCPZ9YDWWQNIPUAIJXXSNLKUBSCOIJPCLEFPOXFJREXQCUVUMKSDOVQGGHRNILCO9GNCLWFM9APMNMWYASHXQAYBEXF9QRIHIBHYEJOYHRQJAOKAQ9AJJFQ9WEIWIJOTZATIBOXQLBMIJU9PCGBLVDDVFP9CFFSXTDUXMEGOOFXWRTLFGV9XXMYWEMGQEEEDBTIJ9OJOXFAPFQXCDAXOUDMLVYRMRLUDBETOLRJQAEDDLNVIRQJUBZBO9CCFDHIX9MSQCWYAXJVWHCUPTRSXJDESISQPRKZAFKFRULCGVRSBLVFOPEYLEE99JD9SEBALQINPDAZHFAB9RNBH9AZWIJOTLBZVIEJIAYGMC9AZGNFWGRSWAXTYSXVROVNKCOQQIWGPNQZKHUNODGYADPYLZZZUQRTJRTODOUKAOITNOMWNGHJBBA99QUMBHRENGBHTH9KHUAOXBVIVDVYYZMSEYSJWIOGGXZVRGN999EEGQMCOYVJQRIRROMPCQBLDYIGQO9AMORPYFSSUGACOJXGAQSPDY9YWRRPESNXXBDQ9OZOXVIOMLGTSWAMKMTDRSPGJKGBXQIVNRJRFRYEZ9VJDLHIKPSKMYC9YEGHFDS9SGVDHRIXBEMLFIINOHVPXIFAZCJKBHVMQZEVWCOSNWQRDYWVAIBLSCBGESJUIBWZECPUCAYAWMTQKRMCHONIPKJYYTEGZCJYCT9ABRWTJLRQXKMWY9GWZMHYZNWPXULNZAPVQLPMYQZCYNEPOCGOHBJUZLZDPIXVHLDMQYJUUBEDXXPXFLNRGIPWBRNQQZJSGSJTTYHIGGFAWJVXWL9THTPWOOHTNQWCNYOYZXALHAZXVMIZE9WMQUDCHDJMIBWKTYH9AC9AFOT9DPCADCV9ZWUTE9QNOMSZPTZDJLJZCJGHXUNBJFUBJWQUEZDMHXGBPTNSPZBR9TGSKVOHMOQSWPGFLSWNESFKSAZY9HHERAXALZCABFYPOVLAHMIHVDBGKUMDXC9WHHTIRYHZVWNXSVQUWCR9M9RAGMFEZZKZ9XEOQGOSLFQCHHOKLDSA9QCMDGCGMRYJZLBVIFOLBIJPROKMHOYTBTJIWUZWJMCTKCJKKTR9LCVYPVJI9AHGI9JOWMIWZAGMLDFJA9WU9QAMEFGABIBEZNNAL9OXSBFLOEHKDGHWFQSHMPLYFCNXAAZYJLMQDEYRGL9QKCEUEJ9LLVUOINVSZZQHCIKPAGMT9CAYIIMTTBCPKWTYHOJIIY9GYNPAJNUJ9BKYYXSV9JSPEXYMCFAIKTGNRSQGUNIYZCRT9FOWENSZQPD9ALUPYYAVICHVYELYFPUYDTWUSWNIYFXPX9MICCCOOZIWRNJIDALWGWRATGLJXNAYTNIZWQ9YTVDBOFZRKO9CFWRPAQQRXTPACOWCPRLYRYSJARRKSQPR9TCFXDVIXLP9XVL99ERRDSOHBFJDJQQGGGCZNDQ9NYCTQJWVZIAELCRBJJFDMCNZU9FIZRPGNURTXOCDSQGXTQHKHUECGWFUUYS9J9NYQ9U9P9UUP9YMZHWWWCIASCFLCMSKTELZWUGCDE9YOKVOVKTAYPHDF9ZCCQAYPJIJNGSHUIHHCOSSOOBUDOKE9CJZGYSSGNCQJVBEFTZFJ9SQUHOASKRRGBSHWKBCBWBTJHOGQ9WOMQFHWJVEG9NYX9KWBTCAIXNXHEBDIOFO9ALYMFGRICLCKKLG9FOBOX9PDWNQRGHBKHGKKRLWTBEQMCWQRLHAVYYZDIIPKVQTHYTWQMTOACXZOQCDTJTBAAUWXSGJF9PNQIJ9AJRUMUVCPWYVYVARKR9RKGOUHHNKNVGGPDDLGKPQNOYHNKAVVKCXWXOQPZNSLATUJT9AUWRMPPSWHSTTYDFAQDXOCYTZHOYYGAIM9CELMZ9AZPWB9MJXGHOKDNNSZVUDAGXTJJSSZCPZVPZBYNNTUQABSXQWZCHDQSLGK9UOHCFKBIBNETK999999999999999999999999999999999999999999999999999999999999999999999999999999999NOXDXXKUDWLOFJLIPQIBRBMGDYCPGDNLQOLQS99EQYKBIU9VHCJVIPFUYCQDNY9APGEVYLCENJIOBLWNB999999999XKBRHUD99C99999999NKZKEKWLDKMJCI9N9XQOLWEPAYWSH9999999999999999999999999KDDTGZLIPBNZKMLTOLOXQVNGLASESDQVPTXALEKRMIOHQLUHD9ELQDBQETS9QFGTYOYWLNTSKKMVJAUXSIROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999IROUICDOXKSYZTDPEDKOQENTJOWJONDEWROCEJIEWFWLUAACVSJFTMCHHXJBJRKAAPUDXXVXFWP9X9999"]}' - * */ - @Headers({ CONTENT_TYPE_HEADER, USER_AGENT_HEADER }) - @POST("./") - Call analyzeTransactions(@Body IotaAnalyzeTransactionRequest request); - - /** - * Generates a new address for your specified account (seed + securityLevel). - * - * curl http://localhost:14265 -X POST -H 'Content-Type: application/json' - * -d '{"command": "getNewAddress", "seed": "AAA999999999999999999999999999999999999999999999999999999999999999999999999999999", "securityLevel": 1}' - */ - @Headers({ CONTENT_TYPE_HEADER, USER_AGENT_HEADER }) - @POST("./") - Call getNewAddress(@Body IotaGetNewAddressRequest request); - - /* - @Headers({ CONTENT_TYPE_HEADER, USER_AGENT_HEADER }) - @POST("./") - Call prepareTransfers(@Body IotaPrepareTransfersRequest request); - */ - /** * Tip selection which returns trunkTransaction and branchTransaction. The input value is the latest coordinator milestone, as provided through the getNodeInfo API call. * diff --git a/src/main/java/jota/IotaAPIUtils.java b/src/main/java/jota/IotaAPIUtils.java new file mode 100644 index 0000000..8de3f1b --- /dev/null +++ b/src/main/java/jota/IotaAPIUtils.java @@ -0,0 +1,25 @@ +package jota; + +import jota.dto.response.GetBundleResponse; +import jota.dto.response.GetNewAddressResponse; +import org.apache.commons.lang3.NotImplementedException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Client Side computation service + * + * @author davassi + */ +public class IotaAPIUtils { + + private static final Logger log = LoggerFactory.getLogger(IotaAPIUtils.class); + + public static GetNewAddressResponse getNewAddress(final String seed, final Integer securityLevel) { + throw new NotImplementedException("Not yet implemented"); + } + + public static GetBundleResponse getBundle(final String transaction) { + throw new NotImplementedException("Not yet implemented"); + } +} diff --git a/src/main/java/jota/dto/request/IotaAnalyzeTransactionRequest.java b/src/main/java/jota/dto/request/IotaAnalyzeTransactionRequest.java deleted file mode 100644 index 497ebd9..0000000 --- a/src/main/java/jota/dto/request/IotaAnalyzeTransactionRequest.java +++ /dev/null @@ -1,17 +0,0 @@ -package jota.dto.request; - -import jota.IotaAPICommands; - -public class IotaAnalyzeTransactionRequest extends IotaCommandRequest { - - private String [] trytes; - - private IotaAnalyzeTransactionRequest(final String ... trytes) { - super(IotaAPICommands.ANALYZE_TRANSACTIONS); - this.trytes = trytes; - } - - public static IotaAnalyzeTransactionRequest createIotaAnalyzeTransactionRequest(String ... trytes) { - return new IotaAnalyzeTransactionRequest(trytes); - } -} diff --git a/src/main/java/jota/dto/request/IotaGetBundleRequest.java b/src/main/java/jota/dto/request/IotaGetBundleRequest.java deleted file mode 100644 index 9a66181..0000000 --- a/src/main/java/jota/dto/request/IotaGetBundleRequest.java +++ /dev/null @@ -1,18 +0,0 @@ -package jota.dto.request; - -import jota.IotaAPICommands; - -public class IotaGetBundleRequest extends IotaCommandRequest { - - private String transaction; - - private IotaGetBundleRequest(final String transaction) { - super(IotaAPICommands.GET_BUNDLE); - this.transaction = transaction; - } - - public static IotaGetBundleRequest createIotaGetBundleRequest(String transaction) { - return new IotaGetBundleRequest(transaction); - } - -} diff --git a/src/main/java/jota/dto/request/IotaGetMilestoneRequest.java b/src/main/java/jota/dto/request/IotaGetMilestoneRequest.java deleted file mode 100644 index b9ce950..0000000 --- a/src/main/java/jota/dto/request/IotaGetMilestoneRequest.java +++ /dev/null @@ -1,17 +0,0 @@ -package jota.dto.request; - -import jota.IotaAPICommands; - -public class IotaGetMilestoneRequest extends IotaCommandRequest { - - private String index; - - private IotaGetMilestoneRequest(final String index) { - super(IotaAPICommands.GET_MILESTONE); - this.index = index; - } - - public static IotaGetMilestoneRequest createMilestoneRequest(Integer index) { - return new IotaGetMilestoneRequest(String.valueOf(index)); - } -} diff --git a/src/main/java/jota/dto/request/IotaGetNewAddressRequest.java b/src/main/java/jota/dto/request/IotaGetNewAddressRequest.java deleted file mode 100644 index 1216535..0000000 --- a/src/main/java/jota/dto/request/IotaGetNewAddressRequest.java +++ /dev/null @@ -1,19 +0,0 @@ -package jota.dto.request; - -import jota.IotaAPICommands; - -public class IotaGetNewAddressRequest extends IotaCommandRequest { - - private String seed; - private Integer securityLevel; - - private IotaGetNewAddressRequest(final String seed, final Integer securityLevel) { - super(IotaAPICommands.GET_NEW_ADDRESS); - this.seed = seed; - this.securityLevel = securityLevel; - } - - public static IotaGetNewAddressRequest createIotaGetNewAddressRequest(String seed, Integer securityLevel) { - return new IotaGetNewAddressRequest(seed, securityLevel); - } -} diff --git a/src/main/java/jota/dto/request/IotaGetTransferRequest.java b/src/main/java/jota/dto/request/IotaGetTransferRequest.java deleted file mode 100644 index 82512dd..0000000 --- a/src/main/java/jota/dto/request/IotaGetTransferRequest.java +++ /dev/null @@ -1,20 +0,0 @@ -package jota.dto.request; - -import com.google.gson.Gson; -import jota.IotaAPICommands; - -public class IotaGetTransferRequest extends IotaCommandRequest { - - private String seed; - private Integer securityLevel; - - private IotaGetTransferRequest(final String seed, final Integer securityLevel) { - super(IotaAPICommands.GET_TRANSFER); - this.seed = seed; - this.securityLevel = securityLevel; - } - - public static IotaGetTransferRequest createGetTransferRequest(String seed, Integer securityLevel) { - return new IotaGetTransferRequest(seed, securityLevel); - } -} diff --git a/src/test/java/jota/IotaAPIProxyTest.java b/src/test/java/jota/IotaAPIProxyTest.java index 3f4ca39..56192da 100644 --- a/src/test/java/jota/IotaAPIProxyTest.java +++ b/src/test/java/jota/IotaAPIProxyTest.java @@ -46,12 +46,6 @@ public class IotaAPIProxyTest { assertThat(nodeInfo, IsNull.notNullValue()); } - @Test - public void shouldGetMilestone() { - GetMilestoneResponse milestone = proxy.getMilestone(TEST_MILESTONE_INDEX); - assertThat(milestone, IsNull.notNullValue()); - } - @Test public void shouldGetNeighbors() { GetNeighborsResponse neighbors = proxy.getNeighbors(); @@ -88,12 +82,6 @@ public class IotaAPIProxyTest { assertThat(trans, IsNull.notNullValue()); } - @Test - public void shouldGetTransactions() { - GetTransfersResponse res = proxy.getTransfers(TEST_SEED, 1); - assertThat(res, IsNull.notNullValue()); - } - @Test public void shouldGetInclusionStates() { GetInclusionStateResponse res = proxy.getInclusionStates(new String[]{TEST_TRANSACTION}, @@ -101,30 +89,6 @@ public class IotaAPIProxyTest { assertThat(res, IsNull.notNullValue()); } - @Test - public void shouldGetBundle() { - GetBundleResponse res = proxy.getBundle(TEST_TRANSACTION); - assertThat(res, IsNull.notNullValue()); - } - - @Test - public void shouldGetTrytes() { - GetTrytesResponse res = proxy.getTrytes(TEST_HASH); - assertThat(res, IsNull.notNullValue()); - } - - @Test - public void shouldAnalyseTransaction() { - AnalyzeTransactionResponse res = proxy.analyseTransaction(TEST_TRYTES); - assertThat(res, IsNull.notNullValue()); - } - - @Test - public void shouldGetNewAddress() { - GetNewAddressResponse res = proxy.getNewAddress(TEST_SEED, 1); - assertThat(res, IsNull.notNullValue()); - } - @Test // very long execution public void shouldGetTransactionsToApprove() { GetTransactionsToApproveResponse res = proxy.getTransactionsToApprove(TEST_MILESTONE);