Skip to content

Commit 02b6073

Browse files
committed
chore: check etherscan error
1 parent 2bdd9d2 commit 02b6073

2 files changed

Lines changed: 56 additions & 15 deletions

File tree

examples/CRISP/server/src/server/indexer.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,14 @@ pub async fn register_e3_requested(
9595
token_address,
9696
event.e3.requestBlock.to::<u64>(),
9797
&CONFIG.http_rpc_url,
98-
U256::from_str_radix(&balance_threshold.to_string(), 10)
99-
.unwrap_or(U256::ZERO),
98+
U256::from_str_radix(&balance_threshold.to_string(), 10).map_err(
99+
|e| {
100+
eyre::eyre!(
101+
"Failed to convert balance threshold to U256: {}",
102+
e
103+
)
104+
},
105+
)?,
100106
)
101107
.await
102108
.map_err(|e| eyre::eyre!("Etherscan error: {}", e))?

examples/CRISP/server/src/server/token_holders/etherscan.rs

Lines changed: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::server::CONFIG;
88
use alloy::primitives::{Address, U256};
99
use alloy::providers::ProviderBuilder;
1010
use alloy::sol;
11-
use eyre::{Result, eyre, Context}; // Add this import
11+
use eyre::{eyre, Context, Result}; // Add this import
1212
use reqwest;
1313
use serde::{Deserialize, Serialize};
1414
use 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

Comments
 (0)