Skip to content

Commit bb87f90

Browse files
committed
[3.0.0-SNAPSHOT]
Added JdkEthHttpClient All contracts open or protected Updated dependencies Updated Gradle
1 parent 3de7b24 commit bb87f90

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+536
-237
lines changed

README.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ Library supports EtherScan *API* for all available *Ethereum Networks* for *ethe
1515

1616
**Gradle**
1717
```groovy
18-
implementation "com.github.goodforgod:java-etherscan-api:2.1.0"
18+
implementation "com.github.goodforgod:java-etherscan-api:3.0.0"
1919
```
2020

2121
**Maven**
2222
```xml
2323
<dependency>
2424
<groupId>com.github.goodforgod</groupId>
2525
<artifactId>java-etherscan-api</artifactId>
26-
<version>2.1.0</version>
26+
<version>3.0.0</version>
2727
</dependency>
2828
```
2929

@@ -76,6 +76,14 @@ EtherScanAPI api = EtherScanAPI.builder()
7676
.build();
7777
```
7878

79+
Also you can use Java 11+ HttpClient:
80+
```java
81+
Supplier<EthHttpClient> ethHttpClientSupplier = () -> new JdkEthHttpClient();
82+
EtherScanAPI api = EtherScanAPI.builder()
83+
.withHttpClient(supplier)
84+
.build();
85+
```
86+
7987
## API Examples
8088

8189
You can read about all API methods on [Etherscan](https://docs.etherscan.io/api-endpoints/accounts)
@@ -149,7 +157,7 @@ List<Log> logs = api.logs().logs(query);
149157
**Get tx details with proxy endpoint**
150158
```java
151159
EtherScanAPI api = EtherScanAPI.builder().build();
152-
Optional<TxProxy> tx = api.proxy().tx("0x1e2910a262b1008d0616a0beb24c1a491d78771baa54a33e66065e03b1f46bc1");
160+
Optional<TxProxy> tx = api.proxy().tx("0x1e2910a263.0.08d0616a0beb24c1a491d78771baa54a33e66065e03b1f46bc1");
153161
```
154162

155163
**Get block info with proxy endpoint**

build.gradle

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ plugins {
33
id "java-library"
44
id "maven-publish"
55

6-
id "org.sonarqube" version "4.3.0.3225"
6+
id "org.sonarqube" version "6.3.1.5724"
77
id "com.diffplug.spotless" version "6.19.0"
8-
id "io.github.gradle-nexus.publish-plugin" version "1.3.0"
8+
id "io.github.gradle-nexus.publish-plugin" version "2.0.0"
99
}
1010

1111
repositories {
@@ -17,16 +17,16 @@ group = groupId
1717
var ver = System.getenv().getOrDefault("RELEASE_VERSION", artifactVersion)
1818
version = ver.startsWith("v") ? ver.substring(1) : ver
1919

20-
sourceCompatibility = JavaVersion.VERSION_1_8
21-
targetCompatibility = JavaVersion.VERSION_1_8
20+
sourceCompatibility = JavaVersion.VERSION_11
21+
targetCompatibility = JavaVersion.VERSION_11
2222

2323
dependencies {
24-
compileOnly "org.jetbrains:annotations:23.0.0"
24+
compileOnly "org.jetbrains:annotations:24.0.1"
2525
implementation "io.goodforgod:gson-configuration:2.0.0"
2626

27-
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.9.3"
28-
testImplementation "org.junit.jupiter:junit-jupiter-api:5.9.3"
29-
testImplementation "org.junit.jupiter:junit-jupiter-params:5.9.3"
27+
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.11.4"
28+
testImplementation "org.junit.jupiter:junit-jupiter-api:5.11.4"
29+
testImplementation "org.junit.jupiter:junit-jupiter-params:5.11.4"
3030
}
3131

3232
test {

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
groupId=com.github.goodforgod
22
artifactId=java-etherscan-api
3-
artifactVersion=2.1.0-SNAPSHOT
3+
artifactVersion=3.0.0-SNAPSHOT
44

55

66
##### GRADLE #####

gradle/wrapper/gradle-wrapper.jar

-17.4 KB
Binary file not shown.
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
44
networkTimeout=10000
5+
validateDistributionUrl=true
56
zipStoreBase=GRADLE_USER_HOME
67
zipStorePath=wrapper/dists

gradlew

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
# See the License for the specific language governing permissions and
1616
# limitations under the License.
1717
#
18+
# SPDX-License-Identifier: Apache-2.0
19+
#
1820

1921
##############################################################################
2022
#
@@ -55,7 +57,7 @@
5557
# Darwin, MinGW, and NonStop.
5658
#
5759
# (3) This script is generated from the Groovy template
58-
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
60+
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
5961
# within the Gradle project.
6062
#
6163
# You can find Gradle at https://github.com/gradle/gradle/.
@@ -83,10 +85,8 @@ done
8385
# This is normally unused
8486
# shellcheck disable=SC2034
8587
APP_BASE_NAME=${0##*/}
86-
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
87-
88-
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
89-
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
88+
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
89+
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
9090

9191
# Use the maximum available, or set MAX_FD != -1 to use that value.
9292
MAX_FD=maximum
@@ -114,7 +114,7 @@ case "$( uname )" in #(
114114
NONSTOP* ) nonstop=true ;;
115115
esac
116116

117-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
117+
CLASSPATH="\\\"\\\""
118118

119119

120120
# Determine the Java command to use to start the JVM.
@@ -133,26 +133,29 @@ location of your Java installation."
133133
fi
134134
else
135135
JAVACMD=java
136-
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
136+
if ! command -v java >/dev/null 2>&1
137+
then
138+
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
137139
138140
Please set the JAVA_HOME variable in your environment to match the
139141
location of your Java installation."
142+
fi
140143
fi
141144

142145
# Increase the maximum file descriptors if we can.
143146
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
144147
case $MAX_FD in #(
145148
max*)
146149
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
147-
# shellcheck disable=SC3045
150+
# shellcheck disable=SC2039,SC3045
148151
MAX_FD=$( ulimit -H -n ) ||
149152
warn "Could not query maximum file descriptor limit"
150153
esac
151154
case $MAX_FD in #(
152155
'' | soft) :;; #(
153156
*)
154157
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
155-
# shellcheck disable=SC3045
158+
# shellcheck disable=SC2039,SC3045
156159
ulimit -n "$MAX_FD" ||
157160
warn "Could not set maximum file descriptor limit to $MAX_FD"
158161
esac
@@ -197,16 +200,20 @@ if "$cygwin" || "$msys" ; then
197200
done
198201
fi
199202

200-
# Collect all arguments for the java command;
201-
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
202-
# shell script including quotes and variable substitutions, so put them in
203-
# double quotes to make sure that they get re-expanded; and
204-
# * put everything else in single quotes, so that it's not re-expanded.
203+
204+
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
205+
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
206+
207+
# Collect all arguments for the java command:
208+
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
209+
# and any embedded shellness will be escaped.
210+
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
211+
# treated as '${Hostname}' itself on the command line.
205212

206213
set -- \
207214
"-Dorg.gradle.appname=$APP_BASE_NAME" \
208215
-classpath "$CLASSPATH" \
209-
org.gradle.wrapper.GradleWrapperMain \
216+
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
210217
"$@"
211218

212219
# Stop when "xargs" is not available.

gradlew.bat

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
@rem See the License for the specific language governing permissions and
1414
@rem limitations under the License.
1515
@rem
16+
@rem SPDX-License-Identifier: Apache-2.0
17+
@rem
1618

1719
@if "%DEBUG%"=="" @echo off
1820
@rem ##########################################################################
@@ -43,11 +45,11 @@ set JAVA_EXE=java.exe
4345
%JAVA_EXE% -version >NUL 2>&1
4446
if %ERRORLEVEL% equ 0 goto execute
4547

46-
echo.
47-
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
48-
echo.
49-
echo Please set the JAVA_HOME variable in your environment to match the
50-
echo location of your Java installation.
48+
echo. 1>&2
49+
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
50+
echo. 1>&2
51+
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
52+
echo location of your Java installation. 1>&2
5153

5254
goto fail
5355

@@ -57,22 +59,22 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
5759

5860
if exist "%JAVA_EXE%" goto execute
5961

60-
echo.
61-
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
62-
echo.
63-
echo Please set the JAVA_HOME variable in your environment to match the
64-
echo location of your Java installation.
62+
echo. 1>&2
63+
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
64+
echo. 1>&2
65+
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
66+
echo location of your Java installation. 1>&2
6567

6668
goto fail
6769

6870
:execute
6971
@rem Setup the command line
7072

71-
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73+
set CLASSPATH=
7274

7375

7476
@rem Execute Gradle
75-
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
77+
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
7678

7779
:end
7880
@rem End local scope for the variables with windows NT shell

src/main/java/io/goodforgod/api/etherscan/AccountAPIProvider.java

Lines changed: 11 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
* @author GoodforGod
2222
* @since 28.10.2018
2323
*/
24-
final class AccountAPIProvider extends BasicProvider implements AccountAPI {
24+
public class AccountAPIProvider extends BasicProvider implements AccountAPI {
2525

26-
private static final int OFFSET_MAX = 10000;
26+
private static final int OFFSET_MAX = 9999;
2727

2828
private static final String ACT_BALANCE_ACTION = ACT_PREFIX + "balance";
2929
private static final String ACT_TOKEN_BALANCE_PARAM = ACT_PREFIX + "tokenbalance";
@@ -47,11 +47,11 @@ final class AccountAPIProvider extends BasicProvider implements AccountAPI {
4747
private static final String OFFSET_PARAM = "&offset=";
4848
private static final String PAGE_PARAM = "&page=";
4949

50-
AccountAPIProvider(RequestQueueManager requestQueueManager,
51-
String baseUrl,
52-
EthHttpClient executor,
53-
Converter converter,
54-
int retryCount) {
50+
public AccountAPIProvider(RequestQueueManager requestQueueManager,
51+
String baseUrl,
52+
EthHttpClient executor,
53+
Converter converter,
54+
int retryCount) {
5555
super(requestQueueManager, "account", baseUrl, executor, converter, retryCount);
5656
}
5757

@@ -61,7 +61,7 @@ public Balance balance(@NotNull String address) throws EtherScanException {
6161
BasicUtils.validateAddress(address);
6262

6363
final String urlParams = ACT_BALANCE_ACTION + TAG_LATEST_PARAM + ADDRESS_PARAM + address;
64-
final StringResponseTO response = getRequest(urlParams, StringResponseTO.class);
64+
final StringResponseTO response = getResponse(urlParams, StringResponseTO.class);
6565
if (response.getStatus() != 1)
6666
throw new EtherScanResponseException(response);
6767

@@ -75,7 +75,7 @@ public TokenBalance balance(@NotNull String address, @NotNull String contract) t
7575
BasicUtils.validateAddress(contract);
7676

7777
final String urlParams = ACT_TOKEN_BALANCE_PARAM + ADDRESS_PARAM + address + CONTRACT_PARAM + contract;
78-
final StringResponseTO response = getRequest(urlParams, StringResponseTO.class);
78+
final StringResponseTO response = getResponse(urlParams, StringResponseTO.class);
7979
if (response.getStatus() != 1)
8080
throw new EtherScanResponseException(response);
8181

@@ -98,7 +98,7 @@ public List<Balance> balances(@NotNull List<String> addresses) throws EtherScanE
9898
for (final List<String> batch : addressesAsBatches) {
9999
final String urlParams = ACT_BALANCE_MULTI_ACTION + TAG_LATEST_PARAM + ADDRESS_PARAM
100100
+ BasicUtils.toAddressParam(batch);
101-
final BalanceResponseTO response = getRequest(urlParams, BalanceResponseTO.class);
101+
final BalanceResponseTO response = getResponse(urlParams, BalanceResponseTO.class);
102102
if (response.getStatus() != 1) {
103103
throw new EtherScanResponseException(response);
104104
}
@@ -139,34 +139,6 @@ public List<Tx> txs(@NotNull String address, long startBlock, long endBlock) thr
139139
return getRequestUsingOffset(urlParams, TxResponseTO.class);
140140
}
141141

142-
/**
143-
* Generic search for txs using offset api param To avoid 10k limit per response
144-
*
145-
* @param urlParams Url params for #getRequest()
146-
* @param tClass responseListTO class
147-
* @param <T> responseTO list T type
148-
* @param <R> responseListTO type
149-
* @return List of T values
150-
*/
151-
private <T, R extends BaseListResponseTO<T>> List<T> getRequestUsingOffset(final String urlParams, Class<R> tClass)
152-
throws EtherScanException {
153-
final List<T> result = new ArrayList<>();
154-
int page = 1;
155-
while (true) {
156-
final String formattedUrl = String.format(urlParams, page++);
157-
final R response = getRequest(formattedUrl, tClass);
158-
BasicUtils.validateTxResponse(response);
159-
if (BasicUtils.isEmpty(response.getResult()))
160-
break;
161-
162-
result.addAll(response.getResult());
163-
if (response.getResult().size() < OFFSET_MAX)
164-
break;
165-
}
166-
167-
return result;
168-
}
169-
170142
@NotNull
171143
@Override
172144
public List<TxInternal> txsInternal(@NotNull String address) throws EtherScanException {
@@ -200,7 +172,7 @@ public List<TxInternal> txsInternalByHash(@NotNull String txhash) throws EtherSc
200172
BasicUtils.validateTxHash(txhash);
201173

202174
final String urlParams = ACT_TX_INTERNAL_ACTION + TXHASH_PARAM + txhash;
203-
final TxInternalResponseTO response = getRequest(urlParams, TxInternalResponseTO.class);
175+
final TxInternalResponseTO response = getResponse(urlParams, TxInternalResponseTO.class);
204176
BasicUtils.validateTxResponse(response);
205177

206178
return BasicUtils.isEmpty(response.getResult())

0 commit comments

Comments
 (0)