@talismn/balances-react 1.0.1 → 1.0.3

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.
@@ -83,12 +83,40 @@ export declare const chaindataAtom: import("jotai").Atom<{
83
83
  type: "scroll";
84
84
  l1GasPriceOracle: `0x${string}`;
85
85
  } | undefined;
86
- contracts?: Partial<Record<"Erc20Aggregator" | "Multicall3", `0x${string}`>> | undefined;
86
+ contracts?: {
87
+ Erc20Aggregator?: `0x${string}` | undefined;
88
+ Multicall3?: `0x${string}` | undefined;
89
+ } | undefined;
87
90
  balancesConfig?: {
88
91
  "evm-native"?: undefined;
89
92
  "evm-erc20"?: undefined;
90
93
  "evm-uniswapv2"?: undefined;
91
94
  } | undefined;
95
+ } | {
96
+ id: string;
97
+ name: string;
98
+ nativeTokenId: string;
99
+ nativeCurrency: {
100
+ decimals: number;
101
+ symbol: string;
102
+ name: string;
103
+ coingeckoId?: string | undefined;
104
+ mirrorOf?: string | undefined;
105
+ logo?: string | undefined;
106
+ };
107
+ blockExplorerUrls: string[];
108
+ platform: "solana";
109
+ genesisHash: string;
110
+ rpcs: string[];
111
+ isTestnet?: boolean | undefined;
112
+ isDefault?: boolean | undefined;
113
+ forceScan?: boolean | undefined;
114
+ logo?: string | undefined;
115
+ themeColor?: string | undefined;
116
+ balancesConfig?: {
117
+ "sol-native"?: undefined;
118
+ "sol-spl"?: undefined;
119
+ } | undefined;
92
120
  })[];
93
121
  tokens: ({
94
122
  id: string;
@@ -234,6 +262,33 @@ export declare const chaindataAtom: import("jotai").Atom<{
234
262
  coingeckoId?: string | undefined;
235
263
  noDiscovery?: boolean | undefined;
236
264
  mirrorOf?: string | undefined;
265
+ } | {
266
+ id: string;
267
+ networkId: string;
268
+ decimals: number;
269
+ symbol: string;
270
+ type: "sol-native";
271
+ platform: "solana";
272
+ isDefault?: boolean | undefined;
273
+ name?: string | undefined;
274
+ logo?: string | undefined;
275
+ coingeckoId?: string | undefined;
276
+ noDiscovery?: boolean | undefined;
277
+ mirrorOf?: string | undefined;
278
+ } | {
279
+ id: string;
280
+ networkId: string;
281
+ decimals: number;
282
+ symbol: string;
283
+ type: "sol-spl";
284
+ platform: "solana";
285
+ mintAddress: string;
286
+ isDefault?: boolean | undefined;
287
+ name?: string | undefined;
288
+ logo?: string | undefined;
289
+ coingeckoId?: string | undefined;
290
+ noDiscovery?: boolean | undefined;
291
+ mirrorOf?: string | undefined;
237
292
  })[];
238
293
  } | Promise<{
239
294
  networks: ({
@@ -320,12 +375,40 @@ export declare const chaindataAtom: import("jotai").Atom<{
320
375
  type: "scroll";
321
376
  l1GasPriceOracle: `0x${string}`;
322
377
  } | undefined;
323
- contracts?: Partial<Record<"Erc20Aggregator" | "Multicall3", `0x${string}`>> | undefined;
378
+ contracts?: {
379
+ Erc20Aggregator?: `0x${string}` | undefined;
380
+ Multicall3?: `0x${string}` | undefined;
381
+ } | undefined;
324
382
  balancesConfig?: {
325
383
  "evm-native"?: undefined;
326
384
  "evm-erc20"?: undefined;
327
385
  "evm-uniswapv2"?: undefined;
328
386
  } | undefined;
387
+ } | {
388
+ id: string;
389
+ name: string;
390
+ nativeTokenId: string;
391
+ nativeCurrency: {
392
+ decimals: number;
393
+ symbol: string;
394
+ name: string;
395
+ coingeckoId?: string | undefined;
396
+ mirrorOf?: string | undefined;
397
+ logo?: string | undefined;
398
+ };
399
+ blockExplorerUrls: string[];
400
+ platform: "solana";
401
+ genesisHash: string;
402
+ rpcs: string[];
403
+ isTestnet?: boolean | undefined;
404
+ isDefault?: boolean | undefined;
405
+ forceScan?: boolean | undefined;
406
+ logo?: string | undefined;
407
+ themeColor?: string | undefined;
408
+ balancesConfig?: {
409
+ "sol-native"?: undefined;
410
+ "sol-spl"?: undefined;
411
+ } | undefined;
329
412
  })[];
330
413
  tokens: ({
331
414
  id: string;
@@ -471,6 +554,33 @@ export declare const chaindataAtom: import("jotai").Atom<{
471
554
  coingeckoId?: string | undefined;
472
555
  noDiscovery?: boolean | undefined;
473
556
  mirrorOf?: string | undefined;
557
+ } | {
558
+ id: string;
559
+ networkId: string;
560
+ decimals: number;
561
+ symbol: string;
562
+ type: "sol-native";
563
+ platform: "solana";
564
+ isDefault?: boolean | undefined;
565
+ name?: string | undefined;
566
+ logo?: string | undefined;
567
+ coingeckoId?: string | undefined;
568
+ noDiscovery?: boolean | undefined;
569
+ mirrorOf?: string | undefined;
570
+ } | {
571
+ id: string;
572
+ networkId: string;
573
+ decimals: number;
574
+ symbol: string;
575
+ type: "sol-spl";
576
+ platform: "solana";
577
+ mintAddress: string;
578
+ isDefault?: boolean | undefined;
579
+ name?: string | undefined;
580
+ logo?: string | undefined;
581
+ coingeckoId?: string | undefined;
582
+ noDiscovery?: boolean | undefined;
583
+ mirrorOf?: string | undefined;
474
584
  })[];
475
585
  }>>;
476
586
  export declare const tokensAtom: import("jotai").Atom<Promise<({
@@ -617,6 +727,33 @@ export declare const tokensAtom: import("jotai").Atom<Promise<({
617
727
  coingeckoId?: string | undefined;
618
728
  noDiscovery?: boolean | undefined;
619
729
  mirrorOf?: string | undefined;
730
+ } | {
731
+ id: string;
732
+ networkId: string;
733
+ decimals: number;
734
+ symbol: string;
735
+ type: "sol-native";
736
+ platform: "solana";
737
+ isDefault?: boolean | undefined;
738
+ name?: string | undefined;
739
+ logo?: string | undefined;
740
+ coingeckoId?: string | undefined;
741
+ noDiscovery?: boolean | undefined;
742
+ mirrorOf?: string | undefined;
743
+ } | {
744
+ id: string;
745
+ networkId: string;
746
+ decimals: number;
747
+ symbol: string;
748
+ type: "sol-spl";
749
+ platform: "solana";
750
+ mintAddress: string;
751
+ isDefault?: boolean | undefined;
752
+ name?: string | undefined;
753
+ logo?: string | undefined;
754
+ coingeckoId?: string | undefined;
755
+ noDiscovery?: boolean | undefined;
756
+ mirrorOf?: string | undefined;
620
757
  })[]>>;
621
758
  export declare const networksAtom: import("jotai").Atom<Promise<({
622
759
  id: string;
@@ -702,10 +839,38 @@ export declare const networksAtom: import("jotai").Atom<Promise<({
702
839
  type: "scroll";
703
840
  l1GasPriceOracle: `0x${string}`;
704
841
  } | undefined;
705
- contracts?: Partial<Record<"Erc20Aggregator" | "Multicall3", `0x${string}`>> | undefined;
842
+ contracts?: {
843
+ Erc20Aggregator?: `0x${string}` | undefined;
844
+ Multicall3?: `0x${string}` | undefined;
845
+ } | undefined;
706
846
  balancesConfig?: {
707
847
  "evm-native"?: undefined;
708
848
  "evm-erc20"?: undefined;
709
849
  "evm-uniswapv2"?: undefined;
710
850
  } | undefined;
851
+ } | {
852
+ id: string;
853
+ name: string;
854
+ nativeTokenId: string;
855
+ nativeCurrency: {
856
+ decimals: number;
857
+ symbol: string;
858
+ name: string;
859
+ coingeckoId?: string | undefined;
860
+ mirrorOf?: string | undefined;
861
+ logo?: string | undefined;
862
+ };
863
+ blockExplorerUrls: string[];
864
+ platform: "solana";
865
+ genesisHash: string;
866
+ rpcs: string[];
867
+ isTestnet?: boolean | undefined;
868
+ isDefault?: boolean | undefined;
869
+ forceScan?: boolean | undefined;
870
+ logo?: string | undefined;
871
+ themeColor?: string | undefined;
872
+ balancesConfig?: {
873
+ "sol-native"?: undefined;
874
+ "sol-spl"?: undefined;
875
+ } | undefined;
711
876
  })[]>>;
@@ -1,2 +1,3 @@
1
1
  import { ChaindataProvider } from "@talismn/chaindata-provider";
2
2
  export declare const chaindataProviderAtom: import("jotai").Atom<ChaindataProvider>;
3
+ export declare const useSyncSwapsChaindata: () => [void, never];
@@ -1,3 +1 @@
1
- export declare const tokenRatesAtom: import("jotai").Atom<Promise<{
2
- [k: string]: import("@talismn/token-rates").TokenRates;
3
- }>>;
1
+ export declare const tokenRatesAtom: import("jotai").Atom<Promise<import("@talismn/token-rates").TokenRatesList>>;
@@ -85,12 +85,40 @@ export declare const useChaindata: () => {
85
85
  type: "scroll";
86
86
  l1GasPriceOracle: `0x${string}`;
87
87
  } | undefined;
88
- contracts?: Partial<Record<"Erc20Aggregator" | "Multicall3", `0x${string}`>> | undefined;
88
+ contracts?: {
89
+ Erc20Aggregator?: `0x${string}` | undefined;
90
+ Multicall3?: `0x${string}` | undefined;
91
+ } | undefined;
89
92
  balancesConfig?: {
90
93
  "evm-native"?: undefined;
91
94
  "evm-erc20"?: undefined;
92
95
  "evm-uniswapv2"?: undefined;
93
96
  } | undefined;
97
+ } | {
98
+ id: string;
99
+ name: string;
100
+ nativeTokenId: string;
101
+ nativeCurrency: {
102
+ decimals: number;
103
+ symbol: string;
104
+ name: string;
105
+ coingeckoId?: string | undefined;
106
+ mirrorOf?: string | undefined;
107
+ logo?: string | undefined;
108
+ };
109
+ blockExplorerUrls: string[];
110
+ platform: "solana";
111
+ genesisHash: string;
112
+ rpcs: string[];
113
+ isTestnet?: boolean | undefined;
114
+ isDefault?: boolean | undefined;
115
+ forceScan?: boolean | undefined;
116
+ logo?: string | undefined;
117
+ themeColor?: string | undefined;
118
+ balancesConfig?: {
119
+ "sol-native"?: undefined;
120
+ "sol-spl"?: undefined;
121
+ } | undefined;
94
122
  })[];
95
123
  tokens: ({
96
124
  id: string;
@@ -236,6 +264,33 @@ export declare const useChaindata: () => {
236
264
  coingeckoId?: string | undefined;
237
265
  noDiscovery?: boolean | undefined;
238
266
  mirrorOf?: string | undefined;
267
+ } | {
268
+ id: string;
269
+ networkId: string;
270
+ decimals: number;
271
+ symbol: string;
272
+ type: "sol-native";
273
+ platform: "solana";
274
+ isDefault?: boolean | undefined;
275
+ name?: string | undefined;
276
+ logo?: string | undefined;
277
+ coingeckoId?: string | undefined;
278
+ noDiscovery?: boolean | undefined;
279
+ mirrorOf?: string | undefined;
280
+ } | {
281
+ id: string;
282
+ networkId: string;
283
+ decimals: number;
284
+ symbol: string;
285
+ type: "sol-spl";
286
+ platform: "solana";
287
+ mintAddress: string;
288
+ isDefault?: boolean | undefined;
289
+ name?: string | undefined;
290
+ logo?: string | undefined;
291
+ coingeckoId?: string | undefined;
292
+ noDiscovery?: boolean | undefined;
293
+ mirrorOf?: string | undefined;
239
294
  })[];
240
295
  };
241
296
  export declare const useNetworks: () => ({
@@ -322,12 +377,40 @@ export declare const useNetworks: () => ({
322
377
  type: "scroll";
323
378
  l1GasPriceOracle: `0x${string}`;
324
379
  } | undefined;
325
- contracts?: Partial<Record<"Erc20Aggregator" | "Multicall3", `0x${string}`>> | undefined;
380
+ contracts?: {
381
+ Erc20Aggregator?: `0x${string}` | undefined;
382
+ Multicall3?: `0x${string}` | undefined;
383
+ } | undefined;
326
384
  balancesConfig?: {
327
385
  "evm-native"?: undefined;
328
386
  "evm-erc20"?: undefined;
329
387
  "evm-uniswapv2"?: undefined;
330
388
  } | undefined;
389
+ } | {
390
+ id: string;
391
+ name: string;
392
+ nativeTokenId: string;
393
+ nativeCurrency: {
394
+ decimals: number;
395
+ symbol: string;
396
+ name: string;
397
+ coingeckoId?: string | undefined;
398
+ mirrorOf?: string | undefined;
399
+ logo?: string | undefined;
400
+ };
401
+ blockExplorerUrls: string[];
402
+ platform: "solana";
403
+ genesisHash: string;
404
+ rpcs: string[];
405
+ isTestnet?: boolean | undefined;
406
+ isDefault?: boolean | undefined;
407
+ forceScan?: boolean | undefined;
408
+ logo?: string | undefined;
409
+ themeColor?: string | undefined;
410
+ balancesConfig?: {
411
+ "sol-native"?: undefined;
412
+ "sol-spl"?: undefined;
413
+ } | undefined;
331
414
  })[];
332
415
  export declare const useNetworksById: () => import("lodash").Dictionary<{
333
416
  id: string;
@@ -413,12 +496,40 @@ export declare const useNetworksById: () => import("lodash").Dictionary<{
413
496
  type: "scroll";
414
497
  l1GasPriceOracle: `0x${string}`;
415
498
  } | undefined;
416
- contracts?: Partial<Record<"Erc20Aggregator" | "Multicall3", `0x${string}`>> | undefined;
499
+ contracts?: {
500
+ Erc20Aggregator?: `0x${string}` | undefined;
501
+ Multicall3?: `0x${string}` | undefined;
502
+ } | undefined;
417
503
  balancesConfig?: {
418
504
  "evm-native"?: undefined;
419
505
  "evm-erc20"?: undefined;
420
506
  "evm-uniswapv2"?: undefined;
421
507
  } | undefined;
508
+ } | {
509
+ id: string;
510
+ name: string;
511
+ nativeTokenId: string;
512
+ nativeCurrency: {
513
+ decimals: number;
514
+ symbol: string;
515
+ name: string;
516
+ coingeckoId?: string | undefined;
517
+ mirrorOf?: string | undefined;
518
+ logo?: string | undefined;
519
+ };
520
+ blockExplorerUrls: string[];
521
+ platform: "solana";
522
+ genesisHash: string;
523
+ rpcs: string[];
524
+ isTestnet?: boolean | undefined;
525
+ isDefault?: boolean | undefined;
526
+ forceScan?: boolean | undefined;
527
+ logo?: string | undefined;
528
+ themeColor?: string | undefined;
529
+ balancesConfig?: {
530
+ "sol-native"?: undefined;
531
+ "sol-spl"?: undefined;
532
+ } | undefined;
422
533
  }>;
423
534
  export declare const useNetwork: (networkId?: NetworkId) => {
424
535
  id: string;
@@ -504,12 +615,40 @@ export declare const useNetwork: (networkId?: NetworkId) => {
504
615
  type: "scroll";
505
616
  l1GasPriceOracle: `0x${string}`;
506
617
  } | undefined;
507
- contracts?: Partial<Record<"Erc20Aggregator" | "Multicall3", `0x${string}`>> | undefined;
618
+ contracts?: {
619
+ Erc20Aggregator?: `0x${string}` | undefined;
620
+ Multicall3?: `0x${string}` | undefined;
621
+ } | undefined;
508
622
  balancesConfig?: {
509
623
  "evm-native"?: undefined;
510
624
  "evm-erc20"?: undefined;
511
625
  "evm-uniswapv2"?: undefined;
512
626
  } | undefined;
627
+ } | {
628
+ id: string;
629
+ name: string;
630
+ nativeTokenId: string;
631
+ nativeCurrency: {
632
+ decimals: number;
633
+ symbol: string;
634
+ name: string;
635
+ coingeckoId?: string | undefined;
636
+ mirrorOf?: string | undefined;
637
+ logo?: string | undefined;
638
+ };
639
+ blockExplorerUrls: string[];
640
+ platform: "solana";
641
+ genesisHash: string;
642
+ rpcs: string[];
643
+ isTestnet?: boolean | undefined;
644
+ isDefault?: boolean | undefined;
645
+ forceScan?: boolean | undefined;
646
+ logo?: string | undefined;
647
+ themeColor?: string | undefined;
648
+ balancesConfig?: {
649
+ "sol-native"?: undefined;
650
+ "sol-spl"?: undefined;
651
+ } | undefined;
513
652
  };
514
653
  export declare const useTokens: () => ({
515
654
  id: string;
@@ -655,6 +794,33 @@ export declare const useTokens: () => ({
655
794
  coingeckoId?: string | undefined;
656
795
  noDiscovery?: boolean | undefined;
657
796
  mirrorOf?: string | undefined;
797
+ } | {
798
+ id: string;
799
+ networkId: string;
800
+ decimals: number;
801
+ symbol: string;
802
+ type: "sol-native";
803
+ platform: "solana";
804
+ isDefault?: boolean | undefined;
805
+ name?: string | undefined;
806
+ logo?: string | undefined;
807
+ coingeckoId?: string | undefined;
808
+ noDiscovery?: boolean | undefined;
809
+ mirrorOf?: string | undefined;
810
+ } | {
811
+ id: string;
812
+ networkId: string;
813
+ decimals: number;
814
+ symbol: string;
815
+ type: "sol-spl";
816
+ platform: "solana";
817
+ mintAddress: string;
818
+ isDefault?: boolean | undefined;
819
+ name?: string | undefined;
820
+ logo?: string | undefined;
821
+ coingeckoId?: string | undefined;
822
+ noDiscovery?: boolean | undefined;
823
+ mirrorOf?: string | undefined;
658
824
  })[];
659
825
  export declare const useTokensById: () => import("lodash").Dictionary<{
660
826
  id: string;
@@ -800,6 +966,33 @@ export declare const useTokensById: () => import("lodash").Dictionary<{
800
966
  coingeckoId?: string | undefined;
801
967
  noDiscovery?: boolean | undefined;
802
968
  mirrorOf?: string | undefined;
969
+ } | {
970
+ id: string;
971
+ networkId: string;
972
+ decimals: number;
973
+ symbol: string;
974
+ type: "sol-native";
975
+ platform: "solana";
976
+ isDefault?: boolean | undefined;
977
+ name?: string | undefined;
978
+ logo?: string | undefined;
979
+ coingeckoId?: string | undefined;
980
+ noDiscovery?: boolean | undefined;
981
+ mirrorOf?: string | undefined;
982
+ } | {
983
+ id: string;
984
+ networkId: string;
985
+ decimals: number;
986
+ symbol: string;
987
+ type: "sol-spl";
988
+ platform: "solana";
989
+ mintAddress: string;
990
+ isDefault?: boolean | undefined;
991
+ name?: string | undefined;
992
+ logo?: string | undefined;
993
+ coingeckoId?: string | undefined;
994
+ noDiscovery?: boolean | undefined;
995
+ mirrorOf?: string | undefined;
803
996
  }>;
804
997
  export declare const useToken: (tokenId?: TokenId) => {
805
998
  id: string;
@@ -945,4 +1138,31 @@ export declare const useToken: (tokenId?: TokenId) => {
945
1138
  coingeckoId?: string | undefined;
946
1139
  noDiscovery?: boolean | undefined;
947
1140
  mirrorOf?: string | undefined;
1141
+ } | {
1142
+ id: string;
1143
+ networkId: string;
1144
+ decimals: number;
1145
+ symbol: string;
1146
+ type: "sol-native";
1147
+ platform: "solana";
1148
+ isDefault?: boolean | undefined;
1149
+ name?: string | undefined;
1150
+ logo?: string | undefined;
1151
+ coingeckoId?: string | undefined;
1152
+ noDiscovery?: boolean | undefined;
1153
+ mirrorOf?: string | undefined;
1154
+ } | {
1155
+ id: string;
1156
+ networkId: string;
1157
+ decimals: number;
1158
+ symbol: string;
1159
+ type: "sol-spl";
1160
+ platform: "solana";
1161
+ mintAddress: string;
1162
+ isDefault?: boolean | undefined;
1163
+ name?: string | undefined;
1164
+ logo?: string | undefined;
1165
+ coingeckoId?: string | undefined;
1166
+ noDiscovery?: boolean | undefined;
1167
+ mirrorOf?: string | undefined;
948
1168
  };
@@ -1,5 +1,3 @@
1
1
  import { TokenId } from "@talismn/chaindata-provider";
2
- export declare const useTokenRates: () => {
3
- [k: string]: import("@talismn/token-rates").TokenRates;
4
- };
2
+ export declare const useTokenRates: () => import("@talismn/token-rates").TokenRatesList;
5
3
  export declare const useTokenRate: (tokenId?: TokenId) => import("@talismn/token-rates").TokenRates;
@@ -8,13 +8,11 @@ var chaindataProvider = require('@talismn/chaindata-provider');
8
8
  var balances = require('@talismn/balances');
9
9
  var jotaiEffect = require('jotai-effect');
10
10
  var lodashEs = require('lodash-es');
11
- var chainConnector = require('@talismn/chain-connector');
12
- var chainConnectorEvm = require('@talismn/chain-connector-evm');
11
+ var chainConnectors = require('@talismn/chain-connectors');
13
12
  var connectionMeta = require('@talismn/connection-meta');
14
13
  var util = require('@talismn/util');
15
14
  var utils = require('jotai/utils');
16
15
  var rxjs = require('rxjs');
17
- var dexie = require('dexie');
18
16
  var anylogger = require('anylogger');
19
17
  var utilCrypto = require('@polkadot/util-crypto');
20
18
 
@@ -34,16 +32,30 @@ const enabledTokensAtom = jotai.atom(undefined);
34
32
  const allAddressesAtom = jotai.atom([]);
35
33
 
36
34
  const chaindataProviderAtom = jotai.atom(() => {
37
- return new chaindataProvider.ChaindataProvider({});
35
+ return new chaindataProvider.ChaindataProvider({
36
+ // TODO pass persistedStorage
37
+ });
38
+ });
39
+ const useSyncSwapsChaindata = () => jotai.useAtom(syncSwapsChaindataAtomEffect);
40
+ const syncSwapsChaindataAtomEffect = jotaiEffect.atomEffect(get => {
41
+ const chaindataProvider = get(chaindataProviderAtom);
42
+
43
+ // keep subscription open when swaps modal is open
44
+ const subscription = chaindataProvider.networks$.subscribe();
45
+
46
+ // close susbcription when swaps modal closes
47
+ return () => subscription.unsubscribe();
38
48
  });
39
49
 
40
50
  const chainConnectorsAtom = jotai.atom(get => {
41
51
  const chaindataProvider = get(chaindataProviderAtom);
42
- const substrate = new chainConnector.ChainConnector(chaindataProvider, connectionMeta.connectionMetaDb);
43
- const evm = new chainConnectorEvm.ChainConnectorEvm(chaindataProvider);
52
+ const substrate = new chainConnectors.ChainConnectorDot(chaindataProvider, connectionMeta.connectionMetaDb);
53
+ const evm = new chainConnectors.ChainConnectorEth(chaindataProvider);
54
+ const solana = new chainConnectors.ChainConnectorSol(chaindataProvider);
44
55
  return {
45
56
  substrate,
46
- evm
57
+ evm,
58
+ solana
47
59
  };
48
60
  });
49
61
 
@@ -85,32 +97,17 @@ var packageJson = {
85
97
 
86
98
  var log = anylogger__default.default(packageJson.name);
87
99
 
88
- /**
89
- * Converts a dexie Observable into an rxjs Observable.
90
- */
91
- function dexieToRxjs(o) {
92
- return new rxjs.Observable(observer => {
93
- const subscription = o.subscribe({
94
- next: value => observer.next(value),
95
- error: error => observer.error(error)
96
- });
97
- return () => subscription.unsubscribe();
98
- });
99
- }
100
-
101
100
  const tokenRatesAtom = jotai.atom(async get => {
102
101
  // runs a timer to keep tokenRates up to date
103
102
  get(tokenRatesFetcherAtomEffect);
104
- return await get(tokenRatesDbAtom);
103
+ return (await get(tokenRatesDbAtom)).tokenRates;
105
104
  });
106
- const tokenRatesDbAtom = utils.atomWithObservable(() => {
107
- const dbRatesToMap = dbRates => Object.fromEntries(dbRates.map(({
108
- tokenId,
109
- rates
110
- }) => [tokenId, rates]));
111
105
 
112
- // retrieve fetched tokenRates from the db
113
- return dexieToRxjs(dexie.liveQuery(() => tokenRates.db.tokenRates.toArray())).pipe(rxjs.map(dbRatesToMap));
106
+ // TODO: Persist to storage
107
+ const tokenRates$ = new rxjs.ReplaySubject(1);
108
+ const tokenRatesDbAtom = utils.atomWithObservable(() => {
109
+ tokenRates.tryToDeleteOldTokenRatesDb();
110
+ return tokenRates$.asObservable();
114
111
  });
115
112
  const tokenRatesFetcherAtomEffect = jotaiEffect.atomEffect(get => {
116
113
  // lets us tear down the existing timer when the effect is restarted
@@ -121,7 +118,6 @@ const tokenRatesFetcherAtomEffect = jotaiEffect.atomEffect(get => {
121
118
  const tokensPromise = get(tokensAtom);
122
119
  (async () => {
123
120
  const tokensById = lodashEs.keyBy(await tokensPromise, "id");
124
- const tokenIds = Object.keys(tokensById);
125
121
  const loopMs = 300_000; // 300_000ms = 300s = 5 minutes
126
122
  const retryTimeout = 5_000; // 5_000ms = 5 seconds
127
123
 
@@ -129,21 +125,11 @@ const tokenRatesFetcherAtomEffect = jotaiEffect.atomEffect(get => {
129
125
  try {
130
126
  if (abort.signal.aborted) return; // don't fetch if aborted
131
127
  const tokenRates$1 = await tokenRates.fetchTokenRates(tokensById, tokenRates.ALL_CURRENCY_IDS, coinsApiConfig);
132
- const putTokenRates = Object.entries(tokenRates$1).map(([tokenId, rates]) => ({
133
- tokenId,
134
- rates
135
- }));
128
+ const putTokenRates = {
129
+ tokenRates: tokenRates$1
130
+ };
136
131
  if (abort.signal.aborted) return; // don't insert into db if aborted
137
- await tokenRates.db.transaction("rw", tokenRates.db.tokenRates, async () => {
138
- // override all tokenRates
139
- await tokenRates.db.tokenRates.bulkPut(putTokenRates);
140
-
141
- // delete tokenRates for tokens which no longer exist
142
- const validTokenIds = new Set(tokenIds);
143
- const tokenRatesIds = await tokenRates.db.tokenRates.toCollection().primaryKeys();
144
- const deleteIds = tokenRatesIds.filter(id => !validTokenIds.has(id));
145
- if (deleteIds.length > 0) await tokenRates.db.tokenRates.bulkDelete(deleteIds);
146
- });
132
+ tokenRates$.next(putTokenRates);
147
133
  if (abort.signal.aborted) return; // don't schedule next loop if aborted
148
134
  setTimeout(hydrate, loopMs);
149
135
  } catch (error) {
@@ -357,6 +343,7 @@ exports.useNetwork = useNetwork;
357
343
  exports.useNetworks = useNetworks;
358
344
  exports.useNetworksById = useNetworksById;
359
345
  exports.useSetBalancesAddresses = useSetBalancesAddresses;
346
+ exports.useSyncSwapsChaindata = useSyncSwapsChaindata;
360
347
  exports.useToken = useToken;
361
348
  exports.useTokenRate = useTokenRate;
362
349
  exports.useTokenRates = useTokenRates;
@@ -8,13 +8,11 @@ var chaindataProvider = require('@talismn/chaindata-provider');
8
8
  var balances = require('@talismn/balances');
9
9
  var jotaiEffect = require('jotai-effect');
10
10
  var lodashEs = require('lodash-es');
11
- var chainConnector = require('@talismn/chain-connector');
12
- var chainConnectorEvm = require('@talismn/chain-connector-evm');
11
+ var chainConnectors = require('@talismn/chain-connectors');
13
12
  var connectionMeta = require('@talismn/connection-meta');
14
13
  var util = require('@talismn/util');
15
14
  var utils = require('jotai/utils');
16
15
  var rxjs = require('rxjs');
17
- var dexie = require('dexie');
18
16
  var anylogger = require('anylogger');
19
17
  var utilCrypto = require('@polkadot/util-crypto');
20
18
 
@@ -34,16 +32,30 @@ const enabledTokensAtom = jotai.atom(undefined);
34
32
  const allAddressesAtom = jotai.atom([]);
35
33
 
36
34
  const chaindataProviderAtom = jotai.atom(() => {
37
- return new chaindataProvider.ChaindataProvider({});
35
+ return new chaindataProvider.ChaindataProvider({
36
+ // TODO pass persistedStorage
37
+ });
38
+ });
39
+ const useSyncSwapsChaindata = () => jotai.useAtom(syncSwapsChaindataAtomEffect);
40
+ const syncSwapsChaindataAtomEffect = jotaiEffect.atomEffect(get => {
41
+ const chaindataProvider = get(chaindataProviderAtom);
42
+
43
+ // keep subscription open when swaps modal is open
44
+ const subscription = chaindataProvider.networks$.subscribe();
45
+
46
+ // close susbcription when swaps modal closes
47
+ return () => subscription.unsubscribe();
38
48
  });
39
49
 
40
50
  const chainConnectorsAtom = jotai.atom(get => {
41
51
  const chaindataProvider = get(chaindataProviderAtom);
42
- const substrate = new chainConnector.ChainConnector(chaindataProvider, connectionMeta.connectionMetaDb);
43
- const evm = new chainConnectorEvm.ChainConnectorEvm(chaindataProvider);
52
+ const substrate = new chainConnectors.ChainConnectorDot(chaindataProvider, connectionMeta.connectionMetaDb);
53
+ const evm = new chainConnectors.ChainConnectorEth(chaindataProvider);
54
+ const solana = new chainConnectors.ChainConnectorSol(chaindataProvider);
44
55
  return {
45
56
  substrate,
46
- evm
57
+ evm,
58
+ solana
47
59
  };
48
60
  });
49
61
 
@@ -85,32 +97,17 @@ var packageJson = {
85
97
 
86
98
  var log = anylogger__default.default(packageJson.name);
87
99
 
88
- /**
89
- * Converts a dexie Observable into an rxjs Observable.
90
- */
91
- function dexieToRxjs(o) {
92
- return new rxjs.Observable(observer => {
93
- const subscription = o.subscribe({
94
- next: value => observer.next(value),
95
- error: error => observer.error(error)
96
- });
97
- return () => subscription.unsubscribe();
98
- });
99
- }
100
-
101
100
  const tokenRatesAtom = jotai.atom(async get => {
102
101
  // runs a timer to keep tokenRates up to date
103
102
  get(tokenRatesFetcherAtomEffect);
104
- return await get(tokenRatesDbAtom);
103
+ return (await get(tokenRatesDbAtom)).tokenRates;
105
104
  });
106
- const tokenRatesDbAtom = utils.atomWithObservable(() => {
107
- const dbRatesToMap = dbRates => Object.fromEntries(dbRates.map(({
108
- tokenId,
109
- rates
110
- }) => [tokenId, rates]));
111
105
 
112
- // retrieve fetched tokenRates from the db
113
- return dexieToRxjs(dexie.liveQuery(() => tokenRates.db.tokenRates.toArray())).pipe(rxjs.map(dbRatesToMap));
106
+ // TODO: Persist to storage
107
+ const tokenRates$ = new rxjs.ReplaySubject(1);
108
+ const tokenRatesDbAtom = utils.atomWithObservable(() => {
109
+ tokenRates.tryToDeleteOldTokenRatesDb();
110
+ return tokenRates$.asObservable();
114
111
  });
115
112
  const tokenRatesFetcherAtomEffect = jotaiEffect.atomEffect(get => {
116
113
  // lets us tear down the existing timer when the effect is restarted
@@ -121,7 +118,6 @@ const tokenRatesFetcherAtomEffect = jotaiEffect.atomEffect(get => {
121
118
  const tokensPromise = get(tokensAtom);
122
119
  (async () => {
123
120
  const tokensById = lodashEs.keyBy(await tokensPromise, "id");
124
- const tokenIds = Object.keys(tokensById);
125
121
  const loopMs = 300_000; // 300_000ms = 300s = 5 minutes
126
122
  const retryTimeout = 5_000; // 5_000ms = 5 seconds
127
123
 
@@ -129,21 +125,11 @@ const tokenRatesFetcherAtomEffect = jotaiEffect.atomEffect(get => {
129
125
  try {
130
126
  if (abort.signal.aborted) return; // don't fetch if aborted
131
127
  const tokenRates$1 = await tokenRates.fetchTokenRates(tokensById, tokenRates.ALL_CURRENCY_IDS, coinsApiConfig);
132
- const putTokenRates = Object.entries(tokenRates$1).map(([tokenId, rates]) => ({
133
- tokenId,
134
- rates
135
- }));
128
+ const putTokenRates = {
129
+ tokenRates: tokenRates$1
130
+ };
136
131
  if (abort.signal.aborted) return; // don't insert into db if aborted
137
- await tokenRates.db.transaction("rw", tokenRates.db.tokenRates, async () => {
138
- // override all tokenRates
139
- await tokenRates.db.tokenRates.bulkPut(putTokenRates);
140
-
141
- // delete tokenRates for tokens which no longer exist
142
- const validTokenIds = new Set(tokenIds);
143
- const tokenRatesIds = await tokenRates.db.tokenRates.toCollection().primaryKeys();
144
- const deleteIds = tokenRatesIds.filter(id => !validTokenIds.has(id));
145
- if (deleteIds.length > 0) await tokenRates.db.tokenRates.bulkDelete(deleteIds);
146
- });
132
+ tokenRates$.next(putTokenRates);
147
133
  if (abort.signal.aborted) return; // don't schedule next loop if aborted
148
134
  setTimeout(hydrate, loopMs);
149
135
  } catch (error) {
@@ -357,6 +343,7 @@ exports.useNetwork = useNetwork;
357
343
  exports.useNetworks = useNetworks;
358
344
  exports.useNetworksById = useNetworksById;
359
345
  exports.useSetBalancesAddresses = useSetBalancesAddresses;
346
+ exports.useSyncSwapsChaindata = useSyncSwapsChaindata;
360
347
  exports.useToken = useToken;
361
348
  exports.useTokenRate = useTokenRate;
362
349
  exports.useTokenRates = useTokenRates;
@@ -1,19 +1,17 @@
1
- import { atom, useSetAtom, useAtomValue } from 'jotai';
1
+ import { atom, useAtom, useSetAtom, useAtomValue } from 'jotai';
2
2
  import { useMemo, useEffect } from 'react';
3
- import { DEFAULT_COINSAPI_CONFIG, db, fetchTokenRates, ALL_CURRENCY_IDS } from '@talismn/token-rates';
3
+ import { DEFAULT_COINSAPI_CONFIG, tryToDeleteOldTokenRatesDb, fetchTokenRates, ALL_CURRENCY_IDS } from '@talismn/token-rates';
4
4
  import { jsx, Fragment } from 'react/jsx-runtime';
5
5
  import { ChaindataProvider } from '@talismn/chaindata-provider';
6
6
  export { evmErc20TokenId, evmNativeTokenId, subAssetTokenId, subNativeTokenId, subPsp22TokenId, subTokensTokenId } from '@talismn/chaindata-provider';
7
7
  import { BalancesProvider as BalancesProvider$1, Balances } from '@talismn/balances';
8
8
  import { atomEffect } from 'jotai-effect';
9
9
  import { keyBy, fromPairs } from 'lodash-es';
10
- import { ChainConnector } from '@talismn/chain-connector';
11
- import { ChainConnectorEvm } from '@talismn/chain-connector-evm';
10
+ import { ChainConnectorDot, ChainConnectorEth, ChainConnectorSol } from '@talismn/chain-connectors';
12
11
  import { connectionMetaDb } from '@talismn/connection-meta';
13
12
  import { firstThenDebounce, isTruthy, isAbortError } from '@talismn/util';
14
13
  import { atomWithObservable } from 'jotai/utils';
15
- import { combineLatest, Observable, map } from 'rxjs';
16
- import { liveQuery } from 'dexie';
14
+ import { combineLatest, ReplaySubject } from 'rxjs';
17
15
  import anylogger from 'anylogger';
18
16
  import { cryptoWaitReady } from '@polkadot/util-crypto';
19
17
 
@@ -29,16 +27,30 @@ const enabledTokensAtom = atom(undefined);
29
27
  const allAddressesAtom = atom([]);
30
28
 
31
29
  const chaindataProviderAtom = atom(() => {
32
- return new ChaindataProvider({});
30
+ return new ChaindataProvider({
31
+ // TODO pass persistedStorage
32
+ });
33
+ });
34
+ const useSyncSwapsChaindata = () => useAtom(syncSwapsChaindataAtomEffect);
35
+ const syncSwapsChaindataAtomEffect = atomEffect(get => {
36
+ const chaindataProvider = get(chaindataProviderAtom);
37
+
38
+ // keep subscription open when swaps modal is open
39
+ const subscription = chaindataProvider.networks$.subscribe();
40
+
41
+ // close susbcription when swaps modal closes
42
+ return () => subscription.unsubscribe();
33
43
  });
34
44
 
35
45
  const chainConnectorsAtom = atom(get => {
36
46
  const chaindataProvider = get(chaindataProviderAtom);
37
- const substrate = new ChainConnector(chaindataProvider, connectionMetaDb);
38
- const evm = new ChainConnectorEvm(chaindataProvider);
47
+ const substrate = new ChainConnectorDot(chaindataProvider, connectionMetaDb);
48
+ const evm = new ChainConnectorEth(chaindataProvider);
49
+ const solana = new ChainConnectorSol(chaindataProvider);
39
50
  return {
40
51
  substrate,
41
- evm
52
+ evm,
53
+ solana
42
54
  };
43
55
  });
44
56
 
@@ -80,32 +92,17 @@ var packageJson = {
80
92
 
81
93
  var log = anylogger(packageJson.name);
82
94
 
83
- /**
84
- * Converts a dexie Observable into an rxjs Observable.
85
- */
86
- function dexieToRxjs(o) {
87
- return new Observable(observer => {
88
- const subscription = o.subscribe({
89
- next: value => observer.next(value),
90
- error: error => observer.error(error)
91
- });
92
- return () => subscription.unsubscribe();
93
- });
94
- }
95
-
96
95
  const tokenRatesAtom = atom(async get => {
97
96
  // runs a timer to keep tokenRates up to date
98
97
  get(tokenRatesFetcherAtomEffect);
99
- return await get(tokenRatesDbAtom);
98
+ return (await get(tokenRatesDbAtom)).tokenRates;
100
99
  });
101
- const tokenRatesDbAtom = atomWithObservable(() => {
102
- const dbRatesToMap = dbRates => Object.fromEntries(dbRates.map(({
103
- tokenId,
104
- rates
105
- }) => [tokenId, rates]));
106
100
 
107
- // retrieve fetched tokenRates from the db
108
- return dexieToRxjs(liveQuery(() => db.tokenRates.toArray())).pipe(map(dbRatesToMap));
101
+ // TODO: Persist to storage
102
+ const tokenRates$ = new ReplaySubject(1);
103
+ const tokenRatesDbAtom = atomWithObservable(() => {
104
+ tryToDeleteOldTokenRatesDb();
105
+ return tokenRates$.asObservable();
109
106
  });
110
107
  const tokenRatesFetcherAtomEffect = atomEffect(get => {
111
108
  // lets us tear down the existing timer when the effect is restarted
@@ -116,7 +113,6 @@ const tokenRatesFetcherAtomEffect = atomEffect(get => {
116
113
  const tokensPromise = get(tokensAtom);
117
114
  (async () => {
118
115
  const tokensById = keyBy(await tokensPromise, "id");
119
- const tokenIds = Object.keys(tokensById);
120
116
  const loopMs = 300_000; // 300_000ms = 300s = 5 minutes
121
117
  const retryTimeout = 5_000; // 5_000ms = 5 seconds
122
118
 
@@ -124,21 +120,11 @@ const tokenRatesFetcherAtomEffect = atomEffect(get => {
124
120
  try {
125
121
  if (abort.signal.aborted) return; // don't fetch if aborted
126
122
  const tokenRates = await fetchTokenRates(tokensById, ALL_CURRENCY_IDS, coinsApiConfig);
127
- const putTokenRates = Object.entries(tokenRates).map(([tokenId, rates]) => ({
128
- tokenId,
129
- rates
130
- }));
123
+ const putTokenRates = {
124
+ tokenRates
125
+ };
131
126
  if (abort.signal.aborted) return; // don't insert into db if aborted
132
- await db.transaction("rw", db.tokenRates, async () => {
133
- // override all tokenRates
134
- await db.tokenRates.bulkPut(putTokenRates);
135
-
136
- // delete tokenRates for tokens which no longer exist
137
- const validTokenIds = new Set(tokenIds);
138
- const tokenRatesIds = await db.tokenRates.toCollection().primaryKeys();
139
- const deleteIds = tokenRatesIds.filter(id => !validTokenIds.has(id));
140
- if (deleteIds.length > 0) await db.tokenRates.bulkDelete(deleteIds);
141
- });
127
+ tokenRates$.next(putTokenRates);
142
128
  if (abort.signal.aborted) return; // don't schedule next loop if aborted
143
129
  setTimeout(hydrate, loopMs);
144
130
  } catch (error) {
@@ -304,4 +290,4 @@ const BalancesProvider = ({
304
290
  });
305
291
  };
306
292
 
307
- export { BalancesProvider, allAddressesAtom, balancesAtom, chainConnectorsAtom, chaindataAtom, chaindataProviderAtom, coinsApiConfigAtom, cryptoWaitReadyAtom, enableTestnetsAtom, enabledChainsAtom, enabledTokensAtom, getStaleChains, networksAtom, tokenRatesAtom, tokensAtom, useBalances, useBalancesStatus, useChainConnectors, useChaindata, useChaindataProvider, useNetwork, useNetworks, useNetworksById, useSetBalancesAddresses, useToken, useTokenRate, useTokenRates, useTokens, useTokensById };
293
+ export { BalancesProvider, allAddressesAtom, balancesAtom, chainConnectorsAtom, chaindataAtom, chaindataProviderAtom, coinsApiConfigAtom, cryptoWaitReadyAtom, enableTestnetsAtom, enabledChainsAtom, enabledTokensAtom, getStaleChains, networksAtom, tokenRatesAtom, tokensAtom, useBalances, useBalancesStatus, useChainConnectors, useChaindata, useChaindataProvider, useNetwork, useNetworks, useNetworksById, useSetBalancesAddresses, useSyncSwapsChaindata, useToken, useTokenRate, useTokenRates, useTokens, useTokensById };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@talismn/balances-react",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "author": "Talisman",
5
5
  "homepage": "https://talisman.xyz",
6
6
  "license": "GPL-3.0-or-later",
@@ -23,21 +23,18 @@
23
23
  "dependencies": {
24
24
  "anylogger": "^1.0.11",
25
25
  "blueimp-md5": "2.19.0",
26
- "dexie": "^4.0.9",
27
- "dexie-react-hooks": "^1.1.7",
28
26
  "jotai": "~2",
29
27
  "jotai-effect": "~1",
30
28
  "lodash-es": "4.17.21",
31
29
  "react-use": "^17.5.1",
32
30
  "rxjs": "^7.8.1",
33
- "@talismn/balances": "1.0.1",
34
- "@talismn/chain-connector": "1.0.1",
35
- "@talismn/chaindata-provider": "1.0.1",
36
- "@talismn/connection-meta": "0.2.19",
37
- "@talismn/chain-connector-evm": "1.0.1",
31
+ "@talismn/chain-connectors": "0.0.1",
32
+ "@talismn/balances": "1.0.3",
33
+ "@talismn/chaindata-provider": "1.1.0",
38
34
  "@talismn/scale": "0.2.0",
39
- "@talismn/token-rates": "3.0.1",
40
- "@talismn/util": "0.5.0"
35
+ "@talismn/token-rates": "3.0.3",
36
+ "@talismn/util": "0.5.1",
37
+ "@talismn/connection-meta": "0.2.21"
41
38
  },
42
39
  "devDependencies": {
43
40
  "@types/jest": "^29.5.14",
@@ -1,6 +0,0 @@
1
- import { Observable as DexieObservable } from "dexie";
2
- import { Observable as RxjsObservable } from "rxjs";
3
- /**
4
- * Converts a dexie Observable into an rxjs Observable.
5
- */
6
- export declare function dexieToRxjs<T>(o: DexieObservable<T>): RxjsObservable<T>;