@talismn/balances-react 0.0.0-pr2120-20250731072022 → 0.0.0-pr2120-20250801034201

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.
@@ -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>>;
@@ -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;
@@ -14,7 +14,6 @@ var connectionMeta = require('@talismn/connection-meta');
14
14
  var util = require('@talismn/util');
15
15
  var utils = require('jotai/utils');
16
16
  var rxjs = require('rxjs');
17
- var dexie = require('dexie');
18
17
  var anylogger = require('anylogger');
19
18
  var utilCrypto = require('@polkadot/util-crypto');
20
19
 
@@ -34,7 +33,9 @@ const enabledTokensAtom = jotai.atom(undefined);
34
33
  const allAddressesAtom = jotai.atom([]);
35
34
 
36
35
  const chaindataProviderAtom = jotai.atom(() => {
37
- return new chaindataProvider.ChaindataProvider({});
36
+ return new chaindataProvider.ChaindataProvider({
37
+ // TODO pass persistedStorage
38
+ });
38
39
  });
39
40
 
40
41
  const chainConnectorsAtom = jotai.atom(get => {
@@ -85,32 +86,17 @@ var packageJson = {
85
86
 
86
87
  var log = anylogger__default.default(packageJson.name);
87
88
 
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
89
  const tokenRatesAtom = jotai.atom(async get => {
102
90
  // runs a timer to keep tokenRates up to date
103
91
  get(tokenRatesFetcherAtomEffect);
104
- return await get(tokenRatesDbAtom);
92
+ return (await get(tokenRatesDbAtom)).tokenRates;
105
93
  });
106
- const tokenRatesDbAtom = utils.atomWithObservable(() => {
107
- const dbRatesToMap = dbRates => Object.fromEntries(dbRates.map(({
108
- tokenId,
109
- rates
110
- }) => [tokenId, rates]));
111
94
 
112
- // retrieve fetched tokenRates from the db
113
- return dexieToRxjs(dexie.liveQuery(() => tokenRates.db.tokenRates.toArray())).pipe(rxjs.map(dbRatesToMap));
95
+ // TODO: Persist to storage
96
+ const tokenRates$ = new rxjs.ReplaySubject(1);
97
+ const tokenRatesDbAtom = utils.atomWithObservable(() => {
98
+ tokenRates.tryToDeleteOldTokenRatesDb();
99
+ return tokenRates$.asObservable();
114
100
  });
115
101
  const tokenRatesFetcherAtomEffect = jotaiEffect.atomEffect(get => {
116
102
  // lets us tear down the existing timer when the effect is restarted
@@ -121,7 +107,6 @@ const tokenRatesFetcherAtomEffect = jotaiEffect.atomEffect(get => {
121
107
  const tokensPromise = get(tokensAtom);
122
108
  (async () => {
123
109
  const tokensById = lodashEs.keyBy(await tokensPromise, "id");
124
- const tokenIds = Object.keys(tokensById);
125
110
  const loopMs = 300_000; // 300_000ms = 300s = 5 minutes
126
111
  const retryTimeout = 5_000; // 5_000ms = 5 seconds
127
112
 
@@ -129,21 +114,11 @@ const tokenRatesFetcherAtomEffect = jotaiEffect.atomEffect(get => {
129
114
  try {
130
115
  if (abort.signal.aborted) return; // don't fetch if aborted
131
116
  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
- }));
117
+ const putTokenRates = {
118
+ tokenRates: tokenRates$1
119
+ };
136
120
  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
- });
121
+ tokenRates$.next(putTokenRates);
147
122
  if (abort.signal.aborted) return; // don't schedule next loop if aborted
148
123
  setTimeout(hydrate, loopMs);
149
124
  } catch (error) {
@@ -14,7 +14,6 @@ var connectionMeta = require('@talismn/connection-meta');
14
14
  var util = require('@talismn/util');
15
15
  var utils = require('jotai/utils');
16
16
  var rxjs = require('rxjs');
17
- var dexie = require('dexie');
18
17
  var anylogger = require('anylogger');
19
18
  var utilCrypto = require('@polkadot/util-crypto');
20
19
 
@@ -34,7 +33,9 @@ const enabledTokensAtom = jotai.atom(undefined);
34
33
  const allAddressesAtom = jotai.atom([]);
35
34
 
36
35
  const chaindataProviderAtom = jotai.atom(() => {
37
- return new chaindataProvider.ChaindataProvider({});
36
+ return new chaindataProvider.ChaindataProvider({
37
+ // TODO pass persistedStorage
38
+ });
38
39
  });
39
40
 
40
41
  const chainConnectorsAtom = jotai.atom(get => {
@@ -85,32 +86,17 @@ var packageJson = {
85
86
 
86
87
  var log = anylogger__default.default(packageJson.name);
87
88
 
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
89
  const tokenRatesAtom = jotai.atom(async get => {
102
90
  // runs a timer to keep tokenRates up to date
103
91
  get(tokenRatesFetcherAtomEffect);
104
- return await get(tokenRatesDbAtom);
92
+ return (await get(tokenRatesDbAtom)).tokenRates;
105
93
  });
106
- const tokenRatesDbAtom = utils.atomWithObservable(() => {
107
- const dbRatesToMap = dbRates => Object.fromEntries(dbRates.map(({
108
- tokenId,
109
- rates
110
- }) => [tokenId, rates]));
111
94
 
112
- // retrieve fetched tokenRates from the db
113
- return dexieToRxjs(dexie.liveQuery(() => tokenRates.db.tokenRates.toArray())).pipe(rxjs.map(dbRatesToMap));
95
+ // TODO: Persist to storage
96
+ const tokenRates$ = new rxjs.ReplaySubject(1);
97
+ const tokenRatesDbAtom = utils.atomWithObservable(() => {
98
+ tokenRates.tryToDeleteOldTokenRatesDb();
99
+ return tokenRates$.asObservable();
114
100
  });
115
101
  const tokenRatesFetcherAtomEffect = jotaiEffect.atomEffect(get => {
116
102
  // lets us tear down the existing timer when the effect is restarted
@@ -121,7 +107,6 @@ const tokenRatesFetcherAtomEffect = jotaiEffect.atomEffect(get => {
121
107
  const tokensPromise = get(tokensAtom);
122
108
  (async () => {
123
109
  const tokensById = lodashEs.keyBy(await tokensPromise, "id");
124
- const tokenIds = Object.keys(tokensById);
125
110
  const loopMs = 300_000; // 300_000ms = 300s = 5 minutes
126
111
  const retryTimeout = 5_000; // 5_000ms = 5 seconds
127
112
 
@@ -129,21 +114,11 @@ const tokenRatesFetcherAtomEffect = jotaiEffect.atomEffect(get => {
129
114
  try {
130
115
  if (abort.signal.aborted) return; // don't fetch if aborted
131
116
  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
- }));
117
+ const putTokenRates = {
118
+ tokenRates: tokenRates$1
119
+ };
136
120
  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
- });
121
+ tokenRates$.next(putTokenRates);
147
122
  if (abort.signal.aborted) return; // don't schedule next loop if aborted
148
123
  setTimeout(hydrate, loopMs);
149
124
  } catch (error) {
@@ -1,6 +1,6 @@
1
1
  import { atom, 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';
@@ -12,8 +12,7 @@ import { ChainConnectorEvm } from '@talismn/chain-connector-evm';
12
12
  import { connectionMetaDb } from '@talismn/connection-meta';
13
13
  import { firstThenDebounce, isTruthy, isAbortError } from '@talismn/util';
14
14
  import { atomWithObservable } from 'jotai/utils';
15
- import { combineLatest, Observable, map } from 'rxjs';
16
- import { liveQuery } from 'dexie';
15
+ import { combineLatest, ReplaySubject } from 'rxjs';
17
16
  import anylogger from 'anylogger';
18
17
  import { cryptoWaitReady } from '@polkadot/util-crypto';
19
18
 
@@ -29,7 +28,9 @@ const enabledTokensAtom = atom(undefined);
29
28
  const allAddressesAtom = atom([]);
30
29
 
31
30
  const chaindataProviderAtom = atom(() => {
32
- return new ChaindataProvider({});
31
+ return new ChaindataProvider({
32
+ // TODO pass persistedStorage
33
+ });
33
34
  });
34
35
 
35
36
  const chainConnectorsAtom = atom(get => {
@@ -80,32 +81,17 @@ var packageJson = {
80
81
 
81
82
  var log = anylogger(packageJson.name);
82
83
 
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
84
  const tokenRatesAtom = atom(async get => {
97
85
  // runs a timer to keep tokenRates up to date
98
86
  get(tokenRatesFetcherAtomEffect);
99
- return await get(tokenRatesDbAtom);
87
+ return (await get(tokenRatesDbAtom)).tokenRates;
100
88
  });
101
- const tokenRatesDbAtom = atomWithObservable(() => {
102
- const dbRatesToMap = dbRates => Object.fromEntries(dbRates.map(({
103
- tokenId,
104
- rates
105
- }) => [tokenId, rates]));
106
89
 
107
- // retrieve fetched tokenRates from the db
108
- return dexieToRxjs(liveQuery(() => db.tokenRates.toArray())).pipe(map(dbRatesToMap));
90
+ // TODO: Persist to storage
91
+ const tokenRates$ = new ReplaySubject(1);
92
+ const tokenRatesDbAtom = atomWithObservable(() => {
93
+ tryToDeleteOldTokenRatesDb();
94
+ return tokenRates$.asObservable();
109
95
  });
110
96
  const tokenRatesFetcherAtomEffect = atomEffect(get => {
111
97
  // lets us tear down the existing timer when the effect is restarted
@@ -116,7 +102,6 @@ const tokenRatesFetcherAtomEffect = atomEffect(get => {
116
102
  const tokensPromise = get(tokensAtom);
117
103
  (async () => {
118
104
  const tokensById = keyBy(await tokensPromise, "id");
119
- const tokenIds = Object.keys(tokensById);
120
105
  const loopMs = 300_000; // 300_000ms = 300s = 5 minutes
121
106
  const retryTimeout = 5_000; // 5_000ms = 5 seconds
122
107
 
@@ -124,21 +109,11 @@ const tokenRatesFetcherAtomEffect = atomEffect(get => {
124
109
  try {
125
110
  if (abort.signal.aborted) return; // don't fetch if aborted
126
111
  const tokenRates = await fetchTokenRates(tokensById, ALL_CURRENCY_IDS, coinsApiConfig);
127
- const putTokenRates = Object.entries(tokenRates).map(([tokenId, rates]) => ({
128
- tokenId,
129
- rates
130
- }));
112
+ const putTokenRates = {
113
+ tokenRates
114
+ };
131
115
  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
- });
116
+ tokenRates$.next(putTokenRates);
142
117
  if (abort.signal.aborted) return; // don't schedule next loop if aborted
143
118
  setTimeout(hydrate, loopMs);
144
119
  } catch (error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@talismn/balances-react",
3
- "version": "0.0.0-pr2120-20250731072022",
3
+ "version": "0.0.0-pr2120-20250801034201",
4
4
  "author": "Talisman",
5
5
  "homepage": "https://talisman.xyz",
6
6
  "license": "GPL-3.0-or-later",
@@ -23,21 +23,19 @@
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": "0.0.0-pr2120-20250731072022",
34
- "@talismn/chain-connector-evm": "0.0.0-pr2120-20250731072022",
35
- "@talismn/chaindata-provider": "0.0.0-pr2120-20250731072022",
36
- "@talismn/connection-meta": "0.0.0-pr2120-20250731072022",
37
- "@talismn/chain-connector": "0.0.0-pr2120-20250731072022",
31
+ "@talismn/balances": "0.0.0-pr2120-20250801034201",
32
+ "@talismn/chain-connector": "0.0.0-pr2120-20250801034201",
33
+ "@talismn/chaindata-provider": "0.0.0-pr2120-20250801034201",
34
+ "@talismn/connection-meta": "0.0.0-pr2120-20250801034201",
35
+ "@talismn/chain-connector-evm": "0.0.0-pr2120-20250801034201",
36
+ "@talismn/token-rates": "0.0.0-pr2120-20250801034201",
38
37
  "@talismn/scale": "0.2.0",
39
- "@talismn/token-rates": "0.0.0-pr2120-20250731072022",
40
- "@talismn/util": "0.0.0-pr2120-20250731072022"
38
+ "@talismn/util": "0.0.0-pr2120-20250801034201"
41
39
  },
42
40
  "devDependencies": {
43
41
  "@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>;