Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit67b695d

Browse files
committed
Removed events stuff again, moved to different library
1 parent6494764 commit67b695d

File tree

9 files changed

+930
-0
lines changed

9 files changed

+930
-0
lines changed
Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
packageio.api.etherscan.core.impl;
2+
3+
importio.api.etherscan.core.IAccountApi;
4+
importio.api.etherscan.error.ApiException;
5+
importio.api.etherscan.error.EtherScanException;
6+
importio.api.etherscan.executor.IHttpExecutor;
7+
importio.api.etherscan.manager.IQueueManager;
8+
importio.api.etherscan.model.*;
9+
importio.api.etherscan.model.utility.*;
10+
importio.api.etherscan.util.BasicUtils;
11+
importorg.jetbrains.annotations.NotNull;
12+
13+
importjava.math.BigInteger;
14+
importjava.util.ArrayList;
15+
importjava.util.Collections;
16+
importjava.util.List;
17+
importjava.util.stream.Collectors;
18+
19+
/**
20+
* Account API Implementation
21+
*
22+
* @see IAccountApi
23+
*
24+
* @author GoodforGod
25+
* @since 28.10.2018
26+
*/
27+
publicclassAccountApiProviderextendsBasicProviderimplementsIAccountApi {
28+
29+
privatestaticfinalintOFFSET_MAX =10000;
30+
31+
privatestaticfinalStringACT_BALANCE_ACTION =ACT_PREFIX +"balance";
32+
privatestaticfinalStringACT_TOKEN_BALANCE_PARAM =ACT_PREFIX +"tokenbalance";
33+
privatestaticfinalStringACT_BALANCE_MULTI_ACTION =ACT_PREFIX +"balancemulti";
34+
privatestaticfinalStringACT_TX_ACTION =ACT_PREFIX +"txlist";
35+
privatestaticfinalStringACT_TX_INTERNAL_ACTION =ACT_PREFIX +"txlistinternal";
36+
privatestaticfinalStringACT_TX_TOKEN_ACTION =ACT_PREFIX +"tokentx";
37+
privatestaticfinalStringACT_MINED_ACTION =ACT_PREFIX +"getminedblocks";
38+
39+
privatestaticfinalStringBLOCK_TYPE_PARAM ="&blocktype=blocks";
40+
privatestaticfinalStringCONTRACT_PARAM ="&contractaddress=";
41+
privatestaticfinalStringSTART_BLOCK_PARAM ="&startblock=";
42+
privatestaticfinalStringTAG_LATEST_PARAM ="&tag=latest";
43+
privatestaticfinalStringEND_BLOCK_PARAM ="&endblock=";
44+
privatestaticfinalStringSORT_DESC_PARAM ="&sort=desc";
45+
privatestaticfinalStringSORT_ASC_PARAM ="&sort=asc";
46+
privatestaticfinalStringADDRESS_PARAM ="&address=";
47+
privatestaticfinalStringTXHASH_PARAM ="&txhash=";
48+
privatestaticfinalStringOFFSET_PARAM ="&offset=";
49+
privatestaticfinalStringPAGE_PARAM ="&page=";
50+
51+
AccountApiProvider(finalIQueueManagerqueueManager,
52+
finalStringbaseUrl,
53+
finalIHttpExecutorexecutor) {
54+
super(queueManager,"account",baseUrl,executor);
55+
}
56+
57+
@NotNull
58+
@Override
59+
publicBalancebalance(finalStringaddress)throwsApiException {
60+
BasicUtils.validateAddress(address);
61+
62+
finalStringurlParams =ACT_BALANCE_ACTION +TAG_LATEST_PARAM +ADDRESS_PARAM +address;
63+
finalStringResponseTOresponse =getRequest(urlParams,StringResponseTO.class);
64+
if (response.getStatus() !=1)
65+
thrownewEtherScanException(response.getMessage() +", with status " +response.getStatus());
66+
67+
returnnewBalance(address,newBigInteger(response.getResult()));
68+
}
69+
70+
@NotNull
71+
@Override
72+
publicTokenBalancebalance(finalStringaddress,finalStringcontract)throwsApiException {
73+
BasicUtils.validateAddress(address);
74+
BasicUtils.validateAddress(contract);
75+
76+
finalStringurlParams =ACT_TOKEN_BALANCE_PARAM +ADDRESS_PARAM +address +CONTRACT_PARAM +contract;
77+
finalStringResponseTOresponse =getRequest(urlParams,StringResponseTO.class);
78+
if (response.getStatus() !=1)
79+
thrownewEtherScanException(response.getMessage() +", with status " +response.getStatus());
80+
81+
returnnewTokenBalance(address,newBigInteger(response.getResult()),contract);
82+
}
83+
84+
@NotNull
85+
@Override
86+
publicList<Balance>balances(finalList<String>addresses)throwsApiException {
87+
if (BasicUtils.isEmpty(addresses))
88+
returnCollections.emptyList();
89+
90+
BasicUtils.validateAddresses(addresses);
91+
92+
// Maximum addresses in batch request - 20
93+
finalList<Balance>balances =newArrayList<>();
94+
finalList<List<String>>addressesAsBatches =BasicUtils.partition(addresses,20);
95+
96+
for (finalList<String>batch :addressesAsBatches) {
97+
finalStringurlParams =ACT_BALANCE_MULTI_ACTION +TAG_LATEST_PARAM +ADDRESS_PARAM +toAddressParam(batch);
98+
finalBalanceResponseTOresponse =getRequest(urlParams,BalanceResponseTO.class);
99+
if (response.getStatus() !=1)
100+
thrownewEtherScanException(response.getMessage() +", with status " +response.getStatus());
101+
102+
if (!BasicUtils.isEmpty(response.getResult()))
103+
balances.addAll(response.getResult().stream()
104+
.map(Balance::of)
105+
.collect(Collectors.toList()));
106+
}
107+
108+
returnbalances;
109+
}
110+
111+
privateStringtoAddressParam(finalList<String>addresses) {
112+
returnaddresses.stream().collect(Collectors.joining(","));
113+
}
114+
115+
@NotNull
116+
@Override
117+
publicList<Tx>txs(finalStringaddress)throwsApiException {
118+
returntxs(address,MIN_START_BLOCK);
119+
}
120+
121+
@NotNull
122+
@Override
123+
publicList<Tx>txs(finalStringaddress,finallongstartBlock)throwsApiException {
124+
returntxs(address,startBlock,MAX_END_BLOCK);
125+
}
126+
127+
@NotNull
128+
@Override
129+
publicList<Tx>txs(finalStringaddress,finallongstartBlock,finallongendBlock)throwsApiException {
130+
BasicUtils.validateAddress(address);
131+
finalBlockParamblocks =BasicUtils.compensateBlocks(startBlock,endBlock);
132+
133+
finalStringoffsetParam =PAGE_PARAM +"%s" +OFFSET_PARAM +OFFSET_MAX;
134+
finalStringblockParam =START_BLOCK_PARAM +blocks.start() +END_BLOCK_PARAM +blocks.end();
135+
finalStringurlParams =ACT_TX_ACTION +offsetParam +ADDRESS_PARAM +address +blockParam +SORT_ASC_PARAM;
136+
137+
returngetRequestUsingOffset(urlParams,TxResponseTO.class);
138+
}
139+
140+
/**
141+
* Generic search for txs using offset api param
142+
* To avoid 10k limit per response
143+
*
144+
* @param urlParams Url params for #getRequest()
145+
* @param tClass responseListTO class
146+
* @param <T> responseTO list T type
147+
* @param <R> responseListTO type
148+
* @return List of T values
149+
*/
150+
private <T,RextendsBaseListResponseTO>List<T>getRequestUsingOffset(finalStringurlParams,Class<R>tClass)
151+
throwsApiException {
152+
finalList<T>result =newArrayList<>();
153+
intpage =1;
154+
while (true) {
155+
finalStringformattedUrl =String.format(urlParams,page++);
156+
finalRresponse =getRequest(formattedUrl,tClass);
157+
BasicUtils.validateTxResponse(response);
158+
if (BasicUtils.isEmpty(response.getResult()))
159+
break;
160+
161+
result.addAll(response.getResult());
162+
if (response.getResult().size() <OFFSET_MAX)
163+
break;
164+
}
165+
166+
returnresult;
167+
}
168+
169+
@NotNull
170+
@Override
171+
publicList<TxInternal>txsInternal(finalStringaddress)throwsApiException {
172+
returntxsInternal(address,MIN_START_BLOCK);
173+
}
174+
175+
@NotNull
176+
@Override
177+
publicList<TxInternal>txsInternal(finalStringaddress,finallongstartBlock)throwsApiException {
178+
returntxsInternal(address,startBlock,MAX_END_BLOCK);
179+
}
180+
181+
@NotNull
182+
@Override
183+
publicList<TxInternal>txsInternal(finalStringaddress,finallongstartBlock,finallongendBlock)throwsApiException {
184+
BasicUtils.validateAddress(address);
185+
finalBlockParamblocks =BasicUtils.compensateBlocks(startBlock,endBlock);
186+
187+
finalStringoffsetParam =PAGE_PARAM +"%s" +OFFSET_PARAM +OFFSET_MAX;
188+
finalStringblockParam =START_BLOCK_PARAM +blocks.start() +END_BLOCK_PARAM +blocks.end();
189+
finalStringurlParams =ACT_TX_INTERNAL_ACTION +offsetParam +ADDRESS_PARAM +address +blockParam +SORT_ASC_PARAM;
190+
191+
returngetRequestUsingOffset(urlParams,TxInternalResponseTO.class);
192+
}
193+
194+
@NotNull
195+
@Override
196+
publicList<TxInternal>txsInternalByHash(finalStringtxhash)throwsApiException {
197+
BasicUtils.validateTxHash(txhash);
198+
199+
finalStringurlParams =ACT_TX_INTERNAL_ACTION +TXHASH_PARAM +txhash;
200+
finalTxInternalResponseTOresponse =getRequest(urlParams,TxInternalResponseTO.class);
201+
BasicUtils.validateTxResponse(response);
202+
203+
returnBasicUtils.isEmpty(response.getResult())
204+
?Collections.emptyList()
205+
:response.getResult();
206+
}
207+
208+
@NotNull
209+
@Override
210+
publicList<TxToken>txsToken(finalStringaddress)throwsApiException {
211+
returntxsToken(address,MIN_START_BLOCK);
212+
}
213+
214+
@NotNull
215+
@Override
216+
publicList<TxToken>txsToken(finalStringaddress,finallongstartBlock)throwsApiException {
217+
returntxsToken(address,startBlock,MAX_END_BLOCK);
218+
}
219+
220+
@NotNull
221+
@Override
222+
publicList<TxToken>txsToken(finalStringaddress,finallongstartBlock,finallongendBlock)throwsApiException {
223+
BasicUtils.validateAddress(address);
224+
finalBlockParamblocks =BasicUtils.compensateBlocks(startBlock,endBlock);
225+
226+
finalStringoffsetParam =PAGE_PARAM +"%s" +OFFSET_PARAM +OFFSET_MAX;
227+
finalStringblockParam =START_BLOCK_PARAM +blocks.start() +END_BLOCK_PARAM +blocks.end();
228+
finalStringurlParams =ACT_TX_TOKEN_ACTION +offsetParam +ADDRESS_PARAM +address +blockParam +SORT_ASC_PARAM;
229+
230+
returngetRequestUsingOffset(urlParams,TxTokenResponseTO.class);
231+
}
232+
233+
@NotNull
234+
@Override
235+
publicList<Block>minedBlocks(finalStringaddress)throwsApiException {
236+
BasicUtils.validateAddress(address);
237+
238+
finalStringoffsetParam =PAGE_PARAM +"%s" +OFFSET_PARAM +OFFSET_MAX;
239+
finalStringurlParams =ACT_MINED_ACTION +offsetParam +BLOCK_TYPE_PARAM +ADDRESS_PARAM +address;
240+
241+
returngetRequestUsingOffset(urlParams,BlockResponseTO.class);
242+
}
243+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
packageio.api.etherscan.core.impl;
2+
3+
importcom.google.gson.Gson;
4+
importio.api.etherscan.error.EtherScanException;
5+
importio.api.etherscan.error.ParseException;
6+
importio.api.etherscan.executor.IHttpExecutor;
7+
importio.api.etherscan.manager.IQueueManager;
8+
importio.api.etherscan.util.BasicUtils;
9+
10+
/**
11+
* Base provider for API Implementations
12+
*
13+
* @author GoodforGod
14+
* @see EtherScanApi
15+
* @since 28.10.2018
16+
*/
17+
abstractclassBasicProvider {
18+
19+
staticfinalintMAX_END_BLOCK =999999999;
20+
staticfinalintMIN_START_BLOCK =0;
21+
22+
staticfinalStringACT_PREFIX ="&action=";
23+
24+
privatefinalStringmodule;
25+
privatefinalStringbaseUrl;
26+
privatefinalIHttpExecutorexecutor;
27+
privatefinalIQueueManagerqueue;
28+
privatefinalGsongson;
29+
30+
BasicProvider(finalIQueueManagerqueue,
31+
finalStringmodule,
32+
finalStringbaseUrl,
33+
finalIHttpExecutorexecutor) {
34+
this.queue =queue;
35+
this.module ="&module=" +module;
36+
this.baseUrl =baseUrl;
37+
this.executor =executor;
38+
this.gson =newGson();
39+
}
40+
41+
<T>Tconvert(finalStringjson,finalClass<T>tClass) {
42+
try {
43+
returngson.fromJson(json,tClass);
44+
}catch (Exceptione) {
45+
thrownewParseException(e.getMessage(),e.getCause());
46+
}
47+
}
48+
49+
StringgetRequest(finalStringurlParameters) {
50+
queue.takeTurn();
51+
finalStringurl =baseUrl +module +urlParameters;
52+
finalStringresult =executor.get(url);
53+
if (BasicUtils.isEmpty(result))
54+
thrownewEtherScanException("Server returned null value for GET request at URL - " +url);
55+
56+
returnresult;
57+
}
58+
59+
StringpostRequest(finalStringurlParameters,finalStringdataToPost) {
60+
queue.takeTurn();
61+
finalStringurl =baseUrl +module +urlParameters;
62+
returnexecutor.post(url,dataToPost);
63+
}
64+
65+
<T>TgetRequest(finalStringurlParameters,finalClass<T>tClass) {
66+
returnconvert(getRequest(urlParameters),tClass);
67+
}
68+
69+
<T>TpostRequest(finalStringurlParameters,finalStringdataToPost,finalClass<T>tClass) {
70+
returnconvert(postRequest(urlParameters,dataToPost),tClass);
71+
}
72+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
packageio.api.etherscan.core.impl;
2+
3+
importio.api.etherscan.core.IBlockApi;
4+
importio.api.etherscan.error.ApiException;
5+
importio.api.etherscan.executor.IHttpExecutor;
6+
importio.api.etherscan.manager.IQueueManager;
7+
importio.api.etherscan.model.UncleBlock;
8+
importio.api.etherscan.model.utility.UncleBlockResponseTO;
9+
importio.api.etherscan.util.BasicUtils;
10+
importorg.jetbrains.annotations.NotNull;
11+
12+
importjava.util.Optional;
13+
14+
/**
15+
* Block API Implementation
16+
*
17+
* @see IBlockApi
18+
*
19+
* @author GoodforGod
20+
* @since 28.10.2018
21+
*/
22+
publicclassBlockApiProviderextendsBasicProviderimplementsIBlockApi {
23+
24+
privatestaticfinalStringACT_BLOCK_PARAM =ACT_PREFIX +"getblockreward";
25+
26+
privatestaticfinalStringBLOCKNO_PARAM ="&blockno=";
27+
28+
BlockApiProvider(finalIQueueManagerqueueManager,
29+
finalStringbaseUrl,
30+
finalIHttpExecutorexecutor) {
31+
super(queueManager,"block",baseUrl,executor);
32+
}
33+
34+
@NotNull
35+
@Override
36+
publicOptional<UncleBlock>uncles(longblockNumber)throwsApiException {
37+
finalStringurlParam =ACT_BLOCK_PARAM +BLOCKNO_PARAM +blockNumber;
38+
finalStringresponse =getRequest(urlParam);
39+
if(BasicUtils.isEmpty(response) ||response.contains("NOTOK"))
40+
returnOptional.empty();
41+
42+
finalUncleBlockResponseTOresponseTO =convert(response,UncleBlockResponseTO.class);
43+
BasicUtils.validateTxResponse(responseTO);
44+
return (responseTO.getResult() ==null ||responseTO.getResult().isEmpty())
45+
?Optional.empty()
46+
:Optional.of(responseTO.getResult());
47+
}
48+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp