@@ -8,7 +8,7 @@ use crate::server::CONFIG;
88use alloy:: primitives:: { Address , U256 } ;
99use alloy:: providers:: ProviderBuilder ;
1010use alloy:: sol;
11- use eyre:: { Result , eyre, Context } ; // Add this import
11+ use eyre:: { eyre, Context , Result } ; // Add this import
1212use reqwest;
1313use serde:: { Deserialize , Serialize } ;
1414use std:: collections:: { HashMap , HashSet } ;
@@ -107,9 +107,15 @@ impl EtherscanClient {
107107 ETHERSCAN_API_URL , token, self . chain_id, self . api_key
108108 ) ;
109109
110- let response = self . client . get ( & url) . send ( ) . await
110+ let response = self
111+ . client
112+ . get ( & url)
113+ . send ( )
114+ . await
111115 . context ( "Failed to send request to Etherscan" ) ?;
112- let data: EtherscanResponse < Vec < ContractCreation > > = response. json ( ) . await
116+ let data: EtherscanResponse < Vec < ContractCreation > > = response
117+ . json ( )
118+ . await
113119 . context ( "Failed to parse Etherscan response" ) ?;
114120
115121 if data. status != "1" {
@@ -126,7 +132,9 @@ impl EtherscanClient {
126132 u64:: from_str_radix ( & result. block_number [ 2 ..] , 16 )
127133 . context ( "Failed to parse hex block number" ) ?
128134 } else {
129- result. block_number . parse :: < u64 > ( )
135+ result
136+ . block_number
137+ . parse :: < u64 > ( )
130138 . context ( "Failed to parse decimal block number" ) ?
131139 } ;
132140
@@ -152,14 +160,28 @@ impl EtherscanClient {
152160 ETHERSCAN_API_URL , token, from_block, to_block, transfer_topic, page, self . chain_id, self . api_key
153161 ) ;
154162
155- let response = self . client . get ( & url) . send ( ) . await
163+ let response = self
164+ . client
165+ . get ( & url)
166+ . send ( )
167+ . await
156168 . context ( "Failed to fetch transfer logs" ) ?;
157- let data: EtherscanResponse < Vec < TransferLog > > = response. json ( ) . await
169+ let data: EtherscanResponse < Vec < TransferLog > > = response
170+ . json ( )
171+ . await
158172 . context ( "Failed to parse transfer logs response" ) ?;
159173
160174 // Break if request failed
161175 if data. status != "1" {
162- break ;
176+ if data. message . eq_ignore_ascii_case ( "No records found" ) {
177+ break ;
178+ }
179+
180+ return Err ( eyre ! (
181+ "Etherscan getLogs failed on page {}: {}" ,
182+ page,
183+ data. message
184+ ) ) ;
163185 }
164186
165187 // Break if no results
@@ -205,14 +227,28 @@ impl EtherscanClient {
205227 ETHERSCAN_API_URL , token, from_block, to_block, delegate_votes_changed_topic, page, self . chain_id, self . api_key
206228 ) ;
207229
208- let response = self . client . get ( & url) . send ( ) . await
230+ let response = self
231+ . client
232+ . get ( & url)
233+ . send ( )
234+ . await
209235 . context ( "Failed to fetch delegation logs" ) ?;
210- let data: EtherscanResponse < Vec < DelegateVotesChangedLog > > = response. json ( ) . await
236+ let data: EtherscanResponse < Vec < DelegateVotesChangedLog > > = response
237+ . json ( )
238+ . await
211239 . context ( "Failed to parse delegation logs response" ) ?;
212240
213241 // Break if request failed
214242 if data. status != "1" {
215- break ;
243+ if data. message . eq_ignore_ascii_case ( "No records found" ) {
244+ break ;
245+ }
246+
247+ return Err ( eyre ! (
248+ "Etherscan getLogs failed on page {}: {}" ,
249+ page,
250+ data. message
251+ ) ) ;
216252 }
217253
218254 // Break if no results
@@ -293,7 +329,7 @@ impl EtherscanClient {
293329 for voter in potential_voters {
294330 match Self :: get_past_votes ( token_address, voter. address , block_number, rpc_url) . await {
295331 Ok ( votes) => {
296- if votes > threshold {
332+ if votes >= threshold {
297333 token_holders. push ( TokenHolder {
298334 address : voter. address . to_string ( ) ,
299335 balance : votes. to_string ( ) ,
@@ -403,8 +439,7 @@ impl EtherscanClient {
403439 block_number : u64 ,
404440 rpc_url : & str ,
405441 ) -> Result < U256 > {
406- let url = rpc_url. parse ( )
407- . context ( "Failed to parse RPC URL" ) ?;
442+ let url = rpc_url. parse ( ) . context ( "Failed to parse RPC URL" ) ?;
408443 let provider = ProviderBuilder :: new ( ) . connect_http ( url) ;
409444 let token = ERC20Votes :: new ( token_address, provider) ;
410445
0 commit comments