@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
@@ -0,0 +1,285 @@
1
+ import { getUnlockedAccount, getUnlockedInfo, currentLockEpoch, setWalletChain, signMessage, signTransaction, signTypedData } from './wallet.js';
2
+ import { isKnownDestination, rememberDestination } from './destinations.js';
3
+ import { readBiometricRecord } from './biometric.js';
4
+ import { assertUserVerification, hasRecentUserVerification, isUserCancelledError } from './web-authn.js';
5
+ import { CHAIN_IDS } from './types.js';
6
+ const listeners = new Map();
7
+ function emit(event, payload) {
8
+ for (const listener of listeners.get(event) ?? []) {
9
+ try {
10
+ listener(payload);
11
+ }
12
+ catch {
13
+ // un listener roto no puede tumbar la billetera
14
+ }
15
+ }
16
+ }
17
+ /** Dapps that subscribed: the wallet left the session (lock or delete). */
18
+ export function emitAccountsChanged(accounts) {
19
+ emit('accountsChanged', accounts);
20
+ if (accounts.length === 0)
21
+ emit('disconnect', { code: 4900, message: 'The in-app wallet locked' });
22
+ }
23
+ /** Error shape wallets use for "the user rejected the request". */
24
+ function userRejected() {
25
+ return Object.assign(new Error('User rejected the request'), { code: 4001 });
26
+ }
27
+ /**
28
+ * R-#246 §14 item 3: a signature approved before the wallet locked must not go
29
+ * through after. The lock bumps a generation and signing checks it around the
30
+ * gesture.
31
+ */
32
+ function assertStillUnlocked(epoch) {
33
+ if (currentLockEpoch() === epoch)
34
+ return;
35
+ // R-#236: avisar a quien esté suscrito, además de abortar la firma.
36
+ emitAccountsChanged([]);
37
+ throw userRejected();
38
+ }
39
+ const ERC20_TRANSFER = '0xa9059cbb';
40
+ const ERC20_TRANSFER_FROM = '0x23b872dd';
41
+ /**
42
+ * Recipient of a transfer (R-#253): `tx.to` for a native transfer, or the address
43
+ * argument of an ERC-20 `transfer(address,uint256)` / `transferFrom(address,address,uint256)`
44
+ * (that is where USDT/G$/XAUT put the recipient; `to` is the token contract).
45
+ */
46
+ export function extractDestination(tx) {
47
+ const to = typeof tx.to === 'string' ? tx.to : undefined;
48
+ const data = typeof tx.data === 'string' ? tx.data : undefined;
49
+ if (!data || data.length < 10)
50
+ return to;
51
+ const selector = data.slice(0, 10).toLowerCase();
52
+ const body = data.slice(10);
53
+ const argument = (index) => {
54
+ const chunk = body.slice(index * 64, (index + 1) * 64);
55
+ return chunk.length === 64 ? `0x${chunk.slice(24)}` : undefined;
56
+ };
57
+ if (selector === ERC20_TRANSFER)
58
+ return argument(0) ?? to;
59
+ if (selector === ERC20_TRANSFER_FROM)
60
+ return argument(1) ?? to;
61
+ return to;
62
+ }
63
+ /**
64
+ * Fresh user-verified assertion before moving funds (L1). Silently allows the
65
+ * request on devices without a platform authenticator — no passkey enrolled, or a
66
+ * wallet WebView without WebAuthn: L1 needs hardware and must not block the
67
+ * wallet. A cancelled prompt is a rejection (`4001`), like any wallet.
68
+ *
69
+ * R-#253: `destination` (when known) decides whether the grace window applies. A
70
+ * **new** destination always asks for the gesture.
71
+ */
72
+ export async function requireFundsConfirmation({ destination } = {}) {
73
+ const sealed = await readBiometricRecord().catch(() => null);
74
+ if (!sealed)
75
+ return;
76
+ const wallet = getUnlockedInfo()?.address;
77
+ const newDestination = !!(wallet && destination && !isKnownDestination(wallet, destination));
78
+ // Ventana de gracia (R-#253, 15 min): un destino ya conocido no vuelve a pedir el
79
+ // gesto dentro de la ventana; uno nuevo lo exige siempre.
80
+ if (!newDestination && hasRecentUserVerification())
81
+ return;
82
+ try {
83
+ await assertUserVerification(sealed.credentialId);
84
+ }
85
+ catch (error) {
86
+ const message = error instanceof Error ? error.message : String(error);
87
+ if (message === 'no-webauthn')
88
+ return;
89
+ // R-#246 §14 item 4: la cancelación se detecta por nombre/mensaje (`AbortError`,
90
+ // `cancel*`) y no sólo por `NotAllowedError`; para el llamador EIP-1193 todo
91
+ // termina en el mismo 4001.
92
+ void isUserCancelledError(error);
93
+ throw userRejected();
94
+ }
95
+ }
96
+ function utf8ToHex(value) {
97
+ let hex = '';
98
+ for (const byte of new TextEncoder().encode(value))
99
+ hex += byte.toString(16).padStart(2, '0');
100
+ return `0x${hex}`;
101
+ }
102
+ /**
103
+ * Anything the wallet does not own (reads: `eth_call`, `eth_getBalance`,
104
+ * `eth_gasPrice`, `eth_estimateGas`, `eth_blockNumber`, receipt lookups…) is
105
+ * forwarded to the RPC endpoint. Without this the provider only answered the
106
+ * signing methods, so a page that used the in-app wallet could not read a balance
107
+ * or estimate gas ("Unsupported method: eth_call", reported 2026-09-19).
108
+ */
109
+ async function forwardToRpc(rpcUrl, method, params) {
110
+ if (!rpcUrl) {
111
+ throw new Error(`The in-app wallet cannot answer "${method}": it was created without an rpcUrl`);
112
+ }
113
+ const response = await fetch(rpcUrl, {
114
+ method: 'POST',
115
+ headers: { 'Content-Type': 'application/json' },
116
+ body: JSON.stringify({ jsonrpc: '2.0', id: Date.now(), method, params: params ?? [] }),
117
+ });
118
+ const json = (await response.json());
119
+ if (json.error) {
120
+ // El método va en el mensaje: "Invalid params" a secas no dice *qué* llamada
121
+ // falló (el reclamo de GoodDollar con la billetera in-app falló por
122
+ // `eth_getTransactionCount` sin `from` y el error no lo delataba).
123
+ throw new Error(`${method} failed${json.error.code != null ? ` (${json.error.code})` : ''}: ${json.error.message ?? 'unknown error'}`);
124
+ }
125
+ return json.result;
126
+ }
127
+ /**
128
+ * Fills the fields a local account needs to sign. viem's `sendTransaction`
129
+ * delegates `eth_sendTransaction` to the wallet for JSON-RPC accounts **without**
130
+ * filling fees/gas/nonce, and a local account cannot infer the transaction type
131
+ * without them: it throws "Cannot infer a transaction type from provided
132
+ * transaction." (reported 2026-09-20 donating CELO/G$/XAUT with the in-app wallet).
133
+ */
134
+ async function fillTransaction(rpcUrl, tx) {
135
+ const hasType = tx.type !== undefined;
136
+ const hasFees = tx.gasPrice !== undefined || tx.maxFeePerGas !== undefined;
137
+ if (hasType || hasFees)
138
+ return tx;
139
+ if (!rpcUrl) {
140
+ throw new Error('eth_sendTransaction requires the provider to be created with an rpcUrl');
141
+ }
142
+ const filled = { ...tx };
143
+ const chainIdHex = (await forwardToRpc(rpcUrl, 'eth_chainId', []));
144
+ filled.chainId = Number(chainIdHex);
145
+ const nonceHex = (await forwardToRpc(rpcUrl, 'eth_getTransactionCount', [
146
+ filled.from,
147
+ 'pending',
148
+ ]));
149
+ filled.nonce = BigInt(nonceHex);
150
+ const gasHex = (await forwardToRpc(rpcUrl, 'eth_estimateGas', [
151
+ { from: filled.from, to: filled.to, value: filled.value, data: filled.data },
152
+ ]));
153
+ filled.gas = BigInt(gasHex);
154
+ const gasPriceHex = (await forwardToRpc(rpcUrl, 'eth_gasPrice', []));
155
+ filled.gasPrice = BigInt(gasPriceHex);
156
+ filled.type = 'legacy';
157
+ return filled;
158
+ }
159
+ export function getInAppWalletProvider(options = {}) {
160
+ const account = getUnlockedAccount();
161
+ const info = getUnlockedInfo();
162
+ if (!account || !info)
163
+ return null;
164
+ /**
165
+ * La red sí puede cambiar en caliente (`wallet_switchEthereumChain`), así que se lee
166
+ * de nuevo en cada petición: `info` quedó capturado al crear el proveedor y, si no,
167
+ * `eth_chainId` seguiría respondiendo la red vieja después del cambio y viem volvería
168
+ * a lanzar `ChainMismatchError` al pagar (reporte del operador, 2026-09-27).
169
+ */
170
+ const currentInfo = () => getUnlockedInfo() ?? info;
171
+ const provider = {
172
+ isPdJWallet: true,
173
+ async request({ method, params }) {
174
+ switch (method) {
175
+ case 'eth_requestAccounts':
176
+ case 'eth_accounts':
177
+ return [account.address];
178
+ case 'eth_chainId':
179
+ return `0x${CHAIN_IDS[currentInfo().chain].toString(16)}`;
180
+ case 'net_version':
181
+ return String(CHAIN_IDS[currentInfo().chain]);
182
+ case 'wallet_switchEthereumChain': {
183
+ const [target] = (params ?? []);
184
+ const requested = Number.parseInt(String(target?.chainId ?? ''), 16);
185
+ const name = Object.keys(CHAIN_IDS).find((candidate) => CHAIN_IDS[candidate] === requested);
186
+ if (!name) {
187
+ // EIP-1193: 4902 = cadena desconocida (no la conocemos, no es que no
188
+ // podamos cambiar: Celo Sepolia y Celo sí se pueden).
189
+ throw Object.assign(new Error(`Unrecognized chain ID ${String(target?.chainId)}`), {
190
+ code: 4902,
191
+ });
192
+ }
193
+ if (requested !== CHAIN_IDS[currentInfo().chain]) {
194
+ await setWalletChain(name, options.storage);
195
+ emit('chainChanged', `0x${requested.toString(16)}`);
196
+ }
197
+ return null;
198
+ }
199
+ case 'wallet_addEthereumChain': {
200
+ // Las dos redes que conocemos ya están "agregadas": se acepta sin hacer nada
201
+ // (las inyectadas lo usan para completar el cambio de red).
202
+ const [target] = (params ?? []);
203
+ const requested = Number.parseInt(String(target?.chainId ?? ''), 16);
204
+ if (Object.values(CHAIN_IDS).includes(requested))
205
+ return null;
206
+ throw Object.assign(new Error(`Unrecognized chain ID ${String(target?.chainId)}`), {
207
+ code: 4902,
208
+ });
209
+ }
210
+ case 'personal_sign': {
211
+ const [data] = (params ?? []);
212
+ if (typeof data !== 'string')
213
+ throw new Error('personal_sign expects a data string');
214
+ return signMessage({ raw: data.startsWith('0x') ? data : utf8ToHex(data) });
215
+ }
216
+ case 'eth_signTypedData_v4': {
217
+ const [, json] = (params ?? []);
218
+ // R-#246 (L1): una firma EIP-712 también mueve fondos (permiso EIP-2612,
219
+ // `TransferWithAuthorization` EIP-3009 de USDC): mismo gesto fresco.
220
+ const epoch = currentLockEpoch();
221
+ if (options.requireUserVerification !== false) {
222
+ await requireFundsConfirmation();
223
+ }
224
+ assertStillUnlocked(epoch);
225
+ return signTypedData(JSON.parse(json));
226
+ }
227
+ case 'eth_signTransaction': {
228
+ const [tx] = (params ?? []);
229
+ // R-#246 (L1): firma cruda que el llamador puede transmitir después.
230
+ const epoch = currentLockEpoch();
231
+ if (options.requireUserVerification !== false) {
232
+ await requireFundsConfirmation();
233
+ }
234
+ assertStillUnlocked(epoch);
235
+ const filled = options.rpcUrl ? await fillTransaction(options.rpcUrl, tx) : tx;
236
+ return signTransaction(filled);
237
+ }
238
+ case 'eth_sendTransaction': {
239
+ const [tx] = (params ?? []);
240
+ // El chequeo va antes del gesto: no tiene sentido pedir la huella si no
241
+ // hay a dónde transmitir.
242
+ if (!options.rpcUrl) {
243
+ throw new Error('eth_sendTransaction requires the provider to be created with an rpcUrl');
244
+ }
245
+ const destination = extractDestination(tx);
246
+ // R-#246/R-#253: mover fondos exige verificación; un destino nuevo siempre.
247
+ const epoch = currentLockEpoch();
248
+ if (options.requireUserVerification !== false) {
249
+ await requireFundsConfirmation({ destination });
250
+ }
251
+ assertStillUnlocked(epoch);
252
+ const filled = await fillTransaction(options.rpcUrl, tx);
253
+ const raw = await signTransaction(filled);
254
+ // R-#246 §14 item 3: si la billetera se bloqueó mientras se completaba la
255
+ // transacción, no se transmite nada.
256
+ assertStillUnlocked(epoch);
257
+ const hash = await forwardToRpc(options.rpcUrl, 'eth_sendRawTransaction', [raw]);
258
+ // Se recuerda sólo tras transmitir: la próxima vez a esa dirección no
259
+ // vuelve a pedir el gesto dentro de la ventana.
260
+ if (destination && info.address)
261
+ rememberDestination(info.address, destination);
262
+ return hash;
263
+ }
264
+ case 'wallet_getCapabilities':
265
+ return {};
266
+ default:
267
+ // Lecturas y métodos que no son de firma van al RPC (ver forwardToRpc).
268
+ return forwardToRpc(options.rpcUrl, method, params);
269
+ }
270
+ },
271
+ // EIP-1193: `on` returns the provider so calls can be chained.
272
+ on(event, listener) {
273
+ const set = listeners.get(event) ?? new Set();
274
+ set.add(listener);
275
+ listeners.set(event, set);
276
+ return provider;
277
+ },
278
+ removeListener(event, listener) {
279
+ listeners.get(event)?.delete(listener);
280
+ return provider;
281
+ },
282
+ };
283
+ return provider;
284
+ }
285
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/wallet/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.test.d.ts","sourceRoot":"","sources":["../../src/wallet/provider.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,170 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { verifyMessage } from 'viem';
3
+ import { extractDestination, getInAppWalletProvider } from './provider.js';
4
+ import { currentLockEpoch, getWalletInfo, importWallet, lockWallet } from './wallet.js';
5
+ import { MemoryStorage } from './storage/memory.js';
6
+ import { CHAIN_IDS } from './types.js';
7
+ const HARDHAT_MNEMONIC = 'test test test test test test test test test test test junk';
8
+ const HARDHAT_ADDRESS = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266';
9
+ const password = '12345678';
10
+ describe('getInAppWalletProvider', () => {
11
+ beforeEach(async () => {
12
+ await lockWallet();
13
+ });
14
+ it('returns null while the wallet is locked', () => {
15
+ expect(getInAppWalletProvider()).toBeNull();
16
+ });
17
+ it('exposes the address and chain id when unlocked', async () => {
18
+ await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage: new MemoryStorage() });
19
+ const provider = getInAppWalletProvider();
20
+ expect(provider).not.toBeNull();
21
+ expect(await provider.request({ method: 'eth_accounts' })).toEqual([HARDHAT_ADDRESS]);
22
+ expect(await provider.request({ method: 'eth_requestAccounts' })).toEqual([HARDHAT_ADDRESS]);
23
+ expect(await provider.request({ method: 'eth_chainId' })).toBe(`0x${CHAIN_IDS.celoSepolia.toString(16)}`);
24
+ expect(await provider.request({ method: 'net_version' })).toBe(String(CHAIN_IDS.celoSepolia));
25
+ });
26
+ it('signs personal_sign payloads with the wallet key', async () => {
27
+ await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage: new MemoryStorage() });
28
+ const provider = getInAppWalletProvider();
29
+ const message = 'Sign in to Learn Through Games.';
30
+ const hex = `0x${Array.from(new TextEncoder().encode(message))
31
+ .map((b) => b.toString(16).padStart(2, '0'))
32
+ .join('')}`;
33
+ const signature = (await provider.request({
34
+ method: 'personal_sign',
35
+ params: [hex, HARDHAT_ADDRESS],
36
+ }));
37
+ expect(await verifyMessage({ address: HARDHAT_ADDRESS, message, signature })).toBe(true);
38
+ });
39
+ it('forwards read methods to the RPC endpoint', async () => {
40
+ await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage: new MemoryStorage() });
41
+ const calls = [];
42
+ vi.stubGlobal('fetch', vi.fn(async (_url, init) => {
43
+ const body = JSON.parse(init.body);
44
+ calls.push(body.method);
45
+ return { json: async () => ({ result: body.method === 'eth_getBalance' ? '0x64' : '0x1' }) };
46
+ }));
47
+ try {
48
+ const provider = getInAppWalletProvider({ rpcUrl: 'https://rpc.example' });
49
+ const balance = await provider.request({
50
+ method: 'eth_getBalance',
51
+ params: [HARDHAT_ADDRESS, 'latest'],
52
+ });
53
+ expect(balance).toBe('0x64');
54
+ const call = await provider.request({
55
+ method: 'eth_call',
56
+ params: [{ to: HARDHAT_ADDRESS, data: '0x' }, 'latest'],
57
+ });
58
+ expect(call).toBe('0x1');
59
+ expect(calls).toEqual(['eth_getBalance', 'eth_call']);
60
+ }
61
+ finally {
62
+ vi.unstubAllGlobals();
63
+ }
64
+ });
65
+ it('explains that a read needs an rpcUrl when the provider has none', async () => {
66
+ await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage: new MemoryStorage() });
67
+ const provider = getInAppWalletProvider();
68
+ await expect(provider.request({ method: 'eth_call', params: [] })).rejects.toThrow(/rpcUrl/);
69
+ });
70
+ it('requires an rpcUrl to broadcast transactions', async () => {
71
+ await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage: new MemoryStorage() });
72
+ const provider = getInAppWalletProvider();
73
+ await expect(provider.request({ method: 'eth_sendTransaction', params: [{ to: HARDHAT_ADDRESS }] })).rejects.toThrow(/rpcUrl/);
74
+ });
75
+ it('extracts the destination of a native transfer', () => {
76
+ expect(extractDestination({ to: HARDHAT_ADDRESS })).toBe(HARDHAT_ADDRESS);
77
+ });
78
+ it('extracts the recipient of an ERC-20 transfer', () => {
79
+ const recipient = '11'.repeat(20);
80
+ const data = `0xa9059cbb${'0'.repeat(24)}${recipient}${'0'.repeat(64)}`;
81
+ expect(extractDestination({ to: '0xtoken', data })).toBe(`0x${recipient}`);
82
+ });
83
+ it('extracts the recipient of transferFrom (second argument)', () => {
84
+ const recipient = '22'.repeat(20);
85
+ const data = `0x23b872dd${'0'.repeat(64)}${'0'.repeat(24)}${recipient}${'0'.repeat(64)}`;
86
+ expect(extractDestination({ to: '0xtoken', data })).toBe(`0x${recipient}`);
87
+ });
88
+ it('fills nonce, gas and fees before signing a native send', async () => {
89
+ await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage: new MemoryStorage() });
90
+ const calls = [];
91
+ vi.stubGlobal('fetch', vi.fn(async (_url, init) => {
92
+ const body = JSON.parse(init.body);
93
+ calls.push(body.method);
94
+ const results = {
95
+ eth_chainId: '0xaa37cc',
96
+ eth_getTransactionCount: '0x0',
97
+ eth_estimateGas: '0x5208',
98
+ eth_gasPrice: '0x1',
99
+ eth_sendRawTransaction: '0xhash',
100
+ };
101
+ return { json: async () => ({ result: results[body.method] }) };
102
+ }));
103
+ try {
104
+ const provider = getInAppWalletProvider({
105
+ rpcUrl: 'https://rpc.example',
106
+ requireUserVerification: false,
107
+ });
108
+ const hash = await provider.request({
109
+ method: 'eth_sendTransaction',
110
+ params: [{ from: HARDHAT_ADDRESS, to: HARDHAT_ADDRESS, value: '0x1' }],
111
+ });
112
+ expect(hash).toBe('0xhash');
113
+ expect(calls).toContain('eth_getTransactionCount');
114
+ expect(calls).toContain('eth_estimateGas');
115
+ expect(calls).toContain('eth_gasPrice');
116
+ expect(calls).toContain('eth_sendRawTransaction');
117
+ }
118
+ finally {
119
+ vi.unstubAllGlobals();
120
+ }
121
+ });
122
+ it('wallet_switchEthereumChain switches to the other known chain and emits chainChanged', async () => {
123
+ const storage = new MemoryStorage();
124
+ await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage });
125
+ const provider = getInAppWalletProvider({ storage });
126
+ const changes = [];
127
+ provider.on('chainChanged', (payload) => changes.push(payload));
128
+ const celoHex = `0x${CHAIN_IDS.celo.toString(16)}`;
129
+ expect(await provider.request({ method: 'wallet_switchEthereumChain', params: [{ chainId: celoHex }] })).toBeNull();
130
+ expect(await provider.request({ method: 'eth_chainId' })).toBe(celoHex);
131
+ expect(await provider.request({ method: 'net_version' })).toBe(String(CHAIN_IDS.celo));
132
+ expect(changes).toEqual([celoHex]);
133
+ expect((await getWalletInfo(storage))?.chain).toBe('celo');
134
+ });
135
+ it('returns null when asked for the chain it is already on, without emitting', async () => {
136
+ const storage = new MemoryStorage();
137
+ await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage });
138
+ const provider = getInAppWalletProvider({ storage });
139
+ const changes = [];
140
+ provider.on('chainChanged', (payload) => changes.push(payload));
141
+ expect(await provider.request({
142
+ method: 'wallet_switchEthereumChain',
143
+ params: [{ chainId: `0x${CHAIN_IDS.celoSepolia.toString(16)}` }],
144
+ })).toBeNull();
145
+ expect(changes).toEqual([]);
146
+ });
147
+ it('wallet_switchEthereumChain rejects an unknown chain with 4902', async () => {
148
+ const storage = new MemoryStorage();
149
+ await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage });
150
+ const provider = getInAppWalletProvider({ storage });
151
+ await expect(provider.request({ method: 'wallet_switchEthereumChain', params: [{ chainId: '0x1' }] })).rejects.toMatchObject({ code: 4902 });
152
+ });
153
+ it('wallet_addEthereumChain accepts the known chains and rejects another', async () => {
154
+ const storage = new MemoryStorage();
155
+ await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage });
156
+ const provider = getInAppWalletProvider({ storage });
157
+ expect(await provider.request({
158
+ method: 'wallet_addEthereumChain',
159
+ params: [{ chainId: `0x${CHAIN_IDS.celo.toString(16)}` }],
160
+ })).toBeNull();
161
+ await expect(provider.request({ method: 'wallet_addEthereumChain', params: [{ chainId: '0x1' }] })).rejects.toMatchObject({ code: 4902 });
162
+ });
163
+ it('bumps the lock generation when the wallet locks', async () => {
164
+ await importWallet({ mnemonic: HARDHAT_MNEMONIC, password: password, storage: new MemoryStorage() });
165
+ const before = currentLockEpoch();
166
+ await lockWallet();
167
+ expect(currentLockEpoch()).toBe(before + 1);
168
+ });
169
+ });
170
+ //# sourceMappingURL=provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.test.js","sourceRoot":"","sources":["../../src/wallet/provider.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAC1E,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC,MAAM,gBAAgB,GAAG,6DAA6D,CAAA;AACtF,MAAM,eAAe,GAAG,4CAA4C,CAAA;AACpE,MAAM,QAAQ,GAAG,UAAU,CAAA;AAE3B,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,UAAU,EAAE,CAAA;IACpB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,sBAAsB,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,aAAa,EAAE,EAAE,CAAC,CAAA;QACpG,MAAM,QAAQ,GAAG,sBAAsB,EAAE,CAAA;QACzC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC/B,MAAM,CAAC,MAAM,QAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAA;QACtF,MAAM,CAAC,MAAM,QAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAA;QAC7F,MAAM,CAAC,MAAM,QAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAC7D,KAAK,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAC1C,CAAA;QACD,MAAM,CAAC,MAAM,QAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAA;IAChG,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,aAAa,EAAE,EAAE,CAAC,CAAA;QACpG,MAAM,QAAQ,GAAG,sBAAsB,EAAG,CAAA;QAC1C,MAAM,OAAO,GAAG,iCAAiC,CAAA;QACjD,MAAM,GAAG,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;aAC3D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aAC3C,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA;QACb,MAAM,SAAS,GAAG,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC;YACxC,MAAM,EAAE,eAAe;YACvB,MAAM,EAAE,CAAC,GAAG,EAAE,eAAe,CAAC;SAC/B,CAAC,CAAkB,CAAA;QACpB,MAAM,CAAC,MAAM,aAAa,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC1F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,aAAa,EAAE,EAAE,CAAC,CAAA;QACpG,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,EAAE,CAAC,UAAU,CACX,OAAO,EACP,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,IAAsB,EAAE,EAAE;YACnD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACvB,OAAO,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAA;QAC9F,CAAC,CAAC,CACH,CAAA;QACD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,sBAAsB,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAE,CAAA;YAC3E,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;gBACrC,MAAM,EAAE,gBAAgB;gBACxB,MAAM,EAAE,CAAC,eAAe,EAAE,QAAQ,CAAC;aACpC,CAAC,CAAA;YACF,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAC5B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;gBAClC,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;aACxD,CAAC,CAAA;YACF,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACxB,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAA;QACvD,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,gBAAgB,EAAE,CAAA;QACvB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,aAAa,EAAE,EAAE,CAAC,CAAA;QACpG,MAAM,QAAQ,GAAG,sBAAsB,EAAG,CAAA;QAC1C,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC9F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,aAAa,EAAE,EAAE,CAAC,CAAA;QACpG,MAAM,QAAQ,GAAG,sBAAsB,EAAG,CAAA;QAC1C,MAAM,MAAM,CACV,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CACvF,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC3E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACjC,MAAM,IAAI,GAAG,aAAa,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAA;QACvE,MAAM,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC,CAAA;IAC5E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACjC,MAAM,IAAI,GAAG,aAAa,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAA;QACxF,MAAM,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC,CAAA;IAC5E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,aAAa,EAAE,EAAE,CAAC,CAAA;QACpG,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,EAAE,CAAC,UAAU,CACX,OAAO,EACP,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,IAAsB,EAAE,EAAE;YACnD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACvB,MAAM,OAAO,GAA4B;gBACvC,WAAW,EAAE,UAAU;gBACvB,uBAAuB,EAAE,KAAK;gBAC9B,eAAe,EAAE,QAAQ;gBACzB,YAAY,EAAE,KAAK;gBACnB,sBAAsB,EAAE,QAAQ;aACjC,CAAA;YACD,OAAO,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAA;QACjE,CAAC,CAAC,CACH,CAAA;QACD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,sBAAsB,CAAC;gBACtC,MAAM,EAAE,qBAAqB;gBAC7B,uBAAuB,EAAE,KAAK;aAC/B,CAAE,CAAA;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;gBAClC,MAAM,EAAE,qBAAqB;gBAC7B,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;aACvE,CAAC,CAAA;YACF,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC3B,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAA;YAClD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;YAC1C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;YACvC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;QACnD,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,gBAAgB,EAAE,CAAA;QACvB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;QACnG,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAA;QACnC,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;QAC/E,MAAM,QAAQ,GAAG,sBAAsB,CAAC,EAAE,OAAO,EAAE,CAAE,CAAA;QACrD,MAAM,OAAO,GAAc,EAAE,CAAA;QAC7B,QAAQ,CAAC,EAAG,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;QAChE,MAAM,OAAO,GAAG,KAAK,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAA;QAElD,MAAM,CACJ,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,4BAA4B,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CACjG,CAAC,QAAQ,EAAE,CAAA;QACZ,MAAM,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACvE,MAAM,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;QACtF,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;QAClC,MAAM,CAAC,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAA;QACnC,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;QAC/E,MAAM,QAAQ,GAAG,sBAAsB,CAAC,EAAE,OAAO,EAAE,CAAE,CAAA;QACrD,MAAM,OAAO,GAAc,EAAE,CAAA;QAC7B,QAAQ,CAAC,EAAG,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;QAEhE,MAAM,CACJ,MAAM,QAAQ,CAAC,OAAO,CAAC;YACrB,MAAM,EAAE,4BAA4B;YACpC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;SACjE,CAAC,CACH,CAAC,QAAQ,EAAE,CAAA;QACZ,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAA;QACnC,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;QAC/E,MAAM,QAAQ,GAAG,sBAAsB,CAAC,EAAE,OAAO,EAAE,CAAE,CAAA;QACrD,MAAM,MAAM,CACV,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,4BAA4B,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CACzF,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAA;QACnC,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;QAC/E,MAAM,QAAQ,GAAG,sBAAsB,CAAC,EAAE,OAAO,EAAE,CAAE,CAAA;QACrD,MAAM,CACJ,MAAM,QAAQ,CAAC,OAAO,CAAC;YACrB,MAAM,EAAE,yBAAyB;YACjC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;SAC1D,CAAC,CACH,CAAC,QAAQ,EAAE,CAAA;QACZ,MAAM,MAAM,CACV,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CACtF,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,aAAa,EAAE,EAAE,CAAC,CAAA;QACpG,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAA;QACjC,MAAM,UAAU,EAAE,CAAA;QAClB,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,55 @@
1
+ export type PrivateKey = `0x${string}`;
2
+ export declare function newMnemonic(): string;
3
+ export declare function normalizeMnemonic(mnemonic: string): string;
4
+ /**
5
+ * BIP39 validation (words in the list + checksum), without adding a dependency:
6
+ * the wordlist comes from viem and the hash from WebCrypto (already required to
7
+ * store the wallet). `mnemonicToSeedSync` does **not** validate, so an imported
8
+ * phrase with a typo would silently become a different wallet; callers use this
9
+ * to reject it instead.
10
+ */
11
+ export declare function isValidMnemonic(mnemonic: string): Promise<boolean>;
12
+ /** Throws the translatable code `invalid-mnemonic` when the phrase is not BIP39. */
13
+ export declare function assertValidMnemonic(mnemonic: string): Promise<void>;
14
+ export declare function accountFromMnemonic(mnemonic: string, addressIndex?: number, accountIndex?: number): {
15
+ address: import("viem").Address;
16
+ nonceManager?: import("viem").NonceManager | undefined;
17
+ sign: (parameters: {
18
+ hash: import("viem").Hash;
19
+ }) => Promise<import("viem").Hex>;
20
+ signAuthorization?: ((parameters: import("viem").AuthorizationRequest) => Promise<import("viem/accounts").SignAuthorizationReturnType>) | undefined | undefined;
21
+ signMessage: ({ message }: {
22
+ message: import("viem").SignableMessage;
23
+ }) => Promise<import("viem").Hex>;
24
+ signTransaction: <serializer extends import("viem").SerializeTransactionFn<import("viem").TransactionSerializable> = import("viem").SerializeTransactionFn<import("viem").TransactionSerializable>, transaction extends Parameters<serializer>[0] = Parameters<serializer>[0]>(transaction: transaction, options?: {
25
+ serializer?: serializer | undefined;
26
+ } | undefined) => Promise<import("viem").Hex>;
27
+ signTypedData: <const typedData extends import("viem").TypedData | Record<string, unknown>, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData>(parameters: import("viem").TypedDataDefinition<typedData, primaryType>) => Promise<import("viem").Hex>;
28
+ publicKey: import("viem").Hex;
29
+ source: "hd";
30
+ type: "local";
31
+ getHdKey: () => import("viem").HDKey;
32
+ };
33
+ export declare function accountFromPrivateKey(privateKey: PrivateKey): {
34
+ address: import("viem").Address;
35
+ nonceManager?: import("viem").NonceManager | undefined;
36
+ sign: (parameters: {
37
+ hash: import("viem").Hash;
38
+ }) => Promise<import("viem").Hex>;
39
+ signAuthorization: (parameters: import("viem").AuthorizationRequest) => Promise<import("viem/accounts").SignAuthorizationReturnType>;
40
+ signMessage: ({ message }: {
41
+ message: import("viem").SignableMessage;
42
+ }) => Promise<import("viem").Hex>;
43
+ signTransaction: <serializer extends import("viem").SerializeTransactionFn<import("viem").TransactionSerializable> = import("viem").SerializeTransactionFn<import("viem").TransactionSerializable>, transaction extends Parameters<serializer>[0] = Parameters<serializer>[0]>(transaction: transaction, options?: {
44
+ serializer?: serializer | undefined;
45
+ } | undefined) => Promise<import("viem").Hex>;
46
+ signTypedData: <const typedData extends import("viem").TypedData | Record<string, unknown>, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData>(parameters: import("viem").TypedDataDefinition<typedData, primaryType>) => Promise<import("viem").Hex>;
47
+ publicKey: import("viem").Hex;
48
+ source: "privateKey";
49
+ type: "local";
50
+ };
51
+ export declare function addressFromMnemonic(mnemonic: string, addressIndex?: number, accountIndex?: number): `0x${string}`;
52
+ /** keccak256 of a UTF-8 string (replaces `cast keccak`). */
53
+ export declare function keccak(value: string): `0x${string}`;
54
+ export declare function privateKeyFromMnemonic(mnemonic: string, addressIndex?: number, accountIndex?: number): PrivateKey;
55
+ //# sourceMappingURL=signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/wallet/signer.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,KAAK,MAAM,EAAE,CAAA;AAQtC,wBAAgB,WAAW,IAAI,MAAM,CAQpC;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAwBxE;AAaD,oFAAoF;AACpF,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,SAAI,EAAE,YAAY,SAAI;;;;;;;;;;oTApCxD,CAAC;kBACjB,CAAC;;;;;;;EAqChB;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,UAAU;;;;;;;;;;oTAxC5B,CAAC;kBACjB,CAAC;;;;;;EAyChB;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,SAAI,EAAE,YAAY,SAAI,GAAG,KAAK,MAAM,EAAE,CAEvG;AAED,4DAA4D;AAC5D,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAEnD;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,SAAI,EAAE,YAAY,SAAI,GAAG,UAAU,CAOvG"}