From 3d767beeb90506abaf059a5a8b5b0a1d51777abf Mon Sep 17 00:00:00 2001 From: futpib Date: Sat, 16 Dec 2023 17:15:37 +0400 Subject: [PATCH] NIP-06: Support multiple account private keys derived from seed words (#219) Co-authored-by: fiatjaf_ --- nip06.test.ts | 17 +++++++++++++++++ nip06.ts | 8 ++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/nip06.test.ts b/nip06.test.ts index 0cbf1a0..4e1a2f1 100644 --- a/nip06.test.ts +++ b/nip06.test.ts @@ -6,9 +6,26 @@ test('generate private key from a mnemonic', async () => { expect(privateKey).toEqual('c26cf31d8ba425b555ca27d00ca71b5008004f2f662470f8c8131822ec129fe2') }) +test('generate private key for account 1 from a mnemonic', async () => { + const mnemonic = 'zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong' + const privateKey = privateKeyFromSeedWords(mnemonic, undefined, 1) + expect(privateKey).toEqual( + 'b5fc7f229de3fb5c189063e3b3fc6c921d8f4366cff5bd31c6f063493665eb2b' + ) +}) + test('generate private key from a mnemonic and passphrase', async () => { const mnemonic = 'zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong' const passphrase = '123' const privateKey = privateKeyFromSeedWords(mnemonic, passphrase) expect(privateKey).toEqual('55a22b8203273d0aaf24c22c8fbe99608e70c524b17265641074281c8b978ae4') }) + +test('generate private key for account 1 from a mnemonic and passphrase', async () => { + const mnemonic = 'zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong' + const passphrase = '123' + const privateKey = privateKeyFromSeedWords(mnemonic, passphrase, 1) + expect(privateKey).toEqual( + '2e0f7bd9e3c3ebcdff1a90fb49c913477e7c055eba1a415d571b6a8c714c7135' + ) +}) diff --git a/nip06.ts b/nip06.ts index ac12761..da30258 100644 --- a/nip06.ts +++ b/nip06.ts @@ -3,9 +3,13 @@ import { wordlist } from '@scure/bip39/wordlists/english' import { generateMnemonic, mnemonicToSeedSync, validateMnemonic } from '@scure/bip39' import { HDKey } from '@scure/bip32' -export function privateKeyFromSeedWords(mnemonic: string, passphrase?: string): string { +export function privateKeyFromSeedWords( + mnemonic: string, + passphrase?: string, + accountIndex = 0 +): string { let root = HDKey.fromMasterSeed(mnemonicToSeedSync(mnemonic, passphrase)) - let privateKey = root.derive(`m/44'/1237'/0'/0/0`).privateKey + let privateKey = root.derive(`m/44'/1237'/${accountIndex}'/0/0`).privateKey if (!privateKey) throw new Error('could not derive private key') return bytesToHex(privateKey) }