@miden-sdk/miden-wallet-adapter-miden 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/adapter.ts ADDED
@@ -0,0 +1,353 @@
1
+ import { Note, type NoteFilterTypes } from '@miden-sdk/miden-sdk';
2
+ import {
3
+ AllowedPrivateData,
4
+ BaseMessageSignerWalletAdapter,
5
+ EventEmitter,
6
+ scopePollingDetectionStrategy,
7
+ SignKind,
8
+ WalletConnectionError,
9
+ WalletDisconnectionError,
10
+ WalletName,
11
+ WalletNotConnectedError,
12
+ WalletNotReadyError,
13
+ WalletReadyState,
14
+ PrivateDataPermission,
15
+ WalletAdapterNetwork,
16
+ MidenSendTransaction,
17
+ MidenTransaction,
18
+ MidenConsumeTransaction,
19
+ WalletTransactionError,
20
+ Asset,
21
+ InputNoteDetails,
22
+ TransactionOutput,
23
+ WalletTransactionOutput,
24
+ b64ToU8,
25
+ } from '@miden-sdk/miden-wallet-adapter-base';
26
+
27
+ export interface MidenWalletEvents {
28
+ connect(...args: unknown[]): unknown;
29
+ disconnect(...args: unknown[]): unknown;
30
+ accountChange(...args: unknown[]): unknown;
31
+ }
32
+
33
+ export interface MidenWallet extends EventEmitter<MidenWalletEvents> {
34
+ address?: string;
35
+ publicKey?: Uint8Array;
36
+ requestSend(
37
+ transaction: MidenSendTransaction
38
+ ): Promise<{ transactionId?: string }>;
39
+ requestConsume(
40
+ transaction: MidenConsumeTransaction
41
+ ): Promise<{ transactionId?: string }>;
42
+ requestTransaction(
43
+ transaction: MidenTransaction
44
+ ): Promise<{ transactionId?: string }>;
45
+ requestAssets(): Promise<{ assets: Asset[] }>;
46
+ requestPrivateNotes(
47
+ noteFilterType: NoteFilterTypes,
48
+ noteIds?: string[]
49
+ ): Promise<{
50
+ privateNotes: InputNoteDetails[];
51
+ }>;
52
+ waitForTransaction(
53
+ txId: string,
54
+ timeout?: number
55
+ ): Promise<WalletTransactionOutput>;
56
+ signBytes(
57
+ message: Uint8Array,
58
+ kind: SignKind
59
+ ): Promise<{ signature: Uint8Array }>;
60
+ importPrivateNote(note: Uint8Array): Promise<{ noteId: string }>;
61
+ requestConsumableNotes(): Promise<{ consumableNotes: InputNoteDetails[] }>;
62
+ connect(
63
+ privateDataPermission: PrivateDataPermission,
64
+ network: WalletAdapterNetwork,
65
+ allowedPrivateData?: AllowedPrivateData
66
+ ): Promise<void>;
67
+ disconnect(): Promise<void>;
68
+ }
69
+
70
+ export interface MidenWindow extends Window {
71
+ midenWallet?: MidenWallet;
72
+ miden?: MidenWallet;
73
+ }
74
+
75
+ declare const window: MidenWindow;
76
+
77
+ export interface MidenWalletAdapterConfig {
78
+ appName?: string;
79
+ }
80
+
81
+ export const MidenWalletName = 'Miden Wallet' as WalletName<'Miden Wallet'>;
82
+
83
+ export class MidenWalletAdapter extends BaseMessageSignerWalletAdapter {
84
+ name = MidenWalletName;
85
+ url = 'https://miden.fi/';
86
+ icon =
87
+ 'data:image/png;base64,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';
88
+ readonly supportedTransactionVersions = null;
89
+
90
+ private _connecting: boolean;
91
+ private _wallet: MidenWallet | null;
92
+ private _address: string | null;
93
+ private _publicKey: Uint8Array | null;
94
+ private _privateDataPermission: string;
95
+ private _readyState: WalletReadyState =
96
+ typeof window === 'undefined' || typeof document === 'undefined'
97
+ ? WalletReadyState.Unsupported
98
+ : WalletReadyState.NotDetected;
99
+
100
+ constructor({ appName = 'sample' }: MidenWalletAdapterConfig = {}) {
101
+ super();
102
+ this._connecting = false;
103
+ this._wallet = null;
104
+ this._address = null;
105
+ this._publicKey = null;
106
+ this._privateDataPermission = PrivateDataPermission.UponRequest;
107
+
108
+ if (this._readyState !== WalletReadyState.Unsupported) {
109
+ scopePollingDetectionStrategy(() => {
110
+ if (window?.midenWallet || window?.miden) {
111
+ this._readyState = WalletReadyState.Installed;
112
+ this.emit('readyStateChange', this._readyState);
113
+ return true;
114
+ }
115
+ return false;
116
+ });
117
+ }
118
+ }
119
+
120
+ get address() {
121
+ return this._address;
122
+ }
123
+
124
+ get publicKey() {
125
+ return this._publicKey;
126
+ }
127
+
128
+ get privateDataPermission() {
129
+ return this._privateDataPermission;
130
+ }
131
+
132
+ get connecting() {
133
+ return this._connecting;
134
+ }
135
+
136
+ get readyState() {
137
+ return this._readyState;
138
+ }
139
+
140
+ set readyState(readyState) {
141
+ this._readyState = readyState;
142
+ }
143
+
144
+ async requestSend(transaction: MidenSendTransaction): Promise<string> {
145
+ try {
146
+ const wallet = this._wallet;
147
+ if (!wallet || !this.address) throw new WalletNotConnectedError();
148
+ try {
149
+ const result = await wallet.requestSend(transaction);
150
+ return result.transactionId!;
151
+ } catch (error: any) {
152
+ throw new WalletTransactionError(error?.message, error);
153
+ }
154
+ } catch (error: any) {
155
+ this.emit('error', error);
156
+ throw error;
157
+ }
158
+ }
159
+
160
+ async requestConsume(transaction: MidenConsumeTransaction): Promise<string> {
161
+ try {
162
+ const wallet = this._wallet;
163
+ if (!wallet || !this.address) throw new WalletNotConnectedError();
164
+ try {
165
+ const result = await wallet.requestConsume(transaction);
166
+ return result.transactionId!;
167
+ } catch (error: any) {
168
+ throw new WalletTransactionError(error?.message, error);
169
+ }
170
+ } catch (error: any) {
171
+ this.emit('error', error);
172
+ throw error;
173
+ }
174
+ }
175
+
176
+ async requestTransaction(transaction: MidenTransaction): Promise<string> {
177
+ try {
178
+ const wallet = this._wallet;
179
+ if (!wallet || !this.address) throw new WalletNotConnectedError();
180
+ try {
181
+ const result = await wallet.requestTransaction(transaction);
182
+ return result.transactionId!;
183
+ } catch (error: any) {
184
+ throw new WalletTransactionError(error?.message, error);
185
+ }
186
+ } catch (error: any) {
187
+ this.emit('error', error);
188
+ throw error;
189
+ }
190
+ }
191
+
192
+ async requestAssets(): Promise<Asset[]> {
193
+ try {
194
+ const wallet = this._wallet;
195
+ if (!wallet || !this.address) throw new WalletNotConnectedError();
196
+ try {
197
+ const result = await wallet.requestAssets();
198
+ return result.assets;
199
+ } catch (error: any) {
200
+ throw new WalletTransactionError(error?.message, error);
201
+ }
202
+ } catch (error: any) {
203
+ this.emit('error', error);
204
+ throw error;
205
+ }
206
+ }
207
+
208
+ async requestPrivateNotes(
209
+ noteFilterType: NoteFilterTypes,
210
+ noteIds?: string[]
211
+ ): Promise<InputNoteDetails[]> {
212
+ try {
213
+ const wallet = this._wallet;
214
+ if (!wallet || !this.address) throw new WalletNotConnectedError();
215
+ try {
216
+ const result = await wallet.requestPrivateNotes(
217
+ noteFilterType,
218
+ noteIds
219
+ );
220
+ return result.privateNotes;
221
+ } catch (error: any) {
222
+ throw new WalletTransactionError(error?.message, error);
223
+ }
224
+ } catch (error: any) {
225
+ this.emit('error', error);
226
+ throw error;
227
+ }
228
+ }
229
+
230
+ async signBytes(message: Uint8Array, kind: SignKind): Promise<Uint8Array> {
231
+ try {
232
+ const wallet = this._wallet;
233
+ if (!wallet || !this.address) throw new WalletNotConnectedError();
234
+ try {
235
+ const result = await wallet.signBytes(message, kind);
236
+ return result.signature;
237
+ } catch (error: any) {
238
+ throw new WalletTransactionError(error?.message, error);
239
+ }
240
+ } catch (error: any) {
241
+ this.emit('error', error);
242
+ throw error;
243
+ }
244
+ }
245
+
246
+ async importPrivateNote(note: Uint8Array): Promise<string> {
247
+ try {
248
+ const wallet = this._wallet;
249
+ if (!wallet || !this.address) throw new WalletNotConnectedError();
250
+ const result = await wallet.importPrivateNote(note);
251
+ return result.noteId;
252
+ } catch (error: any) {
253
+ this.emit('error', error);
254
+ throw error;
255
+ }
256
+ }
257
+
258
+ async requestConsumableNotes(): Promise<InputNoteDetails[]> {
259
+ try {
260
+ const wallet = this._wallet;
261
+ if (!wallet || !this.address) throw new WalletNotConnectedError();
262
+ const result = await wallet.requestConsumableNotes();
263
+ return result.consumableNotes;
264
+ } catch (error: any) {
265
+ this.emit('error', error);
266
+ throw error;
267
+ }
268
+ }
269
+
270
+ async waitForTransaction(
271
+ txId: string,
272
+ timeout?: number
273
+ ): Promise<TransactionOutput> {
274
+ try {
275
+ const wallet = this._wallet;
276
+ if (!wallet || !this.address) throw new WalletNotConnectedError();
277
+ const result = await wallet.waitForTransaction(txId, timeout);
278
+ if ('errorMessage' in result) {
279
+ throw new WalletTransactionError(result.errorMessage);
280
+ }
281
+ const notes = result.outputNotes.map((serNote) => {
282
+ const u8Arr = b64ToU8(serNote);
283
+ return Note.deserialize(u8Arr);
284
+ });
285
+ return {
286
+ txHash: result.txHash,
287
+ outputNotes: notes,
288
+ };
289
+ } catch (error: any) {
290
+ this.emit('error', error);
291
+ throw error;
292
+ }
293
+ }
294
+
295
+ async connect(
296
+ privateDataPermission: PrivateDataPermission,
297
+ network: WalletAdapterNetwork,
298
+ allowedPrivateData?: AllowedPrivateData
299
+ ): Promise<void> {
300
+ try {
301
+ if (this.connected || this.connecting) return;
302
+ if (this._readyState !== WalletReadyState.Installed)
303
+ throw new WalletNotReadyError();
304
+
305
+ this._connecting = true;
306
+
307
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
308
+ const wallet = window.midenWallet! || window.miden!;
309
+
310
+ try {
311
+ await wallet.connect(
312
+ privateDataPermission,
313
+ network,
314
+ allowedPrivateData
315
+ );
316
+ if (!wallet.address) {
317
+ throw new WalletConnectionError();
318
+ }
319
+ this._address = wallet.address;
320
+ this._publicKey = wallet.publicKey!;
321
+ } catch (error: any) {
322
+ throw new WalletConnectionError(error?.message, error);
323
+ }
324
+
325
+ this._wallet = wallet;
326
+ this._privateDataPermission = privateDataPermission;
327
+
328
+ this.emit('connect', this._address);
329
+ } catch (error: any) {
330
+ this.emit('error', error);
331
+ throw error;
332
+ } finally {
333
+ this._connecting = false;
334
+ }
335
+ }
336
+
337
+ async disconnect(): Promise<void> {
338
+ const wallet = this._wallet;
339
+ if (wallet) {
340
+ this._wallet = null;
341
+ this._address = null;
342
+ this._publicKey = null;
343
+
344
+ try {
345
+ await wallet.disconnect();
346
+ } catch (error: any) {
347
+ this.emit('error', new WalletDisconnectionError(error?.message, error));
348
+ }
349
+ }
350
+
351
+ this.emit('disconnect');
352
+ }
353
+ }
@@ -0,0 +1,76 @@
1
+ import { type NoteFilterTypes } from '@miden-sdk/miden-sdk';
2
+ import { AllowedPrivateData, BaseMessageSignerWalletAdapter, EventEmitter, SignKind, WalletName, WalletReadyState, PrivateDataPermission, WalletAdapterNetwork, MidenSendTransaction, MidenTransaction, MidenConsumeTransaction, Asset, InputNoteDetails, TransactionOutput, WalletTransactionOutput } from '@miden-sdk/miden-wallet-adapter-base';
3
+ export interface MidenWalletEvents {
4
+ connect(...args: unknown[]): unknown;
5
+ disconnect(...args: unknown[]): unknown;
6
+ accountChange(...args: unknown[]): unknown;
7
+ }
8
+ export interface MidenWallet extends EventEmitter<MidenWalletEvents> {
9
+ address?: string;
10
+ publicKey?: Uint8Array;
11
+ requestSend(transaction: MidenSendTransaction): Promise<{
12
+ transactionId?: string;
13
+ }>;
14
+ requestConsume(transaction: MidenConsumeTransaction): Promise<{
15
+ transactionId?: string;
16
+ }>;
17
+ requestTransaction(transaction: MidenTransaction): Promise<{
18
+ transactionId?: string;
19
+ }>;
20
+ requestAssets(): Promise<{
21
+ assets: Asset[];
22
+ }>;
23
+ requestPrivateNotes(noteFilterType: NoteFilterTypes, noteIds?: string[]): Promise<{
24
+ privateNotes: InputNoteDetails[];
25
+ }>;
26
+ waitForTransaction(txId: string, timeout?: number): Promise<WalletTransactionOutput>;
27
+ signBytes(message: Uint8Array, kind: SignKind): Promise<{
28
+ signature: Uint8Array;
29
+ }>;
30
+ importPrivateNote(note: Uint8Array): Promise<{
31
+ noteId: string;
32
+ }>;
33
+ requestConsumableNotes(): Promise<{
34
+ consumableNotes: InputNoteDetails[];
35
+ }>;
36
+ connect(privateDataPermission: PrivateDataPermission, network: WalletAdapterNetwork, allowedPrivateData?: AllowedPrivateData): Promise<void>;
37
+ disconnect(): Promise<void>;
38
+ }
39
+ export interface MidenWindow extends Window {
40
+ midenWallet?: MidenWallet;
41
+ miden?: MidenWallet;
42
+ }
43
+ export interface MidenWalletAdapterConfig {
44
+ appName?: string;
45
+ }
46
+ export declare const MidenWalletName: WalletName<"Miden Wallet">;
47
+ export declare class MidenWalletAdapter extends BaseMessageSignerWalletAdapter {
48
+ name: WalletName<"Miden Wallet">;
49
+ url: string;
50
+ icon: string;
51
+ readonly supportedTransactionVersions: any;
52
+ private _connecting;
53
+ private _wallet;
54
+ private _address;
55
+ private _publicKey;
56
+ private _privateDataPermission;
57
+ private _readyState;
58
+ constructor({ appName }?: MidenWalletAdapterConfig);
59
+ get address(): string;
60
+ get publicKey(): Uint8Array<ArrayBufferLike>;
61
+ get privateDataPermission(): string;
62
+ get connecting(): boolean;
63
+ get readyState(): WalletReadyState;
64
+ set readyState(readyState: WalletReadyState);
65
+ requestSend(transaction: MidenSendTransaction): Promise<string>;
66
+ requestConsume(transaction: MidenConsumeTransaction): Promise<string>;
67
+ requestTransaction(transaction: MidenTransaction): Promise<string>;
68
+ requestAssets(): Promise<Asset[]>;
69
+ requestPrivateNotes(noteFilterType: NoteFilterTypes, noteIds?: string[]): Promise<InputNoteDetails[]>;
70
+ signBytes(message: Uint8Array, kind: SignKind): Promise<Uint8Array>;
71
+ importPrivateNote(note: Uint8Array): Promise<string>;
72
+ requestConsumableNotes(): Promise<InputNoteDetails[]>;
73
+ waitForTransaction(txId: string, timeout?: number): Promise<TransactionOutput>;
74
+ connect(privateDataPermission: PrivateDataPermission, network: WalletAdapterNetwork, allowedPrivateData?: AllowedPrivateData): Promise<void>;
75
+ disconnect(): Promise<void>;
76
+ }
@@ -0,0 +1,258 @@
1
+ import { Note } from '@miden-sdk/miden-sdk';
2
+ import { BaseMessageSignerWalletAdapter, scopePollingDetectionStrategy, WalletConnectionError, WalletDisconnectionError, WalletNotConnectedError, WalletNotReadyError, WalletReadyState, PrivateDataPermission, WalletTransactionError, b64ToU8, } from '@miden-sdk/miden-wallet-adapter-base';
3
+ export const MidenWalletName = 'Miden Wallet';
4
+ export class MidenWalletAdapter extends BaseMessageSignerWalletAdapter {
5
+ name = MidenWalletName;
6
+ url = 'https://miden.fi/';
7
+ icon = 'data:image/png;base64,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';
8
+ supportedTransactionVersions = null;
9
+ _connecting;
10
+ _wallet;
11
+ _address;
12
+ _publicKey;
13
+ _privateDataPermission;
14
+ _readyState = typeof window === 'undefined' || typeof document === 'undefined'
15
+ ? WalletReadyState.Unsupported
16
+ : WalletReadyState.NotDetected;
17
+ constructor({ appName = 'sample' } = {}) {
18
+ super();
19
+ this._connecting = false;
20
+ this._wallet = null;
21
+ this._address = null;
22
+ this._publicKey = null;
23
+ this._privateDataPermission = PrivateDataPermission.UponRequest;
24
+ if (this._readyState !== WalletReadyState.Unsupported) {
25
+ scopePollingDetectionStrategy(() => {
26
+ if (window?.midenWallet || window?.miden) {
27
+ this._readyState = WalletReadyState.Installed;
28
+ this.emit('readyStateChange', this._readyState);
29
+ return true;
30
+ }
31
+ return false;
32
+ });
33
+ }
34
+ }
35
+ get address() {
36
+ return this._address;
37
+ }
38
+ get publicKey() {
39
+ return this._publicKey;
40
+ }
41
+ get privateDataPermission() {
42
+ return this._privateDataPermission;
43
+ }
44
+ get connecting() {
45
+ return this._connecting;
46
+ }
47
+ get readyState() {
48
+ return this._readyState;
49
+ }
50
+ set readyState(readyState) {
51
+ this._readyState = readyState;
52
+ }
53
+ async requestSend(transaction) {
54
+ try {
55
+ const wallet = this._wallet;
56
+ if (!wallet || !this.address)
57
+ throw new WalletNotConnectedError();
58
+ try {
59
+ const result = await wallet.requestSend(transaction);
60
+ return result.transactionId;
61
+ }
62
+ catch (error) {
63
+ throw new WalletTransactionError(error?.message, error);
64
+ }
65
+ }
66
+ catch (error) {
67
+ this.emit('error', error);
68
+ throw error;
69
+ }
70
+ }
71
+ async requestConsume(transaction) {
72
+ try {
73
+ const wallet = this._wallet;
74
+ if (!wallet || !this.address)
75
+ throw new WalletNotConnectedError();
76
+ try {
77
+ const result = await wallet.requestConsume(transaction);
78
+ return result.transactionId;
79
+ }
80
+ catch (error) {
81
+ throw new WalletTransactionError(error?.message, error);
82
+ }
83
+ }
84
+ catch (error) {
85
+ this.emit('error', error);
86
+ throw error;
87
+ }
88
+ }
89
+ async requestTransaction(transaction) {
90
+ try {
91
+ const wallet = this._wallet;
92
+ if (!wallet || !this.address)
93
+ throw new WalletNotConnectedError();
94
+ try {
95
+ const result = await wallet.requestTransaction(transaction);
96
+ return result.transactionId;
97
+ }
98
+ catch (error) {
99
+ throw new WalletTransactionError(error?.message, error);
100
+ }
101
+ }
102
+ catch (error) {
103
+ this.emit('error', error);
104
+ throw error;
105
+ }
106
+ }
107
+ async requestAssets() {
108
+ try {
109
+ const wallet = this._wallet;
110
+ if (!wallet || !this.address)
111
+ throw new WalletNotConnectedError();
112
+ try {
113
+ const result = await wallet.requestAssets();
114
+ return result.assets;
115
+ }
116
+ catch (error) {
117
+ throw new WalletTransactionError(error?.message, error);
118
+ }
119
+ }
120
+ catch (error) {
121
+ this.emit('error', error);
122
+ throw error;
123
+ }
124
+ }
125
+ async requestPrivateNotes(noteFilterType, noteIds) {
126
+ try {
127
+ const wallet = this._wallet;
128
+ if (!wallet || !this.address)
129
+ throw new WalletNotConnectedError();
130
+ try {
131
+ const result = await wallet.requestPrivateNotes(noteFilterType, noteIds);
132
+ return result.privateNotes;
133
+ }
134
+ catch (error) {
135
+ throw new WalletTransactionError(error?.message, error);
136
+ }
137
+ }
138
+ catch (error) {
139
+ this.emit('error', error);
140
+ throw error;
141
+ }
142
+ }
143
+ async signBytes(message, kind) {
144
+ try {
145
+ const wallet = this._wallet;
146
+ if (!wallet || !this.address)
147
+ throw new WalletNotConnectedError();
148
+ try {
149
+ const result = await wallet.signBytes(message, kind);
150
+ return result.signature;
151
+ }
152
+ catch (error) {
153
+ throw new WalletTransactionError(error?.message, error);
154
+ }
155
+ }
156
+ catch (error) {
157
+ this.emit('error', error);
158
+ throw error;
159
+ }
160
+ }
161
+ async importPrivateNote(note) {
162
+ try {
163
+ const wallet = this._wallet;
164
+ if (!wallet || !this.address)
165
+ throw new WalletNotConnectedError();
166
+ const result = await wallet.importPrivateNote(note);
167
+ return result.noteId;
168
+ }
169
+ catch (error) {
170
+ this.emit('error', error);
171
+ throw error;
172
+ }
173
+ }
174
+ async requestConsumableNotes() {
175
+ try {
176
+ const wallet = this._wallet;
177
+ if (!wallet || !this.address)
178
+ throw new WalletNotConnectedError();
179
+ const result = await wallet.requestConsumableNotes();
180
+ return result.consumableNotes;
181
+ }
182
+ catch (error) {
183
+ this.emit('error', error);
184
+ throw error;
185
+ }
186
+ }
187
+ async waitForTransaction(txId, timeout) {
188
+ try {
189
+ const wallet = this._wallet;
190
+ if (!wallet || !this.address)
191
+ throw new WalletNotConnectedError();
192
+ const result = await wallet.waitForTransaction(txId, timeout);
193
+ if ('errorMessage' in result) {
194
+ throw new WalletTransactionError(result.errorMessage);
195
+ }
196
+ const notes = result.outputNotes.map((serNote) => {
197
+ const u8Arr = b64ToU8(serNote);
198
+ return Note.deserialize(u8Arr);
199
+ });
200
+ return {
201
+ txHash: result.txHash,
202
+ outputNotes: notes,
203
+ };
204
+ }
205
+ catch (error) {
206
+ this.emit('error', error);
207
+ throw error;
208
+ }
209
+ }
210
+ async connect(privateDataPermission, network, allowedPrivateData) {
211
+ try {
212
+ if (this.connected || this.connecting)
213
+ return;
214
+ if (this._readyState !== WalletReadyState.Installed)
215
+ throw new WalletNotReadyError();
216
+ this._connecting = true;
217
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
218
+ const wallet = window.midenWallet || window.miden;
219
+ try {
220
+ await wallet.connect(privateDataPermission, network, allowedPrivateData);
221
+ if (!wallet.address) {
222
+ throw new WalletConnectionError();
223
+ }
224
+ this._address = wallet.address;
225
+ this._publicKey = wallet.publicKey;
226
+ }
227
+ catch (error) {
228
+ throw new WalletConnectionError(error?.message, error);
229
+ }
230
+ this._wallet = wallet;
231
+ this._privateDataPermission = privateDataPermission;
232
+ this.emit('connect', this._address);
233
+ }
234
+ catch (error) {
235
+ this.emit('error', error);
236
+ throw error;
237
+ }
238
+ finally {
239
+ this._connecting = false;
240
+ }
241
+ }
242
+ async disconnect() {
243
+ const wallet = this._wallet;
244
+ if (wallet) {
245
+ this._wallet = null;
246
+ this._address = null;
247
+ this._publicKey = null;
248
+ try {
249
+ await wallet.disconnect();
250
+ }
251
+ catch (error) {
252
+ this.emit('error', new WalletDisconnectionError(error?.message, error));
253
+ }
254
+ }
255
+ this.emit('disconnect');
256
+ }
257
+ }
258
+ //# sourceMappingURL=adapter.js.map