Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
865 changes: 865 additions & 0 deletions challenge-1/output/events.txt

Large diffs are not rendered by default.

22 changes: 22 additions & 0 deletions challenge-1/output/logs.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
Chain: Polkadot, Hash: 0x358a36ad9dd54579229615c9b27f1912fcccf7e4a1506613137e717a87927443, Height: 23533966
Chain: AssetHub, Hash: 0x8eec4a3b70a1ff8fd12604eb3f98878827b6dea5846e7e45dde7c41d54e412f6, Height: 7618868
Chain: Polkadot, Hash: 0x7037aee5eced8d776d4b16a6366f1c624b2c3293c4e4b7ea1792de39be0b119f, Height: 23533967
Chain: AssetHub, Hash: 0x5e1bfbd87b030074c5ba58bb49173aaef71341ea1f19c8d8a1e3d06846794140, Height: 7618869
Chain: Polkadot, Hash: 0x5e4a6d5d8aa944f7eb6b0c3d8b0a9ed7fe7ceeed8ce8135d2ff338dea5a596d3, Height: 23533968
Chain: Polkadot, Hash: 0xd7673a9ea433ac462eb841619e855f0e1a1f84521a75ccb7404bdc992e13e815, Height: 23533969
Chain: AssetHub, Hash: 0xf0700a250242c5be29c6957eb3df398e343e229be401e1bc20d5186eb2df47ec, Height: 7618870
Chain: Polkadot, Hash: 0x31f17e7136cf02f31219a1d229169772cb9d6f3048e14d6156d939f98c8d799f, Height: 23533970
Chain: AssetHub, Hash: 0x5eea773b680c4a2210d726a3761433d251d404cadc613db2a90cca39bd71053b, Height: 7618871
Chain: Polkadot, Hash: 0x2804b5fea8b72eb78a38d2819b816a7b56226b734b42519b19f9bc540cb98d02, Height: 23533971
Chain: Polkadot, Hash: 0x75381ec1c4c7ea376da5928b93687b2c29f783849e7a0ffc65a9b14ba698911d, Height: 23533972
Chain: Polkadot, Hash: 0xcf2e12eb5419321cdd65ec9db42fd9ac7245f75da18bac969ccb6d224b95fcbd, Height: 23533973
Chain: AssetHub, Hash: 0x3080ff1c0f358d968657b0016d1a0f9add192d2d347cd6d4dc651e95b9375f04, Height: 7618872
Chain: Polkadot, Hash: 0xaaca834d110898b75672602f107fe61772d53c771cd343d934ceacea178975c0, Height: 23533974
Chain: Polkadot, Hash: 0xd8c79fb6f557ccf18e83460c2c46f8525ee1f6cfc9e2b62d1cb122934b3c4423, Height: 23533975
Chain: AssetHub, Hash: 0x18cdd54139cd8f7d2b310ba325323cad247e8ca674b074f68c5c42c87a9bb426, Height: 7618873
Chain: Polkadot, Hash: 0xb3f35ef30e005044b771e8c25b1adc87a87fd25a30ce0f9743769946a8fc4b30, Height: 23533976
Chain: AssetHub, Hash: 0x0ace956ab457eb994a905b577bbe14a3917f0c8cde7a04eb57b4f93c30c4a845, Height: 7618874
Chain: Polkadot, Hash: 0x950adff8b69d0f89cc42267ccbfd52d9f88a7357fe1cd121397bdc47dfb5dc21, Height: 23533977
Chain: AssetHub, Hash: 0x74ba51e52a54ef7335a9ff7f70c956e5369a845d1592439848628cfc05a830a6, Height: 7618875
Chain: Polkadot, Hash: 0x0c7b57178cd35295a0e766c37b084ee857f89c2d229de2fe5dec3db08d640197, Height: 23533978
Chain: Polkadot, Hash: 0xc228b8417199b888e77d457a2b7556908ebf115b0793a82feea4b317b67d4b57, Height: 23533979
67 changes: 67 additions & 0 deletions challenge-1/output/pallets.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
Extrinsic ID: 0, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 1, Pallet Name:ParaInherent, Pallet Function: "enter"
Extrinsic ID: 2, Pallet Name:Balances, Pallet Function: "transfer_allow_death"
Extrinsic ID: 3, Pallet Name:Staking, Pallet Function: "nominate"
Extrinsic ID: 0, Pallet Name:ParachainSystem, Pallet Function: "set_validation_data"
Extrinsic ID: 1, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 0, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 1, Pallet Name:ParaInherent, Pallet Function: "enter"
Extrinsic ID: 0, Pallet Name:ParachainSystem, Pallet Function: "set_validation_data"
Extrinsic ID: 1, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 2, Pallet Name:Utility, Pallet Function: "batch_all"
Extrinsic ID: 0, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 1, Pallet Name:ParaInherent, Pallet Function: "enter"
Extrinsic ID: 2, Pallet Name:Balances, Pallet Function: "transfer_allow_death"
Extrinsic ID: 3, Pallet Name:Balances, Pallet Function: "transfer_allow_death"
Extrinsic ID: 4, Pallet Name:Staking, Pallet Function: "unbond"
Extrinsic ID: 0, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 1, Pallet Name:ParaInherent, Pallet Function: "enter"
Extrinsic ID: 2, Pallet Name:Balances, Pallet Function: "transfer_keep_alive"
Extrinsic ID: 3, Pallet Name:Utility, Pallet Function: "batch"
Extrinsic ID: 0, Pallet Name:ParachainSystem, Pallet Function: "set_validation_data"
Extrinsic ID: 1, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 0, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 1, Pallet Name:ParaInherent, Pallet Function: "enter"
Extrinsic ID: 2, Pallet Name:Balances, Pallet Function: "transfer_allow_death"
Extrinsic ID: 0, Pallet Name:ParachainSystem, Pallet Function: "set_validation_data"
Extrinsic ID: 1, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 0, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 1, Pallet Name:ParaInherent, Pallet Function: "enter"
Extrinsic ID: 2, Pallet Name:Balances, Pallet Function: "transfer_allow_death"
Extrinsic ID: 0, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 1, Pallet Name:ParaInherent, Pallet Function: "enter"
Extrinsic ID: 2, Pallet Name:Balances, Pallet Function: "transfer_allow_death"
Extrinsic ID: 3, Pallet Name:Balances, Pallet Function: "transfer_allow_death"
Extrinsic ID: 0, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 1, Pallet Name:ParaInherent, Pallet Function: "enter"
Extrinsic ID: 2, Pallet Name:Balances, Pallet Function: "transfer_allow_death"
Extrinsic ID: 3, Pallet Name:Utility, Pallet Function: "batch_all"
Extrinsic ID: 0, Pallet Name:ParachainSystem, Pallet Function: "set_validation_data"
Extrinsic ID: 1, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 2, Pallet Name:Utility, Pallet Function: "batch_all"
Extrinsic ID: 0, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 1, Pallet Name:ParaInherent, Pallet Function: "enter"
Extrinsic ID: 2, Pallet Name:Balances, Pallet Function: "transfer_keep_alive"
Extrinsic ID: 3, Pallet Name:Balances, Pallet Function: "transfer_keep_alive"
Extrinsic ID: 4, Pallet Name:Balances, Pallet Function: "transfer_keep_alive"
Extrinsic ID: 0, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 1, Pallet Name:ParaInherent, Pallet Function: "enter"
Extrinsic ID: 2, Pallet Name:Balances, Pallet Function: "transfer_allow_death"
Extrinsic ID: 0, Pallet Name:ParachainSystem, Pallet Function: "set_validation_data"
Extrinsic ID: 1, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 0, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 1, Pallet Name:ParaInherent, Pallet Function: "enter"
Extrinsic ID: 2, Pallet Name:NominationPools, Pallet Function: "join"
Extrinsic ID: 3, Pallet Name:Utility, Pallet Function: "batch_all"
Extrinsic ID: 0, Pallet Name:ParachainSystem, Pallet Function: "set_validation_data"
Extrinsic ID: 1, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 0, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 1, Pallet Name:ParaInherent, Pallet Function: "enter"
Extrinsic ID: 2, Pallet Name:Multisig, Pallet Function: "approve_as_multi"
Extrinsic ID: 0, Pallet Name:ParachainSystem, Pallet Function: "set_validation_data"
Extrinsic ID: 1, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 0, Pallet Name:Timestamp, Pallet Function: "set"
Extrinsic ID: 1, Pallet Name:ParaInherent, Pallet Function: "enter"
Extrinsic ID: 2, Pallet Name:Balances, Pallet Function: "transfer_keep_alive"
Extrinsic ID: 3, Pallet Name:Balances, Pallet Function: "transfer_keep_alive"
Extrinsic ID: 4, Pallet Name:Balances, Pallet Function: "transfer_keep_alive"
96 changes: 89 additions & 7 deletions challenge-1/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#![allow(missing_docs)]
use futures::StreamExt;
use std::fs::OpenOptions;
use std::io::Write;
use subxt::{client::OnlineClient, lightclient::LightClient, PolkadotConfig};

// Generate an interface that we can use from the node's metadata.
Expand All @@ -8,7 +10,8 @@ pub mod polkadot {}

// Examples chain specs.
const POLKADOT_SPEC: &str = include_str!("../artifacts/chain_specs/polkadot.json");
const ASSET_HUB_SPEC: &str = include_str!("../artifacts/chain_specs/polkadot_asset_hub.json");
const POLKADOT_ASSET_HUB_SPEC: &str =
include_str!("../artifacts/chain_specs/polkadot_asset_hub.json");

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
Expand All @@ -18,30 +21,32 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Instantiate a light client with the Polkadot relay chain,
// and connect it to Asset Hub, too.
let (lightclient, polkadot_rpc) = LightClient::relay_chain(POLKADOT_SPEC)?;
let asset_hub_rpc = lightclient.parachain(ASSET_HUB_SPEC)?;
let asset_hub_rpc = lightclient.parachain(POLKADOT_ASSET_HUB_SPEC)?;

// TODO: `🍭 Easy` Initialize RPCs to new relaychains and parachains.

// Create Subxt clients from these Smoldot backed RPC clients.
let polkadot_api = OnlineClient::<PolkadotConfig>::from_rpc_client(polkadot_rpc).await?;
let asset_hub_api = OnlineClient::<PolkadotConfig>::from_rpc_client(asset_hub_rpc).await?;
let asset_api = OnlineClient::<PolkadotConfig>::from_rpc_client(asset_hub_rpc).await?;

// TODO: `🍭 Easy` Create Subxt clients from newly added Smoldot backed RPC clients.

let polkadot_sub = polkadot_api
let paseo_sub = polkadot_api
.blocks()
.subscribe_finalized()
.await?
.map(|block| ("Polkadot", block));
let parachain_sub = asset_hub_api
let paseo_asset_sub = asset_api
.blocks()
.subscribe_finalized()
.await?
.map(|block| ("AssetHub", block));

// TODO: `🍭 Easy` Fetch blocks from new chains using the added APIs.
// // TODO: `🍭 Easy` Fetch blocks from new chains using the added APIs.

let mut stream_combinator = futures::stream::select(polkadot_sub, parachain_sub);
let mut stream_combinator = futures::stream::select(paseo_sub, paseo_asset_sub);

let mut block_numbers = std::collections::HashMap::new();

while let Some((chain, block)) = stream_combinator.next().await {
let block = block?;
Expand All @@ -54,14 +59,91 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {

// TODO: `🍫 Intermediate` Store the fetched block data to a log file.

let log_entry = format!(
"Chain: {}, Hash: {:?}, Height: {}\n",
chain,
block.hash(),
block.number()
);

write_logs("./output/logs.txt", &log_entry)?;

// TODO: `🍫 Intermediate` Finding the chain with highest block number.

// TODO: `🍫 Intermediate` Finding the chain with lowest block number.

let block_number = block.number();

block_numbers.insert(chain.to_string(), block_number);

// Find the chain with the highest block number
let highest_chain = block_numbers
.iter()
.max_by_key(|(_, &number)| number)
.map(|(chain, number)| format!("{} ({})", chain, number))
.unwrap_or_default();

// Find the chain with the lowest block number
let lowest_chain = block_numbers
.iter()
.min_by_key(|(_, &number)| number)
.map(|(chain, number)| format!("{} ({})", chain, number))
.unwrap_or_default();

println!(
" Highest chain: {} | Lowest chain: {}",
highest_chain, lowest_chain
);

// TODO: `🔥 Advanced` Processing extrinsics of each block and aggregate the number of transactions made based on the pallet name. Store the data in the log file named `pallets.txt`.

// TODO: `🔥 Advanced` Processing events emitted from each block and aggregate the number of events made based on the event name. Store the data in the log file named `events.txt`.
let extrinsics = block.extrinsics().await?;

for ext in extrinsics.iter() {
let idx = ext.index();
let pallet_name = ext.pallet_name()?;
let pallet_function = ext.variant_name()?;
let events = ext.events().await?;



let log_entry = format!(
"Extrinsic ID: {}, Pallet Name:{}, Pallet Function: {:?}\n",
idx, pallet_name, pallet_function
);

write_logs("./output/pallets.txt", &log_entry)?;

for evt in events.iter() {
let evt = evt?;
let pallet_name = evt.pallet_name();
let event_name = evt.variant_name();
let event_values = evt.field_values()?;

let log_entry = format!(
"Pallet: {}, Events:{}, Event Values: {:?}\n",
pallet_name, event_name, event_values
);

write_logs("./output/events.txt", &log_entry)?;


}
}
}

Ok(())
}



fn write_logs(file_path:&str, log_entry:&str) -> Result<(), Box<dyn std::error::Error>> {
let mut file = OpenOptions::new()
.create(true)
.append(true)
.open(file_path)?;

file.write_all(log_entry.as_bytes())?;
Ok(())
}
Loading