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

Lines changed: 17 additions & 40 deletions
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

Lines changed: 5 additions & 0 deletions
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

Lines changed: 0 additions & 19 deletions
This file was deleted.

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

Lines changed: 41 additions & 0 deletions
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
}
Lines changed: 51 additions & 0 deletions
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

Lines changed: 3 additions & 1 deletion
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

Lines changed: 0 additions & 39 deletions
This file was deleted.

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

Lines changed: 0 additions & 16 deletions
This file was deleted.

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

Lines changed: 0 additions & 17 deletions
This file was deleted.
Lines changed: 47 additions & 0 deletions
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+
}

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