From 9b41f20a649f78ea4802150e4d761605a129a0d8 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Fri, 12 Dec 2025 16:22:40 +0000 Subject: [PATCH 1/2] chore: scale down by half decimals --- .../CRISP/server/src/server/routes/voting.rs | 14 ++++---- .../src/server/token_holders/etherscan.rs | 36 +++++++++++++++---- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/examples/CRISP/server/src/server/routes/voting.rs b/examples/CRISP/server/src/server/routes/voting.rs index 0484a8097b..a46cd6b378 100644 --- a/examples/CRISP/server/src/server/routes/voting.rs +++ b/examples/CRISP/server/src/server/routes/voting.rs @@ -5,14 +5,16 @@ // or FITNESS FOR A PARTICULAR PURPOSE. use crate::server::{ - CONFIG, app_data::AppData, database::SledDB, models::{ - VoteRequest, VoteResponse, VoteResponseStatus, VoteStatusRequest, VoteStatusResponse - }, repo::CrispE3Repository + app_data::AppData, + database::SledDB, + models::{ + VoteRequest, VoteResponse, VoteResponseStatus, VoteStatusRequest, VoteStatusResponse, + }, + repo::CrispE3Repository, + CONFIG, }; use actix_web::{web, HttpResponse, Responder}; -use alloy::{ - primitives::{Bytes, U256}, -}; +use alloy::primitives::{Bytes, U256}; use e3_sdk::evm_helpers::contracts::{EnclaveContract, EnclaveWrite}; use eyre::Error; use log::{error, info}; diff --git a/examples/CRISP/server/src/server/token_holders/etherscan.rs b/examples/CRISP/server/src/server/token_holders/etherscan.rs index 5a3bcb0a65..76636b25d5 100644 --- a/examples/CRISP/server/src/server/token_holders/etherscan.rs +++ b/examples/CRISP/server/src/server/token_holders/etherscan.rs @@ -20,6 +20,7 @@ sol! { #[sol(rpc)] contract ERC20Votes { function getPastVotes(address account, uint256 timepoint) external view returns (uint256); + function decimals() external view returns (uint8); } } @@ -178,8 +179,8 @@ impl EtherscanClient { } return Err(eyre!( - "Etherscan getLogs failed on page {}: {}", - page, + "Etherscan getLogs failed on page {}: {}", + page, data.message )); } @@ -245,8 +246,8 @@ impl EtherscanClient { } return Err(eyre!( - "Etherscan getLogs failed on page {}: {}", - page, + "Etherscan getLogs failed on page {}: {}", + page, data.message )); } @@ -330,9 +331,17 @@ impl EtherscanClient { match Self::get_past_votes(token_address, voter.address, block_number, rpc_url).await { Ok(votes) => { if votes >= threshold { + let decimals = Self::get_decimals(token_address, rpc_url).await?; + + // we want to keep some precision. + let half_decimals = decimals / 2; + + let scale_factor = U256::from(10u128.pow(half_decimals as u32)); + let scaled_votes = votes / scale_factor; + token_holders.push(TokenHolder { address: voter.address.to_string(), - balance: votes.to_string(), + balance: scaled_votes.to_string(), }); } } @@ -452,6 +461,21 @@ impl EtherscanClient { Ok(votes) } + /// Get the token decimals + async fn get_decimals(token_address: Address, rpc_url: &str) -> Result { + let url = rpc_url.parse().context("Failed to parse RPC URL")?; + let provider = ProviderBuilder::new().connect_http(url); + let token = ERC20Votes::new(token_address, provider); + + let decimals = token + .decimals() + .call() + .await + .context("Failed to call decimals")?; + + Ok(decimals) + } + /// Parse address from 32-byte topic (last 20 bytes) fn parse_address_from_topic(topic: &str) -> Result { let hex = topic.strip_prefix("0x").unwrap_or(topic); @@ -847,7 +871,7 @@ mod tests { } #[tokio::test] - #[ignore] + // #[ignore] async fn test_get_token_holders_with_voting_power() { let token = "0xb0BE360719f84c5351621590B7FfBD8EB0B46B5d"; let token_address: Address = token.parse().unwrap(); From 48f2bb8253623eef95128a39c5332c1467405580 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Fri, 12 Dec 2025 17:16:23 +0000 Subject: [PATCH 2/2] test: ignore test --- .../server/src/server/token_holders/etherscan.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/examples/CRISP/server/src/server/token_holders/etherscan.rs b/examples/CRISP/server/src/server/token_holders/etherscan.rs index 76636b25d5..1f6c5a3e01 100644 --- a/examples/CRISP/server/src/server/token_holders/etherscan.rs +++ b/examples/CRISP/server/src/server/token_holders/etherscan.rs @@ -327,16 +327,17 @@ impl EtherscanClient { ) -> Result> { let mut token_holders: Vec = Vec::new(); + let decimals = Self::get_decimals(token_address, rpc_url).await?; + + // we want to keep some precision. + let half_decimals = decimals / 2; + + let scale_factor = U256::from(10u128.pow(half_decimals as u32)); + for voter in potential_voters { match Self::get_past_votes(token_address, voter.address, block_number, rpc_url).await { Ok(votes) => { if votes >= threshold { - let decimals = Self::get_decimals(token_address, rpc_url).await?; - - // we want to keep some precision. - let half_decimals = decimals / 2; - - let scale_factor = U256::from(10u128.pow(half_decimals as u32)); let scaled_votes = votes / scale_factor; token_holders.push(TokenHolder { @@ -871,7 +872,7 @@ mod tests { } #[tokio::test] - // #[ignore] + #[ignore] async fn test_get_token_holders_with_voting_power() { let token = "0xb0BE360719f84c5351621590B7FfBD8EB0B46B5d"; let token_address: Address = token.parse().unwrap();