From ab84bf89dad79650f05b685b3e55051d001085b6 Mon Sep 17 00:00:00 2001 From: James Wilson Date: Mon, 28 Jul 2025 14:11:11 +0100 Subject: [PATCH] Allow saving/storing the sr25519 mini secret key that we generated from a phrase --- signer/src/sr25519.rs | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/signer/src/sr25519.rs b/signer/src/sr25519.rs index d6acef9f3c..de99c90f06 100644 --- a/signer/src/sr25519.rs +++ b/signer/src/sr25519.rs @@ -104,6 +104,33 @@ impl Keypair { /// keypair.sign(b"Hello world!"); /// ``` pub fn from_phrase(mnemonic: &bip39::Mnemonic, password: Option<&str>) -> Result { + let seed = Self::secret_key_from_phrase(mnemonic, password)?; + Self::from_secret_key(seed) + } + + /// Create a 32 byte secret key from a BIP-39 mnemonic phrase and optional password. + /// This can then be used to create a keypair via [`Keypair::from_secret_key`]. + /// + /// Prefer [`Keypair::from_phrase`] to create a keypair directly from a phrase. Use this + /// when you need to store the secret key that we turn the phrase into. + /// + /// # Example + /// + /// ```rust,standalone_crate + /// use subxt_signer::{ bip39::Mnemonic, sr25519::Keypair }; + /// + /// let phrase = "bottom drive obey lake curtain smoke basket hold race lonely fit walk"; + /// let mnemonic = Mnemonic::parse(phrase).unwrap(); + /// + /// let secret_key = Keypair::secret_key_from_phrase(&mnemonic, None).unwrap(); + /// let keypair = Keypair::from_secret_key(secret_key).unwrap(); + /// + /// keypair.sign(b"Hello world!"); + /// ``` + pub fn secret_key_from_phrase( + mnemonic: &bip39::Mnemonic, + password: Option<&str>, + ) -> Result { let (arr, len) = mnemonic.to_entropy_array(); let big_seed = seed_from_entropy(&arr[0..len], password.unwrap_or("")).ok_or(Error::InvalidSeed)?; @@ -112,7 +139,7 @@ impl Keypair { .try_into() .expect("should be valid Seed"); - Self::from_secret_key(seed) + Ok(seed) } /// Turn a 32 byte secret key into a keypair.