@aztec/wallet-sdk 0.0.1-commit.d1f2d6c → 0.0.1-commit.d431d1c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +294 -217
- package/dest/base-wallet/base_wallet.d.ts +4 -4
- package/dest/base-wallet/base_wallet.d.ts.map +1 -1
- package/dest/base-wallet/base_wallet.js +4 -9
- package/dest/crypto.d.ts +50 -59
- package/dest/crypto.d.ts.map +1 -1
- package/dest/crypto.js +108 -202
- package/dest/manager/index.d.ts +8 -2
- package/dest/manager/index.d.ts.map +1 -1
- package/dest/manager/index.js +6 -0
- package/dest/manager/types.d.ts +6 -88
- package/dest/manager/types.d.ts.map +1 -1
- package/dest/manager/types.js +1 -17
- package/dest/manager/wallet_manager.d.ts +7 -50
- package/dest/manager/wallet_manager.d.ts.map +1 -1
- package/dest/manager/wallet_manager.js +44 -174
- package/dest/providers/extension/extension_provider.d.ts +63 -0
- package/dest/providers/extension/extension_provider.d.ts.map +1 -0
- package/dest/providers/extension/extension_provider.js +124 -0
- package/dest/providers/extension/extension_wallet.d.ts +155 -0
- package/dest/providers/extension/extension_wallet.d.ts.map +1 -0
- package/dest/{extension/provider → providers/extension}/extension_wallet.js +95 -48
- package/dest/providers/extension/index.d.ts +6 -0
- package/dest/providers/extension/index.d.ts.map +1 -0
- package/dest/{extension/provider → providers/extension}/index.js +2 -0
- package/dest/types.d.ts +12 -43
- package/dest/types.d.ts.map +1 -1
- package/dest/types.js +2 -3
- package/package.json +9 -10
- package/src/base-wallet/base_wallet.ts +8 -15
- package/src/crypto.ts +113 -237
- package/src/manager/index.ts +10 -2
- package/src/manager/types.ts +5 -91
- package/src/manager/wallet_manager.ts +46 -192
- package/src/providers/extension/extension_provider.ts +167 -0
- package/src/{extension/provider → providers/extension}/extension_wallet.ts +110 -52
- package/src/providers/extension/index.ts +5 -0
- package/src/types.ts +10 -44
- package/dest/emoji_alphabet.d.ts +0 -35
- package/dest/emoji_alphabet.d.ts.map +0 -1
- package/dest/emoji_alphabet.js +0 -299
- package/dest/extension/handlers/background_connection_handler.d.ts +0 -158
- package/dest/extension/handlers/background_connection_handler.d.ts.map +0 -1
- package/dest/extension/handlers/background_connection_handler.js +0 -258
- package/dest/extension/handlers/content_script_connection_handler.d.ts +0 -56
- package/dest/extension/handlers/content_script_connection_handler.d.ts.map +0 -1
- package/dest/extension/handlers/content_script_connection_handler.js +0 -174
- package/dest/extension/handlers/index.d.ts +0 -12
- package/dest/extension/handlers/index.d.ts.map +0 -1
- package/dest/extension/handlers/index.js +0 -10
- package/dest/extension/handlers/internal_message_types.d.ts +0 -63
- package/dest/extension/handlers/internal_message_types.d.ts.map +0 -1
- package/dest/extension/handlers/internal_message_types.js +0 -22
- package/dest/extension/provider/extension_provider.d.ts +0 -107
- package/dest/extension/provider/extension_provider.d.ts.map +0 -1
- package/dest/extension/provider/extension_provider.js +0 -160
- package/dest/extension/provider/extension_wallet.d.ts +0 -131
- package/dest/extension/provider/extension_wallet.d.ts.map +0 -1
- package/dest/extension/provider/index.d.ts +0 -3
- package/dest/extension/provider/index.d.ts.map +0 -1
- package/src/emoji_alphabet.ts +0 -317
- package/src/extension/handlers/background_connection_handler.ts +0 -423
- package/src/extension/handlers/content_script_connection_handler.ts +0 -246
- package/src/extension/handlers/index.ts +0 -25
- package/src/extension/handlers/internal_message_types.ts +0 -69
- package/src/extension/provider/extension_provider.ts +0 -233
- package/src/extension/provider/index.ts +0 -7
|
@@ -1,48 +1,14 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
3
|
-
|
|
4
|
-
import { type DiscoveredWallet, ExtensionProvider, ExtensionWallet } from '../extension/provider/index.js';
|
|
5
|
-
import { WalletMessageType } from '../types.js';
|
|
1
|
+
import { ExtensionProvider, ExtensionWallet } from '../providers/extension/index.js';
|
|
6
2
|
import type {
|
|
7
3
|
DiscoverWalletsOptions,
|
|
8
|
-
DiscoverySession,
|
|
9
4
|
ExtensionWalletConfig,
|
|
10
|
-
PendingConnection,
|
|
11
5
|
ProviderDisconnectionCallback,
|
|
12
6
|
WalletManagerConfig,
|
|
13
7
|
WalletProvider,
|
|
14
8
|
} from './types.js';
|
|
15
9
|
|
|
16
10
|
/**
|
|
17
|
-
* Manager for wallet discovery, configuration, and connection
|
|
18
|
-
*
|
|
19
|
-
* This is the main entry point for dApps to discover and connect to wallets.
|
|
20
|
-
*
|
|
21
|
-
* @example Basic usage with async iterator
|
|
22
|
-
* ```typescript
|
|
23
|
-
* const discovery = WalletManager.configure({ extensions: { enabled: true } })
|
|
24
|
-
* .getAvailableWallets({ chainInfo, appId: 'my-app' });
|
|
25
|
-
*
|
|
26
|
-
* // Iterate over discovered wallets
|
|
27
|
-
* for await (const provider of discovery.wallets) {
|
|
28
|
-
* console.log(`Found wallet: ${provider.name}`);
|
|
29
|
-
* }
|
|
30
|
-
*
|
|
31
|
-
* // Or cancel early when done
|
|
32
|
-
* discovery.cancel();
|
|
33
|
-
* ```
|
|
34
|
-
*
|
|
35
|
-
* @example With callback for discovered wallets
|
|
36
|
-
* ```typescript
|
|
37
|
-
* const discovery = manager.getAvailableWallets({
|
|
38
|
-
* chainInfo,
|
|
39
|
-
* appId: 'my-app',
|
|
40
|
-
* onWalletDiscovered: (provider) => console.log(`Found: ${provider.name}`),
|
|
41
|
-
* });
|
|
42
|
-
*
|
|
43
|
-
* // Wait for discovery to complete or cancel it
|
|
44
|
-
* await discovery.done;
|
|
45
|
-
* ```
|
|
11
|
+
* Manager for wallet discovery, configuration, and connection
|
|
46
12
|
*/
|
|
47
13
|
export class WalletManager {
|
|
48
14
|
private config: WalletManagerConfig = {
|
|
@@ -67,177 +33,65 @@ export class WalletManager {
|
|
|
67
33
|
|
|
68
34
|
/**
|
|
69
35
|
* Discovers all available wallets for a given chain and version.
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* - `done`: Promise that resolves when discovery completes or is cancelled
|
|
74
|
-
* - `cancel()`: Function to stop discovery immediately
|
|
75
|
-
*
|
|
76
|
-
* If `onWalletDiscovered` callback is provided, wallets are also streamed via callback.
|
|
77
|
-
*
|
|
78
|
-
* @param options - Discovery options including chain info, appId, and timeout
|
|
79
|
-
* @returns A cancellable discovery session
|
|
36
|
+
* Only returns wallets that support the requested chain and version.
|
|
37
|
+
* @param options - Discovery options including chain info and timeout
|
|
38
|
+
* @returns Array of wallet providers with baked-in chain info
|
|
80
39
|
*/
|
|
81
|
-
getAvailableWallets(options: DiscoverWalletsOptions):
|
|
82
|
-
const
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
const pendingProviders: WalletProvider[] = [];
|
|
86
|
-
let pendingResolve: ((result: IteratorResult<WalletProvider>) => void) | null = null;
|
|
87
|
-
let completed = false;
|
|
88
|
-
|
|
89
|
-
const { promise: donePromise, resolve: resolveDone } = promiseWithResolvers<void>();
|
|
90
|
-
|
|
91
|
-
const markComplete = () => {
|
|
92
|
-
completed = true;
|
|
93
|
-
resolveDone();
|
|
94
|
-
if (pendingResolve) {
|
|
95
|
-
const resolve = pendingResolve;
|
|
96
|
-
pendingResolve = null;
|
|
97
|
-
resolve({ value: undefined, done: true });
|
|
98
|
-
}
|
|
99
|
-
};
|
|
40
|
+
async getAvailableWallets(options: DiscoverWalletsOptions): Promise<WalletProvider[]> {
|
|
41
|
+
const providers: WalletProvider[] = [];
|
|
42
|
+
const { chainInfo } = options;
|
|
100
43
|
|
|
101
44
|
if (this.config.extensions?.enabled) {
|
|
45
|
+
const discoveredWallets = await ExtensionProvider.discoverExtensions(chainInfo, options.timeout);
|
|
102
46
|
const extensionConfig = this.config.extensions;
|
|
103
47
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
onWalletDiscovered: discoveredWallet => {
|
|
109
|
-
const provider = this.createProviderFromDiscoveredWallet(discoveredWallet, chainInfo, extensionConfig);
|
|
110
|
-
if (!provider) {
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// Call user's callback if provided
|
|
115
|
-
options.onWalletDiscovered?.(provider);
|
|
48
|
+
for (const { info, port, sharedKey } of discoveredWallets) {
|
|
49
|
+
if (!this.isExtensionAllowed(info.id, extensionConfig)) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
116
52
|
|
|
117
|
-
|
|
118
|
-
if (pendingResolve) {
|
|
119
|
-
const resolve = pendingResolve;
|
|
120
|
-
pendingResolve = null;
|
|
121
|
-
resolve({ value: provider, done: false });
|
|
122
|
-
} else {
|
|
123
|
-
pendingProviders.push(provider);
|
|
124
|
-
}
|
|
125
|
-
},
|
|
126
|
-
}).then(markComplete);
|
|
127
|
-
} else {
|
|
128
|
-
markComplete();
|
|
129
|
-
}
|
|
53
|
+
let extensionWallet: ExtensionWallet | null = null;
|
|
130
54
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
55
|
+
const provider: WalletProvider = {
|
|
56
|
+
id: info.id,
|
|
57
|
+
type: 'extension',
|
|
58
|
+
name: info.name,
|
|
59
|
+
icon: info.icon,
|
|
60
|
+
metadata: {
|
|
61
|
+
version: info.version,
|
|
62
|
+
verificationHash: info.verificationHash,
|
|
63
|
+
},
|
|
64
|
+
connect: (appId: string) => {
|
|
65
|
+
extensionWallet = ExtensionWallet.create(info, chainInfo, port, sharedKey, appId);
|
|
66
|
+
return Promise.resolve(extensionWallet.getWallet());
|
|
67
|
+
},
|
|
68
|
+
disconnect: async () => {
|
|
69
|
+
if (extensionWallet) {
|
|
70
|
+
await extensionWallet.disconnect();
|
|
71
|
+
extensionWallet = null;
|
|
139
72
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
73
|
+
},
|
|
74
|
+
onDisconnect: (callback: ProviderDisconnectionCallback) => {
|
|
75
|
+
if (extensionWallet) {
|
|
76
|
+
return extensionWallet.onDisconnect(callback);
|
|
143
77
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
78
|
+
return () => {};
|
|
79
|
+
},
|
|
80
|
+
isDisconnected: () => {
|
|
81
|
+
if (extensionWallet) {
|
|
82
|
+
return extensionWallet.isDisconnected();
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
148
85
|
},
|
|
149
86
|
};
|
|
150
|
-
},
|
|
151
|
-
};
|
|
152
87
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
done: donePromise,
|
|
156
|
-
cancel: () => abortController.abort(),
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Creates a WalletProvider from a discovered wallet.
|
|
162
|
-
* Returns null if the wallet is not allowed by config.
|
|
163
|
-
* @param discoveredWallet - The discovered wallet from extension discovery.
|
|
164
|
-
* @param chainInfo - Network information.
|
|
165
|
-
* @param extensionConfig - Extension wallet configuration.
|
|
166
|
-
*/
|
|
167
|
-
private createProviderFromDiscoveredWallet(
|
|
168
|
-
discoveredWallet: DiscoveredWallet,
|
|
169
|
-
chainInfo: ChainInfo,
|
|
170
|
-
extensionConfig: ExtensionWalletConfig,
|
|
171
|
-
): WalletProvider | null {
|
|
172
|
-
const { info } = discoveredWallet;
|
|
173
|
-
|
|
174
|
-
if (!this.isExtensionAllowed(info.id, extensionConfig)) {
|
|
175
|
-
return null;
|
|
88
|
+
providers.push(provider);
|
|
89
|
+
}
|
|
176
90
|
}
|
|
177
91
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
const provider: WalletProvider = {
|
|
181
|
-
id: info.id,
|
|
182
|
-
type: 'extension',
|
|
183
|
-
name: info.name,
|
|
184
|
-
icon: info.icon,
|
|
185
|
-
metadata: {
|
|
186
|
-
version: info.version,
|
|
187
|
-
},
|
|
188
|
-
establishSecureChannel: async (connectAppId: string): Promise<PendingConnection> => {
|
|
189
|
-
const connection = await discoveredWallet.establishSecureChannel();
|
|
190
|
-
|
|
191
|
-
provider.metadata = {
|
|
192
|
-
...provider.metadata,
|
|
193
|
-
verificationHash: connection.info.verificationHash,
|
|
194
|
-
};
|
|
195
|
-
|
|
196
|
-
return {
|
|
197
|
-
verificationHash: connection.info.verificationHash!,
|
|
198
|
-
confirm: () => {
|
|
199
|
-
return Promise.resolve(
|
|
200
|
-
ExtensionWallet.create(
|
|
201
|
-
connection.info.id,
|
|
202
|
-
connection.port,
|
|
203
|
-
connection.sharedKey,
|
|
204
|
-
chainInfo,
|
|
205
|
-
connectAppId,
|
|
206
|
-
),
|
|
207
|
-
);
|
|
208
|
-
},
|
|
209
|
-
cancel: () => {
|
|
210
|
-
// Send disconnect to terminate the session on the extension side
|
|
211
|
-
// but keep the port open so we can retry key exchange
|
|
212
|
-
connection.port.postMessage({
|
|
213
|
-
type: WalletMessageType.DISCONNECT,
|
|
214
|
-
requestId: discoveredWallet.requestId,
|
|
215
|
-
});
|
|
216
|
-
// Don't close the port - allow retry with fresh key exchange
|
|
217
|
-
},
|
|
218
|
-
};
|
|
219
|
-
},
|
|
220
|
-
disconnect: async () => {
|
|
221
|
-
if (extensionWallet) {
|
|
222
|
-
await extensionWallet.disconnect();
|
|
223
|
-
extensionWallet = null;
|
|
224
|
-
}
|
|
225
|
-
},
|
|
226
|
-
onDisconnect: (callback: ProviderDisconnectionCallback) => {
|
|
227
|
-
if (extensionWallet) {
|
|
228
|
-
return extensionWallet.onDisconnect(callback);
|
|
229
|
-
}
|
|
230
|
-
return () => {};
|
|
231
|
-
},
|
|
232
|
-
isDisconnected: () => {
|
|
233
|
-
if (extensionWallet) {
|
|
234
|
-
return extensionWallet.isDisconnected();
|
|
235
|
-
}
|
|
236
|
-
return true;
|
|
237
|
-
},
|
|
238
|
-
};
|
|
92
|
+
// TODO: Add web wallet discovery when implemented
|
|
239
93
|
|
|
240
|
-
return
|
|
94
|
+
return providers;
|
|
241
95
|
}
|
|
242
96
|
|
|
243
97
|
/**
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import type { ChainInfo } from '@aztec/aztec.js/account';
|
|
2
|
+
import { jsonStringify } from '@aztec/foundation/json-rpc';
|
|
3
|
+
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
4
|
+
|
|
5
|
+
import { deriveSharedKey, exportPublicKey, generateKeyPair, hashSharedSecret, importPublicKey } from '../../crypto.js';
|
|
6
|
+
import { type DiscoveryRequest, type DiscoveryResponse, type WalletInfo, WalletMessageType } from '../../types.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A discovered wallet with its secure channel components.
|
|
10
|
+
* Returned by {@link ExtensionProvider.discoverExtensions}.
|
|
11
|
+
*/
|
|
12
|
+
export interface DiscoveredWallet {
|
|
13
|
+
/** Basic wallet information (id, name, icon, version, publicKey, verificationHash) */
|
|
14
|
+
info: WalletInfo;
|
|
15
|
+
/** The MessagePort for private communication with the wallet */
|
|
16
|
+
port: MessagePort;
|
|
17
|
+
/** The derived AES-256-GCM shared key for encryption */
|
|
18
|
+
sharedKey: CryptoKey;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Internal type for discovery response with MessagePort
|
|
23
|
+
* @internal
|
|
24
|
+
*/
|
|
25
|
+
interface DiscoveryResponseWithPort extends DiscoveryResponse {
|
|
26
|
+
/** The MessagePort transferred from the wallet */
|
|
27
|
+
port?: MessagePort;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Provider for discovering Aztec wallet extensions.
|
|
32
|
+
*
|
|
33
|
+
* This class handles the discovery phase of wallet communication:
|
|
34
|
+
* 1. Broadcasts a discovery request with the dApp's public key
|
|
35
|
+
* 2. Receives responses from installed wallets with their public keys
|
|
36
|
+
* 3. Derives shared secrets and computes verification hashes
|
|
37
|
+
* 4. Returns discovered wallets with their secure channel components
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* const wallets = await ExtensionProvider.discoverExtensions(chainInfo);
|
|
42
|
+
* // Display wallets to user with optional emoji verification
|
|
43
|
+
* for (const wallet of wallets) {
|
|
44
|
+
* const emoji = hashToEmoji(wallet.info.verificationHash!);
|
|
45
|
+
* console.log(`${wallet.info.name}: ${emoji}`);
|
|
46
|
+
* }
|
|
47
|
+
* // User selects a wallet after verifying
|
|
48
|
+
* const wallet = await ExtensionWallet.create(wallets[0], chainInfo, 'my-app');
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export class ExtensionProvider {
|
|
52
|
+
private static discoveryInProgress = false;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Discovers all installed Aztec wallet extensions and establishes secure channel components.
|
|
56
|
+
*
|
|
57
|
+
* This method:
|
|
58
|
+
* 1. Generates an ECDH key pair for this discovery session
|
|
59
|
+
* 2. Broadcasts a discovery request with the dApp's public key
|
|
60
|
+
* 3. Receives responses from wallets with their public keys and MessagePorts
|
|
61
|
+
* 4. Derives shared secrets and computes verification hashes
|
|
62
|
+
*
|
|
63
|
+
* @param chainInfo - Chain information to check if extensions support this network
|
|
64
|
+
* @param timeout - How long to wait for extensions to respond (ms)
|
|
65
|
+
* @returns Array of discovered wallets with their secure channel components
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* const wallets = await ExtensionProvider.discoverExtensions({
|
|
70
|
+
* chainId: Fr(31337),
|
|
71
|
+
* version: Fr(0)
|
|
72
|
+
* });
|
|
73
|
+
* // Access wallet info and secure channel
|
|
74
|
+
* const { info, port, sharedKey } = wallets[0];
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
static async discoverExtensions(chainInfo: ChainInfo, timeout: number = 1000): Promise<DiscoveredWallet[]> {
|
|
78
|
+
// If discovery is already in progress, wait and return empty
|
|
79
|
+
// (caller should retry or handle appropriately)
|
|
80
|
+
if (this.discoveryInProgress) {
|
|
81
|
+
await new Promise(resolve => setTimeout(resolve, timeout));
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
this.discoveryInProgress = true;
|
|
86
|
+
|
|
87
|
+
// Generate key pair for this discovery session
|
|
88
|
+
const keyPair = await generateKeyPair();
|
|
89
|
+
const exportedPublicKey = await exportPublicKey(keyPair.publicKey);
|
|
90
|
+
|
|
91
|
+
const { promise, resolve } = promiseWithResolvers<DiscoveredWallet[]>();
|
|
92
|
+
const requestId = globalThis.crypto.randomUUID();
|
|
93
|
+
const responses: DiscoveredWallet[] = [];
|
|
94
|
+
|
|
95
|
+
// Set up listener for discovery responses
|
|
96
|
+
const handleMessage = (event: MessageEvent) => {
|
|
97
|
+
if (event.source !== window) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
let data: DiscoveryResponseWithPort;
|
|
102
|
+
try {
|
|
103
|
+
data = JSON.parse(event.data);
|
|
104
|
+
} catch {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (data.type === WalletMessageType.DISCOVERY_RESPONSE && data.requestId === requestId) {
|
|
109
|
+
// Get the MessagePort from the event
|
|
110
|
+
const port = event.ports?.[0];
|
|
111
|
+
if (!port) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Derive shared key from wallet's public key
|
|
116
|
+
const walletPublicKey = data.walletInfo.publicKey;
|
|
117
|
+
if (!walletPublicKey) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
void (async () => {
|
|
122
|
+
try {
|
|
123
|
+
const importedWalletKey = await importPublicKey(walletPublicKey);
|
|
124
|
+
const sharedKey = await deriveSharedKey(keyPair.privateKey, importedWalletKey);
|
|
125
|
+
|
|
126
|
+
// Compute verification hash
|
|
127
|
+
const verificationHash = await hashSharedSecret(sharedKey);
|
|
128
|
+
|
|
129
|
+
// Create wallet info with verification hash
|
|
130
|
+
const walletInfo: WalletInfo = {
|
|
131
|
+
...data.walletInfo,
|
|
132
|
+
verificationHash,
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
responses.push({
|
|
136
|
+
info: walletInfo,
|
|
137
|
+
port,
|
|
138
|
+
sharedKey,
|
|
139
|
+
});
|
|
140
|
+
} catch {
|
|
141
|
+
// Failed to derive key, skip this wallet
|
|
142
|
+
}
|
|
143
|
+
})();
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
window.addEventListener('message', handleMessage);
|
|
148
|
+
|
|
149
|
+
// Send discovery message with our public key
|
|
150
|
+
const discoveryMessage: DiscoveryRequest = {
|
|
151
|
+
type: WalletMessageType.DISCOVERY,
|
|
152
|
+
requestId,
|
|
153
|
+
chainInfo,
|
|
154
|
+
publicKey: exportedPublicKey,
|
|
155
|
+
};
|
|
156
|
+
window.postMessage(jsonStringify(discoveryMessage), '*');
|
|
157
|
+
|
|
158
|
+
// Wait for responses
|
|
159
|
+
setTimeout(() => {
|
|
160
|
+
window.removeEventListener('message', handleMessage);
|
|
161
|
+
this.discoveryInProgress = false;
|
|
162
|
+
resolve(responses);
|
|
163
|
+
}, timeout);
|
|
164
|
+
|
|
165
|
+
return promise;
|
|
166
|
+
}
|
|
167
|
+
}
|