diff --git a/src/commands/vault.rs b/src/commands/vault.rs
index d8e0bc0d0af946ae88a601d096059063979bfa53..14c376688f4f227e17eb7a89c981a0cedb4140eb 100644
--- a/src/commands/vault.rs
+++ b/src/commands/vault.rs
@@ -10,7 +10,7 @@ pub enum Subcommand {
 	List,
 	/// Show where vault stores secret
 	Where,
-	/// Generate new key (unimplemented)
+	/// Generate a mnemonic
 	Generate,
 	/// Import mnemonic with interactive prompt
 	Import,
@@ -58,33 +58,38 @@ pub fn handle_command(data: Data, command: Subcommand) -> Result<(), GcliError>
 			println!("{}", data.project_dir.data_dir().to_str().unwrap());
 		}
 		Subcommand::Generate => {
-			let mnemonic = bip39::Mnemonic::generate(12).unwrap(); // TODO allow word count
+			// TODO allow custom word count
+			let mnemonic = bip39::Mnemonic::generate(12).unwrap();
 			println!("{mnemonic}");
 		}
 		Subcommand::Import => {
-			// --- currently only support mnemonic secret
-			// get secret
-			let secret = rpassword::prompt_password("Mnemonic: ")?;
-			// check validity by deriving keypair
-			let keypair = pair_from_str(&secret)?;
-			// ask password to protect key
+			let mnemonic = rpassword::prompt_password("Mnemonic: ")?;
+			println!("Enter password to protect the key");
 			let password = rpassword::prompt_password("Password: ")?;
-			// write encrypted secret in file identitfied by pubkey
-			let path = data
-				.project_dir
-				.data_dir()
-				.join(keypair.public().to_string());
-			let mut file = std::fs::OpenOptions::new()
-				.create(true)
-				.write(true)
-				.open(path)?;
-			file.write_all(&encrypt(secret.as_bytes(), password).map_err(|e| anyhow!(e))?[..])?;
+			let address = store_mnemonic(&data, &mnemonic, password)?;
+			println!("Stored secret for {address}");
 		}
 	};
 
 	Ok(())
 }
 
+/// store mnemonic protected with password
+pub fn store_mnemonic(
+	data: &Data,
+	mnemonic: &str,
+	password: String,
+) -> Result<AccountId, GcliError> {
+	// check validity by deriving keypair
+	let keypair = pair_from_str(&mnemonic)?;
+	let address = keypair.public();
+	// write encrypted mnemonic in file identified by pubkey
+	let path = data.project_dir.data_dir().join(address.to_string());
+	let mut file = std::fs::File::create(path)?;
+	file.write_all(&encrypt(mnemonic.as_bytes(), password).map_err(|e| anyhow!(e))?[..])?;
+	Ok(keypair.public().into())
+}
+
 /// try get secret in keystore
 pub fn try_fetch_secret(data: &Data, address: AccountId) -> Result<Option<String>, GcliError> {
 	let path = data.project_dir.data_dir().join(address.to_string());