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

Skip to content

Commit 73fd165

Browse files
committed
Base response model redesign & improvements
Account provider improvements & refactoring
1 parent 01a05a9 commit 73fd165

13 files changed

+106
-94
lines changed

‎pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
<dependency>
4646
<groupId>com.jsoniter</groupId>
4747
<artifactId>jsoniter</artifactId>
48-
<version>0.9.19</version>
48+
<version>0.9.23</version>
4949
</dependency>
5050
</dependencies>
5151

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

-4
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,17 @@ public interface IAccountProvider {
2626

2727
/** All txs */
2828
@NotNull List<Tx> txs(String address) throws ApiException;
29-
/** Only last 10000 txs */
3029
@NotNull List<Tx> txs(String address, long startBlock);
3130
@NotNull List<Tx> txs(String address, long startBlock, long endBlock);
3231

3332
/** All internal txs */
3433
@NotNull List<TxInternal> txsInternal(String address);
35-
/** Only last 10000 internal txs */
3634
@NotNull List<TxInternal> txsInternal(String address, long startBlock);
3735
@NotNull List<TxInternal> txsInternal(String address, long startBlock, long endBlock);
38-
/** Only last 10000 internal txs by txhash */
3936
@NotNull List<TxInternal> txsInternalByHash(String txhash);
4037

4138
/** All token txs */
4239
@NotNull List<TxToken> txsToken(String address);
43-
/** Only last 10000 token txs */
4440
@NotNull List<TxToken> txsToken(String address, long startBlock);
4541
@NotNull List<TxToken> txsToken(String address, long startBlock, long endBlock);
4642

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

+56-45
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ public class AccountProvider extends BasicProvider implements IAccountProvider {
2525
private static final int MAX_END_BLOCK = 999999999;
2626
private static final int MIN_START_BLOCK = 0;
2727

28+
private static final int OFFSET_MAX = 10000;
29+
2830
private static final String BALANCE_ACTION = ACTION_PARAM + "balance";
2931
private static final String BALANCE_MULTI_ACTION = ACTION_PARAM + "balancemulti";
3032
private static final String TX_ACTION = ACTION_PARAM + "txlist";
@@ -55,11 +57,11 @@ public Balance balance(final String address) {
5557
BasicUtils.validateAddress(address);
5658

5759
final String urlParams = BALANCE_ACTION + TAG_LATEST_PARAM + ADDRESS_PARAM + address;
58-
final StringResponseTO converted = getRequest(urlParams, StringResponseTO.class);
59-
if (converted.getStatus() != 1)
60-
throw new EtherScanException(converted.getMessage() + ", with status " + converted.getStatus());
60+
final StringResponseTO response = getRequest(urlParams, StringResponseTO.class);
61+
if (response.getStatus() != 1)
62+
throw new EtherScanException(response.getMessage() + ", with status " + response.getStatus());
6163

62-
return new Balance(address, Long.valueOf(converted.getResult()));
64+
return new Balance(address, Long.valueOf(response.getResult()));
6365
}
6466

6567
@NotNull
@@ -76,12 +78,12 @@ public List<Balance> balances(final List<String> addresses) {
7678

7779
for (final List<String> batch : addressesAsBatches) {
7880
final String urlParams = BALANCE_MULTI_ACTION + TAG_LATEST_PARAM + ADDRESS_PARAM + toAddressParam(batch);
79-
final BalanceResponseTO converted = getRequest(urlParams, BalanceResponseTO.class);
80-
if (converted.getStatus() != 1)
81-
throw new EtherScanException(converted.getMessage() + ", with status " + converted.getStatus());
81+
final BalanceResponseTO response = getRequest(urlParams, BalanceResponseTO.class);
82+
if (response.getStatus() != 1)
83+
throw new EtherScanException(response.getMessage() + ", with status " + response.getStatus());
8284

83-
if (!BasicUtils.isEmpty(converted.getBalances()))
84-
balances.addAll(converted.getBalances().stream()
85+
if (!BasicUtils.isEmpty(response.getResult()))
86+
balances.addAll(response.getResult().stream()
8587
.map(Balance::of)
8688
.collect(Collectors.toList()));
8789
}
@@ -96,7 +98,6 @@ private String toAddressParam(final List<String> addresses) {
9698
@NotNull
9799
@Override
98100
public List<Tx> txs(final String address) {
99-
//TODO all txs implementations with pagination
100101
return txs(address, MIN_START_BLOCK);
101102
}
102103

@@ -111,21 +112,44 @@ public List<Tx> txs(final String address, final long startBlock) {
111112
public List<Tx> txs(final String address, final long startBlock, final long endBlock) {
112113
BasicUtils.validateAddress(address);
113114

115+
final String offsetParam = PAGE_PARAM + "%s" + OFFSET_PARAM + OFFSET_MAX;
114116
final String blockParam = START_BLOCK_PARAM + startBlock + END_BLOCK_PARAM + endBlock;
115-
final String urlParams = TX_ACTION + ADDRESS_PARAM + address + blockParam + SORT_ASC_PARAM;
116-
final TxResponseTO converted = getRequest(urlParams, TxResponseTO.class);
117-
if (converted.getStatus() != 1)
118-
throw new EtherScanException(converted.getMessage() + " with status " + converted.getStatus());
117+
final String urlParams = TX_ACTION + offsetParam + ADDRESS_PARAM + address + blockParam + SORT_ASC_PARAM;
119118

120-
return (converted.getResult() == null)
121-
? Collections.emptyList()
122-
: converted.getResult();
119+
return getRequestUsingOffset(urlParams, TxResponseTO.class);
120+
}
121+
122+
/**
123+
* Generic search for txs using offset api param
124+
* To avoid 10k limit per response
125+
*
126+
* @param urlParams Url params for #getRequest()
127+
* @param tClass responseListTO class
128+
* @param <T> responseTO list T type
129+
* @param <R> responseListTO type
130+
* @return List of T values
131+
*/
132+
private <T, R extends BaseListResponseTO> List<T> getRequestUsingOffset(final String urlParams, Class<R> tClass) {
133+
final List<T> result = new ArrayList<>();
134+
int page = 1;
135+
while (true) {
136+
final String formattedUrl = String.format(urlParams, page++);
137+
final R response = getRequest(formattedUrl, tClass);
138+
BasicUtils.validateTxResponse(response);
139+
if(BasicUtils.isEmpty(response.getResult()))
140+
break;
141+
142+
result.addAll(response.getResult());
143+
if(response.getResult().size() < OFFSET_MAX)
144+
break;
145+
}
146+
147+
return result;
123148
}
124149

125150
@NotNull
126151
@Override
127152
public List<TxInternal> txsInternal(final String address) {
128-
//TODO all txs implementations with pagination
129153
return txsInternal(address, MIN_START_BLOCK);
130154
}
131155

@@ -140,36 +164,31 @@ public List<TxInternal> txsInternal(final String address, final long startBlock)
140164
public List<TxInternal> txsInternal(final String address, final long startBlock, final long endBlock) {
141165
BasicUtils.validateAddress(address);
142166

167+
final String offsetParam = PAGE_PARAM + "%s" + OFFSET_PARAM + OFFSET_MAX;
143168
final String blockParam = START_BLOCK_PARAM + startBlock + END_BLOCK_PARAM + endBlock;
144-
final String urlParams = TX_INTERNAL_ACTION + ADDRESS_PARAM + address + blockParam + SORT_ASC_PARAM;
145-
final TxInternalResponseTO converted = getRequest(urlParams, TxInternalResponseTO.class);
146-
if (converted.getStatus() != 1)
147-
throw new EtherScanException(converted.getMessage() + " with status " + converted.getStatus());
169+
final String urlParams = TX_INTERNAL_ACTION + offsetParam + ADDRESS_PARAM + address + blockParam + SORT_ASC_PARAM;
148170

149-
return (converted.getResult() == null)
150-
? Collections.emptyList()
151-
: converted.getResult();
171+
return getRequestUsingOffset(urlParams, TxInternalResponseTO.class);
152172
}
153173

174+
154175
@NotNull
155176
@Override
156177
public List<TxInternal> txsInternalByHash(final String txhash) {
157178
BasicUtils.validateTxHash(txhash);
158179

159180
final String urlParams = TX_INTERNAL_ACTION + TXHASH_PARAM + txhash;
160-
final TxInternalResponseTO converted = getRequest(urlParams, TxInternalResponseTO.class);
161-
if (converted.getStatus() != 1)
162-
throw new EtherScanException(converted.getMessage() + " with status " + converted.getStatus());
181+
final TxInternalResponseTO response = getRequest(urlParams, TxInternalResponseTO.class);
182+
BasicUtils.validateTxResponse(response);
163183

164-
return (converted.getResult() == null)
184+
return BasicUtils.isEmpty(response.getResult())
165185
? Collections.emptyList()
166-
: converted.getResult();
186+
: response.getResult();
167187
}
168188

169189
@NotNull
170190
@Override
171191
public List<TxToken> txsToken(final String address) {
172-
//TODO all txs implementations with pagination
173192
return txsToken(address, MIN_START_BLOCK);
174193
}
175194

@@ -184,29 +203,21 @@ public List<TxToken> txsToken(final String address, final long startBlock) {
184203
public List<TxToken> txsToken(final String address, final long startBlock, final long endBlock) {
185204
BasicUtils.validateAddress(address);
186205

206+
final String offsetParam = PAGE_PARAM + "%s" + OFFSET_PARAM + OFFSET_MAX;
187207
final String blockParam = START_BLOCK_PARAM + startBlock + END_BLOCK_PARAM + endBlock;
188-
final String urlParams = TX_TOKEN_ACTION + ADDRESS_PARAM + address + blockParam + SORT_ASC_PARAM;
189-
final TxTokenResponseTO converted = getRequest(urlParams, TxTokenResponseTO.class);
190-
if (converted.getStatus() != 1)
191-
throw new EtherScanException(converted.getMessage() + " with status " + converted.getStatus());
208+
final String urlParams = TX_TOKEN_ACTION + offsetParam + ADDRESS_PARAM + address + blockParam + SORT_ASC_PARAM;
192209

193-
return (converted.getResult() == null)
194-
? Collections.emptyList()
195-
: converted.getResult();
210+
return getRequestUsingOffset(urlParams, TxTokenResponseTO.class);
196211
}
197212

198213
@NotNull
199214
@Override
200215
public List<Block> minedBlocks(final String address) {
201216
BasicUtils.validateAddress(address);
202217

203-
final String urlParams = MINED_ACTION + BLOCK_TYPE_PARAM + ADDRESS_PARAM + address;
204-
final BlockResponseTO converted = getRequest(urlParams, BlockResponseTO.class);
205-
if (converted.getStatus() != 1)
206-
throw new EtherScanException(converted.getMessage() + " with status " + converted.getStatus());
218+
final String offsetParam = PAGE_PARAM + "%s" + OFFSET_PARAM + OFFSET_MAX;
219+
final String urlParams = MINED_ACTION + offsetParam + BLOCK_TYPE_PARAM + ADDRESS_PARAM + address;
207220

208-
return (converted.getResult() == null)
209-
? Collections.emptyList()
210-
: converted.getResult();
221+
return getRequestUsingOffset(urlParams, BlockResponseTO.class);
211222
}
212223
}

‎src/main/java/io/api/model/BaseTx.java

+15
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,19 @@ public long getGasUsed() {
6262
return gasUsed;
6363
}
6464
//</editor-fold>
65+
66+
@Override
67+
public boolean equals(Object o) {
68+
if (this == o) return true;
69+
if (o == null || getClass() != o.getClass()) return false;
70+
71+
BaseTx baseTx = (BaseTx) o;
72+
73+
return hash != null ? hash.equals(baseTx.hash) : baseTx.hash == null;
74+
}
75+
76+
@Override
77+
public int hashCode() {
78+
return hash != null ? hash.hashCode() : 0;
79+
}
6580
}
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,11 @@
11
package io.api.model.temporary;
22

3-
import java.util.List;
4-
53
/**
64
* ! NO DESCRIPTION !
75
*
86
* @author GoodforGod
97
* @since 29.10.2018
108
*/
11-
public class BalanceResponseTO extends BaseReponseTO {
12-
13-
private List<BalanceTO> balances;
9+
public class BalanceResponseTO extends BaseListResponseTO<BalanceTO> {
1410

15-
public List<BalanceTO> getBalances() {
16-
return balances;
17-
}
1811
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.api.model.temporary;
2+
3+
import java.util.List;
4+
5+
/**
6+
* ! NO DESCRIPTION !
7+
*
8+
* @author GoodforGod
9+
* @since 30.10.2018
10+
*/
11+
public abstract class BaseListResponseTO<T> extends BaseResponseTO {
12+
13+
private List<T> result;
14+
15+
public List<T> getResult() {
16+
return result;
17+
}
18+
}

‎src/main/java/io/api/model/temporary/BaseReponseTO.java renamed to ‎src/main/java/io/api/model/temporary/BaseResponseTO.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* @author GoodforGod
99
* @since 29.10.2018
1010
*/
11-
abstract class BaseReponseTO {
11+
public abstract class BaseResponseTO {
1212

1313
private String status;
1414
private String message;

‎src/main/java/io/api/model/temporary/BlockResponseTO.java

+1-8
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,12 @@
22

33
import io.api.model.Block;
44

5-
import java.util.List;
6-
75
/**
86
* ! NO DESCRIPTION !
97
*
108
* @author GoodforGod
119
* @since 30.10.2018
1210
*/
13-
public class BlockResponseTO extends BaseReponseTO {
14-
15-
private List<Block> result;
11+
public class BlockResponseTO extends BaseListResponseTO<Block> {
1612

17-
public List<Block> getResult() {
18-
return result;
19-
}
2013
}

‎src/main/java/io/api/model/temporary/StringResponseTO.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* @author GoodforGod
77
* @since 29.10.2018
88
*/
9-
public class StringResponseTO extends BaseReponseTO {
9+
public class StringResponseTO extends BaseResponseTO {
1010

1111
private String result;
1212

‎src/main/java/io/api/model/temporary/TxInternalResponseTO.java

+1-8
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,12 @@
22

33
import io.api.model.TxInternal;
44

5-
import java.util.List;
6-
75
/**
86
* ! NO DESCRIPTION !
97
*
108
* @author GoodforGod
119
* @since 29.10.2018
1210
*/
13-
public class TxInternalResponseTO extends BaseReponseTO {
14-
15-
private List<TxInternal> result;
11+
public class TxInternalResponseTO extends BaseListResponseTO<TxInternal> {
1612

17-
public List<TxInternal> getResult() {
18-
return result;
19-
}
2013
}

‎src/main/java/io/api/model/temporary/TxResponseTO.java

+1-8
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,12 @@
22

33
import io.api.model.Tx;
44

5-
import java.util.List;
6-
75
/**
86
* ! NO DESCRIPTION !
97
*
108
* @author GoodforGod
119
* @since 29.10.2018
1210
*/
13-
public class TxResponseTO extends BaseReponseTO {
14-
15-
private List<Tx> result;
11+
public class TxResponseTO extends BaseListResponseTO<Tx> {
1612

17-
public List<Tx> getResult() {
18-
return result;
19-
}
2013
}

‎src/main/java/io/api/model/temporary/TxTokenResponseTO.java

+1-8
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,12 @@
22

33
import io.api.model.TxToken;
44

5-
import java.util.List;
6-
75
/**
86
* ! NO DESCRIPTION !
97
*
108
* @author GoodforGod
119
* @since 29.10.2018
1210
*/
13-
public class TxTokenResponseTO extends BaseReponseTO {
14-
15-
private List<TxToken> result;
11+
public class TxTokenResponseTO extends BaseListResponseTO<TxToken> {
1612

17-
public List<TxToken> getResult() {
18-
return result;
19-
}
2013
}

0 commit comments

Comments
 (0)