diff --git a/src/commands/certification.rs b/src/commands/certification.rs
index 69a2f11eb4f81d2e21471497d0e3ae47b2b3a17b..366b85321933feff3a61bc7c552476eb5611712d 100644
--- a/src/commands/certification.rs
+++ b/src/commands/certification.rs
@@ -2,31 +2,17 @@ use crate::*;
 
 /// submit a certification and track progress
 pub async fn certify(data: &Data, receiver: u32) -> Result<(), anyhow::Error> {
-	let progress = data
-		.client()
-		.tx()
-		.sign_and_submit_then_watch(
-			&runtime::tx().cert().add_cert(data.idty_index(), receiver),
-			&PairSigner::new(data.keypair()),
-			BaseExtrinsicParamsBuilder::new(),
-		)
-		.await?;
-
+	let progress = submit_call(
+		data,
+		&runtime::tx().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
-	let new_cert_event = events.find_first::<runtime::cert::events::NewCert>()?;
-	let renew_cert_event = events.find_first::<runtime::cert::events::RenewedCert>()?;
-
-	if let Some(event) = new_cert_event {
-		println!("{event:?}");
-	}
-	if let Some(event) = renew_cert_event {
-		println!("{event:?}");
-	}
-
+	look_event::<runtime::cert::events::NewCert>(&events)?;
+	look_event::<runtime::cert::events::RenewedCert>(&events)?;
 	Ok(())
 }
diff --git a/src/commands/identity.rs b/src/commands/identity.rs
index b361755c51e571302d7315d91686724a5bb09ba0..6c008b596a51c428fef3206fb0548577731f9ff1 100644
--- a/src/commands/identity.rs
+++ b/src/commands/identity.rs
@@ -283,7 +283,7 @@ pub fn generate_link_account(
 
 /// link an account to the identity
 pub async fn link_account(data: &Data, address: AccountId) -> Result<(), subxt::Error> {
-	let (_payload, signature) = generate_link_account(&data, address.clone());
+	let (_payload, signature) = generate_link_account(data, address.clone());
 
 	// this is a hack, see
 	// https://substrate.stackexchange.com/questions/10309/how-to-use-core-crypto-types-instead-of-runtime-types
diff --git a/src/runtime_config.rs b/src/runtime_config.rs
index f0eff326e055c05bfad520b2ab9ffe7a5209b436..509c78551328ac90d72f713fe39f868bbfeb096b 100644
--- a/src/runtime_config.rs
+++ b/src/runtime_config.rs
@@ -1,3 +1,4 @@
+// #[allow(clippy::enum_variant_names)]
 #[cfg(feature = "gdev")]
 #[subxt::subxt(
 	runtime_metadata_path = "res/metadata.scale",
diff --git a/src/utils.rs b/src/utils.rs
index 4bfc80149e1281623d44c5f0c255c2fbd09cd89f..d3077f78708fde761f038ac5b6bcb05613dcf235 100644
--- a/src/utils.rs
+++ b/src/utils.rs
@@ -28,24 +28,40 @@ pub async fn submit_call_and_look_event<E: std::fmt::Debug + StaticEvent, Call:
 	data: &Data,
 	call: &Call,
 ) -> Result<(), subxt::Error> {
-	let progress = data
-		.client()
+	// submit call
+	let progress = submit_call(data, call).await?;
+	// if no wait, return immediately
+	if data.args.no_wait {
+		return Ok(());
+	}
+	// collect events
+	let events = track_progress(progress).await?;
+	// print given event if there
+	look_event::<E>(&events)
+}
+
+/// submit call
+pub async fn submit_call<Call: TxPayload>(
+	data: &Data,
+	call: &Call,
+) -> Result<TxProgress, subxt::Error> {
+	data.client()
 		.tx()
 		.sign_and_submit_then_watch(
 			call,
 			&PairSigner::new(data.keypair()),
 			BaseExtrinsicParamsBuilder::new(),
 		)
-		.await?;
+		.await
+}
 
-	if data.args.no_wait {
-		return Ok(());
-	}
-	let events = track_progress(progress).await?;
+/// look event
+pub fn look_event<E: std::fmt::Debug + StaticEvent>(
+	events: &ExtrinsicEvents<Runtime>,
+) -> Result<(), subxt::Error> {
 	if let Some(e) = events.find_first::<E>()? {
 		println!("{e:?}");
 	}
-
 	Ok(())
 }