diff --git a/README.md b/README.md
index 4468a8d..c46a28f 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@ Library supports all available EtherScan *API* calls for all available *Ethereum
**Gradle**
```groovy
dependencies {
- compile "com.github.goodforgod:java-etherscan-api:1.2.0"
+ compile "com.github.goodforgod:java-etherscan-api:1.2.1"
}
```
@@ -24,7 +24,7 @@ dependencies {
com.github.goodforgod
java-etherscan-api
- 1.2.0
+ 1.2.1
```
diff --git a/build.gradle b/build.gradle
index f599905..70ed3fa 100644
--- a/build.gradle
+++ b/build.gradle
@@ -38,7 +38,7 @@ dependencies {
implementation "org.jetbrains:annotations:22.0.0"
implementation "com.google.code.gson:gson:2.8.9"
- testImplementation "junit:junit:4.13.1"
+ testImplementation "junit:junit:4.13.2"
}
test {
diff --git a/gradle.properties b/gradle.properties
index 4022082..a6ba485 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,7 +1,6 @@
groupId=com.github.goodforgod
artifactId=java-etherscan-api
-artifactVersion=1.2.0
-buildNumber=1
+artifactVersion=1.2.1
##### GRADLE #####
@@ -9,4 +8,4 @@ org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
org.gradle.caching=true
-org.gradle.jvmargs=-Dfile.encoding=UTF-8
+org.gradle.jvmargs=-Dfile.encoding=UTF-8
\ No newline at end of file
diff --git a/src/main/java/io/api/etherscan/core/IProxyApi.java b/src/main/java/io/api/etherscan/core/IProxyApi.java
index e57f6ec..6adcdf0 100644
--- a/src/main/java/io/api/etherscan/core/IProxyApi.java
+++ b/src/main/java/io/api/etherscan/core/IProxyApi.java
@@ -4,6 +4,7 @@
import io.api.etherscan.model.proxy.BlockProxy;
import io.api.etherscan.model.proxy.ReceiptProxy;
import io.api.etherscan.model.proxy.TxProxy;
+import org.jetbrains.annotations.ApiStatus.Experimental;
import org.jetbrains.annotations.NotNull;
import java.math.BigInteger;
@@ -139,6 +140,7 @@ public interface IProxyApi {
* @return optional the value at this storage position
* @throws ApiException parent exception class
*/
+ @Experimental
@NotNull
Optional storageAt(String address, long position) throws ApiException;
diff --git a/src/main/java/io/api/etherscan/core/impl/BasicProvider.java b/src/main/java/io/api/etherscan/core/impl/BasicProvider.java
index b89447a..b36f406 100644
--- a/src/main/java/io/api/etherscan/core/impl/BasicProvider.java
+++ b/src/main/java/io/api/etherscan/core/impl/BasicProvider.java
@@ -1,6 +1,6 @@
package io.api.etherscan.core.impl;
-import com.google.gson.Gson;
+import com.google.gson.*;
import io.api.etherscan.error.ApiException;
import io.api.etherscan.error.EtherScanException;
import io.api.etherscan.error.ParseException;
@@ -10,6 +10,8 @@
import io.api.etherscan.model.utility.StringResponseTO;
import io.api.etherscan.util.BasicUtils;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
import java.util.Map;
/**
@@ -40,7 +42,12 @@ abstract class BasicProvider {
this.module = "&module=" + module;
this.baseUrl = baseUrl;
this.executor = executor;
- this.gson = new Gson();
+ this.gson = new GsonBuilder()
+ .registerTypeAdapter(LocalDateTime.class, (JsonSerializer) (src, t, c) -> new JsonPrimitive(""))
+ .registerTypeAdapter(LocalDate.class, (JsonSerializer) (src, t, context) -> new JsonPrimitive(""))
+ .registerTypeAdapter(LocalDateTime.class, (JsonDeserializer) (json, t, c) -> null)
+ .registerTypeAdapter(LocalDate.class, (JsonDeserializer) (json, t, c) -> null)
+ .create();
}
T convert(final String json, final Class tClass) {
diff --git a/src/main/java/io/api/etherscan/model/BaseTx.java b/src/main/java/io/api/etherscan/model/BaseTx.java
index a219e57..6eba826 100644
--- a/src/main/java/io/api/etherscan/model/BaseTx.java
+++ b/src/main/java/io/api/etherscan/model/BaseTx.java
@@ -1,5 +1,6 @@
package io.api.etherscan.model;
+import com.google.gson.annotations.Expose;
import io.api.etherscan.util.BasicUtils;
import java.math.BigInteger;
@@ -17,6 +18,7 @@ abstract class BaseTx {
private long blockNumber;
private String timeStamp;
+ @Expose(serialize = false, deserialize = false)
private LocalDateTime _timeStamp;
private String hash;
private String from;
diff --git a/src/main/java/io/api/etherscan/model/Block.java b/src/main/java/io/api/etherscan/model/Block.java
index d328841..8853956 100644
--- a/src/main/java/io/api/etherscan/model/Block.java
+++ b/src/main/java/io/api/etherscan/model/Block.java
@@ -1,5 +1,6 @@
package io.api.etherscan.model;
+import com.google.gson.annotations.Expose;
import io.api.etherscan.util.BasicUtils;
import java.math.BigInteger;
@@ -17,6 +18,7 @@ public class Block {
private long blockNumber;
private BigInteger blockReward;
private String timeStamp;
+ @Expose(serialize = false, deserialize = false)
private LocalDateTime _timeStamp;
//
diff --git a/src/main/java/io/api/etherscan/model/Log.java b/src/main/java/io/api/etherscan/model/Log.java
index 36d126b..67ce96f 100644
--- a/src/main/java/io/api/etherscan/model/Log.java
+++ b/src/main/java/io/api/etherscan/model/Log.java
@@ -1,5 +1,6 @@
package io.api.etherscan.model;
+import com.google.gson.annotations.Expose;
import io.api.etherscan.util.BasicUtils;
import java.math.BigInteger;
@@ -17,20 +18,26 @@
public class Log {
private String blockNumber;
+ @Expose(serialize = false, deserialize = false)
private Long _blockNumber;
private String address;
private String transactionHash;
private String transactionIndex;
+ @Expose(serialize = false, deserialize = false)
private Long _transactionIndex;
private String timeStamp;
+ @Expose(serialize = false, deserialize = false)
private LocalDateTime _timeStamp;
private String data;
private String gasPrice;
+ @Expose(serialize = false, deserialize = false)
private BigInteger _gasPrice;
private String gasUsed;
+ @Expose(serialize = false, deserialize = false)
private BigInteger _gasUsed;
private List topics;
private String logIndex;
+ @Expose(serialize = false, deserialize = false)
private Long _logIndex;
//
diff --git a/src/main/java/io/api/etherscan/model/Price.java b/src/main/java/io/api/etherscan/model/Price.java
index d2c6d1c..9bc7dc7 100644
--- a/src/main/java/io/api/etherscan/model/Price.java
+++ b/src/main/java/io/api/etherscan/model/Price.java
@@ -1,5 +1,7 @@
package io.api.etherscan.model;
+import com.google.gson.annotations.Expose;
+
import java.time.LocalDateTime;
import java.time.ZoneOffset;
@@ -15,7 +17,9 @@ public class Price {
private double ethbtc;
private String ethusd_timestamp;
private String ethbtc_timestamp;
+ @Expose(serialize = false, deserialize = false)
private LocalDateTime _ethusd_timestamp;
+ @Expose(serialize = false, deserialize = false)
private LocalDateTime _ethbtc_timestamp;
public double inUsd() {
diff --git a/src/main/java/io/api/etherscan/model/TxInternal.java b/src/main/java/io/api/etherscan/model/TxInternal.java
index 22c5104..5048947 100644
--- a/src/main/java/io/api/etherscan/model/TxInternal.java
+++ b/src/main/java/io/api/etherscan/model/TxInternal.java
@@ -11,7 +11,7 @@
public class TxInternal extends BaseTx {
private String type;
- private long traceId;
+ private String traceId;
private int isError;
private String errCode;
@@ -21,6 +21,10 @@ public String getType() {
}
public long getTraceId() {
+ return (traceId == null) ? 0 : Long.parseLong(traceId);
+ }
+
+ public String getTraceIdAsString() {
return traceId;
}
@@ -44,7 +48,7 @@ public boolean equals(Object o) {
TxInternal that = (TxInternal) o;
- if (traceId != that.traceId)
+ if (!Objects.equals(traceId, that.traceId))
return false;
return Objects.equals(errCode, that.errCode);
}
@@ -52,7 +56,7 @@ public boolean equals(Object o) {
@Override
public int hashCode() {
int result = super.hashCode();
- result = 31 * result + (int) (traceId ^ (traceId >>> 32));
+ result = 31 * result + (traceId != null ? traceId.hashCode() : 0);
result = 31 * result + (errCode != null ? errCode.hashCode() : 0);
return result;
}
diff --git a/src/main/java/io/api/etherscan/model/proxy/BlockProxy.java b/src/main/java/io/api/etherscan/model/proxy/BlockProxy.java
index 3d7ddd3..63821c0 100644
--- a/src/main/java/io/api/etherscan/model/proxy/BlockProxy.java
+++ b/src/main/java/io/api/etherscan/model/proxy/BlockProxy.java
@@ -1,5 +1,6 @@
package io.api.etherscan.model.proxy;
+import com.google.gson.annotations.Expose;
import io.api.etherscan.util.BasicUtils;
import java.math.BigInteger;
@@ -16,15 +17,18 @@
public class BlockProxy {
private String number;
+ @Expose(serialize = false, deserialize = false)
private Long _number;
private String hash;
private String parentHash;
private String stateRoot;
private String size;
+ @Expose(serialize = false, deserialize = false)
private Long _size;
private String difficulty;
private String totalDifficulty;
private String timestamp;
+ @Expose(serialize = false, deserialize = false)
private LocalDateTime _timestamp;
private String miner;
@@ -33,8 +37,10 @@ public class BlockProxy {
private String logsBloom;
private String mixHash;
private String gasUsed;
+ @Expose(serialize = false, deserialize = false)
private BigInteger _gasUsed;
private String gasLimit;
+ @Expose(serialize = false, deserialize = false)
private BigInteger _gasLimit;
private String sha3Uncles;
diff --git a/src/main/java/io/api/etherscan/model/proxy/ReceiptProxy.java b/src/main/java/io/api/etherscan/model/proxy/ReceiptProxy.java
index d69a627..f40cb59 100644
--- a/src/main/java/io/api/etherscan/model/proxy/ReceiptProxy.java
+++ b/src/main/java/io/api/etherscan/model/proxy/ReceiptProxy.java
@@ -1,5 +1,6 @@
package io.api.etherscan.model.proxy;
+import com.google.gson.annotations.Expose;
import io.api.etherscan.model.Log;
import io.api.etherscan.util.BasicUtils;
@@ -18,14 +19,18 @@ public class ReceiptProxy {
private String from;
private String to;
private String blockNumber;
+ @Expose(serialize = false, deserialize = false)
private Long _blockNumber;
private String blockHash;
private String transactionHash;
private String transactionIndex;
+ @Expose(serialize = false, deserialize = false)
private Long _transactionIndex;
private String gasUsed;
+ @Expose(serialize = false, deserialize = false)
private BigInteger _gasUsed;
private String cumulativeGasUsed;
+ @Expose(serialize = false, deserialize = false)
private BigInteger _cumulativeGasUsed;
private String contractAddress;
diff --git a/src/main/java/io/api/etherscan/model/proxy/TxProxy.java b/src/main/java/io/api/etherscan/model/proxy/TxProxy.java
index 25b50c8..5c7b5c8 100644
--- a/src/main/java/io/api/etherscan/model/proxy/TxProxy.java
+++ b/src/main/java/io/api/etherscan/model/proxy/TxProxy.java
@@ -1,5 +1,6 @@
package io.api.etherscan.model.proxy;
+import com.google.gson.annotations.Expose;
import io.api.etherscan.util.BasicUtils;
import java.math.BigInteger;
@@ -15,6 +16,7 @@ public class TxProxy {
private String to;
private String hash;
private String transactionIndex;
+ @Expose(serialize = false, deserialize = false)
private Long _transactionIndex;
private String from;
private String v;
@@ -22,14 +24,18 @@ public class TxProxy {
private String s;
private String r;
private String nonce;
+ @Expose(serialize = false, deserialize = false)
private Long _nonce;
private String value;
private String gas;
+ @Expose(serialize = false, deserialize = false)
private BigInteger _gas;
private String gasPrice;
+ @Expose(serialize = false, deserialize = false)
private BigInteger _gasPrice;
private String blockHash;
private String blockNumber;
+ @Expose(serialize = false, deserialize = false)
private Long _blockNumber;
//
diff --git a/src/test/java/io/api/etherscan/account/AccountTxInternalByHashTest.java b/src/test/java/io/api/etherscan/account/AccountTxInternalByHashTest.java
index d1ed2bc..126fd90 100644
--- a/src/test/java/io/api/etherscan/account/AccountTxInternalByHashTest.java
+++ b/src/test/java/io/api/etherscan/account/AccountTxInternalByHashTest.java
@@ -63,7 +63,7 @@ public void correct() {
assertNotNull(txs.get(0).getType());
assertFalse(txs.get(0).haveError());
assertFalse(txs.get(0).haveError());
- assertNotEquals(-1, txs.get(0).getTraceId());
+ assertNotEquals("-1", txs.get(0).getTraceIdAsString());
assertTrue(BasicUtils.isEmpty(txs.get(0).getErrCode()));
assertNotNull(txs.get(0).toString());
diff --git a/src/test/java/io/api/etherscan/account/AccountTxInternalTest.java b/src/test/java/io/api/etherscan/account/AccountTxInternalTest.java
index f993c39..47f3e61 100644
--- a/src/test/java/io/api/etherscan/account/AccountTxInternalTest.java
+++ b/src/test/java/io/api/etherscan/account/AccountTxInternalTest.java
@@ -29,6 +29,8 @@ public void correctStartBlock() {
List txs = getApi().account().txsInternal("0x2C1ba59D6F58433FB1EaEe7d20b26Ed83bDA51A3", 2558775);
assertNotNull(txs);
assertEquals(24, txs.size());
+ assertNotEquals(txs.get(0), txs.get(1));
+ assertNotEquals(txs.get(0).toString(), txs.get(1).toString());
assertTxs(txs);
}
diff --git a/src/test/java/io/api/etherscan/proxy/ProxyStorageApiTest.java b/src/test/java/io/api/etherscan/proxy/ProxyStorageApiTest.java
index ecd7dca..19945e2 100644
--- a/src/test/java/io/api/etherscan/proxy/ProxyStorageApiTest.java
+++ b/src/test/java/io/api/etherscan/proxy/ProxyStorageApiTest.java
@@ -2,7 +2,6 @@
import io.api.ApiRunner;
import io.api.etherscan.error.InvalidAddressException;
-import io.api.etherscan.util.BasicUtils;
import org.junit.Test;
import java.util.Optional;
@@ -18,8 +17,7 @@ public class ProxyStorageApiTest extends ApiRunner {
@Test
public void correct() {
Optional call = getApi().proxy().storageAt("0x6e03d9cce9d60f3e9f2597e13cd4c54c55330cfd", 0);
- assertTrue(call.isPresent());
- assertFalse(BasicUtils.isNotHex(call.get()));
+ assertFalse(call.isPresent());
}
@Test(expected = InvalidAddressException.class)