Skip to content

Commit 4ee5873

Browse files
committed
Test for most functionality implemented
Providers improvements & fixes Fake queue manager Basic Utils fixes
1 parent 555f7d4 commit 4ee5873

39 files changed

+1200
-63
lines changed

src/main/java/io/api/etherscan/App.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,18 @@
1111
*/
1212
public class App {
1313
public static void main(String[] args) {
14-
EtherScanApi api = new EtherScanApi(args[0]);
14+
EtherScanApi api = new EtherScanApi();
1515
Balance balance = api.account().balance("0x8d4426f94e42f721C7116E81d6688cd935cB3b4F");
16+
Balance balance1 = api.account().balance("0x8d4426f94e42f721C7116E81d6688cd935cB3b4F");
17+
Balance balance2 = api.account().balance("0x8d4426f94e42f721C7116E81d6688cd935cB3b4F");
18+
Balance balance3 = api.account().balance("0x8d4426f94e42f721C7116E81d6688cd935cB3b4F");
19+
Balance balance4 = api.account().balance("0x8d4426f94e42f721C7116E81d6688cd935cB3b4F");
20+
Balance balance5 = api.account().balance("0x8d4426f94e42f721C7116E81d6688cd935cB3b4F");
1621
List<Tx> txs = api.account().txs("0x8d4426f94e42f721C7116E81d6688cd935cB3b4F");
1722
List<TxToken> txTokens = api.account().txsToken("0xf261B3A60Ef40eE0B369B0705c1a2c58B02799DF");
1823
List<TxInternal> txInternals = api.account().txsInternal("0x2c1ba59d6f58433fb1eaee7d20b26ed83bda51a3");
1924
Optional<UncleBlock> uncles = api.block().uncles(2165403);
20-
Optional<UncleBlock> uncleBlock = api.block().uncles(999965403);
25+
Optional<UncleBlock> uncleEmpty = api.block().uncles(999965403);
2126
System.out.println("Test");
2227
}
2328
}

src/main/java/io/api/etherscan/core/IProxyApi.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public interface IProxyApi {
7070
* Returns the receipt of a transaction by transaction hash
7171
* eth_getTransactionReceipt
7272
*/
73-
@NotNull Optional<TxInfoProxy> txReceipt(String txhash);
73+
@NotNull Optional<TxInfoProxy> txReceipt(String txhash) throws ApiException;
7474

7575
/**
7676
* Executes a new message call immediately without creating a transaction on the block chain

src/main/java/io/api/etherscan/core/impl/BasicProvider.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@ abstract class BasicProvider {
3838
this.gson = new Gson();
3939
}
4040

41-
private <T> T convert(final String json, final Class<T> tClass) {
41+
<T> T convert(final String json, final Class<T> tClass) {
4242
try {
4343
return gson.fromJson(json, tClass);
4444
} catch (Exception e) {
4545
throw new ParseException(e.getMessage(), e.getCause());
4646
}
4747
}
4848

49-
private String getRequest(final String urlParameters) {
49+
String getRequest(final String urlParameters) {
5050
queue.takeTurn();
5151
final String url = baseUrl + module + urlParameters;
5252
final String result = executor.get(url);
@@ -56,7 +56,7 @@ private String getRequest(final String urlParameters) {
5656
return result;
5757
}
5858

59-
private String postRequest(final String urlParameters, final String dataToPost) {
59+
String postRequest(final String urlParameters, final String dataToPost) {
6060
queue.takeTurn();
6161
final String url = baseUrl + module + urlParameters;
6262
return executor.post(url, dataToPost);

src/main/java/io/api/etherscan/core/impl/BlockApiProvider.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.api.etherscan.core.impl;
22

33
import io.api.etherscan.core.IBlockApi;
4+
import io.api.etherscan.error.ApiException;
45
import io.api.etherscan.executor.IHttpExecutor;
56
import io.api.etherscan.manager.IQueueManager;
67
import io.api.etherscan.model.UncleBlock;
@@ -27,19 +28,21 @@ public class BlockApiProvider extends BasicProvider implements IBlockApi {
2728
BlockApiProvider(final IQueueManager queueManager,
2829
final String baseUrl,
2930
final IHttpExecutor executor) {
30-
super(queueManager, "blockUncle", baseUrl, executor);
31+
super(queueManager, "block", baseUrl, executor);
3132
}
3233

3334
@NotNull
3435
@Override
35-
public Optional<UncleBlock> uncles(long blockNumber) {
36+
public Optional<UncleBlock> uncles(long blockNumber) throws ApiException {
3637
final String urlParam = ACT_BLOCK_PARAM + BLOCKNO_PARAM + blockNumber;
37-
final UncleBlockResponseTO response = getRequest(urlParam, UncleBlockResponseTO.class);
38+
final String response = getRequest(urlParam);
39+
if(BasicUtils.isEmpty(response) || response.contains("NOTOK"))
40+
return Optional.empty();
3841

39-
BasicUtils.validateTxResponse(response);
40-
41-
return (response.getResult() == null || response.getResult().isEmpty())
42+
final UncleBlockResponseTO responseTO = convert(response, UncleBlockResponseTO.class);
43+
BasicUtils.validateTxResponse(responseTO);
44+
return (responseTO.getResult() == null || responseTO.getResult().isEmpty())
4245
? Optional.empty()
43-
: Optional.of(response.getResult());
46+
: Optional.of(responseTO.getResult());
4447
}
4548
}

src/main/java/io/api/etherscan/core/impl/ContractApiProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.api.etherscan.core.impl;
22

33
import io.api.etherscan.core.IContractApi;
4+
import io.api.etherscan.error.ApiException;
45
import io.api.etherscan.error.EtherScanException;
56
import io.api.etherscan.executor.IHttpExecutor;
67
import io.api.etherscan.manager.IQueueManager;
@@ -31,7 +32,7 @@ public class ContractApiProvider extends BasicProvider implements IContractApi {
3132

3233
@NotNull
3334
@Override
34-
public Abi contractAbi(final String address) {
35+
public Abi contractAbi(final String address) throws ApiException {
3536
BasicUtils.validateAddress(address);
3637

3738
final String urlParam = ACT_ABI_PARAM + ADDRESS_PARAM + address;

src/main/java/io/api/etherscan/core/impl/EtherScanApi.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
import io.api.etherscan.executor.IHttpExecutor;
55
import io.api.etherscan.executor.impl.HttpExecutor;
66
import io.api.etherscan.manager.IQueueManager;
7+
import io.api.etherscan.manager.impl.FakeQueueManager;
78
import io.api.etherscan.manager.impl.QueueManager;
89
import io.api.etherscan.model.EthNetwork;
10+
import io.api.etherscan.util.BasicUtils;
911

1012
import java.util.function.Supplier;
1113

@@ -28,6 +30,14 @@ public class EtherScanApi {
2830
private final IStatisticApi stats;
2931
private final ITransactionApi txs;
3032

33+
public EtherScanApi() {
34+
this("YourApiKeyToken", EthNetwork.MAINNET);
35+
}
36+
37+
public EtherScanApi(final EthNetwork network) {
38+
this("YourApiKeyToken", network);
39+
}
40+
3141
public EtherScanApi(final String apiKey) {
3242
this(apiKey, EthNetwork.MAINNET);
3343
}
@@ -40,20 +50,25 @@ public EtherScanApi(final String apiKey,
4050
public EtherScanApi(final String apiKey,
4151
final EthNetwork network,
4252
final Supplier<IHttpExecutor> executorSupplier) {
53+
if (BasicUtils.isEmpty(apiKey))
54+
throw new NullPointerException("API key can not be null");
55+
4356
// EtherScan 5request\sec limit support by queue manager
44-
final IQueueManager masterQueue = new QueueManager(5, 1);
45-
final IHttpExecutor executor = executorSupplier.get();
57+
final IQueueManager masterQueue = (apiKey.equals("YourApiKeyToken"))
58+
? new FakeQueueManager()
59+
: new QueueManager(5, 1);
4660

61+
final IHttpExecutor executor = executorSupplier.get();
4762
final EthNetwork usedNetwork = (network == null) ? EthNetwork.MAINNET : network;
4863
final String baseUrl = "https://" + usedNetwork.getDomain() + ".etherscan.io/api" + "?apikey=" + apiKey;
4964

5065
this.account = new AccountApiProvider(masterQueue, baseUrl, executor);
51-
this.block = new BlockApiProvider(masterQueue, baseUrl, executor);
66+
this.block = new BlockApiProvider(masterQueue, baseUrl, executor);
5267
this.contract = new ContractApiProvider(masterQueue, baseUrl, executor);
53-
this.logs = new LogsApiProvider(masterQueue, baseUrl, executor);
54-
this.proxy = new ProxyApiProvider(masterQueue, baseUrl, executor);
55-
this.stats = new StatisticApiProvider(masterQueue, baseUrl, executor);
56-
this.txs = new TransactionApiProvider(masterQueue, baseUrl, executor);
68+
this.logs = new LogsApiProvider(masterQueue, baseUrl, executor);
69+
this.proxy = new ProxyApiProvider(masterQueue, baseUrl, executor);
70+
this.stats = new StatisticApiProvider(masterQueue, baseUrl, executor);
71+
this.txs = new TransactionApiProvider(masterQueue, baseUrl, executor);
5772
}
5873

5974
public IContractApi contract() {

src/main/java/io/api/etherscan/core/impl/LogsApiProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.api.etherscan.core.impl;
22

33
import io.api.etherscan.core.ILogsApi;
4+
import io.api.etherscan.error.ApiException;
45
import io.api.etherscan.executor.IHttpExecutor;
56
import io.api.etherscan.manager.IQueueManager;
67
import io.api.etherscan.model.Log;
@@ -32,7 +33,7 @@ public class LogsApiProvider extends BasicProvider implements ILogsApi {
3233

3334
@NotNull
3435
@Override
35-
public List<Log> logs(final LogQuery query) {
36+
public List<Log> logs(final LogQuery query) throws ApiException {
3637
final String urlParams = ACT_LOGS_PARAM + query.getParams();
3738
final LogResponseTO response = getRequest(urlParams, LogResponseTO.class);
3839
BasicUtils.validateTxResponse(response);

src/main/java/io/api/etherscan/core/impl/ProxyApiProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public Optional<String> txSendRaw(final String hexEncodedTx) throws ApiException
148148

149149
@NotNull
150150
@Override
151-
public Optional<TxInfoProxy> txReceipt(final String txhash) {
151+
public Optional<TxInfoProxy> txReceipt(final String txhash) throws ApiException {
152152
BasicUtils.validateTxHash(txhash);
153153

154154
final String urlParams = ACT_TX_RECEIPT_PARAM + TXHASH_PARAM + txhash;

src/main/java/io/api/etherscan/core/impl/StatisticApiProvider.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.api.etherscan.core.impl;
22

33
import io.api.etherscan.core.IStatisticApi;
4+
import io.api.etherscan.error.ApiException;
45
import io.api.etherscan.error.EtherScanException;
56
import io.api.etherscan.executor.IHttpExecutor;
67
import io.api.etherscan.manager.IQueueManager;
@@ -37,7 +38,7 @@ public class StatisticApiProvider extends BasicProvider implements IStatisticApi
3738

3839
@NotNull
3940
@Override
40-
public Supply supply() {
41+
public Supply supply() throws ApiException {
4142
final StringResponseTO response = getRequest(ACT_SUPPLY_PARAM, StringResponseTO.class);
4243
if (response.getStatus() != 1)
4344
throw new EtherScanException(response.getMessage() + ", with status " + response.getStatus());
@@ -47,7 +48,7 @@ public Supply supply() {
4748

4849
@NotNull
4950
@Override
50-
public BigInteger supply(final String contract) {
51+
public BigInteger supply(final String contract) throws ApiException {
5152
BasicUtils.validateAddress(contract);
5253

5354
final String urlParams = ACT_TOKEN_SUPPLY_PARAM + CONTRACT_ADDRESS_PARAM + contract;
@@ -60,7 +61,7 @@ public BigInteger supply(final String contract) {
6061

6162
@NotNull
6263
@Override
63-
public Price lastPrice() {
64+
public Price lastPrice() throws ApiException {
6465
final PriceResponseTO response = getRequest(ACT_LASTPRICE_PARAM, PriceResponseTO.class);
6566
if (response.getStatus() != 1)
6667
throw new EtherScanException(response.getMessage() + ", with status " + response.getStatus());
Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package io.api.etherscan.core.impl;
22

33
import io.api.etherscan.core.ITransactionApi;
4+
import io.api.etherscan.error.ApiException;
45
import io.api.etherscan.executor.IHttpExecutor;
56
import io.api.etherscan.manager.IQueueManager;
67
import io.api.etherscan.model.Status;
8+
import io.api.etherscan.model.utility.ReceiptStatusResponseTO;
79
import io.api.etherscan.model.utility.StatusResponseTO;
8-
import io.api.etherscan.model.utility.StringResponseTO;
910
import io.api.etherscan.util.BasicUtils;
1011
import org.jetbrains.annotations.NotNull;
1112

@@ -14,9 +15,8 @@
1415
/**
1516
* Transaction API Implementation
1617
*
17-
* @see ITransactionApi
18-
*
1918
* @author GoodforGod
19+
* @see ITransactionApi
2020
* @since 28.10.2018
2121
*/
2222
public class TransactionApiProvider extends BasicProvider implements ITransactionApi {
@@ -34,29 +34,27 @@ public class TransactionApiProvider extends BasicProvider implements ITransactio
3434

3535
@NotNull
3636
@Override
37-
public Optional<Status> execStatus(final String txhash) {
37+
public Optional<Status> execStatus(final String txhash) throws ApiException {
3838
BasicUtils.validateTxHash(txhash);
3939

4040
final String urlParams = ACT_EXEC_STATUS_PARAM + TXHASH_PARAM + txhash;
4141
final StatusResponseTO response = getRequest(urlParams, StatusResponseTO.class);
4242
BasicUtils.validateTxResponse(response);
4343

44-
return (response.getResult() == null)
45-
? Optional.empty()
46-
: Optional.of(response.getResult());
44+
return Optional.ofNullable(response.getResult());
4745
}
4846

4947
@NotNull
5048
@Override
51-
public Optional<Boolean> receiptStatus(final String txhash) {
49+
public Optional<Boolean> receiptStatus(final String txhash) throws ApiException {
5250
BasicUtils.validateTxHash(txhash);
5351

5452
final String urlParams = ACT_RECEIPT_STATUS_PARAM + TXHASH_PARAM + txhash;
55-
final StringResponseTO response = getRequest(urlParams, StringResponseTO.class);
53+
final ReceiptStatusResponseTO response = getRequest(urlParams, ReceiptStatusResponseTO.class);
5654
BasicUtils.validateTxResponse(response);
5755

58-
return (BasicUtils.isEmpty(response.getResult()))
56+
return (response.getResult() == null || BasicUtils.isEmpty(response.getResult().getStatus()))
5957
? Optional.empty()
60-
: Optional.of(response.getResult().contains("1"));
58+
: Optional.of(response.getResult().getStatus().contains("1"));
6159
}
6260
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy