diff --git a/Cargo.lock b/Cargo.lock
index bf733b0628ac0a901b6b492157c3392d1886b540..574da92f88e7db3c3553940fb9ea5aac907bbef5 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2126,7 +2126,7 @@ dependencies = [
 
 [[package]]
 name = "gcli"
-version = "0.2.17"
+version = "0.3.0"
 dependencies = [
  "age",
  "anyhow",
diff --git a/Cargo.toml b/Cargo.toml
index b9ae0651794cb5f524643be27f213ba42eaecd98..efb44d96ed58cc9219aab4555ee455e0933340ab 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -10,7 +10,7 @@ license = "AGPL-3.0-only"
 name = "gcli"
 repository = "https://git.duniter.org/clients/rust/gcli-v2s"
 description = "A command-line interface for Duniter v2s uses"
-version = "0.2.17"
+version = "0.3.0"
 
 [dependencies]
 # subxt is main dependency
diff --git a/res/metadata.scale b/res/metadata.scale
index 2166a0563e80550fe7bb592b6b5968490ce3f0e4..b07fd7c46c6a13f9ba446759aedec32d6521d1b4 100644
Binary files a/res/metadata.scale and b/res/metadata.scale differ
diff --git a/src/commands/identity.rs b/src/commands/identity.rs
index e3463c751a6780d190ac16947b6125d8646596c7..0d8bfc895343cf6e7a20025a02d40a5ba264256b 100644
--- a/src/commands/identity.rs
+++ b/src/commands/identity.rs
@@ -491,9 +491,8 @@ pub async fn revoke_identity(data: &Data) -> Result<(), subxt::Error> {
 	let (_payload, signature) = generate_revoc_doc(data);
 
 	// Transform signature to MultiSignature
-	// TODO: this is a hack, we should be able to use the signature directly
-	let signature = runtime::runtime_types::sp_core::sr25519::Signature(signature.0);
-	let multisign = MultiSignature::Sr25519(signature);
+	// TODO: allow other signature formats
+	let multisign = MultiSignature::Sr25519(signature.into());
 
 	submit_call_and_look_event::<
 		runtime::identity::events::IdtyRemoved,
@@ -562,15 +561,10 @@ pub async fn link_account(
 ) -> Result<(), subxt::Error> {
 	let (_payload, signature) = generate_link_account(data, address.clone(), keypair);
 
-	// this is a hack, see
-	// https://substrate.stackexchange.com/questions/10309/how-to-use-core-crypto-types-instead-of-runtime-types
+	// TODO cleaner way to manage signature
 	let signature = match signature {
-		Signature::Sr25519(signature) => MultiSignature::Sr25519(
-			runtime::runtime_types::sp_core::sr25519::Signature(signature.0),
-		),
-		Signature::Nacl(signature) => MultiSignature::Ed25519(
-			runtime::runtime_types::sp_core::ed25519::Signature(signature.try_into().unwrap()),
-		),
+		Signature::Sr25519(signature) => MultiSignature::Sr25519(signature.into()),
+		Signature::Nacl(signature) => MultiSignature::Ed25519(signature.try_into().unwrap()),
 	};
 
 	submit_call_and_look_event::<
@@ -591,15 +585,10 @@ pub async fn change_owner_key(
 ) -> Result<(), subxt::Error> {
 	let (_payload, signature) = generate_chok_payload(data, address.clone(), keypair);
 
-	// this is a hack, see
-	// https://substrate.stackexchange.com/questions/10309/how-to-use-core-crypto-types-instead-of-runtime-types
+	// TODO cleaner way to manage signature
 	let signature = match signature {
-		Signature::Sr25519(signature) => MultiSignature::Sr25519(
-			runtime::runtime_types::sp_core::sr25519::Signature(signature.0),
-		),
-		Signature::Nacl(signature) => MultiSignature::Ed25519(
-			runtime::runtime_types::sp_core::ed25519::Signature(signature.try_into().unwrap()),
-		),
+		Signature::Sr25519(signature) => MultiSignature::Sr25519(signature.into()),
+		Signature::Nacl(signature) => MultiSignature::Ed25519(signature.try_into().unwrap()),
 	};
 
 	submit_call_and_look_event::<
diff --git a/src/commands/runtime.rs b/src/commands/runtime.rs
index 1463142687fd77fd8d19dc60cd707f6841cc285f..d71b1021860cdc73e9557db8d7afa958d9e05c1a 100644
--- a/src/commands/runtime.rs
+++ b/src/commands/runtime.rs
@@ -143,10 +143,6 @@ pub async fn runtime_info(data: Data) {
 		"UD reeval period: {}",
 		getu64(consts.universal_dividend().ud_reeval_period())
 	);
-	println!(
-		"units per ud: {}",
-		getf(consts.universal_dividend().units_per_ud())
-	);
 	// todo treasury, technical committee, transaction payment, authority members
 	// consts.system().ss58_prefix()
 }
diff --git a/src/commands/smith.rs b/src/commands/smith.rs
index fd3196374f5b56d7caf51498a3a1fac6c07ebb25..21e243f812a9747f2a54ab4cff935254399cd991 100644
--- a/src/commands/smith.rs
+++ b/src/commands/smith.rs
@@ -13,24 +13,16 @@ type SessionKeys = [u8; 128];
 fn session_keys_decode(session_keys: SessionKeys) -> RuntimeSessionKeys {
 	RuntimeSessionKeys {
 		grandpa: runtime::runtime_types::sp_consensus_grandpa::app::Public(
-			runtime::runtime_types::sp_core::ed25519::Public(
-				session_keys[0..32].try_into().unwrap(),
-			),
+			session_keys[0..32].try_into().unwrap(),
 		),
 		babe: runtime::runtime_types::sp_consensus_babe::app::Public(
-			runtime::runtime_types::sp_core::sr25519::Public(
-				session_keys[32..64].try_into().unwrap(),
-			),
+			session_keys[32..64].try_into().unwrap(),
 		),
 		im_online: runtime::runtime_types::pallet_im_online::sr25519::app_sr25519::Public(
-			runtime::runtime_types::sp_core::sr25519::Public(
-				session_keys[64..96].try_into().unwrap(),
-			),
+			session_keys[64..96].try_into().unwrap(),
 		),
 		authority_discovery: runtime::runtime_types::sp_authority_discovery::app::Public(
-			runtime::runtime_types::sp_core::sr25519::Public(
-				session_keys[96..128].try_into().unwrap(),
-			),
+			session_keys[96..128].try_into().unwrap(),
 		),
 	}
 }