@llayer-network/wallet-standard-wallet-adapter-base 1.1.4
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/LICENSE +202 -0
- package/README.md +0 -0
- package/lib/cjs/adapter.js +440 -0
- package/lib/cjs/adapter.js.map +1 -0
- package/lib/cjs/index.js +20 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/package.json +1 -0
- package/lib/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/lib/cjs/types.js +11 -0
- package/lib/cjs/types.js.map +1 -0
- package/lib/cjs/wallet.js +368 -0
- package/lib/cjs/wallet.js.map +1 -0
- package/lib/esm/adapter.js +397 -0
- package/lib/esm/adapter.js.map +1 -0
- package/lib/esm/index.js +4 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/lib/esm/types.js +8 -0
- package/lib/esm/types.js.map +1 -0
- package/lib/esm/wallet.js +349 -0
- package/lib/esm/wallet.js.map +1 -0
- package/lib/types/adapter.d.ts +32 -0
- package/lib/types/adapter.d.ts.map +1 -0
- package/lib/types/index.d.ts +4 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/types.d.ts +20 -0
- package/lib/types/types.d.ts.map +1 -0
- package/lib/types/wallet.d.ts +32 -0
- package/lib/types/wallet.d.ts.map +1 -0
- package/package.json +51 -0
- package/src/adapter.ts +479 -0
- package/src/index.ts +3 -0
- package/src/types.ts +26 -0
- package/src/wallet.ts +457 -0
package/src/wallet.ts
ADDED
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
import { type Adapter, isVersionedTransaction, WalletReadyState } from '@solana/wallet-adapter-base';
|
|
2
|
+
import { isSolanaChain, type SolanaChain } from '@llayer-network/wallet-standard-chains';
|
|
3
|
+
import {
|
|
4
|
+
SolanaSignAndSendTransaction,
|
|
5
|
+
type SolanaSignAndSendTransactionFeature,
|
|
6
|
+
type SolanaSignAndSendTransactionMethod,
|
|
7
|
+
type SolanaSignAndSendTransactionOutput,
|
|
8
|
+
SolanaSignIn,
|
|
9
|
+
type SolanaSignInFeature,
|
|
10
|
+
type SolanaSignInMethod,
|
|
11
|
+
type SolanaSignInOutput,
|
|
12
|
+
SolanaSignMessage,
|
|
13
|
+
type SolanaSignMessageFeature,
|
|
14
|
+
type SolanaSignMessageMethod,
|
|
15
|
+
type SolanaSignMessageOutput,
|
|
16
|
+
SolanaSignTransaction,
|
|
17
|
+
type SolanaSignTransactionFeature,
|
|
18
|
+
type SolanaSignTransactionMethod,
|
|
19
|
+
type SolanaSignTransactionOutput,
|
|
20
|
+
type SolanaTransactionVersion,
|
|
21
|
+
} from '@llayer-network/wallet-standard-features';
|
|
22
|
+
import { getEndpointForChain } from '@llayer-network/wallet-standard-util';
|
|
23
|
+
import { Connection, Transaction, VersionedTransaction } from '@solana/web3.js';
|
|
24
|
+
import { getWallets } from '@llayer-wallet-standard/app';
|
|
25
|
+
import type { Wallet, WalletIcon } from '@llayer-wallet-standard/base';
|
|
26
|
+
import {
|
|
27
|
+
StandardConnect,
|
|
28
|
+
type StandardConnectFeature,
|
|
29
|
+
type StandardConnectMethod,
|
|
30
|
+
StandardDisconnect,
|
|
31
|
+
type StandardDisconnectFeature,
|
|
32
|
+
type StandardDisconnectMethod,
|
|
33
|
+
StandardEvents,
|
|
34
|
+
type StandardEventsFeature,
|
|
35
|
+
type StandardEventsListeners,
|
|
36
|
+
type StandardEventsNames,
|
|
37
|
+
type StandardEventsOnMethod,
|
|
38
|
+
} from '@llayer-wallet-standard/features';
|
|
39
|
+
import { arraysEqual, bytesEqual, ReadonlyWalletAccount } from '@llayer-wallet-standard/wallet';
|
|
40
|
+
import bs58 from 'bs58';
|
|
41
|
+
|
|
42
|
+
/** TODO: docs */
|
|
43
|
+
export class SolanaWalletAdapterWalletAccount extends ReadonlyWalletAccount {
|
|
44
|
+
// eslint-disable-next-line no-unused-private-class-members
|
|
45
|
+
readonly #adapter: Adapter;
|
|
46
|
+
|
|
47
|
+
constructor({
|
|
48
|
+
adapter,
|
|
49
|
+
address,
|
|
50
|
+
publicKey,
|
|
51
|
+
chains,
|
|
52
|
+
}: {
|
|
53
|
+
adapter: Adapter;
|
|
54
|
+
address: string;
|
|
55
|
+
publicKey: Uint8Array;
|
|
56
|
+
chains: readonly SolanaChain[];
|
|
57
|
+
}) {
|
|
58
|
+
const features: (keyof (SolanaSignAndSendTransactionFeature &
|
|
59
|
+
SolanaSignTransactionFeature &
|
|
60
|
+
SolanaSignMessageFeature &
|
|
61
|
+
SolanaSignInFeature))[] = [SolanaSignAndSendTransaction];
|
|
62
|
+
if ('signTransaction' in adapter) {
|
|
63
|
+
features.push(SolanaSignTransaction);
|
|
64
|
+
}
|
|
65
|
+
if ('signMessage' in adapter) {
|
|
66
|
+
features.push(SolanaSignMessage);
|
|
67
|
+
}
|
|
68
|
+
if ('signIn' in adapter) {
|
|
69
|
+
features.push(SolanaSignIn);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
super({ address, publicKey, chains, features });
|
|
73
|
+
if (new.target === SolanaWalletAdapterWalletAccount) {
|
|
74
|
+
Object.freeze(this);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
this.#adapter = adapter;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** TODO: docs */
|
|
82
|
+
export class SolanaWalletAdapterWallet implements Wallet {
|
|
83
|
+
readonly #listeners: {
|
|
84
|
+
[E in StandardEventsNames]?: StandardEventsListeners[E][];
|
|
85
|
+
} = {};
|
|
86
|
+
readonly #adapter: Adapter;
|
|
87
|
+
readonly #supportedTransactionVersions: readonly SolanaTransactionVersion[];
|
|
88
|
+
readonly #chain: SolanaChain;
|
|
89
|
+
readonly #endpoint: string | undefined;
|
|
90
|
+
#account: SolanaWalletAdapterWalletAccount | undefined;
|
|
91
|
+
|
|
92
|
+
get version() {
|
|
93
|
+
return '1.0.0' as const;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
get name() {
|
|
97
|
+
return this.#adapter.name;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
get icon() {
|
|
101
|
+
return this.#adapter.icon as WalletIcon;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
get chains() {
|
|
105
|
+
return [this.#chain];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
get features(): StandardConnectFeature &
|
|
109
|
+
StandardDisconnectFeature &
|
|
110
|
+
StandardEventsFeature &
|
|
111
|
+
SolanaSignAndSendTransactionFeature &
|
|
112
|
+
Partial<SolanaSignTransactionFeature & SolanaSignMessageFeature & SolanaSignInFeature> {
|
|
113
|
+
const features: StandardConnectFeature &
|
|
114
|
+
StandardDisconnectFeature &
|
|
115
|
+
StandardEventsFeature &
|
|
116
|
+
SolanaSignAndSendTransactionFeature = {
|
|
117
|
+
[StandardConnect]: {
|
|
118
|
+
version: '1.0.0',
|
|
119
|
+
connect: this.#connect,
|
|
120
|
+
},
|
|
121
|
+
[StandardDisconnect]: {
|
|
122
|
+
version: '1.0.0',
|
|
123
|
+
disconnect: this.#disconnect,
|
|
124
|
+
},
|
|
125
|
+
[StandardEvents]: {
|
|
126
|
+
version: '1.0.0',
|
|
127
|
+
on: this.#on,
|
|
128
|
+
},
|
|
129
|
+
[SolanaSignAndSendTransaction]: {
|
|
130
|
+
version: '1.0.0',
|
|
131
|
+
supportedTransactionVersions: this.#supportedTransactionVersions,
|
|
132
|
+
signAndSendTransaction: this.#signAndSendTransaction,
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
let signTransactionFeature: SolanaSignTransactionFeature | undefined;
|
|
137
|
+
if ('signTransaction' in this.#adapter) {
|
|
138
|
+
signTransactionFeature = {
|
|
139
|
+
[SolanaSignTransaction]: {
|
|
140
|
+
version: '1.0.0',
|
|
141
|
+
supportedTransactionVersions: this.#supportedTransactionVersions,
|
|
142
|
+
signTransaction: this.#signTransaction,
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
let signMessageFeature: SolanaSignMessageFeature | undefined;
|
|
148
|
+
if ('signMessage' in this.#adapter) {
|
|
149
|
+
signMessageFeature = {
|
|
150
|
+
[SolanaSignMessage]: {
|
|
151
|
+
version: '1.0.0',
|
|
152
|
+
signMessage: this.#signMessage,
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
let signInFeature: SolanaSignInFeature | undefined;
|
|
158
|
+
if ('signIn' in this.#adapter) {
|
|
159
|
+
signInFeature = {
|
|
160
|
+
[SolanaSignIn]: {
|
|
161
|
+
version: '1.0.0',
|
|
162
|
+
signIn: this.#signIn,
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return { ...features, ...signTransactionFeature, ...signMessageFeature };
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
get accounts() {
|
|
171
|
+
return this.#account ? [this.#account] : [];
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
get endpoint() {
|
|
175
|
+
return this.#endpoint;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
constructor(adapter: Adapter, chain: SolanaChain, endpoint?: string) {
|
|
179
|
+
if (new.target === SolanaWalletAdapterWallet) {
|
|
180
|
+
Object.freeze(this);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const supportedTransactionVersions = [...(adapter.supportedTransactionVersions || ['legacy'])];
|
|
184
|
+
if (!supportedTransactionVersions.length) {
|
|
185
|
+
supportedTransactionVersions.push('legacy');
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
this.#adapter = adapter;
|
|
189
|
+
this.#supportedTransactionVersions = supportedTransactionVersions;
|
|
190
|
+
this.#chain = chain;
|
|
191
|
+
this.#endpoint = endpoint;
|
|
192
|
+
|
|
193
|
+
adapter.on('connect', this.#connected, this);
|
|
194
|
+
adapter.on('disconnect', this.#disconnected, this);
|
|
195
|
+
|
|
196
|
+
this.#connected();
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
destroy(): void {
|
|
200
|
+
this.#adapter.off('connect', this.#connected, this);
|
|
201
|
+
this.#adapter.off('disconnect', this.#disconnected, this);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
#connected(): void {
|
|
205
|
+
const publicKey = this.#adapter.publicKey?.toBytes();
|
|
206
|
+
if (publicKey) {
|
|
207
|
+
const address = this.#adapter.publicKey!.toBase58();
|
|
208
|
+
const account = this.#account;
|
|
209
|
+
if (
|
|
210
|
+
!account ||
|
|
211
|
+
account.address !== address ||
|
|
212
|
+
account.chains.includes(this.#chain) ||
|
|
213
|
+
!bytesEqual(account.publicKey, publicKey)
|
|
214
|
+
) {
|
|
215
|
+
this.#account = new SolanaWalletAdapterWalletAccount({
|
|
216
|
+
adapter: this.#adapter,
|
|
217
|
+
address,
|
|
218
|
+
publicKey,
|
|
219
|
+
chains: [this.#chain],
|
|
220
|
+
});
|
|
221
|
+
this.#emit('change', { accounts: this.accounts });
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
#disconnected(): void {
|
|
227
|
+
if (this.#account) {
|
|
228
|
+
this.#account = undefined;
|
|
229
|
+
this.#emit('change', { accounts: this.accounts });
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
#connect: StandardConnectMethod = async ({ silent } = {}) => {
|
|
234
|
+
if (!silent && !this.#adapter.connected) {
|
|
235
|
+
await this.#adapter.connect();
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
this.#connected();
|
|
239
|
+
|
|
240
|
+
return { accounts: this.accounts };
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
#disconnect: StandardDisconnectMethod = async () => {
|
|
244
|
+
await this.#adapter.disconnect();
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
#on: StandardEventsOnMethod = (event, listener) => {
|
|
248
|
+
this.#listeners[event]?.push(listener) || (this.#listeners[event] = [listener]);
|
|
249
|
+
return (): void => this.#off(event, listener);
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
#emit<E extends StandardEventsNames>(event: E, ...args: Parameters<StandardEventsListeners[E]>): void {
|
|
253
|
+
// eslint-disable-next-line prefer-spread
|
|
254
|
+
this.#listeners[event]?.forEach((listener) => listener.apply(null, args));
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
#off<E extends StandardEventsNames>(event: E, listener: StandardEventsListeners[E]): void {
|
|
258
|
+
this.#listeners[event] = this.#listeners[event]?.filter((existingListener) => listener !== existingListener);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
#deserializeTransaction(serializedTransaction: Uint8Array): Transaction | VersionedTransaction {
|
|
262
|
+
const transaction = VersionedTransaction.deserialize(serializedTransaction);
|
|
263
|
+
if (!this.#supportedTransactionVersions.includes(transaction.version))
|
|
264
|
+
throw new Error('unsupported transaction version');
|
|
265
|
+
if (transaction.version === 'legacy' && arraysEqual(this.#supportedTransactionVersions, ['legacy']))
|
|
266
|
+
return Transaction.from(serializedTransaction);
|
|
267
|
+
return transaction;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
#signAndSendTransaction: SolanaSignAndSendTransactionMethod = async (...inputs) => {
|
|
271
|
+
const outputs: SolanaSignAndSendTransactionOutput[] = [];
|
|
272
|
+
|
|
273
|
+
if (inputs.length === 1) {
|
|
274
|
+
const input = inputs[0]!;
|
|
275
|
+
if (input.account !== this.#account) throw new Error('invalid account');
|
|
276
|
+
if (!isSolanaChain(input.chain)) throw new Error('invalid chain');
|
|
277
|
+
const transaction = this.#deserializeTransaction(input.transaction);
|
|
278
|
+
const { commitment, preflightCommitment, skipPreflight, maxRetries, minContextSlot } = input.options || {};
|
|
279
|
+
const endpoint = getEndpointForChain(input.chain, this.#endpoint);
|
|
280
|
+
const connection = new Connection(endpoint, commitment || 'confirmed');
|
|
281
|
+
|
|
282
|
+
const latestBlockhash = commitment
|
|
283
|
+
? await connection.getLatestBlockhash({
|
|
284
|
+
commitment: preflightCommitment || commitment,
|
|
285
|
+
minContextSlot,
|
|
286
|
+
})
|
|
287
|
+
: undefined;
|
|
288
|
+
|
|
289
|
+
const signature = await this.#adapter.sendTransaction(transaction, connection, {
|
|
290
|
+
preflightCommitment,
|
|
291
|
+
skipPreflight,
|
|
292
|
+
maxRetries,
|
|
293
|
+
minContextSlot,
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
if (latestBlockhash) {
|
|
297
|
+
await connection.confirmTransaction(
|
|
298
|
+
{
|
|
299
|
+
...latestBlockhash,
|
|
300
|
+
signature,
|
|
301
|
+
},
|
|
302
|
+
commitment || 'confirmed'
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
outputs.push({ signature: bs58.decode(signature) });
|
|
307
|
+
} else if (inputs.length > 1) {
|
|
308
|
+
// Adapters have no `sendAllTransactions` method, so just sign and send each transaction in serial.
|
|
309
|
+
for (const input of inputs) {
|
|
310
|
+
outputs.push(...(await this.#signAndSendTransaction(input)));
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
return outputs;
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
#signTransaction: SolanaSignTransactionMethod = async (...inputs) => {
|
|
318
|
+
if (!('signTransaction' in this.#adapter)) throw new Error('signTransaction not implemented by adapter');
|
|
319
|
+
const outputs: SolanaSignTransactionOutput[] = [];
|
|
320
|
+
|
|
321
|
+
if (inputs.length === 1) {
|
|
322
|
+
const input = inputs[0]!;
|
|
323
|
+
if (input.account !== this.#account) throw new Error('invalid account');
|
|
324
|
+
if (input.chain && !isSolanaChain(input.chain)) throw new Error('invalid chain');
|
|
325
|
+
const transaction = this.#deserializeTransaction(input.transaction);
|
|
326
|
+
|
|
327
|
+
const signedTransaction = await this.#adapter.signTransaction(transaction);
|
|
328
|
+
|
|
329
|
+
const serializedTransaction = isVersionedTransaction(signedTransaction)
|
|
330
|
+
? signedTransaction.serialize()
|
|
331
|
+
: new Uint8Array(
|
|
332
|
+
signedTransaction.serialize({
|
|
333
|
+
requireAllSignatures: false,
|
|
334
|
+
verifySignatures: false,
|
|
335
|
+
})
|
|
336
|
+
);
|
|
337
|
+
|
|
338
|
+
outputs.push({ signedTransaction: serializedTransaction });
|
|
339
|
+
} else if (inputs.length > 1) {
|
|
340
|
+
for (const input of inputs) {
|
|
341
|
+
if (input.account !== this.#account) throw new Error('invalid account');
|
|
342
|
+
if (input.chain && !isSolanaChain(input.chain)) throw new Error('invalid chain');
|
|
343
|
+
}
|
|
344
|
+
const transactions = inputs.map(({ transaction }) => this.#deserializeTransaction(transaction));
|
|
345
|
+
|
|
346
|
+
const signedTransactions = await this.#adapter.signAllTransactions(transactions);
|
|
347
|
+
|
|
348
|
+
outputs.push(
|
|
349
|
+
...signedTransactions.map((signedTransaction) => {
|
|
350
|
+
const serializedTransaction = isVersionedTransaction(signedTransaction)
|
|
351
|
+
? signedTransaction.serialize()
|
|
352
|
+
: new Uint8Array(
|
|
353
|
+
signedTransaction.serialize({
|
|
354
|
+
requireAllSignatures: false,
|
|
355
|
+
verifySignatures: false,
|
|
356
|
+
})
|
|
357
|
+
);
|
|
358
|
+
|
|
359
|
+
return { signedTransaction: serializedTransaction };
|
|
360
|
+
})
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
return outputs;
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
#signMessage: SolanaSignMessageMethod = async (...inputs) => {
|
|
368
|
+
if (!('signMessage' in this.#adapter)) throw new Error('signMessage not implemented by adapter');
|
|
369
|
+
const outputs: SolanaSignMessageOutput[] = [];
|
|
370
|
+
|
|
371
|
+
if (inputs.length === 1) {
|
|
372
|
+
const input = inputs[0]!;
|
|
373
|
+
if (input.account !== this.#account) throw new Error('invalid account');
|
|
374
|
+
|
|
375
|
+
const signature = await this.#adapter.signMessage(input.message);
|
|
376
|
+
|
|
377
|
+
outputs.push({ signedMessage: input.message, signature });
|
|
378
|
+
} else if (inputs.length > 1) {
|
|
379
|
+
// Adapters have no `signAllMessages` method, so just sign each message in serial.
|
|
380
|
+
for (const input of inputs) {
|
|
381
|
+
outputs.push(...(await this.#signMessage(input)));
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
return outputs;
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
#signIn: SolanaSignInMethod = async (...inputs) => {
|
|
389
|
+
if (!('signIn' in this.#adapter)) throw new Error('signIn not implemented by adapter');
|
|
390
|
+
|
|
391
|
+
if (inputs.length > 1) {
|
|
392
|
+
// Adapters don't support `signIn` with multiple inputs, so just sign in with each input in serial.
|
|
393
|
+
const outputs: SolanaSignInOutput[] = [];
|
|
394
|
+
for (const input of inputs) {
|
|
395
|
+
outputs.push(await this.#adapter.signIn(input));
|
|
396
|
+
}
|
|
397
|
+
return outputs;
|
|
398
|
+
} else {
|
|
399
|
+
return [await this.#adapter.signIn(inputs[0])];
|
|
400
|
+
}
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/** TODO: docs */
|
|
405
|
+
export function registerWalletAdapter(
|
|
406
|
+
adapter: Adapter,
|
|
407
|
+
chain: SolanaChain,
|
|
408
|
+
endpoint?: string,
|
|
409
|
+
match: (wallet: Wallet) => boolean = (wallet) => wallet.name === adapter.name
|
|
410
|
+
): () => void {
|
|
411
|
+
const { register, get, on } = getWallets();
|
|
412
|
+
const destructors: (() => void)[] = [];
|
|
413
|
+
|
|
414
|
+
function destroy(): void {
|
|
415
|
+
destructors.forEach((destroy) => destroy());
|
|
416
|
+
destructors.length = 0;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
function setup(): boolean {
|
|
420
|
+
// If the adapter is unsupported, or a standard wallet that matches it has already been registered, do nothing.
|
|
421
|
+
if (adapter.readyState === WalletReadyState.Unsupported || get().some(match)) return true;
|
|
422
|
+
|
|
423
|
+
// If the adapter isn't ready, try again later.
|
|
424
|
+
const ready =
|
|
425
|
+
adapter.readyState === WalletReadyState.Installed || adapter.readyState === WalletReadyState.Loadable;
|
|
426
|
+
if (ready) {
|
|
427
|
+
const wallet = new SolanaWalletAdapterWallet(adapter, chain, endpoint);
|
|
428
|
+
destructors.push(() => wallet.destroy());
|
|
429
|
+
// Register the adapter wrapped as a standard wallet, and receive a function to unregister the adapter.
|
|
430
|
+
destructors.push(register(wallet));
|
|
431
|
+
// Whenever a standard wallet is registered ...
|
|
432
|
+
destructors.push(
|
|
433
|
+
on('register', (...wallets) => {
|
|
434
|
+
// ... check if it matches the adapter.
|
|
435
|
+
if (wallets.some(match)) {
|
|
436
|
+
// If it does, remove the event listener and unregister the adapter.
|
|
437
|
+
destroy();
|
|
438
|
+
}
|
|
439
|
+
})
|
|
440
|
+
);
|
|
441
|
+
}
|
|
442
|
+
return ready;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
if (!setup()) {
|
|
446
|
+
function listener(): void {
|
|
447
|
+
if (setup()) {
|
|
448
|
+
adapter.off('readyStateChange', listener);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
adapter.on('readyStateChange', listener);
|
|
453
|
+
destructors.push(() => adapter.off('readyStateChange', listener));
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
return destroy;
|
|
457
|
+
}
|