import { check, register, Wordlist } from '../utils/wordlist'; import { toUtf8String } from '../utils/utf8'; const data = "}aE#4A=Yv&co#4N#6G=cJ&SM#66|/Z#4t&kn~46#4K~4q%b9=IR#7l,mB#7W_X2*dl}Uo~7s}Uf&Iw#9c&cw~6O&H6&wx&IG%v5=IQ~8a&Pv#47$PR&50%Ko&QM&3l#5f,D9#4L|/H&tQ;v0~6n]nN } = { zh_cn: null, zh_tw: null } const Checks: { [key: string]: string } = { zh_cn: '0x17bcc4d8547e5a7135e365d1ab443aaae95e76d8230c2782c67305d4f21497a1', zh_tw: '0x51e720e90c7b87bec1d70eb6e74a21a449bd3ec9c020b01d3a40ed991b60ce5d' } const codes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; const style = "~!@#$%^&*_-=[]{}|;:,.()<>?" function loadWords(lang: Wordlist) { if (wordlist[lang.locale] !== null) { return; } wordlist[lang.locale] = []; let deltaOffset = 0; for (var i = 0; i < 2048; i++) { let s = style.indexOf(data[i * 3]); let bytes = [ 228 + (s >> 2), 128 + codes.indexOf(data[i * 3 + 1]), 128 + codes.indexOf(data[i * 3 + 2]), ]; if (lang.locale === 'zh_tw') { let common = s % 4; for (let i = common; i < 3; i++) { bytes[i] = codes.indexOf(deltaData[deltaOffset++]) + ((i == 0) ? 228: 128); } } wordlist[lang.locale].push(toUtf8String(bytes)); } if (check(lang) !== Checks[lang.locale]) { wordlist[lang.locale] = null; throw new Error('BIP39 Wordlist for ' + lang.locale + ' (Chinese) FAILED'); } } class LangZh extends Wordlist { constructor(country: string) { super('zh_' + country); } getWord(index: number): string { loadWords(this); return wordlist[this.locale][index]; } getWordIndex(word: string): number { loadWords(this); return wordlist[this.locale].indexOf(word); } split(mnemonic: string): Array { mnemonic = mnemonic.replace(/(?:\u3000| )+/g, ''); return mnemonic.split(''); } } const langZhCn = new LangZh('cn'); register(langZhCn); register(langZhCn, 'zh'); const langZhTw = new LangZh('tw'); register(langZhTw); export { langZhCn, langZhTw };