Skip to content

Commit

Permalink
add mnemonicAsEntropy entropyAsMnemonic for storing mnemonic as 32 by…
Browse files Browse the repository at this point in the history
…te buffer (#600)
  • Loading branch information
fuxingloh authored Aug 16, 2021
1 parent a45b6cc commit ca9b21d
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 1 deletion.
50 changes: 49 additions & 1 deletion packages/jellyfish-wallet-mnemonic/__tests__/bip39.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
import { generateMnemonicWords, mnemonicToSeed, validateMnemonicSentence, validateMnemonicWord } from '../src'
import {
entropyAsMnemonic,
generateMnemonicWords,
mnemonicAsEntropy,
mnemonicToSeed,
validateMnemonicSentence,
validateMnemonicWord
} from '../src'

it('should generate 12-15-18-21-24 and validate', () => {
function shouldGenerateAndValidate (length: 12 | 15 | 18 | 21 | 24): void {
Expand Down Expand Up @@ -81,3 +88,44 @@ describe('single word mnemonic validation', () => {
expect(validateMnemonicWord('가격')).toStrictEqual(false)
})
})

describe('mnemonicAsEntropy and entropyAsMnemonic', () => {
it('should mnemonicAsEntropy == entropyAsMnemonic', () => {
const generated = generateMnemonicWords()

const entropy = mnemonicAsEntropy(generated)
const words = entropyAsMnemonic(entropy)

expect(entropy.length).toStrictEqual(32)
expect(generated).toStrictEqual(words)

expect(generated.length).toStrictEqual(24)
expect(generated[0]).toStrictEqual(words[0])
expect(generated[23]).toStrictEqual(words[23])
})

it('should get 0000 for abandon x23 + art cs', () => {
const buffer = Buffer.from('0000000000000000000000000000000000000000000000000000000000000000', 'hex')

const words = generateMnemonicWords(24, () => buffer)

const entropy = mnemonicAsEntropy(words)
expect(entropy).toStrictEqual(buffer)
})

it('should get abandon x23 + art cs for 0000', () => {
const buffer = Buffer.from('0000000000000000000000000000000000000000000000000000000000000000', 'hex')
const words = entropyAsMnemonic(buffer)
expect(words.join(' ')).toStrictEqual(
'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art'
)
})

it('should fail if not 32 byte long', () => {
const buffer31 = Buffer.from('00000000000000000000000000000000000000000000000000000000000000', 'hex')

expect(() => {
entropyAsMnemonic(buffer31)
}).toThrow('expected entropy to be 32 byte long')
})
})
22 changes: 22 additions & 0 deletions packages/jellyfish-wallet-mnemonic/src/mnemonic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,25 @@ export function generateMnemonicWords (length: 12 | 15 | 18 | 21 | 24 = 24, rng:
export function mnemonicToSeed (mnemonic: string[]): Buffer {
return bip39.mnemonicToSeedSync(mnemonic.join(' '))
}

/**
* @param {string[]} mnemonic words, (COLD)
* @return {Buffer} 32 byte
*/
export function mnemonicAsEntropy (mnemonic: string[]): Buffer {
const hex = bip39.mnemonicToEntropy(mnemonic.join(' '))
return Buffer.from(hex, 'hex')
}

/**
* @param {Buffer} entropy 32 bytes buffer
* @return {string[]} mnemonic words, (COLD)
*/
export function entropyAsMnemonic (entropy: Buffer): string[] {
if (entropy.length !== 32) {
throw new Error('expected entropy to be 32 byte long')
}

const sentence = bip39.entropyToMnemonic(entropy)
return sentence.split(' ')
}

0 comments on commit ca9b21d

Please sign in to comment.