@aztec/wallet-sdk 0.0.1-commit.fce3e4f → 3.0.0-devnet.2-patch.1

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 (40) hide show
  1. package/README.md +240 -266
  2. package/dest/base-wallet/base_wallet.d.ts +4 -4
  3. package/dest/base-wallet/base_wallet.d.ts.map +1 -1
  4. package/dest/base-wallet/base_wallet.js +15 -6
  5. package/dest/crypto.d.ts +183 -0
  6. package/dest/crypto.d.ts.map +1 -0
  7. package/dest/crypto.js +300 -0
  8. package/dest/manager/index.d.ts +4 -3
  9. package/dest/manager/index.d.ts.map +1 -1
  10. package/dest/manager/index.js +2 -0
  11. package/dest/manager/types.d.ts +22 -1
  12. package/dest/manager/types.d.ts.map +1 -1
  13. package/dest/manager/wallet_manager.d.ts +1 -1
  14. package/dest/manager/wallet_manager.d.ts.map +1 -1
  15. package/dest/manager/wallet_manager.js +34 -15
  16. package/dest/providers/extension/extension_provider.d.ts +53 -7
  17. package/dest/providers/extension/extension_provider.d.ts.map +1 -1
  18. package/dest/providers/extension/extension_provider.js +81 -13
  19. package/dest/providers/extension/extension_wallet.d.ts +140 -8
  20. package/dest/providers/extension/extension_wallet.d.ts.map +1 -1
  21. package/dest/providers/extension/extension_wallet.js +268 -46
  22. package/dest/providers/extension/index.d.ts +6 -4
  23. package/dest/providers/extension/index.d.ts.map +1 -1
  24. package/dest/providers/extension/index.js +2 -0
  25. package/dest/types.d.ts +92 -0
  26. package/dest/types.d.ts.map +1 -0
  27. package/dest/types.js +10 -0
  28. package/package.json +12 -10
  29. package/src/base-wallet/base_wallet.ts +17 -11
  30. package/src/crypto.ts +375 -0
  31. package/src/manager/index.ts +4 -8
  32. package/src/manager/types.ts +22 -0
  33. package/src/manager/wallet_manager.ts +43 -16
  34. package/src/providers/extension/extension_provider.ts +112 -17
  35. package/src/providers/extension/extension_wallet.ts +310 -55
  36. package/src/providers/extension/index.ts +5 -3
  37. package/src/{providers/types.ts → types.ts} +33 -6
  38. package/dest/providers/types.d.ts +0 -67
  39. package/dest/providers/types.d.ts.map +0 -1
  40. package/dest/providers/types.js +0 -3
@@ -2,63 +2,125 @@ import { WalletSchema } from '@aztec/aztec.js/wallet';
2
2
  import { jsonStringify } from '@aztec/foundation/json-rpc';
3
3
  import { promiseWithResolvers } from '@aztec/foundation/promise';
4
4
  import { schemaHasMethod } from '@aztec/foundation/schemas';
5
+ import { decrypt, encrypt } from '../../crypto.js';
6
+ import { WalletMessageType } from '../../types.js';
5
7
  /**
6
8
  * A wallet implementation that communicates with browser extension wallets
7
- * Supports multiple extensions by targeting specific extension IDs
9
+ * using a secure encrypted MessageChannel.
10
+ *
11
+ * This class uses a pre-established secure channel from the discovery phase:
12
+ *
13
+ * 1. **MessageChannel**: A private communication channel created during discovery,
14
+ * not visible to other scripts on the page (unlike window.postMessage).
15
+ *
16
+ * 2. **ECDH Key Exchange**: The shared secret was derived during discovery using
17
+ * Elliptic Curve Diffie-Hellman key exchange.
18
+ *
19
+ * 3. **AES-GCM Encryption**: All messages are encrypted using AES-256-GCM,
20
+ * providing both confidentiality and authenticity.
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * // Discovery returns wallets with secure channel components
25
+ * const wallets = await ExtensionProvider.discoverExtensions(chainInfo);
26
+ * const { info, port, sharedKey } = wallets[0];
27
+ *
28
+ * // User can verify emoji if desired
29
+ * console.log('Verify:', hashToEmoji(info.verificationHash!));
30
+ *
31
+ * // Create wallet using the discovered components
32
+ * const wallet = await ExtensionWallet.create(info, chainInfo, port, sharedKey, 'my-dapp');
33
+ *
34
+ * // All subsequent calls are encrypted
35
+ * const accounts = await wallet.getAccounts();
36
+ * ```
8
37
  */ export class ExtensionWallet {
9
38
  chainInfo;
10
39
  appId;
11
40
  extensionId;
12
- inFlight;
13
- constructor(chainInfo, appId, extensionId){
41
+ port;
42
+ sharedKey;
43
+ /** Map of pending requests awaiting responses, keyed by message ID */ inFlight;
44
+ disconnected;
45
+ disconnectCallbacks;
46
+ /**
47
+ * Private constructor - use {@link ExtensionWallet.create} to instantiate.
48
+ * @param chainInfo - The chain information (chainId and version)
49
+ * @param appId - Application identifier for the requesting dApp
50
+ * @param extensionId - The unique identifier of the target wallet extension
51
+ * @param port - The MessagePort for private communication with the wallet
52
+ * @param sharedKey - The derived AES-256-GCM shared key for encryption
53
+ */ constructor(chainInfo, appId, extensionId, port, sharedKey){
14
54
  this.chainInfo = chainInfo;
15
55
  this.appId = appId;
16
56
  this.extensionId = extensionId;
57
+ this.port = port;
58
+ this.sharedKey = sharedKey;
17
59
  this.inFlight = new Map();
60
+ this.disconnected = false;
61
+ this.disconnectCallbacks = [];
62
+ this.walletProxy = null;
18
63
  }
64
+ /** Cached Wallet proxy instance */ walletProxy;
19
65
  /**
20
- * Creates an ExtensionWallet instance that proxies wallet calls to a browser extension
21
- * @param chainInfo - The chain information (chainId and version)
22
- * @param appId - Application identifier for the requesting dapp
23
- * @param extensionId - Specific extension ID to communicate with
24
- * @returns A Proxy object that implements the Wallet interface
25
- */ static create(chainInfo, appId, extensionId) {
26
- const wallet = new ExtensionWallet(chainInfo, appId, extensionId);
27
- // Set up message listener for responses from extensions
28
- window.addEventListener('message', (event)=>{
29
- if (event.source !== window) {
30
- return;
31
- }
32
- let data;
33
- try {
34
- data = JSON.parse(event.data);
35
- } catch {
36
- return;
37
- }
38
- // Ignore request messages (only process responses)
39
- if ('type' in data) {
40
- return;
41
- }
42
- const { messageId, result, error, walletId: responseWalletId } = data;
43
- if (!messageId || !responseWalletId) {
44
- return;
45
- }
46
- if (wallet.extensionId !== responseWalletId) {
47
- return;
48
- }
49
- if (!wallet.inFlight.has(messageId)) {
50
- return;
51
- }
52
- const { resolve, reject } = wallet.inFlight.get(messageId);
53
- if (error) {
54
- reject(new Error(jsonStringify(error)));
55
- } else {
56
- resolve(result);
57
- }
58
- wallet.inFlight.delete(messageId);
59
- });
66
+ * Creates an ExtensionWallet instance that communicates with a browser extension
67
+ * over a secure encrypted MessageChannel.
68
+ *
69
+ * @param walletInfo - The wallet info from ExtensionProvider.discoverExtensions()
70
+ * @param chainInfo - The chain information (chainId and version) for request context
71
+ * @param port - The MessagePort for private communication with the wallet
72
+ * @param sharedKey - The derived AES-256-GCM shared key for encryption
73
+ * @param appId - Application identifier used to identify the requesting dApp to the wallet
74
+ * @returns The ExtensionWallet instance. Use {@link getWallet} to get the Wallet interface.
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * const wallets = await ExtensionProvider.discoverExtensions(chainInfo);
79
+ * const { info, port, sharedKey } = wallets[0];
80
+ * const extensionWallet = ExtensionWallet.create(
81
+ * info,
82
+ * { chainId: Fr(31337), version: Fr(0) },
83
+ * port,
84
+ * sharedKey,
85
+ * 'my-defi-app'
86
+ * );
87
+ *
88
+ * // Register disconnect handler
89
+ * extensionWallet.onDisconnect(() => console.log('Disconnected!'));
90
+ *
91
+ * // Get the Wallet interface for dApp usage
92
+ * const wallet = extensionWallet.getWallet();
93
+ * const accounts = await wallet.getAccounts();
94
+ * ```
95
+ */ static create(walletInfo, chainInfo, port, sharedKey, appId) {
96
+ const wallet = new ExtensionWallet(chainInfo, appId, walletInfo.id, port, sharedKey);
97
+ // Set up message handler - all messages are now encrypted
98
+ wallet.port.onmessage = (event)=>{
99
+ void wallet.handleEncryptedResponse(event.data);
100
+ };
101
+ wallet.port.start();
102
+ return wallet;
103
+ }
104
+ /**
105
+ * Returns a Wallet interface that proxies all method calls through the secure channel.
106
+ *
107
+ * The returned Wallet can be used directly by dApps - all method calls are automatically
108
+ * encrypted and sent to the wallet extension.
109
+ *
110
+ * @returns A Wallet implementation that encrypts all communication
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * const extensionWallet = ExtensionWallet.create(info, chainInfo, port, sharedKey, 'my-app');
115
+ * const wallet = extensionWallet.getWallet();
116
+ * const accounts = await wallet.getAccounts();
117
+ * ```
118
+ */ getWallet() {
119
+ if (this.walletProxy) {
120
+ return this.walletProxy;
121
+ }
60
122
  // Create a Proxy that intercepts wallet method calls and forwards them to the extension
61
- return new Proxy(wallet, {
123
+ this.walletProxy = new Proxy(this, {
62
124
  get: (target, prop)=>{
63
125
  if (schemaHasMethod(WalletSchema, prop.toString())) {
64
126
  return async (...args)=>{
@@ -73,8 +135,65 @@ import { schemaHasMethod } from '@aztec/foundation/schemas';
73
135
  }
74
136
  }
75
137
  });
138
+ return this.walletProxy;
139
+ }
140
+ /**
141
+ * Handles an encrypted response received from the wallet extension.
142
+ *
143
+ * Decrypts the response using the shared AES key and resolves or rejects
144
+ * the corresponding pending promise based on the response content.
145
+ *
146
+ * @param encrypted - The encrypted response from the wallet
147
+ */ async handleEncryptedResponse(encrypted) {
148
+ if (!this.sharedKey) {
149
+ return;
150
+ }
151
+ try {
152
+ const response = await decrypt(this.sharedKey, encrypted);
153
+ const { messageId, result, error, walletId: responseWalletId } = response;
154
+ // Check for disconnect notification from the wallet backend
155
+ // This is sent as an encrypted error response with a special type
156
+ if (error && typeof error === 'object' && 'type' in error && error.type === WalletMessageType.SESSION_DISCONNECTED) {
157
+ this.handleDisconnect();
158
+ return;
159
+ }
160
+ if (!messageId || !responseWalletId) {
161
+ return;
162
+ }
163
+ if (this.extensionId !== responseWalletId) {
164
+ return;
165
+ }
166
+ if (!this.inFlight.has(messageId)) {
167
+ return;
168
+ }
169
+ const { resolve, reject } = this.inFlight.get(messageId);
170
+ if (error) {
171
+ reject(new Error(jsonStringify(error)));
172
+ } else {
173
+ resolve(result);
174
+ }
175
+ this.inFlight.delete(messageId);
176
+ // eslint-disable-next-line no-empty
177
+ } catch {}
76
178
  }
77
- postMessage(call) {
179
+ /**
180
+ * Sends an encrypted wallet method call over the secure MessageChannel.
181
+ *
182
+ * The message is encrypted using AES-256-GCM with the shared key derived
183
+ * during discovery. A unique message ID is generated to correlate
184
+ * the response.
185
+ *
186
+ * @param call - The wallet method call containing method name and arguments
187
+ * @returns A Promise that resolves with the decrypted result from the wallet
188
+ *
189
+ * @throws Error if the secure channel has not been established or wallet is disconnected
190
+ */ async postMessage(call) {
191
+ if (this.disconnected) {
192
+ throw new Error('Wallet has been disconnected');
193
+ }
194
+ if (!this.port || !this.sharedKey) {
195
+ throw new Error('Secure channel not established');
196
+ }
78
197
  const messageId = globalThis.crypto.randomUUID();
79
198
  const message = {
80
199
  type: call.type,
@@ -84,7 +203,9 @@ import { schemaHasMethod } from '@aztec/foundation/schemas';
84
203
  appId: this.appId,
85
204
  walletId: this.extensionId
86
205
  };
87
- window.postMessage(jsonStringify(message), '*');
206
+ // Encrypt the message and send over the private MessageChannel
207
+ const encrypted = await encrypt(this.sharedKey, message);
208
+ this.port.postMessage(encrypted);
88
209
  const { promise, resolve, reject } = promiseWithResolvers();
89
210
  this.inFlight.set(messageId, {
90
211
  promise,
@@ -93,4 +214,105 @@ import { schemaHasMethod } from '@aztec/foundation/schemas';
93
214
  });
94
215
  return promise;
95
216
  }
217
+ /**
218
+ * Handles wallet disconnection.
219
+ * Rejects all pending requests and notifies registered callbacks.
220
+ * @internal
221
+ */ handleDisconnect() {
222
+ if (this.disconnected) {
223
+ return;
224
+ }
225
+ this.disconnected = true;
226
+ // Close the port to prevent any further messages
227
+ if (this.port) {
228
+ this.port.onmessage = null;
229
+ this.port.close();
230
+ }
231
+ // Reject all pending requests
232
+ // Note: These rejections should be caught by the callers, but we log them
233
+ // here to help with debugging if they become unhandled
234
+ const error = new Error('Wallet disconnected');
235
+ for (const { reject } of this.inFlight.values()){
236
+ reject(error);
237
+ }
238
+ this.inFlight.clear();
239
+ // Notify registered callbacks
240
+ for (const callback of this.disconnectCallbacks){
241
+ try {
242
+ callback();
243
+ } catch {
244
+ // Ignore errors in callbacks
245
+ }
246
+ }
247
+ }
248
+ /**
249
+ * Registers a callback to be invoked when the wallet disconnects.
250
+ *
251
+ * @param callback - Function to call when wallet disconnects
252
+ * @returns A function to unregister the callback
253
+ *
254
+ * @example
255
+ * ```typescript
256
+ * const wallet = await ExtensionWallet.create(...);
257
+ * const unsubscribe = wallet.onDisconnect(() => {
258
+ * console.log('Wallet disconnected! Please reconnect.');
259
+ * // Clean up UI, prompt user to reconnect, etc.
260
+ * });
261
+ * // Later: unsubscribe(); to stop receiving notifications
262
+ * ```
263
+ */ onDisconnect(callback) {
264
+ this.disconnectCallbacks.push(callback);
265
+ return ()=>{
266
+ const index = this.disconnectCallbacks.indexOf(callback);
267
+ if (index !== -1) {
268
+ this.disconnectCallbacks.splice(index, 1);
269
+ }
270
+ };
271
+ }
272
+ /**
273
+ * Returns whether the wallet has been disconnected.
274
+ *
275
+ * @returns true if the wallet is no longer connected
276
+ */ isDisconnected() {
277
+ return this.disconnected;
278
+ }
279
+ /**
280
+ * Disconnects from the wallet and cleans up resources.
281
+ *
282
+ * This method notifies the wallet extension that the session is ending,
283
+ * allowing it to clean up its state. After calling this method, the wallet
284
+ * instance can no longer be used and any pending requests will be rejected.
285
+ *
286
+ * @example
287
+ * ```typescript
288
+ * const wallet = await provider.connect('my-app');
289
+ * // ... use wallet ...
290
+ * await wallet.disconnect(); // Clean disconnect when done
291
+ * ```
292
+ */ async disconnect() {
293
+ if (this.disconnected) {
294
+ return;
295
+ }
296
+ // Send disconnect message to extension before closing
297
+ if (this.port && this.sharedKey) {
298
+ try {
299
+ const message = {
300
+ type: WalletMessageType.DISCONNECT,
301
+ messageId: globalThis.crypto.randomUUID(),
302
+ chainInfo: this.chainInfo,
303
+ appId: this.appId,
304
+ walletId: this.extensionId,
305
+ args: []
306
+ };
307
+ const encrypted = await encrypt(this.sharedKey, message);
308
+ this.port.postMessage(encrypted);
309
+ } catch {
310
+ // Ignore errors sending disconnect message
311
+ }
312
+ }
313
+ this.handleDisconnect();
314
+ if (this.port) {
315
+ this.port.close();
316
+ }
317
+ }
96
318
  }
@@ -1,4 +1,6 @@
1
- export { ExtensionWallet } from './extension_wallet.js';
2
- export { ExtensionProvider } from './extension_provider.js';
3
- export type { WalletInfo, WalletMessage, WalletResponse, DiscoveryRequest, DiscoveryResponse } from '../types.js';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcm92aWRlcnMvZXh0ZW5zaW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxZQUFZLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUMifQ==
1
+ export { ExtensionWallet, type DisconnectCallback } from './extension_wallet.js';
2
+ export { ExtensionProvider, type DiscoveredWallet } from './extension_provider.js';
3
+ export * from '../../crypto.js';
4
+ export { WalletMessageType } from '../../types.js';
5
+ export type { WalletInfo, WalletMessage, WalletResponse, DiscoveryRequest, DiscoveryResponse } from '../../types.js';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcm92aWRlcnMvZXh0ZW5zaW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsS0FBSyxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxLQUFLLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkYsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxZQUFZLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/extension/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/extension/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACnF,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1,2 +1,4 @@
1
1
  export { ExtensionWallet } from './extension_wallet.js';
2
2
  export { ExtensionProvider } from './extension_provider.js';
3
+ export * from '../../crypto.js';
4
+ export { WalletMessageType } from '../../types.js';
@@ -0,0 +1,92 @@
1
+ import type { ChainInfo } from '@aztec/aztec.js/account';
2
+ import type { ExportedPublicKey } from './crypto.js';
3
+ /**
4
+ * Message types for wallet SDK communication.
5
+ * All types are prefixed with 'aztec-wallet-' for namespacing.
6
+ */
7
+ export declare enum WalletMessageType {
8
+ /** Discovery request to find installed wallets */
9
+ DISCOVERY = "aztec-wallet-discovery",
10
+ /** Discovery response from a wallet */
11
+ DISCOVERY_RESPONSE = "aztec-wallet-discovery-response",
12
+ /** Session disconnected notification (unencrypted control message) */
13
+ SESSION_DISCONNECTED = "aztec-wallet-session-disconnected",
14
+ /** Explicit disconnect request from dApp */
15
+ DISCONNECT = "aztec-wallet-disconnect"
16
+ }
17
+ /**
18
+ * Information about an installed Aztec wallet
19
+ */
20
+ export interface WalletInfo {
21
+ /** Unique identifier for the wallet */
22
+ id: string;
23
+ /** Display name of the wallet */
24
+ name: string;
25
+ /** URL to the wallet's icon */
26
+ icon?: string;
27
+ /** Wallet version */
28
+ version: string;
29
+ /** Wallet's ECDH public key for secure channel establishment */
30
+ publicKey: ExportedPublicKey;
31
+ /**
32
+ * Hash of the shared secret for anti-MITM verification.
33
+ * Both dApp and wallet independently compute this from the ECDH shared secret.
34
+ * Use {@link hashToEmoji} to convert to a visual representation for user verification.
35
+ */
36
+ verificationHash?: string;
37
+ }
38
+ /**
39
+ * Message format for wallet communication (internal, before encryption)
40
+ */
41
+ export interface WalletMessage {
42
+ /** Unique message ID for tracking responses */
43
+ messageId: string;
44
+ /** The wallet method to call */
45
+ type: string;
46
+ /** Arguments for the method */
47
+ args: unknown[];
48
+ /** Chain information */
49
+ chainInfo: ChainInfo;
50
+ /** Application ID making the request */
51
+ appId: string;
52
+ /** Wallet ID to target a specific wallet */
53
+ walletId: string;
54
+ }
55
+ /**
56
+ * Response message from wallet
57
+ */
58
+ export interface WalletResponse {
59
+ /** Message ID matching the request */
60
+ messageId: string;
61
+ /** Result data (if successful) */
62
+ result?: unknown;
63
+ /** Error data (if failed) */
64
+ error?: unknown;
65
+ /** Wallet ID that sent the response */
66
+ walletId: string;
67
+ }
68
+ /**
69
+ * Discovery message for finding installed wallets (public, unencrypted)
70
+ */
71
+ export interface DiscoveryRequest {
72
+ /** Message type for discovery */
73
+ type: WalletMessageType.DISCOVERY;
74
+ /** Request ID */
75
+ requestId: string;
76
+ /** Chain information to check if wallet supports this network */
77
+ chainInfo: ChainInfo;
78
+ /** dApp's ECDH public key for deriving shared secret */
79
+ publicKey: ExportedPublicKey;
80
+ }
81
+ /**
82
+ * Discovery response from a wallet (public, unencrypted)
83
+ */
84
+ export interface DiscoveryResponse {
85
+ /** Message type for discovery response */
86
+ type: WalletMessageType.DISCOVERY_RESPONSE;
87
+ /** Request ID matching the discovery request */
88
+ requestId: string;
89
+ /** Wallet information */
90
+ walletInfo: WalletInfo;
91
+ }
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV6RCxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVyRDs7O0dBR0c7QUFDSCxvQkFBWSxpQkFBaUI7SUFDM0Isa0RBQWtEO0lBQ2xELFNBQVMsMkJBQTJCO0lBQ3BDLHVDQUF1QztJQUN2QyxrQkFBa0Isb0NBQW9DO0lBQ3RELHNFQUFzRTtJQUN0RSxvQkFBb0Isc0NBQXNDO0lBQzFELDRDQUE0QztJQUM1QyxVQUFVLDRCQUE0QjtDQUN2QztBQUVEOztHQUVHO0FBQ0gsTUFBTSxXQUFXLFVBQVU7SUFDekIsdUNBQXVDO0lBQ3ZDLEVBQUUsRUFBRSxNQUFNLENBQUM7SUFDWCxpQ0FBaUM7SUFDakMsSUFBSSxFQUFFLE1BQU0sQ0FBQztJQUNiLCtCQUErQjtJQUMvQixJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDZCxxQkFBcUI7SUFDckIsT0FBTyxFQUFFLE1BQU0sQ0FBQztJQUNoQixnRUFBZ0U7SUFDaEUsU0FBUyxFQUFFLGlCQUFpQixDQUFDO0lBQzdCOzs7O09BSUc7SUFDSCxnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQztDQUMzQjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxXQUFXLGFBQWE7SUFDNUIsK0NBQStDO0lBQy9DLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsZ0NBQWdDO0lBQ2hDLElBQUksRUFBRSxNQUFNLENBQUM7SUFDYiwrQkFBK0I7SUFDL0IsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ2hCLHdCQUF3QjtJQUN4QixTQUFTLEVBQUUsU0FBUyxDQUFDO0lBQ3JCLHdDQUF3QztJQUN4QyxLQUFLLEVBQUUsTUFBTSxDQUFDO0lBQ2QsNENBQTRDO0lBQzVDLFFBQVEsRUFBRSxNQUFNLENBQUM7Q0FDbEI7QUFFRDs7R0FFRztBQUNILE1BQU0sV0FBVyxjQUFjO0lBQzdCLHNDQUFzQztJQUN0QyxTQUFTLEVBQUUsTUFBTSxDQUFDO0lBQ2xCLGtDQUFrQztJQUNsQyxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDakIsNkJBQTZCO0lBQzdCLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUNoQix1Q0FBdUM7SUFDdkMsUUFBUSxFQUFFLE1BQU0sQ0FBQztDQUNsQjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxXQUFXLGdCQUFnQjtJQUMvQixpQ0FBaUM7SUFDakMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLFNBQVMsQ0FBQztJQUNsQyxpQkFBaUI7SUFDakIsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUNsQixpRUFBaUU7SUFDakUsU0FBUyxFQUFFLFNBQVMsQ0FBQztJQUNyQix3REFBd0Q7SUFDeEQsU0FBUyxFQUFFLGlCQUFpQixDQUFDO0NBQzlCO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFdBQVcsaUJBQWlCO0lBQ2hDLDBDQUEwQztJQUMxQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsa0JBQWtCLENBQUM7SUFDM0MsZ0RBQWdEO0lBQ2hELFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIseUJBQXlCO0lBQ3pCLFVBQVUsRUFBRSxVQUFVLENBQUM7Q0FDeEIifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;GAGG;AACH,oBAAY,iBAAiB;IAC3B,kDAAkD;IAClD,SAAS,2BAA2B;IACpC,uCAAuC;IACvC,kBAAkB,oCAAoC;IACtD,sEAAsE;IACtE,oBAAoB,sCAAsC;IAC1D,4CAA4C;IAC5C,UAAU,4BAA4B;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,SAAS,EAAE,iBAAiB,CAAC;IAC7B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,wBAAwB;IACxB,SAAS,EAAE,SAAS,CAAC;IACrB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,IAAI,EAAE,iBAAiB,CAAC,SAAS,CAAC;IAClC,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,SAAS,EAAE,SAAS,CAAC;IACrB,wDAAwD;IACxD,SAAS,EAAE,iBAAiB,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,IAAI,EAAE,iBAAiB,CAAC,kBAAkB,CAAC;IAC3C,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,UAAU,EAAE,UAAU,CAAC;CACxB"}
package/dest/types.js ADDED
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Message types for wallet SDK communication.
3
+ * All types are prefixed with 'aztec-wallet-' for namespacing.
4
+ */ export var WalletMessageType = /*#__PURE__*/ function(WalletMessageType) {
5
+ /** Discovery request to find installed wallets */ WalletMessageType["DISCOVERY"] = "aztec-wallet-discovery";
6
+ /** Discovery response from a wallet */ WalletMessageType["DISCOVERY_RESPONSE"] = "aztec-wallet-discovery-response";
7
+ /** Session disconnected notification (unencrypted control message) */ WalletMessageType["SESSION_DISCONNECTED"] = "aztec-wallet-session-disconnected";
8
+ /** Explicit disconnect request from dApp */ WalletMessageType["DISCONNECT"] = "aztec-wallet-disconnect";
9
+ return WalletMessageType;
10
+ }({});
package/package.json CHANGED
@@ -1,11 +1,13 @@
1
1
  {
2
2
  "name": "@aztec/wallet-sdk",
3
3
  "homepage": "https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/wallet-sdk",
4
- "version": "0.0.1-commit.fce3e4f",
4
+ "version": "3.0.0-devnet.2-patch.1",
5
5
  "type": "module",
6
6
  "exports": {
7
7
  "./base-wallet": "./dest/base-wallet/index.js",
8
8
  "./providers/extension": "./dest/providers/extension/index.js",
9
+ "./crypto": "./dest/crypto.js",
10
+ "./types": "./dest/types.js",
9
11
  "./manager": "./dest/manager/index.js"
10
12
  },
11
13
  "typedocOptions": {
@@ -15,8 +17,8 @@
15
17
  "tsconfig": "./tsconfig.json"
16
18
  },
17
19
  "scripts": {
18
- "build": "yarn clean && tsgo -b",
19
- "build:dev": "tsgo -b --watch",
20
+ "build": "yarn clean && ../scripts/tsc.sh",
21
+ "build:dev": "../scripts/tsc.sh --watch",
20
22
  "build:ts": "tsc -b",
21
23
  "clean": "rm -rf ./dest .tsbuildinfo",
22
24
  "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}"
@@ -62,15 +64,15 @@
62
64
  ]
63
65
  },
64
66
  "dependencies": {
65
- "@aztec/aztec.js": "0.0.1-commit.fce3e4f",
66
- "@aztec/constants": "0.0.1-commit.fce3e4f",
67
- "@aztec/entrypoints": "0.0.1-commit.fce3e4f",
68
- "@aztec/foundation": "0.0.1-commit.fce3e4f",
69
- "@aztec/pxe": "0.0.1-commit.fce3e4f",
70
- "@aztec/stdlib": "0.0.1-commit.fce3e4f"
67
+ "@aztec/aztec.js": "3.0.0-devnet.2-patch.1",
68
+ "@aztec/constants": "3.0.0-devnet.2-patch.1",
69
+ "@aztec/entrypoints": "3.0.0-devnet.2-patch.1",
70
+ "@aztec/foundation": "3.0.0-devnet.2-patch.1",
71
+ "@aztec/pxe": "3.0.0-devnet.2-patch.1",
72
+ "@aztec/stdlib": "3.0.0-devnet.2-patch.1"
71
73
  },
72
74
  "devDependencies": {
73
- "@aztec/noir-contracts.js": "0.0.1-commit.fce3e4f",
75
+ "@aztec/noir-contracts.js": "3.0.0-devnet.2-patch.1",
74
76
  "@jest/globals": "^30.0.0",
75
77
  "@types/jest": "^30.0.0",
76
78
  "@types/node": "^22.15.17",
@@ -6,6 +6,8 @@ import type {
6
6
  BatchResults,
7
7
  BatchableMethods,
8
8
  BatchedMethod,
9
+ PrivateEvent,
10
+ PrivateEventFilter,
9
11
  ProfileOptions,
10
12
  SendOptions,
11
13
  SimulateOptions,
@@ -19,10 +21,10 @@ import {
19
21
  } from '@aztec/constants';
20
22
  import { AccountFeePaymentMethodOptions, type DefaultAccountEntrypointOptions } from '@aztec/entrypoints/account';
21
23
  import type { ChainInfo } from '@aztec/entrypoints/interfaces';
22
- import { Fr } from '@aztec/foundation/fields';
24
+ import { Fr } from '@aztec/foundation/curves/bn254';
23
25
  import { createLogger } from '@aztec/foundation/log';
24
26
  import type { FieldsOf } from '@aztec/foundation/types';
25
- import type { PXE } from '@aztec/pxe/server';
27
+ import type { PXE, PackedPrivateEvent } from '@aztec/pxe/server';
26
28
  import {
27
29
  type ContractArtifact,
28
30
  type EventMetadataDefinition,
@@ -325,17 +327,21 @@ export abstract class BaseWallet implements Wallet {
325
327
  }
326
328
 
327
329
  async getPrivateEvents<T>(
328
- contractAddress: AztecAddress,
329
330
  eventDef: EventMetadataDefinition,
330
- from: number,
331
- limit: number,
332
- recipients: AztecAddress[] = [],
333
- ): Promise<T[]> {
334
- const events = await this.pxe.getPrivateEvents(contractAddress, eventDef.eventSelector, from, limit, recipients);
331
+ eventFilter: PrivateEventFilter,
332
+ ): Promise<PrivateEvent<T>[]> {
333
+ const pxeEvents = await this.pxe.getPrivateEvents(eventDef.eventSelector, eventFilter);
335
334
 
336
- const decodedEvents = events.map(
337
- (event: any /** PrivateEvent */): T => decodeFromAbi([eventDef.abiType], event.packedEvent) as T,
338
- );
335
+ const decodedEvents = pxeEvents.map((pxeEvent: PackedPrivateEvent): PrivateEvent<T> => {
336
+ return {
337
+ event: decodeFromAbi([eventDef.abiType], pxeEvent.packedEvent) as T,
338
+ metadata: {
339
+ l2BlockNumber: pxeEvent.l2BlockNumber,
340
+ l2BlockHash: pxeEvent.l2BlockHash,
341
+ txHash: pxeEvent.txHash,
342
+ },
343
+ };
344
+ });
339
345
 
340
346
  return decodedEvents;
341
347
  }