@pasosdejesus/m 0.27.2 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/README.md +2 -2
  2. package/dist/CHANGELOG.md +126 -0
  3. package/dist/compose/derive.d.ts +53 -0
  4. package/dist/compose/derive.d.ts.map +1 -0
  5. package/dist/compose/derive.js +128 -0
  6. package/dist/compose/derive.js.map +1 -0
  7. package/dist/compose/discover.d.ts +32 -0
  8. package/dist/compose/discover.d.ts.map +1 -0
  9. package/dist/compose/discover.js +96 -0
  10. package/dist/compose/discover.js.map +1 -0
  11. package/dist/compose/index.d.ts +17 -0
  12. package/dist/compose/index.d.ts.map +1 -0
  13. package/dist/compose/index.js +16 -0
  14. package/dist/compose/index.js.map +1 -0
  15. package/dist/compose/manifest.d.ts +89 -0
  16. package/dist/compose/manifest.d.ts.map +1 -0
  17. package/dist/compose/manifest.js +16 -0
  18. package/dist/compose/manifest.js.map +1 -0
  19. package/dist/compose/sync.d.ts +12 -0
  20. package/dist/compose/sync.d.ts.map +1 -0
  21. package/dist/compose/sync.js +27 -0
  22. package/dist/compose/sync.js.map +1 -0
  23. package/dist/compose/usage.d.ts +54 -0
  24. package/dist/compose/usage.d.ts.map +1 -0
  25. package/dist/compose/usage.js +167 -0
  26. package/dist/compose/usage.js.map +1 -0
  27. package/dist/compose/vendor.d.ts +45 -0
  28. package/dist/compose/vendor.d.ts.map +1 -0
  29. package/dist/compose/vendor.js +147 -0
  30. package/dist/compose/vendor.js.map +1 -0
  31. package/dist/compose/verify.d.ts +11 -0
  32. package/dist/compose/verify.d.ts.map +1 -0
  33. package/dist/compose/verify.js +74 -0
  34. package/dist/compose/verify.js.map +1 -0
  35. package/dist/e2e/env.d.ts +1 -1
  36. package/dist/e2e/env.js +3 -3
  37. package/dist/e2e/env.js.map +1 -1
  38. package/dist/e2e/local-node.js +1 -1
  39. package/dist/e2e/local-node.js.map +1 -1
  40. package/dist/e2e/wallet-mock.js +1 -1
  41. package/dist/e2e/wallet-mock.js.map +1 -1
  42. package/dist/e2e/warmup.js +1 -1
  43. package/dist/e2e/warmup.js.map +1 -1
  44. package/dist/engine.d.ts +3 -16
  45. package/dist/engine.d.ts.map +1 -1
  46. package/dist/i18n/locales/cli.d.ts.map +1 -1
  47. package/dist/i18n/locales/cli.js +16 -10
  48. package/dist/i18n/locales/cli.js.map +1 -1
  49. package/dist/m.js +13 -10
  50. package/dist/m.js.map +1 -1
  51. package/dist/shadcn_components/ui/button.d.ts +1 -1
  52. package/dist/tasks/create.d.ts +1 -1
  53. package/dist/tasks/create.d.ts.map +1 -1
  54. package/dist/tasks/create.js +5 -13
  55. package/dist/tasks/create.js.map +1 -1
  56. package/dist/tasks/db.d.ts +2 -1
  57. package/dist/tasks/db.d.ts.map +1 -1
  58. package/dist/tasks/db.js +14 -11
  59. package/dist/tasks/db.js.map +1 -1
  60. package/dist/tasks/e2e-summary.js +1 -1
  61. package/dist/tasks/e2e-summary.js.map +1 -1
  62. package/dist/tasks/e2e.js +1 -1
  63. package/dist/tasks/e2e.js.map +1 -1
  64. package/dist/tasks/engine.d.ts.map +1 -1
  65. package/dist/tasks/engine.js +246 -17
  66. package/dist/tasks/engine.js.map +1 -1
  67. package/dist/tasks/msip.d.ts +11 -0
  68. package/dist/tasks/msip.d.ts.map +1 -0
  69. package/dist/tasks/{base-model.js → msip.js} +161 -25
  70. package/dist/tasks/msip.js.map +1 -0
  71. package/dist/tasks/warmup.js +1 -1
  72. package/dist/tasks/warmup.js.map +1 -1
  73. package/dist/templates/apps/hardhat/README.md +0 -8
  74. package/dist/templates/apps/nextjs/bin/m +3 -0
  75. package/dist/templates/apps/nextjs/tests/global-setup.ts +28 -0
  76. package/dist/templates/apps/nextjs/vitest.config.ts +3 -0
  77. package/dist/test-utils/console.d.ts +1 -1
  78. package/dist/test-utils/console.js +1 -1
  79. package/dist/test-utils/kysely-mocks.d.ts +1 -1
  80. package/dist/test-utils/kysely-mocks.js +1 -1
  81. package/dist/test-utils/wallet-mocks.js +1 -1
  82. package/dist/test-utils/wallet-setup.js +1 -1
  83. package/dist/util/engines.d.ts +4 -6
  84. package/dist/util/engines.d.ts.map +1 -1
  85. package/dist/util/engines.js +5 -38
  86. package/dist/util/engines.js.map +1 -1
  87. package/dist/util/msip.d.ts +17 -0
  88. package/dist/util/msip.d.ts.map +1 -0
  89. package/dist/util/msip.js +86 -0
  90. package/dist/util/msip.js.map +1 -0
  91. package/dist/wallet/index.js +1 -1
  92. package/dist/wallet/index.js.map +1 -1
  93. package/dist/wallet/next/i18n.d.ts +1 -1
  94. package/dist/wallet/next/i18n.js +1 -1
  95. package/dist/wallet/next/index.js +1 -1
  96. package/dist/wallet/next/index.js.map +1 -1
  97. package/dist/wallet/next/namespaces.d.ts +1 -1
  98. package/dist/wallet/next/namespaces.js +1 -1
  99. package/dist/wallet/storage/idb.d.ts +1 -1
  100. package/dist/wallet/storage/idb.js +1 -1
  101. package/package.json +4 -6
  102. package/src/e2e/README.md +6 -6
  103. package/src/tasks/README.md +3 -3
  104. package/src/test-utils/README.md +2 -2
  105. package/src/wallet/README.md +4 -4
  106. package/dist/base-model/baseline.generated.d.ts +0 -48
  107. package/dist/base-model/baseline.generated.d.ts.map +0 -1
  108. package/dist/base-model/baseline.generated.js +0 -930
  109. package/dist/base-model/baseline.generated.js.map +0 -1
  110. package/dist/base-model/check.d.ts +0 -6
  111. package/dist/base-model/check.d.ts.map +0 -1
  112. package/dist/base-model/check.js +0 -195
  113. package/dist/base-model/check.js.map +0 -1
  114. package/dist/base-model/forward/baseline_1_0_0.d.ts +0 -3
  115. package/dist/base-model/forward/baseline_1_0_0.d.ts.map +0 -1
  116. package/dist/base-model/forward/baseline_1_0_0.js +0 -23
  117. package/dist/base-model/forward/baseline_1_0_0.js.map +0 -1
  118. package/dist/base-model/forward/index.d.ts +0 -28
  119. package/dist/base-model/forward/index.d.ts.map +0 -1
  120. package/dist/base-model/forward/index.js +0 -126
  121. package/dist/base-model/forward/index.js.map +0 -1
  122. package/dist/base-model/forward/index.test.d.ts +0 -2
  123. package/dist/base-model/forward/index.test.d.ts.map +0 -1
  124. package/dist/base-model/forward/index.test.js +0 -65
  125. package/dist/base-model/forward/index.test.js.map +0 -1
  126. package/dist/base-model/forward/policy.d.ts +0 -16
  127. package/dist/base-model/forward/policy.d.ts.map +0 -1
  128. package/dist/base-model/forward/policy.js +0 -37
  129. package/dist/base-model/forward/policy.js.map +0 -1
  130. package/dist/base-model/forward/policy.test.d.ts +0 -2
  131. package/dist/base-model/forward/policy.test.d.ts.map +0 -1
  132. package/dist/base-model/forward/policy.test.js +0 -40
  133. package/dist/base-model/forward/policy.test.js.map +0 -1
  134. package/dist/base-model/forward/types.d.ts +0 -21
  135. package/dist/base-model/forward/types.d.ts.map +0 -1
  136. package/dist/base-model/forward/types.js +0 -2
  137. package/dist/base-model/forward/types.js.map +0 -1
  138. package/dist/base-model/generate.d.ts +0 -42
  139. package/dist/base-model/generate.d.ts.map +0 -1
  140. package/dist/base-model/generate.js +0 -241
  141. package/dist/base-model/generate.js.map +0 -1
  142. package/dist/base-model/guidelines.d.ts +0 -13
  143. package/dist/base-model/guidelines.d.ts.map +0 -1
  144. package/dist/base-model/guidelines.js +0 -61
  145. package/dist/base-model/guidelines.js.map +0 -1
  146. package/dist/base-model/index.d.ts +0 -24
  147. package/dist/base-model/index.d.ts.map +0 -1
  148. package/dist/base-model/index.js +0 -29
  149. package/dist/base-model/index.js.map +0 -1
  150. package/dist/base-model/parse-structure.d.ts +0 -4
  151. package/dist/base-model/parse-structure.d.ts.map +0 -1
  152. package/dist/base-model/parse-structure.js +0 -170
  153. package/dist/base-model/parse-structure.js.map +0 -1
  154. package/dist/base-model/queries.d.ts +0 -34
  155. package/dist/base-model/queries.d.ts.map +0 -1
  156. package/dist/base-model/queries.js +0 -118
  157. package/dist/base-model/queries.js.map +0 -1
  158. package/dist/base-model/references/learn-tg.d.ts +0 -21
  159. package/dist/base-model/references/learn-tg.d.ts.map +0 -1
  160. package/dist/base-model/references/learn-tg.js +0 -65
  161. package/dist/base-model/references/learn-tg.js.map +0 -1
  162. package/dist/base-model/references/msip.d.ts +0 -29
  163. package/dist/base-model/references/msip.d.ts.map +0 -1
  164. package/dist/base-model/references/msip.js +0 -33
  165. package/dist/base-model/references/msip.js.map +0 -1
  166. package/dist/base-model/types.d.ts +0 -207
  167. package/dist/base-model/types.d.ts.map +0 -1
  168. package/dist/base-model/types.js +0 -10
  169. package/dist/base-model/types.js.map +0 -1
  170. package/dist/base-model/version.d.ts +0 -19
  171. package/dist/base-model/version.d.ts.map +0 -1
  172. package/dist/base-model/version.js +0 -26
  173. package/dist/base-model/version.js.map +0 -1
  174. package/dist/base-model/wallet-link.d.ts +0 -69
  175. package/dist/base-model/wallet-link.d.ts.map +0 -1
  176. package/dist/base-model/wallet-link.js +0 -220
  177. package/dist/base-model/wallet-link.js.map +0 -1
  178. package/dist/base-model/wallet-link.test.d.ts +0 -2
  179. package/dist/base-model/wallet-link.test.d.ts.map +0 -1
  180. package/dist/base-model/wallet-link.test.js +0 -147
  181. package/dist/base-model/wallet-link.test.js.map +0 -1
  182. package/dist/e2e/env.test.d.ts +0 -2
  183. package/dist/e2e/env.test.d.ts.map +0 -1
  184. package/dist/e2e/env.test.js +0 -72
  185. package/dist/e2e/env.test.js.map +0 -1
  186. package/dist/e2e/full-wallet.test.d.ts +0 -2
  187. package/dist/e2e/full-wallet.test.d.ts.map +0 -1
  188. package/dist/e2e/full-wallet.test.js +0 -63
  189. package/dist/e2e/full-wallet.test.js.map +0 -1
  190. package/dist/e2e/in-app-wallet.test.d.ts +0 -2
  191. package/dist/e2e/in-app-wallet.test.d.ts.map +0 -1
  192. package/dist/e2e/in-app-wallet.test.js +0 -52
  193. package/dist/e2e/in-app-wallet.test.js.map +0 -1
  194. package/dist/e2e/local-node.test.d.ts +0 -2
  195. package/dist/e2e/local-node.test.d.ts.map +0 -1
  196. package/dist/e2e/local-node.test.js +0 -43
  197. package/dist/e2e/local-node.test.js.map +0 -1
  198. package/dist/e2e/retry.test.d.ts +0 -2
  199. package/dist/e2e/retry.test.d.ts.map +0 -1
  200. package/dist/e2e/retry.test.js +0 -43
  201. package/dist/e2e/retry.test.js.map +0 -1
  202. package/dist/e2e/signer.test.d.ts +0 -2
  203. package/dist/e2e/signer.test.d.ts.map +0 -1
  204. package/dist/e2e/signer.test.js +0 -57
  205. package/dist/e2e/signer.test.js.map +0 -1
  206. package/dist/e2e/siwe-optional.test.d.ts +0 -2
  207. package/dist/e2e/siwe-optional.test.d.ts.map +0 -1
  208. package/dist/e2e/siwe-optional.test.js +0 -13
  209. package/dist/e2e/siwe-optional.test.js.map +0 -1
  210. package/dist/e2e/wallet-mock.test.d.ts +0 -2
  211. package/dist/e2e/wallet-mock.test.d.ts.map +0 -1
  212. package/dist/e2e/wallet-mock.test.js +0 -28
  213. package/dist/e2e/wallet-mock.test.js.map +0 -1
  214. package/dist/e2e/warmup.test.d.ts +0 -2
  215. package/dist/e2e/warmup.test.d.ts.map +0 -1
  216. package/dist/e2e/warmup.test.js +0 -67
  217. package/dist/e2e/warmup.test.js.map +0 -1
  218. package/dist/engine.test.d.ts +0 -2
  219. package/dist/engine.test.d.ts.map +0 -1
  220. package/dist/engine.test.js +0 -35
  221. package/dist/engine.test.js.map +0 -1
  222. package/dist/index.test.d.ts +0 -2
  223. package/dist/index.test.d.ts.map +0 -1
  224. package/dist/index.test.js +0 -11
  225. package/dist/index.test.js.map +0 -1
  226. package/dist/tasks/base-model.d.ts +0 -5
  227. package/dist/tasks/base-model.d.ts.map +0 -1
  228. package/dist/tasks/base-model.js.map +0 -1
  229. package/dist/tasks/create.test.d.ts +0 -2
  230. package/dist/tasks/create.test.d.ts.map +0 -1
  231. package/dist/tasks/create.test.js +0 -41
  232. package/dist/tasks/create.test.js.map +0 -1
  233. package/dist/tasks/e2e.test.d.ts +0 -2
  234. package/dist/tasks/e2e.test.d.ts.map +0 -1
  235. package/dist/tasks/e2e.test.js +0 -108
  236. package/dist/tasks/e2e.test.js.map +0 -1
  237. package/dist/tasks/update.test.d.ts +0 -2
  238. package/dist/tasks/update.test.d.ts.map +0 -1
  239. package/dist/tasks/update.test.js +0 -79
  240. package/dist/tasks/update.test.js.map +0 -1
  241. package/dist/tasks/warmup.test.d.ts +0 -2
  242. package/dist/tasks/warmup.test.d.ts.map +0 -1
  243. package/dist/tasks/warmup.test.js +0 -40
  244. package/dist/tasks/warmup.test.js.map +0 -1
  245. package/dist/templates/apps/nextjs/tests/index.test.ts +0 -7
  246. package/dist/templates/apps/nextjs/tests/test-utils.example.test.ts +0 -169
  247. package/dist/templates/apps/nextjs/tsconfig.test.json +0 -38
  248. package/dist/test-utils/console.test.d.ts +0 -2
  249. package/dist/test-utils/console.test.d.ts.map +0 -1
  250. package/dist/test-utils/console.test.js +0 -70
  251. package/dist/test-utils/console.test.js.map +0 -1
  252. package/dist/test-utils/kysely-mocks.test.d.ts +0 -2
  253. package/dist/test-utils/kysely-mocks.test.d.ts.map +0 -1
  254. package/dist/test-utils/kysely-mocks.test.js +0 -126
  255. package/dist/test-utils/kysely-mocks.test.js.map +0 -1
  256. package/dist/test-utils/wallet-mocks.test.d.ts +0 -2
  257. package/dist/test-utils/wallet-mocks.test.d.ts.map +0 -1
  258. package/dist/test-utils/wallet-mocks.test.js +0 -55
  259. package/dist/test-utils/wallet-mocks.test.js.map +0 -1
  260. package/dist/test-utils/wallet-setup.test.d.ts +0 -2
  261. package/dist/test-utils/wallet-setup.test.d.ts.map +0 -1
  262. package/dist/test-utils/wallet-setup.test.js +0 -18
  263. package/dist/test-utils/wallet-setup.test.js.map +0 -1
  264. package/dist/util/engines.test.d.ts +0 -2
  265. package/dist/util/engines.test.d.ts.map +0 -1
  266. package/dist/util/engines.test.js +0 -79
  267. package/dist/util/engines.test.js.map +0 -1
  268. package/dist/wallet/biometric.test.d.ts +0 -2
  269. package/dist/wallet/biometric.test.d.ts.map +0 -1
  270. package/dist/wallet/biometric.test.js +0 -44
  271. package/dist/wallet/biometric.test.js.map +0 -1
  272. package/dist/wallet/crypto.test.d.ts +0 -2
  273. package/dist/wallet/crypto.test.d.ts.map +0 -1
  274. package/dist/wallet/crypto.test.js +0 -34
  275. package/dist/wallet/crypto.test.js.map +0 -1
  276. package/dist/wallet/destinations.test.d.ts +0 -2
  277. package/dist/wallet/destinations.test.d.ts.map +0 -1
  278. package/dist/wallet/destinations.test.js +0 -34
  279. package/dist/wallet/destinations.test.js.map +0 -1
  280. package/dist/wallet/external-provider.test.d.ts +0 -2
  281. package/dist/wallet/external-provider.test.d.ts.map +0 -1
  282. package/dist/wallet/external-provider.test.js +0 -44
  283. package/dist/wallet/external-provider.test.js.map +0 -1
  284. package/dist/wallet/indexeddb.test.d.ts +0 -2
  285. package/dist/wallet/indexeddb.test.d.ts.map +0 -1
  286. package/dist/wallet/indexeddb.test.js +0 -28
  287. package/dist/wallet/indexeddb.test.js.map +0 -1
  288. package/dist/wallet/kdf.test.d.ts +0 -2
  289. package/dist/wallet/kdf.test.d.ts.map +0 -1
  290. package/dist/wallet/kdf.test.js +0 -54
  291. package/dist/wallet/kdf.test.js.map +0 -1
  292. package/dist/wallet/next/components.test.d.ts +0 -2
  293. package/dist/wallet/next/components.test.d.ts.map +0 -1
  294. package/dist/wallet/next/components.test.js +0 -122
  295. package/dist/wallet/next/components.test.js.map +0 -1
  296. package/dist/wallet/next/useInAppWallet.test.d.ts +0 -2
  297. package/dist/wallet/next/useInAppWallet.test.d.ts.map +0 -1
  298. package/dist/wallet/next/useInAppWallet.test.js +0 -261
  299. package/dist/wallet/next/useInAppWallet.test.js.map +0 -1
  300. package/dist/wallet/provider.test.d.ts +0 -2
  301. package/dist/wallet/provider.test.d.ts.map +0 -1
  302. package/dist/wallet/provider.test.js +0 -170
  303. package/dist/wallet/provider.test.js.map +0 -1
  304. package/dist/wallet/signer.test.d.ts +0 -2
  305. package/dist/wallet/signer.test.d.ts.map +0 -1
  306. package/dist/wallet/signer.test.js +0 -62
  307. package/dist/wallet/signer.test.js.map +0 -1
  308. package/dist/wallet/storage.test.d.ts +0 -2
  309. package/dist/wallet/storage.test.d.ts.map +0 -1
  310. package/dist/wallet/storage.test.js +0 -103
  311. package/dist/wallet/storage.test.js.map +0 -1
  312. package/dist/wallet/wallet.test.d.ts +0 -2
  313. package/dist/wallet/wallet.test.d.ts.map +0 -1
  314. package/dist/wallet/wallet.test.js +0 -150
  315. package/dist/wallet/wallet.test.js.map +0 -1
@@ -1,103 +0,0 @@
1
- import { afterEach, describe, expect, it } from 'vitest';
2
- import { mkdtemp, rm, stat } from 'node:fs/promises';
3
- import { tmpdir } from 'node:os';
4
- import { join } from 'node:path';
5
- import { encryptSecret } from './crypto.js';
6
- import { FileStorage } from './storage/file.js';
7
- import { MemoryStorage } from './storage/memory.js';
8
- import { createWallet, deleteWallet, exportMnemonic, exportPrivateKey, getWalletInfo, hasWallet, importWallet, lockWallet, signMessage, unlockWallet, } from './wallet.js';
9
- import { privateKeyFromMnemonic } from './signer.js';
10
- const password = '12345678';
11
- const HARDHAT_MNEMONIC = 'test test test test test test test test test test test junk';
12
- const HARDHAT_ADDRESS = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266';
13
- const dirs = [];
14
- async function tempStorage() {
15
- const dir = await mkdtemp(join(tmpdir(), 'm-wallet-'));
16
- dirs.push(dir);
17
- const path = join(dir, 'wallet.json');
18
- return { storage: new FileStorage(path), path };
19
- }
20
- function sampleRecord() {
21
- return {
22
- version: 1,
23
- address: HARDHAT_ADDRESS,
24
- chain: 'celoSepolia',
25
- createdAt: 1,
26
- kdf: { name: 'PBKDF2', hash: 'SHA-256', iterations: 600_000, salt: 'AA==' },
27
- cipher: { name: 'AES-GCM', iv: 'BB==', data: 'CC==' },
28
- };
29
- }
30
- afterEach(async () => {
31
- await lockWallet();
32
- while (dirs.length) {
33
- const dir = dirs.pop();
34
- if (dir)
35
- await rm(dir, { recursive: true, force: true });
36
- }
37
- });
38
- describe('FileStorage', () => {
39
- it('stores, reads and deletes the encrypted record', async () => {
40
- const { storage } = await tempStorage();
41
- expect(await storage.has()).toBe(false);
42
- expect(await storage.get()).toBeNull();
43
- await storage.set(sampleRecord());
44
- expect(await storage.has()).toBe(true);
45
- expect(await storage.get()).toEqual(sampleRecord());
46
- await storage.delete();
47
- expect(await storage.has()).toBe(false);
48
- });
49
- it('writes the file with owner-only permissions', async () => {
50
- const { storage, path } = await tempStorage();
51
- await storage.set(sampleRecord());
52
- const info = await stat(path);
53
- expect(info.mode & 0o777).toBe(0o600);
54
- });
55
- });
56
- describe('wallet with FileStorage (Node.js)', () => {
57
- it('creates, persists, unlocks and signs without a browser', async () => {
58
- const { storage } = await tempStorage();
59
- const { walletInfo, mnemonic } = await createWallet({ password: password, storage });
60
- expect(walletInfo.address).toMatch(/^0x[0-9a-fA-F]{40}$/);
61
- expect(mnemonic.split(' ')).toHaveLength(12);
62
- await lockWallet();
63
- expect(await hasWallet(storage)).toBe(true);
64
- expect(await hasWallet(new FileStorage('/nonexistent/m-wallet.json'))).toBe(false);
65
- expect((await getWalletInfo(storage))?.address).toBe(walletInfo.address);
66
- const unlocked = await unlockWallet(password, storage);
67
- expect(unlocked.address).toBe(walletInfo.address);
68
- const signature = await signMessage('hola');
69
- expect(signature).toMatch(/^0x[0-9a-f]+$/);
70
- await deleteWallet(storage);
71
- expect(await hasWallet(storage)).toBe(false);
72
- });
73
- it('exports the recovery phrase and the private key with the password', async () => {
74
- const { storage } = await tempStorage();
75
- const { mnemonic } = await createWallet({ password: password, storage });
76
- expect(await exportMnemonic(password, storage)).toBe(mnemonic);
77
- expect(await exportPrivateKey(password, storage)).toMatch(/^0x[0-9a-f]{64}$/i);
78
- await expect(exportMnemonic('99999999', storage)).rejects.toThrow(/password/);
79
- await expect(exportPrivateKey('99999999', storage)).rejects.toThrow(/password/);
80
- });
81
- it('has no recovery phrase when the wallet was imported from a private key', async () => {
82
- const { storage } = await tempStorage();
83
- const privateKey = privateKeyFromMnemonic(HARDHAT_MNEMONIC);
84
- await importWallet({ privateKey, password: password, storage });
85
- expect(await exportPrivateKey(password, storage)).toBe(privateKey);
86
- await expect(exportMnemonic(password, storage)).rejects.toThrow(/recovery phrase/);
87
- });
88
- });
89
- describe('legacy records', () => {
90
- it('unlocks a record whose ciphertext is the bare private key', async () => {
91
- const privateKey = privateKeyFromMnemonic(HARDHAT_MNEMONIC);
92
- const legacy = await encryptSecret(privateKey, password);
93
- const storage = new MemoryStorage({
94
- ...sampleRecord(),
95
- kdf: legacy.kdf,
96
- cipher: legacy.cipher,
97
- });
98
- const info = await unlockWallet(password, storage);
99
- expect(info.address.toLowerCase()).toBe(HARDHAT_ADDRESS.toLowerCase());
100
- await expect(exportMnemonic(password, storage)).rejects.toThrow(/recovery phrase/);
101
- });
102
- });
103
- //# sourceMappingURL=storage.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storage.test.js","sourceRoot":"","sources":["../../src/wallet/storage.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,YAAY,EACZ,UAAU,EACV,WAAW,EACX,YAAY,GACb,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAGpD,MAAM,QAAQ,GAAG,UAAU,CAAA;AAC3B,MAAM,gBAAgB,GAAG,6DAA6D,CAAA;AACtF,MAAM,eAAe,GAAG,4CAA4C,CAAA;AAEpE,MAAM,IAAI,GAAa,EAAE,CAAA;AAEzB,KAAK,UAAU,WAAW;IACxB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAA;IACtD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACd,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACrC,OAAO,EAAE,OAAO,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAA;AACjD,CAAC;AAED,SAAS,YAAY;IACnB,OAAO;QACL,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,eAAe;QACxB,KAAK,EAAE,aAAa;QACpB,SAAS,EAAE,CAAC;QACZ,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;QAC3E,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;KACtD,CAAA;AACH,CAAC;AAED,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,UAAU,EAAE,CAAA;IAClB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,GAAG;YAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1D,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAEvC,MAAM,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACvC,MAAM,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;QAEtC,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtC,MAAM,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;QAEnD,MAAM,OAAO,CAAC,MAAM,EAAE,CAAA;QACtB,MAAM,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAC7C,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAA;QAEjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7B,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAEvC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;QACpF,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAA;QACzD,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;QAE5C,MAAM,UAAU,EAAE,CAAA;QAClB,MAAM,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3C,MAAM,CAAC,MAAM,SAAS,CAAC,IAAI,WAAW,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAElF,MAAM,CAAC,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QAExE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACtD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QAEjD,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAA;QAC3C,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;QAE1C,MAAM,YAAY,CAAC,OAAO,CAAC,CAAA;QAC3B,MAAM,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QACvC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;QAExE,MAAM,CAAC,MAAM,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC9D,MAAM,CAAC,MAAM,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;QAE9E,MAAM,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAC7E,MAAM,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACjF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QACvC,MAAM,UAAU,GAAG,sBAAsB,CAAC,gBAAgB,CAAC,CAAA;QAE3D,MAAM,YAAY,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;QAC/D,MAAM,CAAC,MAAM,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAClE,MAAM,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACpF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,UAAU,GAAG,sBAAsB,CAAC,gBAAgB,CAAC,CAAA;QAC3D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;QACxD,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC;YAChC,GAAG,YAAY,EAAE;YACjB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAClD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,CAAA;QAEtE,MAAM,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACpF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=wallet.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wallet.test.d.ts","sourceRoot":"","sources":["../../src/wallet/wallet.test.ts"],"names":[],"mappings":""}
@@ -1,150 +0,0 @@
1
- import { beforeEach, describe, expect, it } from 'vitest';
2
- import { verifyMessage } from 'viem';
3
- import { createWallet, deleteWallet, getWalletInfo, hasWallet, importWallet, isUnlocked, isValidPassword, lockWallet, signMessage, setWalletChain, unlockWallet, } from './wallet.js';
4
- import { MemoryStorage } from './storage/memory.js';
5
- import { KDF_ITERATIONS_FLOOR, encryptSecret } from './crypto.js';
6
- import { privateKeyFromMnemonic, isValidMnemonic } from './signer.js';
7
- import { signSIWE } from './siwe.js';
8
- const HARDHAT_MNEMONIC = 'test test test test test test test test test test test junk';
9
- const HARDHAT_ADDRESS = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266';
10
- const password = '12345678';
11
- describe('wallet', () => {
12
- let storage;
13
- beforeEach(async () => {
14
- storage = new MemoryStorage();
15
- await lockWallet();
16
- });
17
- it('creates a wallet with a fresh mnemonic and stores it encrypted', async () => {
18
- const { walletInfo, mnemonic } = await createWallet({ password: password, storage });
19
- expect(mnemonic.split(' ')).toHaveLength(12);
20
- expect(walletInfo.address).toMatch(/^0x[0-9a-fA-F]{40}$/);
21
- expect(walletInfo.chain).toBe('celoSepolia');
22
- expect(await hasWallet(storage)).toBe(true);
23
- expect(isUnlocked()).toBe(true);
24
- const record = await storage.get();
25
- expect(record?.cipher.data).not.toContain(mnemonic);
26
- expect(record?.address).toBe(walletInfo.address);
27
- });
28
- it('rejects a password shorter than 8 characters', async () => {
29
- await expect(createWallet({ password: '123', storage })).rejects.toThrow(/at least 8 characters/i);
30
- await expect(createWallet({ password: 'short', storage })).rejects.toThrow(/at least 8 characters/i);
31
- await expect(createWallet({ password: '123456', storage })).rejects.toThrow(/at least 8 characters/i);
32
- });
33
- it('upgrades the work factor of an old record when it is unlocked', async () => {
34
- const legacy = new MemoryStorage();
35
- const secret = await encryptSecret(JSON.stringify({ v: 1, privateKey: privateKeyFromMnemonic(HARDHAT_MNEMONIC) }), password, 1000);
36
- await legacy.set({
37
- version: 1,
38
- address: HARDHAT_ADDRESS,
39
- chain: 'celoSepolia',
40
- createdAt: Date.now(),
41
- kdf: secret.kdf,
42
- cipher: secret.cipher,
43
- });
44
- expect((await unlockWallet(password, legacy)).address).toBe(HARDHAT_ADDRESS);
45
- const upgraded = await legacy.get();
46
- expect(upgraded.kdf.iterations).toBeGreaterThanOrEqual(KDF_ITERATIONS_FLOOR);
47
- await lockWallet();
48
- expect((await unlockWallet(password, legacy)).address).toBe(HARDHAT_ADDRESS);
49
- });
50
- it('accepts a passphrase of 8+ characters and unlocks with it', async () => {
51
- const { walletInfo } = await createWallet({ password: 'correct horse', storage });
52
- expect(walletInfo.address).toMatch(/^0x[a-fA-F0-9]{40}$/);
53
- await lockWallet();
54
- const unlocked = await unlockWallet('correct horse', storage);
55
- expect(unlocked.address).toBe(walletInfo.address);
56
- });
57
- it('isValidPassword accepts 8+ character secrets only', () => {
58
- expect(isValidPassword('12345678')).toBe(true);
59
- expect(isValidPassword('correct horse')).toBe(true);
60
- expect(isValidPassword('123456')).toBe(false);
61
- expect(isValidPassword('short')).toBe(false);
62
- expect(isValidPassword(' short ')).toBe(false);
63
- });
64
- it('imports a known mnemonic and derives the expected address', async () => {
65
- const info = await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage });
66
- expect(info.address).toBe(HARDHAT_ADDRESS);
67
- await lockWallet();
68
- expect(await hasWallet(storage)).toBe(true);
69
- const unlocked = await unlockWallet(password, storage);
70
- expect(unlocked.address).toBe(HARDHAT_ADDRESS);
71
- });
72
- it('rejects a mnemonic that is not BIP39', async () => {
73
- const typo = 'test test test test test test test test test test test tset';
74
- await expect(importWallet({ mnemonic: typo, password: password, storage })).rejects.toThrow(/invalid-mnemonic/);
75
- expect(await hasWallet(storage)).toBe(false);
76
- const badChecksum = 'test test test test test test test test test test test test';
77
- await expect(importWallet({ mnemonic: badChecksum, password: password, storage })).rejects.toThrow(/invalid-mnemonic/);
78
- await expect(importWallet({ mnemonic: HARDHAT_MNEMONIC.split(' ').slice(0, 11).join(' '), password: password, storage })).rejects.toThrow(/invalid-mnemonic/);
79
- });
80
- it('accepts the phrases it generates and a valid 24-word phrase', async () => {
81
- const { mnemonic } = await createWallet({ password: password, storage });
82
- expect(await isValidMnemonic(mnemonic)).toBe(true);
83
- expect(await isValidMnemonic(` ${HARDHAT_MNEMONIC.toUpperCase()} `)).toBe(true);
84
- expect(await isValidMnemonic('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art')).toBe(true);
85
- expect(await isValidMnemonic('not a mnemonic at all')).toBe(false);
86
- });
87
- it('reports the wallet info without unlocking', async () => {
88
- await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage });
89
- await lockWallet();
90
- const info = await getWalletInfo(storage);
91
- expect(info?.address).toBe(HARDHAT_ADDRESS);
92
- expect(isUnlocked()).toBe(false);
93
- });
94
- it('rejects a wrong password when unlocking', async () => {
95
- await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage });
96
- await lockWallet();
97
- await expect(unlockWallet('99999999', storage)).rejects.toThrow(/Wrong password/i);
98
- });
99
- it('signs messages only while unlocked', async () => {
100
- await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage });
101
- const signature = await signMessage('hello');
102
- expect(signature).toMatch(/^0x[0-9a-f]{130}$/i);
103
- expect(await verifyMessage({ address: HARDHAT_ADDRESS, message: 'hello', signature })).toBe(true);
104
- await lockWallet();
105
- await expect(signMessage('hello')).rejects.toThrow(/locked/i);
106
- });
107
- it('signs SIWE messages that verify against the wallet address', async () => {
108
- await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage });
109
- const message = [
110
- 'learn.tg:9001 wants you to sign in with your Ethereum account:',
111
- HARDHAT_ADDRESS,
112
- '',
113
- 'Sign in to Learn Through Games.',
114
- '',
115
- 'URI: https://learn.tg:9001',
116
- 'Version: 1',
117
- 'Chain ID: 11142220',
118
- 'Nonce: 12345678',
119
- 'Issued At: 2026-09-15T00:00:00.000Z',
120
- ].join('\n');
121
- const signature = await signSIWE(message);
122
- expect(await verifyMessage({ address: HARDHAT_ADDRESS, message, signature })).toBe(true);
123
- });
124
- it('switches the declared chain without invalidating the secret', async () => {
125
- await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage });
126
- expect((await getWalletInfo(storage))?.chain).toBe('celoSepolia');
127
- const info = await setWalletChain('celo', storage);
128
- expect(info.chain).toBe('celo');
129
- expect((await getWalletInfo(storage))?.chain).toBe('celo');
130
- expect(await signMessage('hola')).toMatch(/^0x/);
131
- await lockWallet();
132
- const unlocked = await unlockWallet(password, storage);
133
- expect(unlocked.address).toBe(HARDHAT_ADDRESS);
134
- expect(unlocked.chain).toBe('celo');
135
- });
136
- it('rejects an unsupported chain and a switch with no wallet', async () => {
137
- await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage });
138
- await expect(setWalletChain('optimism', storage)).rejects.toThrow(/unsupported chain/i);
139
- await expect(setWalletChain('celo', new MemoryStorage())).rejects.toThrow(/no in-app wallet/i);
140
- });
141
- it('deletes the wallet and locks it', async () => {
142
- await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage });
143
- await deleteWallet(storage);
144
- expect(await hasWallet(storage)).toBe(false);
145
- expect(await getWalletInfo(storage)).toBeNull();
146
- expect(isUnlocked()).toBe(false);
147
- await expect(unlockWallet(password, storage)).rejects.toThrow(/no in-app wallet/i);
148
- });
149
- });
150
- //# sourceMappingURL=wallet.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wallet.test.js","sourceRoot":"","sources":["../../src/wallet/wallet.test.ts"],"names":[],"mappings":"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"}