@mictonode/widget 0.3.22 → 0.3.23

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 (89) hide show
  1. package/README.md +2 -2
  2. package/dist/{ConstantsUtil-df193f67.js → ConstantsUtil-f9dc60b6.js} +3 -3
  3. package/dist/{ConstantsUtil-1b0c0436.js → ConstantsUtil-fb0ff2e5.js} +1 -1
  4. package/dist/{ExchangeController-953f14bc.js → ExchangeController-173fd1dc.js} +2 -2
  5. package/dist/{HelpersUtil-3810bb58.js → HelpersUtil-4891ff5f.js} +4 -4
  6. package/dist/{ReownAuthentication-7c5b6e79.js → ReownAuthentication-bba89dc5.js} +2 -2
  7. package/dist/{SwapController-e1a7b5f8.js → SwapController-e8b097ca.js} +3 -3
  8. package/dist/{abis-61cccfbf.js → abis-96fed285.js} +1 -1
  9. package/dist/{assertCurrentChain-0c3d6c93.js → assertCurrentChain-b60aa59f.js} +1 -1
  10. package/dist/{ccip-80fe88fb.js → ccip-8f82ae2a.js} +6 -6
  11. package/dist/{data-capture-7edeb077.js → data-capture-7009ffa0.js} +8 -8
  12. package/dist/{email-40537ec5.js → email-d6e2da58.js} +12 -12
  13. package/dist/{embedded-wallet-f71f6169.js → embedded-wallet-48284179.js} +14 -14
  14. package/dist/{encodeFunctionData-91e7c0f6.js → encodeFunctionData-b24a0b2b.js} +2 -2
  15. package/dist/{fallback-1ab5a270.js → fallback-ae0315d4.js} +2 -2
  16. package/dist/features-82db0d52.js +8 -0
  17. package/dist/{hashTypedData-1e059dc4.js → hashTypedData-c13ba550.js} +2 -2
  18. package/dist/{http-d9e0a50a.js → http-90ef23f3.js} +2 -2
  19. package/dist/{index-d3f36c31.js → index-0ac134af.js} +34 -34
  20. package/dist/{index-2cd6a2b2.js → index-19f302c4.js} +3 -3
  21. package/dist/{index-78c5b9e2.js → index-22727038.js} +3 -3
  22. package/dist/{index-144edd3f.js → index-270ff8a2.js} +11 -11
  23. package/dist/{index-abb0ff46.js → index-29eb95bd.js} +3 -3
  24. package/dist/{index-9cc1116b.js → index-2a90711e.js} +2 -2
  25. package/dist/{index-289a865f.js → index-2de6c5bf.js} +4 -4
  26. package/dist/{index-fbced89b.js → index-3de7fa96.js} +3 -3
  27. package/dist/{index-26b53c8a.js → index-42a8a5ec.js} +15 -15
  28. package/dist/{index-58ec291c.js → index-4bd03aed.js} +7 -7
  29. package/dist/{index-85bc86d7.js → index-52edc95a.js} +2 -2
  30. package/dist/{index-04dd1ab3.js → index-577d2709.js} +4 -4
  31. package/dist/{index-4a4ee1e7.js → index-582e4199.js} +7 -7
  32. package/dist/{index-72706598.js → index-617b2147.js} +6 -6
  33. package/dist/{index-0b6166c5.js → index-6a0902fc.js} +2 -2
  34. package/dist/{index-a37d4c03.js → index-6d51f24f.js} +2 -2
  35. package/dist/{index-759b09b0.js → index-80954332.js} +3 -3
  36. package/dist/{index-0e2c49ad.js → index-95777860.js} +7 -7
  37. package/dist/{index-d9effd37.js → index-96729706.js} +13 -13
  38. package/dist/{index-39f31546.js → index-997bc756.js} +2 -2
  39. package/dist/{index-cb4d3345.js → index-a41841e6.js} +3 -3
  40. package/dist/{index-c10f5e72.js → index-adaa2ea4.js} +3 -3
  41. package/dist/{index-97b58f89.js → index-b37b670f.js} +11 -11
  42. package/dist/{index-0763de43.js → index-b8e2c282.js} +3 -3
  43. package/dist/{index-1f02e7d0.js → index-bb5e4071.js} +1 -1
  44. package/dist/{index-3678e7d8.js → index-bf40b971.js} +2 -2
  45. package/dist/{index-a4f054e9.js → index-cb69565e.js} +2 -2
  46. package/dist/{index-197dfd69.js → index-cbb6096a.js} +3 -3
  47. package/dist/{index-119c358f.js → index-ce6854ef.js} +14 -14
  48. package/dist/{index-4fdc7a25.js → index-d7e2a4a3.js} +2 -2
  49. package/dist/{index-0176180b.js → index-e7fbb597.js} +4 -4
  50. package/dist/{index-d5e3e4ba.js → index-f4cd8dd1.js} +3 -3
  51. package/dist/{index-a0c590f7.js → index-f886cf92.js} +2 -2
  52. package/dist/{index-95e1a01b.js → index-faade258.js} +3 -3
  53. package/dist/{localBatchGatewayRequest-8fd1b198.js → localBatchGatewayRequest-ade4aa2f.js} +3 -3
  54. package/dist/{main-7ddb238e.js → main-3b573cfc.js} +38694 -38472
  55. package/dist/{networks-d2ae1da7.js → networks-446d3512.js} +10 -10
  56. package/dist/{onramp-2966f1b1.js → onramp-57d19c5d.js} +19 -19
  57. package/dist/{parseSignature-fca372a1.js → parseSignature-783d626a.js} +8 -8
  58. package/dist/{pay-with-exchange-b0198b3f.js → pay-with-exchange-c59a5773.js} +22 -22
  59. package/dist/ping-widget.js +1 -1
  60. package/dist/ping-widget.umd.cjs +680 -680
  61. package/dist/{query.lcd-873499ca.js → query.lcd-447fb91a.js} +1 -1
  62. package/dist/{query.rpc.Query-d2bcf632.js → query.rpc.Query-97503d87.js} +1 -1
  63. package/dist/{receive-6fbb6662.js → receive-3073a49d.js} +6 -6
  64. package/dist/{ref-2c86b029.js → ref-6c3aabc7.js} +2 -2
  65. package/dist/{send-630ed203.js → send-42403797.js} +22 -22
  66. package/dist/{serializeAuthorizationList-e95a85d8.js → serializeAuthorizationList-70ec977c.js} +4 -4
  67. package/dist/{sha2-c04ffd62.js → sha2-249ae7eb.js} +2 -2
  68. package/dist/{socials-73a5efb0.js → socials-69b0cf18.js} +18 -18
  69. package/dist/{swaps-7b57265f.js → swaps-4e99bb0f.js} +18 -18
  70. package/dist/{transactions-876c066c.js → transactions-1d0c2669.js} +9 -9
  71. package/dist/{tx.rpc.msg-4d8bd1a4.js → tx.rpc.msg-8aa727ea.js} +1 -1
  72. package/dist/{tx.rpc.msg-d08b8ebe.js → tx.rpc.msg-a26b3557.js} +1 -1
  73. package/dist/{verifyHash-ee28e3d7.js → verifyHash-c8962067.js} +5 -5
  74. package/dist/{vue-bea1a08b.js → vue-9dc93a14.js} +10 -10
  75. package/dist/{w3m-modal-7d61c210.js → w3m-modal-291afec4.js} +25 -25
  76. package/dist/{zora-1091e7bb.js → zora-061565b0.js} +4 -4
  77. package/lib/components/ConnectWallet/index.vue +113 -31
  78. package/lib/wallet/KeplrSessionManager.ts +142 -0
  79. package/lib/wallet/WalletSessionManager.ts +111 -25
  80. package/lib/wallet/reown/EvmNetworkProvisioner.ts +97 -0
  81. package/lib/wallet/reown/ReownGateway.ts +22 -3
  82. package/package.json +1 -1
  83. package/test/components/ConnectWallet.test.ts +640 -2
  84. package/test/components/ConnectWalletStorage.test.ts +113 -3
  85. package/test/wallet/KeplrSessionManager.test.ts +269 -0
  86. package/test/wallet/WalletSessionManager.test.ts +901 -2
  87. package/test/wallet/reown/EvmNetworkProvisioner.test.ts +264 -0
  88. package/test/wallet/reown/ReownGateway.test.ts +66 -1
  89. package/dist/features-a2f2ff4f.js +0 -8
@@ -1,9 +1,45 @@
1
- import { mount } from '@vue/test-utils';
2
- import { describe, expect, it } from 'vitest';
1
+ import { flushPromises, mount } from '@vue/test-utils';
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
3
3
  import ConnectWallet from '../../lib/components/ConnectWallet/index.vue';
4
4
  import { DEFAULT_HDPATH, WalletName } from '../../lib/wallet/Wallet';
5
5
 
6
+ const keplrEnable = vi.fn(async () => undefined);
7
+ const getAccounts = vi.fn(async () => []);
8
+
9
+ function deferred<T>() {
10
+ let resolve!: (value: T | PromiseLike<T>) => void;
11
+ let reject!: (reason?: unknown) => void;
12
+ const promise = new Promise<T>((resolvePromise, rejectPromise) => {
13
+ resolve = resolvePromise;
14
+ reject = rejectPromise;
15
+ });
16
+ return { promise, resolve, reject };
17
+ }
18
+
6
19
  describe('ConnectWallet storage integration', () => {
20
+ beforeEach(() => {
21
+ localStorage.clear();
22
+ keplrEnable.mockResolvedValue(undefined);
23
+ getAccounts.mockResolvedValue([{
24
+ address: 'cosmos1connected',
25
+ algo: 'secp256k1',
26
+ pubkey: new Uint8Array([1]),
27
+ }]);
28
+ Object.defineProperty(window, 'keplr', {
29
+ configurable: true,
30
+ value: { enable: keplrEnable },
31
+ });
32
+ Object.defineProperty(window, 'getOfflineSigner', {
33
+ configurable: true,
34
+ value: vi.fn(() => ({ getAccounts })),
35
+ });
36
+ });
37
+
38
+ afterEach(() => {
39
+ Reflect.deleteProperty(window, 'keplr');
40
+ Reflect.deleteProperty(window, 'getOfflineSigner');
41
+ });
42
+
7
43
  it('removes the persisted HD-path record when disconnecting', async () => {
8
44
  const connected = {
9
45
  wallet: WalletName.Keplr,
@@ -24,9 +60,83 @@ describe('ConnectWallet storage integration', () => {
24
60
  },
25
61
  });
26
62
 
63
+ await vi.waitFor(() => expect(keplrEnable).toHaveBeenCalledWith('cosmoshub-4'));
64
+ await vi.waitFor(() => expect(getAccounts).toHaveBeenCalledOnce());
65
+ await vi.waitFor(() =>
66
+ expect(wrapper.emitted('connect')).toEqual([[{ value: connected }]]),
67
+ );
68
+ await vi.waitFor(() =>
69
+ expect(wrapper.find('[data-testid="wallet-disconnect"]').exists()).toBe(true),
70
+ );
27
71
  await wrapper.get('[data-testid="wallet-disconnect"]').trigger('click');
28
72
 
29
73
  expect(localStorage.getItem(DEFAULT_HDPATH)).toBeNull();
30
- expect(wrapper.emitted('disconnect')).toEqual([[{ value: connected }]]);
74
+ const disconnectEvents = wrapper.emitted('disconnect')!;
75
+ expect(disconnectEvents[0]).toEqual([{ value: undefined }]);
76
+ expect(disconnectEvents[disconnectEvents.length - 1]).toEqual([
77
+ { value: connected },
78
+ ]);
79
+ });
80
+
81
+ it('clears persisted state when Keplr revalidation fails', async () => {
82
+ keplrEnable.mockRejectedValueOnce(new Error('Keplr unavailable'));
83
+ const connected = {
84
+ wallet: WalletName.Keplr,
85
+ cosmosAddress: 'cosmos1stale',
86
+ hdPath: DEFAULT_HDPATH,
87
+ };
88
+ localStorage.setItem(DEFAULT_HDPATH, JSON.stringify(connected));
89
+ const wrapper = mount(ConnectWallet, {
90
+ props: {
91
+ chainId: 'cosmoshub-4',
92
+ hdPath: DEFAULT_HDPATH,
93
+ addrPrefix: 'cosmos',
94
+ },
95
+ global: { stubs: { Icon: true } },
96
+ });
97
+
98
+ await vi.waitFor(() =>
99
+ expect(localStorage.getItem(DEFAULT_HDPATH)).toBeNull(),
100
+ );
101
+ await flushPromises();
102
+ expect(wrapper.emitted('disconnect')).toEqual([
103
+ [{ value: undefined }],
104
+ ]);
105
+ expect(wrapper.text()).toContain('Connect Wallet');
106
+ });
107
+
108
+ it('preserves a persisted Keplr session when validation is disposed on unmount', async () => {
109
+ const pending = deferred<Array<{
110
+ address: string;
111
+ algo: string;
112
+ pubkey: Uint8Array;
113
+ }>>();
114
+ getAccounts.mockReturnValueOnce(pending.promise);
115
+ const connected = {
116
+ wallet: WalletName.Keplr,
117
+ cosmosAddress: 'cosmos1stored',
118
+ hdPath: DEFAULT_HDPATH,
119
+ };
120
+ const serialized = JSON.stringify(connected);
121
+ localStorage.setItem(DEFAULT_HDPATH, serialized);
122
+ const wrapper = mount(ConnectWallet, {
123
+ props: {
124
+ chainId: 'cosmoshub-4',
125
+ hdPath: DEFAULT_HDPATH,
126
+ addrPrefix: 'cosmos',
127
+ },
128
+ global: { stubs: { Icon: true } },
129
+ });
130
+ await vi.waitFor(() => expect(getAccounts).toHaveBeenCalledOnce());
131
+
132
+ wrapper.unmount();
133
+ pending.resolve([{
134
+ address: 'cosmos1current',
135
+ algo: 'secp256k1',
136
+ pubkey: new Uint8Array([1]),
137
+ }]);
138
+ await flushPromises();
139
+
140
+ expect(localStorage.getItem(DEFAULT_HDPATH)).toBe(serialized);
31
141
  });
32
142
  });
@@ -0,0 +1,269 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import {
3
+ KeplrSessionManager,
4
+ KEPLR_KEYSTORE_EVENT,
5
+ type WalletEventTarget,
6
+ } from '../../lib/wallet/KeplrSessionManager';
7
+ import {
8
+ WalletName,
9
+ type AbstractWallet,
10
+ type Account,
11
+ type WalletArgument,
12
+ } from '../../lib/wallet/Wallet';
13
+
14
+ const hdPath = "m/44'/118/0'/0/0";
15
+ const argument: WalletArgument = {
16
+ chainId: 'cosmoshub-4',
17
+ hdPath,
18
+ prefix: 'cosmos',
19
+ };
20
+
21
+ function deferred<T>() {
22
+ let resolve!: (value: T) => void;
23
+ let reject!: (reason?: unknown) => void;
24
+ const promise = new Promise<T>((resolvePromise, rejectPromise) => {
25
+ resolve = resolvePromise;
26
+ reject = rejectPromise;
27
+ });
28
+ return { promise, resolve, reject };
29
+ }
30
+
31
+ function fakeEvents() {
32
+ let listener: EventListener | undefined;
33
+ const target: WalletEventTarget & { emit(): void } = {
34
+ addEventListener: vi.fn((_type, next) => {
35
+ listener = next;
36
+ }),
37
+ removeEventListener: vi.fn((_type, current) => {
38
+ if (listener === current) listener = undefined;
39
+ }),
40
+ emit() {
41
+ listener?.(new Event(KEPLR_KEYSTORE_EVENT));
42
+ },
43
+ };
44
+ return target;
45
+ }
46
+
47
+ function walletWith(accounts: Promise<Account[]> | Account[]): AbstractWallet {
48
+ return {
49
+ name: WalletName.Keplr,
50
+ getAccounts: vi.fn(async () => await accounts),
51
+ supportCoinType: vi.fn(async () => true),
52
+ sign: vi.fn(),
53
+ };
54
+ }
55
+
56
+ describe('KeplrSessionManager', () => {
57
+ beforeEach(() => localStorage.clear());
58
+
59
+ it('validates, persists and emits the active Keplr account on start', async () => {
60
+ const events = fakeEvents();
61
+ const account = {
62
+ address: 'cosmos1current',
63
+ algo: 'secp256k1',
64
+ pubkey: new Uint8Array([1]),
65
+ };
66
+ const changed = vi.fn();
67
+ const manager = new KeplrSessionManager(
68
+ hdPath,
69
+ () => walletWith([account]),
70
+ events,
71
+ );
72
+
73
+ await manager.start(argument, changed);
74
+
75
+ expect(events.addEventListener).toHaveBeenCalledWith(
76
+ KEPLR_KEYSTORE_EVENT,
77
+ expect.any(Function),
78
+ );
79
+ expect(changed).toHaveBeenLastCalledWith({
80
+ wallet: WalletName.Keplr,
81
+ cosmosAddress: account.address,
82
+ hdPath,
83
+ });
84
+ expect(JSON.parse(localStorage.getItem(hdPath) || '{}')).toMatchObject({
85
+ wallet: WalletName.Keplr,
86
+ cosmosAddress: account.address,
87
+ });
88
+ });
89
+
90
+ it('clears the old session before accepting an account change', async () => {
91
+ const events = fakeEvents();
92
+ let accounts = [{
93
+ address: 'cosmos1first',
94
+ algo: 'secp256k1',
95
+ pubkey: new Uint8Array([1]),
96
+ }];
97
+ const wallet = walletWith(accounts);
98
+ vi.mocked(wallet.getAccounts).mockImplementation(async () => accounts);
99
+ const changed = vi.fn();
100
+ const manager = new KeplrSessionManager(hdPath, () => wallet, events);
101
+ await manager.start(argument, changed);
102
+
103
+ accounts = [{
104
+ address: 'cosmos1second',
105
+ algo: 'secp256k1',
106
+ pubkey: new Uint8Array([2]),
107
+ }];
108
+ events.emit();
109
+
110
+ await vi.waitFor(() =>
111
+ expect(changed).toHaveBeenLastCalledWith(
112
+ expect.objectContaining({ cosmosAddress: 'cosmos1second' }),
113
+ ),
114
+ );
115
+ const firstIndex = changed.mock.calls.findIndex(
116
+ ([value]) => value?.cosmosAddress === 'cosmos1first',
117
+ );
118
+ const secondIndex = changed.mock.calls.findIndex(
119
+ ([value]) => value?.cosmosAddress === 'cosmos1second',
120
+ );
121
+ const disconnectIndex = changed.mock.calls.findIndex(
122
+ ([value], index) =>
123
+ index > firstIndex && index < secondIndex && value === undefined,
124
+ );
125
+ expect(firstIndex).toBeGreaterThan(-1);
126
+ expect(secondIndex).toBeGreaterThan(firstIndex);
127
+ expect(disconnectIndex).toBeGreaterThan(firstIndex);
128
+ expect(disconnectIndex).toBeLessThan(secondIndex);
129
+ });
130
+
131
+ it('collapses duplicate key-store events into one account refresh', async () => {
132
+ const events = fakeEvents();
133
+ const wallet = walletWith([{
134
+ address: 'cosmos1current',
135
+ algo: 'secp256k1',
136
+ pubkey: new Uint8Array([1]),
137
+ }]);
138
+ const manager = new KeplrSessionManager(hdPath, () => wallet, events);
139
+ await manager.start(argument, vi.fn());
140
+ vi.mocked(wallet.getAccounts).mockClear();
141
+
142
+ events.emit();
143
+ events.emit();
144
+
145
+ await vi.waitFor(() =>
146
+ expect(wallet.getAccounts).toHaveBeenCalledTimes(1),
147
+ );
148
+ });
149
+
150
+ it('ignores an older account result after a newer refresh', async () => {
151
+ const events = fakeEvents();
152
+ const first = deferred<Account[]>();
153
+ const second = deferred<Account[]>();
154
+ const wallet = walletWith(first.promise);
155
+ vi.mocked(wallet.getAccounts)
156
+ .mockReturnValueOnce(first.promise)
157
+ .mockReturnValueOnce(second.promise);
158
+ const changed = vi.fn();
159
+ const manager = new KeplrSessionManager(hdPath, () => wallet, events);
160
+ const starting = manager.start(argument, changed);
161
+
162
+ events.emit();
163
+ first.resolve([{
164
+ address: 'cosmos1first',
165
+ algo: 'secp256k1',
166
+ pubkey: new Uint8Array([1]),
167
+ }]);
168
+ await starting;
169
+ second.resolve([{
170
+ address: 'cosmos1second',
171
+ algo: 'secp256k1',
172
+ pubkey: new Uint8Array([2]),
173
+ }]);
174
+ await vi.waitFor(() =>
175
+ expect(changed).toHaveBeenCalledWith(
176
+ expect.objectContaining({ cosmosAddress: 'cosmos1second' }),
177
+ ),
178
+ );
179
+
180
+ expect(
181
+ changed.mock.calls.some(
182
+ ([value]) => value?.cosmosAddress === 'cosmos1first',
183
+ ),
184
+ ).toBe(false);
185
+ });
186
+
187
+ it('ignores a key-store event queued before a new lifecycle starts', async () => {
188
+ const events = fakeEvents();
189
+ const wallet = walletWith([]);
190
+ vi.mocked(wallet.getAccounts)
191
+ .mockResolvedValueOnce([{
192
+ address: 'cosmos1old',
193
+ algo: 'secp256k1',
194
+ pubkey: new Uint8Array([1]),
195
+ }])
196
+ .mockResolvedValueOnce([{
197
+ address: 'cosmos1new',
198
+ algo: 'secp256k1',
199
+ pubkey: new Uint8Array([2]),
200
+ }])
201
+ .mockResolvedValueOnce([{
202
+ address: 'cosmos1unexpected',
203
+ algo: 'secp256k1',
204
+ pubkey: new Uint8Array([3]),
205
+ }]);
206
+ const manager = new KeplrSessionManager(hdPath, () => wallet, events);
207
+ const changed = vi.fn();
208
+ await manager.start(argument, changed);
209
+
210
+ events.emit();
211
+ manager.dispose();
212
+ await manager.start(argument, changed);
213
+
214
+ expect(wallet.getAccounts).toHaveBeenCalledTimes(2);
215
+ expect(changed).toHaveBeenLastCalledWith(
216
+ expect.objectContaining({ cosmosAddress: 'cosmos1new' }),
217
+ );
218
+ });
219
+
220
+ it('fails closed when Keplr account validation fails', async () => {
221
+ const events = fakeEvents();
222
+ localStorage.setItem(hdPath, '{"wallet":"Keplr","cosmosAddress":"stale"}');
223
+ const changed = vi.fn();
224
+ const failed = vi.fn();
225
+ const manager = new KeplrSessionManager(
226
+ hdPath,
227
+ () => walletWith(Promise.reject(new Error('Keplr unavailable'))),
228
+ events,
229
+ );
230
+
231
+ await manager.start(argument, changed, failed);
232
+
233
+ expect(changed).toHaveBeenCalledWith(undefined);
234
+ expect(localStorage.getItem(hdPath)).toBeNull();
235
+ expect(failed).toHaveBeenCalledWith(
236
+ expect.objectContaining({ message: expect.any(String) }),
237
+ );
238
+ });
239
+
240
+ it('removes its listener and cancels pending work on dispose', async () => {
241
+ const events = fakeEvents();
242
+ const pending = deferred<Account[]>();
243
+ const changed = vi.fn();
244
+ const manager = new KeplrSessionManager(
245
+ hdPath,
246
+ () => walletWith(pending.promise),
247
+ events,
248
+ );
249
+ const starting = manager.start(argument, changed);
250
+
251
+ manager.dispose();
252
+ pending.resolve([{
253
+ address: 'cosmos1late',
254
+ algo: 'secp256k1',
255
+ pubkey: new Uint8Array([1]),
256
+ }]);
257
+ await starting;
258
+
259
+ expect(events.removeEventListener).toHaveBeenCalledWith(
260
+ KEPLR_KEYSTORE_EVENT,
261
+ expect.any(Function),
262
+ );
263
+ expect(
264
+ changed.mock.calls.some(
265
+ ([value]) => value?.cosmosAddress === 'cosmos1late',
266
+ ),
267
+ ).toBe(false);
268
+ });
269
+ });