@pasosdejesus/m 0.23.1 → 0.25.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 (200) hide show
  1. package/dist/CHANGELOG.md +45 -1
  2. package/dist/e2e/full-wallet.d.ts +41 -0
  3. package/dist/e2e/full-wallet.d.ts.map +1 -0
  4. package/dist/e2e/full-wallet.js +138 -0
  5. package/dist/e2e/full-wallet.js.map +1 -0
  6. package/dist/e2e/full-wallet.test.d.ts +2 -0
  7. package/dist/e2e/full-wallet.test.d.ts.map +1 -0
  8. package/dist/e2e/full-wallet.test.js +37 -0
  9. package/dist/e2e/full-wallet.test.js.map +1 -0
  10. package/dist/e2e/index.d.ts +4 -0
  11. package/dist/e2e/index.d.ts.map +1 -1
  12. package/dist/e2e/index.js +2 -0
  13. package/dist/e2e/index.js.map +1 -1
  14. package/dist/e2e/local-node.d.ts +22 -0
  15. package/dist/e2e/local-node.d.ts.map +1 -0
  16. package/dist/e2e/local-node.js +144 -0
  17. package/dist/e2e/local-node.js.map +1 -0
  18. package/dist/e2e/local-node.test.d.ts +2 -0
  19. package/dist/e2e/local-node.test.d.ts.map +1 -0
  20. package/dist/e2e/local-node.test.js +43 -0
  21. package/dist/e2e/local-node.test.js.map +1 -0
  22. package/dist/i18n/locales/cli.d.ts.map +1 -1
  23. package/dist/i18n/locales/cli.js +2 -0
  24. package/dist/i18n/locales/cli.js.map +1 -1
  25. package/dist/m.js +7 -1
  26. package/dist/m.js.map +1 -1
  27. package/dist/tasks/e2e-summary.d.ts +13 -0
  28. package/dist/tasks/e2e-summary.d.ts.map +1 -0
  29. package/dist/tasks/e2e-summary.js +117 -0
  30. package/dist/tasks/e2e-summary.js.map +1 -0
  31. package/dist/tasks/e2e.d.ts +29 -0
  32. package/dist/tasks/e2e.d.ts.map +1 -1
  33. package/dist/tasks/e2e.js +130 -36
  34. package/dist/tasks/e2e.js.map +1 -1
  35. package/dist/tasks/e2e.test.d.ts +2 -0
  36. package/dist/tasks/e2e.test.d.ts.map +1 -0
  37. package/dist/tasks/e2e.test.js +108 -0
  38. package/dist/tasks/e2e.test.js.map +1 -0
  39. package/dist/tasks/wallet.d.ts.map +1 -1
  40. package/dist/tasks/wallet.js +14 -25
  41. package/dist/tasks/wallet.js.map +1 -1
  42. package/dist/test-utils/index.d.ts +1 -0
  43. package/dist/test-utils/index.d.ts.map +1 -1
  44. package/dist/test-utils/index.js +1 -0
  45. package/dist/test-utils/index.js.map +1 -1
  46. package/dist/test-utils/wallet-mocks.d.ts +44 -0
  47. package/dist/test-utils/wallet-mocks.d.ts.map +1 -0
  48. package/dist/test-utils/wallet-mocks.js +114 -0
  49. package/dist/test-utils/wallet-mocks.js.map +1 -0
  50. package/dist/test-utils/wallet-mocks.test.d.ts +2 -0
  51. package/dist/test-utils/wallet-mocks.test.d.ts.map +1 -0
  52. package/dist/test-utils/wallet-mocks.test.js +55 -0
  53. package/dist/test-utils/wallet-mocks.test.js.map +1 -0
  54. package/dist/test-utils/wallet-setup.d.ts +2 -0
  55. package/dist/test-utils/wallet-setup.d.ts.map +1 -0
  56. package/dist/test-utils/wallet-setup.js +23 -0
  57. package/dist/test-utils/wallet-setup.js.map +1 -0
  58. package/dist/test-utils/wallet-setup.test.d.ts +2 -0
  59. package/dist/test-utils/wallet-setup.test.d.ts.map +1 -0
  60. package/dist/test-utils/wallet-setup.test.js +18 -0
  61. package/dist/test-utils/wallet-setup.test.js.map +1 -0
  62. package/dist/wallet/biometric.d.ts +33 -0
  63. package/dist/wallet/biometric.d.ts.map +1 -0
  64. package/dist/wallet/biometric.js +88 -0
  65. package/dist/wallet/biometric.js.map +1 -0
  66. package/dist/wallet/biometric.test.d.ts +2 -0
  67. package/dist/wallet/biometric.test.d.ts.map +1 -0
  68. package/dist/wallet/biometric.test.js +44 -0
  69. package/dist/wallet/biometric.test.js.map +1 -0
  70. package/dist/wallet/crypto.d.ts +42 -0
  71. package/dist/wallet/crypto.d.ts.map +1 -0
  72. package/dist/wallet/crypto.js +127 -0
  73. package/dist/wallet/crypto.js.map +1 -0
  74. package/dist/wallet/crypto.test.d.ts +2 -0
  75. package/dist/wallet/crypto.test.d.ts.map +1 -0
  76. package/dist/wallet/crypto.test.js +34 -0
  77. package/dist/wallet/crypto.test.js.map +1 -0
  78. package/dist/wallet/destinations.d.ts +20 -0
  79. package/dist/wallet/destinations.d.ts.map +1 -0
  80. package/dist/wallet/destinations.js +98 -0
  81. package/dist/wallet/destinations.js.map +1 -0
  82. package/dist/wallet/destinations.test.d.ts +2 -0
  83. package/dist/wallet/destinations.test.d.ts.map +1 -0
  84. package/dist/wallet/destinations.test.js +34 -0
  85. package/dist/wallet/destinations.test.js.map +1 -0
  86. package/dist/wallet/external-provider.d.ts +33 -0
  87. package/dist/wallet/external-provider.d.ts.map +1 -0
  88. package/dist/wallet/external-provider.js +108 -0
  89. package/dist/wallet/external-provider.js.map +1 -0
  90. package/dist/wallet/external-provider.test.d.ts +2 -0
  91. package/dist/wallet/external-provider.test.d.ts.map +1 -0
  92. package/dist/wallet/external-provider.test.js +44 -0
  93. package/dist/wallet/external-provider.test.js.map +1 -0
  94. package/dist/wallet/index.d.ts +14 -0
  95. package/dist/wallet/index.d.ts.map +1 -0
  96. package/dist/wallet/index.js +24 -0
  97. package/dist/wallet/index.js.map +1 -0
  98. package/dist/wallet/indexeddb.test.d.ts +2 -0
  99. package/dist/wallet/indexeddb.test.d.ts.map +1 -0
  100. package/dist/wallet/indexeddb.test.js +28 -0
  101. package/dist/wallet/indexeddb.test.js.map +1 -0
  102. package/dist/wallet/kdf.test.d.ts +2 -0
  103. package/dist/wallet/kdf.test.d.ts.map +1 -0
  104. package/dist/wallet/kdf.test.js +54 -0
  105. package/dist/wallet/kdf.test.js.map +1 -0
  106. package/dist/wallet/next/components/InAppWalletSetup.d.ts +11 -0
  107. package/dist/wallet/next/components/InAppWalletSetup.d.ts.map +1 -0
  108. package/dist/wallet/next/components/InAppWalletSetup.js +55 -0
  109. package/dist/wallet/next/components/InAppWalletSetup.js.map +1 -0
  110. package/dist/wallet/next/components/InAppWalletUnlock.d.ts +9 -0
  111. package/dist/wallet/next/components/InAppWalletUnlock.d.ts.map +1 -0
  112. package/dist/wallet/next/components/InAppWalletUnlock.js +29 -0
  113. package/dist/wallet/next/components/InAppWalletUnlock.js.map +1 -0
  114. package/dist/wallet/next/components.test.d.ts +2 -0
  115. package/dist/wallet/next/components.test.d.ts.map +1 -0
  116. package/dist/wallet/next/components.test.js +122 -0
  117. package/dist/wallet/next/components.test.js.map +1 -0
  118. package/dist/wallet/next/i18n.d.ts +63 -0
  119. package/dist/wallet/next/i18n.d.ts.map +1 -0
  120. package/dist/wallet/next/i18n.js +64 -0
  121. package/dist/wallet/next/i18n.js.map +1 -0
  122. package/dist/wallet/next/index.d.ts +7 -0
  123. package/dist/wallet/next/index.d.ts.map +1 -0
  124. package/dist/wallet/next/index.js +12 -0
  125. package/dist/wallet/next/index.js.map +1 -0
  126. package/dist/wallet/next/namespaces.d.ts +17 -0
  127. package/dist/wallet/next/namespaces.d.ts.map +1 -0
  128. package/dist/wallet/next/namespaces.js +17 -0
  129. package/dist/wallet/next/namespaces.js.map +1 -0
  130. package/dist/wallet/next/useInAppWallet.d.ts +55 -0
  131. package/dist/wallet/next/useInAppWallet.d.ts.map +1 -0
  132. package/dist/wallet/next/useInAppWallet.js +261 -0
  133. package/dist/wallet/next/useInAppWallet.js.map +1 -0
  134. package/dist/wallet/next/useInAppWallet.test.d.ts +2 -0
  135. package/dist/wallet/next/useInAppWallet.test.d.ts.map +1 -0
  136. package/dist/wallet/next/useInAppWallet.test.js +261 -0
  137. package/dist/wallet/next/useInAppWallet.test.js.map +1 -0
  138. package/dist/wallet/provider.d.ts +38 -0
  139. package/dist/wallet/provider.d.ts.map +1 -0
  140. package/dist/wallet/provider.js +285 -0
  141. package/dist/wallet/provider.js.map +1 -0
  142. package/dist/wallet/provider.test.d.ts +2 -0
  143. package/dist/wallet/provider.test.d.ts.map +1 -0
  144. package/dist/wallet/provider.test.js +170 -0
  145. package/dist/wallet/provider.test.js.map +1 -0
  146. package/dist/wallet/signer.d.ts +55 -0
  147. package/dist/wallet/signer.d.ts.map +1 -0
  148. package/dist/wallet/signer.js +91 -0
  149. package/dist/wallet/signer.js.map +1 -0
  150. package/dist/wallet/signer.test.d.ts +2 -0
  151. package/dist/wallet/signer.test.d.ts.map +1 -0
  152. package/dist/wallet/signer.test.js +62 -0
  153. package/dist/wallet/signer.test.js.map +1 -0
  154. package/dist/wallet/siwe.d.ts +2 -0
  155. package/dist/wallet/siwe.d.ts.map +1 -0
  156. package/dist/wallet/siwe.js +5 -0
  157. package/dist/wallet/siwe.js.map +1 -0
  158. package/dist/wallet/storage/file.d.ts +19 -0
  159. package/dist/wallet/storage/file.d.ts.map +1 -0
  160. package/dist/wallet/storage/file.js +48 -0
  161. package/dist/wallet/storage/file.js.map +1 -0
  162. package/dist/wallet/storage/idb.d.ts +25 -0
  163. package/dist/wallet/storage/idb.d.ts.map +1 -0
  164. package/dist/wallet/storage/idb.js +58 -0
  165. package/dist/wallet/storage/idb.js.map +1 -0
  166. package/dist/wallet/storage/index.d.ts +5 -0
  167. package/dist/wallet/storage/index.d.ts.map +1 -0
  168. package/dist/wallet/storage/index.js +4 -0
  169. package/dist/wallet/storage/index.js.map +1 -0
  170. package/dist/wallet/storage/indexeddb.d.ts +8 -0
  171. package/dist/wallet/storage/indexeddb.d.ts.map +1 -0
  172. package/dist/wallet/storage/indexeddb.js +18 -0
  173. package/dist/wallet/storage/indexeddb.js.map +1 -0
  174. package/dist/wallet/storage/memory.d.ts +10 -0
  175. package/dist/wallet/storage/memory.d.ts.map +1 -0
  176. package/dist/wallet/storage/memory.js +19 -0
  177. package/dist/wallet/storage/memory.js.map +1 -0
  178. package/dist/wallet/storage.test.d.ts +2 -0
  179. package/dist/wallet/storage.test.d.ts.map +1 -0
  180. package/dist/wallet/storage.test.js +103 -0
  181. package/dist/wallet/storage.test.js.map +1 -0
  182. package/dist/wallet/types.d.ts +69 -0
  183. package/dist/wallet/types.d.ts.map +1 -0
  184. package/dist/wallet/types.js +6 -0
  185. package/dist/wallet/types.js.map +1 -0
  186. package/dist/wallet/wallet.d.ts +81 -0
  187. package/dist/wallet/wallet.d.ts.map +1 -0
  188. package/dist/wallet/wallet.js +358 -0
  189. package/dist/wallet/wallet.js.map +1 -0
  190. package/dist/wallet/wallet.test.d.ts +2 -0
  191. package/dist/wallet/wallet.test.d.ts.map +1 -0
  192. package/dist/wallet/wallet.test.js +150 -0
  193. package/dist/wallet/wallet.test.js.map +1 -0
  194. package/dist/wallet/web-authn.d.ts +78 -0
  195. package/dist/wallet/web-authn.d.ts.map +1 -0
  196. package/dist/wallet/web-authn.js +250 -0
  197. package/dist/wallet/web-authn.js.map +1 -0
  198. package/package.json +18 -4
  199. package/src/e2e/README.md +67 -0
  200. package/src/wallet/README.md +119 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=destinations.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destinations.test.d.ts","sourceRoot":"","sources":["../../src/wallet/destinations.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ import { beforeEach, describe, expect, it } from 'vitest';
2
+ import { clearDestinations, isKnownDestination, rememberDestination, setDestinationsPrefix, } from './destinations.js';
3
+ const WALLET = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266';
4
+ const OTHER = '0x70997970C51812dc3A010C7d01b50e0d17dc79C8';
5
+ describe('destinations (R-#253)', () => {
6
+ beforeEach(() => {
7
+ setDestinationsPrefix('m-wallet-test.destinations.');
8
+ clearDestinations();
9
+ });
10
+ it('treats an unseen address as new', () => {
11
+ expect(isKnownDestination(WALLET, OTHER)).toBe(false);
12
+ });
13
+ it('remembers an address, case-insensitively', () => {
14
+ rememberDestination(WALLET, OTHER);
15
+ expect(isKnownDestination(WALLET, OTHER)).toBe(true);
16
+ expect(isKnownDestination(WALLET, OTHER.toLowerCase())).toBe(true);
17
+ });
18
+ it('keeps the list per wallet', () => {
19
+ rememberDestination(WALLET, OTHER);
20
+ expect(isKnownDestination('0x0000000000000000000000000000000000000001', OTHER)).toBe(false);
21
+ });
22
+ it('is false for empty input', () => {
23
+ expect(isKnownDestination('', OTHER)).toBe(false);
24
+ expect(isKnownDestination(WALLET, '')).toBe(false);
25
+ });
26
+ it('clears one wallet without touching the others', () => {
27
+ rememberDestination(WALLET, OTHER);
28
+ rememberDestination('0x0000000000000000000000000000000000000001', OTHER);
29
+ clearDestinations(WALLET);
30
+ expect(isKnownDestination(WALLET, OTHER)).toBe(false);
31
+ expect(isKnownDestination('0x0000000000000000000000000000000000000001', OTHER)).toBe(true);
32
+ });
33
+ });
34
+ //# sourceMappingURL=destinations.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destinations.test.js","sourceRoot":"","sources":["../../src/wallet/destinations.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACzD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,mBAAmB,CAAA;AAE1B,MAAM,MAAM,GAAG,4CAA4C,CAAA;AAC3D,MAAM,KAAK,GAAG,4CAA4C,CAAA;AAE1D,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,UAAU,CAAC,GAAG,EAAE;QACd,qBAAqB,CAAC,6BAA6B,CAAC,CAAA;QACpD,iBAAiB,EAAE,CAAA;IACrB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAClC,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpD,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAClC,MAAM,CAAC,kBAAkB,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC7F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,kBAAkB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjD,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAClC,mBAAmB,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAA;QACxE,iBAAiB,CAAC,MAAM,CAAC,CAAA;QACzB,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACrD,MAAM,CAAC,kBAAkB,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,33 @@
1
+ import type { Eip1193Provider } from './types.js';
2
+ export interface AnnouncedProvider {
3
+ uuid: string;
4
+ name: string;
5
+ rdns: string;
6
+ icon?: string;
7
+ provider: Eip1193Provider;
8
+ }
9
+ export interface ExternalProviderState {
10
+ provider: Eip1193Provider | null;
11
+ announced: AnnouncedProvider[];
12
+ /** De dónde salió el proveedor elegido (`window.ethereum`, EIP-6963 o ninguno). */
13
+ source: ExternalProviderSource;
14
+ /** rdns del anuncio elegido; `null` si es `window.ethereum`. */
15
+ rdns: string | null;
16
+ }
17
+ export type ExternalProviderSource = 'window.ethereum' | 'eip6963' | null;
18
+ /** Suscribe un listener (para `useSyncExternalStore` del consumidor). */
19
+ export declare function subscribeExternalProvider(listener: () => void): () => void;
20
+ /** Snapshot actual del store (para `useSyncExternalStore`). */
21
+ export declare function getExternalProviderSnapshot(): ExternalProviderState;
22
+ /** Effective injected provider, or `null` (also callable outside React). */
23
+ export declare function getExternalProvider(): Eip1193Provider | null;
24
+ /**
25
+ * Valor para `wallet_source` cuando la sesión se inicia con una billetera inyectada:
26
+ * `eip6963:<rdns>` si llegó por anuncio, `window.ethereum` si es el objeto clásico y
27
+ * `unknown` si todavía no hay proveedor.
28
+ */
29
+ export declare function externalWalletSource(): string;
30
+ export declare function getAnnouncedProviders(): AnnouncedProvider[];
31
+ /** Test-only: forgets the listeners and the chosen provider. */
32
+ export declare function resetExternalProviderForTests(): void;
33
+ //# sourceMappingURL=external-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-provider.d.ts","sourceRoot":"","sources":["../../src/wallet/external-provider.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,eAAe,CAAA;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAA;IAChC,SAAS,EAAE,iBAAiB,EAAE,CAAA;IAC9B,mFAAmF;IACnF,MAAM,EAAE,sBAAsB,CAAA;IAC9B,gEAAgE;IAChE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB;AAED,MAAM,MAAM,sBAAsB,GAAG,iBAAiB,GAAG,SAAS,GAAG,IAAI,CAAA;AAuEzE,yEAAyE;AACzE,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAM1E;AAED,+DAA+D;AAC/D,wBAAgB,2BAA2B,IAAI,qBAAqB,CAInE;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,IAAI,eAAe,GAAG,IAAI,CAI5D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C;AAED,wBAAgB,qBAAqB,IAAI,iBAAiB,EAAE,CAG3D;AAED,gEAAgE;AAChE,wBAAgB,6BAA6B,IAAI,IAAI,CAIpD"}
@@ -0,0 +1,108 @@
1
+ const EMPTY = { provider: null, announced: [], source: null, rdns: null };
2
+ let state = EMPTY;
3
+ let started = false;
4
+ const listeners = new Set();
5
+ function emit(partial) {
6
+ state = { ...state, ...partial };
7
+ for (const listener of listeners)
8
+ listener();
9
+ }
10
+ function injected() {
11
+ if (typeof window === 'undefined')
12
+ return null;
13
+ return window.ethereum ?? null;
14
+ }
15
+ /** Sticky choice: `window.ethereum` when it exists, otherwise the announcement. */
16
+ function choose() {
17
+ if (state.provider)
18
+ return;
19
+ const direct = injected();
20
+ if (direct) {
21
+ emit({ provider: direct, source: 'window.ethereum', rdns: null });
22
+ return;
23
+ }
24
+ if (state.announced[0]) {
25
+ emit({ provider: state.announced[0].provider, source: 'eip6963', rdns: state.announced[0].rdns });
26
+ }
27
+ }
28
+ function start() {
29
+ if (started || typeof window === 'undefined')
30
+ return;
31
+ started = true;
32
+ window.addEventListener('eip6963:announceProvider', (event) => {
33
+ const detail = event.detail;
34
+ if (!detail?.provider)
35
+ return;
36
+ const rdns = detail.info?.rdns ?? detail.info?.name ?? 'unknown';
37
+ const announced = [
38
+ ...state.announced.filter((item) => item.rdns !== rdns),
39
+ {
40
+ uuid: detail.info?.uuid ?? rdns,
41
+ name: detail.info?.name ?? rdns,
42
+ rdns,
43
+ icon: detail.info?.icon,
44
+ provider: detail.provider,
45
+ },
46
+ ];
47
+ emit({ announced });
48
+ choose();
49
+ });
50
+ window.addEventListener('ethereum#initialized', choose);
51
+ window.dispatchEvent(new Event('eip6963:requestProvider'));
52
+ // Algunas WebViews inyectan tarde: reintentar un rato y una vez al primer gesto.
53
+ let attempts = 0;
54
+ const timer = window.setInterval(() => {
55
+ attempts += 1;
56
+ choose();
57
+ if (attempts >= 8)
58
+ window.clearInterval(timer);
59
+ }, 400);
60
+ for (const eventName of ['pointerdown', 'keydown', 'focus', 'visibilitychange']) {
61
+ window.addEventListener(eventName, choose, { once: true });
62
+ }
63
+ }
64
+ /** Suscribe un listener (para `useSyncExternalStore` del consumidor). */
65
+ export function subscribeExternalProvider(listener) {
66
+ start();
67
+ listeners.add(listener);
68
+ return () => {
69
+ listeners.delete(listener);
70
+ };
71
+ }
72
+ /** Snapshot actual del store (para `useSyncExternalStore`). */
73
+ export function getExternalProviderSnapshot() {
74
+ start();
75
+ choose();
76
+ return state;
77
+ }
78
+ /** Effective injected provider, or `null` (also callable outside React). */
79
+ export function getExternalProvider() {
80
+ start();
81
+ choose();
82
+ return state.provider;
83
+ }
84
+ /**
85
+ * Valor para `wallet_source` cuando la sesión se inicia con una billetera inyectada:
86
+ * `eip6963:<rdns>` si llegó por anuncio, `window.ethereum` si es el objeto clásico y
87
+ * `unknown` si todavía no hay proveedor.
88
+ */
89
+ export function externalWalletSource() {
90
+ start();
91
+ choose();
92
+ if (state.source === 'eip6963')
93
+ return state.rdns ? `eip6963:${state.rdns}` : 'eip6963:unknown';
94
+ if (state.source === 'window.ethereum')
95
+ return 'window.ethereum';
96
+ return 'unknown';
97
+ }
98
+ export function getAnnouncedProviders() {
99
+ start();
100
+ return state.announced;
101
+ }
102
+ /** Test-only: forgets the listeners and the chosen provider. */
103
+ export function resetExternalProviderForTests() {
104
+ state = EMPTY;
105
+ started = false;
106
+ listeners.clear();
107
+ }
108
+ //# sourceMappingURL=external-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-provider.js","sourceRoot":"","sources":["../../src/wallet/external-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=external-provider.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-provider.test.d.ts","sourceRoot":"","sources":["../../src/wallet/external-provider.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ // @vitest-environment jsdom
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
3
+ import { externalWalletSource, getAnnouncedProviders, getExternalProvider, resetExternalProviderForTests, } from './external-provider.js';
4
+ const provider = () => ({ request: async () => null });
5
+ function announce(p, info) {
6
+ window.dispatchEvent(new CustomEvent('eip6963:announceProvider', {
7
+ detail: { info: { uuid: info.rdns, ...info }, provider: p },
8
+ }));
9
+ }
10
+ beforeEach(() => {
11
+ vi.useFakeTimers();
12
+ delete window.ethereum;
13
+ resetExternalProviderForTests();
14
+ });
15
+ afterEach(() => {
16
+ vi.useRealTimers();
17
+ delete window.ethereum;
18
+ });
19
+ describe('external-provider (EIP-6963)', () => {
20
+ it('prefers window.ethereum when it exists', () => {
21
+ const injected = provider();
22
+ window.ethereum = injected;
23
+ resetExternalProviderForTests();
24
+ expect(getExternalProvider()).toBe(injected);
25
+ expect(externalWalletSource()).toBe('window.ethereum');
26
+ });
27
+ it('resolves a late EIP-6963 announcement when there is no window.ethereum', () => {
28
+ const announced = provider();
29
+ expect(getExternalProvider()).toBeNull();
30
+ announce(announced, { name: 'Rabby', rdns: 'io.rabby' });
31
+ expect(getExternalProvider()).toBe(announced);
32
+ expect(externalWalletSource()).toBe('eip6963:io.rabby');
33
+ expect(getAnnouncedProviders().map((item) => item.rdns)).toContain('io.rabby');
34
+ });
35
+ it('stays on the first provider (the choice is sticky)', () => {
36
+ const first = provider();
37
+ const second = provider();
38
+ getExternalProvider();
39
+ announce(first, { name: 'One', rdns: 'one' });
40
+ announce(second, { name: 'Two', rdns: 'two' });
41
+ expect(getExternalProvider()).toBe(first);
42
+ });
43
+ });
44
+ //# sourceMappingURL=external-provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-provider.test.js","sourceRoot":"","sources":["../../src/wallet/external-provider.test.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACxE,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,6BAA6B,GAC9B,MAAM,wBAAwB,CAAA;AAG/B,MAAM,QAAQ,GAAG,GAAoB,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;AAEvE,SAAS,QAAQ,CAAC,CAAkB,EAAE,IAAoC;IACxE,MAAM,CAAC,aAAa,CAClB,IAAI,WAAW,CAAC,0BAA0B,EAAE;QAC1C,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;KAC5D,CAAC,CACH,CAAA;AACH,CAAC;AAED,UAAU,CAAC,GAAG,EAAE;IACd,EAAE,CAAC,aAAa,EAAE,CAAA;IAClB,OAAQ,MAAiC,CAAC,QAAQ,CAAA;IAClD,6BAA6B,EAAE,CAAA;AACjC,CAAC,CAAC,CAAA;AAEF,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,aAAa,EAAE,CAAA;IAClB,OAAQ,MAAiC,CAAC,QAAQ,CAAA;AACpD,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAC1B;QAAC,MAAyC,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAC/D,6BAA6B,EAAE,CAAA;QAC/B,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC5C,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,SAAS,GAAG,QAAQ,EAAE,CAAA;QAC5B,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;QACxC,QAAQ,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;QAExD,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC7C,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QACvD,MAAM,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;IAChF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;QACxB,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAA;QACzB,mBAAmB,EAAE,CAAA;QACrB,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC7C,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC9C,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,14 @@
1
+ export { createWallet, importWallet, unlockWallet, lockWallet, deleteWallet, currentLockEpoch, hasWallet, getWalletInfo, setWalletChain, isValidPassword, enableBiometricUnlock, hasBiometricUnlock, unlockWithBiometric, disableBiometricUnlock, exportMnemonic, exportPrivateKey, isUnlocked, getUnlockedAccount, getUnlockedInfo, signMessage, signTypedData, signTransaction, } from './wallet.js';
2
+ export { signSIWE } from './siwe.js';
3
+ export { addressFromMnemonic, accountFromMnemonic, accountFromPrivateKey, assertValidMnemonic, isValidMnemonic, newMnemonic, normalizeMnemonic, privateKeyFromMnemonic, keccak, type PrivateKey, } from './signer.js';
4
+ export { encryptSecret, decryptSecret, sha256, toBase64, fromBase64, wipe, KDF_ITERATIONS, KDF_ITERATIONS_FLOOR, KDF_ITERATIONS_CEILING, KDF_BUDGET_MS, calibrateIterations, normalizePassword, type EncryptedSecret, } from './crypto.js';
5
+ export { detectPlatformSupport, createPrfCredential, evaluatePrf, deriveWrappingKey, setRpName, USER_VERIFICATION_GRACE_MS, markUserVerified, clearUserVerification, hasRecentUserVerification, signalUnknownCredential, isUserCancelledError, type PlatformSupport, type PrfCredential, } from './web-authn.js';
6
+ export { type BiometricRecord, readBiometricRecord, writeBiometricRecord, deleteBiometricRecord, forgetBiometricCredential, sealWithPrfSecret, unsealWithPrfSecret, } from './biometric.js';
7
+ export { getInAppWalletProvider, extractDestination, requireFundsConfirmation, emitAccountsChanged, type ProviderOptions, } from './provider.js';
8
+ export { isKnownDestination, rememberDestination, clearDestinations, setDestinationsPrefix, } from './destinations.js';
9
+ export { getExternalProvider, externalWalletSource, getAnnouncedProviders, subscribeExternalProvider, getExternalProviderSnapshot, resetExternalProviderForTests, type AnnouncedProvider, type ExternalProviderState, type ExternalProviderSource, } from './external-provider.js';
10
+ export { MemoryStorage } from './storage/memory.js';
11
+ export { IndexedDBStorage } from './storage/indexeddb.js';
12
+ export { setWalletDbName, getWalletDbName, DB_NAME } from './storage/idb.js';
13
+ export { CHAIN_IDS, DEFAULT_CHAIN, type ChainName, type CreateWalletOptions, type ImportWalletOptions, type StorageAdapter, type StoredWallet, type WalletInfo, type Eip1193Provider, type Eip1193RequestArgs, } from './types.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wallet/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,aAAa,EACb,eAAe,GAChB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,sBAAsB,EACtB,MAAM,EACN,KAAK,UAAU,GAChB,MAAM,aAAa,CAAA;AAEpB,OAAO,EACL,aAAa,EACb,aAAa,EACb,MAAM,EACN,QAAQ,EACR,UAAU,EACV,IAAI,EACJ,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,eAAe,GACrB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,0BAA0B,EAC1B,gBAAgB,EAChB,qBAAqB,EACrB,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EACpB,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EACL,KAAK,eAAe,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,gBAAgB,CAAA;AAGvB,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,KAAK,eAAe,GACrB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,2BAA2B,EAC3B,6BAA6B,EAC7B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE5E,OAAO,EACL,SAAS,EACT,aAAa,EACb,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,kBAAkB,GACxB,MAAM,YAAY,CAAA"}
@@ -0,0 +1,24 @@
1
+ // @pasosdejesus/m/wallet — núcleo compartido de billetera (`m/REQ/14`).
2
+ //
3
+ // Sin React y sin Kysely: mnemónica (BIP39), derivación, firma, cifrado en reposo
4
+ // (PBKDF2 + AES-GCM), almacenamiento intercambiable, estado de la billetera in-app,
5
+ // provider EIP-1193, verificación del usuario (WebAuthn L1/L2), destinos y el
6
+ // resolutor del proveedor inyectado (EIP-6963). Lo usan el CLI de `m` y los
7
+ // consumidores (learn.tg, sivel3, stable-sl).
8
+ export { createWallet, importWallet, unlockWallet, lockWallet, deleteWallet, currentLockEpoch, hasWallet, getWalletInfo, setWalletChain, isValidPassword, enableBiometricUnlock, hasBiometricUnlock, unlockWithBiometric, disableBiometricUnlock, exportMnemonic, exportPrivateKey, isUnlocked, getUnlockedAccount, getUnlockedInfo, signMessage, signTypedData, signTransaction, } from './wallet.js';
9
+ export { signSIWE } from './siwe.js';
10
+ export { addressFromMnemonic, accountFromMnemonic, accountFromPrivateKey, assertValidMnemonic, isValidMnemonic, newMnemonic, normalizeMnemonic, privateKeyFromMnemonic, keccak, } from './signer.js';
11
+ export { encryptSecret, decryptSecret, sha256, toBase64, fromBase64, wipe, KDF_ITERATIONS, KDF_ITERATIONS_FLOOR, KDF_ITERATIONS_CEILING, KDF_BUDGET_MS, calibrateIterations, normalizePassword, } from './crypto.js';
12
+ // Capa L1/L2: gesto WebAuthn y sello con el secreto PRF.
13
+ export { detectPlatformSupport, createPrfCredential, evaluatePrf, deriveWrappingKey, setRpName, USER_VERIFICATION_GRACE_MS, markUserVerified, clearUserVerification, hasRecentUserVerification, signalUnknownCredential, isUserCancelledError, } from './web-authn.js';
14
+ export { readBiometricRecord, writeBiometricRecord, deleteBiometricRecord, forgetBiometricCredential, sealWithPrfSecret, unsealWithPrfSecret, } from './biometric.js';
15
+ // Provider EIP-1193 de la billetera in-app y destinos conocidos.
16
+ export { getInAppWalletProvider, extractDestination, requireFundsConfirmation, emitAccountsChanged, } from './provider.js';
17
+ export { isKnownDestination, rememberDestination, clearDestinations, setDestinationsPrefix, } from './destinations.js';
18
+ // Resolutor del proveedor inyectado (EIP-6963) — graduado de learn.tg.
19
+ export { getExternalProvider, externalWalletSource, getAnnouncedProviders, subscribeExternalProvider, getExternalProviderSnapshot, resetExternalProviderForTests, } from './external-provider.js';
20
+ export { MemoryStorage } from './storage/memory.js';
21
+ export { IndexedDBStorage } from './storage/indexeddb.js';
22
+ export { setWalletDbName, getWalletDbName, DB_NAME } from './storage/idb.js';
23
+ export { CHAIN_IDS, DEFAULT_CHAIN, } from './types.js';
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wallet/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,EAAE;AACF,kFAAkF;AAClF,oFAAoF;AACpF,8EAA8E;AAC9E,4EAA4E;AAC5E,8CAA8C;AAC9C,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,aAAa,EACb,eAAe,GAChB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,sBAAsB,EACtB,MAAM,GAEP,MAAM,aAAa,CAAA;AAEpB,OAAO,EACL,aAAa,EACb,aAAa,EACb,MAAM,EACN,QAAQ,EACR,UAAU,EACV,IAAI,EACJ,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,GAElB,MAAM,aAAa,CAAA;AAEpB,yDAAyD;AACzD,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,0BAA0B,EAC1B,gBAAgB,EAChB,qBAAqB,EACrB,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,GAGrB,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAEL,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,gBAAgB,CAAA;AAEvB,iEAAiE;AACjE,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,GAEpB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,mBAAmB,CAAA;AAE1B,uEAAuE;AACvE,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,2BAA2B,EAC3B,6BAA6B,GAI9B,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE5E,OAAO,EACL,SAAS,EACT,aAAa,GASd,MAAM,YAAY,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=indexeddb.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexeddb.test.d.ts","sourceRoot":"","sources":["../../src/wallet/indexeddb.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import { beforeAll, describe, expect, it } from 'vitest';
2
+ import { installIndexedDB } from '../test-utils/wallet-mocks.js';
3
+ import { IndexedDBStorage } from './storage/indexeddb.js';
4
+ const record = {
5
+ version: 1,
6
+ address: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
7
+ chain: 'celoSepolia',
8
+ createdAt: 1,
9
+ kdf: { name: 'PBKDF2', hash: 'SHA-256', iterations: 600_000, salt: 'AA==' },
10
+ cipher: { name: 'AES-GCM', iv: 'BB==', data: 'CC==' },
11
+ };
12
+ beforeAll(async () => {
13
+ await installIndexedDB();
14
+ });
15
+ describe('IndexedDBStorage', () => {
16
+ it('stores, reads and deletes the encrypted record', async () => {
17
+ const storage = new IndexedDBStorage();
18
+ await storage.delete();
19
+ expect(await storage.has()).toBe(false);
20
+ expect(await storage.get()).toBeNull();
21
+ await storage.set(record);
22
+ expect(await storage.has()).toBe(true);
23
+ expect(await storage.get()).toEqual(record);
24
+ await storage.delete();
25
+ expect(await storage.has()).toBe(false);
26
+ });
27
+ });
28
+ //# sourceMappingURL=indexeddb.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexeddb.test.js","sourceRoot":"","sources":["../../src/wallet/indexeddb.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAGzD,MAAM,MAAM,GAAiB;IAC3B,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,4CAA4C;IACrD,KAAK,EAAE,aAAa;IACpB,SAAS,EAAE,CAAC;IACZ,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;IAC3E,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;CACtD,CAAA;AAED,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,gBAAgB,EAAE,CAAA;AAC1B,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAA;QACtC,MAAM,OAAO,CAAC,MAAM,EAAE,CAAA;QAEtB,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,MAAM,CAAC,CAAA;QACzB,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,MAAM,CAAC,CAAA;QAE3C,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;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=kdf.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kdf.test.d.ts","sourceRoot":"","sources":["../../src/wallet/kdf.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,54 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { KDF_ITERATIONS_CEILING, KDF_ITERATIONS_FLOOR, calibrateIterations, decryptSecret, encryptSecret, normalizePassword, } from './crypto.js';
3
+ describe('password normalization (R-#251)', () => {
4
+ it('trims and applies NFKD', () => {
5
+ expect(normalizePassword(' correct horse ')).toBe('correct horse');
6
+ expect(normalizePassword('café')).toBe('cafe\u0301');
7
+ expect(normalizePassword('clave')).toBe('clave');
8
+ });
9
+ it('is idempotent', () => {
10
+ const once = normalizePassword(' ñandú ');
11
+ expect(normalizePassword(once)).toBe(once);
12
+ });
13
+ });
14
+ describe('KDF calibration (R-#251)', () => {
15
+ it('never goes below the historical floor', async () => {
16
+ const slow = async () => 5000;
17
+ expect(await calibrateIterations(slow, 400)).toBe(KDF_ITERATIONS_FLOOR);
18
+ });
19
+ it('scales the count up to the budget on a fast device', async () => {
20
+ const fast = async () => 100;
21
+ expect(await calibrateIterations(fast, 400)).toBe(KDF_ITERATIONS_FLOOR * 4);
22
+ });
23
+ it('clamps at the ceiling so a slow phone cannot hang', async () => {
24
+ const instant = async () => 0.01;
25
+ expect(await calibrateIterations(instant, 400)).toBe(KDF_ITERATIONS_CEILING);
26
+ });
27
+ it('falls back to the floor when the measurement fails', async () => {
28
+ const broken = async () => { throw new Error('no crypto'); };
29
+ expect(await calibrateIterations(broken)).toBe(KDF_ITERATIONS_FLOOR);
30
+ const nonsense = async () => 0;
31
+ expect(await calibrateIterations(nonsense)).toBe(KDF_ITERATIONS_FLOOR);
32
+ });
33
+ });
34
+ describe('record work factor (R-#251)', () => {
35
+ it('stores the iteration count it was asked for', async () => {
36
+ const secret = await encryptSecret('{"v":1}', 'clave-de-prueba', 1234);
37
+ expect(secret.kdf.iterations).toBe(1234);
38
+ expect(await decryptSecret(secret, 'clave-de-prueba')).toBe('{"v":1}');
39
+ });
40
+ it('uses the historical count by default', async () => {
41
+ const secret = await encryptSecret('{"v":1}', 'clave-de-prueba');
42
+ expect(secret.kdf.iterations).toBe(KDF_ITERATIONS_FLOOR);
43
+ });
44
+ it('opens a record whose password was written with spaces or accents', async () => {
45
+ const secret = await encryptSecret('{"v":1}', 'café con leche');
46
+ expect(await decryptSecret(secret, ' café con leche ')).toBe('{"v":1}');
47
+ expect(await decryptSecret(secret, 'cafe\u0301 con leche')).toBe('{"v":1}');
48
+ });
49
+ it('still rejects a wrong password', async () => {
50
+ const secret = await encryptSecret('{"v":1}', 'clave-de-prueba');
51
+ await expect(decryptSecret(secret, 'otra-clave')).rejects.toThrow(/Wrong password/);
52
+ });
53
+ });
54
+ //# sourceMappingURL=kdf.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kdf.test.js","sourceRoot":"","sources":["../../src/wallet/kdf.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type Lang, type WalletReactMessages } from '../i18n.js';
2
+ export interface InAppWalletSetupProps {
3
+ lang?: Lang;
4
+ onDone?: (address: `0x${string}`) => void;
5
+ /** La aplicación decide a qué guía de migración apuntar; el paquete no fija rutas. */
6
+ migrationHref?: string;
7
+ /** Textos del host (sobreescriben los por defecto). */
8
+ messages?: Partial<WalletReactMessages>;
9
+ }
10
+ export declare function InAppWalletSetup({ lang, onDone, migrationHref, messages }: InAppWalletSetupProps): import("react").JSX.Element;
11
+ //# sourceMappingURL=InAppWalletSetup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InAppWalletSetup.d.ts","sourceRoot":"","sources":["../../../../src/wallet/next/components/InAppWalletSetup.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAmB,KAAK,IAAI,EAAmB,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAGlG,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI,CAAA;IACzC,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;CACxC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,IAAW,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,qBAAqB,+BA4IvG"}
@@ -0,0 +1,55 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { isValidPassword } from '../../index.js';
5
+ import { resolveMessages } from '../i18n.js';
6
+ import { useInAppWallet } from '../useInAppWallet.js';
7
+ export function InAppWalletSetup({ lang = 'en', onDone, migrationHref, messages }) {
8
+ const msg = (key) => resolveMessages(lang, messages)[key];
9
+ const { create, importExisting, error } = useInAppWallet();
10
+ const [mode, setMode] = useState('create');
11
+ const [password, setPassword] = useState('');
12
+ const [confirm, setConfirm] = useState('');
13
+ const [mnemonic, setMnemonic] = useState('');
14
+ const [privateKey, setPrivateKey] = useState('');
15
+ const [recoveryPhrase, setRecoveryPhrase] = useState(null);
16
+ const [localError, setLocalError] = useState(null);
17
+ const [busy, setBusy] = useState(false);
18
+ async function handleSubmit(event) {
19
+ event.preventDefault();
20
+ setLocalError(null);
21
+ if (!isValidPassword(password)) {
22
+ setLocalError(msg('passwordTooShort'));
23
+ return;
24
+ }
25
+ if (password !== confirm) {
26
+ setLocalError(msg('passwordMismatch'));
27
+ return;
28
+ }
29
+ setBusy(true);
30
+ try {
31
+ if (mode === 'create') {
32
+ const result = await create(password);
33
+ setRecoveryPhrase(result.mnemonic);
34
+ onDone?.(result.walletInfo.address);
35
+ }
36
+ else {
37
+ const info = await importExisting({
38
+ password,
39
+ mnemonic: mnemonic.trim() ? mnemonic : undefined,
40
+ privateKey: privateKey.trim() ? privateKey.trim() : undefined,
41
+ });
42
+ onDone?.(info.address);
43
+ }
44
+ }
45
+ catch (e) {
46
+ setLocalError(e instanceof Error ? e.message : String(e));
47
+ }
48
+ finally {
49
+ setBusy(false);
50
+ }
51
+ }
52
+ const message = localError ?? error;
53
+ return (_jsxs("form", { onSubmit: handleSubmit, "data-testid": "in-app-wallet-setup", children: [_jsx("h2", { children: mode === 'create' ? msg('createTitle') : msg('importTitle') }), _jsxs("div", { role: "group", children: [_jsx("button", { type: "button", "data-testid": "mode-create", onClick: () => setMode('create'), "aria-pressed": mode === 'create', children: msg('create') }), _jsx("button", { type: "button", "data-testid": "mode-import", onClick: () => setMode('import'), "aria-pressed": mode === 'import', children: msg('import') })] }), mode === 'create' && (_jsxs("p", { "data-testid": "import-hint", children: [msg('alreadyHave'), ' ', _jsx("button", { type: "button", "data-testid": "switch-to-import", onClick: () => setMode('import'), children: msg('import') })] })), mode === 'import' && (_jsxs(_Fragment, { children: [_jsxs("p", { "data-testid": "import-security", children: [msg('importSecurity'), migrationHref && (_jsxs(_Fragment, { children: [' ', _jsx("a", { href: migrationHref, "data-testid": "migration-guide", children: msg('migrationGuide') })] }))] }), _jsxs("label", { children: [msg('mnemonic'), _jsx("textarea", { "aria-label": msg('mnemonic'), value: mnemonic, onChange: (e) => setMnemonic(e.target.value) })] }), _jsxs("label", { children: [msg('privateKey'), _jsx("input", { "aria-label": msg('privateKey'), value: privateKey, onChange: (e) => setPrivateKey(e.target.value) })] })] })), _jsxs("label", { children: [msg('password'), _jsx("input", { type: "password", inputMode: "text", "aria-label": msg('password'), value: password, onChange: (e) => setPassword(e.target.value) })] }), _jsxs("label", { children: [msg('passwordConfirm'), _jsx("input", { type: "password", inputMode: "text", "aria-label": msg('passwordConfirm'), value: confirm, onChange: (e) => setConfirm(e.target.value) })] }), _jsx("p", { "data-testid": "recovery-warning", children: msg('warning') }), recoveryPhrase && (_jsxs("div", { "data-testid": "recovery-phrase", children: [_jsx("p", { children: recoveryPhrase }), _jsx("button", { type: "button", onClick: () => navigator.clipboard?.writeText(recoveryPhrase), children: msg('copy') })] })), message && _jsx("p", { role: "alert", children: message }), _jsx("button", { type: "submit", "data-testid": "submit", disabled: busy, children: mode === 'create' ? msg('create') : msg('import') })] }));
54
+ }
55
+ //# sourceMappingURL=InAppWalletSetup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InAppWalletSetup.js","sourceRoot":"","sources":["../../../../src/wallet/next/components/InAppWalletSetup.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAwD,MAAM,YAAY,CAAA;AAClG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAWrD,MAAM,UAAU,gBAAgB,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAyB;IACtG,MAAM,GAAG,GAAG,CAAC,GAAe,EAAU,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAA;IAC7E,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,cAAc,EAAE,CAAA;IAC1D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAsB,QAAQ,CAAC,CAAA;IAC/D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC5C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC1C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC5C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAChD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACzE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACjE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEvC,KAAK,UAAU,YAAY,CAAC,KAAsB;QAChD,KAAK,CAAC,cAAc,EAAE,CAAA;QACtB,aAAa,CAAC,IAAI,CAAC,CAAA;QACnB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,aAAa,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAA;YACtC,OAAM;QACR,CAAC;QACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,aAAa,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAA;YACtC,OAAM;QACR,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAA;QACb,IAAI,CAAC;YACH,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAA;gBACrC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;gBAClC,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;YACrC,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC;oBAChC,QAAQ;oBACR,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;oBAChD,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAE,UAAU,CAAC,IAAI,EAAoB,CAAC,CAAC,CAAC,SAAS;iBACjF,CAAC,CAAA;gBACF,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACxB,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,aAAa,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QAC3D,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,IAAI,KAAK,CAAA;IAEnC,OAAO,CACL,gBAAM,QAAQ,EAAE,YAAY,iBAAc,qBAAqB,aAC7D,uBAAK,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,GAAM,EAEtE,eAAK,IAAI,EAAC,OAAO,aACf,iBAAQ,IAAI,EAAC,QAAQ,iBAAa,aAAa,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAgB,IAAI,KAAK,QAAQ,YAC9G,GAAG,CAAC,QAAQ,CAAC,GACP,EACT,iBAAQ,IAAI,EAAC,QAAQ,iBAAa,aAAa,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAgB,IAAI,KAAK,QAAQ,YAC9G,GAAG,CAAC,QAAQ,CAAC,GACP,IACL,EAEL,IAAI,KAAK,QAAQ,IAAI,CACpB,4BAAe,aAAa,aACzB,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,EACxB,iBAAQ,IAAI,EAAC,QAAQ,iBAAa,kBAAkB,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,YAClF,GAAG,CAAC,QAAQ,CAAC,GACP,IACP,CACL,EAEA,IAAI,KAAK,QAAQ,IAAI,CACpB,8BACE,4BAAe,iBAAiB,aAC7B,GAAG,CAAC,gBAAgB,CAAC,EACrB,aAAa,IAAI,CAChB,8BACG,GAAG,EACJ,YAAG,IAAI,EAAE,aAAa,iBAAc,iBAAiB,YAClD,GAAG,CAAC,gBAAgB,CAAC,GACpB,IACH,CACJ,IACC,EACJ,4BACG,GAAG,CAAC,UAAU,CAAC,EAChB,iCACc,GAAG,CAAC,UAAU,CAAC,EAC3B,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAC5C,IACI,EACR,4BACG,GAAG,CAAC,YAAY,CAAC,EAClB,8BACc,GAAG,CAAC,YAAY,CAAC,EAC7B,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAC9C,IACI,IACP,CACJ,EAED,4BACG,GAAG,CAAC,UAAU,CAAC,EAChB,gBACE,IAAI,EAAC,UAAU,EACf,SAAS,EAAC,MAAM,gBACJ,GAAG,CAAC,UAAU,CAAC,EAC3B,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAC5C,IACI,EAER,4BACG,GAAG,CAAC,iBAAiB,CAAC,EACvB,gBACE,IAAI,EAAC,UAAU,EACf,SAAS,EAAC,MAAM,gBACJ,GAAG,CAAC,iBAAiB,CAAC,EAClC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAC3C,IACI,EAER,2BAAe,kBAAkB,YAAE,GAAG,CAAC,SAAS,CAAC,GAAK,EAErD,cAAc,IAAI,CACjB,8BAAiB,iBAAiB,aAChC,sBAAI,cAAc,GAAK,EACvB,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,YAChF,GAAG,CAAC,MAAM,CAAC,GACL,IACL,CACP,EAEA,OAAO,IAAI,YAAG,IAAI,EAAC,OAAO,YAAE,OAAO,GAAK,EAEzC,iBAAQ,IAAI,EAAC,QAAQ,iBAAa,QAAQ,EAAC,QAAQ,EAAE,IAAI,YACtD,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAC3C,IACJ,CACR,CAAA;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type Lang, type WalletReactMessages } from '../i18n.js';
2
+ export interface InAppWalletUnlockProps {
3
+ lang?: Lang;
4
+ onUnlocked?: (address: `0x${string}`) => void;
5
+ /** Textos del host (sobreescriben los por defecto). */
6
+ messages?: Partial<WalletReactMessages>;
7
+ }
8
+ export declare function InAppWalletUnlock({ lang, onUnlocked, messages }: InAppWalletUnlockProps): import("react").JSX.Element;
9
+ //# sourceMappingURL=InAppWalletUnlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InAppWalletUnlock.d.ts","sourceRoot":"","sources":["../../../../src/wallet/next/components/InAppWalletUnlock.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,IAAI,EAAmB,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAGlG,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI,CAAA;IAC7C,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;CACxC;AAED,wBAAgB,iBAAiB,CAAC,EAAE,IAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,sBAAsB,+BAwC9F"}
@@ -0,0 +1,29 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { resolveMessages } from '../i18n.js';
5
+ import { useInAppWallet } from '../useInAppWallet.js';
6
+ export function InAppWalletUnlock({ lang = 'en', onUnlocked, messages }) {
7
+ const msg = (key) => resolveMessages(lang, messages)[key];
8
+ const { unlock } = useInAppWallet();
9
+ const [password, setPassword] = useState('');
10
+ const [error, setError] = useState(null);
11
+ const [busy, setBusy] = useState(false);
12
+ async function handleSubmit(event) {
13
+ event.preventDefault();
14
+ setError(null);
15
+ setBusy(true);
16
+ try {
17
+ const info = await unlock(password);
18
+ onUnlocked?.(info.address);
19
+ }
20
+ catch {
21
+ setError(msg('wrongPassword'));
22
+ }
23
+ finally {
24
+ setBusy(false);
25
+ }
26
+ }
27
+ return (_jsxs("form", { onSubmit: handleSubmit, "data-testid": "in-app-wallet-unlock", children: [_jsx("h2", { children: msg('unlockTitle') }), _jsxs("label", { children: [msg('password'), _jsx("input", { type: "password", inputMode: "text", "aria-label": msg('password'), value: password, onChange: (e) => setPassword(e.target.value) })] }), error && _jsx("p", { role: "alert", children: error }), _jsx("button", { type: "submit", disabled: busy, children: msg('unlock') })] }));
28
+ }
29
+ //# sourceMappingURL=InAppWalletUnlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InAppWalletUnlock.js","sourceRoot":"","sources":["../../../../src/wallet/next/components/InAppWalletUnlock.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,eAAe,EAAwD,MAAM,YAAY,CAAA;AAClG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AASrD,MAAM,UAAU,iBAAiB,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,UAAU,EAAE,QAAQ,EAA0B;IAC7F,MAAM,GAAG,GAAG,CAAC,GAAe,EAAU,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAA;IAC7E,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAAA;IACnC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACvD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEvC,KAAK,UAAU,YAAY,CAAC,KAAsB;QAChD,KAAK,CAAC,cAAc,EAAE,CAAA;QACtB,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,OAAO,CAAC,IAAI,CAAC,CAAA;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAA;YACnC,UAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAA;QAChC,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC;IACH,CAAC;IAED,OAAO,CACL,gBAAM,QAAQ,EAAE,YAAY,iBAAc,sBAAsB,aAC9D,uBAAK,GAAG,CAAC,aAAa,CAAC,GAAM,EAC7B,4BACG,GAAG,CAAC,UAAU,CAAC,EAChB,gBACE,IAAI,EAAC,UAAU,EACf,SAAS,EAAC,MAAM,gBACJ,GAAG,CAAC,UAAU,CAAC,EAC3B,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAC5C,IACI,EACP,KAAK,IAAI,YAAG,IAAI,EAAC,OAAO,YAAE,KAAK,GAAK,EACrC,iBAAQ,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,IAAI,YACjC,GAAG,CAAC,QAAQ,CAAC,GACP,IACJ,CACR,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=components.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.test.d.ts","sourceRoot":"","sources":["../../../src/wallet/next/components.test.tsx"],"names":[],"mappings":""}