@reown/appkit 1.6.8 → 1.6.9-rc.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 (103) hide show
  1. package/dist/esm/exports/basic.js +11 -0
  2. package/dist/esm/exports/basic.js.map +1 -0
  3. package/dist/esm/exports/constants.js +1 -1
  4. package/dist/esm/exports/constants.js.map +1 -1
  5. package/dist/esm/package.json +6 -6
  6. package/dist/esm/src/adapters/ChainAdapterBlueprint.js +5 -2
  7. package/dist/esm/src/adapters/ChainAdapterBlueprint.js.map +1 -1
  8. package/dist/esm/src/client/appkit-basic.js +35 -0
  9. package/dist/esm/src/client/appkit-basic.js.map +1 -0
  10. package/dist/esm/src/client/appkit.js +371 -0
  11. package/dist/esm/src/client/appkit.js.map +1 -0
  12. package/dist/esm/src/client/core.js +1367 -0
  13. package/dist/esm/src/client/core.js.map +1 -0
  14. package/dist/esm/src/client.js +137 -58
  15. package/dist/esm/src/client.js.map +1 -1
  16. package/dist/esm/src/universal-adapter/client.js +4 -0
  17. package/dist/esm/src/universal-adapter/client.js.map +1 -1
  18. package/dist/esm/src/utils/ConstantsUtil.js +2 -1
  19. package/dist/esm/src/utils/ConstantsUtil.js.map +1 -1
  20. package/dist/esm/src/utils/HelpersUtil.js +16 -6
  21. package/dist/esm/src/utils/HelpersUtil.js.map +1 -1
  22. package/dist/esm/tests/client/adapter-management.test.js +83 -0
  23. package/dist/esm/tests/client/adapter-management.test.js.map +1 -0
  24. package/dist/esm/tests/client/appkit-basic.test.js +68 -0
  25. package/dist/esm/tests/client/appkit-basic.test.js.map +1 -0
  26. package/dist/esm/tests/client/balance.test.js +67 -0
  27. package/dist/esm/tests/client/balance.test.js.map +1 -0
  28. package/dist/esm/tests/client/connection.test.js +52 -0
  29. package/dist/esm/tests/client/connection.test.js.map +1 -0
  30. package/dist/esm/tests/client/initialization.test.js +122 -0
  31. package/dist/esm/tests/client/initialization.test.js.map +1 -0
  32. package/dist/esm/tests/client/listeners.test.js +50 -0
  33. package/dist/esm/tests/client/listeners.test.js.map +1 -0
  34. package/dist/esm/tests/client/public-methods.test.js +672 -0
  35. package/dist/esm/tests/client/public-methods.test.js.map +1 -0
  36. package/dist/esm/tests/client/universal-adapter.test.js +44 -0
  37. package/dist/esm/tests/client/universal-adapter.test.js.map +1 -0
  38. package/dist/esm/tests/client/walletconnect-events.test.js +80 -0
  39. package/dist/esm/tests/client/walletconnect-events.test.js.map +1 -0
  40. package/dist/esm/tests/connectors/WalletConnectConnector.test.js +63 -0
  41. package/dist/esm/tests/connectors/WalletConnectConnector.test.js.map +1 -0
  42. package/dist/esm/tests/mocks/Account.js +13 -0
  43. package/dist/esm/tests/mocks/Account.js.map +1 -0
  44. package/dist/esm/tests/mocks/Adapter.js +95 -0
  45. package/dist/esm/tests/mocks/Adapter.js.map +1 -0
  46. package/dist/esm/tests/mocks/AppKit.js +24 -0
  47. package/dist/esm/tests/mocks/AppKit.js.map +1 -0
  48. package/dist/esm/tests/mocks/Networks.js +17 -0
  49. package/dist/esm/tests/mocks/Networks.js.map +1 -0
  50. package/dist/esm/tests/mocks/Options.js +17 -0
  51. package/dist/esm/tests/mocks/Options.js.map +1 -0
  52. package/dist/esm/tests/mocks/Providers.js +46 -0
  53. package/dist/esm/tests/mocks/Providers.js.map +1 -0
  54. package/dist/esm/tests/mocks/UniversalProvider.js +139 -0
  55. package/dist/esm/tests/mocks/UniversalProvider.js.map +1 -0
  56. package/dist/esm/tests/siwe.test.js +260 -0
  57. package/dist/esm/tests/siwe.test.js.map +1 -0
  58. package/dist/esm/tests/test-utils.js +39 -0
  59. package/dist/esm/tests/test-utils.js.map +1 -0
  60. package/dist/esm/tests/universal-adapter.test.js +246 -0
  61. package/dist/esm/tests/universal-adapter.test.js.map +1 -0
  62. package/dist/esm/tests/utils/HelpersUtil.test.js +218 -0
  63. package/dist/esm/tests/utils/HelpersUtil.test.js.map +1 -0
  64. package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
  65. package/dist/esm/tsconfig.tsbuildinfo +1 -0
  66. package/dist/types/exports/basic.d.ts +8 -0
  67. package/dist/types/exports/constants.d.ts +1 -1
  68. package/dist/types/src/adapters/ChainAdapterBlueprint.d.ts +13 -0
  69. package/dist/types/src/client/appkit-basic.d.ts +24 -0
  70. package/dist/types/src/client/appkit.d.ts +23 -0
  71. package/dist/types/src/client/core.d.ts +208 -0
  72. package/dist/types/src/client.d.ts +4 -3
  73. package/dist/types/src/library/react/index.d.ts +1 -1
  74. package/dist/types/src/library/vue/index.d.ts +1 -0
  75. package/dist/types/src/networks/bitcoin.d.ts +5 -5
  76. package/dist/types/src/networks/solana/solana.d.ts +1 -1
  77. package/dist/types/src/networks/solana/solanaDevnet.d.ts +1 -1
  78. package/dist/types/src/networks/solana/solanaTestnet.d.ts +1 -1
  79. package/dist/types/src/store/ProviderUtil.d.ts +5 -3
  80. package/dist/types/src/universal-adapter/client.d.ts +1 -0
  81. package/dist/types/src/utils/ConstantsUtil.d.ts +1 -0
  82. package/dist/types/tests/client/adapter-management.test.d.ts +1 -0
  83. package/dist/types/tests/client/appkit-basic.test.d.ts +1 -0
  84. package/dist/types/tests/client/balance.test.d.ts +1 -0
  85. package/dist/types/tests/client/connection.test.d.ts +1 -0
  86. package/dist/types/tests/client/initialization.test.d.ts +1 -0
  87. package/dist/types/tests/client/listeners.test.d.ts +1 -0
  88. package/dist/types/tests/client/public-methods.test.d.ts +1 -0
  89. package/dist/types/tests/client/universal-adapter.test.d.ts +1 -0
  90. package/dist/types/tests/client/walletconnect-events.test.d.ts +1 -0
  91. package/dist/types/tests/connectors/WalletConnectConnector.test.d.ts +1 -0
  92. package/dist/types/tests/mocks/Account.d.ts +12 -0
  93. package/dist/types/tests/mocks/Adapter.d.ts +5 -0
  94. package/dist/types/tests/mocks/AppKit.d.ts +3 -0
  95. package/dist/types/tests/mocks/Networks.d.ts +4 -0
  96. package/dist/types/tests/mocks/Options.d.ts +6 -0
  97. package/dist/types/tests/mocks/Providers.d.ts +42 -0
  98. package/dist/types/tests/mocks/UniversalProvider.d.ts +3 -0
  99. package/dist/types/tests/siwe.test.d.ts +1 -0
  100. package/dist/types/tests/test-utils.d.ts +6 -0
  101. package/dist/types/tests/universal-adapter.test.d.ts +1 -0
  102. package/dist/types/tests/utils/HelpersUtil.test.d.ts +1 -0
  103. package/package.json +14 -14
@@ -0,0 +1,67 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { NetworkUtil } from '@reown/appkit-common';
3
+ import { AccountController } from '@reown/appkit-core';
4
+ import { AppKit } from '../../src/client/appkit.js';
5
+ import { mockEvmAdapter } from '../mocks/Adapter.js';
6
+ import { base, mainnet, sepolia } from '../mocks/Networks.js';
7
+ import { mockOptions } from '../mocks/Options.js';
8
+ import { mockBlockchainApiController, mockFetchTokenBalanceOnce, mockStorageUtil, mockWindowAndDocument } from '../test-utils.js';
9
+ mockWindowAndDocument();
10
+ mockStorageUtil();
11
+ mockBlockchainApiController();
12
+ describe('Balance sync', () => {
13
+ it.sequential('should not sync balance if theres no matching caipNetwork', async () => {
14
+ const getNetworksByNamespaceSpy = vi.spyOn(NetworkUtil, 'getNetworksByNamespace');
15
+ const setBalanceSpy = vi.spyOn(AccountController, 'setBalance');
16
+ const appKit = new AppKit(mockOptions);
17
+ await appKit['syncBalance']({
18
+ address: '0x123',
19
+ chainId: base.id,
20
+ chainNamespace: base.chainNamespace
21
+ });
22
+ expect(getNetworksByNamespaceSpy).toHaveBeenCalled();
23
+ expect(mockEvmAdapter.getBalance).not.toHaveBeenCalled();
24
+ expect(setBalanceSpy).not.toHaveBeenCalled();
25
+ });
26
+ it.sequential('should fetch native balance on testnet', async () => {
27
+ const getNetworksByNamespaceSpy = vi.spyOn(NetworkUtil, 'getNetworksByNamespace');
28
+ const setBalanceSpy = vi.spyOn(AccountController, 'setBalance');
29
+ const mockAccount = {
30
+ address: '0x123',
31
+ chainId: sepolia.id,
32
+ chainNamespace: sepolia.chainNamespace
33
+ };
34
+ const appKit = new AppKit({ ...mockOptions, networks: [sepolia] });
35
+ await appKit['syncAccount'](mockAccount);
36
+ expect(getNetworksByNamespaceSpy).toHaveBeenCalled();
37
+ expect(mockEvmAdapter.getBalance).toHaveBeenCalled();
38
+ expect(setBalanceSpy).toHaveBeenCalledWith('1.00', 'ETH', sepolia.chainNamespace);
39
+ });
40
+ it.sequential('should set the correct native token balance', async () => {
41
+ const getNetworksByNamespaceSpy = vi.spyOn(NetworkUtil, 'getNetworksByNamespace');
42
+ const setBalanceSpy = vi.spyOn(AccountController, 'setBalance');
43
+ mockFetchTokenBalanceOnce([
44
+ {
45
+ chainId: `${mainnet.chainNamespace}:${mainnet.id}`,
46
+ symbol: mainnet.nativeCurrency.symbol,
47
+ name: mainnet.nativeCurrency.name,
48
+ price: 1,
49
+ iconUrl: '',
50
+ quantity: {
51
+ decimals: '18',
52
+ numeric: '5.00'
53
+ }
54
+ }
55
+ ]);
56
+ const appKit = new AppKit(mockOptions);
57
+ await appKit['syncBalance']({
58
+ address: '0x123',
59
+ chainId: mainnet.id,
60
+ chainNamespace: mainnet.chainNamespace
61
+ });
62
+ expect(getNetworksByNamespaceSpy).toHaveBeenCalled();
63
+ expect(mockEvmAdapter.getBalance).toHaveBeenCalled();
64
+ expect(setBalanceSpy).toHaveBeenCalledWith('5.00', 'ETH', 'eip155');
65
+ });
66
+ });
67
+ //# sourceMappingURL=balance.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance.test.js","sourceRoot":"","sources":["../../../../tests/client/balance.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { AccountController, StorageUtil } from '@reown/appkit-core';
3
+ import { AppKit } from '../../src/client/appkit.js';
4
+ import { mockEvmAdapter, mockSolanaAdapter } from '../mocks/Adapter.js';
5
+ import { mainnet, sepolia } from '../mocks/Networks.js';
6
+ import { mockOptions } from '../mocks/Options.js';
7
+ import { mockBlockchainApiController, mockStorageUtil, mockWindowAndDocument } from '../test-utils.js';
8
+ mockWindowAndDocument();
9
+ mockStorageUtil();
10
+ mockBlockchainApiController();
11
+ describe('syncExistingConnection', () => {
12
+ it('should set status to "connecting" and sync the connection when a connector and namespace are present', async () => {
13
+ const setStatus = vi.spyOn(AccountController, 'setStatus');
14
+ vi.spyOn(StorageUtil, 'getConnectedConnectorId').mockReturnValue('evm-connector');
15
+ vi.spyOn(StorageUtil, 'getConnectionStatus').mockReturnValue('connected');
16
+ const appKit = new AppKit({
17
+ ...mockOptions,
18
+ adapters: [mockEvmAdapter],
19
+ networks: [mainnet, sepolia]
20
+ });
21
+ await appKit['syncExistingConnection']();
22
+ expect(setStatus).toHaveBeenCalledWith('connecting', 'eip155');
23
+ expect(setStatus).toHaveBeenCalledWith('connected', 'eip155');
24
+ vi.spyOn(StorageUtil, 'getConnectedConnectorId').mockReturnValue(undefined);
25
+ vi.spyOn(StorageUtil, 'getConnectionStatus').mockReturnValue('connected');
26
+ await appKit['syncExistingConnection']();
27
+ expect(setStatus).toHaveBeenCalledWith('connecting', 'eip155');
28
+ expect(setStatus).toHaveBeenCalledWith('disconnected', 'eip155');
29
+ vi.spyOn(StorageUtil, 'getConnectedConnectorId').mockClear();
30
+ vi.spyOn(StorageUtil, 'getConnectionStatus').mockClear();
31
+ });
32
+ it('should reconnect to multiple namespaces if previously connected', async () => {
33
+ const setConnectedConnectorId = vi.spyOn(StorageUtil, 'setConnectedConnectorId');
34
+ // const setProviderId = vi.spyOn(ProviderUtil, 'setProviderId').mockImplementation(() => {})
35
+ vi.spyOn(StorageUtil, 'getConnectedConnectorId').mockReturnValue('universal-connector');
36
+ const appKit = new AppKit(mockOptions);
37
+ await appKit['syncExistingConnection']();
38
+ expect(mockEvmAdapter.syncConnection).toHaveBeenCalled();
39
+ expect(mockSolanaAdapter.syncConnection).toHaveBeenCalled();
40
+ expect(mockEvmAdapter.getAccounts).toHaveBeenCalled();
41
+ expect(mockSolanaAdapter.getAccounts).toHaveBeenCalled();
42
+ // NOTE: Even though setConnectedConnectorId is getting called in the same function (syncProvider),
43
+ // it's getting detected as not called by the test runner.
44
+ // expect(setProviderId).toHaveBeenCalledWith('eip155', 'EXTERNAL')
45
+ // expect(setProviderId).toHaveBeenCalledWith('solana', 'EXTERNAL')
46
+ expect(setConnectedConnectorId).toHaveBeenCalledWith('eip155', 'evm-connector');
47
+ expect(setConnectedConnectorId).toHaveBeenCalledWith('solana', 'solana-connector');
48
+ vi.spyOn(StorageUtil, 'getConnectedConnectorId').mockClear();
49
+ vi.spyOn(StorageUtil, 'getConnectionStatus').mockClear();
50
+ });
51
+ });
52
+ //# sourceMappingURL=connection.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.test.js","sourceRoot":"","sources":["../../../../tests/client/connection.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ import {} from '@reown/appkit-common';
3
+ import { AlertController, ChainController, EventsController, OptionsController, StorageUtil } from '@reown/appkit-core';
4
+ import { ErrorUtil } from '@reown/appkit-utils';
5
+ import { AppKit } from '../../src/client/appkit.js';
6
+ import { mainnet, polygon, sepolia, solana } from '../mocks/Networks';
7
+ import { mockOptions } from '../mocks/Options';
8
+ import { mockBlockchainApiController, mockStorageUtil, mockWindowAndDocument } from '../test-utils';
9
+ mockWindowAndDocument();
10
+ mockStorageUtil();
11
+ mockBlockchainApiController();
12
+ describe('Base', () => {
13
+ afterEach(() => {
14
+ vi.clearAllMocks();
15
+ });
16
+ describe('Base Initialization', () => {
17
+ it('should initialize controllers', async () => {
18
+ const sendEvent = vi.spyOn(EventsController, 'sendEvent');
19
+ const initialize = vi.spyOn(ChainController, 'initialize');
20
+ new AppKit(mockOptions);
21
+ const options = { ...mockOptions };
22
+ delete options.adapters;
23
+ expect(sendEvent).toHaveBeenCalled();
24
+ expect(sendEvent).toHaveBeenCalledWith({
25
+ type: 'track',
26
+ event: 'INITIALIZE',
27
+ properties: {
28
+ ...options,
29
+ networks: options.networks.map((n) => n.id),
30
+ siweConfig: {
31
+ options: options.siweConfig?.options || {}
32
+ }
33
+ }
34
+ });
35
+ expect(initialize).toHaveBeenCalledOnce();
36
+ expect(initialize).toHaveBeenCalledWith(mockOptions.adapters, [mainnet, sepolia, solana], {
37
+ connectionControllerClient: expect.any(Object),
38
+ networkControllerClient: expect.any(Object)
39
+ });
40
+ });
41
+ it('should set EIP6963 enabled by default', () => {
42
+ const setEIP6963Enabled = vi.spyOn(OptionsController, 'setEIP6963Enabled');
43
+ new AppKit(mockOptions);
44
+ expect(setEIP6963Enabled).toHaveBeenCalledWith(true);
45
+ });
46
+ it('should set EIP6963 disabled when option is disabled in config', () => {
47
+ const setEIP6963Enabled = vi.spyOn(OptionsController, 'setEIP6963Enabled');
48
+ new AppKit({
49
+ ...mockOptions,
50
+ enableEIP6963: false
51
+ });
52
+ expect(setEIP6963Enabled).toHaveBeenCalledWith(false);
53
+ });
54
+ it('should set partially defaultAccountType', () => {
55
+ const setDefaultAccountTypes = vi.spyOn(OptionsController, 'setDefaultAccountTypes');
56
+ new AppKit({
57
+ ...mockOptions,
58
+ defaultAccountTypes: {
59
+ eip155: 'eoa',
60
+ bip122: 'ordinal'
61
+ }
62
+ });
63
+ expect(setDefaultAccountTypes).toHaveBeenCalledWith({
64
+ eip155: 'eoa',
65
+ bip122: 'ordinal'
66
+ });
67
+ });
68
+ it('should use default network prop when defaultNetwork prop is not included in the networks array', () => {
69
+ vi.spyOn(StorageUtil, 'getActiveCaipNetworkId').mockReturnValueOnce(undefined);
70
+ const setActiveCaipNetwork = vi.spyOn(ChainController, 'setActiveCaipNetwork');
71
+ new AppKit({
72
+ ...mockOptions,
73
+ defaultNetwork: polygon
74
+ });
75
+ expect(setActiveCaipNetwork).toHaveBeenCalledWith(mainnet);
76
+ });
77
+ it('should use default network prop when there is no network in storage', () => {
78
+ vi.spyOn(StorageUtil, 'getActiveCaipNetworkId').mockReturnValueOnce(undefined);
79
+ const setActiveCaipNetwork = vi.spyOn(ChainController, 'setActiveCaipNetwork');
80
+ new AppKit({
81
+ ...mockOptions,
82
+ defaultNetwork: sepolia
83
+ });
84
+ expect(setActiveCaipNetwork).toHaveBeenCalledWith(sepolia);
85
+ });
86
+ it('should not use default network prop when there is a network in storage', () => {
87
+ vi.spyOn(StorageUtil, 'getActiveCaipNetworkId').mockReturnValueOnce(sepolia.caipNetworkId);
88
+ const setActiveCaipNetwork = vi.spyOn(ChainController, 'setActiveCaipNetwork');
89
+ new AppKit({
90
+ ...mockOptions,
91
+ defaultNetwork: polygon
92
+ });
93
+ expect(setActiveCaipNetwork).toHaveBeenCalledWith(sepolia);
94
+ });
95
+ });
96
+ describe('Alert Errors', () => {
97
+ it('should handle alert errors based on error messages', () => {
98
+ const open = vi.spyOn(AlertController, 'open');
99
+ const errors = [
100
+ {
101
+ alert: ErrorUtil.ALERT_ERRORS.INVALID_APP_CONFIGURATION,
102
+ message: 'Error: WebSocket connection closed abnormally with code: 3000 (Unauthorized: origin not allowed)'
103
+ },
104
+ {
105
+ alert: ErrorUtil.ALERT_ERRORS.JWT_TOKEN_NOT_VALID,
106
+ message: 'WebSocket connection closed abnormally with code: 3000 (JWT validation error: JWT Token is not yet valid:)'
107
+ },
108
+ {
109
+ alert: ErrorUtil.ALERT_ERRORS.INVALID_PROJECT_ID,
110
+ message: 'Uncaught Error: WebSocket connection closed abnormally with code: 3000 (Unauthorized: invalid key)'
111
+ }
112
+ ];
113
+ const appKit = new AppKit(mockOptions);
114
+ for (const { alert, message } of errors) {
115
+ // @ts-expect-error
116
+ appKit.handleAlertError(new Error(message));
117
+ expect(open).toHaveBeenCalledWith(alert, 'error');
118
+ }
119
+ });
120
+ });
121
+ });
122
+ //# sourceMappingURL=initialization.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initialization.test.js","sourceRoot":"","sources":["../../../../tests/client/initialization.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { Emitter } from '@reown/appkit-common';
3
+ import { AccountController, BlockchainApiController, ChainController } from '@reown/appkit-core';
4
+ import { AppKit } from '../../src/client/appkit.js';
5
+ import { mainnet, unsupportedNetwork } from '../mocks/Networks';
6
+ import { mockOptions } from '../mocks/Options';
7
+ import { mockBlockchainApiController, mockChainControllerStateWithUnsupportedChain, mockStorageUtil, mockWindowAndDocument } from '../test-utils';
8
+ mockWindowAndDocument();
9
+ mockStorageUtil();
10
+ mockBlockchainApiController();
11
+ describe('Listeners', () => {
12
+ it('should set caip address, profile name and profile image on accountChanged event', async () => {
13
+ const identity = { name: 'vitalik.eth', avatar: null };
14
+ const setCaipAddressSpy = vi.spyOn(AccountController, 'setCaipAddress');
15
+ const fetchIdentitySpy = vi
16
+ .spyOn(BlockchainApiController, 'fetchIdentity')
17
+ .mockResolvedValueOnce(identity);
18
+ const mockAccount = {
19
+ address: '0x123',
20
+ chainId: mainnet.id,
21
+ chainNamespace: mainnet.chainNamespace
22
+ };
23
+ const emitter = new Emitter();
24
+ const appKit = new AppKit({ ...mockOptions, features: { email: false, socials: [] } });
25
+ const setProfileNameSpy = vi.spyOn(appKit, 'setProfileName').mockImplementation(() => { });
26
+ const setProfileImageSpy = vi.spyOn(appKit, 'setProfileImage').mockImplementation(() => { });
27
+ await appKit['syncAccount'](mockAccount);
28
+ emitter.emit('accountChanged', mockAccount);
29
+ expect(setCaipAddressSpy).toHaveBeenCalledWith(`${mockAccount.chainNamespace}:${mockAccount.chainId}:${mockAccount.address}`, 'eip155');
30
+ expect(fetchIdentitySpy).toHaveBeenCalledWith({ address: mockAccount.address });
31
+ expect(setProfileNameSpy).toHaveBeenCalledWith(identity.name, 'eip155');
32
+ expect(setProfileImageSpy).toHaveBeenCalledWith(identity.avatar, 'eip155');
33
+ });
34
+ it('should show unsupported chain UI when network is unsupported and allowUnsupportedChain is false', async () => {
35
+ const showUnsupportedChainUISpy = vi.spyOn(ChainController, 'showUnsupportedChainUI');
36
+ const appKit = new AppKit({
37
+ ...mockOptions,
38
+ allowUnsupportedChain: false,
39
+ features: { email: false, socials: [] }
40
+ });
41
+ mockChainControllerStateWithUnsupportedChain();
42
+ await appKit['syncAccount']({
43
+ address: '0x123',
44
+ chainId: unsupportedNetwork.id,
45
+ chainNamespace: unsupportedNetwork.chainNamespace
46
+ });
47
+ expect(showUnsupportedChainUISpy).toHaveBeenCalled();
48
+ });
49
+ });
50
+ //# sourceMappingURL=listeners.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listeners.test.js","sourceRoot":"","sources":["../../../../tests/client/listeners.test.ts"],"names":[],"mappings":"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"}