BIP-39 uses standardized 2048-word lists to convert entropy into human-readable mnemonics. Multiple languages are supported, enabling global wallet recovery.
1. Unique PrefixFirst 4 letters distinguish all words:
// These are valid BIP-39 words'abandon' // aban'ability' // abil'able' // able'about' // abou'above' // abov'absent' // abse// No collisions in first 4 letters
import * as Bip39 from '@tevm/voltaire/Bip39';// English is defaultconst mnemonic = Bip39.generateMnemonic(256);console.log(mnemonic);// "abandon ability able about above absent absorb abstract absurd abuse access accident account accuse achieve acid acoustic acquire across act action actor actress actual"
import { wordlist as spanish } from '@scure/bip39/wordlists/spanish.js';import { wordlist as french } from '@scure/bip39/wordlists/french.js';import { wordlist as japanese } from '@scure/bip39/wordlists/japanese.js';// Spanish mnemonicconst mnemonicES = Bip39.generateMnemonic(256, spanish);// French mnemonicconst mnemonicFR = Bip39.generateMnemonic(256, french);// Japanese mnemonicconst mnemonicJA = Bip39.generateMnemonic(256, japanese);
// 11-bit groups map to wordlist indexconst index = 0b00000000000; // 0 in binaryconst word = wordlist[index]; // 'abandon'const index2 = 0b11111111111; // 2047 in binaryconst word2 = wordlist[index2]; // 'zoo' (last word in English)
import { wordlist as japanese } from '@scure/bip39/wordlists/japanese.js';const mnemonicJA = Bip39.generateMnemonic(256, japanese);console.log(mnemonicJA);// Words separated by ideographic space
Word order has no semantic meaning (just encodes entropy):
// These are both valid but completely different wallets:const mnemonic1 = 'abandon ability able about above absent absorb abstract absurd abuse access accident';const mnemonic2 = 'accident access abuse absurd abstract absorb absent above about able ability abandon';// Different orders = different entropy = different wallets
Using non-standard wordlist reduces compatibility:
// ✅ Standard - works everywhereimport { wordlist } from '@scure/bip39/wordlists/english.js';const mnemonic = Bip39.generateMnemonic(256, wordlist);// ❌ Custom - may not work in other walletsconst customWordlist = ['apple', 'banana', /* 2046 more */];const customMnemonic = Bip39.generateMnemonic(256, customWordlist);
// Generate in Englishimport { wordlist as english } from '@scure/bip39/wordlists/english.js';const mnemonic = Bip39.generateMnemonic(256, english);// ❌ Cannot validate with different languageimport { wordlist as spanish } from '@scure/bip39/wordlists/spanish.js';Bip39.validateMnemonic(mnemonic, spanish); // false (different wordlist)// ✅ Must use same languageBip39.validateMnemonic(mnemonic, english); // true