@sundaeswap/wallet-lite 0.0.24 → 0.0.26

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 (51) hide show
  1. package/dist/cjs/@types/observer.js.map +1 -1
  2. package/dist/cjs/classes/WalletObserver.class.js +161 -95
  3. package/dist/cjs/classes/WalletObserver.class.js.map +1 -1
  4. package/dist/cjs/react-components/WalletObserverProvider/WalletObserverProvider.js +13 -20
  5. package/dist/cjs/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
  6. package/dist/cjs/react-components/WalletObserverProvider/hooks/effects/useProviderEventListeners.js +6 -10
  7. package/dist/cjs/react-components/WalletObserverProvider/hooks/effects/useProviderEventListeners.js.map +1 -1
  8. package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +65 -27
  9. package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
  10. package/dist/cjs/react-components/contexts/observer/types.js.map +1 -1
  11. package/dist/cjs/react-components/hooks/useWalletHandles.js +67 -52
  12. package/dist/cjs/react-components/hooks/useWalletHandles.js.map +1 -1
  13. package/dist/cjs/react-components/hooks/useWalletObserver.js +6 -3
  14. package/dist/cjs/react-components/hooks/useWalletObserver.js.map +1 -1
  15. package/dist/esm/@types/observer.js.map +1 -1
  16. package/dist/esm/classes/WalletObserver.class.js +64 -0
  17. package/dist/esm/classes/WalletObserver.class.js.map +1 -1
  18. package/dist/esm/react-components/WalletObserverProvider/WalletObserverProvider.js +7 -11
  19. package/dist/esm/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
  20. package/dist/esm/react-components/WalletObserverProvider/hooks/effects/useProviderEventListeners.js +6 -10
  21. package/dist/esm/react-components/WalletObserverProvider/hooks/effects/useProviderEventListeners.js.map +1 -1
  22. package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +34 -14
  23. package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
  24. package/dist/esm/react-components/contexts/observer/types.js.map +1 -1
  25. package/dist/esm/react-components/hooks/useWalletHandles.js +31 -24
  26. package/dist/esm/react-components/hooks/useWalletHandles.js.map +1 -1
  27. package/dist/esm/react-components/hooks/useWalletObserver.js +6 -3
  28. package/dist/esm/react-components/hooks/useWalletObserver.js.map +1 -1
  29. package/dist/types/@types/observer.d.ts +1 -0
  30. package/dist/types/@types/observer.d.ts.map +1 -1
  31. package/dist/types/classes/WalletObserver.class.d.ts +6 -0
  32. package/dist/types/classes/WalletObserver.class.d.ts.map +1 -1
  33. package/dist/types/react-components/WalletObserverProvider/WalletObserverProvider.d.ts.map +1 -1
  34. package/dist/types/react-components/WalletObserverProvider/hooks/effects/useProviderEventListeners.d.ts +2 -1
  35. package/dist/types/react-components/WalletObserverProvider/hooks/effects/useProviderEventListeners.d.ts.map +1 -1
  36. package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts +4 -0
  37. package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts.map +1 -1
  38. package/dist/types/react-components/contexts/observer/types.d.ts +3 -0
  39. package/dist/types/react-components/contexts/observer/types.d.ts.map +1 -1
  40. package/dist/types/react-components/hooks/useWalletHandles.d.ts.map +1 -1
  41. package/dist/types/react-components/hooks/useWalletObserver.d.ts.map +1 -1
  42. package/dist/types/tsconfig.build.tsbuildinfo +1 -1
  43. package/package.json +1 -1
  44. package/src/@types/observer.ts +1 -0
  45. package/src/classes/WalletObserver.class.ts +76 -0
  46. package/src/react-components/WalletObserverProvider/WalletObserverProvider.tsx +6 -9
  47. package/src/react-components/WalletObserverProvider/hooks/effects/useProviderEventListeners.ts +7 -15
  48. package/src/react-components/WalletObserverProvider/hooks/useWalletObserverState.ts +44 -16
  49. package/src/react-components/contexts/observer/types.ts +3 -0
  50. package/src/react-components/hooks/useWalletHandles.ts +69 -62
  51. package/src/react-components/hooks/useWalletObserver.ts +7 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sundaeswap/wallet-lite",
3
- "version": "0.0.24",
3
+ "version": "0.0.26",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",
@@ -66,6 +66,7 @@ export interface IResolvedWalletObserverOptions<
66
66
  persistence: boolean;
67
67
  peerConnectArgs: DAppPeerConnectParameters;
68
68
  connectTimeout: number;
69
+ debug: boolean;
69
70
  }
70
71
 
71
72
  /**
@@ -78,6 +78,7 @@ export class WalletObserver<
78
78
  metadataResolver: this.fallbackMetadataResolver,
79
79
  persistence: false,
80
80
  connectTimeout: 10000,
81
+ debug: false,
81
82
  peerConnectArgs: {
82
83
  dAppInfo: {
83
84
  name: "Placeholder dApp Connecter Name",
@@ -141,6 +142,8 @@ export class WalletObserver<
141
142
  );
142
143
  }
143
144
 
145
+ const start = performance.now();
146
+
144
147
  try {
145
148
  this._performingSync = true;
146
149
  this.dispatch(EWalletObserverEvents.SYNCING_WALLET_START);
@@ -185,6 +188,10 @@ export class WalletObserver<
185
188
  this.dispatch(EWalletObserverEvents.SYNCING_WALLET_END, result);
186
189
  this._performingSync = false;
187
190
 
191
+ const end = performance.now();
192
+ if (this._options.debug) {
193
+ console.log(`sync: ${end - start}ms`);
194
+ }
188
195
  return result;
189
196
  } catch (e) {
190
197
  this._performingSync = false;
@@ -203,6 +210,15 @@ export class WalletObserver<
203
210
  return this._performingSync;
204
211
  }
205
212
 
213
+ /**
214
+ * Helper method to check if the instance has an active connection.
215
+ *
216
+ * @returns {boolean}
217
+ */
218
+ hasActiveConnection(): boolean {
219
+ return Boolean(this._activeWallet && this.api);
220
+ }
221
+
206
222
  /**
207
223
  * Synchronizes the API with the wallet. This is useful if the account has changed,
208
224
  * but the underlying intent has not.
@@ -267,6 +283,7 @@ export class WalletObserver<
267
283
  connectWallet = async (
268
284
  extension: TSupportedWalletExtensions
269
285
  ): Promise<void> => {
286
+ const start = performance.now();
270
287
  this.dispatch(EWalletObserverEvents.CONNECT_WALLET_START);
271
288
 
272
289
  let attempts = 0;
@@ -310,9 +327,15 @@ export class WalletObserver<
310
327
  this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END, {
311
328
  extension,
312
329
  });
330
+
331
+ const end = performance.now();
332
+ if (this._options.debug) {
333
+ console.log(`connectWallet: ${end - start}ms`);
334
+ }
313
335
  };
314
336
 
315
337
  getCip45Instance = async () => {
338
+ const start = performance.now();
316
339
  if (!this.peerConnectInstance) {
317
340
  const { DAppPeerConnect } = await getPeerConnect();
318
341
  this.peerConnectInstance = new DAppPeerConnect(
@@ -320,6 +343,11 @@ export class WalletObserver<
320
343
  );
321
344
  }
322
345
 
346
+ const end = performance.now();
347
+ if (this._options.debug) {
348
+ console.log(`getCip45Instance: ${end - start}ms`);
349
+ }
350
+
323
351
  return {
324
352
  name: this._options.peerConnectArgs.dAppInfo.name,
325
353
  icon: this.peerConnectInstance.getIdenticon(),
@@ -376,6 +404,8 @@ export class WalletObserver<
376
404
  throw new Error("Attempted to query balance without an API instance.");
377
405
  }
378
406
 
407
+ const start = performance.now();
408
+
379
409
  this.dispatch(EWalletObserverEvents.GET_BALANCE_MAP_START);
380
410
  const [cbor, { Serialization }, { typedHex }] = await Promise.all([
381
411
  this.api.getBalance(),
@@ -411,6 +441,10 @@ export class WalletObserver<
411
441
  balanceMap,
412
442
  });
413
443
 
444
+ const end = performance.now();
445
+ if (this._options.debug) {
446
+ console.log(`getBalanceMap: ${end - start}ms`);
447
+ }
414
448
  return balanceMap;
415
449
  };
416
450
 
@@ -424,8 +458,15 @@ export class WalletObserver<
424
458
  throw new Error("Attempted to query network without an API instance.");
425
459
  }
426
460
 
461
+ const start = performance.now();
462
+
427
463
  const val = await this.api.getNetworkId();
428
464
  this.network = val;
465
+
466
+ const end = performance.now();
467
+ if (this._options.debug) {
468
+ console.log(`getNetwork: ${end - start}ms`);
469
+ }
429
470
  return val;
430
471
  };
431
472
 
@@ -441,6 +482,8 @@ export class WalletObserver<
441
482
  );
442
483
  }
443
484
 
485
+ const start = performance.now();
486
+
444
487
  const [cbor, { Cardano }, { typedHex }] = await Promise.all([
445
488
  this.api.getUsedAddresses(),
446
489
  getCardanoCore(),
@@ -451,6 +494,10 @@ export class WalletObserver<
451
494
  Cardano.Address.fromBytes(typedHex(val)).toBech32()
452
495
  );
453
496
 
497
+ const end = performance.now();
498
+ if (this._options.debug) {
499
+ console.log(`getUsedAddresses: ${end - start}ms`);
500
+ }
454
501
  return data;
455
502
  };
456
503
 
@@ -466,6 +513,8 @@ export class WalletObserver<
466
513
  );
467
514
  }
468
515
 
516
+ const start = performance.now();
517
+
469
518
  const [cbor, { Cardano }, { typedHex }] = await Promise.all([
470
519
  this.api.getUnusedAddresses(),
471
520
  getCardanoCore(),
@@ -476,6 +525,10 @@ export class WalletObserver<
476
525
  Cardano.Address.fromBytes(typedHex(val)).toBech32()
477
526
  );
478
527
 
528
+ const end = performance.now();
529
+ if (this._options.debug) {
530
+ console.log(`getUnusedAddresses: ${end - start}ms`);
531
+ }
479
532
  return data;
480
533
  };
481
534
 
@@ -489,6 +542,8 @@ export class WalletObserver<
489
542
  throw new Error("Attempted to query UTXOs without an API instance.");
490
543
  }
491
544
 
545
+ const start = performance.now();
546
+
492
547
  const [cbor, { Serialization }, { typedHex }] = await Promise.all([
493
548
  this.api.getUtxos(),
494
549
  getCardanoCore(),
@@ -506,6 +561,10 @@ export class WalletObserver<
506
561
  return txOutput;
507
562
  });
508
563
 
564
+ const end = performance.now();
565
+ if (this._options.debug) {
566
+ console.log(`getUtxos: ${end - start}ms`);
567
+ }
509
568
  return data;
510
569
  };
511
570
 
@@ -519,6 +578,8 @@ export class WalletObserver<
519
578
  throw new Error("Attempted to query UTXOs without an API instance.");
520
579
  }
521
580
 
581
+ const start = performance.now();
582
+
522
583
  const [cbor, { Serialization }, { typedHex }] = await Promise.all([
523
584
  (async () => {
524
585
  const funcCall =
@@ -545,6 +606,10 @@ export class WalletObserver<
545
606
  return txOutput;
546
607
  });
547
608
 
609
+ const end = performance.now();
610
+ if (this._options.debug) {
611
+ console.log(`getCollateral: ${end - start}ms`);
612
+ }
548
613
  return data;
549
614
  };
550
615
 
@@ -558,6 +623,8 @@ export class WalletObserver<
558
623
  private __metadataResolverWithCache = async (
559
624
  assetIds: string[]
560
625
  ): Promise<Map<string, AssetMetadata>> => {
626
+ const start = performance.now();
627
+
561
628
  if (this._cachedMetadata) {
562
629
  const cachedKeys = new Set(this._cachedMetadata.keys());
563
630
  const inputKeys = new Set(assetIds);
@@ -566,6 +633,10 @@ export class WalletObserver<
566
633
  cachedKeys.size === inputKeys.size &&
567
634
  [...cachedKeys].every((key) => inputKeys.has(key))
568
635
  ) {
636
+ const end = performance.now();
637
+ if (this._options.debug) {
638
+ console.log(`metadataResolver (cached): ${end - start}ms`);
639
+ }
569
640
  return this._cachedMetadata;
570
641
  }
571
642
  }
@@ -593,6 +664,11 @@ export class WalletObserver<
593
664
  }
594
665
 
595
666
  this._cachedMetadata = newMetadata;
667
+
668
+ const end = performance.now();
669
+ if (this._options.debug) {
670
+ console.log(`metadataResolver: ${end - start}ms`);
671
+ }
596
672
  return newMetadata;
597
673
  };
598
674
 
@@ -22,19 +22,17 @@ const WalletObserverProvider: FC<
22
22
  PropsWithChildren<IWalletObserverProviderProps>
23
23
  > = ({ children, options }) => {
24
24
  const observerRef = useProviderWalletObserverRef(options?.observerOptions);
25
- const { syncWallet, ...reactiveState } = useWalletObserverState(
26
- observerRef.current
27
- );
25
+ const state = useWalletObserverState(observerRef.current);
28
26
 
29
- useProviderEventListeners(observerRef.current, syncWallet);
27
+ useProviderEventListeners(observerRef.current, state);
30
28
  useProviderRefreshInterval(
31
29
  observerRef.current,
32
- syncWallet,
30
+ state.syncWallet,
33
31
  options?.refreshInterval
34
32
  );
35
33
 
36
34
  const derivedState = useDerivedState(observerRef.current, {
37
- usedAddresses: reactiveState.usedAddresses,
35
+ usedAddresses: state.usedAddresses,
38
36
  });
39
37
 
40
38
  // Memoize the context value
@@ -43,13 +41,12 @@ const WalletObserverProvider: FC<
43
41
  observerRef: observerRef,
44
42
  refreshInterval: options?.refreshInterval || 30000,
45
43
  state: {
46
- ...reactiveState,
44
+ ...state,
47
45
  ...derivedState,
48
46
  observer: observerRef.current,
49
- syncWallet,
50
47
  },
51
48
  }),
52
- [options, syncWallet, reactiveState, derivedState]
49
+ [options, state, derivedState]
53
50
  );
54
51
 
55
52
  return (
@@ -3,6 +3,7 @@ import { useEffect } from "react";
3
3
  import { EWalletObserverEvents } from "../../../../@types/events.js";
4
4
  import { WalletObserver } from "../../../../classes/WalletObserver.class.js";
5
5
  import { TWalletProviderHooks } from "../../../contexts/observer/index.js";
6
+ import { useWalletObserverState } from "../useWalletObserverState.js";
6
7
 
7
8
  /**
8
9
  * Internal use only. This is run in every WalletObserverProvider
@@ -15,7 +16,7 @@ import { TWalletProviderHooks } from "../../../contexts/observer/index.js";
15
16
  */
16
17
  export const useProviderEventListeners = (
17
18
  observer: WalletObserver,
18
- syncWallet: () => Promise<void>,
19
+ state: ReturnType<typeof useWalletObserverState>,
19
20
  hooks?: TWalletProviderHooks
20
21
  ) => {
21
22
  /**
@@ -80,28 +81,19 @@ export const useProviderEventListeners = (
80
81
  * Ensure the wallet syncs on connect and disconnect.
81
82
  */
82
83
  useEffect(() => {
83
- window.addEventListener("focus", () => {
84
- syncWallet;
85
- });
84
+ window.addEventListener("focus", state.syncWallet);
86
85
 
87
86
  observer.addEventListener(
88
87
  EWalletObserverEvents.CONNECT_WALLET_END,
89
- syncWallet
88
+ state.syncWallet
90
89
  );
91
90
 
92
- observer.addEventListener(EWalletObserverEvents.DISCONNECT, syncWallet);
93
-
94
91
  return () => {
95
- window.addEventListener("focus", syncWallet);
92
+ window.addEventListener("focus", state.syncWallet);
96
93
  observer.removeEventListener(
97
94
  EWalletObserverEvents.CONNECT_WALLET_END,
98
- syncWallet
99
- );
100
-
101
- observer.removeEventListener(
102
- EWalletObserverEvents.DISCONNECT,
103
- syncWallet
95
+ state.syncWallet
104
96
  );
105
97
  };
106
- }, [observer, syncWallet]);
98
+ }, [observer, state.syncWallet]);
107
99
  };
@@ -1,6 +1,6 @@
1
1
  import type { TransactionUnspentOutput } from "@cardano-sdk/core/dist/cjs/Serialization/index.js";
2
2
  import { AssetAmount } from "@sundaeswap/asset";
3
- import { useCallback, useRef, useState } from "react";
3
+ import { useCallback, useState } from "react";
4
4
 
5
5
  import {
6
6
  TAssetAmountMap,
@@ -19,7 +19,6 @@ import { THandleMetadata } from "../../contexts/observer/index.js";
19
19
  * @param {WalletObserver} observer
20
20
  */
21
21
  export const useWalletObserverState = (observer: WalletObserver) => {
22
- const prevActiveWallet = useRef<TSupportedWalletExtensions>();
23
22
  const [activeWallet, setActiveWallet] =
24
23
  useState<TSupportedWalletExtensions>();
25
24
  const [adaBalance, setAdaBalance] = useState<AssetAmount>(
@@ -38,33 +37,58 @@ export const useWalletObserverState = (observer: WalletObserver) => {
38
37
  const [collateral, setCollateral] = useState<TransactionUnspentOutput[]>();
39
38
  const [ready, setReady] = useState(false);
40
39
  const [isCip45, setIsCip45] = useState(false);
40
+ const [switching, setSwitching] = useState(false);
41
+
42
+ const disconnect = useCallback(() => {
43
+ // Reset observer state.
44
+ observer.disconnect();
45
+
46
+ // Reset state.
47
+ setAdaBalance(new AssetAmount(0n));
48
+ setBalance(new WalletBalanceMap(observer));
49
+ setHandleMetadata(new WalletAssetMap());
50
+ setUsedAddresses([]);
51
+ setUnusedAddresses([]);
52
+ setActiveWallet(undefined);
53
+ setNetwork(undefined);
54
+ setUtxos(undefined);
55
+ setCollateral(undefined);
56
+ setReady(false);
57
+ setIsCip45(false);
58
+ }, [observer]);
59
+
60
+ const connectWallet = useCallback(
61
+ async (wallet: TSupportedWalletExtensions) => {
62
+ if (
63
+ observer.hasActiveConnection() &&
64
+ wallet !== observer.getActiveWallet()
65
+ ) {
66
+ setSwitching(true);
67
+ }
68
+
69
+ await observer.connectWallet(wallet);
70
+ setSwitching(false);
71
+ },
72
+ [observer, setSwitching]
73
+ );
41
74
 
42
75
  const syncWallet = useCallback(async () => {
43
- if (observer.isSyncing()) {
76
+ if (observer.isSyncing() || !observer.hasActiveConnection()) {
44
77
  return;
45
78
  }
46
79
 
47
80
  const newWallet = observer.getActiveWallet();
48
-
49
81
  if (!newWallet) {
50
- setAdaBalance(new AssetAmount(0n));
51
- setBalance(new WalletBalanceMap(observer));
52
- setUsedAddresses([]);
53
- setUnusedAddresses([]);
54
- setActiveWallet(undefined);
55
- setNetwork(undefined);
56
- setUtxos(undefined);
57
- setCollateral(undefined);
82
+ disconnect();
58
83
  return;
59
84
  }
60
85
 
61
- prevActiveWallet.current = newWallet;
86
+ const freshData = await observer.sync();
87
+
62
88
  setActiveWallet((prevWallet) =>
63
89
  newWallet === prevWallet ? prevWallet : newWallet
64
90
  );
65
91
 
66
- const freshData = await observer.sync();
67
-
68
92
  const newAdaBalance = freshData.balanceMap.get(WalletObserver.ADA_ASSET_ID);
69
93
  if (newAdaBalance) {
70
94
  setAdaBalance((prevBalance) =>
@@ -118,7 +142,7 @@ export const useWalletObserverState = (observer: WalletObserver) => {
118
142
 
119
143
  setReady(true);
120
144
  setIsCip45(newWallet.includes("p2p"));
121
- }, [observer]);
145
+ }, [observer, disconnect]);
122
146
 
123
147
  return {
124
148
  activeWallet,
@@ -142,6 +166,10 @@ export const useWalletObserverState = (observer: WalletObserver) => {
142
166
  collateral,
143
167
  setCollateral,
144
168
  syncWallet,
169
+ disconnect,
170
+ connectWallet,
171
+ switching,
172
+ setSwitching,
145
173
  ready,
146
174
  setReady,
147
175
  };
@@ -75,7 +75,10 @@ export interface IWalletObserverState<
75
75
  setUnusedAddresses: Dispatch<SetStateAction<string[]>>;
76
76
  usedAddresses: string[];
77
77
  setUsedAddresses: Dispatch<SetStateAction<string[]>>;
78
+ switching: boolean;
78
79
  syncWallet: () => Promise<void>;
80
+ disconnect: () => void;
81
+ connectWallet: (wallet: TSupportedWalletExtensions) => Promise<void>;
79
82
  };
80
83
  }
81
84
 
@@ -33,45 +33,53 @@ export const useWalletHandles = <
33
33
  }
34
34
 
35
35
  try {
36
- const HandleClient = await import("@koralabs/adahandle-sdk");
37
- const context =
38
- state.network === 1
39
- ? HandleClient.HandleClientContext.MAINNET
40
- : HandleClient.HandleClientContext.PREVIEW;
41
-
42
- // @ts-ignore Type isn't exported from default.
43
- const sdk = new HandleClient({
44
- context,
45
- provider: new HandleClient.KoraLabsProvider(context),
46
- });
47
-
48
- // Restore once SDK updated
49
- const walletHandlesWithDataArray = [...walletHandles.entries()];
50
- const walletHandleDataArray: IHandle[] = await sdk
51
- .provider()
52
- .getAllDataBatch(
53
- walletHandlesWithDataArray.map(([key]) => ({
54
- value: key.split(".")[1],
55
- }))
56
- );
57
-
58
- walletHandlesWithDataArray.forEach(([key, asset]) => {
59
- const matchingData = walletHandleDataArray.find(
60
- ({ hex }) => hex === key.split(".")[1]
61
- ) as IHandle;
62
-
63
- walletHandles.set(
64
- normalizeAssetIdWithDot(key),
65
- asset
66
- .withMetadata({
67
- ...matchingData,
68
- ...asset.metadata,
69
- assetId: normalizeAssetIdWithDot(asset.metadata.assetId),
70
- decimals: 0,
71
- })
72
- .withAmount(1n)
73
- );
74
- });
36
+ await import("@koralabs/adahandle-sdk").then(
37
+ async ({
38
+ default: HandleClient,
39
+ HandleClientContext,
40
+ KoraLabsProvider,
41
+ }) => {
42
+ setLoadingHandles(true);
43
+ const context =
44
+ state.network === 1
45
+ ? HandleClientContext.MAINNET
46
+ : HandleClientContext.PREVIEW;
47
+
48
+ // @ts-ignore Type isn't exported from default.
49
+ const sdk = new HandleClient({
50
+ context,
51
+ provider: new KoraLabsProvider(context),
52
+ });
53
+
54
+ // Restore once SDK updated
55
+ const walletHandlesWithDataArray = [...walletHandles.entries()];
56
+ const walletHandleDataArray: IHandle[] = await sdk
57
+ .provider()
58
+ .getAllDataBatch(
59
+ walletHandlesWithDataArray.map(([key]) => ({
60
+ value: key.split(".")[1],
61
+ }))
62
+ );
63
+
64
+ walletHandlesWithDataArray.forEach(([key, asset]) => {
65
+ const matchingData = walletHandleDataArray.find(
66
+ ({ hex }) => hex === key.split(".")[1]
67
+ ) as IHandle;
68
+
69
+ walletHandles.set(
70
+ normalizeAssetIdWithDot(key),
71
+ asset
72
+ .withMetadata({
73
+ ...matchingData,
74
+ ...asset.metadata,
75
+ assetId: normalizeAssetIdWithDot(asset.metadata.assetId),
76
+ decimals: 0,
77
+ })
78
+ .withAmount(1n)
79
+ );
80
+ });
81
+ }
82
+ );
75
83
 
76
84
  return walletHandles;
77
85
  } catch (e) {
@@ -79,35 +87,34 @@ export const useWalletHandles = <
79
87
  return walletHandles;
80
88
  }
81
89
  // We only want to update the callback if the Handle keys change.
82
- }, [state.balance, setLoadingHandles]);
90
+ }, [state.balance]);
83
91
 
84
92
  useEffect(() => {
85
- syncHandles()
86
- .then((newHandles) => {
87
- setHandles((prevHandles) => {
88
- let handleMetadataChanged = false;
89
-
90
- if (newHandles.size !== prevHandles?.size) {
91
- handleMetadataChanged = true;
92
- } else {
93
- for (const [key, val] of newHandles) {
94
- if (
95
- !prevHandles.has(key) ||
96
- prevHandles.get(key)?.amount !== val?.amount
97
- ) {
98
- handleMetadataChanged = true;
99
- }
93
+ syncHandles().then((newHandles) => {
94
+ setHandles((prevHandles) => {
95
+ let handleMetadataChanged = false;
96
+
97
+ if (newHandles.size !== prevHandles?.size) {
98
+ handleMetadataChanged = true;
99
+ } else {
100
+ for (const [key, val] of newHandles) {
101
+ if (
102
+ !prevHandles.has(key) ||
103
+ prevHandles.get(key)?.amount !== val?.amount
104
+ ) {
105
+ handleMetadataChanged = true;
100
106
  }
101
107
  }
108
+ }
102
109
 
103
- if (!handleMetadataChanged) {
104
- return prevHandles;
105
- }
110
+ if (!handleMetadataChanged) {
111
+ return prevHandles;
112
+ }
106
113
 
107
- return newHandles;
108
- });
109
- })
110
- .then(() => setLoadingHandles((prevValue) => !prevValue));
114
+ return newHandles;
115
+ });
116
+ setLoadingHandles(() => false);
117
+ });
111
118
  }, [memoizedHandleDep, syncHandles, setHandles, setLoadingHandles]);
112
119
 
113
120
  const data = useMemo(
@@ -29,9 +29,12 @@ export const useWalletObserver = <
29
29
  utxos: state.utxos,
30
30
  collateral: state.collateral,
31
31
  observer: state.observer,
32
- syncWallet: state.syncWallet,
33
32
  unusedAddresses: state.unusedAddresses,
34
33
  usedAddresses: state.usedAddresses,
34
+ syncWallet: state.syncWallet,
35
+ disconnect: state.disconnect,
36
+ connectWallet: state.connectWallet,
37
+ switching: state.switching,
35
38
  };
36
39
 
37
40
  return result;
@@ -44,12 +47,15 @@ export const useWalletObserver = <
44
47
  state.network,
45
48
  state.observer,
46
49
  state.syncWallet,
50
+ state.disconnect,
51
+ state.connectWallet,
47
52
  state.unusedAddresses,
48
53
  state.usedAddresses,
49
54
  state.utxos,
50
55
  state.collateral,
51
56
  state.ready,
52
57
  state.isCip45,
58
+ state.switching,
53
59
  ]);
54
60
 
55
61
  return memoizedState;