@miden-sdk/miden-wallet-adapter-react 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/MidenFiSignerProvider.tsx +732 -0
- package/WalletProvider.tsx +443 -0
- package/__tests__/MidenFiSignerProvider.test.tsx +426 -0
- package/dist/MidenFiSignerProvider.d.ts +113 -0
- package/dist/MidenFiSignerProvider.js +501 -0
- package/dist/MidenFiSignerProvider.js.map +1 -0
- package/dist/WalletProvider.d.ts +13 -0
- package/dist/WalletProvider.js +302 -0
- package/dist/WalletProvider.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/useLocalStorage.d.ts +2 -0
- package/dist/useLocalStorage.js +39 -0
- package/dist/useLocalStorage.js.map +1 -0
- package/dist/useWallet.d.ts +30 -0
- package/dist/useWallet.js +81 -0
- package/dist/useWallet.js.map +1 -0
- package/dist/vitest.config.d.ts +2 -0
- package/dist/vitest.config.js +8 -0
- package/dist/vitest.config.js.map +1 -0
- package/docs/README.md +30 -0
- package/docs/functions/useLocalStorage.md +29 -0
- package/docs/functions/useMidenFiWallet.md +28 -0
- package/docs/functions/useWallet.md +13 -0
- package/docs/interfaces/MidenFiSignerProviderProps.md +87 -0
- package/docs/interfaces/Wallet.md +19 -0
- package/docs/interfaces/WalletContextState.md +235 -0
- package/docs/interfaces/WalletProviderProps.md +65 -0
- package/docs/variables/MidenFiSignerProvider.md +54 -0
- package/docs/variables/WalletContext.md +9 -0
- package/docs/variables/WalletProvider.md +9 -0
- package/index.ts +15 -0
- package/package.json +42 -0
- package/tsconfig.json +16 -0
- package/useLocalStorage.ts +39 -0
- package/useWallet.ts +197 -0
- package/vitest.config.ts +8 -0
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { renderHook, render, screen, cleanup, act } from '@testing-library/react';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
|
|
5
|
+
// Create a mock adapter factory
|
|
6
|
+
const createMockAdapter = (overrides = {}) => {
|
|
7
|
+
const listeners: Record<string, Function[]> = {};
|
|
8
|
+
return {
|
|
9
|
+
name: 'Miden Wallet',
|
|
10
|
+
url: 'https://miden.fi/',
|
|
11
|
+
icon: 'icon-data',
|
|
12
|
+
readyState: 'Unsupported',
|
|
13
|
+
connected: false,
|
|
14
|
+
address: null,
|
|
15
|
+
publicKey: null,
|
|
16
|
+
connect: vi.fn().mockResolvedValue(undefined),
|
|
17
|
+
disconnect: vi.fn().mockResolvedValue(undefined),
|
|
18
|
+
signBytes: vi.fn().mockResolvedValue(new Uint8Array(67)),
|
|
19
|
+
on: vi.fn((event: string, handler: Function) => {
|
|
20
|
+
if (!listeners[event]) listeners[event] = [];
|
|
21
|
+
listeners[event].push(handler);
|
|
22
|
+
}),
|
|
23
|
+
off: vi.fn((event: string, handler: Function) => {
|
|
24
|
+
if (listeners[event]) {
|
|
25
|
+
listeners[event] = listeners[event].filter((h) => h !== handler);
|
|
26
|
+
}
|
|
27
|
+
}),
|
|
28
|
+
emit: vi.fn((event: string, ...args: any[]) => {
|
|
29
|
+
if (listeners[event]) {
|
|
30
|
+
listeners[event].forEach((h) => h(...args));
|
|
31
|
+
}
|
|
32
|
+
}),
|
|
33
|
+
...overrides,
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
let mockAdapter = createMockAdapter();
|
|
38
|
+
|
|
39
|
+
// Mock modules before imports
|
|
40
|
+
vi.mock('@miden-sdk/miden-wallet-adapter-miden', () => ({
|
|
41
|
+
MidenWalletAdapter: vi.fn().mockImplementation((config) => {
|
|
42
|
+
mockAdapter._config = config;
|
|
43
|
+
return mockAdapter;
|
|
44
|
+
}),
|
|
45
|
+
}));
|
|
46
|
+
|
|
47
|
+
vi.mock('@miden-sdk/react', () => ({
|
|
48
|
+
SignerContext: React.createContext(null),
|
|
49
|
+
}));
|
|
50
|
+
|
|
51
|
+
vi.mock('@miden-sdk/miden-sdk', () => ({
|
|
52
|
+
AccountStorageMode: {
|
|
53
|
+
public: vi.fn(() => ({ toString: () => 'public' })),
|
|
54
|
+
private: vi.fn(() => ({ toString: () => 'private' })),
|
|
55
|
+
},
|
|
56
|
+
}));
|
|
57
|
+
|
|
58
|
+
vi.mock('@miden-sdk/miden-wallet-adapter-base', () => ({
|
|
59
|
+
PrivateDataPermission: {
|
|
60
|
+
UponRequest: 'UponRequest',
|
|
61
|
+
Allowed: 'Allowed',
|
|
62
|
+
Denied: 'Denied',
|
|
63
|
+
},
|
|
64
|
+
WalletAdapterNetwork: {
|
|
65
|
+
Testnet: 'testnet',
|
|
66
|
+
Devnet: 'devnet',
|
|
67
|
+
},
|
|
68
|
+
AllowedPrivateData: {
|
|
69
|
+
None: 'None',
|
|
70
|
+
All: 'All',
|
|
71
|
+
},
|
|
72
|
+
WalletReadyState: {
|
|
73
|
+
Installed: 'Installed',
|
|
74
|
+
NotDetected: 'NotDetected',
|
|
75
|
+
Loadable: 'Loadable',
|
|
76
|
+
Unsupported: 'Unsupported',
|
|
77
|
+
},
|
|
78
|
+
WalletNotSelectedError: class WalletNotSelectedError extends Error {
|
|
79
|
+
constructor() {
|
|
80
|
+
super('Wallet not selected');
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
WalletNotReadyError: class WalletNotReadyError extends Error {
|
|
84
|
+
constructor() {
|
|
85
|
+
super('Wallet not ready');
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
WalletNotConnectedError: class WalletNotConnectedError extends Error {
|
|
89
|
+
constructor() {
|
|
90
|
+
super('Wallet not connected');
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
}));
|
|
94
|
+
|
|
95
|
+
import { SignerContext } from '@miden-sdk/react';
|
|
96
|
+
import {
|
|
97
|
+
MidenFiSignerProvider,
|
|
98
|
+
useMidenFiWallet,
|
|
99
|
+
} from '../MidenFiSignerProvider';
|
|
100
|
+
import { MidenWalletAdapter } from '@miden-sdk/miden-wallet-adapter-miden';
|
|
101
|
+
|
|
102
|
+
// Test helpers
|
|
103
|
+
const flushPromises = () => new Promise((resolve) => setTimeout(resolve, 0));
|
|
104
|
+
|
|
105
|
+
describe('MidenFiSignerProvider', () => {
|
|
106
|
+
beforeEach(() => {
|
|
107
|
+
vi.clearAllMocks();
|
|
108
|
+
mockAdapter = createMockAdapter();
|
|
109
|
+
localStorage.clear();
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
afterEach(() => {
|
|
113
|
+
cleanup();
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
describe('rendering', () => {
|
|
117
|
+
it('renders children', () => {
|
|
118
|
+
render(
|
|
119
|
+
<MidenFiSignerProvider>
|
|
120
|
+
<div data-testid="child">Test Child</div>
|
|
121
|
+
</MidenFiSignerProvider>
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
expect(screen.getByTestId('child')).toBeDefined();
|
|
125
|
+
expect(screen.getByText('Test Child')).toBeDefined();
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
describe('default adapter', () => {
|
|
130
|
+
it('creates MidenWalletAdapter with default appName', () => {
|
|
131
|
+
render(
|
|
132
|
+
<MidenFiSignerProvider>
|
|
133
|
+
<div>Test</div>
|
|
134
|
+
</MidenFiSignerProvider>
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
expect(MidenWalletAdapter).toHaveBeenCalledWith({ appName: 'Miden DApp' });
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it('creates MidenWalletAdapter with custom appName', () => {
|
|
141
|
+
render(
|
|
142
|
+
<MidenFiSignerProvider appName="Custom App">
|
|
143
|
+
<div>Test</div>
|
|
144
|
+
</MidenFiSignerProvider>
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
expect(MidenWalletAdapter).toHaveBeenCalledWith({ appName: 'Custom App' });
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('uses custom wallets when provided', () => {
|
|
151
|
+
const customAdapter = createMockAdapter({ name: 'Custom Wallet' });
|
|
152
|
+
|
|
153
|
+
const { result } = renderHook(() => useMidenFiWallet(), {
|
|
154
|
+
wrapper: ({ children }) => (
|
|
155
|
+
<MidenFiSignerProvider wallets={[customAdapter as any]}>
|
|
156
|
+
{children}
|
|
157
|
+
</MidenFiSignerProvider>
|
|
158
|
+
),
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
expect(result.current.wallets[0].adapter.name).toBe('Custom Wallet');
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
describe('SignerContext when wallet not connected', () => {
|
|
166
|
+
it('provides SignerContext with isConnected false when wallet not connected', async () => {
|
|
167
|
+
let capturedContext: any = null;
|
|
168
|
+
const TestConsumer = () => {
|
|
169
|
+
const context = React.useContext(SignerContext);
|
|
170
|
+
capturedContext = context;
|
|
171
|
+
return null;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
render(
|
|
175
|
+
<MidenFiSignerProvider>
|
|
176
|
+
<TestConsumer />
|
|
177
|
+
</MidenFiSignerProvider>
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
await act(async () => {
|
|
181
|
+
await flushPromises();
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
expect(capturedContext).not.toBeNull();
|
|
185
|
+
expect(capturedContext.isConnected).toBe(false);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('signCb throws when wallet not connected', async () => {
|
|
189
|
+
let capturedContext: any = null;
|
|
190
|
+
const TestConsumer = () => {
|
|
191
|
+
const context = React.useContext(SignerContext);
|
|
192
|
+
capturedContext = context;
|
|
193
|
+
return null;
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
render(
|
|
197
|
+
<MidenFiSignerProvider>
|
|
198
|
+
<TestConsumer />
|
|
199
|
+
</MidenFiSignerProvider>
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
await act(async () => {
|
|
203
|
+
await flushPromises();
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
await expect(
|
|
207
|
+
capturedContext.signCb(new Uint8Array(), new Uint8Array())
|
|
208
|
+
).rejects.toThrow('MidenFi wallet not connected');
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
describe("SignerContext name", () => {
|
|
213
|
+
it("includes correct name ('MidenFi')", async () => {
|
|
214
|
+
let capturedContext: any = null;
|
|
215
|
+
const TestConsumer = () => {
|
|
216
|
+
const context = React.useContext(SignerContext);
|
|
217
|
+
capturedContext = context;
|
|
218
|
+
return null;
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
render(
|
|
222
|
+
<MidenFiSignerProvider>
|
|
223
|
+
<TestConsumer />
|
|
224
|
+
</MidenFiSignerProvider>
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
await act(async () => {
|
|
228
|
+
await flushPromises();
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
expect(capturedContext.name).toBe('MidenFi');
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
describe('useMidenFiWallet hook', () => {
|
|
236
|
+
it('throws when used outside provider', () => {
|
|
237
|
+
const consoleError = vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
238
|
+
|
|
239
|
+
expect(() => {
|
|
240
|
+
renderHook(() => useMidenFiWallet());
|
|
241
|
+
}).toThrow('useMidenFiWallet must be used within MidenFiSignerProvider');
|
|
242
|
+
|
|
243
|
+
consoleError.mockRestore();
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
it('returns wallet context inside provider', () => {
|
|
247
|
+
const { result } = renderHook(() => useMidenFiWallet(), {
|
|
248
|
+
wrapper: ({ children }) => (
|
|
249
|
+
<MidenFiSignerProvider>{children}</MidenFiSignerProvider>
|
|
250
|
+
),
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
expect(result.current).toBeDefined();
|
|
254
|
+
expect(result.current.wallets).toBeDefined();
|
|
255
|
+
expect(result.current.connect).toBeDefined();
|
|
256
|
+
expect(result.current.disconnect).toBeDefined();
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
it('has wallets array with default MidenWalletAdapter', () => {
|
|
260
|
+
const { result } = renderHook(() => useMidenFiWallet(), {
|
|
261
|
+
wrapper: ({ children }) => (
|
|
262
|
+
<MidenFiSignerProvider>{children}</MidenFiSignerProvider>
|
|
263
|
+
),
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
expect(result.current.wallets).toHaveLength(1);
|
|
267
|
+
expect(result.current.wallets[0].adapter.name).toBe('Miden Wallet');
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
it('connected is false initially', () => {
|
|
271
|
+
const { result } = renderHook(() => useMidenFiWallet(), {
|
|
272
|
+
wrapper: ({ children }) => (
|
|
273
|
+
<MidenFiSignerProvider>{children}</MidenFiSignerProvider>
|
|
274
|
+
),
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
expect(result.current.connected).toBe(false);
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
it('has select function', () => {
|
|
281
|
+
const { result } = renderHook(() => useMidenFiWallet(), {
|
|
282
|
+
wrapper: ({ children }) => (
|
|
283
|
+
<MidenFiSignerProvider>{children}</MidenFiSignerProvider>
|
|
284
|
+
),
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
expect(typeof result.current.select).toBe('function');
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
it('autoConnect defaults to true', () => {
|
|
291
|
+
const { result } = renderHook(() => useMidenFiWallet(), {
|
|
292
|
+
wrapper: ({ children }) => (
|
|
293
|
+
<MidenFiSignerProvider>{children}</MidenFiSignerProvider>
|
|
294
|
+
),
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
expect(result.current.autoConnect).toBe(true);
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
it('autoConnect can be set to false', () => {
|
|
301
|
+
const { result } = renderHook(() => useMidenFiWallet(), {
|
|
302
|
+
wrapper: ({ children }) => (
|
|
303
|
+
<MidenFiSignerProvider autoConnect={false}>{children}</MidenFiSignerProvider>
|
|
304
|
+
),
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
expect(result.current.autoConnect).toBe(false);
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
describe('SignerContext connect/disconnect', () => {
|
|
312
|
+
it('SignerContext has connect function', async () => {
|
|
313
|
+
let capturedContext: any = null;
|
|
314
|
+
const TestConsumer = () => {
|
|
315
|
+
const context = React.useContext(SignerContext);
|
|
316
|
+
capturedContext = context;
|
|
317
|
+
return null;
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
render(
|
|
321
|
+
<MidenFiSignerProvider>
|
|
322
|
+
<TestConsumer />
|
|
323
|
+
</MidenFiSignerProvider>
|
|
324
|
+
);
|
|
325
|
+
|
|
326
|
+
await act(async () => {
|
|
327
|
+
await flushPromises();
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
expect(typeof capturedContext.connect).toBe('function');
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
it('SignerContext has disconnect function', async () => {
|
|
334
|
+
let capturedContext: any = null;
|
|
335
|
+
const TestConsumer = () => {
|
|
336
|
+
const context = React.useContext(SignerContext);
|
|
337
|
+
capturedContext = context;
|
|
338
|
+
return null;
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
render(
|
|
342
|
+
<MidenFiSignerProvider>
|
|
343
|
+
<TestConsumer />
|
|
344
|
+
</MidenFiSignerProvider>
|
|
345
|
+
);
|
|
346
|
+
|
|
347
|
+
await act(async () => {
|
|
348
|
+
await flushPromises();
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
expect(typeof capturedContext.disconnect).toBe('function');
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
describe('accountConfig', () => {
|
|
356
|
+
it('accountType is RegularAccountImmutableCode when connected', async () => {
|
|
357
|
+
// Create a connected adapter
|
|
358
|
+
mockAdapter = createMockAdapter({
|
|
359
|
+
connected: true,
|
|
360
|
+
publicKey: new Uint8Array(32).fill(0x42),
|
|
361
|
+
address: '0xtest-address',
|
|
362
|
+
readyState: 'Installed',
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
let capturedContext: any = null;
|
|
366
|
+
const TestConsumer = () => {
|
|
367
|
+
const context = React.useContext(SignerContext);
|
|
368
|
+
capturedContext = context;
|
|
369
|
+
return null;
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
render(
|
|
373
|
+
<MidenFiSignerProvider>
|
|
374
|
+
<TestConsumer />
|
|
375
|
+
</MidenFiSignerProvider>
|
|
376
|
+
);
|
|
377
|
+
|
|
378
|
+
// Auto-select single wallet
|
|
379
|
+
await act(async () => {
|
|
380
|
+
await flushPromises();
|
|
381
|
+
await flushPromises();
|
|
382
|
+
await flushPromises();
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
if (capturedContext?.accountConfig) {
|
|
386
|
+
expect(capturedContext.accountConfig.accountType).toBe(
|
|
387
|
+
'RegularAccountImmutableCode'
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
describe('storeName', () => {
|
|
394
|
+
it('uses midenfi_ prefix for database isolation', async () => {
|
|
395
|
+
mockAdapter = createMockAdapter({
|
|
396
|
+
connected: true,
|
|
397
|
+
publicKey: new Uint8Array(32),
|
|
398
|
+
address: '0xunique-address',
|
|
399
|
+
readyState: 'Installed',
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
let capturedContext: any = null;
|
|
403
|
+
const TestConsumer = () => {
|
|
404
|
+
const context = React.useContext(SignerContext);
|
|
405
|
+
capturedContext = context;
|
|
406
|
+
return null;
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
render(
|
|
410
|
+
<MidenFiSignerProvider>
|
|
411
|
+
<TestConsumer />
|
|
412
|
+
</MidenFiSignerProvider>
|
|
413
|
+
);
|
|
414
|
+
|
|
415
|
+
await act(async () => {
|
|
416
|
+
await flushPromises();
|
|
417
|
+
await flushPromises();
|
|
418
|
+
await flushPromises();
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
if (capturedContext?.storeName && capturedContext.storeName !== '') {
|
|
422
|
+
expect(capturedContext.storeName).toContain('midenfi_');
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
});
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { type FC, type ReactNode } from 'react';
|
|
2
|
+
import { type Adapter, AllowedPrivateData, type MessageSignerWalletAdapterProps, PrivateDataPermission, WalletAdapterNetwork, WalletError, type WalletName, WalletReadyState } from '@miden-sdk/miden-wallet-adapter-base';
|
|
3
|
+
export interface Wallet {
|
|
4
|
+
adapter: Adapter;
|
|
5
|
+
readyState: WalletReadyState;
|
|
6
|
+
}
|
|
7
|
+
export interface WalletContextState {
|
|
8
|
+
autoConnect: boolean;
|
|
9
|
+
wallets: Wallet[];
|
|
10
|
+
wallet: Wallet | null;
|
|
11
|
+
address: string | null;
|
|
12
|
+
publicKey: Uint8Array | null;
|
|
13
|
+
connected: boolean;
|
|
14
|
+
connecting: boolean;
|
|
15
|
+
disconnecting: boolean;
|
|
16
|
+
select(walletName: WalletName): void;
|
|
17
|
+
connect(): Promise<void>;
|
|
18
|
+
disconnect(): Promise<void>;
|
|
19
|
+
requestTransaction?: MessageSignerWalletAdapterProps['requestTransaction'];
|
|
20
|
+
requestAssets?: MessageSignerWalletAdapterProps['requestAssets'];
|
|
21
|
+
requestPrivateNotes?: MessageSignerWalletAdapterProps['requestPrivateNotes'];
|
|
22
|
+
signBytes?: MessageSignerWalletAdapterProps['signBytes'];
|
|
23
|
+
importPrivateNote?: MessageSignerWalletAdapterProps['importPrivateNote'];
|
|
24
|
+
requestConsumableNotes?: MessageSignerWalletAdapterProps['requestConsumableNotes'];
|
|
25
|
+
waitForTransaction?: MessageSignerWalletAdapterProps['waitForTransaction'];
|
|
26
|
+
requestSend?: MessageSignerWalletAdapterProps['requestSend'];
|
|
27
|
+
requestConsume?: MessageSignerWalletAdapterProps['requestConsume'];
|
|
28
|
+
}
|
|
29
|
+
declare const WalletContext: import("react").Context<WalletContextState>;
|
|
30
|
+
export interface MidenFiSignerProviderProps {
|
|
31
|
+
children: ReactNode;
|
|
32
|
+
/** Wallet adapters to use. Defaults to [MidenWalletAdapter] */
|
|
33
|
+
wallets?: Adapter[];
|
|
34
|
+
/** App name passed to the default MidenWalletAdapter */
|
|
35
|
+
appName?: string;
|
|
36
|
+
/** Network to connect to */
|
|
37
|
+
network?: WalletAdapterNetwork;
|
|
38
|
+
/** Auto-connect to previously selected wallet on mount. Defaults to true */
|
|
39
|
+
autoConnect?: boolean;
|
|
40
|
+
/** Private data permission level */
|
|
41
|
+
privateDataPermission?: PrivateDataPermission;
|
|
42
|
+
/** Allowed private data types */
|
|
43
|
+
allowedPrivateData?: AllowedPrivateData;
|
|
44
|
+
/** Error handler */
|
|
45
|
+
onError?: (error: WalletError) => void;
|
|
46
|
+
/** LocalStorage key for persisting wallet selection */
|
|
47
|
+
localStorageKey?: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* MidenFiSignerProvider bridges the MidenFi wallet with MidenProvider.
|
|
51
|
+
*
|
|
52
|
+
* This is a unified provider that handles both wallet connection and signer context.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```tsx
|
|
56
|
+
* // Simplest usage - uses MidenWalletAdapter by default
|
|
57
|
+
* <MidenFiSignerProvider>
|
|
58
|
+
* <MidenProvider config={{ rpcUrl: "testnet" }}>
|
|
59
|
+
* <App />
|
|
60
|
+
* </MidenProvider>
|
|
61
|
+
* </MidenFiSignerProvider>
|
|
62
|
+
*
|
|
63
|
+
* // With custom options
|
|
64
|
+
* <MidenFiSignerProvider
|
|
65
|
+
* appName="My DApp"
|
|
66
|
+
* network={WalletAdapterNetwork.Testnet}
|
|
67
|
+
* autoConnect={true}
|
|
68
|
+
* >
|
|
69
|
+
* <MidenProvider config={{ rpcUrl: "testnet" }}>
|
|
70
|
+
* <App />
|
|
71
|
+
* </MidenProvider>
|
|
72
|
+
* </MidenFiSignerProvider>
|
|
73
|
+
*
|
|
74
|
+
* // With custom wallets
|
|
75
|
+
* <MidenFiSignerProvider wallets={[new CustomWalletAdapter()]}>
|
|
76
|
+
* <MidenProvider config={{ rpcUrl: "testnet" }}>
|
|
77
|
+
* <App />
|
|
78
|
+
* </MidenProvider>
|
|
79
|
+
* </MidenFiSignerProvider>
|
|
80
|
+
* ```
|
|
81
|
+
*
|
|
82
|
+
* For wallet operations, use the useMidenFiWallet hook:
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```tsx
|
|
86
|
+
* const { connected, connect, disconnect, select, wallets } = useMidenFiWallet();
|
|
87
|
+
*
|
|
88
|
+
* // If multiple wallets, select one first
|
|
89
|
+
* select(wallets[0].adapter.name);
|
|
90
|
+
*
|
|
91
|
+
* // Then connect
|
|
92
|
+
* await connect();
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export declare const MidenFiSignerProvider: FC<MidenFiSignerProviderProps>;
|
|
96
|
+
/**
|
|
97
|
+
* Hook for MidenFi wallet operations beyond the unified useSigner interface.
|
|
98
|
+
* Use this to access wallet-specific methods like requestTransaction, requestAssets, etc.
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```tsx
|
|
102
|
+
* const { connected, connect, disconnect, wallets, select } = useMidenFiWallet();
|
|
103
|
+
*
|
|
104
|
+
* // Connect
|
|
105
|
+
* await connect();
|
|
106
|
+
*
|
|
107
|
+
* // Request a transaction
|
|
108
|
+
* const txId = await requestTransaction({ ... });
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export declare function useMidenFiWallet(): WalletContextState;
|
|
112
|
+
export { WalletContext };
|
|
113
|
+
export type { WalletContextState as MidenFiWalletContextState };
|