From a5069df94f80be97245aa0ab376018b7fe807697 Mon Sep 17 00:00:00 2001
From: Nicolas80 <nicolas.pmail@protonmail.com>
Date: Mon, 6 Jan 2025 14:44:46 +0100
Subject: [PATCH] Made an extra check of derivation path to make sure it's not
 linking to the same SS58 Address as "root" suri when doing `vault
 import|migrate`

---
 src/commands/vault.rs | 57 ++++++++++++++++++++++++++-----------------
 1 file changed, 35 insertions(+), 22 deletions(-)

diff --git a/src/commands/vault.rs b/src/commands/vault.rs
index 3a8b4f0..87db113 100644
--- a/src/commands/vault.rs
+++ b/src/commands/vault.rs
@@ -768,33 +768,46 @@ where
 	let encrypted_suri =
 		encrypt(root_secret_suri.as_bytes(), password.to_string()).map_err(|e| anyhow!(e))?;
 
-	let _root_account = vault_account::create_vault_account(
-		db,
-		&root_address,
-		map_secret_format_to_crypto_type(secret_format),
-		encrypted_suri,
-	)
-	.await?;
+	let crypto_type = map_secret_format_to_crypto_type(secret_format);
+
+	let _root_account =
+		vault_account::create_vault_account(db, &root_address, crypto_type, encrypted_suri).await?;
 
 	let derivation = if let Some(derivation_path) = derivation_path_opt {
-		// Root derivation
-		let _root_derivation =
-			vault_derivation::create_root_vault_derivation(db, &root_address, None).await?;
-
-		// Compute derivation !
-		let derivation = vault_derivation::ActiveModel {
-			address: Set(derivation_address.unwrap().clone()),
-			name: Set(name.cloned()),
-			path: Set(Some(derivation_path)),
-			root_address: Set(root_address.clone()),
-		};
-		let derivation = derivation.insert(db).await?;
-		println!("Created derivation {}", derivation);
-		derivation
+		let derivation_address = derivation_address.unwrap();
+
+		// Extra check of derivation path to make sure it's not linking to the same SS58 Address as root
+		if root_address == derivation_address {
+			println!("Derivation path provided:'{derivation_path}' linked to the same SS58 Address than the base suri without derivation");
+
+			let root_derivation =
+				vault_derivation::create_root_vault_derivation(db, &root_address, name).await?;
+
+			println!("For that reason only the base suri was imported");
+			println!("Created: {}", root_derivation);
+
+			root_derivation
+		} else {
+			let _root_derivation =
+				vault_derivation::create_root_vault_derivation(db, &root_address, None).await?;
+
+			// Compute derivation !
+			let derivation = vault_derivation::ActiveModel {
+				address: Set(derivation_address.clone()),
+				name: Set(name.cloned()),
+				path: Set(Some(derivation_path)),
+				root_address: Set(root_address.clone()),
+			};
+
+			let derivation = derivation.insert(db).await?;
+
+			println!("Created: {}", derivation);
+			derivation
+		}
 	} else {
 		let derivation =
 			vault_derivation::create_root_vault_derivation(db, &root_address, name).await?;
-		println!("Created derivation {}", derivation);
+		println!("Created: {}", derivation);
 		derivation
 	};
 
-- 
GitLab