@pasosdejesus/m 0.23.1 → 0.24.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 (151) hide show
  1. package/dist/CHANGELOG.md +29 -0
  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/tasks/wallet.d.ts.map +1 -1
  23. package/dist/tasks/wallet.js +14 -25
  24. package/dist/tasks/wallet.js.map +1 -1
  25. package/dist/test-utils/index.d.ts +1 -0
  26. package/dist/test-utils/index.d.ts.map +1 -1
  27. package/dist/test-utils/index.js +1 -0
  28. package/dist/test-utils/index.js.map +1 -1
  29. package/dist/test-utils/wallet-mocks.d.ts +44 -0
  30. package/dist/test-utils/wallet-mocks.d.ts.map +1 -0
  31. package/dist/test-utils/wallet-mocks.js +114 -0
  32. package/dist/test-utils/wallet-mocks.js.map +1 -0
  33. package/dist/test-utils/wallet-mocks.test.d.ts +2 -0
  34. package/dist/test-utils/wallet-mocks.test.d.ts.map +1 -0
  35. package/dist/test-utils/wallet-mocks.test.js +55 -0
  36. package/dist/test-utils/wallet-mocks.test.js.map +1 -0
  37. package/dist/test-utils/wallet-setup.d.ts +2 -0
  38. package/dist/test-utils/wallet-setup.d.ts.map +1 -0
  39. package/dist/test-utils/wallet-setup.js +23 -0
  40. package/dist/test-utils/wallet-setup.js.map +1 -0
  41. package/dist/test-utils/wallet-setup.test.d.ts +2 -0
  42. package/dist/test-utils/wallet-setup.test.d.ts.map +1 -0
  43. package/dist/test-utils/wallet-setup.test.js +18 -0
  44. package/dist/test-utils/wallet-setup.test.js.map +1 -0
  45. package/dist/wallet/biometric.d.ts +33 -0
  46. package/dist/wallet/biometric.d.ts.map +1 -0
  47. package/dist/wallet/biometric.js +88 -0
  48. package/dist/wallet/biometric.js.map +1 -0
  49. package/dist/wallet/biometric.test.d.ts +2 -0
  50. package/dist/wallet/biometric.test.d.ts.map +1 -0
  51. package/dist/wallet/biometric.test.js +44 -0
  52. package/dist/wallet/biometric.test.js.map +1 -0
  53. package/dist/wallet/crypto.d.ts +42 -0
  54. package/dist/wallet/crypto.d.ts.map +1 -0
  55. package/dist/wallet/crypto.js +127 -0
  56. package/dist/wallet/crypto.js.map +1 -0
  57. package/dist/wallet/crypto.test.d.ts +2 -0
  58. package/dist/wallet/crypto.test.d.ts.map +1 -0
  59. package/dist/wallet/crypto.test.js +34 -0
  60. package/dist/wallet/crypto.test.js.map +1 -0
  61. package/dist/wallet/destinations.d.ts +20 -0
  62. package/dist/wallet/destinations.d.ts.map +1 -0
  63. package/dist/wallet/destinations.js +98 -0
  64. package/dist/wallet/destinations.js.map +1 -0
  65. package/dist/wallet/destinations.test.d.ts +2 -0
  66. package/dist/wallet/destinations.test.d.ts.map +1 -0
  67. package/dist/wallet/destinations.test.js +34 -0
  68. package/dist/wallet/destinations.test.js.map +1 -0
  69. package/dist/wallet/external-provider.d.ts +33 -0
  70. package/dist/wallet/external-provider.d.ts.map +1 -0
  71. package/dist/wallet/external-provider.js +108 -0
  72. package/dist/wallet/external-provider.js.map +1 -0
  73. package/dist/wallet/external-provider.test.d.ts +2 -0
  74. package/dist/wallet/external-provider.test.d.ts.map +1 -0
  75. package/dist/wallet/external-provider.test.js +44 -0
  76. package/dist/wallet/external-provider.test.js.map +1 -0
  77. package/dist/wallet/index.d.ts +14 -0
  78. package/dist/wallet/index.d.ts.map +1 -0
  79. package/dist/wallet/index.js +24 -0
  80. package/dist/wallet/index.js.map +1 -0
  81. package/dist/wallet/indexeddb.test.d.ts +2 -0
  82. package/dist/wallet/indexeddb.test.d.ts.map +1 -0
  83. package/dist/wallet/indexeddb.test.js +28 -0
  84. package/dist/wallet/indexeddb.test.js.map +1 -0
  85. package/dist/wallet/kdf.test.d.ts +2 -0
  86. package/dist/wallet/kdf.test.d.ts.map +1 -0
  87. package/dist/wallet/kdf.test.js +54 -0
  88. package/dist/wallet/kdf.test.js.map +1 -0
  89. package/dist/wallet/provider.d.ts +38 -0
  90. package/dist/wallet/provider.d.ts.map +1 -0
  91. package/dist/wallet/provider.js +285 -0
  92. package/dist/wallet/provider.js.map +1 -0
  93. package/dist/wallet/provider.test.d.ts +2 -0
  94. package/dist/wallet/provider.test.d.ts.map +1 -0
  95. package/dist/wallet/provider.test.js +170 -0
  96. package/dist/wallet/provider.test.js.map +1 -0
  97. package/dist/wallet/signer.d.ts +55 -0
  98. package/dist/wallet/signer.d.ts.map +1 -0
  99. package/dist/wallet/signer.js +91 -0
  100. package/dist/wallet/signer.js.map +1 -0
  101. package/dist/wallet/signer.test.d.ts +2 -0
  102. package/dist/wallet/signer.test.d.ts.map +1 -0
  103. package/dist/wallet/signer.test.js +62 -0
  104. package/dist/wallet/signer.test.js.map +1 -0
  105. package/dist/wallet/siwe.d.ts +2 -0
  106. package/dist/wallet/siwe.d.ts.map +1 -0
  107. package/dist/wallet/siwe.js +5 -0
  108. package/dist/wallet/siwe.js.map +1 -0
  109. package/dist/wallet/storage/file.d.ts +19 -0
  110. package/dist/wallet/storage/file.d.ts.map +1 -0
  111. package/dist/wallet/storage/file.js +48 -0
  112. package/dist/wallet/storage/file.js.map +1 -0
  113. package/dist/wallet/storage/idb.d.ts +25 -0
  114. package/dist/wallet/storage/idb.d.ts.map +1 -0
  115. package/dist/wallet/storage/idb.js +58 -0
  116. package/dist/wallet/storage/idb.js.map +1 -0
  117. package/dist/wallet/storage/index.d.ts +5 -0
  118. package/dist/wallet/storage/index.d.ts.map +1 -0
  119. package/dist/wallet/storage/index.js +4 -0
  120. package/dist/wallet/storage/index.js.map +1 -0
  121. package/dist/wallet/storage/indexeddb.d.ts +8 -0
  122. package/dist/wallet/storage/indexeddb.d.ts.map +1 -0
  123. package/dist/wallet/storage/indexeddb.js +18 -0
  124. package/dist/wallet/storage/indexeddb.js.map +1 -0
  125. package/dist/wallet/storage/memory.d.ts +10 -0
  126. package/dist/wallet/storage/memory.d.ts.map +1 -0
  127. package/dist/wallet/storage/memory.js +19 -0
  128. package/dist/wallet/storage/memory.js.map +1 -0
  129. package/dist/wallet/storage.test.d.ts +2 -0
  130. package/dist/wallet/storage.test.d.ts.map +1 -0
  131. package/dist/wallet/storage.test.js +103 -0
  132. package/dist/wallet/storage.test.js.map +1 -0
  133. package/dist/wallet/types.d.ts +69 -0
  134. package/dist/wallet/types.d.ts.map +1 -0
  135. package/dist/wallet/types.js +6 -0
  136. package/dist/wallet/types.js.map +1 -0
  137. package/dist/wallet/wallet.d.ts +81 -0
  138. package/dist/wallet/wallet.d.ts.map +1 -0
  139. package/dist/wallet/wallet.js +358 -0
  140. package/dist/wallet/wallet.js.map +1 -0
  141. package/dist/wallet/wallet.test.d.ts +2 -0
  142. package/dist/wallet/wallet.test.d.ts.map +1 -0
  143. package/dist/wallet/wallet.test.js +150 -0
  144. package/dist/wallet/wallet.test.js.map +1 -0
  145. package/dist/wallet/web-authn.d.ts +78 -0
  146. package/dist/wallet/web-authn.d.ts.map +1 -0
  147. package/dist/wallet/web-authn.js +250 -0
  148. package/dist/wallet/web-authn.js.map +1 -0
  149. package/package.json +14 -4
  150. package/src/e2e/README.md +51 -0
  151. package/src/wallet/README.md +96 -0
package/dist/CHANGELOG.md CHANGED
@@ -2,6 +2,35 @@
2
2
 
3
3
  All notable changes to `@pasosdejesus/m` are documented in this file.
4
4
 
5
+ ## [0.24.0] - 2026-10-09
6
+
7
+ ### Added
8
+
9
+ - **`@pasosdejesus/m/wallet` — núcleo compartido de billetera (`m/REQ/14`, fases 1-2).** Mnemónica
10
+ BIP39 y derivación, firma, cifrado en reposo (PBKDF2-SHA256 + AES-256-GCM con calibración de
11
+ iteraciones), almacenamiento intercambiable (`MemoryStorage`/`IndexedDBStorage`/`FileStorage`, el
12
+ último en el subpath `./wallet/storage`), provider EIP-1193 de la billetera in-app, verificación
13
+ del usuario con WebAuthn (L1: gesto; L2: sello con el secreto PRF) y el resolutor EIP-6963 del
14
+ proveedor inyectado. Sin React ni Kysely. Namespaces configurables por consumidor
15
+ (`setWalletDbName`, `setDestinationsPrefix`, `setRpName`) para que learn.tg/sivel3 no compartan
16
+ claves de almacenamiento.
17
+ - **`@pasosdejesus/m/e2e` — `setupFullWalletMock` (`m/REQ/14` fase 3).** Billetera E2E sobre el
18
+ firmador de P6/P7; con `rpcUrl` (opt-in) firma y transmite de verdad y reenvía las lecturas al RPC.
19
+ - **`@pasosdejesus/m/e2e` — `startLocalRpc` (`m/REQ/14` fase 3).** Nodo EVM local y hermético sobre
20
+ `@pasosdejesus/edr` (carga dinámica): el núcleo firma, el nodo ejecuta y confirma, sin red externa
21
+ ni fondos. Incluye la fixture de donación `packages/m/e2e/` (`donate.html` + `donate.spec.mjs`).
22
+ - **`@pasosdejesus/m/test-utils`** — mocks del núcleo de billetera: `installLocalStorage`,
23
+ `installIndexedDB` (devDependency opcional `fake-indexeddb`), `mockWebAuthn`, `setupWalletTests`
24
+ y el preset de vitest `@pasosdejesus/m/test-utils/wallet-setup` (jsdom + mocks).
25
+ - Tests: `packages/m` pasa de 28 a 109 (`wallet` núcleo, crypto, KDF, storage, provider EIP-1193,
26
+ IndexedDB, WebAuthn/biometría, destinos, EIP-6963, nodo EVM local, preset jsdom) incluida la
27
+ paridad CLI ↔ núcleo.
28
+
29
+ ### Changed
30
+
31
+ - El CLI `wallet:generate/import/derive/sign/keccak` deriva desde el núcleo (`accountFromMnemonic`
32
+ con `accountIndex`, `privateKeyFromMnemonic`, `keccak`); mismo comportamiento observable.
33
+
5
34
  ## [0.23.1] - 2026-10-08
6
35
 
7
36
  ### Fixed
@@ -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":"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"}
@@ -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":"wallet.d.ts","sourceRoot":"","sources":["../../src/tasks/wallet.ts"],"names":[],"mappings":"AAorBA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,iBAiE7C"}
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/tasks/wallet.ts"],"names":[],"mappings":"AA+qBA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,iBAiE7C"}