sub_meta_api/collator_selection/
invulnerables.rs

1#![allow(missing_docs)]
2use crate::models::collator::Collator;
3use crate::connection::api_connection;
4use crate::errors::pallet;
5
6use std::error::Error;
7
8use subxt::{ utils::Yes, storage::Address };
9
10use polkadot_asset_hub_metadata::collator_selection::storage::types::invulnerables::Invulnerables;
11
12use crate::enums::chains::ChainNames;
13
14#[subxt::subxt(runtime_metadata_path = "src/artifacts/metadata/polkadot-assethub.scale")]
15mod polkadot_asset_hub_metadata {}
16
17#[subxt::subxt(runtime_metadata_path = "src/artifacts/metadata/polkadot-bridgehub.scale")]
18mod polkadot_bridge_hub_metadata {}
19
20pub async fn execute(chain:ChainNames)->Result<Vec<Collator>, Box<dyn Error>> {
21
22    match chain{
23        ChainNames::Polkadot => {
24            Err(pallet::PalletNotFound::new("CollatorSelection").into())
25        }
26        ChainNames::Kusama => {
27            Err(pallet::PalletNotFound::new("CollatorSelection").into())
28        }
29        ChainNames::PolkadotAssetHub =>{
30            let query = polkadot_asset_hub_metadata::storage().collator_selection().invulnerables();
31            Ok(get_invulnerables_generic(None,query,ChainNames::PolkadotAssetHub).await?)
32        }
33        ChainNames::PolkadotBridgeHub => {
34            Err(pallet::PalletNotFound::new("CollatorSelection").into())
35        }
36    }
37}
38
39pub async fn execute_with_wss(wss_url:&str, chain:ChainNames)->Result<Vec<Collator>, Box<dyn Error>> {
40
41    match chain{
42        ChainNames::Polkadot => {
43            Err(pallet::PalletNotFound::new("Collator_Selection.Invulnerables").into())
44        }
45        ChainNames::Kusama => {
46            Err(pallet::PalletNotFound::new("Collator_Selection.Invulnerables").into())
47        }
48        ChainNames::PolkadotAssetHub =>{
49            let query = polkadot_asset_hub_metadata::storage().collator_selection().invulnerables();
50            Ok(get_invulnerables_generic(Some(wss_url),query,ChainNames::PolkadotAssetHub).await?)
51        }
52        ChainNames::PolkadotBridgeHub => {
53            Err(pallet::PalletNotFound::new("Collator_Selection.Invulnerables").into())
54        }
55    }
56}
57
58async fn get_invulnerables_generic<T: Address<IsFetchable = Yes, Target=Invulnerables>>(wss_url:Option<&str>, query:T, chain:ChainNames) ->Result<Vec<Collator>, Box<dyn Error>> {
59
60    let api_connection_result = api_connection::get_api_connection(wss_url, chain).await;
61    let mut result:Vec<Collator> = vec![];
62
63    match api_connection_result {
64        Ok(api_connection) => {
65
66            match api_connection.storage().at_latest().await {
67                Ok(api_at_latest) => {
68                    match api_at_latest.fetch(&query).await {
69                        //Do stuff
70                        Ok(invulnerables_option)=>{
71                            match invulnerables_option {
72                                Some(invulnernables) => {
73                                    for invulnerable in invulnernables.0.iter() {
74                                        result.push(Collator::new()
75                                            .set_address(invulnerable.clone())
76                                            .set_invulnerable(true)
77                                        );
78                                    }
79                                }
80                                None => {
81                                    eprintln!("No invulnerable list found");
82                                }
83                            }
84                        },
85                        Err(_) => {
86                            todo!("Couldn't fetch query")
87                        },
88                    }
89                }
90                Err(_) => {
91                    todo!("Couldn't fetch query")
92                }
93            }
94        }
95        Err(_err) => {
96            todo!("Couldn't fetch query")
97        }
98    }
99
100    Ok(result)
101}
102