@talismn/balances-react 0.0.0-pr2120-20250731072022 → 0.0.0-pr2120-20250801033534
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/declarations/src/atoms/tokenRates.d.ts +1 -3
- package/dist/declarations/src/hooks/useTokenRates.d.ts +1 -3
- package/dist/talismn-balances-react.cjs.dev.js +13 -38
- package/dist/talismn-balances-react.cjs.prod.js +13 -38
- package/dist/talismn-balances-react.esm.js +15 -40
- package/package.json +8 -10
- package/dist/declarations/src/util/dexieToRxjs.d.ts +0 -6
|
@@ -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
|
-
|
|
113
|
-
|
|
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 =
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}));
|
|
117
|
+
const putTokenRates = {
|
|
118
|
+
tokenRates: tokenRates$1
|
|
119
|
+
};
|
|
136
120
|
if (abort.signal.aborted) return; // don't insert into db if aborted
|
|
137
|
-
|
|
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
|
-
|
|
113
|
-
|
|
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 =
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}));
|
|
117
|
+
const putTokenRates = {
|
|
118
|
+
tokenRates: tokenRates$1
|
|
119
|
+
};
|
|
136
120
|
if (abort.signal.aborted) return; // don't insert into db if aborted
|
|
137
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
108
|
-
|
|
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 =
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}));
|
|
112
|
+
const putTokenRates = {
|
|
113
|
+
tokenRates
|
|
114
|
+
};
|
|
131
115
|
if (abort.signal.aborted) return; // don't insert into db if aborted
|
|
132
|
-
|
|
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-
|
|
3
|
+
"version": "0.0.0-pr2120-20250801033534",
|
|
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-
|
|
34
|
-
"@talismn/chain-connector-evm": "0.0.0-pr2120-
|
|
35
|
-
"@talismn/chaindata-provider": "0.0.0-pr2120-
|
|
36
|
-
"@talismn/
|
|
37
|
-
"@talismn/
|
|
31
|
+
"@talismn/balances": "0.0.0-pr2120-20250801033534",
|
|
32
|
+
"@talismn/chain-connector-evm": "0.0.0-pr2120-20250801033534",
|
|
33
|
+
"@talismn/chaindata-provider": "0.0.0-pr2120-20250801033534",
|
|
34
|
+
"@talismn/chain-connector": "0.0.0-pr2120-20250801033534",
|
|
35
|
+
"@talismn/connection-meta": "0.0.0-pr2120-20250801033534",
|
|
38
36
|
"@talismn/scale": "0.2.0",
|
|
39
|
-
"@talismn/token-rates": "0.0.0-pr2120-
|
|
40
|
-
"@talismn/util": "0.0.0-pr2120-
|
|
37
|
+
"@talismn/token-rates": "0.0.0-pr2120-20250801033534",
|
|
38
|
+
"@talismn/util": "0.0.0-pr2120-20250801033534"
|
|
41
39
|
},
|
|
42
40
|
"devDependencies": {
|
|
43
41
|
"@types/jest": "^29.5.14",
|