@reown/appkit-adapter-bitcoin 1.6.5 → 1.6.6-basic-test.1.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 (42) hide show
  1. package/dist/esm/src/utils/WalletConnectProvider.js +115 -0
  2. package/dist/esm/src/utils/WalletConnectProvider.js.map +1 -0
  3. package/dist/esm/tests/BitcoinAdapter.test.js +411 -0
  4. package/dist/esm/tests/BitcoinAdapter.test.js.map +1 -0
  5. package/dist/esm/tests/connectors/LeatherConnector.test.js +138 -0
  6. package/dist/esm/tests/connectors/LeatherConnector.test.js.map +1 -0
  7. package/dist/esm/tests/connectors/OKXConnector.test.js +172 -0
  8. package/dist/esm/tests/connectors/OKXConnector.test.js.map +1 -0
  9. package/dist/esm/tests/connectors/SatsConnectConnector.test.js +249 -0
  10. package/dist/esm/tests/connectors/SatsConnectConnector.test.js.map +1 -0
  11. package/dist/esm/tests/connectors/WalletStandardConnector.test.js +297 -0
  12. package/dist/esm/tests/connectors/WalletStandardConnector.test.js.map +1 -0
  13. package/dist/esm/tests/mocks/mockSatsConnect.js +60 -0
  14. package/dist/esm/tests/mocks/mockSatsConnect.js.map +1 -0
  15. package/dist/esm/tests/mocks/mockUTXO.js +15 -0
  16. package/dist/esm/tests/mocks/mockUTXO.js.map +1 -0
  17. package/dist/esm/tests/mocks/mockUniversalProvider.js +64 -0
  18. package/dist/esm/tests/mocks/mockUniversalProvider.js.map +1 -0
  19. package/dist/esm/tests/mocks/mockWalletStandard.js +47 -0
  20. package/dist/esm/tests/mocks/mockWalletStandard.js.map +1 -0
  21. package/dist/esm/tests/utils/BitcoinApi.test.js +48 -0
  22. package/dist/esm/tests/utils/BitcoinApi.test.js.map +1 -0
  23. package/dist/esm/tests/utils/UnitsUtils.test.js +21 -0
  24. package/dist/esm/tests/utils/UnitsUtils.test.js.map +1 -0
  25. package/dist/esm/tests/utils/WalletConnectProvider.test.js +275 -0
  26. package/dist/esm/tests/utils/WalletConnectProvider.test.js.map +1 -0
  27. package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
  28. package/dist/esm/tsconfig.tsbuildinfo +1 -0
  29. package/dist/types/src/utils/WalletConnectProvider.d.ts +90 -0
  30. package/dist/types/tests/BitcoinAdapter.test.d.ts +1 -0
  31. package/dist/types/tests/connectors/LeatherConnector.test.d.ts +1 -0
  32. package/dist/types/tests/connectors/OKXConnector.test.d.ts +1 -0
  33. package/dist/types/tests/connectors/SatsConnectConnector.test.d.ts +1 -0
  34. package/dist/types/tests/connectors/WalletStandardConnector.test.d.ts +1 -0
  35. package/dist/types/tests/mocks/mockSatsConnect.d.ts +27 -0
  36. package/dist/types/tests/mocks/mockUTXO.d.ts +2 -0
  37. package/dist/types/tests/mocks/mockUniversalProvider.d.ts +6 -0
  38. package/dist/types/tests/mocks/mockWalletStandard.d.ts +7 -0
  39. package/dist/types/tests/utils/BitcoinApi.test.d.ts +1 -0
  40. package/dist/types/tests/utils/UnitsUtils.test.d.ts +1 -0
  41. package/dist/types/tests/utils/WalletConnectProvider.test.d.ts +1 -0
  42. package/package.json +4 -4
@@ -0,0 +1,115 @@
1
+ import UniversalProvider from '@walletconnect/universal-provider';
2
+ import { WcHelpersUtil } from '@reown/appkit';
3
+ import { ProviderEventEmitter } from './ProviderEventEmitter.js';
4
+ export class WalletConnectProvider extends ProviderEventEmitter {
5
+ constructor({ provider, chains, getActiveChain }) {
6
+ super();
7
+ this.id = 'WalletConnect';
8
+ this.name = 'WalletConnect';
9
+ this.type = 'WALLET_CONNECT';
10
+ this.chain = 'bip122';
11
+ this.icon = 'https://imagedelivery.net/_aTEfDRm7z3tKgu9JhfeKA/05338e12-4f75-4982-4e8a-83c67b826b00/md';
12
+ this.requestedChains = chains;
13
+ this.provider = provider;
14
+ this.getActiveChain = getActiveChain;
15
+ }
16
+ // -- Public ------------------------------------------- //
17
+ get chains() {
18
+ return this.sessionChains
19
+ .map(chainId => this.requestedChains.find(chain => chain.caipNetworkId === chainId))
20
+ .filter(Boolean);
21
+ }
22
+ async connect() {
23
+ return Promise.reject(new Error('Connection of WalletConnectProvider should be done via UniversalAdapter'));
24
+ }
25
+ async disconnect() {
26
+ return this.provider.disconnect();
27
+ }
28
+ async signMessage({ message, address }) {
29
+ this.checkIfMethodIsSupported('signMessage');
30
+ const signedMessage = await this.internalRequest({
31
+ method: 'signMessage',
32
+ params: { message, account: address, address }
33
+ });
34
+ return Buffer.from(signedMessage.signature, 'hex').toString('base64');
35
+ }
36
+ async sendTransfer({ recipient, amount }) {
37
+ this.checkIfMethodIsSupported('sendTransfer');
38
+ const account = this.getAccount(true);
39
+ const result = await this.internalRequest({
40
+ method: 'sendTransfer',
41
+ params: {
42
+ account,
43
+ recipientAddress: recipient,
44
+ amount
45
+ }
46
+ });
47
+ return result.txid;
48
+ }
49
+ async getAccountAddresses() {
50
+ this.checkIfMethodIsSupported('getAccountAddresses');
51
+ const addresses = await this.internalRequest({
52
+ method: 'getAccountAddresses',
53
+ params: undefined
54
+ });
55
+ return addresses.map(address => ({ address, purpose: 'payment' }));
56
+ }
57
+ async signPSBT(params) {
58
+ this.checkIfMethodIsSupported('signPsbt');
59
+ const account = this.getAccount(true);
60
+ const response = await this.internalRequest({
61
+ method: 'signPsbt',
62
+ params: {
63
+ account,
64
+ psbt: params.psbt,
65
+ signInputs: params.signInputs,
66
+ broadcast: params.broadcast
67
+ }
68
+ });
69
+ return {
70
+ psbt: response.psbt,
71
+ txid: response.txid
72
+ };
73
+ }
74
+ request(args) {
75
+ // @ts-expect-error - args type should match internalRequest arguments but it's not correctly typed in Provider
76
+ return this.internalRequest(args);
77
+ }
78
+ // -- Private ------------------------------------------ //
79
+ get sessionChains() {
80
+ return WcHelpersUtil.getChainsFromNamespaces(this.provider.session?.namespaces);
81
+ }
82
+ getAccount(required) {
83
+ const account = this.provider.session?.namespaces['bip122']?.accounts[0];
84
+ if (!account) {
85
+ if (required) {
86
+ throw new Error('Account not found');
87
+ }
88
+ return undefined;
89
+ }
90
+ const address = account.split(':')[2];
91
+ if (!address) {
92
+ if (required) {
93
+ throw new Error('Address not found');
94
+ }
95
+ return undefined;
96
+ }
97
+ return address;
98
+ }
99
+ checkIfMethodIsSupported(method) {
100
+ if (!this.provider.session?.namespaces['bip122']?.methods.includes(method)) {
101
+ throw new Error(`Method ${method} is not supported`);
102
+ }
103
+ }
104
+ async internalRequest({ method, params }) {
105
+ const chain = this.getActiveChain();
106
+ if (!chain) {
107
+ throw new Error('Chain not found');
108
+ }
109
+ return this.provider.request({
110
+ method,
111
+ params
112
+ }, chain.caipNetworkId);
113
+ }
114
+ }
115
+ //# sourceMappingURL=WalletConnectProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WalletConnectProvider.js","sourceRoot":"","sources":["../../../../src/utils/WalletConnectProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,411 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { ConstantsUtil } from '@reown/appkit-common';
3
+ import { bitcoin, bitcoinTestnet, mainnet } from '@reown/appkit/networks';
4
+ import { BitcoinAdapter } from '../src';
5
+ import { BitcoinWalletConnectConnector } from '../src/connectors/BitcoinWalletConnectProvider';
6
+ import { LeatherConnector } from '../src/connectors/LeatherConnector';
7
+ import { OKXConnector } from '../src/connectors/OKXConnector';
8
+ import { SatsConnectConnector } from '../src/connectors/SatsConnectConnector';
9
+ import { WalletStandardConnector } from '../src/connectors/WalletStandardConnector';
10
+ import { mockSatsConnectProvider } from './mocks/mockSatsConnect';
11
+ import { mockUTXO } from './mocks/mockUTXO';
12
+ import { mockUniversalProvider } from './mocks/mockUniversalProvider';
13
+ function mockBitcoinApi() {
14
+ return {
15
+ getUTXOs: vi.fn(async () => [])
16
+ };
17
+ }
18
+ describe('BitcoinAdapter', () => {
19
+ let adapter;
20
+ let api;
21
+ beforeEach(() => {
22
+ api = mockBitcoinApi();
23
+ adapter = new BitcoinAdapter({ api, networks: [bitcoin] });
24
+ });
25
+ describe('connectWalletConnect', () => {
26
+ let mockWalletConnect;
27
+ beforeEach(() => {
28
+ mockWalletConnect = vi.mocked(new BitcoinWalletConnectConnector({
29
+ provider: mockUniversalProvider(),
30
+ chains: [bitcoin],
31
+ getActiveChain: () => bitcoin
32
+ }));
33
+ adapter.connectors.push(mockWalletConnect);
34
+ });
35
+ it('should call connect from WALLET_CONNECT connector', async () => {
36
+ await adapter.connectWalletConnect();
37
+ expect(mockWalletConnect.provider.connect).toHaveBeenCalled();
38
+ });
39
+ it('should throw if caipNetworks is not defined', async () => {
40
+ adapter = new BitcoinAdapter({ api });
41
+ await expect(adapter.connectWalletConnect()).rejects.toThrow();
42
+ });
43
+ it('should set BitcoinWalletConnectConnector', async () => {
44
+ delete adapter.caipNetworks;
45
+ adapter.setUniversalProvider(mockUniversalProvider());
46
+ expect(adapter.connectors[0]).toBeInstanceOf(BitcoinWalletConnectConnector);
47
+ expect(adapter.connectors[0]?.chains).toEqual([]);
48
+ });
49
+ });
50
+ describe('connect', () => {
51
+ it('should return the chainId of the available chain from connector', async () => {
52
+ const connector = new SatsConnectConnector({
53
+ provider: mockSatsConnectProvider().provider,
54
+ requestedChains: [bitcoin],
55
+ getActiveNetwork: () => bitcoin
56
+ });
57
+ vi.spyOn(connector, 'connect').mockResolvedValueOnce('mock_address');
58
+ adapter.connectors.push(connector);
59
+ const result = await adapter.connect({
60
+ id: connector.id,
61
+ chainId: 'bitcoin:any_chain_id',
62
+ provider: connector.provider,
63
+ type: 'mock_type'
64
+ });
65
+ expect(result).toEqual({
66
+ id: connector.id,
67
+ type: connector.type,
68
+ address: 'mock_address',
69
+ chainId: bitcoin.id,
70
+ provider: connector.provider
71
+ });
72
+ });
73
+ it('should throw if connector is not found', async () => {
74
+ await expect(adapter.connect({ id: 'invalid_id', type: 'invalid_type' })).rejects.toThrow();
75
+ });
76
+ it('should throw if chain is not found', async () => {
77
+ const connector = new SatsConnectConnector({
78
+ provider: mockSatsConnectProvider().provider,
79
+ requestedChains: [bitcoin],
80
+ getActiveNetwork: () => bitcoin
81
+ });
82
+ vi.spyOn(connector, 'connect').mockResolvedValueOnce('mock_address');
83
+ vi.spyOn(connector, 'chains', 'get').mockReturnValue([]);
84
+ adapter.connectors.push(connector);
85
+ await expect(adapter.connect({ id: connector.id, type: connector.type, chainId: 'invalid_chain_id' })).rejects.toThrow();
86
+ });
87
+ });
88
+ describe('getAccounts', () => {
89
+ let connector;
90
+ beforeEach(() => {
91
+ connector = new SatsConnectConnector({
92
+ provider: mockSatsConnectProvider().provider,
93
+ requestedChains: [bitcoin],
94
+ getActiveNetwork: () => bitcoin
95
+ });
96
+ adapter.connectors.push(connector);
97
+ });
98
+ it('should return the accounts', async () => {
99
+ vi.spyOn(connector, 'getAccountAddresses').mockResolvedValueOnce([
100
+ {
101
+ address: 'mock_address_1',
102
+ purpose: 'payment',
103
+ publicKey: 'mock_public_key_1',
104
+ path: 'mock_path_1'
105
+ },
106
+ {
107
+ address: 'mock_address_2',
108
+ purpose: 'ordinal',
109
+ publicKey: 'mock_public_key_2',
110
+ path: 'mock_path_2'
111
+ },
112
+ {
113
+ address: 'mock_address_3',
114
+ purpose: 'stx',
115
+ publicKey: 'mock_public_key_3',
116
+ path: 'mock_path_3'
117
+ }
118
+ ]);
119
+ const accounts = await adapter.getAccounts({ id: connector.id });
120
+ accounts.accounts.forEach(account => {
121
+ expect(account.namespace).toEqual(ConstantsUtil.CHAIN.BITCOIN);
122
+ expect(account.publicKey).toBeDefined();
123
+ expect(account.path).toBeDefined();
124
+ });
125
+ });
126
+ it('should return empty accounts if no addresses', async () => {
127
+ const connector = new SatsConnectConnector({
128
+ provider: mockSatsConnectProvider().provider,
129
+ requestedChains: [bitcoin],
130
+ getActiveNetwork: () => bitcoin
131
+ });
132
+ vi.spyOn(connector, 'getAccountAddresses').mockResolvedValueOnce([]);
133
+ adapter.connectors.push(connector);
134
+ const accounts = await adapter.getAccounts({ id: connector.id });
135
+ expect(accounts).toEqual({ accounts: [] });
136
+ });
137
+ it('should return empty accounts if connector is not found', async () => {
138
+ const accounts = await adapter.getAccounts({ id: 'invalid_id' });
139
+ expect(accounts).toEqual({ accounts: [] });
140
+ });
141
+ it('should return empty accounts if connector.getAccountsAddresses throws', async () => {
142
+ vi.spyOn(connector, 'getAccountAddresses').mockRejectedValueOnce(new Error('mock_error'));
143
+ const accounts = await adapter.getAccounts({ id: connector.id });
144
+ expect(accounts).toEqual({ accounts: [] });
145
+ });
146
+ it('should attach payment type if purpose is not found', async () => {
147
+ vi.spyOn(connector, 'getAccountAddresses').mockResolvedValueOnce([
148
+ { address: 'mock_address' }
149
+ ]);
150
+ const accounts = await adapter.getAccounts({ id: connector.id });
151
+ expect(accounts).toEqual({
152
+ accounts: [{ address: 'mock_address', type: 'payment', namespace: 'bip122' }]
153
+ });
154
+ });
155
+ });
156
+ describe('syncConnectors', () => {
157
+ it('should get wallets from all the available connectors', () => {
158
+ const walletStandardConnectorSpy = vi.spyOn(WalletStandardConnector, 'watchWallets');
159
+ const satsConnectConnectorSpy = vi.spyOn(SatsConnectConnector, 'getWallets');
160
+ const okxConnectorSpy = vi.spyOn(OKXConnector, 'getWallet');
161
+ adapter.syncConnectors(undefined, undefined);
162
+ expect(walletStandardConnectorSpy).toHaveBeenCalled();
163
+ expect(satsConnectConnectorSpy).toHaveBeenCalled();
164
+ expect(okxConnectorSpy).toHaveBeenCalled();
165
+ });
166
+ it('should add connectors from SatsConnectConnector', () => {
167
+ mockSatsConnectProvider();
168
+ adapter.syncConnectors(undefined, undefined);
169
+ expect(adapter.connectors).toHaveLength(1);
170
+ expect(adapter.connectors[0]).toBeInstanceOf(SatsConnectConnector);
171
+ });
172
+ it('should map LeatherConnector', () => {
173
+ mockSatsConnectProvider({ id: LeatherConnector.ProviderId, name: 'Leather' });
174
+ adapter.syncConnectors(undefined, undefined);
175
+ expect(adapter.connectors[1]).toBeInstanceOf(LeatherConnector);
176
+ });
177
+ it('should add OKXConnector', () => {
178
+ ;
179
+ window.okxwallet = { bitcoin: { connect: vi.fn() } };
180
+ adapter.syncConnectors(undefined, undefined);
181
+ expect(adapter.connectors[0]).toBeInstanceOf(OKXConnector);
182
+ });
183
+ it('should pass correct getActiveNetwork to SatsConnectConnector', () => {
184
+ const mocks = mockSatsConnectProvider({ id: LeatherConnector.ProviderId, name: 'Leather' });
185
+ const getCaipNetwork = vi.fn(() => bitcoin);
186
+ adapter.syncConnectors(undefined, { getCaipNetwork });
187
+ vi.spyOn(mocks.wallet, 'request').mockResolvedValueOnce(mockSatsConnectProvider.mockRequestResolve({ hex: 'mock_hex', txid: 'mock_txid' }));
188
+ const connector = adapter.connectors.find(c => c instanceof LeatherConnector);
189
+ connector.signPSBT({ psbt: 'mock_psbt', signInputs: [] });
190
+ expect(getCaipNetwork).toHaveBeenCalled();
191
+ });
192
+ });
193
+ describe('syncConnection', () => {
194
+ it('should forward the call to connect', async () => {
195
+ const connectSpy = vi.spyOn(adapter, 'connect').mockResolvedValueOnce({
196
+ id: 'mock_id',
197
+ type: 'ANNOUNCED',
198
+ address: 'mock_address',
199
+ chainId: 'mock_chain_id',
200
+ provider: undefined
201
+ });
202
+ await adapter.syncConnection({
203
+ id: 'mock_id',
204
+ chainId: 'mock_chain_id',
205
+ namespace: 'bip122',
206
+ rpcUrl: 'mock_rpc_url'
207
+ });
208
+ expect(connectSpy).toHaveBeenCalledWith({ id: 'mock_id', chainId: 'mock_chain_id', type: '' });
209
+ });
210
+ });
211
+ describe('getBalance', () => {
212
+ it('should return the balance', async () => {
213
+ api.getUTXOs.mockResolvedValueOnce([
214
+ mockUTXO({ value: 10000 }),
215
+ mockUTXO({ value: 20000 }),
216
+ mockUTXO({ value: 30000 }),
217
+ mockUTXO({ value: 10000000000 })
218
+ ]);
219
+ const balance = await adapter.getBalance({
220
+ address: 'mock_address',
221
+ chainId: bitcoin.id,
222
+ caipNetwork: bitcoin
223
+ });
224
+ expect(balance).toEqual({
225
+ balance: '100.0006',
226
+ symbol: 'BTC'
227
+ });
228
+ });
229
+ it('should return empty balance if no UTXOs', async () => {
230
+ api.getUTXOs.mockResolvedValueOnce([]);
231
+ const balance = await adapter.getBalance({
232
+ address: 'mock_address',
233
+ chainId: bitcoin.id,
234
+ caipNetwork: bitcoin
235
+ });
236
+ expect(balance).toEqual({
237
+ balance: '0',
238
+ symbol: 'BTC'
239
+ });
240
+ });
241
+ it('should return empty balance if chain is not bip122', async () => {
242
+ const balance = await adapter.getBalance({
243
+ address: 'mock_address',
244
+ chainId: mainnet.id,
245
+ caipNetwork: mainnet
246
+ });
247
+ expect(balance).toEqual({
248
+ balance: '0',
249
+ symbol: bitcoin.nativeCurrency.symbol
250
+ });
251
+ });
252
+ it('should return empty balance if chain is not provided', async () => {
253
+ const balance = await adapter.getBalance({
254
+ address: 'mock_address',
255
+ chainId: 'mock_chain_id'
256
+ });
257
+ expect(balance).toEqual({
258
+ balance: '0',
259
+ symbol: bitcoin.nativeCurrency.symbol
260
+ });
261
+ });
262
+ });
263
+ describe('signMessage', async () => {
264
+ let connector;
265
+ beforeEach(() => {
266
+ connector = new SatsConnectConnector({
267
+ provider: mockSatsConnectProvider().provider,
268
+ requestedChains: [bitcoin],
269
+ getActiveNetwork: () => bitcoin
270
+ });
271
+ });
272
+ it('should return the signature', async () => {
273
+ vi.spyOn(connector, 'signMessage').mockResolvedValueOnce('mock_signature');
274
+ const result = await adapter.signMessage({
275
+ message: 'mock_message',
276
+ address: 'mock_address',
277
+ provider: connector.provider
278
+ });
279
+ expect(result).toEqual({ signature: 'mock_signature' });
280
+ });
281
+ it('should throw if connector is not found', async () => {
282
+ await expect(adapter.signMessage({
283
+ address: 'mock_address',
284
+ message: 'mock_message',
285
+ provider: undefined
286
+ })).rejects.toThrow();
287
+ });
288
+ });
289
+ describe('getWalletConnectProvider', () => {
290
+ it('should return the wallet connect provider', () => {
291
+ const provider = adapter.getWalletConnectProvider({
292
+ activeCaipNetwork: bitcoin,
293
+ caipNetworks: [bitcoin],
294
+ provider: undefined
295
+ });
296
+ expect(provider).toBeInstanceOf(BitcoinWalletConnectConnector);
297
+ });
298
+ });
299
+ describe('disconnect', () => {
300
+ it('should disconnect using param provider', async () => {
301
+ const connector = new SatsConnectConnector({
302
+ provider: mockSatsConnectProvider().provider,
303
+ requestedChains: [bitcoin],
304
+ getActiveNetwork: () => bitcoin
305
+ });
306
+ vi.spyOn(connector, 'disconnect');
307
+ adapter.connectors.push(connector);
308
+ await adapter.disconnect({ provider: connector });
309
+ expect(connector.disconnect).toHaveBeenCalled();
310
+ });
311
+ it('should disconnect using connector from class', async () => {
312
+ const mocks = mockSatsConnectProvider();
313
+ const connector = new SatsConnectConnector({
314
+ provider: mocks.provider,
315
+ requestedChains: [bitcoin],
316
+ getActiveNetwork: () => bitcoin
317
+ });
318
+ vi.spyOn(connector, 'disconnect');
319
+ vi.spyOn(connector, 'getAccountAddresses').mockResolvedValueOnce([
320
+ { address: 'mock_address', purpose: 'payment' }
321
+ ]);
322
+ adapter.connectors.push(connector);
323
+ await adapter.connect({ id: connector.id, chainId: bitcoin.id, type: '' });
324
+ await adapter.disconnect({});
325
+ expect(connector.disconnect).toHaveBeenCalled();
326
+ });
327
+ });
328
+ describe('connector events', () => {
329
+ let mocks;
330
+ const listeners = {
331
+ accountChanged: vi.fn(),
332
+ disconnect: vi.fn(),
333
+ switchNetwork: vi.fn()
334
+ };
335
+ beforeEach(async () => {
336
+ mocks = mockSatsConnectProvider();
337
+ adapter.syncConnectors();
338
+ vi.spyOn(mocks.wallet, 'request').mockResolvedValue(mockSatsConnectProvider.mockRequestResolve({
339
+ addresses: [{ address: 'mock_address' }]
340
+ }));
341
+ listeners.accountChanged = vi.fn(() => console.log('meu pau'));
342
+ adapter.on('accountChanged', listeners.accountChanged);
343
+ listeners.disconnect = vi.fn();
344
+ adapter.on('disconnect', listeners.disconnect);
345
+ listeners.switchNetwork = vi.fn();
346
+ adapter.on('switchNetwork', listeners.switchNetwork);
347
+ await adapter.connect({
348
+ id: mocks.provider.name,
349
+ chainId: bitcoin.id,
350
+ type: ''
351
+ });
352
+ });
353
+ it('should have bound events', () => {
354
+ expect(mocks.wallet.addListener).toHaveBeenCalledWith('accountChange', expect.any(Function));
355
+ expect(mocks.wallet.addListener).toHaveBeenCalledWith('disconnect', expect.any(Function));
356
+ expect(mocks.wallet.addListener).toHaveBeenCalledWith('networkChange', expect.any(Function));
357
+ });
358
+ it('should emit accountsChanged on accountChange', async () => {
359
+ const callback = mocks.wallet.addListener.mock.calls.find(([name]) => name === 'accountChange')[1];
360
+ await callback({ type: 'accountChange' });
361
+ expect(listeners.accountChanged).toHaveBeenCalled();
362
+ });
363
+ it('should emit disconnect on disconnect', () => {
364
+ const callback = mocks.wallet.addListener.mock.calls.find(([name]) => name === 'disconnect')[1];
365
+ callback({ type: 'disconnect' });
366
+ expect(listeners.disconnect).toHaveBeenCalled();
367
+ });
368
+ it('should emit switchNetwork on networkChange', () => {
369
+ const callback = mocks.wallet.addListener.mock.calls.find(([name]) => name === 'networkChange')[1];
370
+ callback({ type: 'networkChange' });
371
+ expect(listeners.switchNetwork).toHaveBeenCalled();
372
+ });
373
+ });
374
+ describe('switchNetwork', () => {
375
+ it('should execute switch network', async () => {
376
+ const provider = new SatsConnectConnector({
377
+ provider: mockSatsConnectProvider().provider,
378
+ requestedChains: [bitcoin],
379
+ getActiveNetwork: () => bitcoin
380
+ });
381
+ await expect(adapter.switchNetwork({
382
+ caipNetwork: bitcoinTestnet,
383
+ provider,
384
+ providerType: provider.type
385
+ })).resolves.toBeUndefined();
386
+ });
387
+ it('should execute switch network for WalletConnectConnector', async () => {
388
+ const provider = mockUniversalProvider();
389
+ const setDefaultChainSpy = provider.setDefaultChain;
390
+ await adapter.switchNetwork({
391
+ caipNetwork: bitcoinTestnet,
392
+ provider,
393
+ providerType: 'WALLET_CONNECT'
394
+ });
395
+ expect(setDefaultChainSpy).toHaveBeenCalledWith(bitcoinTestnet.caipNetworkId);
396
+ });
397
+ });
398
+ it('should not throw for not used methods', async () => {
399
+ expect(await adapter.getProfile({})).toEqual({});
400
+ expect(await adapter.estimateGas({})).toEqual({});
401
+ expect(await adapter.sendTransaction({})).toEqual({});
402
+ expect(await adapter.writeContract({})).toEqual({});
403
+ expect(await adapter.getEnsAddress({})).toEqual({});
404
+ expect(adapter.parseUnits({})).toEqual(BigInt(0));
405
+ expect(adapter.formatUnits({})).toEqual('');
406
+ expect(await adapter.grantPermissions({})).toEqual({});
407
+ expect(await adapter.getCapabilities({})).toEqual({});
408
+ expect(await adapter.revokePermissions({})).toEqual('0x');
409
+ });
410
+ });
411
+ //# 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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"}