@@ -2,7 +2,7 @@ pub mod store;
22pub mod validators;
33use actix_web:: { web, App , HttpResponse , HttpServer , Responder } ;
44use alloy:: primitives:: utils:: Unit ;
5- use alloy:: primitives:: U256 ;
5+ use alloy:: primitives:: { Address , U256 } ;
66use anyhow:: { Context , Result } ;
77use clap:: Parser ;
88use log:: { debug, LevelFilter } ;
@@ -245,8 +245,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
245245 } ;
246246 info ! (
247247 "Synthetic validator has penalty: {} ({})" ,
248- penalty,
249- Unit :: ETHER . wei( )
248+ penalty, args. validator_penalty
250249 ) ;
251250
252251 Some ( SyntheticDataValidator :: new (
@@ -358,7 +357,70 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
358357 }
359358 } ;
360359
361- if let Err ( e) = hardware_validator. validate_nodes ( nodes) . await {
360+ // Ensure nodes have enough stake
361+ let mut nodes_with_enough_stake = Vec :: new ( ) ;
362+ let stake_manager = match contracts. stake_manager . as_ref ( ) {
363+ Some ( manager) => manager,
364+ None => {
365+ error ! ( "Stake manager contract not initialized" ) ;
366+ continue ;
367+ }
368+ } ;
369+
370+ let mut provider_stake_cache: std:: collections:: HashMap < String , ( U256 , U256 ) > =
371+ std:: collections:: HashMap :: new ( ) ;
372+ for node in nodes {
373+ let provider_address_str = & node. node . provider_address ;
374+ let provider_address = match Address :: from_str ( provider_address_str) {
375+ Ok ( address) => address,
376+ Err ( e) => {
377+ error ! (
378+ "Failed to parse provider address {}: {}" ,
379+ provider_address_str, e
380+ ) ;
381+ continue ;
382+ }
383+ } ;
384+
385+ let ( stake, required_stake) =
386+ if let Some ( & cached_info) = provider_stake_cache. get ( provider_address_str) {
387+ cached_info
388+ } else {
389+ let stake = stake_manager
390+ . get_stake ( provider_address)
391+ . await
392+ . unwrap_or_default ( ) ;
393+ let total_compute = contracts
394+ . compute_registry
395+ . get_provider_total_compute ( provider_address)
396+ . await
397+ . unwrap_or_default ( ) ;
398+ let required_stake = stake_manager
399+ . calculate_stake ( U256 :: from ( 0 ) , total_compute)
400+ . await
401+ . unwrap_or_default ( ) ;
402+
403+ provider_stake_cache
404+ . insert ( provider_address_str. clone ( ) , ( stake, required_stake) ) ;
405+ ( stake, required_stake)
406+ } ;
407+
408+ if stake >= required_stake {
409+ nodes_with_enough_stake. push ( node) ;
410+ } else {
411+ info ! (
412+ "Node {} has insufficient stake: {} (required: {})" ,
413+ node. node. id,
414+ stake / Unit :: ETHER . wei( ) ,
415+ required_stake / Unit :: ETHER . wei( )
416+ ) ;
417+ }
418+ }
419+
420+ if let Err ( e) = hardware_validator
421+ . validate_nodes ( nodes_with_enough_stake)
422+ . await
423+ {
362424 error ! ( "Error validating nodes: {:#}" , e) ;
363425 }
364426 }
0 commit comments