From 44073020267415cef2663c6637e4aae939ec56c7 Mon Sep 17 00:00:00 2001
From: Nicolas80 <nicolas.pmail@protonmail.com>
Date: Sun, 23 Mar 2025 08:45:05 +0100
Subject: [PATCH] * Adding `-c` crypto scheme parameter (with default ed25519)
 in different places ** as global parameter (taken into account if `-S`
 parameter is given ** as extra parameter for identity.rs commands LinkAccount
 & ChangeOwnerKey *** Also added a simple display of "target" address and
 crypto-scheme when performing those commands

---
 src/commands/identity.rs | 26 ++++++++++++++++++++++----
 src/data.rs              |  6 +++++-
 src/keys.rs              |  9 +++++++++
 src/main.rs              |  9 ++++++---
 4 files changed, 42 insertions(+), 8 deletions(-)

diff --git a/src/commands/identity.rs b/src/commands/identity.rs
index 6a64121..5048f45 100644
--- a/src/commands/identity.rs
+++ b/src/commands/identity.rs
@@ -64,24 +64,30 @@ pub enum Subcommand {
 	MemberCount,
 	/// Link an account to the identity
 	LinkAccount {
-		/// Secret key format (seed, substrate)
+		/// Secret key format of account to link (seed, substrate)
 		#[clap(short = 'S', long, default_value = SecretFormat::Substrate)]
 		secret_format: SecretFormat,
 		/// Secret of account to link
 		/// most likely different from the one owning the identity
 		#[clap(short, long)]
 		secret: Option<String>,
+		/// Crypto scheme of account to link (sr25519, ed25519)
+		#[clap(short = 'c', long, required = false, default_value = CryptoScheme::Ed25519)]
+		crypto_scheme: CryptoScheme,
 	},
 	/// Migrate identity to another account
 	/// Change Owner Key
 	ChangeOwnerKey {
-		/// Secret key format (seed, substrate)
+		/// Secret key format of account to link (seed, substrate)
 		#[clap(short = 'S', long, default_value = SecretFormat::Substrate)]
 		secret_format: SecretFormat,
 		/// Secret of account to link
 		/// most likely different from the one owning the identity
 		#[clap(short, long)]
 		secret: Option<String>,
+		/// Crypto scheme of account to link (sr25519, ed25519)
+		#[clap(short = 'c', long, required = false, default_value = CryptoScheme::Ed25519)]
+		crypto_scheme: CryptoScheme,
 	},
 }
 
@@ -153,8 +159,14 @@ pub async fn handle_command(data: Data, command: Subcommand) -> Result<(), GcliE
 		Subcommand::LinkAccount {
 			secret_format,
 			secret,
+			crypto_scheme,
 		} => {
-			let keypair = get_keypair(secret_format, secret.as_deref(), None)?;
+			let keypair = get_keypair(secret_format, secret.as_deref(), Some(crypto_scheme))?;
+			println!(
+				"target address:'{}' (using crypto-scheme:{})",
+				keypair.address(),
+				<&'static str>::from(crypto_scheme)
+			);
 			let address = keypair.address();
 			data = data.fetch_idty_index().await?; // idty index required for payload
 			link_account(&data, address, keypair).await?;
@@ -162,8 +174,14 @@ pub async fn handle_command(data: Data, command: Subcommand) -> Result<(), GcliE
 		Subcommand::ChangeOwnerKey {
 			secret_format,
 			secret,
+			crypto_scheme,
 		} => {
-			let keypair = get_keypair(secret_format, secret.as_deref(), None)?;
+			let keypair = get_keypair(secret_format, secret.as_deref(), Some(crypto_scheme))?;
+			println!(
+				"target address:'{}' (using crypto-scheme:{})",
+				keypair.address(),
+				<&'static str>::from(crypto_scheme)
+			);
 			let address = keypair.address();
 			data = data.fetch_idty_index().await?; // idty index required for payload
 			change_owner_key(&data, address, keypair).await?;
diff --git a/src/data.rs b/src/data.rs
index 40f9918..c9aa7c9 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -207,7 +207,11 @@ impl Data {
 		}
 		// secret format and value
 		if let Some(secret_format) = self.args.secret_format {
-			let keypair = get_keypair(secret_format, self.args.secret.as_deref(), None)?;
+			let keypair = get_keypair(
+				secret_format,
+				self.args.secret.as_deref(),
+				Some(self.args.crypto_scheme),
+			)?;
 			self.cfg.address = Some(keypair.address());
 			self.keypair = Some(keypair);
 		}
diff --git a/src/keys.rs b/src/keys.rs
index 5ca4191..415b50f 100644
--- a/src/keys.rs
+++ b/src/keys.rs
@@ -62,6 +62,15 @@ pub enum CryptoScheme {
 	Sr25519,
 }
 
+/// Setting a default to Ed25519
+///
+/// required when used in Args struct inside main.rs; even though we still have to give a clap "default_value"
+impl Default for CryptoScheme {
+	fn default() -> Self {
+		CryptoScheme::Ed25519
+	}
+}
+
 impl FromStr for CryptoScheme {
 	type Err = std::io::Error;
 
diff --git a/src/main.rs b/src/main.rs
index 116552d..26a87da 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -46,13 +46,16 @@ pub struct Args {
 	/// Do not use indexer
 	#[clap(long)]
 	no_indexer: bool,
+	/// Secret key format (seed, substrate, g1v1)
+	#[clap(short = 'S', long)]
+	secret_format: Option<SecretFormat>,
 	/// Secret key or BIP39 mnemonic (only used when secret format is compatible)
 	/// (eventually followed by derivation path)
 	#[clap(short, long)]
 	secret: Option<String>,
-	/// Secret key format (seed, substrate, g1v1)
-	#[clap(short = 'S', long)]
-	secret_format: Option<SecretFormat>,
+	/// Crypto scheme to use (sr25519, ed25519)
+	#[clap(short = 'c', long, required = false, default_value = CryptoScheme::Ed25519)]
+	crypto_scheme: CryptoScheme,
 	/// SS58 Address
 	#[clap(short, conflicts_with = "name")]
 	address: Option<AccountId>,
-- 
GitLab