recover ed25519 keys and seed from bip-39 mnemonic
recover_ed25519.ts
1import { ed25519 } from '@noble/curves/ed25519.js'
2import { bytesToHex } from '@noble/hashes/utils.js'
3import { mnemonicToSeedSync, validateMnemonic } from '@scure/bip39'
4import { wordlist } from '@scure/bip39/wordlists/english.js'
5
6const example_mnemonic = "runway civil fish reveal rather talk just annual sadness embody divert detect level hill sail tent hawk real arctic final nephew glad bicycle tilt"
7
8const deriveSeed = function (mnemonic: string): Uint8Array {
9 try {
10 validateMnemonic(mnemonic, wordlist)
11 } catch (err) {
12 console.error(err instanceof Error ? err.message : "Invalid mnemonic")
13 }
14 return mnemonicToSeedSync(mnemonic)
15}
16
17const deriveKeys = function (seed: Uint8Array) {
18 let priv: Uint8Array = seed.slice(0, 32)
19 return { privateKey: priv, publicKey: new Uint8Array(ed25519.getPublicKey(priv)) }
20}
21
22const main = function () {
23 const seed = deriveSeed(example_mnemonic)
24 console.log('Seed (Hex): ', bytesToHex(seed))
25
26 const recoveredKeys = deriveKeys(seed)
27 console.log('\nPrivate Key (Hex):', bytesToHex(recoveredKeys.privateKey))
28 console.log('Public Key (Hex): ', bytesToHex(recoveredKeys.publicKey))
29}
30
31main()