@aztec/wallet-sdk 0.0.1-commit.fcb71a6 → 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 (36) hide show
  1. package/README.md +241 -267
  2. package/dest/crypto.d.ts +183 -0
  3. package/dest/crypto.d.ts.map +1 -0
  4. package/dest/crypto.js +300 -0
  5. package/dest/manager/index.d.ts +4 -3
  6. package/dest/manager/index.d.ts.map +1 -1
  7. package/dest/manager/index.js +2 -0
  8. package/dest/manager/types.d.ts +22 -1
  9. package/dest/manager/types.d.ts.map +1 -1
  10. package/dest/manager/wallet_manager.d.ts +1 -1
  11. package/dest/manager/wallet_manager.d.ts.map +1 -1
  12. package/dest/manager/wallet_manager.js +34 -15
  13. package/dest/providers/extension/extension_provider.d.ts +53 -7
  14. package/dest/providers/extension/extension_provider.d.ts.map +1 -1
  15. package/dest/providers/extension/extension_provider.js +81 -13
  16. package/dest/providers/extension/extension_wallet.d.ts +140 -8
  17. package/dest/providers/extension/extension_wallet.d.ts.map +1 -1
  18. package/dest/providers/extension/extension_wallet.js +268 -46
  19. package/dest/providers/extension/index.d.ts +6 -4
  20. package/dest/providers/extension/index.d.ts.map +1 -1
  21. package/dest/providers/extension/index.js +2 -0
  22. package/dest/types.d.ts +92 -0
  23. package/dest/types.d.ts.map +1 -0
  24. package/dest/types.js +10 -0
  25. package/package.json +10 -8
  26. package/src/crypto.ts +375 -0
  27. package/src/manager/index.ts +4 -8
  28. package/src/manager/types.ts +22 -0
  29. package/src/manager/wallet_manager.ts +43 -16
  30. package/src/providers/extension/extension_provider.ts +112 -17
  31. package/src/providers/extension/extension_wallet.ts +310 -55
  32. package/src/providers/extension/index.ts +5 -3
  33. package/src/{providers/types.ts → types.ts} +33 -6
  34. package/dest/providers/types.d.ts +0 -67
  35. package/dest/providers/types.d.ts.map +0 -1
  36. package/dest/providers/types.js +0 -3
@@ -5,106 +5,245 @@ import { type PromiseWithResolvers, promiseWithResolvers } from '@aztec/foundati
5
5
  import { schemaHasMethod } from '@aztec/foundation/schemas';
6
6
  import type { FunctionsOf } from '@aztec/foundation/types';
7
7
 
8
- import type { WalletMessage, WalletResponse } from '../types.js';
8
+ import { type EncryptedPayload, decrypt, encrypt } from '../../crypto.js';
9
+ import { type WalletInfo, type WalletMessage, WalletMessageType, type WalletResponse } from '../../types.js';
9
10
 
10
11
  /**
11
- * Message payload for posting to extension
12
+ * Internal type representing a wallet method call before encryption.
13
+ * @internal
12
14
  */
13
15
  type WalletMethodCall = {
14
- /**
15
- * The wallet method name to invoke
16
- */
16
+ /** The wallet method name to invoke */
17
17
  type: keyof FunctionsOf<Wallet>;
18
- /**
19
- * Arguments to pass to the wallet method
20
- */
18
+ /** Arguments to pass to the wallet method */
21
19
  args: unknown[];
22
20
  };
23
21
 
22
+ /**
23
+ * Callback type for wallet disconnect events.
24
+ */
25
+ export type DisconnectCallback = () => void;
26
+
24
27
  /**
25
28
  * A wallet implementation that communicates with browser extension wallets
26
- * Supports multiple extensions by targeting specific extension IDs
29
+ * using a secure encrypted MessageChannel.
30
+ *
31
+ * This class uses a pre-established secure channel from the discovery phase:
32
+ *
33
+ * 1. **MessageChannel**: A private communication channel created during discovery,
34
+ * not visible to other scripts on the page (unlike window.postMessage).
35
+ *
36
+ * 2. **ECDH Key Exchange**: The shared secret was derived during discovery using
37
+ * Elliptic Curve Diffie-Hellman key exchange.
38
+ *
39
+ * 3. **AES-GCM Encryption**: All messages are encrypted using AES-256-GCM,
40
+ * providing both confidentiality and authenticity.
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * // Discovery returns wallets with secure channel components
45
+ * const wallets = await ExtensionProvider.discoverExtensions(chainInfo);
46
+ * const { info, port, sharedKey } = wallets[0];
47
+ *
48
+ * // User can verify emoji if desired
49
+ * console.log('Verify:', hashToEmoji(info.verificationHash!));
50
+ *
51
+ * // Create wallet using the discovered components
52
+ * const wallet = await ExtensionWallet.create(info, chainInfo, port, sharedKey, 'my-dapp');
53
+ *
54
+ * // All subsequent calls are encrypted
55
+ * const accounts = await wallet.getAccounts();
56
+ * ```
27
57
  */
28
58
  export class ExtensionWallet {
59
+ /** Map of pending requests awaiting responses, keyed by message ID */
29
60
  private inFlight = new Map<string, PromiseWithResolvers<unknown>>();
61
+ private disconnected = false;
62
+ private disconnectCallbacks: DisconnectCallback[] = [];
30
63
 
64
+ /**
65
+ * Private constructor - use {@link ExtensionWallet.create} to instantiate.
66
+ * @param chainInfo - The chain information (chainId and version)
67
+ * @param appId - Application identifier for the requesting dApp
68
+ * @param extensionId - The unique identifier of the target wallet extension
69
+ * @param port - The MessagePort for private communication with the wallet
70
+ * @param sharedKey - The derived AES-256-GCM shared key for encryption
71
+ */
31
72
  private constructor(
32
73
  private chainInfo: ChainInfo,
33
74
  private appId: string,
34
75
  private extensionId: string,
76
+ private port: MessagePort,
77
+ private sharedKey: CryptoKey,
35
78
  ) {}
36
79
 
80
+ /** Cached Wallet proxy instance */
81
+ private walletProxy: Wallet | null = null;
82
+
37
83
  /**
38
- * Creates an ExtensionWallet instance that proxies wallet calls to a browser extension
39
- * @param chainInfo - The chain information (chainId and version)
40
- * @param appId - Application identifier for the requesting dapp
41
- * @param extensionId - Specific extension ID to communicate with
42
- * @returns A Proxy object that implements the Wallet interface
84
+ * Creates an ExtensionWallet instance that communicates with a browser extension
85
+ * over a secure encrypted MessageChannel.
86
+ *
87
+ * @param walletInfo - The wallet info from ExtensionProvider.discoverExtensions()
88
+ * @param chainInfo - The chain information (chainId and version) for request context
89
+ * @param port - The MessagePort for private communication with the wallet
90
+ * @param sharedKey - The derived AES-256-GCM shared key for encryption
91
+ * @param appId - Application identifier used to identify the requesting dApp to the wallet
92
+ * @returns The ExtensionWallet instance. Use {@link getWallet} to get the Wallet interface.
93
+ *
94
+ * @example
95
+ * ```typescript
96
+ * const wallets = await ExtensionProvider.discoverExtensions(chainInfo);
97
+ * const { info, port, sharedKey } = wallets[0];
98
+ * const extensionWallet = ExtensionWallet.create(
99
+ * info,
100
+ * { chainId: Fr(31337), version: Fr(0) },
101
+ * port,
102
+ * sharedKey,
103
+ * 'my-defi-app'
104
+ * );
105
+ *
106
+ * // Register disconnect handler
107
+ * extensionWallet.onDisconnect(() => console.log('Disconnected!'));
108
+ *
109
+ * // Get the Wallet interface for dApp usage
110
+ * const wallet = extensionWallet.getWallet();
111
+ * const accounts = await wallet.getAccounts();
112
+ * ```
43
113
  */
44
- static create(chainInfo: ChainInfo, appId: string, extensionId: string): Wallet {
45
- const wallet = new ExtensionWallet(chainInfo, appId, extensionId);
114
+ static create(
115
+ walletInfo: WalletInfo,
116
+ chainInfo: ChainInfo,
117
+ port: MessagePort,
118
+ sharedKey: CryptoKey,
119
+ appId: string,
120
+ ): ExtensionWallet {
121
+ const wallet = new ExtensionWallet(chainInfo, appId, walletInfo.id, port, sharedKey);
46
122
 
47
- // Set up message listener for responses from extensions
48
- window.addEventListener('message', event => {
49
- if (event.source !== window) {
50
- return;
51
- }
123
+ // Set up message handler - all messages are now encrypted
124
+ wallet.port.onmessage = (event: MessageEvent<EncryptedPayload>) => {
125
+ void wallet.handleEncryptedResponse(event.data);
126
+ };
52
127
 
53
- let data: WalletResponse;
54
- try {
55
- data = JSON.parse(event.data);
56
- } catch {
57
- return;
58
- }
128
+ wallet.port.start();
129
+
130
+ return wallet;
131
+ }
132
+
133
+ /**
134
+ * Returns a Wallet interface that proxies all method calls through the secure channel.
135
+ *
136
+ * The returned Wallet can be used directly by dApps - all method calls are automatically
137
+ * encrypted and sent to the wallet extension.
138
+ *
139
+ * @returns A Wallet implementation that encrypts all communication
140
+ *
141
+ * @example
142
+ * ```typescript
143
+ * const extensionWallet = ExtensionWallet.create(info, chainInfo, port, sharedKey, 'my-app');
144
+ * const wallet = extensionWallet.getWallet();
145
+ * const accounts = await wallet.getAccounts();
146
+ * ```
147
+ */
148
+ getWallet(): Wallet {
149
+ if (this.walletProxy) {
150
+ return this.walletProxy;
151
+ }
59
152
 
60
- // Ignore request messages (only process responses)
61
- if ('type' in data) {
153
+ // Create a Proxy that intercepts wallet method calls and forwards them to the extension
154
+ this.walletProxy = new Proxy(this, {
155
+ get: (target, prop) => {
156
+ if (schemaHasMethod(WalletSchema, prop.toString())) {
157
+ return async (...args: unknown[]) => {
158
+ const result = await target.postMessage({
159
+ type: prop.toString() as keyof FunctionsOf<Wallet>,
160
+ args,
161
+ });
162
+ return WalletSchema[prop.toString() as keyof typeof WalletSchema].returnType().parseAsync(result);
163
+ };
164
+ } else {
165
+ return target[prop as keyof ExtensionWallet];
166
+ }
167
+ },
168
+ }) as unknown as Wallet;
169
+
170
+ return this.walletProxy;
171
+ }
172
+
173
+ /**
174
+ * Handles an encrypted response received from the wallet extension.
175
+ *
176
+ * Decrypts the response using the shared AES key and resolves or rejects
177
+ * the corresponding pending promise based on the response content.
178
+ *
179
+ * @param encrypted - The encrypted response from the wallet
180
+ */
181
+ private async handleEncryptedResponse(encrypted: EncryptedPayload): Promise<void> {
182
+ if (!this.sharedKey) {
183
+ return;
184
+ }
185
+
186
+ try {
187
+ const response = await decrypt<WalletResponse>(this.sharedKey, encrypted);
188
+
189
+ const { messageId, result, error, walletId: responseWalletId } = response;
190
+
191
+ // Check for disconnect notification from the wallet backend
192
+ // This is sent as an encrypted error response with a special type
193
+ if (
194
+ error &&
195
+ typeof error === 'object' &&
196
+ 'type' in error &&
197
+ (error.type as WalletMessageType) === WalletMessageType.SESSION_DISCONNECTED
198
+ ) {
199
+ this.handleDisconnect();
62
200
  return;
63
201
  }
64
202
 
65
- const { messageId, result, error, walletId: responseWalletId } = data;
66
-
67
203
  if (!messageId || !responseWalletId) {
68
204
  return;
69
205
  }
70
206
 
71
- if (wallet.extensionId !== responseWalletId) {
207
+ if (this.extensionId !== responseWalletId) {
72
208
  return;
73
209
  }
74
210
 
75
- if (!wallet.inFlight.has(messageId)) {
211
+ if (!this.inFlight.has(messageId)) {
76
212
  return;
77
213
  }
78
214
 
79
- const { resolve, reject } = wallet.inFlight.get(messageId)!;
215
+ const { resolve, reject } = this.inFlight.get(messageId)!;
80
216
 
81
217
  if (error) {
82
218
  reject(new Error(jsonStringify(error)));
83
219
  } else {
84
220
  resolve(result);
85
221
  }
86
- wallet.inFlight.delete(messageId);
87
- });
88
-
89
- // Create a Proxy that intercepts wallet method calls and forwards them to the extension
90
- return new Proxy(wallet, {
91
- get: (target, prop) => {
92
- if (schemaHasMethod(WalletSchema, prop.toString())) {
93
- return async (...args: unknown[]) => {
94
- const result = await target.postMessage({
95
- type: prop.toString() as keyof FunctionsOf<Wallet>,
96
- args,
97
- });
98
- return WalletSchema[prop.toString() as keyof typeof WalletSchema].returnType().parseAsync(result);
99
- };
100
- } else {
101
- return target[prop as keyof ExtensionWallet];
102
- }
103
- },
104
- }) as unknown as Wallet;
222
+ this.inFlight.delete(messageId);
223
+ // eslint-disable-next-line no-empty
224
+ } catch {}
105
225
  }
106
226
 
107
- private postMessage(call: WalletMethodCall): Promise<unknown> {
227
+ /**
228
+ * Sends an encrypted wallet method call over the secure MessageChannel.
229
+ *
230
+ * The message is encrypted using AES-256-GCM with the shared key derived
231
+ * during discovery. A unique message ID is generated to correlate
232
+ * the response.
233
+ *
234
+ * @param call - The wallet method call containing method name and arguments
235
+ * @returns A Promise that resolves with the decrypted result from the wallet
236
+ *
237
+ * @throws Error if the secure channel has not been established or wallet is disconnected
238
+ */
239
+ private async postMessage(call: WalletMethodCall): Promise<unknown> {
240
+ if (this.disconnected) {
241
+ throw new Error('Wallet has been disconnected');
242
+ }
243
+ if (!this.port || !this.sharedKey) {
244
+ throw new Error('Secure channel not established');
245
+ }
246
+
108
247
  const messageId = globalThis.crypto.randomUUID();
109
248
  const message: WalletMessage = {
110
249
  type: call.type,
@@ -115,10 +254,126 @@ export class ExtensionWallet {
115
254
  walletId: this.extensionId,
116
255
  };
117
256
 
118
- window.postMessage(jsonStringify(message), '*');
257
+ // Encrypt the message and send over the private MessageChannel
258
+ const encrypted = await encrypt(this.sharedKey, message);
259
+ this.port.postMessage(encrypted);
119
260
 
120
261
  const { promise, resolve, reject } = promiseWithResolvers<unknown>();
121
262
  this.inFlight.set(messageId, { promise, resolve, reject });
122
263
  return promise;
123
264
  }
265
+
266
+ /**
267
+ * Handles wallet disconnection.
268
+ * Rejects all pending requests and notifies registered callbacks.
269
+ * @internal
270
+ */
271
+ private handleDisconnect(): void {
272
+ if (this.disconnected) {
273
+ return;
274
+ }
275
+ this.disconnected = true;
276
+
277
+ // Close the port to prevent any further messages
278
+ if (this.port) {
279
+ this.port.onmessage = null;
280
+ this.port.close();
281
+ }
282
+
283
+ // Reject all pending requests
284
+ // Note: These rejections should be caught by the callers, but we log them
285
+ // here to help with debugging if they become unhandled
286
+ const error = new Error('Wallet disconnected');
287
+ for (const { reject } of this.inFlight.values()) {
288
+ reject(error);
289
+ }
290
+ this.inFlight.clear();
291
+
292
+ // Notify registered callbacks
293
+ for (const callback of this.disconnectCallbacks) {
294
+ try {
295
+ callback();
296
+ } catch {
297
+ // Ignore errors in callbacks
298
+ }
299
+ }
300
+ }
301
+
302
+ /**
303
+ * Registers a callback to be invoked when the wallet disconnects.
304
+ *
305
+ * @param callback - Function to call when wallet disconnects
306
+ * @returns A function to unregister the callback
307
+ *
308
+ * @example
309
+ * ```typescript
310
+ * const wallet = await ExtensionWallet.create(...);
311
+ * const unsubscribe = wallet.onDisconnect(() => {
312
+ * console.log('Wallet disconnected! Please reconnect.');
313
+ * // Clean up UI, prompt user to reconnect, etc.
314
+ * });
315
+ * // Later: unsubscribe(); to stop receiving notifications
316
+ * ```
317
+ */
318
+ onDisconnect(callback: DisconnectCallback): () => void {
319
+ this.disconnectCallbacks.push(callback);
320
+ return () => {
321
+ const index = this.disconnectCallbacks.indexOf(callback);
322
+ if (index !== -1) {
323
+ this.disconnectCallbacks.splice(index, 1);
324
+ }
325
+ };
326
+ }
327
+
328
+ /**
329
+ * Returns whether the wallet has been disconnected.
330
+ *
331
+ * @returns true if the wallet is no longer connected
332
+ */
333
+ isDisconnected(): boolean {
334
+ return this.disconnected;
335
+ }
336
+
337
+ /**
338
+ * Disconnects from the wallet and cleans up resources.
339
+ *
340
+ * This method notifies the wallet extension that the session is ending,
341
+ * allowing it to clean up its state. After calling this method, the wallet
342
+ * instance can no longer be used and any pending requests will be rejected.
343
+ *
344
+ * @example
345
+ * ```typescript
346
+ * const wallet = await provider.connect('my-app');
347
+ * // ... use wallet ...
348
+ * await wallet.disconnect(); // Clean disconnect when done
349
+ * ```
350
+ */
351
+ async disconnect(): Promise<void> {
352
+ if (this.disconnected) {
353
+ return;
354
+ }
355
+
356
+ // Send disconnect message to extension before closing
357
+ if (this.port && this.sharedKey) {
358
+ try {
359
+ const message = {
360
+ type: WalletMessageType.DISCONNECT,
361
+ messageId: globalThis.crypto.randomUUID(),
362
+ chainInfo: this.chainInfo,
363
+ appId: this.appId,
364
+ walletId: this.extensionId,
365
+ args: [],
366
+ };
367
+ const encrypted = await encrypt(this.sharedKey, message);
368
+ this.port.postMessage(encrypted);
369
+ } catch {
370
+ // Ignore errors sending disconnect message
371
+ }
372
+ }
373
+
374
+ this.handleDisconnect();
375
+ if (this.port) {
376
+ this.port.close();
377
+ }
378
+ }
124
379
  }
@@ -1,3 +1,5 @@
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';
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';
@@ -1,7 +1,24 @@
1
1
  import type { ChainInfo } from '@aztec/aztec.js/account';
2
2
 
3
+ import type { ExportedPublicKey } from './crypto.js';
4
+
5
+ /**
6
+ * Message types for wallet SDK communication.
7
+ * All types are prefixed with 'aztec-wallet-' for namespacing.
8
+ */
9
+ export enum WalletMessageType {
10
+ /** Discovery request to find installed wallets */
11
+ DISCOVERY = 'aztec-wallet-discovery',
12
+ /** Discovery response from a wallet */
13
+ DISCOVERY_RESPONSE = 'aztec-wallet-discovery-response',
14
+ /** Session disconnected notification (unencrypted control message) */
15
+ SESSION_DISCONNECTED = 'aztec-wallet-session-disconnected',
16
+ /** Explicit disconnect request from dApp */
17
+ DISCONNECT = 'aztec-wallet-disconnect',
18
+ }
19
+
3
20
  /**
4
- * Information about an installed Aztec wallet wallet
21
+ * Information about an installed Aztec wallet
5
22
  */
6
23
  export interface WalletInfo {
7
24
  /** Unique identifier for the wallet */
@@ -12,10 +29,18 @@ export interface WalletInfo {
12
29
  icon?: string;
13
30
  /** Wallet version */
14
31
  version: string;
32
+ /** Wallet's ECDH public key for secure channel establishment */
33
+ publicKey: ExportedPublicKey;
34
+ /**
35
+ * Hash of the shared secret for anti-MITM verification.
36
+ * Both dApp and wallet independently compute this from the ECDH shared secret.
37
+ * Use {@link hashToEmoji} to convert to a visual representation for user verification.
38
+ */
39
+ verificationHash?: string;
15
40
  }
16
41
 
17
42
  /**
18
- * Message format for wallet communication
43
+ * Message format for wallet communication (internal, before encryption)
19
44
  */
20
45
  export interface WalletMessage {
21
46
  /** Unique message ID for tracking responses */
@@ -47,23 +72,25 @@ export interface WalletResponse {
47
72
  }
48
73
 
49
74
  /**
50
- * Discovery message for finding installed wallets
75
+ * Discovery message for finding installed wallets (public, unencrypted)
51
76
  */
52
77
  export interface DiscoveryRequest {
53
78
  /** Message type for discovery */
54
- type: 'aztec-wallet-discovery';
79
+ type: WalletMessageType.DISCOVERY;
55
80
  /** Request ID */
56
81
  requestId: string;
57
82
  /** Chain information to check if wallet supports this network */
58
83
  chainInfo: ChainInfo;
84
+ /** dApp's ECDH public key for deriving shared secret */
85
+ publicKey: ExportedPublicKey;
59
86
  }
60
87
 
61
88
  /**
62
- * Discovery response from an wallet
89
+ * Discovery response from a wallet (public, unencrypted)
63
90
  */
64
91
  export interface DiscoveryResponse {
65
92
  /** Message type for discovery response */
66
- type: 'aztec-wallet-discovery-response';
93
+ type: WalletMessageType.DISCOVERY_RESPONSE;
67
94
  /** Request ID matching the discovery request */
68
95
  requestId: string;
69
96
  /** Wallet information */
@@ -1,67 +0,0 @@
1
- import type { ChainInfo } from '@aztec/aztec.js/account';
2
- /**
3
- * Information about an installed Aztec wallet wallet
4
- */
5
- export interface WalletInfo {
6
- /** Unique identifier for the wallet */
7
- id: string;
8
- /** Display name of the wallet */
9
- name: string;
10
- /** URL to the wallet's icon */
11
- icon?: string;
12
- /** Wallet version */
13
- version: string;
14
- }
15
- /**
16
- * Message format for wallet communication
17
- */
18
- export interface WalletMessage {
19
- /** Unique message ID for tracking responses */
20
- messageId: string;
21
- /** The wallet method to call */
22
- type: string;
23
- /** Arguments for the method */
24
- args: unknown[];
25
- /** Chain information */
26
- chainInfo: ChainInfo;
27
- /** Application ID making the request */
28
- appId: string;
29
- /** Wallet ID to target a specific wallet */
30
- walletId: string;
31
- }
32
- /**
33
- * Response message from wallet
34
- */
35
- export interface WalletResponse {
36
- /** Message ID matching the request */
37
- messageId: string;
38
- /** Result data (if successful) */
39
- result?: unknown;
40
- /** Error data (if failed) */
41
- error?: unknown;
42
- /** Wallet ID that sent the response */
43
- walletId: string;
44
- }
45
- /**
46
- * Discovery message for finding installed wallets
47
- */
48
- export interface DiscoveryRequest {
49
- /** Message type for discovery */
50
- type: 'aztec-wallet-discovery';
51
- /** Request ID */
52
- requestId: string;
53
- /** Chain information to check if wallet supports this network */
54
- chainInfo: ChainInfo;
55
- }
56
- /**
57
- * Discovery response from an wallet
58
- */
59
- export interface DiscoveryResponse {
60
- /** Message type for discovery response */
61
- type: 'aztec-wallet-discovery-response';
62
- /** Request ID matching the discovery request */
63
- requestId: string;
64
- /** Wallet information */
65
- walletInfo: WalletInfo;
66
- }
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm92aWRlcnMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFekQ7O0dBRUc7QUFDSCxNQUFNLFdBQVcsVUFBVTtJQUN6Qix1Q0FBdUM7SUFDdkMsRUFBRSxFQUFFLE1BQU0sQ0FBQztJQUNYLGlDQUFpQztJQUNqQyxJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQ2IsK0JBQStCO0lBQy9CLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNkLHFCQUFxQjtJQUNyQixPQUFPLEVBQUUsTUFBTSxDQUFDO0NBQ2pCO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFdBQVcsYUFBYTtJQUM1QiwrQ0FBK0M7SUFDL0MsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUNsQixnQ0FBZ0M7SUFDaEMsSUFBSSxFQUFFLE1BQU0sQ0FBQztJQUNiLCtCQUErQjtJQUMvQixJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDaEIsd0JBQXdCO0lBQ3hCLFNBQVMsRUFBRSxTQUFTLENBQUM7SUFDckIsd0NBQXdDO0lBQ3hDLEtBQUssRUFBRSxNQUFNLENBQUM7SUFDZCw0Q0FBNEM7SUFDNUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztDQUNsQjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxXQUFXLGNBQWM7SUFDN0Isc0NBQXNDO0lBQ3RDLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsa0NBQWtDO0lBQ2xDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUNqQiw2QkFBNkI7SUFDN0IsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDO0lBQ2hCLHVDQUF1QztJQUN2QyxRQUFRLEVBQUUsTUFBTSxDQUFDO0NBQ2xCO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFdBQVcsZ0JBQWdCO0lBQy9CLGlDQUFpQztJQUNqQyxJQUFJLEVBQUUsd0JBQXdCLENBQUM7SUFDL0IsaUJBQWlCO0lBQ2pCLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsaUVBQWlFO0lBQ2pFLFNBQVMsRUFBRSxTQUFTLENBQUM7Q0FDdEI7QUFFRDs7R0FFRztBQUNILE1BQU0sV0FBVyxpQkFBaUI7SUFDaEMsMENBQTBDO0lBQzFDLElBQUksRUFBRSxpQ0FBaUMsQ0FBQztJQUN4QyxnREFBZ0Q7SUFDaEQsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUNsQix5QkFBeUI7SUFDekIsVUFBVSxFQUFFLFVBQVUsQ0FBQztDQUN4QiJ9
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD;;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;CACjB;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,wBAAwB,CAAC;IAC/B,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,SAAS,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,IAAI,EAAE,iCAAiC,CAAC;IACxC,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,UAAU,EAAE,UAAU,CAAC;CACxB"}
@@ -1,3 +0,0 @@
1
- /**
2
- * Discovery response from an wallet
3
- */ export { };