BIP39 mnemonic phrase operations providing comprehensive functionality for generating, validating, and converting between mnemonic phrases, entropy, and cryptographic seeds.
Converts BIP39 mnemonic phrases to cryptographic seeds using PBKDF2 derivation.
/**
* Convert mnemonic phrase to seed using PBKDF2
* @param mnemonic - BIP39 mnemonic phrase
* @param password - Optional passphrase (defaults to empty string)
* @returns 64-byte seed as hex string
*/
function mnemonicToSeed(mnemonic: string, password?: string): string;Usage Examples:
import { mnemonicToSeed } from "@ethersproject/hdnode";
const mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about";
// Basic seed generation
const seed = mnemonicToSeed(mnemonic);
console.log("Seed:", seed); // 64-byte hex string
// Seed with passphrase
const seedWithPassword = mnemonicToSeed(mnemonic, "mypassword");
console.log("Protected seed:", seedWithPassword);
// Seeds are deterministic - same mnemonic + password = same seed
const seed2 = mnemonicToSeed(mnemonic, "mypassword");
console.log("Seeds match:", seed2 === seedWithPassword); // trueConverts BIP39 mnemonic phrases to their underlying entropy bytes.
/**
* Convert mnemonic phrase to entropy bytes
* @param mnemonic - BIP39 mnemonic phrase
* @param wordlist - Optional wordlist for validation (defaults to English)
* @returns Entropy as hex string
*/
function mnemonicToEntropy(mnemonic: string, wordlist?: string | Wordlist): string;Usage Examples:
import { mnemonicToEntropy } from "@ethersproject/hdnode";
const mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about";
// Convert to entropy
const entropy = mnemonicToEntropy(mnemonic);
console.log("Entropy:", entropy); // 16-byte hex string for 12-word mnemonic
// With specific wordlist
const entropyJapanese = mnemonicToEntropy(japaneseMnemonic, "ja");
console.log("Japanese entropy:", entropyJapanese);Converts entropy bytes to BIP39 mnemonic phrases with checksum validation.
/**
* Convert entropy bytes to mnemonic phrase
* @param entropy - Entropy bytes (16-32 bytes)
* @param wordlist - Optional wordlist for phrase generation (defaults to English)
* @returns BIP39 mnemonic phrase
*/
function entropyToMnemonic(entropy: BytesLike, wordlist?: string | Wordlist): string;Usage Examples:
import { entropyToMnemonic } from "@ethersproject/hdnode";
// Generate mnemonic from entropy
const entropy = "0x6d4b8d3c2fa45d9b7e4f8c0b1a5e7d2c"; // 16 bytes = 12 words
const mnemonic = entropyToMnemonic(entropy);
console.log("Generated mnemonic:", mnemonic);
// With different wordlist
const frenchMnemonic = entropyToMnemonic(entropy, "fr");
console.log("French mnemonic:", frenchMnemonic);
// Different entropy lengths produce different mnemonic lengths
const entropy24 = "0x6d4b8d3c2fa45d9b7e4f8c0b1a5e7d2c9f8e7d6c5b4a3928"; // 24 bytes = 18 words
const mnemonic18 = entropyToMnemonic(entropy24);
console.log("18-word mnemonic:", mnemonic18);Validates BIP39 mnemonic phrases for correctness including checksum verification.
/**
* Validate if a mnemonic phrase is valid
* @param mnemonic - Mnemonic phrase to validate
* @param wordlist - Optional wordlist for validation (defaults to English)
* @returns true if mnemonic is valid, false otherwise
*/
function isValidMnemonic(mnemonic: string, wordlist?: Wordlist): boolean;Usage Examples:
import { isValidMnemonic } from "@ethersproject/hdnode";
// Valid mnemonic
const validMnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about";
console.log("Valid:", isValidMnemonic(validMnemonic)); // true
// Invalid checksum
const invalidChecksum = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon";
console.log("Invalid checksum:", isValidMnemonic(invalidChecksum)); // false
// Wrong length
const tooShort = "abandon abandon abandon abandon";
console.log("Too short:", isValidMnemonic(tooShort)); // false
// Unknown words
const unknownWords = "invalid words that do not exist in wordlist";
console.log("Unknown words:", isValidMnemonic(unknownWords)); // false
// Case insensitive validation
const upperCase = "ABANDON ABANDON ABANDON ABANDON ABANDON ABANDON ABANDON ABANDON ABANDON ABANDON ABANDON ABOUT";
console.log("Case insensitive:", isValidMnemonic(upperCase)); // trueBIP39 defines specific relationships between entropy length and mnemonic word count:
| Entropy Length | Mnemonic Length | Security Level |
|---|---|---|
| 16 bytes (128 bits) | 12 words | Standard |
| 20 bytes (160 bits) | 15 words | Enhanced |
| 24 bytes (192 bits) | 18 words | High |
| 28 bytes (224 bits) | 21 words | Very High |
| 32 bytes (256 bits) | 24 words | Maximum |
Examples:
import { entropyToMnemonic, mnemonicToEntropy } from "@ethersproject/hdnode";
// 12-word mnemonic (128-bit entropy)
const entropy128 = "0x" + "00".repeat(16); // 16 bytes
const mnemonic12 = entropyToMnemonic(entropy128);
console.log("12 words:", mnemonic12.split(" ").length); // 12
// 24-word mnemonic (256-bit entropy)
const entropy256 = "0x" + "00".repeat(32); // 32 bytes
const mnemonic24 = entropyToMnemonic(entropy256);
console.log("24 words:", mnemonic24.split(" ").length); // 24
// Round-trip conversion
const recoveredEntropy = mnemonicToEntropy(mnemonic24);
console.log("Entropy matches:", entropy256 === recoveredEntropy); // trueThe library supports multiple BIP39 wordlists for different languages:
import { wordlists } from "@ethersproject/wordlists";
// Available wordlists
const availableLanguages = Object.keys(wordlists);
console.log("Supported languages:", availableLanguages);
// ["en", "ja", "zh_cn", "zh_tw", "fr", "it", "ko", "es"]
// Using specific wordlists
const englishMnemonic = entropyToMnemonic(entropy, wordlists.en);
const japaneseMnemonic = entropyToMnemonic(entropy, wordlists.ja);
const frenchMnemonic = entropyToMnemonic(entropy, wordlists.fr);Mnemonic operations throw errors in the following situations:
Error Handling Examples:
import { mnemonicToEntropy, entropyToMnemonic, isValidMnemonic } from "@ethersproject/hdnode";
// Check validity before conversion
const userMnemonic = "user provided mnemonic phrase";
if (isValidMnemonic(userMnemonic)) {
const entropy = mnemonicToEntropy(userMnemonic);
console.log("Valid mnemonic converted to entropy");
} else {
console.log("Invalid mnemonic provided");
}
// Handle entropy length errors
try {
const invalidEntropy = "0x1234"; // Too short
const mnemonic = entropyToMnemonic(invalidEntropy);
} catch (error) {
console.log("Invalid entropy length:", error.message);
}