@reown/appkit-adapter-bitcoin 1.6.3 → 1.6.4-rc.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.
Files changed (39) hide show
  1. package/dist/esm/tests/BitcoinAdapter.test.js +371 -0
  2. package/dist/esm/tests/BitcoinAdapter.test.js.map +1 -0
  3. package/dist/esm/tests/connectors/LeatherConnector.test.js +138 -0
  4. package/dist/esm/tests/connectors/LeatherConnector.test.js.map +1 -0
  5. package/dist/esm/tests/connectors/OKXConnector.test.js +157 -0
  6. package/dist/esm/tests/connectors/OKXConnector.test.js.map +1 -0
  7. package/dist/esm/tests/connectors/SatsConnectConnector.test.js +240 -0
  8. package/dist/esm/tests/connectors/SatsConnectConnector.test.js.map +1 -0
  9. package/dist/esm/tests/connectors/WalletStandardConnector.test.js +297 -0
  10. package/dist/esm/tests/connectors/WalletStandardConnector.test.js.map +1 -0
  11. package/dist/esm/tests/mocks/mockSatsConnect.js +60 -0
  12. package/dist/esm/tests/mocks/mockSatsConnect.js.map +1 -0
  13. package/dist/esm/tests/mocks/mockUTXO.js +15 -0
  14. package/dist/esm/tests/mocks/mockUTXO.js.map +1 -0
  15. package/dist/esm/tests/mocks/mockUniversalProvider.js +54 -0
  16. package/dist/esm/tests/mocks/mockUniversalProvider.js.map +1 -0
  17. package/dist/esm/tests/mocks/mockWalletStandard.js +47 -0
  18. package/dist/esm/tests/mocks/mockWalletStandard.js.map +1 -0
  19. package/dist/esm/tests/utils/BitcoinApi.test.js +48 -0
  20. package/dist/esm/tests/utils/BitcoinApi.test.js.map +1 -0
  21. package/dist/esm/tests/utils/UnitsUtils.test.js +21 -0
  22. package/dist/esm/tests/utils/UnitsUtils.test.js.map +1 -0
  23. package/dist/esm/tests/utils/WalletConnectProvider.test.js +274 -0
  24. package/dist/esm/tests/utils/WalletConnectProvider.test.js.map +1 -0
  25. package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
  26. package/dist/esm/tsconfig.tsbuildinfo +1 -0
  27. package/dist/types/tests/BitcoinAdapter.test.d.ts +1 -0
  28. package/dist/types/tests/connectors/LeatherConnector.test.d.ts +1 -0
  29. package/dist/types/tests/connectors/OKXConnector.test.d.ts +1 -0
  30. package/dist/types/tests/connectors/SatsConnectConnector.test.d.ts +1 -0
  31. package/dist/types/tests/connectors/WalletStandardConnector.test.d.ts +1 -0
  32. package/dist/types/tests/mocks/mockSatsConnect.d.ts +27 -0
  33. package/dist/types/tests/mocks/mockUTXO.d.ts +2 -0
  34. package/dist/types/tests/mocks/mockUniversalProvider.d.ts +6 -0
  35. package/dist/types/tests/mocks/mockWalletStandard.d.ts +7 -0
  36. package/dist/types/tests/utils/BitcoinApi.test.d.ts +1 -0
  37. package/dist/types/tests/utils/UnitsUtils.test.d.ts +1 -0
  38. package/dist/types/tests/utils/WalletConnectProvider.test.d.ts +1 -0
  39. package/package.json +4 -4
@@ -0,0 +1,371 @@
1
+ import { beforeEach, describe, it, vi, expect } from 'vitest';
2
+ import { BitcoinAdapter } from '../src';
3
+ import { bitcoin, mainnet } from '@reown/appkit/networks';
4
+ import { mockUTXO } from './mocks/mockUTXO';
5
+ import { SatsConnectConnector } from '../src/connectors/SatsConnectConnector';
6
+ import { mockSatsConnectProvider } from './mocks/mockSatsConnect';
7
+ import { WalletStandardConnector } from '../src/connectors/WalletStandardConnector';
8
+ import { OKXConnector } from '../src/connectors/OKXConnector';
9
+ import { LeatherConnector } from '../src/connectors/LeatherConnector';
10
+ import { WalletConnectProvider } from '../src/utils/WalletConnectProvider';
11
+ function mockBitcoinApi() {
12
+ return {
13
+ getUTXOs: vi.fn(async () => [])
14
+ };
15
+ }
16
+ describe('BitcoinAdapter', () => {
17
+ let adapter;
18
+ let api;
19
+ beforeEach(() => {
20
+ api = mockBitcoinApi();
21
+ adapter = new BitcoinAdapter({ api, networks: [bitcoin] });
22
+ });
23
+ describe('connectWalletConnect', () => {
24
+ const mockWalletConnect = {
25
+ type: 'WALLET_CONNECT',
26
+ provider: {
27
+ on: vi.fn(),
28
+ connect: vi.fn()
29
+ }
30
+ };
31
+ beforeEach(() => {
32
+ adapter.connectors.push(mockWalletConnect);
33
+ });
34
+ it('should call connect from WALLET_CONNECT connector', async () => {
35
+ const onUri = vi.fn();
36
+ await adapter.connectWalletConnect(onUri);
37
+ mockWalletConnect.provider.on.mock.calls.find(([name]) => name === 'display_uri')[1]('mock_uri');
38
+ expect(onUri).toHaveBeenCalled();
39
+ expect(mockWalletConnect.provider.connect).toHaveBeenCalled();
40
+ });
41
+ it('should throw if caipNetworks is not defined', async () => {
42
+ adapter = new BitcoinAdapter({ api });
43
+ await expect(adapter.connectWalletConnect(vi.fn())).rejects.toThrow();
44
+ });
45
+ });
46
+ describe('connect', () => {
47
+ it('should return the chainId of the available chain from connector', async () => {
48
+ const connector = new SatsConnectConnector({
49
+ provider: mockSatsConnectProvider().provider,
50
+ requestedChains: [bitcoin],
51
+ getActiveNetwork: () => bitcoin
52
+ });
53
+ vi.spyOn(connector, 'connect').mockResolvedValueOnce('mock_address');
54
+ adapter.connectors.push(connector);
55
+ const result = await adapter.connect({
56
+ id: connector.id,
57
+ chainId: 'bitcoin:any_chain_id',
58
+ provider: connector.provider,
59
+ type: 'mock_type'
60
+ });
61
+ expect(result).toEqual({
62
+ id: connector.id,
63
+ type: connector.type,
64
+ address: 'mock_address',
65
+ chainId: bitcoin.id,
66
+ provider: connector.provider
67
+ });
68
+ });
69
+ it('should throw if connector is not found', async () => {
70
+ await expect(adapter.connect({ id: 'invalid_id', type: 'invalid_type' })).rejects.toThrow();
71
+ });
72
+ it('should throw if chain is not found', async () => {
73
+ const connector = new SatsConnectConnector({
74
+ provider: mockSatsConnectProvider().provider,
75
+ requestedChains: [bitcoin],
76
+ getActiveNetwork: () => bitcoin
77
+ });
78
+ vi.spyOn(connector, 'connect').mockResolvedValueOnce('mock_address');
79
+ vi.spyOn(connector, 'chains', 'get').mockReturnValue([]);
80
+ adapter.connectors.push(connector);
81
+ await expect(adapter.connect({ id: connector.id, type: connector.type, chainId: 'invalid_chain_id' })).rejects.toThrow();
82
+ });
83
+ });
84
+ describe('getAccounts', () => {
85
+ let connector;
86
+ beforeEach(() => {
87
+ connector = new SatsConnectConnector({
88
+ provider: mockSatsConnectProvider().provider,
89
+ requestedChains: [bitcoin],
90
+ getActiveNetwork: () => bitcoin
91
+ });
92
+ adapter.connectors.push(connector);
93
+ });
94
+ it('should return the accounts', async () => {
95
+ vi.spyOn(connector, 'getAccountAddresses').mockResolvedValueOnce([
96
+ { address: 'mock_address_1', purpose: 'payment' },
97
+ { address: 'mock_address_2', purpose: 'ordinal' },
98
+ { address: 'mock_address_3', purpose: 'stx' }
99
+ ]);
100
+ const accounts = await adapter.getAccounts({ id: connector.id });
101
+ expect(accounts).toEqual({
102
+ accounts: [
103
+ { address: 'mock_address_1', type: 'payment', namespace: 'bip122' },
104
+ { address: 'mock_address_2', type: 'ordinal', namespace: 'bip122' },
105
+ { address: 'mock_address_3', type: 'stx', namespace: 'bip122' }
106
+ ]
107
+ });
108
+ });
109
+ it('should return empty accounts if no addresses', async () => {
110
+ const connector = new SatsConnectConnector({
111
+ provider: mockSatsConnectProvider().provider,
112
+ requestedChains: [bitcoin],
113
+ getActiveNetwork: () => bitcoin
114
+ });
115
+ vi.spyOn(connector, 'getAccountAddresses').mockResolvedValueOnce([]);
116
+ adapter.connectors.push(connector);
117
+ const accounts = await adapter.getAccounts({ id: connector.id });
118
+ expect(accounts).toEqual({ accounts: [] });
119
+ });
120
+ it('should return empty accounts if connector is not found', async () => {
121
+ const accounts = await adapter.getAccounts({ id: 'invalid_id' });
122
+ expect(accounts).toEqual({ accounts: [] });
123
+ });
124
+ it('should return empty accounts if connector.getAccountsAddresses throws', async () => {
125
+ vi.spyOn(connector, 'getAccountAddresses').mockRejectedValueOnce(new Error('mock_error'));
126
+ const accounts = await adapter.getAccounts({ id: connector.id });
127
+ expect(accounts).toEqual({ accounts: [] });
128
+ });
129
+ it('should attach payment type if purpose is not found', async () => {
130
+ vi.spyOn(connector, 'getAccountAddresses').mockResolvedValueOnce([
131
+ { address: 'mock_address' }
132
+ ]);
133
+ const accounts = await adapter.getAccounts({ id: connector.id });
134
+ expect(accounts).toEqual({
135
+ accounts: [{ address: 'mock_address', type: 'payment', namespace: 'bip122' }]
136
+ });
137
+ });
138
+ });
139
+ describe('syncConnectors', () => {
140
+ it('should get wallets from all the available connectors', () => {
141
+ const walletStandardConnectorSpy = vi.spyOn(WalletStandardConnector, 'watchWallets');
142
+ const satsConnectConnectorSpy = vi.spyOn(SatsConnectConnector, 'getWallets');
143
+ const okxConnectorSpy = vi.spyOn(OKXConnector, 'getWallet');
144
+ adapter.syncConnectors(undefined, undefined);
145
+ expect(walletStandardConnectorSpy).toHaveBeenCalled();
146
+ expect(satsConnectConnectorSpy).toHaveBeenCalled();
147
+ expect(okxConnectorSpy).toHaveBeenCalled();
148
+ });
149
+ it('should add connectors from SatsConnectConnector', () => {
150
+ mockSatsConnectProvider();
151
+ adapter.syncConnectors(undefined, undefined);
152
+ expect(adapter.connectors).toHaveLength(1);
153
+ expect(adapter.connectors[0]).toBeInstanceOf(SatsConnectConnector);
154
+ });
155
+ it('should map LeatherConnector', () => {
156
+ mockSatsConnectProvider({ id: LeatherConnector.ProviderId, name: 'Leather' });
157
+ adapter.syncConnectors(undefined, undefined);
158
+ expect(adapter.connectors[1]).toBeInstanceOf(LeatherConnector);
159
+ });
160
+ it('should add OKXConnector', () => {
161
+ ;
162
+ window.okxwallet = { bitcoin: { connect: vi.fn() } };
163
+ adapter.syncConnectors(undefined, undefined);
164
+ expect(adapter.connectors[0]).toBeInstanceOf(OKXConnector);
165
+ });
166
+ it('should pass correct getActiveNetwork to SatsConnectConnector', () => {
167
+ const mocks = mockSatsConnectProvider({ id: LeatherConnector.ProviderId, name: 'Leather' });
168
+ const getCaipNetwork = vi.fn(() => bitcoin);
169
+ adapter.syncConnectors(undefined, { getCaipNetwork });
170
+ vi.spyOn(mocks.wallet, 'request').mockResolvedValueOnce(mockSatsConnectProvider.mockRequestResolve({ hex: 'mock_hex', txid: 'mock_txid' }));
171
+ const connector = adapter.connectors.find(c => c instanceof LeatherConnector);
172
+ connector.signPSBT({ psbt: 'mock_psbt', signInputs: [] });
173
+ expect(getCaipNetwork).toHaveBeenCalled();
174
+ });
175
+ });
176
+ describe('syncConnection', () => {
177
+ it('should forward the call to connect', async () => {
178
+ const connectSpy = vi.spyOn(adapter, 'connect').mockResolvedValueOnce({
179
+ id: 'mock_id',
180
+ type: 'ANNOUNCED',
181
+ address: 'mock_address',
182
+ chainId: 'mock_chain_id',
183
+ provider: undefined
184
+ });
185
+ await adapter.syncConnection({
186
+ id: 'mock_id',
187
+ chainId: 'mock_chain_id',
188
+ namespace: 'bip122',
189
+ rpcUrl: 'mock_rpc_url'
190
+ });
191
+ expect(connectSpy).toHaveBeenCalledWith({ id: 'mock_id', chainId: 'mock_chain_id', type: '' });
192
+ });
193
+ });
194
+ describe('getBalance', () => {
195
+ it('should return the balance', async () => {
196
+ api.getUTXOs.mockResolvedValueOnce([
197
+ mockUTXO({ value: 10000 }),
198
+ mockUTXO({ value: 20000 }),
199
+ mockUTXO({ value: 30000 }),
200
+ mockUTXO({ value: 10000000000 })
201
+ ]);
202
+ const balance = await adapter.getBalance({
203
+ address: 'mock_address',
204
+ chainId: bitcoin.id,
205
+ caipNetwork: bitcoin
206
+ });
207
+ expect(balance).toEqual({
208
+ balance: '100.0006',
209
+ symbol: 'BTC'
210
+ });
211
+ });
212
+ it('should return empty balance if no UTXOs', async () => {
213
+ api.getUTXOs.mockResolvedValueOnce([]);
214
+ const balance = await adapter.getBalance({
215
+ address: 'mock_address',
216
+ chainId: bitcoin.id,
217
+ caipNetwork: bitcoin
218
+ });
219
+ expect(balance).toEqual({
220
+ balance: '0',
221
+ symbol: 'BTC'
222
+ });
223
+ });
224
+ it('should return empty balance if chain is not bip122', async () => {
225
+ const balance = await adapter.getBalance({
226
+ address: 'mock_address',
227
+ chainId: mainnet.id,
228
+ caipNetwork: mainnet
229
+ });
230
+ expect(balance).toEqual({
231
+ balance: '0',
232
+ symbol: bitcoin.nativeCurrency.symbol
233
+ });
234
+ });
235
+ it('should return empty balance if chain is not provided', async () => {
236
+ const balance = await adapter.getBalance({
237
+ address: 'mock_address',
238
+ chainId: 'mock_chain_id'
239
+ });
240
+ expect(balance).toEqual({
241
+ balance: '0',
242
+ symbol: bitcoin.nativeCurrency.symbol
243
+ });
244
+ });
245
+ });
246
+ describe('signMessage', async () => {
247
+ let connector;
248
+ beforeEach(() => {
249
+ connector = new SatsConnectConnector({
250
+ provider: mockSatsConnectProvider().provider,
251
+ requestedChains: [bitcoin],
252
+ getActiveNetwork: () => bitcoin
253
+ });
254
+ });
255
+ it('should return the signature', async () => {
256
+ vi.spyOn(connector, 'signMessage').mockResolvedValueOnce('mock_signature');
257
+ const result = await adapter.signMessage({
258
+ message: 'mock_message',
259
+ address: 'mock_address',
260
+ provider: connector.provider
261
+ });
262
+ expect(result).toEqual({ signature: 'mock_signature' });
263
+ });
264
+ it('should throw if connector is not found', async () => {
265
+ await expect(adapter.signMessage({
266
+ address: 'mock_address',
267
+ message: 'mock_message',
268
+ provider: undefined
269
+ })).rejects.toThrow();
270
+ });
271
+ });
272
+ describe('getWalletConnectProvider', () => {
273
+ it('should return the wallet connect provider', () => {
274
+ const provider = adapter.getWalletConnectProvider({
275
+ activeCaipNetwork: bitcoin,
276
+ caipNetworks: [bitcoin],
277
+ provider: undefined
278
+ });
279
+ expect(provider).toBeInstanceOf(WalletConnectProvider);
280
+ });
281
+ });
282
+ describe('disconnect', () => {
283
+ it('should disconnect using param provider', async () => {
284
+ const connector = new SatsConnectConnector({
285
+ provider: mockSatsConnectProvider().provider,
286
+ requestedChains: [bitcoin],
287
+ getActiveNetwork: () => bitcoin
288
+ });
289
+ vi.spyOn(connector, 'disconnect');
290
+ adapter.connectors.push(connector);
291
+ await adapter.disconnect({ provider: connector });
292
+ expect(connector.disconnect).toHaveBeenCalled();
293
+ });
294
+ it('should disconnect using connector from class', async () => {
295
+ const mocks = mockSatsConnectProvider();
296
+ const connector = new SatsConnectConnector({
297
+ provider: mocks.provider,
298
+ requestedChains: [bitcoin],
299
+ getActiveNetwork: () => bitcoin
300
+ });
301
+ vi.spyOn(connector, 'disconnect');
302
+ vi.spyOn(connector, 'getAccountAddresses').mockResolvedValueOnce([
303
+ { address: 'mock_address', purpose: 'payment' }
304
+ ]);
305
+ adapter.connectors.push(connector);
306
+ await adapter.connect({ id: connector.id, chainId: bitcoin.id, type: '' });
307
+ await adapter.disconnect({});
308
+ expect(connector.disconnect).toHaveBeenCalled();
309
+ });
310
+ });
311
+ describe('connector events', () => {
312
+ let mocks;
313
+ const listeners = {
314
+ accountChanged: vi.fn(),
315
+ disconnect: vi.fn(),
316
+ switchNetwork: vi.fn()
317
+ };
318
+ beforeEach(async () => {
319
+ mocks = mockSatsConnectProvider();
320
+ adapter.syncConnectors();
321
+ vi.spyOn(mocks.wallet, 'request').mockResolvedValue(mockSatsConnectProvider.mockRequestResolve({
322
+ addresses: [{ address: 'mock_address' }]
323
+ }));
324
+ listeners.accountChanged = vi.fn(() => console.log('meu pau'));
325
+ adapter.on('accountChanged', listeners.accountChanged);
326
+ listeners.disconnect = vi.fn();
327
+ adapter.on('disconnect', listeners.disconnect);
328
+ listeners.switchNetwork = vi.fn();
329
+ adapter.on('switchNetwork', listeners.switchNetwork);
330
+ await adapter.connect({
331
+ id: mocks.provider.name,
332
+ chainId: bitcoin.id,
333
+ type: ''
334
+ });
335
+ });
336
+ it('should have bound events', () => {
337
+ expect(mocks.wallet.addListener).toHaveBeenCalledWith('accountChange', expect.any(Function));
338
+ expect(mocks.wallet.addListener).toHaveBeenCalledWith('disconnect', expect.any(Function));
339
+ expect(mocks.wallet.addListener).toHaveBeenCalledWith('networkChange', expect.any(Function));
340
+ });
341
+ it('should emit accountsChanged on accountChange', async () => {
342
+ const callback = mocks.wallet.addListener.mock.calls.find(([name]) => name === 'accountChange')[1];
343
+ await callback({ type: 'accountChange' });
344
+ expect(listeners.accountChanged).toHaveBeenCalled();
345
+ });
346
+ it('should emit disconnect on disconnect', () => {
347
+ const callback = mocks.wallet.addListener.mock.calls.find(([name]) => name === 'disconnect')[1];
348
+ callback({ type: 'disconnect' });
349
+ expect(listeners.disconnect).toHaveBeenCalled();
350
+ });
351
+ it('should emit switchNetwork on networkChange', () => {
352
+ const callback = mocks.wallet.addListener.mock.calls.find(([name]) => name === 'networkChange')[1];
353
+ callback({ type: 'networkChange' });
354
+ expect(listeners.switchNetwork).toHaveBeenCalled();
355
+ });
356
+ });
357
+ it('should not throw for not used methods', async () => {
358
+ expect(await adapter.getProfile({})).toEqual({});
359
+ expect(await adapter.estimateGas({})).toEqual({});
360
+ expect(await adapter.sendTransaction({})).toEqual({});
361
+ expect(await adapter.writeContract({})).toEqual({});
362
+ expect(await adapter.getEnsAddress({})).toEqual({});
363
+ expect(adapter.parseUnits({})).toEqual(BigInt(0));
364
+ expect(adapter.formatUnits({})).toEqual('');
365
+ expect(await adapter.grantPermissions({})).toEqual({});
366
+ expect(await adapter.getCapabilities({})).toEqual({});
367
+ expect(await adapter.revokePermissions({})).toEqual('0x');
368
+ await expect(adapter.switchNetwork({})).resolves.toBeUndefined();
369
+ });
370
+ });
371
+ //# sourceMappingURL=BitcoinAdapter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BitcoinAdapter.test.js","sourceRoot":"","sources":["../../../tests/BitcoinAdapter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { SatsConnectConnector } from '../../src/connectors/SatsConnectConnector';
3
+ import { mockSatsConnectProvider } from '../mocks/mockSatsConnect';
4
+ import { LeatherConnector } from '../../src/connectors/LeatherConnector';
5
+ import { bitcoin, bitcoinTestnet } from '@reown/appkit/networks';
6
+ describe('LeatherConnector', () => {
7
+ let satsConnectConnector;
8
+ let connector;
9
+ let mocks;
10
+ let requestedChains;
11
+ let getActiveNetwork;
12
+ beforeEach(() => {
13
+ requestedChains = [];
14
+ getActiveNetwork = vi.fn(() => bitcoin);
15
+ mocks = mockSatsConnectProvider({ id: 'LeatherProvider' });
16
+ satsConnectConnector = new SatsConnectConnector({
17
+ provider: mocks.provider,
18
+ requestedChains,
19
+ getActiveNetwork
20
+ });
21
+ connector = new LeatherConnector({ connector: satsConnectConnector });
22
+ });
23
+ it('should throw an error if the wallet is not a LeatherProvider', () => {
24
+ mocks = mockSatsConnectProvider({ id: 'NotLeatherProvider' });
25
+ satsConnectConnector = new SatsConnectConnector({
26
+ provider: mocks.provider,
27
+ requestedChains,
28
+ getActiveNetwork
29
+ });
30
+ expect(() => {
31
+ new LeatherConnector({ connector: satsConnectConnector });
32
+ }).toThrowError('LeatherConnector: wallet must be a LeatherProvider');
33
+ });
34
+ it('should create a new instance', () => {
35
+ expect(connector).toBeDefined();
36
+ expect(connector).toBeInstanceOf(LeatherConnector);
37
+ expect(connector).toBeInstanceOf(SatsConnectConnector);
38
+ });
39
+ it('should send a transfer', async () => {
40
+ const txid = 'txid';
41
+ const requestSpy = vi.spyOn(mocks.wallet, 'request');
42
+ requestSpy.mockResolvedValue(mockSatsConnectProvider.mockRequestResolve({ txid }));
43
+ const res = await connector.sendTransfer({ amount: '100', recipient: 'address' });
44
+ expect(res).toBe(txid);
45
+ expect(requestSpy).toHaveBeenCalledWith('sendTransfer', { address: 'address', amount: '100' });
46
+ });
47
+ it('should sign a PSBT', async () => {
48
+ const psbt = 'psbt';
49
+ const txid = 'txid';
50
+ const requestSpy = vi.spyOn(mocks.wallet, 'request');
51
+ requestSpy.mockResolvedValue(mockSatsConnectProvider.mockRequestResolve({ hex: '70736274', txid }));
52
+ const res = await connector.signPSBT({ psbt, signInputs: [], broadcast: true });
53
+ expect(res).toEqual({ psbt: 'cHNidA==', txid });
54
+ expect(requestSpy).toHaveBeenCalledWith('signPsbt', {
55
+ hex: 'a6c6ed',
56
+ network: 'mainnet',
57
+ broadcast: true
58
+ });
59
+ });
60
+ it('should sign a PSBT for testnet', async () => {
61
+ getActiveNetwork.mockReturnValueOnce(bitcoinTestnet);
62
+ const psbt = 'psbt';
63
+ const txid = 'txid';
64
+ const requestSpy = vi.spyOn(mocks.wallet, 'request');
65
+ requestSpy.mockResolvedValue(mockSatsConnectProvider.mockRequestResolve({ hex: '70736274', txid }));
66
+ const res = await connector.signPSBT({ psbt, signInputs: [], broadcast: true });
67
+ expect(res).toEqual({ psbt: 'cHNidA==', txid });
68
+ expect(requestSpy).toHaveBeenCalledWith('signPsbt', {
69
+ hex: 'a6c6ed',
70
+ network: 'testnet',
71
+ broadcast: true
72
+ });
73
+ });
74
+ it('should throw an error if the network is unsupported', async () => {
75
+ getActiveNetwork.mockReturnValueOnce(undefined);
76
+ const psbt = 'psbt';
77
+ const txid = 'txid';
78
+ const requestSpy = vi.spyOn(mocks.wallet, 'request');
79
+ requestSpy.mockResolvedValue(mockSatsConnectProvider.mockRequestResolve({ hex: '70736274', txid }));
80
+ await expect(connector.signPSBT({ psbt, signInputs: [], broadcast: true })).rejects.toThrowError('LeatherConnector: unsupported network');
81
+ });
82
+ it('should disconnect', async () => {
83
+ await expect(connector.disconnect()).resolves.not.toThrow();
84
+ });
85
+ it('should keep accounts and reuse if getAccountAddresses is called multiple times', async () => {
86
+ const requestSpy = vi.spyOn(mocks.wallet, 'request');
87
+ requestSpy.mockResolvedValueOnce(mockSatsConnectProvider.mockRequestResolve({
88
+ addresses: [
89
+ {
90
+ address: 'mock_address',
91
+ purpose: 'receive',
92
+ addressType: 'p2pkh',
93
+ gaiaAppKey: 'mock_gaia_app_key',
94
+ gaiaHubUrl: 'mock_gaia_hub_url',
95
+ publicKey: 'mock_public_key'
96
+ }
97
+ ]
98
+ }));
99
+ const addressesFirstCall = await connector.getAccountAddresses();
100
+ const addressesSecondCall = await connector.getAccountAddresses();
101
+ expect(requestSpy).toHaveBeenCalledTimes(1);
102
+ expect(addressesFirstCall).toEqual(addressesSecondCall);
103
+ });
104
+ it('should clean up accounts after disconnection', async () => {
105
+ const requestSpy = vi.spyOn(mocks.wallet, 'request');
106
+ requestSpy.mockResolvedValueOnce(mockSatsConnectProvider.mockRequestResolve({
107
+ addresses: [
108
+ {
109
+ address: 'mock_address',
110
+ purpose: 'receive',
111
+ addressType: 'p2pkh',
112
+ gaiaAppKey: 'mock_gaia_app_key',
113
+ gaiaHubUrl: 'mock_gaia_hub_url',
114
+ publicKey: 'mock_public_key'
115
+ }
116
+ ]
117
+ }));
118
+ const addressesFirstCall = await connector.getAccountAddresses();
119
+ await connector.disconnect();
120
+ requestSpy.mockResolvedValueOnce(mockSatsConnectProvider.mockRequestResolve({
121
+ addresses: [
122
+ {
123
+ address: 'mock_address_2',
124
+ purpose: 'receive',
125
+ addressType: 'p2pkh',
126
+ gaiaAppKey: 'mock_gaia_app_key',
127
+ gaiaHubUrl: 'mock_gaia_hub_url',
128
+ publicKey: 'mock_public_key'
129
+ }
130
+ ]
131
+ }));
132
+ const addressesSecondCall = await connector.getAccountAddresses();
133
+ expect(requestSpy).toHaveBeenCalledTimes(2);
134
+ expect(addressesFirstCall).not.toBe(addressesSecondCall);
135
+ requestSpy.mockRestore();
136
+ });
137
+ });
138
+ //# sourceMappingURL=LeatherConnector.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LeatherConnector.test.js","sourceRoot":"","sources":["../../../../tests/connectors/LeatherConnector.test.ts"],"names":[],"mappings":"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"}