From 56ebb044394157d72926846e4c516c80f3621325 Mon Sep 17 00:00:00 2001
From: Hugo Trentesaux <hugo@trentesaux.fr>
Date: Wed, 17 Jan 2024 11:10:01 +0100
Subject: [PATCH] update to runtime 702

---
 res/metadata.scale            | Bin 133159 -> 128356 bytes
 src/commands/certification.rs |   8 +--
 src/commands/distance.rs      |  22 --------
 src/commands/expire.rs        |  46 ++--------------
 src/commands/identity.rs      |  28 ++--------
 src/commands/runtime.rs       |   6 +--
 src/commands/smith.rs         |  98 ----------------------------------
 src/commands/sudo.rs          |  10 +---
 src/display.rs                |  39 +-------------
 9 files changed, 20 insertions(+), 237 deletions(-)

diff --git a/res/metadata.scale b/res/metadata.scale
index 9b04918d2b88645a3e41c6d1ac9339d222188b2e..4f75555d61b51bfad4efd4f2d66048694ccefb78 100644
GIT binary patch
delta 17510
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

delta 19938
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

diff --git a/src/commands/certification.rs b/src/commands/certification.rs
index 1376b10..c1d2999 100644
--- a/src/commands/certification.rs
+++ b/src/commands/certification.rs
@@ -4,7 +4,9 @@ use crate::*;
 pub async fn certify(data: &Data, receiver: IdtyId) -> Result<(), anyhow::Error> {
 	let progress = submit_call(
 		data,
-		&runtime::tx().cert().add_cert(data.idty_index(), receiver),
+		&runtime::tx()
+			.certification()
+			.add_cert(data.idty_index(), receiver),
 	)
 	.await?;
 	if data.args.no_wait {
@@ -12,7 +14,7 @@ pub async fn certify(data: &Data, receiver: IdtyId) -> Result<(), anyhow::Error>
 	}
 	let events = track_progress(progress).await?;
 	// look for the expected event
-	look_event::<runtime::cert::events::NewCert>(data, &events)?;
-	look_event::<runtime::cert::events::RenewedCert>(data, &events)?;
+	look_event::<runtime::certification::events::CertAdded>(data, &events)?;
+	look_event::<runtime::certification::events::CertRenewed>(data, &events)?;
 	Ok(())
 }
diff --git a/src/commands/distance.rs b/src/commands/distance.rs
index 6eaaf4c..fb80955 100644
--- a/src/commands/distance.rs
+++ b/src/commands/distance.rs
@@ -13,25 +13,3 @@ pub async fn request_distance_evaluation(data: &Data) -> Result<(), subxt::Error
 	let _ = track_progress(progress).await?;
 	Ok(())
 }
-
-/// get identity distance status
-pub async fn get_identity_distance_status(
-	data: &Data,
-) -> Result<
-	Option<(
-		AccountId,
-		runtime::runtime_types::pallet_distance::types::DistanceStatus,
-	)>,
-	subxt::Error,
-> {
-	data.client()
-		.storage()
-		.at_latest()
-		.await?
-		.fetch(
-			&runtime::storage()
-				.distance()
-				.identity_distance_status(data.idty_index()),
-		)
-		.await
-}
diff --git a/src/commands/expire.rs b/src/commands/expire.rs
index f6b4963..d8f7bf0 100644
--- a/src/commands/expire.rs
+++ b/src/commands/expire.rs
@@ -33,7 +33,7 @@ pub async fn monitor_expirations(data: &Data, blocks: u32, _sessions: u32) -> an
 	let mut basic_certs_iter = client
 		.storage()
 		.at(parent_hash)
-		.iter(runtime::storage().cert().storage_certs_removable_on_iter())
+		.iter(runtime::storage().certification().certs_removable_on_iter())
 		.await?;
 	let mut basic_certs = BTreeMap::new();
 	while let Some(Ok((k, v))) = basic_certs_iter.next().await {
@@ -43,27 +43,7 @@ pub async fn monitor_expirations(data: &Data, blocks: u32, _sessions: u32) -> an
 		}
 	}
 
-	let mut smith_certs_iter = client
-		.storage()
-		.at(parent_hash)
-		.iter(
-			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),
-	] {
+	for (title, certs) in [("Certifications", basic_certs)] {
 		println!("\n{title}:");
 		for (blocks_left, certs) in certs {
 			println!("{blocks_left} blocks before expiration:");
@@ -102,27 +82,7 @@ pub async fn monitor_expirations(data: &Data, blocks: u32, _sessions: u32) -> an
 		}
 	}
 
-	let mut smith_membership_iter = client
-		.storage()
-		.at(parent_hash)
-		.iter(
-			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),
-	] {
+	for (title, memberships) in [("Memberships", basic_memberships)] {
 		println!("\n{title}:");
 		for (blocks_left, membership) in memberships {
 			println!("{blocks_left} blocks before expiration:");
diff --git a/src/commands/identity.rs b/src/commands/identity.rs
index fc4e7ba..9543c57 100644
--- a/src/commands/identity.rs
+++ b/src/commands/identity.rs
@@ -31,14 +31,9 @@ pub enum Subcommand {
 	///
 	/// To be called by the certified not-yet-member account, to become member.
 	Confirm { name: String },
-	/// Validate an identity
-	/// Should be called when the distance has been evaluated positively
-	Validate { index: IdtyId },
 	/// Request distance evaluation
 	/// make sure that it's ok otherwise currency is slashed
 	RequestDistanceEvaluation,
-	/// Get distance status
-	DistanceStatus,
 	/// Renew membership  
 	/// When membership comes to and end, it should be renewed for the identity to stay member
 	RenewMembership,
@@ -96,16 +91,9 @@ pub async fn handle_command(data: Data, command: Subcommand) -> Result<(), GcliE
 		Subcommand::Confirm { name } => {
 			confirm_identity(&data, name).await?;
 		}
-		Subcommand::Validate { index } => {
-			validate_identity(&data, index).await?;
-		}
 		Subcommand::RequestDistanceEvaluation => {
 			commands::distance::request_distance_evaluation(&data).await?;
 		}
-		Subcommand::DistanceStatus => {
-			data = data.fetch_idty_index().await?;
-			dbg!(commands::distance::get_identity_distance_status(&data).await?);
-		}
 		Subcommand::RenewMembership => {
 			renew_membership(&data).await?;
 		}
@@ -288,21 +276,15 @@ pub async fn confirm_identity(data: &Data, name: String) -> Result<(), subxt::Er
 	.await
 }
 
-/// confirm identity
-pub async fn validate_identity(data: &Data, index: IdtyId) -> Result<(), subxt::Error> {
-	submit_call_and_look_event::<
-		runtime::identity::events::IdtyValidated,
-		Payload<runtime::identity::calls::types::ValidateIdentity>,
-	>(data, &runtime::tx().identity().validate_identity(index))
-	.await
-}
-
 /// renew membership
 pub async fn renew_membership(data: &Data) -> Result<(), subxt::Error> {
 	submit_call_and_look_event::<
 		runtime::membership::events::MembershipRenewed,
-		Payload<runtime::membership::calls::types::RenewMembership>,
-	>(data, &runtime::tx().membership().renew_membership())
+		Payload<runtime::distance::calls::types::RequestDistanceEvaluation>,
+	>(
+		data,
+		&runtime::tx().distance().request_distance_evaluation(),
+	)
 	.await
 }
 
diff --git a/src/commands/runtime.rs b/src/commands/runtime.rs
index 2f51e6f..afed9ab 100644
--- a/src/commands/runtime.rs
+++ b/src/commands/runtime.rs
@@ -6,15 +6,15 @@ pub async fn runtime_info(data: Data) {
 	// certifications
 	let cert_period = api
 		.constants()
-		.at(&runtime::constants().cert().cert_period())
+		.at(&runtime::constants().certification().cert_period())
 		.unwrap();
 	let max_by_issuer = api
 		.constants()
-		.at(&runtime::constants().cert().max_by_issuer())
+		.at(&runtime::constants().certification().max_by_issuer())
 		.unwrap();
 	let validity_period = api
 		.constants()
-		.at(&runtime::constants().cert().validity_period())
+		.at(&runtime::constants().certification().validity_period())
 		.unwrap();
 
 	println!("certification period: {cert_period} blocks");
diff --git a/src/commands/smith.rs b/src/commands/smith.rs
index efd32d4..2009d3c 100644
--- a/src/commands/smith.rs
+++ b/src/commands/smith.rs
@@ -36,16 +36,6 @@ fn session_keys_decode(session_keys: SessionKeys) -> RuntimeSessionKeys {
 /// define smith subcommands
 #[derive(Clone, Default, Debug, clap::Parser)]
 pub enum Subcommand {
-	/// Request smith membership
-	Request,
-	/// Emit a smith certification
-	Cert { to: IdtyId },
-	/// Claim smith membership
-	Claim,
-	/// Renew smith membership
-	Renew,
-	/// Revoke smith membership
-	Revoke,
 	/// go online
 	GoOnline,
 	/// go offline
@@ -66,36 +56,18 @@ pub enum Subcommand {
 	},
 	/// List online authorities
 	ShowOnline,
-	/// count of smith member
-	MemberCount,
 }
 
 /// handle smith commands
 pub async fn handle_command(data: Data, command: Subcommand) -> Result<(), GcliError> {
 	let mut data = data.build_client().await?;
 	match command {
-		Subcommand::Request => {
-			request_smith_membership(&data).await?;
-		}
-		Subcommand::Claim => {
-			claim_smith_membership(&data).await?;
-		}
-		Subcommand::Renew => {
-			renew_smith_membership(&data).await?;
-		}
-		Subcommand::Revoke => {
-			revoke_smith_membership(&data).await?;
-		}
 		Subcommand::GoOnline => {
 			go_online(&data).await?;
 		}
 		Subcommand::GoOffline => {
 			go_offline(&data).await?;
 		}
-		Subcommand::Cert { to } => {
-			data = data.fetch_idty_index().await?;
-			cert(&data, to).await?
-		}
 		Subcommand::UpdateKeys => {
 			update_session_keys(&data).await?;
 		}
@@ -116,21 +88,6 @@ pub async fn handle_command(data: Data, command: Subcommand) -> Result<(), GcliE
 			data = data.build_client().await?;
 			online(&data).await?
 		}
-		Subcommand::MemberCount => {
-			println!(
-				"smith member count: {:?}",
-				data.client()
-					.storage()
-					.at_latest()
-					.await?
-					.fetch(
-						&runtime::storage()
-							.smith_membership()
-							.counter_for_membership(),
-					)
-					.await?
-			)
-		}
 	};
 
 	Ok(())
@@ -154,15 +111,6 @@ pub async fn rotate_keys(data: &Data) -> Result<SessionKeys, anyhow::Error> {
 		.map_err(|e| anyhow!("Session keys have wrong length: {:?}", e))
 }
 
-/// request smith membership
-pub async fn request_smith_membership(data: &Data) -> Result<(), subxt::Error> {
-	submit_call_and_look_event::<
-		runtime::smith_membership::events::MembershipRequested,
-		Payload<runtime::smith_membership::calls::types::RequestMembership>,
-	>(data, &runtime::tx().smith_membership().request_membership())
-	.await
-}
-
 /// set session keys
 pub async fn set_session_keys(
 	data: &Data,
@@ -217,33 +165,6 @@ pub async fn go_online(data: &Data) -> Result<(), GcliError> {
 	.map_err(|e| e.into())
 }
 
-/// claim smith membership
-pub async fn claim_smith_membership(data: &Data) -> Result<(), subxt::Error> {
-	submit_call_and_look_event::<
-		runtime::smith_membership::events::MembershipAcquired,
-		Payload<runtime::smith_membership::calls::types::ClaimMembership>,
-	>(data, &runtime::tx().smith_membership().claim_membership())
-	.await
-}
-
-/// renew smith membership
-pub async fn renew_smith_membership(data: &Data) -> Result<(), subxt::Error> {
-	submit_call_and_look_event::<
-		runtime::smith_membership::events::MembershipRenewed,
-		Payload<runtime::smith_membership::calls::types::RenewMembership>,
-	>(data, &runtime::tx().smith_membership().renew_membership())
-	.await
-}
-
-/// revoke smith membership
-pub async fn revoke_smith_membership(data: &Data) -> Result<(), subxt::Error> {
-	submit_call_and_look_event::<
-		runtime::smith_membership::events::MembershipRevoked,
-		Payload<runtime::smith_membership::calls::types::RevokeMembership>,
-	>(data, &runtime::tx().smith_membership().revoke_membership())
-	.await
-}
-
 /// submit go_offline
 pub async fn go_offline(data: &Data) -> Result<(), subxt::Error> {
 	submit_call_and_look_event::<
@@ -333,22 +254,3 @@ pub async fn online(data: &Data) -> Result<(), anyhow::Error> {
 
 	Ok(())
 }
-
-/// submit a smith certification and track progress
-pub async fn cert(data: &Data, receiver: IdtyId) -> Result<(), anyhow::Error> {
-	let progress = submit_call(
-		data,
-		&runtime::tx()
-			.smith_cert()
-			.add_cert(data.idty_index(), receiver),
-	)
-	.await?;
-	if data.args.no_wait {
-		return Ok(());
-	}
-	let events = track_progress(progress).await?;
-	// look for the expected event
-	look_event::<runtime::smith_cert::events::NewCert>(data, &events)?;
-	look_event::<runtime::smith_cert::events::RenewedCert>(data, &events)?;
-	Ok(())
-}
diff --git a/src/commands/sudo.rs b/src/commands/sudo.rs
index b9fce46..5c172b1 100644
--- a/src/commands/sudo.rs
+++ b/src/commands/sudo.rs
@@ -9,7 +9,7 @@ pub enum Subcommand {
 	Nothing,
 	/// set sudo keys
 	SetKey { new_key: AccountId },
-	/// force set distance status to DistanceStatus::Valid
+	/// force valid distance status
 	SetDistanceOk { identity: IdtyId },
 }
 
@@ -40,13 +40,7 @@ pub async fn set_key(data: &Data, new_key: AccountId) -> Result<(), subxt::Error
 
 /// set distance ok
 pub async fn set_distance_ok(data: &Data, identity: IdtyId) -> Result<(), subxt::Error> {
-	let inner = runtime::distance::Call::force_set_distance_status {
-		identity,
-		status: Some((
-			data.address(),
-			runtime::runtime_types::pallet_distance::types::DistanceStatus::Valid,
-		)),
-	};
+	let inner = runtime::distance::Call::force_valid_distance_status { identity };
 	let inner = runtime::Call::Distance(inner);
 	submit_call_and_look_event::<
 		runtime::sudo::events::Sudid,
diff --git a/src/display.rs b/src/display.rs
index 3320ab4..bcfb3e9 100644
--- a/src/display.rs
+++ b/src/display.rs
@@ -14,26 +14,16 @@ impl DisplayEvent for runtime::universal_dividend::events::UdsClaimed {
 		)
 	}
 }
-impl DisplayEvent for runtime::cert::events::NewCert {
+impl DisplayEvent for runtime::certification::events::CertAdded {
 	fn display(&self, _data: &Data) -> String {
 		format!("new certification {} → {}", self.issuer, self.receiver)
 	}
 }
-impl DisplayEvent for runtime::cert::events::RenewedCert {
+impl DisplayEvent for runtime::certification::events::CertRenewed {
 	fn display(&self, _data: &Data) -> String {
 		format!("renewed cert {:?}", self)
 	}
 }
-impl DisplayEvent for runtime::smith_cert::events::NewCert {
-	fn display(&self, _data: &Data) -> String {
-		format!("certified as smith {:?}", self)
-	}
-}
-impl DisplayEvent for runtime::smith_cert::events::RenewedCert {
-	fn display(&self, _data: &Data) -> String {
-		format!("renewed smith cert {:?}", self)
-	}
-}
 impl DisplayEvent for runtime::account::events::AccountUnlinked {
 	fn display(&self, _data: &Data) -> String {
 		format!("account unlinked: {}", self.0)
@@ -60,11 +50,6 @@ impl DisplayEvent for runtime::identity::events::IdtyConfirmed {
 		)
 	}
 }
-impl DisplayEvent for runtime::identity::events::IdtyValidated {
-	fn display(&self, _data: &Data) -> String {
-		format!("identity validated {:?}", self)
-	}
-}
 impl DisplayEvent for runtime::identity::events::IdtyChangedOwnerKey {
 	fn display(&self, _data: &Data) -> String {
 		format!("identity changed owner key {:?}", self)
@@ -95,31 +80,11 @@ impl DisplayEvent for runtime::oneshot_account::events::OneshotAccountConsumed {
 		format!("oneshot {:?}", self)
 	}
 }
-impl DisplayEvent for runtime::smith_membership::events::MembershipRequested {
-	fn display(&self, _data: &Data) -> String {
-		format!("smith membership requested {:?}", self)
-	}
-}
 impl DisplayEvent for runtime::authority_members::events::MemberGoOnline {
 	fn display(&self, _data: &Data) -> String {
 		format!("smith went online {:?}", self)
 	}
 }
-impl DisplayEvent for runtime::smith_membership::events::MembershipAcquired {
-	fn display(&self, _data: &Data) -> String {
-		format!("smith membership aquired {:?}", self)
-	}
-}
-impl DisplayEvent for runtime::smith_membership::events::MembershipRenewed {
-	fn display(&self, _data: &Data) -> String {
-		format!("smith membership renewed {:?}", self)
-	}
-}
-impl DisplayEvent for runtime::smith_membership::events::MembershipRevoked {
-	fn display(&self, _data: &Data) -> String {
-		format!("smith membership revoked {:?}", self)
-	}
-}
 impl DisplayEvent for runtime::authority_members::events::MemberGoOffline {
 	fn display(&self, _data: &Data) -> String {
 		format!("smith went offline {:?}", self)
-- 
GitLab