1- use std:: { collections:: HashMap , sync:: Arc } ;
1+ use std:: { collections:: HashMap , str :: FromStr , sync:: Arc } ;
22
3- use bam_api_client:: { client:: BamApiClient , types:: ValidatorsResponse } ;
4- use kobe_core:: db_models:: bam_epoch_metric:: { BamEpochMetric , BamEpochMetricStore } ;
3+ use bam_api_client:: client:: BamApiClient ;
4+ use kobe_core:: db_models:: {
5+ bam_epoch_metric:: { BamEpochMetric , BamEpochMetricStore } ,
6+ bam_validators:: { BamValidator , BamValidatorStore } ,
7+ } ;
58use mongodb:: Collection ;
69use solana_client:: nonblocking:: rpc_client:: RpcClient ;
710use solana_pubkey:: Pubkey ;
8- use stakenet_sdk:: utils:: accounts:: get_stake_pool_account;
11+ use stakenet_sdk:: utils:: accounts:: { get_all_validator_history_accounts , get_stake_pool_account} ;
912
1013use crate :: bam_delegation_criteria:: BamDelegationCriteria ;
1114
@@ -21,8 +24,8 @@ pub struct BamWriterService {
2124 /// BAM API client
2225 bam_api_client : BamApiClient ,
2326
24- /// Kobe API base URL
25- kobe_base_api_url : String ,
27+ /// Bam validators store
28+ bam_validators_store : BamValidatorStore ,
2629
2730 /// Bam epoch metric store
2831 bam_epoch_metric_store : BamEpochMetricStore ,
@@ -39,12 +42,15 @@ impl BamWriterService {
3942 stake_pool : Pubkey ,
4043 rpc_client : Arc < RpcClient > ,
4144 bam_api_base_url : & str ,
42- kobe_api_base_url : & str ,
4345 ) -> anyhow:: Result < Self > {
4446 // Connect to MongoDB
4547 let client = mongodb:: Client :: with_uri_str ( mongo_connection_uri) . await ?;
4648 let db = client. database ( mongo_db_name) ;
4749
50+ let bam_validators_collection: Collection < BamValidator > =
51+ db. collection ( BamValidatorStore :: COLLECTION ) ;
52+ let bam_validators_store = BamValidatorStore :: new ( bam_validators_collection) ;
53+
4854 let bam_epoch_metric_collection: Collection < BamEpochMetric > =
4955 db. collection ( BamEpochMetricStore :: COLLECTION ) ;
5056 let bam_epoch_metric_store = BamEpochMetricStore :: new ( bam_epoch_metric_collection) ;
@@ -58,7 +64,7 @@ impl BamWriterService {
5864 stake_pool,
5965 rpc_client,
6066 bam_api_client,
61- kobe_base_api_url : kobe_api_base_url . to_string ( ) ,
67+ bam_validators_store ,
6268 bam_epoch_metric_store,
6369 bam_delegation_criteria,
6470 } )
@@ -72,42 +78,89 @@ impl BamWriterService {
7278 let jitosol_stake = get_stake_pool_account ( & self . rpc_client , & self . stake_pool ) . await ?;
7379
7480 let bam_node_validators = self . bam_api_client . get_validators ( ) . await ?;
75- let bam_validator_map: HashMap < & str , & ValidatorsResponse > = bam_node_validators
76- . iter ( )
77- . map ( |v| ( v. validator_pubkey . as_str ( ) , v) )
78- . collect ( ) ;
81+ // let bam_validator_map: HashMap<&str, &ValidatorsResponse> = bam_node_validators
82+ // .iter()
83+ // .map(|v| (v.validator_pubkey.as_str(), v))
84+ // .collect();
7985
8086 let vote_accounts = self . rpc_client . get_vote_accounts ( ) . await ?;
87+
88+ let mut bam_validator_map = HashMap :: new ( ) ;
89+ for bam_node_validator in bam_node_validators {
90+ for vote_account in vote_accounts. current . iter ( ) {
91+ if vote_account
92+ . node_pubkey
93+ . eq ( & bam_node_validator. validator_pubkey )
94+ {
95+ bam_validator_map. insert (
96+ Pubkey :: from_str ( & vote_account. vote_pubkey ) . unwrap ( ) ,
97+ vote_account,
98+ ) ;
99+ }
100+ }
101+ }
102+
103+ let validator_histories =
104+ get_all_validator_history_accounts ( & self . rpc_client . clone ( ) , jito_steward:: id ( ) )
105+ . await ?;
106+
107+ let start_epoch = epoch - 3 ;
108+ let end_epoch = epoch;
109+ let mut bam_validators: Vec < BamValidator > = Vec :: new ( ) ;
110+ ' validator_history: for validator_history in validator_histories {
111+ if let Some ( vote_account) = bam_validator_map. get ( & validator_history. vote_account ) {
112+ for entry in validator_history
113+ . history
114+ . epoch_range ( start_epoch as u16 , end_epoch as u16 )
115+ {
116+ if let Some ( entry) = entry {
117+ if entry. commission . ne ( & 0 ) {
118+ continue ' validator_history;
119+ }
120+
121+ if entry. mev_commission . gt ( & 10 ) {
122+ continue ' validator_history;
123+ }
124+
125+ if entry. is_superminority . eq ( & 0 ) {
126+ continue ' validator_history;
127+ }
128+ }
129+ }
130+
131+ let bam_validator = BamValidator :: new (
132+ vote_account. activated_stake ,
133+ epoch,
134+ & vote_account. node_pubkey ,
135+ & vote_account. vote_pubkey ,
136+ ) ;
137+ bam_validators. push ( bam_validator) ;
138+ }
139+ }
140+
141+ self . bam_validators_store
142+ . insert_many ( & bam_validators)
143+ . await ?;
144+
81145 let total_stake = vote_accounts
82146 . current
83147 . iter ( )
84148 . map ( |v| v. activated_stake )
85149 . sum ( ) ;
86150
87- let validators_url = format ! ( "{}/api/v1/validators" , self . kobe_base_api_url) ;
88-
89- let client = reqwest:: Client :: new ( ) ;
90- let validators = client
91- . post ( & validators_url)
92- . json ( & serde_json:: json!( { "epoch" : epoch } ) )
93- . send ( )
94- . await ?
95- . json :: < kobe_api:: schemas:: validator:: ValidatorsResponse > ( )
96- . await ?;
151+ // let validators_url = format!("{}/api/v1/validators", self.kobe_base_api_url);
97152
98- let mut eligible_bam_validator_count = 0_u64 ;
99- let mut bam_stake = 0_u64 ;
100- for validator in validators. validators . iter ( ) {
101- if let Some ( ref identity_account) = validator. identity_account {
102- if bam_validator_map. contains_key ( identity_account. as_str ( ) ) {
103- bam_stake += validator. active_stake ;
153+ // let client = reqwest::Client::new();
154+ // let validators = client
155+ // .post(&validators_url)
156+ // .json(&serde_json::json!({ "epoch": epoch }))
157+ // .send()
158+ // .await?
159+ // .json::<kobe_api::schemas::validator::ValidatorsResponse>()
160+ // .await?;
104161
105- if let Some ( true ) = validator. jito_pool_eligible {
106- eligible_bam_validator_count += 1 ;
107- }
108- }
109- }
110- }
162+ let eligible_bam_validator_count = bam_validators. len ( ) as u64 ;
163+ let bam_stake = bam_validators. iter ( ) . map ( |v| v. get_active_stake ( ) ) . sum ( ) ;
111164
112165 let available_bam_delegation_stake = self
113166 . bam_delegation_criteria
0 commit comments