diff --git a/src/commands/smith.rs b/src/commands/smith.rs
index ab781512208b6c068ff49c56eb5f9ade1b91c204..0e64606f915f4dd5f9084f52a4079f3ceb181e72 100644
--- a/src/commands/smith.rs
+++ b/src/commands/smith.rs
@@ -198,7 +198,7 @@ pub async fn claim_smith_membership(data: &Data) -> Result<(), subxt::Error> {
 		.client()
 		.tx()
 		.sign_and_submit_then_watch(
-			&runtime::tx().smith_membership().claim_membership(), 
+			&runtime::tx().smith_membership().claim_membership(),
 			&PairSigner::new(data.keypair()),
 			BaseExtrinsicParamsBuilder::new(),
 		)
@@ -217,25 +217,10 @@ pub async fn claim_smith_membership(data: &Data) -> Result<(), subxt::Error> {
 
 /// renew smith membership
 pub async fn renew_smith_membership(data: &Data) -> Result<(), subxt::Error> {
-	let progress = data
-		.client()
-		.tx()
-		.sign_and_submit_then_watch(
-			&runtime::tx().smith_membership().renew_membership(), 
-			&PairSigner::new(data.keypair()),
-			BaseExtrinsicParamsBuilder::new(),
-		)
-		.await?;
-
-	if data.args.no_wait {
-		return Ok(());
-	}
-	let events = track_progress(progress).await?;
-	if let Some(e) = events.find_first::<runtime::smith_membership::events::MembershipRenewed>()? {
-		println!("{e:?}");
-	}
-
-	Ok(())
+	submit_call_and_look_event::<
+		runtime::smith_membership::events::MembershipRenewed,
+		StaticTxPayload< runtime::smith_membership::calls::RenewMembership>,
+	>(data, &runtime::tx().smith_membership().renew_membership()).await
 }
 
 /// submit go_offline
diff --git a/src/main.rs b/src/main.rs
index 030de860eb7cfd67bc1dc267c18936e61b174397..b976245d4cd83c916145e98da74b9883ee1433dc 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -16,7 +16,8 @@ use runtime_config::*;
 use serde::Deserialize;
 use sp_core::{sr25519::Pair, Pair as _};
 use subxt::blocks::ExtrinsicEvents;
-use subxt::tx::{BaseExtrinsicParamsBuilder, PairSigner, TxStatus};
+use subxt::events::StaticEvent;
+use subxt::tx::{BaseExtrinsicParamsBuilder, PairSigner, TxPayload, TxStatus, StaticTxPayload};
 use utils::*;
 
 /// define command line arguments
diff --git a/src/utils.rs b/src/utils.rs
index ca86c5a48c0bd186580c6e391b87e72feca4ab4f..4bfc80149e1281623d44c5f0c255c2fbd09cd89f 100644
--- a/src/utils.rs
+++ b/src/utils.rs
@@ -23,6 +23,32 @@ pub async fn track_progress(
 	.await
 }
 
+/// generic extrinsic submitter
+pub async fn submit_call_and_look_event<E: std::fmt::Debug + StaticEvent, Call: TxPayload>(
+	data: &Data,
+	call: &Call,
+) -> Result<(), subxt::Error> {
+	let progress = data
+		.client()
+		.tx()
+		.sign_and_submit_then_watch(
+			call,
+			&PairSigner::new(data.keypair()),
+			BaseExtrinsicParamsBuilder::new(),
+		)
+		.await?;
+
+	if data.args.no_wait {
+		return Ok(());
+	}
+	let events = track_progress(progress).await?;
+	if let Some(e) = events.find_first::<E>()? {
+		println!("{e:?}");
+	}
+
+	Ok(())
+}
+
 /// custom error type intended to provide more convenient error message to user
 #[derive(Debug)]
 pub enum GcliError {