From ab860eb8ea5907a59519e2eb5b941fac1cd7bf8a Mon Sep 17 00:00:00 2001 From: jk <47693+sectore@users.noreply.github.com> Date: Fri, 19 Jul 2024 21:25:59 +0200 Subject: [PATCH 1/9] Import + generate bip39 + slip39 word lists Update deps, extract things into const + types, generate all word lists --- README.md | 15 +- bun.lockb | Bin 166942 -> 180586 bytes flake.lock | 118 +- package.json | 54 +- scripts/import-bip39.ts | 28 + scripts/import-slip39.ts | 23 + scripts/import-wordlist.ts | 90 ++ src/Header.svelte | 10 +- src/lib/const.ts | 62 + src/lib/store.svelte.ts | 57 +- src/lib/types.ts | 17 + src/lib/wordlist-bip39-1.ts | 2058 +++++++++++++++++++++++++++ src/lib/wordlist-bip39-2.ts | 2058 +++++++++++++++++++++++++++ src/lib/wordlist-bip39.ts | 2057 +++++++++++++++++++++++++++ src/lib/wordlist-slip39.ts | 1034 ++++++++++++++ src/lib/wordlists/bip39-cz.ts | 2060 ++++++++++++++++++++++++++++ src/lib/wordlists/bip39-en.ts | 2060 ++++++++++++++++++++++++++++ src/lib/wordlists/bip39-es.ts | 2060 ++++++++++++++++++++++++++++ src/lib/wordlists/bip39-fr.ts | 2060 ++++++++++++++++++++++++++++ src/lib/wordlists/bip39-it.ts | 2060 ++++++++++++++++++++++++++++ src/lib/wordlists/bip39-jp.ts | 2060 ++++++++++++++++++++++++++++ src/lib/wordlists/bip39-kr.ts | 2060 ++++++++++++++++++++++++++++ src/lib/wordlists/bip39-pt.ts | 2060 ++++++++++++++++++++++++++++ src/lib/wordlists/bip39-zh-Hans.ts | 2060 ++++++++++++++++++++++++++++ src/lib/wordlists/bip39-zh-Hant.ts | 2060 ++++++++++++++++++++++++++++ src/lib/wordlists/slip39-en.ts | 2060 ++++++++++++++++++++++++++++ 26 files changed, 30216 insertions(+), 125 deletions(-) create mode 100644 scripts/import-bip39.ts create mode 100644 scripts/import-slip39.ts create mode 100644 scripts/import-wordlist.ts create mode 100644 src/lib/const.ts create mode 100644 src/lib/wordlist-bip39-1.ts create mode 100644 src/lib/wordlist-bip39-2.ts create mode 100644 src/lib/wordlist-bip39.ts create mode 100644 src/lib/wordlist-slip39.ts create mode 100644 src/lib/wordlists/bip39-cz.ts create mode 100644 src/lib/wordlists/bip39-en.ts create mode 100644 src/lib/wordlists/bip39-es.ts create mode 100644 src/lib/wordlists/bip39-fr.ts create mode 100644 src/lib/wordlists/bip39-it.ts create mode 100644 src/lib/wordlists/bip39-jp.ts create mode 100644 src/lib/wordlists/bip39-kr.ts create mode 100644 src/lib/wordlists/bip39-pt.ts create mode 100644 src/lib/wordlists/bip39-zh-Hans.ts create mode 100644 src/lib/wordlists/bip39-zh-Hant.ts create mode 100644 src/lib/wordlists/slip39-en.ts diff --git a/README.md b/README.md index df079d7..dd53965 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# [BIP-39](https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md) word list +# [BIP-39](https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md) | [SLIP-39](https://github.com/satoshilabs/slips/blob/master/slip-0039.md) word lists -Explore [BIP-39](https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md) word lists in 10 languages. Filter words or search for word positions. +Explore [BIP-39](https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md) word lists in 10 languages or [SLIP-39](https://github.com/satoshilabs/slips/blob/master/slip-0039.md) in English. Filter words or search for word positions. ## Live @@ -32,6 +32,17 @@ bun run preview --open bun run tests ``` +## Import wordlists + +Word lists have been imported from original sources of [`BIP-39`](https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md) and [`SLIP-39`](https://github.com/satoshilabs/slips/blob/master/slip-0039.md) locatd at GitHub. + +Run following script to re-import those word lists. + +```bash +bun run import-bip39 +bun run import-slip39 +``` + ## Built with - [TypeScript](https://www.typescriptlang.org/) diff --git a/bun.lockb b/bun.lockb index a4ae7d6706d9296f3c582f9388c463cd4bff509b..40e794c12625b9b8f0a71efedd2b47f4cd68b1a3 100755 GIT binary patch delta 38249 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 a8dj%iwXl!9-XXML_p5~`?5A&qdH)L(zUs>W diff --git a/flake.lock b/flake.lock index dfce2a0..052af3f 100644 --- a/flake.lock +++ b/flake.lock @@ -1,61 +1,61 @@ { - "nodes": { - "flake-utils": { - "inputs": { - "systems": "systems" - }, - "locked": { - "lastModified": 1710146030, - "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1718530797, - "narHash": "sha256-pup6cYwtgvzDpvpSCFh1TEUjw2zkNpk8iolbKnyFmmU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "b60ebf54c15553b393d144357375ea956f89e9a9", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "root": { - "inputs": { - "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs" - } - }, - "systems": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - } - }, - "root": "root", - "version": 7 + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1721138476, + "narHash": "sha256-+W5eZOhhemLQxelojLxETfbFbc19NWawsXBlapYpqIA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ad0b5eed1b6031efaed382844806550c3dcb4206", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 } diff --git a/package.json b/package.json index 9f2b218..8d7afb1 100644 --- a/package.json +++ b/package.json @@ -1,37 +1,37 @@ { - "name": "bip39-word-list", + "name": "bip39-slip39-wordlist", "version": "0.0.1", "devDependencies": { - "@effect/platform": "^0.58.2", - "@effect/platform-browser": "^0.37.2", - "@sveltejs/adapter-auto": "^3.0.0", + "@effect/platform": "^0.59.2", + "@effect/platform-bun": "^0.39.2", + "@effect/platform-browser": "^0.38.3", + "@sveltejs/adapter-auto": "^3.2.2", "@sveltejs/adapter-static": "^3.0.2", - "@sveltejs/kit": "^2.0.0", - "@sveltejs/vite-plugin-svelte": "^3.0.0", - "@types/eslint": "^8.56.7", + "@sveltejs/kit": "^2.5.18", + "@sveltejs/vite-plugin-svelte": "^3.1.1", + "@types/eslint": "^8.56.10", "autoprefixer": "^10.4.19", - "bip39": "^3.1.0", - "bun-types": "^1.1.13", - "daisyui": "^4.12.2", - "effect": "^3.3.4", - "eslint": "^9.0.0", + "bun-types": "^1.1.20", + "daisyui": "^4.12.10", + "effect": "^3.5.6", + "eslint": "^9.7.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-svelte": "^2.36.0", - "globals": "^15.0.0", + "eslint-plugin-svelte": "^2.43.0", + "globals": "^15.8.0", "jsdom": "^24.1.0", "lucide-svelte": "^0.395.0", - "postcss": "^8.4.38", - "prettier": "^3.1.1", - "prettier-plugin-svelte": "^3.1.2", - "prettier-plugin-tailwindcss": "^0.6.4", - "svelte": "^5.0.0-next.158", - "svelte-check": "^3.6.0", + "postcss": "^8.4.39", + "prettier": "^3.3.3", + "prettier-plugin-svelte": "^3.2.6", + "prettier-plugin-tailwindcss": "^0.6.5", + "svelte": "^5.0.0-next.192", + "svelte-check": "^3.8.4", "svelte-typewrite": "^2.0.0", - "tailwindcss": "^3.4.4", - "tslib": "^2.4.1", - "typescript": "^5.0.0", - "typescript-eslint": "^8.0.0-alpha.20", - "vite": "^5.0.3", + "tailwindcss": "^3.4.6", + "tslib": "^2.6.3", + "typescript": "^5.5.3", + "typescript-eslint": "^8.0.0-alpha.45", + "vite": "^5.3.4", "vitest": "^1.6.0" }, "private": true, @@ -43,7 +43,9 @@ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "test": "vitest --run", "lint": "prettier --check . && eslint .", - "format": "prettier --write ." + "format": "prettier --write .", + "import:bip39": "bun ./scripts/import-bip39.ts", + "import:slip39": "bun ./scripts/import-slip39.ts" }, "type": "module" } diff --git a/scripts/import-bip39.ts b/scripts/import-bip39.ts new file mode 100644 index 0000000..d016a57 --- /dev/null +++ b/scripts/import-bip39.ts @@ -0,0 +1,28 @@ +import { Effect, Layer, pipe, Array as A } from 'effect'; +import { BunRuntime } from '@effect/platform-bun'; +import * as NodeFileSystem from '@effect/platform-node-shared/NodeFileSystem'; +import { Config, program } from './import-wordlist'; +import { GITHUB_URLS, RAW_GITHUB_URLS } from '../src/lib/const'; +import { languages } from '../src/lib/types'; + +const all = pipe( + languages, + A.map((lang) => + Layer.succeed( + Config, + Config.of({ + get: Effect.succeed({ + type: 'bip39', + lang, + github_raw: new URL(RAW_GITHUB_URLS.bip39[lang]), + github_url: new URL(GITHUB_URLS.bip39[lang]), + pathToSave: `./src/lib/wordlists/bip39-${lang}.ts` + }) + }) + ) + ), + A.map((configL) => program.pipe(Effect.provide(Layer.merge(NodeFileSystem.layer, configL)))), + Effect.all +); + +all.pipe(BunRuntime.runMain); diff --git a/scripts/import-slip39.ts b/scripts/import-slip39.ts new file mode 100644 index 0000000..392251c --- /dev/null +++ b/scripts/import-slip39.ts @@ -0,0 +1,23 @@ +import { Effect, Layer } from 'effect'; +import { BunRuntime } from '@effect/platform-bun'; +import * as NodeFileSystem from '@effect/platform-node-shared/NodeFileSystem'; +import { Config, program } from './import-wordlist'; +import { GITHUB_URLS, RAW_GITHUB_URLS } from '../src/lib/const'; + +// EN available only +const lang = 'en'; + +const ConfigLayer = Layer.succeed( + Config, + Config.of({ + get: Effect.succeed({ + type: 'slip39', + lang, + github_raw: new URL(RAW_GITHUB_URLS.bip39[lang]), + github_url: new URL(GITHUB_URLS.bip39[lang]), + pathToSave: `./src/lib/wordlists/slip39-${lang}.ts` + }) + }) +); + +program.pipe(Effect.provide(Layer.merge(NodeFileSystem.layer, ConfigLayer)), BunRuntime.runMain); diff --git a/scripts/import-wordlist.ts b/scripts/import-wordlist.ts new file mode 100644 index 0000000..98396b2 --- /dev/null +++ b/scripts/import-wordlist.ts @@ -0,0 +1,90 @@ +import { Effect as E, pipe, String as S, Array as A, Context } from 'effect'; +import { FileSystem } from '@effect/platform'; +import { HttpClientRequest, HttpClient, HttpClientResponse } from '@effect/platform'; +import prettier from 'prettier'; +import { LANG, WordListType } from '../src/lib/types'; + +export class Config extends Context.Tag('Config')< + Config, + { + readonly get: E.Effect<{ + readonly type: WordListType; + readonly lang: LANG; + readonly github_url: URL; + readonly github_raw: URL; + readonly pathToSave: string; + }>; + } +>() {} + +const fetchWordlist = (raw_url: URL) => + HttpClientRequest.get(raw_url).pipe(HttpClient.fetch, HttpClientResponse.text); + +const parseWordlist = ({ + result, + type, + url, + lang +}: { + result: string; + type: WordListType; + url: URL; + lang: LANG; +}): string => + pipe( + result, + S.split(/\n/g), + A.map(S.trim), + A.filter(S.isNonEmpty), + (wordlist) => ` + import { type WordList } from '../types' + + /** + * Generated ${type} word list (${lang.toUpperCase()}) + * @source ${url.toString()} + * + * Don't edit! + */ + const wordlist:WordList = [${pipe( + wordlist, + A.map((s, i) => `{ pos: ${i + 1}, word: '${s}' }`), + A.join(',') + )}] + + export default wordlist + ` + ); + +const formatWordlist = (wordlist: string, path: string) => + E.gen(function* (_) { + yield* _(E.logInfo('Formatting ...')); + const formatted = yield* _( + E.promise(() => + prettier.format(wordlist, { + filepath: path, + parser: 'typescript', + singleQuote: true, + trailingComma: 'none' + }) + ) + ); + return formatted; + }); + +const writeWordlist = (wordlist: string, path: string) => + E.gen(function* (_) { + yield* _(E.log(`Writing to ${path}`)); + const fs = yield* _(FileSystem.FileSystem); + yield* _(fs.writeFileString(path, wordlist)); + }); + +export const program = E.gen(function* (_) { + const config = yield* _(Config); + const { type, pathToSave, github_raw, github_url, lang } = yield* config.get; + yield* _(E.log(`Fetching word list from ${github_raw.toString()}`)); + const result = yield* _(fetchWordlist(github_raw)); + const wordlist = parseWordlist({ result, type, url: github_url, lang }); + const formatted = yield* _(formatWordlist(wordlist, pathToSave)); + yield* _(writeWordlist(formatted, pathToSave)); + yield* _(E.log(`DONE!`)); +}); diff --git a/src/Header.svelte b/src/Header.svelte index ab3e6d8..c953dfd 100644 --- a/src/Header.svelte +++ b/src/Header.svelte @@ -1,7 +1,8 @@