@pasosdejesus/m 0.23.0 → 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.
- package/dist/CHANGELOG.md +47 -0
- package/dist/e2e/env.test.js +13 -0
- package/dist/e2e/env.test.js.map +1 -1
- package/dist/e2e/full-wallet.d.ts +41 -0
- package/dist/e2e/full-wallet.d.ts.map +1 -0
- package/dist/e2e/full-wallet.js +138 -0
- package/dist/e2e/full-wallet.js.map +1 -0
- package/dist/e2e/full-wallet.test.d.ts +2 -0
- package/dist/e2e/full-wallet.test.d.ts.map +1 -0
- package/dist/e2e/full-wallet.test.js +37 -0
- package/dist/e2e/full-wallet.test.js.map +1 -0
- package/dist/e2e/index.d.ts +5 -1
- package/dist/e2e/index.d.ts.map +1 -1
- package/dist/e2e/index.js +2 -0
- package/dist/e2e/index.js.map +1 -1
- package/dist/e2e/local-node.d.ts +22 -0
- package/dist/e2e/local-node.d.ts.map +1 -0
- package/dist/e2e/local-node.js +144 -0
- package/dist/e2e/local-node.js.map +1 -0
- package/dist/e2e/local-node.test.d.ts +2 -0
- package/dist/e2e/local-node.test.d.ts.map +1 -0
- package/dist/e2e/local-node.test.js +43 -0
- package/dist/e2e/local-node.test.js.map +1 -0
- package/dist/e2e/signer.test.d.ts +2 -0
- package/dist/e2e/signer.test.d.ts.map +1 -0
- package/dist/e2e/signer.test.js +57 -0
- package/dist/e2e/signer.test.js.map +1 -0
- package/dist/e2e/wallet-mock.d.ts +18 -3
- package/dist/e2e/wallet-mock.d.ts.map +1 -1
- package/dist/e2e/wallet-mock.js +22 -10
- package/dist/e2e/wallet-mock.js.map +1 -1
- package/dist/e2e/wallet-mock.test.js +7 -7
- package/dist/e2e/wallet-mock.test.js.map +1 -1
- package/dist/tasks/wallet.d.ts.map +1 -1
- package/dist/tasks/wallet.js +14 -25
- package/dist/tasks/wallet.js.map +1 -1
- package/dist/test-utils/index.d.ts +1 -0
- package/dist/test-utils/index.d.ts.map +1 -1
- package/dist/test-utils/index.js +1 -0
- package/dist/test-utils/index.js.map +1 -1
- package/dist/test-utils/wallet-mocks.d.ts +44 -0
- package/dist/test-utils/wallet-mocks.d.ts.map +1 -0
- package/dist/test-utils/wallet-mocks.js +114 -0
- package/dist/test-utils/wallet-mocks.js.map +1 -0
- package/dist/test-utils/wallet-mocks.test.d.ts +2 -0
- package/dist/test-utils/wallet-mocks.test.d.ts.map +1 -0
- package/dist/test-utils/wallet-mocks.test.js +55 -0
- package/dist/test-utils/wallet-mocks.test.js.map +1 -0
- package/dist/test-utils/wallet-setup.d.ts +2 -0
- package/dist/test-utils/wallet-setup.d.ts.map +1 -0
- package/dist/test-utils/wallet-setup.js +23 -0
- package/dist/test-utils/wallet-setup.js.map +1 -0
- package/dist/test-utils/wallet-setup.test.d.ts +2 -0
- package/dist/test-utils/wallet-setup.test.d.ts.map +1 -0
- package/dist/test-utils/wallet-setup.test.js +18 -0
- package/dist/test-utils/wallet-setup.test.js.map +1 -0
- package/dist/wallet/biometric.d.ts +33 -0
- package/dist/wallet/biometric.d.ts.map +1 -0
- package/dist/wallet/biometric.js +88 -0
- package/dist/wallet/biometric.js.map +1 -0
- package/dist/wallet/biometric.test.d.ts +2 -0
- package/dist/wallet/biometric.test.d.ts.map +1 -0
- package/dist/wallet/biometric.test.js +44 -0
- package/dist/wallet/biometric.test.js.map +1 -0
- package/dist/wallet/crypto.d.ts +42 -0
- package/dist/wallet/crypto.d.ts.map +1 -0
- package/dist/wallet/crypto.js +127 -0
- package/dist/wallet/crypto.js.map +1 -0
- package/dist/wallet/crypto.test.d.ts +2 -0
- package/dist/wallet/crypto.test.d.ts.map +1 -0
- package/dist/wallet/crypto.test.js +34 -0
- package/dist/wallet/crypto.test.js.map +1 -0
- package/dist/wallet/destinations.d.ts +20 -0
- package/dist/wallet/destinations.d.ts.map +1 -0
- package/dist/wallet/destinations.js +98 -0
- package/dist/wallet/destinations.js.map +1 -0
- package/dist/wallet/destinations.test.d.ts +2 -0
- package/dist/wallet/destinations.test.d.ts.map +1 -0
- package/dist/wallet/destinations.test.js +34 -0
- package/dist/wallet/destinations.test.js.map +1 -0
- package/dist/wallet/external-provider.d.ts +33 -0
- package/dist/wallet/external-provider.d.ts.map +1 -0
- package/dist/wallet/external-provider.js +108 -0
- package/dist/wallet/external-provider.js.map +1 -0
- package/dist/wallet/external-provider.test.d.ts +2 -0
- package/dist/wallet/external-provider.test.d.ts.map +1 -0
- package/dist/wallet/external-provider.test.js +44 -0
- package/dist/wallet/external-provider.test.js.map +1 -0
- package/dist/wallet/index.d.ts +14 -0
- package/dist/wallet/index.d.ts.map +1 -0
- package/dist/wallet/index.js +24 -0
- package/dist/wallet/index.js.map +1 -0
- package/dist/wallet/indexeddb.test.d.ts +2 -0
- package/dist/wallet/indexeddb.test.d.ts.map +1 -0
- package/dist/wallet/indexeddb.test.js +28 -0
- package/dist/wallet/indexeddb.test.js.map +1 -0
- package/dist/wallet/kdf.test.d.ts +2 -0
- package/dist/wallet/kdf.test.d.ts.map +1 -0
- package/dist/wallet/kdf.test.js +54 -0
- package/dist/wallet/kdf.test.js.map +1 -0
- package/dist/wallet/provider.d.ts +38 -0
- package/dist/wallet/provider.d.ts.map +1 -0
- package/dist/wallet/provider.js +285 -0
- package/dist/wallet/provider.js.map +1 -0
- package/dist/wallet/provider.test.d.ts +2 -0
- package/dist/wallet/provider.test.d.ts.map +1 -0
- package/dist/wallet/provider.test.js +170 -0
- package/dist/wallet/provider.test.js.map +1 -0
- package/dist/wallet/signer.d.ts +55 -0
- package/dist/wallet/signer.d.ts.map +1 -0
- package/dist/wallet/signer.js +91 -0
- package/dist/wallet/signer.js.map +1 -0
- package/dist/wallet/signer.test.d.ts +2 -0
- package/dist/wallet/signer.test.d.ts.map +1 -0
- package/dist/wallet/signer.test.js +62 -0
- package/dist/wallet/signer.test.js.map +1 -0
- package/dist/wallet/siwe.d.ts +2 -0
- package/dist/wallet/siwe.d.ts.map +1 -0
- package/dist/wallet/siwe.js +5 -0
- package/dist/wallet/siwe.js.map +1 -0
- package/dist/wallet/storage/file.d.ts +19 -0
- package/dist/wallet/storage/file.d.ts.map +1 -0
- package/dist/wallet/storage/file.js +48 -0
- package/dist/wallet/storage/file.js.map +1 -0
- package/dist/wallet/storage/idb.d.ts +25 -0
- package/dist/wallet/storage/idb.d.ts.map +1 -0
- package/dist/wallet/storage/idb.js +58 -0
- package/dist/wallet/storage/idb.js.map +1 -0
- package/dist/wallet/storage/index.d.ts +5 -0
- package/dist/wallet/storage/index.d.ts.map +1 -0
- package/dist/wallet/storage/index.js +4 -0
- package/dist/wallet/storage/index.js.map +1 -0
- package/dist/wallet/storage/indexeddb.d.ts +8 -0
- package/dist/wallet/storage/indexeddb.d.ts.map +1 -0
- package/dist/wallet/storage/indexeddb.js +18 -0
- package/dist/wallet/storage/indexeddb.js.map +1 -0
- package/dist/wallet/storage/memory.d.ts +10 -0
- package/dist/wallet/storage/memory.d.ts.map +1 -0
- package/dist/wallet/storage/memory.js +19 -0
- package/dist/wallet/storage/memory.js.map +1 -0
- package/dist/wallet/storage.test.d.ts +2 -0
- package/dist/wallet/storage.test.d.ts.map +1 -0
- package/dist/wallet/storage.test.js +103 -0
- package/dist/wallet/storage.test.js.map +1 -0
- package/dist/wallet/types.d.ts +69 -0
- package/dist/wallet/types.d.ts.map +1 -0
- package/dist/wallet/types.js +6 -0
- package/dist/wallet/types.js.map +1 -0
- package/dist/wallet/wallet.d.ts +81 -0
- package/dist/wallet/wallet.d.ts.map +1 -0
- package/dist/wallet/wallet.js +358 -0
- package/dist/wallet/wallet.js.map +1 -0
- package/dist/wallet/wallet.test.d.ts +2 -0
- package/dist/wallet/wallet.test.d.ts.map +1 -0
- package/dist/wallet/wallet.test.js +150 -0
- package/dist/wallet/wallet.test.js.map +1 -0
- package/dist/wallet/web-authn.d.ts +78 -0
- package/dist/wallet/web-authn.d.ts.map +1 -0
- package/dist/wallet/web-authn.js +250 -0
- package/dist/wallet/web-authn.js.map +1 -0
- package/package.json +14 -4
- package/src/e2e/README.md +51 -0
- package/src/wallet/README.md +96 -0
package/dist/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,53 @@
|
|
|
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
|
+
|
|
34
|
+
## [0.23.1] - 2026-10-08
|
|
35
|
+
|
|
36
|
+
### Fixed
|
|
37
|
+
|
|
38
|
+
- **`@pasosdejesus/m/e2e` — API de firma real (corrige 0.23.0).** `ethereumMockCode`/
|
|
39
|
+
`eip6963MockCode` **ya no aceptan `privateKey`**: no instalaban el puente y generaban código que
|
|
40
|
+
llamaba a `window.__signMessage` sin existir. Ahora exponen `realSigning` + nombres de puente
|
|
41
|
+
(requieren el puente instalado) y la vía segura es `injectEIP6963(page, { address, privateKey })`,
|
|
42
|
+
que instala el puente **y** activa `realSigning`. Sin `realSigning`/`privateKey` sigue la firma
|
|
43
|
+
falsa `0xabab…` (https://gitlab.com/pasosdeJesus/m/-/work_items/49).
|
|
44
|
+
- Tests: nuevo `signer.test.ts` (EIP-191 verificable con `verifyMessage`, EIP-712, nombres de
|
|
45
|
+
puente) y casos de `SITE_URL` con path / http sin puerto en `env.test.ts`.
|
|
46
|
+
|
|
47
|
+
### Documentation
|
|
48
|
+
|
|
49
|
+
- `m/doc/identidad-multibilletera.md` §8.2: sivel3 **no** consume aún el núcleo (auth
|
|
50
|
+
wagmi/RainbowKit, EIP-191; `m@^0.18.4`); adoptará el núcleo al migrar su auth.
|
|
51
|
+
|
|
5
52
|
## [0.23.0] - 2026-10-08
|
|
6
53
|
|
|
7
54
|
### Added
|
package/dist/e2e/env.test.js
CHANGED
|
@@ -49,6 +49,19 @@ describe('e2e env — SITE_URL', () => {
|
|
|
49
49
|
expect(env.domainPort).toBe('');
|
|
50
50
|
expect(env.port).toBe('443');
|
|
51
51
|
});
|
|
52
|
+
it('SITE_URL con path usa solo el origin', async () => {
|
|
53
|
+
process.env.SITE_URL = 'https://sivel.xyz/app?x=1';
|
|
54
|
+
const env = await initTestEnv();
|
|
55
|
+
expect(env.base).toBe('https://sivel.xyz');
|
|
56
|
+
expect(env.host).toBe('sivel.xyz');
|
|
57
|
+
});
|
|
58
|
+
it('SITE_URL http sin puerto resuelve 80 (sin domainPort)', async () => {
|
|
59
|
+
process.env.SITE_URL = 'http://localhost';
|
|
60
|
+
const env = await initTestEnv();
|
|
61
|
+
expect(env.base).toBe('http://localhost');
|
|
62
|
+
expect(env.port).toBe('80');
|
|
63
|
+
expect(env.domainPort).toBe('');
|
|
64
|
+
});
|
|
52
65
|
it('parseSiteUrl ignora valores inválidos o vacíos', () => {
|
|
53
66
|
expect(parseSiteUrl(undefined)).toBeNull();
|
|
54
67
|
expect(parseSiteUrl('')).toBeNull();
|
package/dist/e2e/env.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.test.js","sourceRoot":"","sources":["../../src/e2e/env.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"env.test.js","sourceRoot":"","sources":["../../src/e2e/env.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
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"}
|
package/dist/e2e/index.d.ts
CHANGED
|
@@ -11,5 +11,9 @@ export { setupSIWEMock } from './siwe-mock.js';
|
|
|
11
11
|
export { installRealSigner, REAL_SIGNER_NAME, REAL_TYPED_DATA_SIGNER_NAME } from './signer.js';
|
|
12
12
|
export type { RealSigner, RealSignerOpts } from './signer.js';
|
|
13
13
|
export { ethereumMockCode, eip6963MockCode, injectEIP6963 } from './wallet-mock.js';
|
|
14
|
-
export type { EthereumMockOpts } from './wallet-mock.js';
|
|
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
|
package/dist/e2e/index.d.ts.map
CHANGED
|
@@ -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,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
|
package/dist/e2e/index.js.map
CHANGED
|
@@ -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 @@
|
|
|
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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.test.d.ts","sourceRoot":"","sources":["../../src/e2e/signer.test.ts"],"names":[],"mappings":""}
|