Thanks to visit codestin.com
Credit goes to github.com

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

+7-2
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

+1-1
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

+3-3
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

+10-7
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

+2-1
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

+22-7
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

+2-1
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

+1-1
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

+4-3
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());
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
}

‎src/main/java/io/api/etherscan/executor/impl/HttpExecutor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import static java.net.HttpURLConnection.HTTP_MOVED_TEMP;
1818

1919
/**
20-
* ! NO DESCRIPTION !
20+
* @see IHttpExecutor
2121
*
2222
* @author GoodforGod
2323
* @since 28.10.2018
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.api.etherscan.manager.impl;
2+
3+
import io.api.etherscan.manager.IQueueManager;
4+
5+
/**
6+
* Fake queue manager, always give turns, when you have no limits
7+
*
8+
* @author GoodforGod
9+
* @since 03.11.2018
10+
*/
11+
public class FakeQueueManager implements IQueueManager {
12+
13+
@Override
14+
public boolean takeTurn() {
15+
return true;
16+
}
17+
}

‎src/main/java/io/api/etherscan/manager/impl/QueueManager.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
import java.util.stream.IntStream;
1010

1111
/**
12-
* ! NO DESCRIPTION !
12+
* Queue implementation
13+
* With size and reset time as params
14+
* @see IQueueManager
1315
*
1416
* @author GoodforGod
1517
* @since 30.10.2018
@@ -25,12 +27,16 @@ public class QueueManager implements IQueueManager {
2527
private final ScheduledExecutorService queueExecutor;
2628

2729
public QueueManager(int queueSize, int queueResetTimeInSec) {
30+
this(queueSize, queueResetTimeInSec, 0);
31+
}
32+
33+
public QueueManager(int queueSize, int queueResetTimeInSec, int delayInSec) {
2834
this.queueSize = queueSize;
2935
this.queueValues = generateList(queueSize);
3036
this.queue = new ArrayBlockingQueue<>(queueSize);
3137

3238
this.queueExecutor = Executors.newSingleThreadScheduledExecutor();
33-
this.queueExecutor.scheduleAtFixedRate(createTask(), queueResetTimeInSec, queueResetTimeInSec, TimeUnit.SECONDS);
39+
this.queueExecutor.scheduleAtFixedRate(createTask(), delayInSec, queueResetTimeInSec, TimeUnit.SECONDS);
3440
}
3541

3642
@Override

‎src/main/java/io/api/etherscan/model/TokenBalance.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public TokenBalance(String address, BigInteger balance, String tokenContract) {
1717
this.tokenContract = tokenContract;
1818
}
1919

20-
public String getTokenContract() {
20+
public String getContract() {
2121
return tokenContract;
2222
}
2323

‎src/main/java/io/api/etherscan/model/UncleBlock.java

-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
*/
1313
public class UncleBlock extends Block {
1414

15-
public static UncleBlock EMPTY = new UncleBlock();
16-
1715
private String blockMiner;
1816
private List<Uncle> uncles;
1917
private String uncleInclusionReward;

0 commit comments

Comments
 (0)