@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.
- package/dist/cjs/@types/observer.js.map +1 -1
- package/dist/cjs/classes/WalletObserver.class.js +161 -95
- package/dist/cjs/classes/WalletObserver.class.js.map +1 -1
- package/dist/cjs/react-components/WalletObserverProvider/WalletObserverProvider.js +13 -20
- package/dist/cjs/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
- package/dist/cjs/react-components/WalletObserverProvider/hooks/effects/useProviderEventListeners.js +6 -10
- package/dist/cjs/react-components/WalletObserverProvider/hooks/effects/useProviderEventListeners.js.map +1 -1
- package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +65 -27
- package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
- package/dist/cjs/react-components/contexts/observer/types.js.map +1 -1
- package/dist/cjs/react-components/hooks/useWalletHandles.js +67 -52
- package/dist/cjs/react-components/hooks/useWalletHandles.js.map +1 -1
- package/dist/cjs/react-components/hooks/useWalletObserver.js +6 -3
- package/dist/cjs/react-components/hooks/useWalletObserver.js.map +1 -1
- package/dist/esm/@types/observer.js.map +1 -1
- package/dist/esm/classes/WalletObserver.class.js +64 -0
- package/dist/esm/classes/WalletObserver.class.js.map +1 -1
- package/dist/esm/react-components/WalletObserverProvider/WalletObserverProvider.js +7 -11
- package/dist/esm/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
- package/dist/esm/react-components/WalletObserverProvider/hooks/effects/useProviderEventListeners.js +6 -10
- package/dist/esm/react-components/WalletObserverProvider/hooks/effects/useProviderEventListeners.js.map +1 -1
- package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +34 -14
- package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
- package/dist/esm/react-components/contexts/observer/types.js.map +1 -1
- package/dist/esm/react-components/hooks/useWalletHandles.js +31 -24
- package/dist/esm/react-components/hooks/useWalletHandles.js.map +1 -1
- package/dist/esm/react-components/hooks/useWalletObserver.js +6 -3
- package/dist/esm/react-components/hooks/useWalletObserver.js.map +1 -1
- package/dist/types/@types/observer.d.ts +1 -0
- package/dist/types/@types/observer.d.ts.map +1 -1
- package/dist/types/classes/WalletObserver.class.d.ts +6 -0
- package/dist/types/classes/WalletObserver.class.d.ts.map +1 -1
- package/dist/types/react-components/WalletObserverProvider/WalletObserverProvider.d.ts.map +1 -1
- package/dist/types/react-components/WalletObserverProvider/hooks/effects/useProviderEventListeners.d.ts +2 -1
- package/dist/types/react-components/WalletObserverProvider/hooks/effects/useProviderEventListeners.d.ts.map +1 -1
- package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts +4 -0
- package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts.map +1 -1
- package/dist/types/react-components/contexts/observer/types.d.ts +3 -0
- package/dist/types/react-components/contexts/observer/types.d.ts.map +1 -1
- package/dist/types/react-components/hooks/useWalletHandles.d.ts.map +1 -1
- package/dist/types/react-components/hooks/useWalletObserver.d.ts.map +1 -1
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/@types/observer.ts +1 -0
- package/src/classes/WalletObserver.class.ts +76 -0
- package/src/react-components/WalletObserverProvider/WalletObserverProvider.tsx +6 -9
- package/src/react-components/WalletObserverProvider/hooks/effects/useProviderEventListeners.ts +7 -15
- package/src/react-components/WalletObserverProvider/hooks/useWalletObserverState.ts +44 -16
- package/src/react-components/contexts/observer/types.ts +3 -0
- package/src/react-components/hooks/useWalletHandles.ts +69 -62
- package/src/react-components/hooks/useWalletObserver.ts +7 -1
package/package.json
CHANGED
package/src/@types/observer.ts
CHANGED
|
@@ -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
|
|
26
|
-
observerRef.current
|
|
27
|
-
);
|
|
25
|
+
const state = useWalletObserverState(observerRef.current);
|
|
28
26
|
|
|
29
|
-
useProviderEventListeners(observerRef.current,
|
|
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:
|
|
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
|
-
...
|
|
44
|
+
...state,
|
|
47
45
|
...derivedState,
|
|
48
46
|
observer: observerRef.current,
|
|
49
|
-
syncWallet,
|
|
50
47
|
},
|
|
51
48
|
}),
|
|
52
|
-
[options,
|
|
49
|
+
[options, state, derivedState]
|
|
53
50
|
);
|
|
54
51
|
|
|
55
52
|
return (
|
package/src/react-components/WalletObserverProvider/hooks/effects/useProviderEventListeners.ts
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
|
90
|
+
}, [state.balance]);
|
|
83
91
|
|
|
84
92
|
useEffect(() => {
|
|
85
|
-
syncHandles()
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
110
|
+
if (!handleMetadataChanged) {
|
|
111
|
+
return prevHandles;
|
|
112
|
+
}
|
|
106
113
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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;
|