Skip to content
Snippets Groups Projects
expire.rs 3.79 KiB
Newer Older
Hugo Trentesaux's avatar
Hugo Trentesaux committed
use crate::*;

use futures::join;
use std::collections::BTreeMap;

pub async fn monitor_expirations(data: &Data, blocks: u32, _sessions: u32) -> anyhow::Result<()> {
	let client = data.client();
	let indexer = data.indexer.clone();
	let parent_hash = client
		.storage()
		.at_latest()
		.await?
		.fetch(&runtime::storage().system().parent_hash())
		.await?
		.unwrap();
Hugo Trentesaux's avatar
Hugo Trentesaux committed
	let addr_current_block = runtime::storage().system().number();
	let addr_current_session = runtime::storage().session().current_index();
	let (current_block, _current_session) = join!(
		client.storage().at(parent_hash).fetch(&addr_current_block),
		client
			.storage()
			.at(parent_hash)
			.fetch(&addr_current_session)
	let current_block = current_block?.unwrap_or_default();
	let end_block = current_block + blocks;
	let mut identity_cache = cache::IdentityCache::new(client.clone(), indexer);
	// Certifications
	let mut basic_certs_iter = client
		.storage()
		.at(parent_hash)
		.iter(runtime::storage().cert().storage_certs_removable_on_iter())
		.await?;
	let mut basic_certs = BTreeMap::new();
	while let Some(Ok((k, v))) = basic_certs_iter.next().await {
		let block_number = BlockNumber::from_le_bytes(k[40..44].try_into().unwrap());
		if block_number < end_block {
			basic_certs.insert(block_number - current_block, v);
		}
	}
	let mut smith_certs_iter = client
		.storage()
		.at(parent_hash)
		.iter(
Hugo Trentesaux's avatar
Hugo Trentesaux committed
			runtime::storage()
				.smith_cert()
				.storage_certs_removable_on_iter(),
		)
		.await?;
	let mut smith_certs = BTreeMap::new();
	while let Some(Ok((k, v))) = smith_certs_iter.next().await {
		let block_number = BlockNumber::from_le_bytes(k[40..44].try_into().unwrap());
		if block_number < end_block {
			smith_certs.insert(block_number - current_block, v);
		}
	}
	for (title, certs) in [
		("Certifications", basic_certs),
		("Smith certifications", smith_certs),
	] {
		println!("\n{title}:");
		for (blocks_left, certs) in certs {
			println!("{blocks_left} blocks before expiration:");
			for (issuer_id, receiver_id) in certs {
				println!(
					"  {} ({}) -> {} ({})",
					identity_cache
						.fetch_identity(issuer_id, parent_hash)
						.await
						.unwrap_or_else(|_| "?".into()),
					issuer_id,
					identity_cache
						.fetch_identity(receiver_id, parent_hash)
						.await
						.unwrap_or_else(|_| "?".into()),
					receiver_id,
				);
			}
		}
	}
	// Memberships
	let mut basic_membership_iter = client
		.storage()
		.at(parent_hash)
		.iter(runtime::storage().membership().memberships_expire_on_iter())
		.await?;
	let mut basic_memberships = BTreeMap::new();
	while let Some(Ok((k, v))) = basic_membership_iter.next().await {
		let block_number = BlockNumber::from_le_bytes(k[40..44].try_into().unwrap());
		if block_number < end_block {
			if block_number < current_block {
				dbg!((block_number, current_block));
			}
			basic_memberships.insert(block_number - current_block, v);
		}
	}
	let mut smith_membership_iter = client
		.storage()
		.at(parent_hash)
		.iter(
Hugo Trentesaux's avatar
Hugo Trentesaux committed
			runtime::storage()
				.smith_membership()
				.memberships_expire_on_iter(),
		)
		.await?;
	let mut smith_memberships = BTreeMap::new();
	while let Some(Ok((k, v))) = smith_membership_iter.next().await {
		let block_number = BlockNumber::from_le_bytes(k[40..44].try_into().unwrap());
		if block_number < end_block {
			smith_memberships.insert(block_number - current_block, v);
		}
	}
	for (title, memberships) in [
		("Memberships", basic_memberships),
		("Smith memberships", smith_memberships),
	] {
		println!("\n{title}:");
		for (blocks_left, membership) in memberships {
			println!("{blocks_left} blocks before expiration:");
			for identity_id in membership {
				println!(
					"  {} ({})",
					identity_cache
						.fetch_identity(identity_id, parent_hash)
						.await
						.unwrap_or_else(|_| "?".into()),
					identity_id,
				);
			}
		}
	}
	Ok(())