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

Skip to content

Commit 68bbb4c

Browse files
committed
Providers refactored
Contract provider implementation Basic java native HttpExecutor implementation Basic provider DTOs provided
1 parent 1f76be1 commit 68bbb4c

26 files changed

+544
-221
lines changed

‎pom.xml

+17-40
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
32
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
43
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
54
<modelVersion>4.0.0</modelVersion>
@@ -8,58 +7,36 @@
87
<artifactId>etherscan</artifactId>
98
<version>1.0.0</version>
109

11-
<name>etherscan</name>
12-
<!-- FIXME change it to the project's website -->
13-
<url>http://www.example.com</url>
10+
<name>etherscan-api</name>
1411

1512
<properties>
1613
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
17-
<maven.compiler.source>1.7</maven.compiler.source>
18-
<maven.compiler.target>1.7</maven.compiler.target>
14+
<maven.compiler.source>1.8</maven.compiler.source>
15+
<maven.compiler.target>1.8</maven.compiler.target>
1916
</properties>
2017

2118
<dependencies>
2219
<dependency>
2320
<groupId>junit</groupId>
2421
<artifactId>junit</artifactId>
25-
<version>4.11</version>
22+
<version>4.12</version>
2623
<scope>test</scope>
2724
</dependency>
25+
26+
<dependency>
27+
<groupId>org.apache.httpcomponents</groupId>
28+
<artifactId>httpclient</artifactId>
29+
<version>4.5.6</version>
30+
</dependency>
31+
32+
<dependency>
33+
<groupId>com.jsoniter</groupId>
34+
<artifactId>jsoniter</artifactId>
35+
<version>0.9.19</version>
36+
</dependency>
2837
</dependencies>
2938

3039
<build>
31-
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
32-
<plugins>
33-
<plugin>
34-
<artifactId>maven-clean-plugin</artifactId>
35-
<version>3.0.0</version>
36-
</plugin>
37-
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
38-
<plugin>
39-
<artifactId>maven-resources-plugin</artifactId>
40-
<version>3.0.2</version>
41-
</plugin>
42-
<plugin>
43-
<artifactId>maven-compiler-plugin</artifactId>
44-
<version>3.7.0</version>
45-
</plugin>
46-
<plugin>
47-
<artifactId>maven-surefire-plugin</artifactId>
48-
<version>2.20.1</version>
49-
</plugin>
50-
<plugin>
51-
<artifactId>maven-jar-plugin</artifactId>
52-
<version>3.0.2</version>
53-
</plugin>
54-
<plugin>
55-
<artifactId>maven-install-plugin</artifactId>
56-
<version>2.5.2</version>
57-
</plugin>
58-
<plugin>
59-
<artifactId>maven-deploy-plugin</artifactId>
60-
<version>2.8.2</version>
61-
</plugin>
62-
</plugins>
63-
</pluginManagement>
40+
6441
</build>
6542
</project>

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

+5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package io.api;
22

3+
import io.api.core.EtherScanApi;
4+
35
/**
46
*
57
*/
68
public class App {
79
public static void main(String[] args) {
810
System.out.println("Hello World!");
11+
EtherScanApi api = new EtherScanApi(args[0]);
12+
String abi = api.contract().contractAbi("0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413");
13+
int i = abi.length();
914
}
1015
}

‎src/main/java/io/api/core/BasicProvider.java

-19
This file was deleted.

‎src/main/java/io/api/core/EtherScanApi.java

+41
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
package io.api.core;
22

3+
import io.api.core.impl.AccountProvider;
4+
import io.api.core.impl.ContractProvider;
5+
import io.api.model.EthereumNetwork;
6+
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
310
/**
411
* ! NO DESCRIPTION !
512
*
@@ -8,4 +15,38 @@
815
*/
916
public class EtherScanApi {
1017

18+
private static final Map<String, String> HEADERS = new HashMap<>();
19+
20+
static {
21+
HEADERS.put("accept-language", "en,ru;q=0.9");
22+
HEADERS.put("accept-encoding", "gzip, deflate, br");
23+
HEADERS.put("user-agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) Chrome/68.0.3440.106");
24+
HEADERS.put("cache-control", "max-age=0");
25+
}
26+
27+
private final ContractProvider contract;
28+
private final AccountProvider account;
29+
30+
public EtherScanApi(final String apiKey) {
31+
this(apiKey, EthereumNetwork.MAINNET);
32+
}
33+
34+
public EtherScanApi(final String apiKey,
35+
final EthereumNetwork network) {
36+
final EthereumNetwork usedNetwork = (network == null)
37+
? EthereumNetwork.MAINNET
38+
: network;
39+
40+
final String url = "https://" + usedNetwork.getDomain() + ".etherscan.io/api" + "?apikey=" + apiKey;
41+
this.contract = new ContractProvider(url, HEADERS);
42+
this.account = new AccountProvider(url, HEADERS);
43+
}
44+
45+
public ContractProvider contract() {
46+
return contract;
47+
}
48+
49+
public AccountProvider account() {
50+
return account;
51+
}
1152
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package io.api.core;
2+
3+
import io.api.model.Balance;
4+
import io.api.model.Block;
5+
import io.api.model.Transaction;
6+
7+
import java.util.List;
8+
import java.util.Optional;
9+
10+
/**
11+
* EtherScan - API Descriptions
12+
* https://etherscan.io/apis#accounts
13+
*
14+
* @author GoodforGod
15+
* @since 28.10.2018
16+
*/
17+
public interface IAccountProvider {
18+
19+
/** Address ETH balance */
20+
Optional<Balance> balance(String address);
21+
22+
/**
23+
* Maximum 20 address for batch request
24+
* If address > 20, then there will be more than 1 request
25+
*/
26+
List<Balance> balances(List<String> addresses);
27+
28+
/** All txs */
29+
List<Transaction> txs(String address);
30+
/** Only last 10000 txs */
31+
List<Transaction> txs(String address, int startBlock);
32+
/** Only last 10000 txs */
33+
List<Transaction> txs(String address, int startBlock, int endBlock);
34+
35+
/** All internal txs */
36+
List<Transaction> txsInternal(String address);
37+
/** Only last 10000 internal txs */
38+
List<Transaction> txsInternal(String address, int startBlock);
39+
/** Only last 10000 internal txs */
40+
List<Transaction> txsInternal(String address, int startBlock, int endBlock);
41+
42+
/** All token txs */
43+
List<Transaction> txsToken(String address);
44+
/** Only last 10000 token txs */
45+
List<Transaction> txsToken(String address, int startBlock);
46+
/** Only last 10000 token txs */
47+
List<Transaction> txsToken(String address, int startBlock, int endBlock);
48+
49+
/** All blocks mined by address */
50+
List<Block> minedBlocks(String address);
51+
}

‎src/main/java/io/api/core/contract/IContractProvider.java renamed to ‎src/main/java/io/api/core/IContractProvider.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.api.core.contract;
1+
package io.api.core;
22

33
/**
44
* ! NO DESCRIPTION !
@@ -8,4 +8,6 @@
88
*/
99
public interface IContractProvider {
1010

11+
/** Get Verified Contract Sources */
12+
String contractAbi(String address);
1113
}

‎src/main/java/io/api/core/account/IAccountProvider.java

-39
This file was deleted.

‎src/main/java/io/api/core/account/impl/AccountProvider.java

-16
This file was deleted.

‎src/main/java/io/api/core/contract/impl/ContractProvider.java

-17
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package io.api.core.executor;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
import java.net.HttpURLConnection;
7+
import java.net.URL;
8+
import java.util.Map;
9+
10+
import static java.net.HttpURLConnection.HTTP_MOVED_PERM;
11+
import static java.net.HttpURLConnection.HTTP_MOVED_TEMP;
12+
13+
/**
14+
* ! NO DESCRIPTION !
15+
*
16+
* @author GoodforGod
17+
* @since 28.10.2018
18+
*/
19+
public class HttpExecutor {
20+
21+
public String get(final String urlAsString,
22+
final Map<String, String> headers) throws IOException {
23+
24+
final URL url = new URL(urlAsString);
25+
final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
26+
connection.setRequestMethod("GET");
27+
headers.forEach(connection::setRequestProperty);
28+
connection.setConnectTimeout(30000);
29+
30+
final int status = connection.getResponseCode();
31+
if (status == HTTP_MOVED_TEMP || status == HTTP_MOVED_PERM) {
32+
final String location = connection.getHeaderField("Location");
33+
return get(location, headers);
34+
}
35+
36+
final BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
37+
String inputLine;
38+
final StringBuilder content = new StringBuilder();
39+
while ((inputLine = in.readLine()) != null)
40+
content.append(inputLine);
41+
42+
in.close();
43+
connection.disconnect();
44+
45+
return content.toString();
46+
}
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.api.core.impl;
2+
3+
import java.util.Map;
4+
5+
/**
6+
* ! NO DESCRIPTION !
7+
*
8+
* @author GoodforGod
9+
* @since 28.10.2018
10+
*/
11+
public class AccountProvider extends BasicProvider {
12+
13+
private static final String startBlockParam = "&endblock=";
14+
private static final String endBlockParam = "&startblock=";
15+
private static final String offsetParam = "&offset=";
16+
private static final String pageParam = "&page=";
17+
private static final String sortAscParam = "&sort=asc";
18+
private static final String sortDescParam = "&sort=desc";
19+
private static final String blockTypeParam = "&blocktype=blocks";
20+
private static final String addressParam = "&address=";
21+
22+
public AccountProvider(final String baseUrl,
23+
final Map<String, String> header) {
24+
super("account", baseUrl, header);
25+
}
26+
}

0 commit comments

Comments
 (0)