@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
package/dist/CHANGELOG.md CHANGED
@@ -2,6 +2,50 @@
2
2
 
3
3
  All notable changes to `@pasosdejesus/m` are documented in this file.
4
4
 
5
+ ## [0.25.0] - 2026-10-09
6
+
7
+ ### Added
8
+
9
+ - **`@pasosdejesus/m/wallet/next` (`m/REQ/37`).** React layer of the in-app wallet, graduated from
10
+ learn.tg's `pdj-wallet-next`: `useInAppWallet`, `InAppWalletSetup`, `InAppWalletUnlock`. Texts
11
+ (`messages`) and storage namespaces (`configureInAppWallet`) are injectable; React is an optional
12
+ peer (the subpath is out of the core barrel).
13
+ - **`test:e2e --retry <N>` / `--retry-delay <ms>` (`m/REQ/49` P3).** After the first pass, each
14
+ failed spec is re-run on its own (a fresh `WALLET_INDEX` per attempt); a spec is green only by
15
+ exit code. The run writes `<E2E_LOG_DIR>/e2e-<timestamp>.log` (default `/tmp`) with one
16
+ `[e2e-result] <file> <ok|fail|skip>` line per spec per attempt.
17
+ - **`test:e2e:summary <log…>` (`m/REQ/49` P4).** Per-spec results of one or more `test:e2e` logs,
18
+ side by side, marking the specs that differ between runs (environmental vs product failure).
19
+
20
+ ## [0.24.0] - 2026-10-09
21
+
22
+ ### Added
23
+
24
+ - **`@pasosdejesus/m/wallet` — núcleo compartido de billetera (`m/REQ/14`, fases 1-2).** Mnemónica
25
+ BIP39 y derivación, firma, cifrado en reposo (PBKDF2-SHA256 + AES-256-GCM con calibración de
26
+ iteraciones), almacenamiento intercambiable (`MemoryStorage`/`IndexedDBStorage`/`FileStorage`, el
27
+ último en el subpath `./wallet/storage`), provider EIP-1193 de la billetera in-app, verificación
28
+ del usuario con WebAuthn (L1: gesto; L2: sello con el secreto PRF) y el resolutor EIP-6963 del
29
+ proveedor inyectado. Sin React ni Kysely. Namespaces configurables por consumidor
30
+ (`setWalletDbName`, `setDestinationsPrefix`, `setRpName`) para que learn.tg/sivel3 no compartan
31
+ claves de almacenamiento.
32
+ - **`@pasosdejesus/m/e2e` — `setupFullWalletMock` (`m/REQ/14` fase 3).** Billetera E2E sobre el
33
+ firmador de P6/P7; con `rpcUrl` (opt-in) firma y transmite de verdad y reenvía las lecturas al RPC.
34
+ - **`@pasosdejesus/m/e2e` — `startLocalRpc` (`m/REQ/14` fase 3).** Nodo EVM local y hermético sobre
35
+ `@pasosdejesus/edr` (carga dinámica): el núcleo firma, el nodo ejecuta y confirma, sin red externa
36
+ ni fondos. Incluye la fixture de donación `packages/m/e2e/` (`donate.html` + `donate.spec.mjs`).
37
+ - **`@pasosdejesus/m/test-utils`** — mocks del núcleo de billetera: `installLocalStorage`,
38
+ `installIndexedDB` (devDependency opcional `fake-indexeddb`), `mockWebAuthn`, `setupWalletTests`
39
+ y el preset de vitest `@pasosdejesus/m/test-utils/wallet-setup` (jsdom + mocks).
40
+ - Tests: `packages/m` pasa de 28 a 109 (`wallet` núcleo, crypto, KDF, storage, provider EIP-1193,
41
+ IndexedDB, WebAuthn/biometría, destinos, EIP-6963, nodo EVM local, preset jsdom) incluida la
42
+ paridad CLI ↔ núcleo.
43
+
44
+ ### Changed
45
+
46
+ - El CLI `wallet:generate/import/derive/sign/keccak` deriva desde el núcleo (`accountFromMnemonic`
47
+ con `accountIndex`, `privateKeyFromMnemonic`, `keccak`); mismo comportamiento observable.
48
+
5
49
  ## [0.23.1] - 2026-10-08
6
50
 
7
51
  ### Fixed
@@ -42,7 +86,7 @@ All notable changes to `@pasosdejesus/m` are documented in this file.
42
86
 
43
87
  ### Documentation
44
88
 
45
- - `REQ/49` (helpers E2E), `REQ/36` (tablero único de coordinación), `REQ/47` (núcleo de
89
+ - `REQ/49` (helpers E2E), `REQ/36` (tablero único de coordinación), `REQ/38` (núcleo de
46
90
  identidad) y `REQ/14` (billetera compartida: Fase 3 reutiliza el firmador de `REQ/49`).
47
91
 
48
92
  ## [0.22.4] - 2026-10-06
@@ -0,0 +1,41 @@
1
+ import type { E2EPage } from './browser.js';
2
+ export interface FullWalletMockOpts {
3
+ privateKey: `0x${string}`;
4
+ /** Dirección; si se omite se deriva de `privateKey`. */
5
+ address?: string;
6
+ chainId?: number;
7
+ /** RPC real (opt-in): habilita transmisión y lecturas reales. */
8
+ rpcUrl?: string;
9
+ walletName?: string;
10
+ /** Nombre del puente de `personal_sign` (default `__signMessage`). */
11
+ signerName?: string;
12
+ /** Nombre del puente typed-data (default `__signTypedData`). */
13
+ typedDataSignerName?: string;
14
+ /** Nombre del puente que firma y transmite en Node (default `__e2eSendTransaction`). */
15
+ sendBridgeName?: string;
16
+ }
17
+ export interface FullWalletMock {
18
+ address: string;
19
+ signerName: string;
20
+ typedDataSignerName: string;
21
+ sendBridgeName: string;
22
+ }
23
+ /**
24
+ * Código del proveedor EIP-6963 con firma real. `realRpc` (cuando se conoce el RPC)
25
+ * activa el reenvío de lecturas/transmisión; si no, todo es mock.
26
+ */
27
+ export declare function fullWalletMockCode(opts: {
28
+ address: string;
29
+ chainId?: number;
30
+ walletName?: string;
31
+ signerName?: string;
32
+ typedDataSignerName?: string;
33
+ sendBridgeName?: string;
34
+ rpcUrl?: string;
35
+ }): string;
36
+ /**
37
+ * Monta la billetera E2E completa. Con `rpcUrl`, `eth_sendTransaction` firma en Node
38
+ * y transmite de verdad (gasta fondos reales: úsalo sólo contra una red de prueba).
39
+ */
40
+ export declare function setupFullWalletMock(page: E2EPage, opts: FullWalletMockOpts): Promise<FullWalletMock>;
41
+ //# sourceMappingURL=full-wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"full-wallet.d.ts","sourceRoot":"","sources":["../../src/e2e/full-wallet.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAG3C,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,KAAK,MAAM,EAAE,CAAA;IACzB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,wFAAwF;IACxF,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,cAAc,EAAE,MAAM,CAAA;CACvB;AAQD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,GAAG,MAAM,CAiFT;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,cAAc,CAAC,CAoDzB"}
@@ -0,0 +1,138 @@
1
+ import { installRealSigner } from './signer.js';
2
+ const FAKE_TX_HASH = `'0x' + 'cd'.repeat(32)`;
3
+ function rpcForward(method, params) {
4
+ return `(await window.__e2eRpc('${method}', ${params}))`;
5
+ }
6
+ /**
7
+ * Código del proveedor EIP-6963 con firma real. `realRpc` (cuando se conoce el RPC)
8
+ * activa el reenvío de lecturas/transmisión; si no, todo es mock.
9
+ */
10
+ export function fullWalletMockCode(opts) {
11
+ const addr = opts.address;
12
+ const cid = opts.chainId || 42220;
13
+ const hexChainId = '0x' + cid.toString(16);
14
+ const walletName = opts.walletName || 'MockWallet';
15
+ const signerName = opts.signerName || '__signMessage';
16
+ const typedName = opts.typedDataSignerName || '__signTypedData';
17
+ const sendBridge = opts.sendBridgeName || '__e2eSendTransaction';
18
+ const realRpc = Boolean(opts.rpcUrl);
19
+ const sendTx = realRpc
20
+ ? `(await window['${sendBridge}'](JSON.stringify(params[0])))`
21
+ : FAKE_TX_HASH;
22
+ const reads = realRpc
23
+ ? `
24
+ if (method === 'eth_getBalance') return ${rpcForward('eth_getBalance', 'params')}
25
+ if (method === 'eth_call') return ${rpcForward('eth_call', 'params')}
26
+ if (method === 'eth_getTransactionReceipt') return ${rpcForward('eth_getTransactionReceipt', 'params')}
27
+ if (method === 'eth_getTransactionCount') return ${rpcForward('eth_getTransactionCount', 'params')}
28
+ if (method === 'eth_blockNumber') return ${rpcForward('eth_blockNumber', '[]')}
29
+ if (method === 'eth_gasPrice') return ${rpcForward('eth_gasPrice', '[]')}
30
+ if (method === 'eth_estimateGas') return ${rpcForward('eth_estimateGas', 'params')}
31
+ `
32
+ : `
33
+ if (method === 'eth_getBalance') return '0x0DE0B6B3A7640000'
34
+ if (method === 'eth_call') return '0x' + '00'.repeat(32)
35
+ if (method === 'eth_getTransactionReceipt') return null
36
+ if (method === 'eth_blockNumber') return '0x1312D00'
37
+ if (method === 'eth_gasPrice') return '0x12A05F200'
38
+ if (method === 'eth_estimateGas') return '0x7A120'
39
+ `;
40
+ return `
41
+ const __provider = {
42
+ isMetaMask: true,
43
+ chainId: '${hexChainId}',
44
+ selectedAddress: '${addr}',
45
+ request: async ({ method, params }) => {
46
+ if (method === 'eth_chainId') return '${hexChainId}'
47
+ if (method === 'eth_accounts') return ['${addr}']
48
+ if (method === 'eth_requestAccounts') return ['${addr}']
49
+ if (method === 'personal_sign') return (await window['${signerName}'](params[0]))
50
+ if (method === 'eth_signTypedData_v4') return (await window['${typedName}'](params[1]))
51
+ if (method === 'wallet_switchEthereumChain') return null
52
+ if (method === 'eth_sendTransaction') return ${sendTx}
53
+ ${reads}
54
+ return null
55
+ },
56
+ on: (event, listener) => {
57
+ if (event === 'accountsChanged') {
58
+ window.__eip6963Listeners = window.__eip6963Listeners || {}
59
+ window.__eip6963Listeners[event] = listener
60
+ }
61
+ },
62
+ removeListener: () => {},
63
+ }
64
+ window.ethereum = __provider
65
+ window.__e2eRealRpc = ${realRpc ? JSON.stringify(opts.rpcUrl) : 'null'}
66
+ window.__e2eRpc = async (method, params) => {
67
+ if (!window.__e2eRealRpc) throw new Error('no real RPC configured')
68
+ const res = await fetch(window.__e2eRealRpc, {
69
+ method: 'POST',
70
+ headers: { 'Content-Type': 'application/json' },
71
+ body: JSON.stringify({ jsonrpc: '2.0', id: Date.now(), method, params: params || [] }),
72
+ })
73
+ const json = await res.json()
74
+ if (json.error) throw new Error(method + ' failed: ' + (json.error.message || 'unknown'))
75
+ return json.result
76
+ }
77
+
78
+ const __info = {
79
+ uuid: crypto.randomUUID ? crypto.randomUUID() : 'mock-uuid-full',
80
+ name: '${walletName}',
81
+ icon: 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"/>',
82
+ rdns: 'com.mock.wallet',
83
+ }
84
+ window.dispatchEvent(new CustomEvent('eip6963:announceProvider', {
85
+ detail: { info: __info, provider: __provider }
86
+ }))
87
+ `;
88
+ }
89
+ /**
90
+ * Monta la billetera E2E completa. Con `rpcUrl`, `eth_sendTransaction` firma en Node
91
+ * y transmite de verdad (gasta fondos reales: úsalo sólo contra una red de prueba).
92
+ */
93
+ export async function setupFullWalletMock(page, opts) {
94
+ const signer = await installRealSigner(page, {
95
+ privateKey: opts.privateKey,
96
+ name: opts.signerName,
97
+ typedDataName: opts.typedDataSignerName,
98
+ });
99
+ const address = opts.address || signer.address;
100
+ const sendBridgeName = opts.sendBridgeName || '__e2eSendTransaction';
101
+ if (opts.rpcUrl) {
102
+ await page.exposeFunction(sendBridgeName, async (txJson) => {
103
+ const { createWalletClient, createPublicClient, http } = await import('viem');
104
+ const { privateKeyToAccount } = await import('viem/accounts');
105
+ const account = privateKeyToAccount(opts.privateKey);
106
+ const transport = http(opts.rpcUrl);
107
+ const wallet = createWalletClient({ account, transport });
108
+ const client = createPublicClient({ transport });
109
+ const tx = JSON.parse(txJson);
110
+ const hash = await wallet.sendTransaction({
111
+ account,
112
+ chain: null,
113
+ to: tx.to,
114
+ value: tx.value !== undefined ? BigInt(tx.value) : undefined,
115
+ data: tx.data,
116
+ });
117
+ // Espera el recibo para que el spec vea una transacción confirmada.
118
+ await client.waitForTransactionReceipt({ hash });
119
+ return hash;
120
+ });
121
+ }
122
+ await page.evaluateOnNewDocument(fullWalletMockCode({
123
+ address,
124
+ chainId: opts.chainId,
125
+ walletName: opts.walletName,
126
+ signerName: signer.name,
127
+ typedDataSignerName: signer.typedDataName,
128
+ sendBridgeName,
129
+ rpcUrl: opts.rpcUrl,
130
+ }));
131
+ return {
132
+ address,
133
+ signerName: signer.name,
134
+ typedDataSignerName: signer.typedDataName,
135
+ sendBridgeName,
136
+ };
137
+ }
138
+ //# sourceMappingURL=full-wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"full-wallet.js","sourceRoot":"","sources":["../../src/e2e/full-wallet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=full-wallet.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"full-wallet.test.d.ts","sourceRoot":"","sources":["../../src/e2e/full-wallet.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { fullWalletMockCode } from './full-wallet.js';
3
+ // m/REQ/14 Fase 3: billetera E2E con firma real; con `rpcUrl` (opt-in) transmite y
4
+ // lee de verdad; sin `rpcUrl` todo es mock (retrocompatible).
5
+ describe('full-wallet mock', () => {
6
+ it('firma personal_sign/typed data con los puentes reales', () => {
7
+ const code = fullWalletMockCode({ address: '0xabc' });
8
+ expect(code).toContain(`window['__signMessage'](params[0])`);
9
+ expect(code).toContain(`window['__signTypedData'](params[1])`);
10
+ });
11
+ it('sin rpcUrl transmite en falso y no reenvía al RPC', () => {
12
+ const code = fullWalletMockCode({ address: '0xabc' });
13
+ expect(code).toContain(`'0x' + 'cd'.repeat(32)`);
14
+ expect(code).toContain('window.__e2eRealRpc = null');
15
+ expect(code).not.toContain(`window['__e2eSendTransaction']`);
16
+ });
17
+ it('con rpcUrl transmite de verdad y reenvía las lecturas', () => {
18
+ const code = fullWalletMockCode({ address: '0xabc', rpcUrl: 'https://rpc.example' });
19
+ expect(code).toContain(`window['__e2eSendTransaction'](JSON.stringify(params[0]))`);
20
+ expect(code).toContain('window.__e2eRealRpc = "https://rpc.example"');
21
+ expect(code).toContain(`window.__e2eRpc('eth_call', params)`);
22
+ expect(code).not.toContain(`'0x' + 'cd'.repeat(32)`);
23
+ });
24
+ it('respeta los nombres de puente personalizados', () => {
25
+ const code = fullWalletMockCode({
26
+ address: '0xabc',
27
+ signerName: '__firma',
28
+ typedDataSignerName: '__firmaTyped',
29
+ sendBridgeName: '__envia',
30
+ rpcUrl: 'https://rpc.example',
31
+ });
32
+ expect(code).toContain(`window['__firma'](params[0])`);
33
+ expect(code).toContain(`window['__firmaTyped'](params[1])`);
34
+ expect(code).toContain(`window['__envia'](JSON.stringify(params[0]))`);
35
+ });
36
+ });
37
+ //# sourceMappingURL=full-wallet.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"full-wallet.test.js","sourceRoot":"","sources":["../../src/e2e/full-wallet.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAErD,mFAAmF;AACnF,8DAA8D;AAC9D,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,IAAI,GAAG,kBAAkB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;QACrD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAA;QAC5D,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,IAAI,GAAG,kBAAkB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;QACrD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;QAChD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAA;QACpD,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,IAAI,GAAG,kBAAkB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAA;QACpF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,2DAA2D,CAAC,CAAA;QACnF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,6CAA6C,CAAC,CAAA;QACrE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAA;QAC7D,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,kBAAkB,CAAC;YAC9B,OAAO,EAAE,OAAO;YAChB,UAAU,EAAE,SAAS;YACrB,mBAAmB,EAAE,cAAc;YACnC,cAAc,EAAE,SAAS;YACzB,MAAM,EAAE,qBAAqB;SAC9B,CAAC,CAAA;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAA;QACtD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAA;QAC3D,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,8CAA8C,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -12,4 +12,8 @@ export { installRealSigner, REAL_SIGNER_NAME, REAL_TYPED_DATA_SIGNER_NAME } from
12
12
  export type { RealSigner, RealSignerOpts } from './signer.js';
13
13
  export { ethereumMockCode, eip6963MockCode, injectEIP6963 } from './wallet-mock.js';
14
14
  export type { EthereumMockOpts, InjectEIP6963Opts } from './wallet-mock.js';
15
+ export { setupFullWalletMock, fullWalletMockCode } from './full-wallet.js';
16
+ export type { FullWalletMockOpts, FullWalletMock } from './full-wallet.js';
17
+ export { startLocalRpc } from './local-node.js';
18
+ export type { LocalRpc, LocalRpcOptions, LocalRpcAccount } from './local-node.js';
15
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/e2e/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC9E,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAC3H,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC5D,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAC9F,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACnF,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/e2e/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC9E,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAC3H,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC5D,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAC9F,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACnF,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAC3E,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1E,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA"}
package/dist/e2e/index.js CHANGED
@@ -8,4 +8,6 @@ export { simulateSIWE, checkSessionFull, checkPartialLogin } from './siwe.js';
8
8
  export { setupSIWEMock } from './siwe-mock.js';
9
9
  export { installRealSigner, REAL_SIGNER_NAME, REAL_TYPED_DATA_SIGNER_NAME } from './signer.js';
10
10
  export { ethereumMockCode, eip6963MockCode, injectEIP6963 } from './wallet-mock.js';
11
+ export { setupFullWalletMock, fullWalletMockCode } from './full-wallet.js';
12
+ export { startLocalRpc } from './local-node.js';
11
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/e2e/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAE9E,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAE3H,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE5D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAE9F,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/e2e/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAE9E,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAE3H,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE5D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAE9F,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEnF,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAE1E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,22 @@
1
+ export interface LocalRpcAccount {
2
+ secretKey: `0x${string}`;
3
+ balance: bigint;
4
+ }
5
+ export interface LocalRpcOptions {
6
+ chainId?: number;
7
+ /** Cuentas financiadas; por defecto las 10 de Hardhat (10.000 ETH cada una). */
8
+ accounts?: LocalRpcAccount[];
9
+ }
10
+ export interface LocalRpc {
11
+ url: string;
12
+ chainId: number;
13
+ /** Direcciones de las cuentas gestionadas (financiadas). */
14
+ accounts: string[];
15
+ close(): Promise<void>;
16
+ }
17
+ /**
18
+ * Levanta un nodo EVM local en un puerto efímero y devuelve su URL JSON-RPC.
19
+ * Importar `@pasosdejesus/edr` es dinámico: no es una dependencia de runtime de `m`.
20
+ */
21
+ export declare function startLocalRpc(options?: LocalRpcOptions): Promise<LocalRpc>;
22
+ //# sourceMappingURL=local-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-node.d.ts","sourceRoot":"","sources":["../../src/e2e/local-node.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,KAAK,MAAM,EAAE,CAAA;IACxB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAQD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoIpF"}
@@ -0,0 +1,144 @@
1
+ // src/e2e/local-node.ts
2
+ // Nodo JSON-RPC local y hermético para probar la billetera de verdad (`m/REQ/14`
3
+ // Fase 3). Envuelve `@pasosdejesus/edr` (dependencia opcional) en un servidor HTTP
4
+ // EIP-1193 para que viem del lado Node **o** una página con `setupFullWalletMock`
5
+ // firmen con el núcleo y transmitan de verdad, sin red externa y sin gastar fondos.
6
+ //
7
+ // El nodo **no** verifica la firma del raw tx (re-firma con la llave gestionada de
8
+ // la cuenta destino), así que un test que quiera comprobar la firma del núcleo debe
9
+ // usar `recoverTransactionAddress` sobre el tx serializado por separado.
10
+ import * as http from 'node:http';
11
+ /**
12
+ * Levanta un nodo EVM local en un puerto efímero y devuelve su URL JSON-RPC.
13
+ * Importar `@pasosdejesus/edr` es dinámico: no es una dependencia de runtime de `m`.
14
+ */
15
+ export async function startLocalRpc(options = {}) {
16
+ const { EdrProvider } = await import('@pasosdejesus/edr');
17
+ const provider = new EdrProvider({
18
+ chainId: options.chainId ?? 31337,
19
+ accounts: options.accounts,
20
+ });
21
+ await provider.init();
22
+ const viem = await import('viem');
23
+ // El nodo re-firma el raw tx, así que su recibo queda bajo SU hash; viem espera
24
+ // el hash del tx que firmó. Re-indexamos el recibo bajo `keccak256(raw)`.
25
+ const receipts = new Map();
26
+ async function handle(method, params) {
27
+ switch (method) {
28
+ case 'eth_chainId':
29
+ return provider.eth_chainId();
30
+ case 'net_version':
31
+ return provider.net_version();
32
+ case 'eth_blockNumber':
33
+ return provider.eth_blockNumber();
34
+ case 'eth_accounts':
35
+ return provider.eth_accounts();
36
+ case 'eth_coinbase':
37
+ return provider.eth_coinbase();
38
+ case 'eth_gasPrice':
39
+ return provider.eth_gasPrice();
40
+ case 'eth_getBalance':
41
+ return provider.eth_getBalance(params[0], params[1]);
42
+ case 'eth_getTransactionCount':
43
+ return provider.eth_getTransactionCount(params[0], params[1]);
44
+ case 'eth_getCode':
45
+ return provider.eth_getCode(params[0], params[1]);
46
+ case 'eth_call':
47
+ return provider.eth_call(params[0], params[1]);
48
+ case 'eth_estimateGas':
49
+ return provider.eth_estimateGas(params[0]);
50
+ case 'eth_sendTransaction':
51
+ return provider.eth_sendTransaction(params[0]);
52
+ case 'eth_sendRawTransaction': {
53
+ // El nodo re-firma; recupera el remitente del raw tx para ejecutar desde
54
+ // esa cuenta (que debe estar financiada).
55
+ const raw = params[0];
56
+ const tx = viem.parseTransaction(raw);
57
+ const from = await viem.recoverTransactionAddress({ serializedTransaction: raw });
58
+ const nodeHash = await provider.eth_sendTransaction({
59
+ from,
60
+ to: tx.to ?? undefined,
61
+ data: tx.data,
62
+ value: tx.value !== undefined ? `0x${tx.value.toString(16)}` : undefined,
63
+ gas: tx.gas !== undefined ? `0x${tx.gas.toString(16)}` : undefined,
64
+ gasPrice: tx.gasPrice !== undefined ? `0x${tx.gasPrice.toString(16)}` : undefined,
65
+ });
66
+ const rawHash = viem.keccak256(raw);
67
+ const receipt = await provider.eth_getTransactionReceipt(nodeHash);
68
+ if (receipt)
69
+ receipts.set(rawHash, { ...receipt, transactionHash: rawHash });
70
+ return rawHash;
71
+ }
72
+ case 'eth_getTransactionReceipt': {
73
+ const hash = params[0];
74
+ return receipts.get(hash) ?? provider.eth_getTransactionReceipt(hash);
75
+ }
76
+ case 'eth_getLogs':
77
+ return provider.eth_getLogs(params[0]);
78
+ case 'eth_getBlockByNumber': {
79
+ // Bloque mínimo: viem lo consulta para baseFeePerGas y confirmaciones.
80
+ const number = await provider.eth_blockNumber();
81
+ return {
82
+ number,
83
+ hash: `0x${'00'.repeat(32)}`,
84
+ parentHash: `0x${'00'.repeat(32)}`,
85
+ baseFeePerGas: '0x1',
86
+ gasLimit: '0x1c9c380',
87
+ gasUsed: '0x0',
88
+ timestamp: `0x${Math.floor(Date.now() / 1000).toString(16)}`,
89
+ transactions: [],
90
+ };
91
+ }
92
+ case 'eth_feeHistory':
93
+ return { oldestBlock: '0x0', baseFeePerGas: ['0x1'], gasUsedRatio: [0], reward: [] };
94
+ case 'eth_maxPriorityFeePerGas':
95
+ return '0x1';
96
+ case 'evm_snapshot':
97
+ return provider.evm_snapshot();
98
+ case 'evm_revert':
99
+ return provider.evm_revert(params[0]);
100
+ default:
101
+ throw new Error(`local-node: unsupported method ${method}`);
102
+ }
103
+ }
104
+ const server = http.createServer((req, res) => {
105
+ if (req.method !== 'POST') {
106
+ res.writeHead(405).end();
107
+ return;
108
+ }
109
+ const chunks = [];
110
+ req.on('data', (chunk) => chunks.push(chunk));
111
+ req.on('end', async () => {
112
+ const headers = { 'Content-Type': 'application/json' };
113
+ let body;
114
+ try {
115
+ body = JSON.parse(Buffer.concat(chunks).toString('utf8'));
116
+ }
117
+ catch {
118
+ res.writeHead(400, headers).end(JSON.stringify({ jsonrpc: '2.0', id: null, error: { code: -32700, message: 'Parse error' } }));
119
+ return;
120
+ }
121
+ try {
122
+ const result = await handle(body.method ?? '', body.params ?? []);
123
+ res.writeHead(200, headers).end(JSON.stringify({ jsonrpc: '2.0', id: body.id ?? null, result }));
124
+ }
125
+ catch (error) {
126
+ const message = error instanceof Error ? error.message : String(error);
127
+ res.writeHead(200, headers).end(JSON.stringify({ jsonrpc: '2.0', id: body.id ?? null, error: { code: -32000, message } }));
128
+ }
129
+ });
130
+ });
131
+ await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
132
+ const { port } = server.address();
133
+ return {
134
+ url: `http://127.0.0.1:${port}`,
135
+ chainId: options.chainId ?? 31337,
136
+ accounts: provider.getAccounts(),
137
+ close: () => new Promise((resolve) => {
138
+ server.close(() => {
139
+ void provider.shutdown().finally(() => resolve());
140
+ });
141
+ }),
142
+ };
143
+ }
144
+ //# sourceMappingURL=local-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-node.js","sourceRoot":"","sources":["../../src/e2e/local-node.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,iFAAiF;AACjF,mFAAmF;AACnF,kFAAkF;AAClF,oFAAoF;AACpF,EAAE;AACF,mFAAmF;AACnF,oFAAoF;AACpF,yEAAyE;AACzE,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AA4BjC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAA2B,EAAE;IAC/D,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;IACzD,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC;QAC/B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;QACjC,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC,CAAA;IACF,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAErB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAA;IAEjC,gFAAgF;IAChF,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAA;IAE3C,KAAK,UAAU,MAAM,CAAC,MAAc,EAAE,MAAiB;QACrD,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,aAAa;gBAChB,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAA;YAC/B,KAAK,aAAa;gBAChB,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAA;YAC/B,KAAK,iBAAiB;gBACpB,OAAO,QAAQ,CAAC,eAAe,EAAE,CAAA;YACnC,KAAK,cAAc;gBACjB,OAAO,QAAQ,CAAC,YAAY,EAAE,CAAA;YAChC,KAAK,cAAc;gBACjB,OAAO,QAAQ,CAAC,YAAY,EAAE,CAAA;YAChC,KAAK,cAAc;gBACjB,OAAO,QAAQ,CAAC,YAAY,EAAE,CAAA;YAChC,KAAK,gBAAgB;gBACnB,OAAO,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAW,EAAE,MAAM,CAAC,CAAC,CAAuB,CAAC,CAAA;YACtF,KAAK,yBAAyB;gBAC5B,OAAO,QAAQ,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAW,EAAE,MAAM,CAAC,CAAC,CAAuB,CAAC,CAAA;YAC/F,KAAK,aAAa;gBAChB,OAAO,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAW,EAAE,MAAM,CAAC,CAAC,CAAuB,CAAC,CAAA;YACnF,KAAK,UAAU;gBACb,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAU,EAAE,MAAM,CAAC,CAAC,CAAuB,CAAC,CAAA;YAC/E,KAAK,iBAAiB;gBACpB,OAAO,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAU,CAAC,CAAA;YACrD,KAAK,qBAAqB;gBACxB,OAAO,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAU,CAAC,CAAA;YACzD,KAAK,wBAAwB,CAAC,CAAC,CAAC;gBAC9B,yEAAyE;gBACzE,0CAA0C;gBAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAkB,CAAA;gBACtC,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAY,CAAC,CAAA;gBAC9C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,EAAE,qBAAqB,EAAE,GAAY,EAAE,CAAC,CAAA;gBAC1F,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAAC;oBAClD,IAAI;oBACJ,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,SAAS;oBACtB,IAAI,EAAE,EAAE,CAAC,IAAI;oBACb,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;oBACxE,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;oBAClE,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;iBAClF,CAAC,CAAA;gBACF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;gBACnC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAA;gBAClE,IAAI,OAAO;oBAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAA;gBAC5E,OAAO,OAAO,CAAA;YAChB,CAAC;YACD,KAAK,2BAA2B,CAAC,CAAC,CAAC;gBACjC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAW,CAAA;gBAChC,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAA;YACvE,CAAC;YACD,KAAK,aAAa;gBAChB,OAAO,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;YACxC,KAAK,sBAAsB,CAAC,CAAC,CAAC;gBAC5B,uEAAuE;gBACvE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,CAAA;gBAC/C,OAAO;oBACL,MAAM;oBACN,IAAI,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;oBAC5B,UAAU,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;oBAClC,aAAa,EAAE,KAAK;oBACpB,QAAQ,EAAE,WAAW;oBACrB,OAAO,EAAE,KAAK;oBACd,SAAS,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;oBAC5D,YAAY,EAAE,EAAE;iBACjB,CAAA;YACH,CAAC;YACD,KAAK,gBAAgB;gBACnB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;YACtF,KAAK,0BAA0B;gBAC7B,OAAO,KAAK,CAAA;YACd,KAAK,cAAc;gBACjB,OAAO,QAAQ,CAAC,YAAY,EAAE,CAAA;YAChC,KAAK,YAAY;gBACf,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAW,CAAC,CAAA;YACjD;gBACE,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,EAAE,CAAC,CAAA;QAC/D,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC5C,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC1B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;YACxB,OAAM;QACR,CAAC;QACD,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QACrD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;YACvB,MAAM,OAAO,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAA;YACtD,IAAI,IAAiB,CAAA;YACrB,IAAI,CAAC;gBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAgB,CAAA;YAC1E,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC,CAAA;gBAC9H,OAAM;YACR,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;gBACjE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;YAClG,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBACtE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;YAC5H,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;IAC5E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,OAAO,EAAiB,CAAA;IAEhD,OAAO;QACL,GAAG,EAAE,oBAAoB,IAAI,EAAE;QAC/B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;QACjC,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE;QAChC,KAAK,EAAE,GAAG,EAAE,CACV,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;gBAChB,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;YACnD,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC;KACL,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=local-node.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-node.test.d.ts","sourceRoot":"","sources":["../../src/e2e/local-node.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ import { afterAll, beforeAll, describe, expect, it } from 'vitest';
2
+ import { createPublicClient, createWalletClient, http, parseEther, recoverTransactionAddress, } from 'viem';
3
+ import { accountFromMnemonic } from '../wallet/index.js';
4
+ import { startLocalRpc } from './local-node.js';
5
+ const HARDHAT_MNEMONIC = 'test test test test test test test test test test test junk';
6
+ const HARDHAT_ADDRESS = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266';
7
+ // Direcciones fuera de las 10 cuentas financiadas por defecto de Hardhat.
8
+ const RECEIVER_A = '0x1111111111111111111111111111111111111111';
9
+ const RECEIVER_B = '0x2222222222222222222222222222222222222222';
10
+ // m/REQ/14 Fase 3: una transacción firmada de verdad por el núcleo, transmitida y
11
+ // confirmada por un EVM local. Hermético: no hay red externa ni fondos reales.
12
+ describe('local EVM node + wallet core', () => {
13
+ let rpc;
14
+ beforeAll(async () => {
15
+ rpc = await startLocalRpc();
16
+ });
17
+ afterAll(async () => {
18
+ await rpc.close();
19
+ });
20
+ async function send(to, value) {
21
+ const account = accountFromMnemonic(HARDHAT_MNEMONIC);
22
+ const wallet = createWalletClient({ account, transport: http(rpc.url) });
23
+ const request = await wallet.prepareTransactionRequest({ account, chain: null, to, value });
24
+ const { from: _from, ...tx } = request;
25
+ const serialized = await account.signTransaction(tx);
26
+ expect(await recoverTransactionAddress({ serializedTransaction: serialized })).toBe(HARDHAT_ADDRESS);
27
+ return wallet.sendRawTransaction({ serializedTransaction: serialized });
28
+ }
29
+ it('signs a transfer the EVM accepts and confirms', async () => {
30
+ const client = createPublicClient({ transport: http(rpc.url) });
31
+ const receipt = await client.waitForTransactionReceipt({
32
+ hash: await send(RECEIVER_A, parseEther('1')),
33
+ });
34
+ expect(receipt.status).toBe('success');
35
+ expect(await client.getBalance({ address: RECEIVER_A })).toBe(parseEther('1'));
36
+ });
37
+ it('moved the funds to the recipient', async () => {
38
+ const client = createPublicClient({ transport: http(rpc.url) });
39
+ await client.waitForTransactionReceipt({ hash: await send(RECEIVER_B, parseEther('2')) });
40
+ expect(await client.getBalance({ address: RECEIVER_B })).toBe(parseEther('2'));
41
+ });
42
+ });
43
+ //# sourceMappingURL=local-node.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-node.test.js","sourceRoot":"","sources":["../../src/e2e/local-node.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,eAAO,MAAM,eAAe,EAAE,cA2L7B,CAAC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,eAAO,MAAM,eAAe,EAAE,cA6L7B,CAAC"}
@@ -88,6 +88,7 @@ export const cliTranslations = {
88
88
  'cmd.create_arg_required': 'Project name is required',
89
89
  'cmd.db_mig_make_missing_arg': 'Migration name is required',
90
90
  'cmd.e2e_description': 'Run E2E tests (specs with Puppeteer, smoke with axios). Optional: path pattern, --smoke, --grep <filter>',
91
+ 'cmd.test_e2e_summary_description': 'Show per-spec results from one or more test:e2e logs and compare them (marks rows that differ)',
91
92
  'cmd.interactive_hint': "Type a command, or 'help' to list commands, or 'exit' to quit.",
92
93
  'cmd.interactive_prompt': 'm> ',
93
94
  'cmd.interactive_arg_prompt': 'Argument for {{0}}: ',
@@ -181,6 +182,7 @@ export const cliTranslations = {
181
182
  'cmd.create_arg_required': 'El nombre del proyecto es requerido',
182
183
  'cmd.db_mig_make_missing_arg': 'El nombre de la migración es requerido',
183
184
  'cmd.e2e_description': 'Ejecuta pruebas E2E (specs con Puppeteer, smoke con axios). Opcional: patrón, --smoke, --grep <filtro>',
185
+ 'cmd.test_e2e_summary_description': 'Muestra el resultado por spec de uno o más logs de test:e2e y los compara (marca las filas que difieren)',
184
186
  'cmd.interactive_hint': "Escribe una orden, o 'help' para listar, o 'exit' para salir.",
185
187
  'cmd.interactive_prompt': 'm> ',
186
188
  'cmd.interactive_arg_prompt': 'Argumento para {{0}}: ',
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/i18n/locales/cli.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAmB;IAC7C,EAAE,EAAE;QACF,2BAA2B,EAAE,sBAAsB;QACnD,yBAAyB,EAAE,oBAAoB;QAC/C,qCAAqC,EAAE,sCAAsC;QAC7E,mCAAmC,EAAE,8BAA8B;QACnE,mCAAmC,EAAE,8BAA8B;QACnE,4BAA4B,EAAE,0BAA0B;QACxD,6BAA6B,EAAE,8BAA8B;QAC7D,0BAA0B,EAAE,sDAAsD;QAClF,6BAA6B,EAAE,sDAAsD;QACrF,yBAAyB,EAAE,oBAAoB;QAC/C,0BAA0B,EAAE,kCAAkC;QAC9D,4BAA4B,EAAE,0BAA0B;QACxD,oCAAoC,EAAE,iDAAiD;QACvF,yBAAyB,EAAE,mDAAmD;QAC9E,4BAA4B,EAAE,oDAAoD;QAClF,kCAAkC,EAAE,0CAA0C;QAC9E,+BAA+B,EAAE,2CAA2C;QAC5E,+BAA+B,EAAE,2BAA2B;QAC5D,iCAAiC,EAAE,yBAAyB;QAC5D,wBAAwB,EAAE,uBAAuB;QACjD,wBAAwB,EAAE,2EAA2E;QACrG,8BAA8B,EAAE,2DAA2D;QAC3F,2BAA2B,EAAE,kDAAkD;QAC/E,kCAAkC,EAAE,sDAAsD;QAC1F,4BAA4B,EAAE,6DAA6D;QAC3F,0BAA0B,EAAE,uDAAuD;QACnF,6BAA6B,EAAE,0DAA0D;QACzF,8BAA8B,EAAE,mDAAmD;QACnF,yBAAyB,EAAE,mCAAmC;QAC9D,0BAA0B,EAAE,+CAA+C;QAC3E,yBAAyB,EAAE,sCAAsC;QACjE,+BAA+B,EAAE,4FAA4F;QAC7H,0BAA0B,EAAE,6EAA6E;QACzG,0BAA0B,EAAE,4DAA4D;QACxF,0BAA0B,EAAE,+BAA+B;QAC3D,2BAA2B,EAAE,8CAA8C;QAC3E,6BAA6B,EAAE,sDAAsD;QACrF,oCAAoC,EAAE,qCAAqC;QAC3E,kCAAkC,EAAE,qCAAqC;QACzE,+BAA+B,EAAE,8CAA8C;QAC/E,4BAA4B,EAAE,6DAA6D;QAC3F,2BAA2B,EAAE,+DAA+D;QAC5F,6BAA6B,EAAE,iDAAiD;QAChF,wCAAwC,EAAE,qCAAqC;QAC/E,kCAAkC,EAAE,+BAA+B;QACnE,2CAA2C,EAAE,gCAAgC;QAC7E,6CAA6C,EAAE,uCAAuC;QACtF,4CAA4C,EAAE,sCAAsC;QACpF,0CAA0C,EAAE,yBAAyB;QACrE,wCAAwC,EAAE,8CAA8C;QACxF,+CAA+C,EAAE,mCAAmC;QACpF,0CAA0C,EAAE,+BAA+B;QAC3E,2CAA2C,EAAE,kCAAkC;QAC/E,wBAAwB,EAAE,8BAA8B;QACxD,mBAAmB,EAAE,0CAA0C;QAC/D,mBAAmB,EAAE,iEAAiE;QACtF,oBAAoB,EAAE,wCAAwC;QAC9D,2BAA2B,EAAE,iCAAiC;QAC9D,YAAY,EAAE,8BAA8B;QAC5C,oBAAoB,EAAE,UAAU;QAChC,qBAAqB,EAAE,WAAW;QAClC,yBAAyB,EAAE,2BAA2B;QACtD,sBAAsB,EAAE,0BAA0B;QAClD,uBAAuB,EAAE,0BAA0B;QACnD,uBAAuB,EAAE,sCAAsC;QAC/D,yBAAyB,EAAE,gCAAgC;QAC3D,iCAAiC,EAAE,qCAAqC;QACxE,gCAAgC,EAAE,8BAA8B;QAChE,6BAA6B,EAAE,qBAAqB;QACpD,+BAA+B,EAAE,8CAA8C;QAC/E,6BAA6B,EAAE,wCAAwC;QACvE,6BAA6B,EAAE,6BAA6B;QAC5D,gCAAgC,EAAE,sBAAsB;QACxD,+BAA+B,EAAE,qCAAqC;QACtE,6BAA6B,EAAE,iCAAiC;QAChE,yBAAyB,EAAE,oBAAoB;QAC/C,+BAA+B,EAAE,4BAA4B;QAC7D,iCAAiC,EAAE,4BAA4B;QAC/D,uCAAuC,EAAE,mCAAmC;QAC5E,0BAA0B,EAAE,wBAAwB;QACpD,2BAA2B,EAAE,uBAAuB;QACpD,kCAAkC,EAAE,gCAAgC;QACpE,+BAA+B,EAAE,qCAAqC;QACtE,qBAAqB,EAAE,cAAc;QACrC,4BAA4B,EAAE,qBAAqB;QACnD,yBAAyB,EAAE,0BAA0B;QACrD,6BAA6B,EAAE,4BAA4B;QAC3D,qBAAqB,EAAE,0GAA0G;QACjI,sBAAsB,EAAE,gEAAgE;QACxF,wBAAwB,EAAE,KAAK;QAC/B,4BAA4B,EAAE,sBAAsB;KACrD;IACD,EAAE,EAAE;QACF,2BAA2B,EAAE,uBAAuB;QACpD,yBAAyB,EAAE,0BAA0B;QACrD,qCAAqC,EAAE,4CAA4C;QACnF,mCAAmC,EAAE,0CAA0C;QAC/E,mCAAmC,EAAE,yCAAyC;QAC9E,4BAA4B,EAAE,6CAA6C;QAC3E,6BAA6B,EAAE,oCAAoC;QACnE,0BAA0B,EAAE,yDAAyD;QACrF,6BAA6B,EAAE,yDAAyD;QACxF,yBAAyB,EAAE,0BAA0B;QACrD,0BAA0B,EAAE,8CAA8C;QAC1E,4BAA4B,EAAE,mCAAmC;QACjE,oCAAoC,EAAE,+DAA+D;QACrG,yBAAyB,EAAE,6DAA6D;QACxF,4BAA4B,EAAE,6DAA6D;QAC3F,kCAAkC,EAAE,oDAAoD;QACxF,+BAA+B,EAAE,mEAAmE;QACpG,+BAA+B,EAAE,kCAAkC;QACnE,iCAAiC,EAAE,sCAAsC;QACzE,wBAAwB,EAAE,wBAAwB;QAClD,wBAAwB,EAAE,+EAA+E;QACzG,8BAA8B,EAAE,2DAA2D;QAC3F,2BAA2B,EAAE,kDAAkD;QAC/E,kCAAkC,EAAE,qDAAqD;QACzF,4BAA4B,EAAE,qEAAqE;QACnG,0BAA0B,EAAE,iEAAiE;QAC7F,6BAA6B,EAAE,+DAA+D;QAC9F,8BAA8B,EAAE,+DAA+D;QAC/F,yBAAyB,EAAE,gCAAgC;QAC3D,0BAA0B,EAAE,6CAA6C;QACzE,yBAAyB,EAAE,kCAAkC;QAC7D,+BAA+B,EAAE,6FAA6F;QAC9H,0BAA0B,EAAE,oFAAoF;QAChH,0BAA0B,EAAE,yDAAyD;QACrF,0BAA0B,EAAE,kCAAkC;QAC9D,2BAA2B,EAAE,gDAAgD;QAC7E,6BAA6B,EAAE,oDAAoD;QACnF,oCAAoC,EAAE,wCAAwC;QAC9E,kCAAkC,EAAE,wCAAwC;QAC5E,+BAA+B,EAAE,8CAA8C;QAC/E,4BAA4B,EAAE,uDAAuD;QACrF,2BAA2B,EAAE,iEAAiE;QAC9F,6BAA6B,EAAE,sDAAsD;QACrF,wCAAwC,EAAE,wCAAwC;QAClF,kCAAkC,EAAE,sCAAsC;QAC1E,2CAA2C,EAAE,sCAAsC;QACnF,6CAA6C,EAAE,4CAA4C;QAC3F,4CAA4C,EAAE,0CAA0C;QACxF,0CAA0C,EAAE,kCAAkC;QAC9E,wCAAwC,EAAE,wDAAwD;QAClG,+CAA+C,EAAE,wCAAwC;QACzF,0CAA0C,EAAE,oCAAoC;QAChF,2CAA2C,EAAE,qCAAqC;QAClF,wBAAwB,EAAE,+BAA+B;QACzD,mBAAmB,EAAE,uCAAuC;QAC5D,mBAAmB,EAAE,6DAA6D;QAClF,oBAAoB,EAAE,wCAAwC;QAC9D,2BAA2B,EAAE,iCAAiC;QAC9D,YAAY,EAAE,2BAA2B;QACzC,oBAAoB,EAAE,WAAW;QACjC,qBAAqB,EAAE,UAAU;QACjC,yBAAyB,EAAE,8BAA8B;QACzD,sBAAsB,EAAE,gCAAgC;QACxD,uBAAuB,EAAE,4BAA4B;QACrD,uBAAuB,EAAE,0CAA0C;QACnE,yBAAyB,EAAE,oCAAoC;QAC/D,iCAAiC,EAAE,6CAA6C;QAChF,gCAAgC,EAAE,8BAA8B;QAChE,6BAA6B,EAAE,8BAA8B;QAC7D,+BAA+B,EAAE,0DAA0D;QAC3F,6BAA6B,EAAE,2CAA2C;QAC1E,6BAA6B,EAAE,8BAA8B;QAC7D,gCAAgC,EAAE,6BAA6B;QAC/D,+BAA+B,EAAE,0CAA0C;QAC3E,6BAA6B,EAAE,sCAAsC;QACrE,yBAAyB,EAAE,mBAAmB;QAC9C,+BAA+B,EAAE,gCAAgC;QACjE,iCAAiC,EAAE,2BAA2B;QAC9D,uCAAuC,EAAE,wCAAwC;QACjF,0BAA0B,EAAE,2BAA2B;QACvD,2BAA2B,EAAE,8BAA8B;QAC3D,kCAAkC,EAAE,mCAAmC;QACvE,+BAA+B,EAAE,qCAAqC;QACtE,qBAAqB,EAAE,qBAAqB;QAC5C,4BAA4B,EAAE,0BAA0B;QACxD,yBAAyB,EAAE,qCAAqC;QAChE,6BAA6B,EAAE,wCAAwC;QACvE,qBAAqB,EAAE,wGAAwG;QAC/H,sBAAsB,EAAE,+DAA+D;QACvF,wBAAwB,EAAE,KAAK;QAC/B,4BAA4B,EAAE,wBAAwB;KACvD;CACF,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/i18n/locales/cli.ts"],"names":[],"mappings":"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"}