@@ -32,68 +32,57 @@ pub trait ValidatorMetadataReader: Send + Sync {
3232// HTTP implementation
3333// ---------------------------------------------------------------------------
3434
35- pub const DEFAULT_DATA_API_URL : & str = "https://data.malbeclabs.com/api/sql/query" ;
35+ pub const DEFAULT_VALIDATOR_METADATA_URL : & str =
36+ "https://data.malbeclabs.com/api/v1/validators-metadata" ;
3637
37- pub struct DataApiValidatorMetadataReader {
38+ pub struct HttpValidatorMetadataReader {
3839 pub api_url : String ,
3940}
4041
4142#[ derive( serde:: Deserialize ) ]
42- struct SqlResponse {
43- rows : Vec < Vec < serde_json:: Value > > ,
43+ struct ValidatorMetadataItem {
44+ ip : String ,
45+ active_stake : i64 ,
46+ vote_account : String ,
47+ software_client : String ,
48+ software_version : String ,
4449}
4550
4651#[ async_trait:: async_trait]
47- impl ValidatorMetadataReader for DataApiValidatorMetadataReader {
52+ impl ValidatorMetadataReader for HttpValidatorMetadataReader {
4853 async fn fetch_validators ( & self ) -> Result < HashMap < Ipv4Addr , ValidatorRecord > > {
49- let query = r#"
50- SELECT
51- v.vote_account,
52- v.software_client,
53- v.software_version,
54- v.active_stake,
55- v.ip
56- FROM validatorsapp_validators_current v
57- WHERE v.is_active = 1
58- "# ;
59-
6054 let client = reqwest:: Client :: new ( ) ;
6155 let resp = client
62- . post ( & self . api_url )
63- . json ( & serde_json:: json!( { "query" : query } ) )
56+ . get ( & self . api_url )
6457 . send ( )
6558 . await
66- . context ( "failed to query data API for validators " ) ?;
59+ . context ( "failed to fetch validator metadata " ) ?;
6760
6861 let status = resp. status ( ) ;
6962 if !status. is_success ( ) {
7063 let body = resp. text ( ) . await . unwrap_or_default ( ) ;
71- bail ! ( "data API returned {status}: {body}" ) ;
64+ bail ! ( "validator metadata service returned {status}: {body}" ) ;
7265 }
7366
74- let body : SqlResponse = resp
67+ let items : Vec < ValidatorMetadataItem > = resp
7568 . json ( )
7669 . await
77- . context ( "failed to parse data API response" ) ?;
70+ . context ( "failed to parse validator metadata response" ) ?;
7871
7972 let mut map = HashMap :: new ( ) ;
80- for row in & body. rows {
81- if row. len ( ) < 5 {
82- continue ;
83- }
84-
85- let gossip_ip: Ipv4Addr = match row[ 4 ] . as_str ( ) . unwrap_or_default ( ) . parse ( ) {
73+ for item in items {
74+ let gossip_ip: Ipv4Addr = match item. ip . parse ( ) {
8675 Ok ( ip) => ip,
8776 Err ( _) => continue ,
8877 } ;
8978
9079 map. insert (
9180 gossip_ip,
9281 ValidatorRecord {
93- vote_account : row [ 0 ] . as_str ( ) . unwrap_or_default ( ) . to_string ( ) ,
94- software_client : row [ 1 ] . as_str ( ) . unwrap_or_default ( ) . to_string ( ) ,
95- software_version : row [ 2 ] . as_str ( ) . unwrap_or_default ( ) . to_string ( ) ,
96- activated_stake_sol : row [ 3 ] . as_i64 ( ) . unwrap_or ( 0 ) as f64 / 1_000_000_000.0 ,
82+ vote_account : item . vote_account ,
83+ software_client : item . software_client ,
84+ software_version : item . software_version ,
85+ activated_stake_sol : item . active_stake as f64 / 1_000_000_000.0 ,
9786 gossip_ip,
9887 } ,
9988 ) ;
0 commit comments