@reown/appkit-adapter-bitcoin 1.6.6 → 1.6.7-basic-test.8.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 +411 -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 +172 -0
  6. package/dist/esm/tests/connectors/OKXConnector.test.js.map +1 -0
  7. package/dist/esm/tests/connectors/SatsConnectConnector.test.js +249 -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 +64 -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 +275 -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 +5 -4
@@ -0,0 +1,172 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { CoreHelperUtil } from '@reown/appkit-core';
3
+ import { bitcoin, bitcoinTestnet } from '@reown/appkit/networks';
4
+ import { OKXConnector } from '../../src/connectors/OKXConnector';
5
+ import { MethodNotSupportedError } from '../../src/errors/MethodNotSupportedError';
6
+ function mockOKXWallet() {
7
+ return {
8
+ connect: vi.fn(() => Promise.resolve({ address: 'mock_address', publicKey: 'publicKey' })),
9
+ disconnect: vi.fn(),
10
+ getAccounts: vi.fn(() => Promise.resolve(['mock_address'])),
11
+ signMessage: vi.fn(() => Promise.resolve('mock_signature')),
12
+ signPsbt: vi.fn(() => Promise.resolve(Buffer.from('mock_psbt').toString('hex'))),
13
+ pushPsbt: vi.fn(() => Promise.resolve('mock_txhash')),
14
+ send: vi.fn(() => Promise.resolve({ txhash: 'mock_txhash' })),
15
+ on: vi.fn(),
16
+ removeAllListeners: vi.fn(),
17
+ getPublicKey: vi.fn(() => Promise.resolve('publicKey'))
18
+ };
19
+ }
20
+ describe('OKXConnector', () => {
21
+ let wallet;
22
+ let requestedChains;
23
+ let connector;
24
+ let getActiveNetwork;
25
+ let imageUrl;
26
+ beforeEach(() => {
27
+ imageUrl = 'mock_image_url';
28
+ requestedChains = [bitcoin, bitcoinTestnet];
29
+ getActiveNetwork = vi.fn(() => bitcoin);
30
+ wallet = mockOKXWallet();
31
+ connector = new OKXConnector({ wallet, requestedChains, getActiveNetwork, imageUrl });
32
+ });
33
+ it('should validate metadata', () => {
34
+ expect(connector.id).toBe('OKX');
35
+ expect(connector.name).toBe('OKX Wallet');
36
+ expect(connector.chain).toBe('bip122');
37
+ expect(connector.type).toBe('ANNOUNCED');
38
+ expect(connector.imageUrl).toBe('mock_image_url');
39
+ });
40
+ it('should return only mainnet chain', () => {
41
+ expect(connector.chains).toEqual([bitcoin]);
42
+ });
43
+ describe('connect', () => {
44
+ it('should connect the wallet', async () => {
45
+ const address = await connector.connect();
46
+ expect(address).toBe('mock_address');
47
+ expect(wallet.connect).toHaveBeenCalled();
48
+ });
49
+ it('should bind events', async () => {
50
+ await connector.connect();
51
+ expect(wallet.removeAllListeners).toHaveBeenCalled();
52
+ expect(wallet.on).toHaveBeenNthCalledWith(1, 'accountChanged', expect.any(Function));
53
+ expect(wallet.on).toHaveBeenNthCalledWith(2, 'disconnect', expect.any(Function));
54
+ });
55
+ });
56
+ describe('disconnect', () => {
57
+ it('should disconnect the wallet', async () => {
58
+ await connector.disconnect();
59
+ expect(wallet.disconnect).toHaveBeenCalled();
60
+ });
61
+ it('should unbind events', async () => {
62
+ await connector.disconnect();
63
+ expect(wallet.removeAllListeners).toHaveBeenCalled();
64
+ });
65
+ });
66
+ describe('getAccountAddresses', () => {
67
+ it('should get account addresses', async () => {
68
+ const accounts = await connector.getAccountAddresses();
69
+ expect(accounts).toEqual([
70
+ { address: 'mock_address', purpose: 'payment', publicKey: 'publicKey' }
71
+ ]);
72
+ expect(wallet.getAccounts).toHaveBeenCalled();
73
+ });
74
+ });
75
+ describe('signMessage', () => {
76
+ it('should sign a message', async () => {
77
+ const signature = await connector.signMessage({ address: 'mock_address', message: 'message' });
78
+ expect(signature).toBe('mock_signature');
79
+ expect(wallet.signMessage).toHaveBeenCalledWith('message');
80
+ });
81
+ });
82
+ describe('sendTransfer', () => {
83
+ it('should send a transfer', async () => {
84
+ const txid = await connector.sendTransfer({ amount: '1500', recipient: 'mock_to_address' });
85
+ expect(txid).toBe('mock_txhash');
86
+ expect(wallet.send).toHaveBeenCalledWith({
87
+ from: 'mock_address',
88
+ to: 'mock_to_address',
89
+ value: '0.000015'
90
+ });
91
+ });
92
+ it('should throw an error if the network is unavailable', async () => {
93
+ getActiveNetwork.mockReturnValueOnce(undefined);
94
+ await expect(connector.sendTransfer({ amount: '1500', recipient: 'mock_to_address' })).rejects.toThrow('No active network available');
95
+ });
96
+ it('should throw an error if no account is available', async () => {
97
+ wallet.getAccounts.mockResolvedValueOnce([]);
98
+ await expect(connector.sendTransfer({ amount: '1500', recipient: 'mock_to_address' })).rejects.toThrow('No account available');
99
+ });
100
+ });
101
+ describe('signPSBT', () => {
102
+ it('should sign a PSBT without broadcast', async () => {
103
+ const result = await connector.signPSBT({
104
+ psbt: Buffer.from('mock_psbt').toString('base64'),
105
+ signInputs: [],
106
+ broadcast: false
107
+ });
108
+ expect(result).toEqual({ psbt: 'bW9ja19wc2J0', txid: undefined });
109
+ });
110
+ it('should sign a PSBT with broadcast', async () => {
111
+ getActiveNetwork.mockReturnValueOnce(bitcoinTestnet);
112
+ const result = await connector.signPSBT({
113
+ psbt: Buffer.from('mock_psbt').toString('base64'),
114
+ signInputs: [],
115
+ broadcast: true
116
+ });
117
+ expect(result).toEqual({ psbt: 'bW9ja19wc2J0', txid: 'mock_txhash' });
118
+ });
119
+ });
120
+ describe('request', () => {
121
+ it('should throw an error because request is not supported', async () => {
122
+ await expect(connector.request({})).rejects.toThrow(MethodNotSupportedError);
123
+ });
124
+ });
125
+ describe('events', () => {
126
+ it('should emit accountChanged event', async () => {
127
+ const listener = vi.fn(account => {
128
+ expect(account).toEqual(['mock_address']);
129
+ });
130
+ connector.on('accountsChanged', listener);
131
+ await connector.connect();
132
+ wallet.on.mock.calls[0][1]({ address: 'mock_address' });
133
+ expect(listener).toHaveBeenCalled();
134
+ });
135
+ it('should emit disconnect event', async () => {
136
+ const listener = vi.fn();
137
+ connector.on('disconnect', listener);
138
+ await connector.connect();
139
+ wallet.on.mock.calls[1][1]();
140
+ expect(listener).toHaveBeenCalled();
141
+ });
142
+ });
143
+ describe('getWallet', () => {
144
+ it('should return undefined if there is no wallet', () => {
145
+ expect(OKXConnector.getWallet({ getActiveNetwork, requestedChains: [] })).toBeUndefined();
146
+ });
147
+ it('should return the Connector if there is a wallet', () => {
148
+ ;
149
+ window.okxwallet = { bitcoin: wallet };
150
+ const connector = OKXConnector.getWallet({ getActiveNetwork, requestedChains });
151
+ expect(connector).toBeInstanceOf(OKXConnector);
152
+ });
153
+ it('should get image url', () => {
154
+ ;
155
+ window.okxwallet = { bitcoin: wallet, cardano: { icon: 'mock_image' } };
156
+ const connector = OKXConnector.getWallet({ getActiveNetwork, requestedChains });
157
+ expect(connector?.imageUrl).toBe('mock_image');
158
+ });
159
+ it('should return undefined if window is undefined (server-side)', () => {
160
+ vi.spyOn(CoreHelperUtil, 'isClient').mockReturnValue(false);
161
+ expect(OKXConnector.getWallet({ getActiveNetwork, requestedChains })).toBeUndefined();
162
+ });
163
+ });
164
+ describe('getPublicKey', () => {
165
+ it('should return the public key', async () => {
166
+ const publicKey = await connector.getPublicKey();
167
+ expect(publicKey).toBe('publicKey');
168
+ expect(wallet.getPublicKey).toHaveBeenCalled();
169
+ });
170
+ });
171
+ });
172
+ //# sourceMappingURL=OKXConnector.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OKXConnector.test.js","sourceRoot":"","sources":["../../../../tests/connectors/OKXConnector.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,249 @@
1
+ import { MessageSigningProtocols } from 'sats-connect';
2
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
3
+ import { CoreHelperUtil } from '@reown/appkit-core';
4
+ import { bitcoin, bitcoinTestnet, mainnet } from '@reown/appkit/networks';
5
+ import { SatsConnectConnector } from '../../src/connectors/SatsConnectConnector';
6
+ import { mockSatsConnectProvider } from '../mocks/mockSatsConnect';
7
+ describe('SatsConnectConnector', () => {
8
+ let connector;
9
+ let mocks;
10
+ let requestedChains;
11
+ let getActiveNetwork;
12
+ beforeEach(() => {
13
+ // requested chains may contain not bip122 chains
14
+ requestedChains = [
15
+ { ...mainnet, caipNetworkId: 'eip155:1', chainNamespace: 'eip155' },
16
+ bitcoin,
17
+ bitcoinTestnet
18
+ ];
19
+ mocks = mockSatsConnectProvider();
20
+ getActiveNetwork = vi.fn(() => bitcoin);
21
+ connector = new SatsConnectConnector({
22
+ provider: mocks.provider,
23
+ requestedChains,
24
+ getActiveNetwork
25
+ });
26
+ });
27
+ it('should validate the test fixture', async () => {
28
+ expect(window[mocks.provider.id]).toBeDefined();
29
+ expect(window.btc_providers).to.include(mocks.provider);
30
+ expect(connector).toBeDefined();
31
+ });
32
+ it('should get wallets correctly', async () => {
33
+ const wallets = SatsConnectConnector.getWallets({ requestedChains, getActiveNetwork });
34
+ expect(wallets instanceof Array).toBeTruthy();
35
+ wallets.forEach(wallet => expect(wallet instanceof SatsConnectConnector).toBeTruthy());
36
+ });
37
+ it('should return an empty array when window is undefined (server-side)', () => {
38
+ vi.spyOn(CoreHelperUtil, 'isClient').mockReturnValue(false);
39
+ const wallets = SatsConnectConnector.getWallets({
40
+ requestedChains: [],
41
+ getActiveNetwork: () => undefined
42
+ });
43
+ expect(wallets).toEqual([]);
44
+ });
45
+ it('should get metadata correctly', async () => {
46
+ expect(connector.id).toBe(mocks.provider.name);
47
+ expect(connector.name).toBe(mocks.provider.name);
48
+ expect(connector.imageUrl).toBe(mocks.provider.icon);
49
+ expect(connector.chains).toEqual([bitcoin, bitcoinTestnet]);
50
+ });
51
+ it('should disconnect correctly', async () => {
52
+ await connector.disconnect();
53
+ expect(mocks.wallet.request).toHaveBeenCalledWith('wallet_disconnect', null);
54
+ });
55
+ it('should request correctly', async () => {
56
+ const args = { method: 'getAddresses', params: {} };
57
+ await connector.request(args);
58
+ expect(mocks.wallet.request).toHaveBeenCalledWith(args.method, args.params);
59
+ });
60
+ it('should connect correctly with wallet already connected', async () => {
61
+ const spy = vi.spyOn(mocks.wallet, 'request');
62
+ spy.mockResolvedValueOnce(mockSatsConnectProvider.mockRequestResolve({
63
+ addresses: [
64
+ {
65
+ address: 'mock_address',
66
+ purpose: 'receive',
67
+ addressType: 'p2pkh',
68
+ gaiaAppKey: 'mock_gaia_app_key',
69
+ gaiaHubUrl: 'mock_gaia_hub_url',
70
+ publicKey: 'mock_public_key'
71
+ }
72
+ ]
73
+ }));
74
+ const result = await connector.connect();
75
+ expect(result).toBe('mock_address');
76
+ expect(mocks.wallet.request).toHaveBeenCalledWith('getAddresses', {
77
+ purposes: expect.arrayContaining(['payment', 'ordinals', 'stacks']),
78
+ message: 'Connect to your wallet'
79
+ });
80
+ });
81
+ it('should connect correctly with wallet not connected', async () => {
82
+ const spy = vi.spyOn(mocks.wallet, 'request');
83
+ spy.mockResolvedValueOnce(mockSatsConnectProvider.mockRequestReject({ message: 'Unauthorized' }));
84
+ spy.mockResolvedValueOnce(mockSatsConnectProvider.mockRequestResolve({
85
+ addresses: [
86
+ {
87
+ address: 'mock_address',
88
+ purpose: 'payment',
89
+ addressType: 'p2pkh',
90
+ gaiaAppKey: 'mock_gaia_app_key',
91
+ gaiaHubUrl: 'mock_gaia_hub_url',
92
+ publicKey: 'mock_public_key'
93
+ }
94
+ ]
95
+ }));
96
+ const result = await connector.connect();
97
+ expect(result).toBe('mock_address');
98
+ expect(mocks.wallet.request).toHaveBeenNthCalledWith(1, 'getAddresses', {
99
+ purposes: expect.arrayContaining(['payment', 'ordinals', 'stacks']),
100
+ message: 'Connect to your wallet'
101
+ });
102
+ expect(mocks.wallet.request).toHaveBeenNthCalledWith(2, 'wallet_connect', null);
103
+ });
104
+ it('should throw if connect with empty addresses', async () => {
105
+ const spy = vi.spyOn(mocks.wallet, 'request');
106
+ spy.mockResolvedValueOnce(mockSatsConnectProvider.mockRequestResolve({ addresses: [] }));
107
+ await expect(connector.connect()).rejects.toThrow('No address available');
108
+ });
109
+ it('should signMessage correctly', async () => {
110
+ const params = { message: 'mock_message', address: 'mock_address' };
111
+ const spy = vi.spyOn(mocks.wallet, 'request');
112
+ spy.mockResolvedValueOnce(mockSatsConnectProvider.mockRequestResolve({
113
+ signature: 'mock_signature',
114
+ address: 'mock_address',
115
+ protocol: MessageSigningProtocols.BIP322,
116
+ messageHash: 'mock_message_hash'
117
+ }));
118
+ const result = await connector.signMessage(params);
119
+ expect(result).toBe('mock_signature');
120
+ expect(mocks.wallet.request).toHaveBeenCalledWith('signMessage', params);
121
+ });
122
+ it('should sendTransfer correctly', async () => {
123
+ const params = {
124
+ amount: '1000',
125
+ recipient: 'mock_recipient'
126
+ };
127
+ const spy = vi.spyOn(mocks.wallet, 'request');
128
+ spy.mockResolvedValueOnce(mockSatsConnectProvider.mockRequestResolve({ txid: 'mock_txid' }));
129
+ const result = await connector.sendTransfer(params);
130
+ expect(result).toBe('mock_txid');
131
+ expect(mocks.wallet.request).toHaveBeenCalledWith('sendTransfer', {
132
+ recipients: [{ address: params.recipient, amount: 1000 }]
133
+ });
134
+ });
135
+ it('should signPSBT correctly', async () => {
136
+ const params = {
137
+ psbt: 'mock_psbt',
138
+ broadcast: true,
139
+ signInputs: [{ address: 'mock_address', index: 0, sighashTypes: [0] }]
140
+ };
141
+ const spy = vi.spyOn(mocks.wallet, 'request');
142
+ spy.mockResolvedValueOnce(mockSatsConnectProvider.mockRequestResolve({ psbt: 'mock_signed_psbt' }));
143
+ const result = await connector.signPSBT(params);
144
+ expect(result).toEqual({ psbt: 'mock_signed_psbt' });
145
+ expect(mocks.wallet.request).toHaveBeenCalledWith('signPsbt', {
146
+ psbt: params.psbt,
147
+ broadcast: params.broadcast,
148
+ signInputs: { mock_address: [0] }
149
+ });
150
+ });
151
+ it('should throw if sendTransfer with invalid amount', async () => {
152
+ const params = {
153
+ amount: 'invalid',
154
+ recipient: 'mock_recipient'
155
+ };
156
+ await expect(connector.sendTransfer(params)).rejects.toThrow('Invalid amount');
157
+ });
158
+ it('should throw correct error if internalRequest fails', async () => {
159
+ const args = {
160
+ method: 'signMessage',
161
+ params: { message: 'mock_message', address: 'mock_address' }
162
+ };
163
+ vi.spyOn(mocks.wallet, 'request').mockResolvedValueOnce(mockSatsConnectProvider.mockRequestReject({
164
+ message: 'mock_error'
165
+ }));
166
+ await expect(connector.request(args)).rejects.toThrow('mock_error');
167
+ vi.spyOn(mocks.wallet, 'request').mockRejectedValueOnce(mockSatsConnectProvider.mockRequestReject({
168
+ message: 'mock_error'
169
+ }));
170
+ await expect(connector.request(args)).rejects.toThrow('mock_error');
171
+ vi.spyOn(mocks.wallet, 'request').mockRejectedValueOnce(new Error('unknown_error'));
172
+ await expect(connector.request(args)).rejects.toThrow('unknown_error');
173
+ });
174
+ it('should throw if wallet_disconnect request fails', async () => {
175
+ vi.spyOn(mocks.wallet, 'request').mockRejectedValueOnce(mockSatsConnectProvider.mockRequestReject({
176
+ message: 'mock_error'
177
+ }));
178
+ await expect(connector.disconnect()).rejects.toThrow('mock_error');
179
+ });
180
+ it('should not add events if wallet provider does not support events', async () => {
181
+ ;
182
+ mocks.wallet.addListener = undefined;
183
+ vi.spyOn(mocks.wallet, 'request').mockResolvedValue(mockSatsConnectProvider.mockRequestResolve({
184
+ addresses: [
185
+ {
186
+ address: 'mock_address',
187
+ purpose: 'payment',
188
+ addressType: 'p2pkh',
189
+ gaiaAppKey: 'mock_gaia_app_key',
190
+ gaiaHubUrl: 'mock_gaia_hub_url',
191
+ publicKey: 'mock_public_key'
192
+ }
193
+ ]
194
+ }));
195
+ await expect(connector.connect()).resolves.not.toThrow();
196
+ });
197
+ describe('events after connection', () => {
198
+ let addListenerSpy;
199
+ const addListenerCallbackMock = vi.fn(() => { });
200
+ beforeEach(async () => {
201
+ // connect wallet first
202
+ vi.spyOn(mocks.wallet, 'request').mockResolvedValue(mockSatsConnectProvider.mockRequestResolve({
203
+ addresses: [
204
+ {
205
+ address: 'mock_address',
206
+ purpose: 'payment',
207
+ addressType: 'p2pkh',
208
+ gaiaAppKey: 'mock_gaia_app_key',
209
+ gaiaHubUrl: 'mock_gaia_hub_url',
210
+ publicKey: 'mock_public_key'
211
+ }
212
+ ]
213
+ }));
214
+ addListenerSpy = vi.spyOn(mocks.wallet, 'addListener');
215
+ addListenerSpy.mockReturnValue(addListenerCallbackMock);
216
+ await connector.connect();
217
+ });
218
+ it('should have bound events after connection', async () => {
219
+ expect(addListenerSpy).toHaveBeenCalledWith('accountChange', expect.any(Function));
220
+ expect(addListenerSpy).toHaveBeenCalledWith('disconnect', expect.any(Function));
221
+ expect(addListenerSpy).toHaveBeenCalledWith('networkChange', expect.any(Function));
222
+ });
223
+ it('should unbind events after disconnect', async () => {
224
+ await connector.disconnect();
225
+ expect(addListenerCallbackMock).toHaveBeenCalledTimes(3);
226
+ });
227
+ it('should execute the callback on accountChange event', async () => {
228
+ const connectSpy = vi.spyOn(connector, 'connect');
229
+ const emitSpy = vi.spyOn(connector, 'emit');
230
+ const callback = addListenerSpy.mock.calls.find(([event]) => event === 'accountChange')?.[1];
231
+ await callback?.({ type: 'accountChange' });
232
+ expect(connectSpy).toHaveBeenCalled();
233
+ expect(emitSpy).toHaveBeenCalledWith('accountsChanged', ['mock_address']);
234
+ });
235
+ it('should execute the callback on disconnect event', async () => {
236
+ const emitSpy = vi.spyOn(connector, 'emit');
237
+ const callback = addListenerSpy.mock.calls.find(([event]) => event === 'disconnect')?.[1];
238
+ await callback?.({ type: 'disconnect' });
239
+ expect(emitSpy).toHaveBeenCalledWith('disconnect');
240
+ });
241
+ it('should execute the callback on networkChange event', async () => {
242
+ const emitSpy = vi.spyOn(connector, 'emit');
243
+ const callback = addListenerSpy.mock.calls.find(([event]) => event === 'networkChange')?.[1];
244
+ await callback?.({ type: 'networkChange' });
245
+ expect(emitSpy).toHaveBeenCalledWith('chainChanged', [bitcoin, bitcoinTestnet]);
246
+ });
247
+ });
248
+ });
249
+ //# sourceMappingURL=SatsConnectConnector.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SatsConnectConnector.test.js","sourceRoot":"","sources":["../../../../tests/connectors/SatsConnectConnector.test.ts"],"names":[],"mappings":"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"}