Skip to content

Commit 619532c

Browse files
committed
feat: Add function to calculate checksum and last word of a manually generated mnemonic
1 parent da090d2 commit 619532c

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed

src/lib.rs

+48
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,28 @@ impl Mnemonic {
529529
let (arr, len) = self.to_entropy_array();
530530
arr[0..len].to_vec()
531531
}
532+
533+
/// Calculates the final word (based on the checksum) of a manually generated mnemonic.
534+
/// There are multiple valid checksums, the first one (alphabetically) is picked.
535+
#[cfg(feature = "std")]
536+
pub fn finalize_mnemonic<'a, S: Into<Cow<'a, str>>>(s: S) -> Result<Mnemonic, Error> {
537+
let mut words = s.into();
538+
Mnemonic::normalize_utf8_cow(&mut words);
539+
let language = Mnemonic::language_of(&words)?;
540+
541+
for word in language.word_list() {
542+
let potential_mnemonic = format!("{} {}", words, word);
543+
match Mnemonic::parse_in_normalized(language, &potential_mnemonic) {
544+
Ok(mnemonic) => return Ok(mnemonic),
545+
Err(e) => match e {
546+
Error::InvalidChecksum => {}, // Keep searching.
547+
_ => return Err(e)
548+
}
549+
}
550+
}
551+
Err(Error::InvalidChecksum)
552+
}
553+
532554
}
533555

534556
impl fmt::Display for Mnemonic {
@@ -1023,4 +1045,30 @@ mod tests {
10231045
assert_eq!(seed, &mnemonic.to_seed(passphrase)[..], "failed vector: {}", mnemonic_str);
10241046
}
10251047
}
1048+
1049+
#[test]
1050+
fn test_finalize_mnemonic() {
1051+
let vectors = [
1052+
(
1053+
"ozone drill grab fiber curtain grace pudding thank cruise elder eight",
1054+
"about"
1055+
),
1056+
(
1057+
"light rule cinnamon wrap drastic word pride squirrel upgrade then income fatal apart sustain crack supply proud",
1058+
"access"
1059+
),
1060+
(
1061+
"hamster diagram private dutch cause delay private meat slide toddler razor book happy fancy gospel tennis maple dilemma loan word shrug inflict delay",
1062+
"balance"
1063+
),
1064+
(
1065+
"あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん あいこくしん",
1066+
"あおぞら"
1067+
)
1068+
];
1069+
1070+
for vector in &vectors {
1071+
assert_eq!(Mnemonic::parse(format!("{} {}", vector.0, vector.1)), Mnemonic::finalize_mnemonic(vector.0));
1072+
}
1073+
}
10261074
}

0 commit comments

Comments
 (0)