sub_meta_api/collator_selection/
invulnerables.rs1#![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 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