BIP32 Hierarchical Deterministic Node operations for Ethereum wallets and key derivation.
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
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);
}