@talismn/balances-react 0.1.18 → 0.2.0
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/CHANGELOG.md +15 -0
- package/dist/hooks/useBalances.js +37 -48
- package/dist/hooks/useChaindata.js +11 -20
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,20 @@
|
|
1
1
|
# @talismn/balances-react
|
2
2
|
|
3
|
+
## 0.2.0
|
4
|
+
|
5
|
+
### Patch Changes
|
6
|
+
|
7
|
+
- Updated dependencies [bff217a1]
|
8
|
+
- Updated dependencies [bff217a1]
|
9
|
+
- @talismn/chain-connector-evm@0.2.0
|
10
|
+
- @talismn/balances@0.2.0
|
11
|
+
|
12
|
+
## 0.1.19
|
13
|
+
|
14
|
+
### Patch Changes
|
15
|
+
|
16
|
+
- @talismn/balances@0.1.19
|
17
|
+
|
3
18
|
## 0.1.18
|
4
19
|
|
5
20
|
### Patch Changes
|
@@ -1,12 +1,3 @@
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
8
|
-
});
|
9
|
-
};
|
10
1
|
import { Balances, balances as balancesFn, } from "@talismn/balances";
|
11
2
|
import { db } from "@talismn/balances";
|
12
3
|
import { ChainConnector } from "@talismn/chain-connector";
|
@@ -33,28 +24,26 @@ balanceModules, chaindataProvider, addressesByToken) {
|
|
33
24
|
const evmNetworks = useEvmNetworks(chaindataProvider);
|
34
25
|
const tokens = useTokens(chaindataProvider);
|
35
26
|
const tokenRates = useTokenRates(tokens);
|
36
|
-
const balances = useLiveQuery(() =>
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
{ chains, evmNetworks, tokens, tokenRates });
|
57
|
-
}), [balanceModules, addressesByToken, chains, evmNetworks, tokens, tokenRates]);
|
27
|
+
const balances = useLiveQuery(async () => new Balances(await db.balances
|
28
|
+
.filter((balance) => {
|
29
|
+
// check that this balance is included in our queried balance modules
|
30
|
+
if (!balanceModules.map(({ type }) => type).includes(balance.source))
|
31
|
+
return false;
|
32
|
+
// check that our query includes some tokens and addresses
|
33
|
+
if (!addressesByToken)
|
34
|
+
return false;
|
35
|
+
// check that this balance is included in our queried tokens
|
36
|
+
if (!Object.keys(addressesByToken).includes(balance.tokenId))
|
37
|
+
return false;
|
38
|
+
// check that this balance is included in our queried addresses for this token
|
39
|
+
if (!addressesByToken[balance.tokenId].includes(balance.address))
|
40
|
+
return false;
|
41
|
+
// keep this balance
|
42
|
+
return true;
|
43
|
+
})
|
44
|
+
.toArray(),
|
45
|
+
// hydrate balance chains, evmNetworks, tokens and tokenRates
|
46
|
+
{ chains, evmNetworks, tokens, tokenRates }), [balanceModules, addressesByToken, chains, evmNetworks, tokens, tokenRates]);
|
58
47
|
// debounce every 100ms to prevent hammering UI with updates
|
59
48
|
const [debouncedBalances, setDebouncedBalances] = useState(balances);
|
60
49
|
useDebounce(() => balances && setDebouncedBalances(balances), 100, [balances]);
|
@@ -72,10 +61,9 @@ balanceModules, chaindataProvider, addressesByToken) {
|
|
72
61
|
// Record<string, { unsub: Promise<() => void>; refcount: number; generation: number }>
|
73
62
|
// >({})
|
74
63
|
const addSubscription = (key, balanceModule, chainConnectors, chaindataProvider, addressesByToken) => {
|
75
|
-
var _a;
|
76
64
|
// create subscription if it doesn't already exist
|
77
65
|
if (!subscriptions[key] || subscriptions[key].refcount === 0) {
|
78
|
-
const generation = ((
|
66
|
+
const generation = ((subscriptions[key]?.generation || 0) + 1) % Number.MAX_SAFE_INTEGER;
|
79
67
|
const unsub = balancesFn(balanceModule, chainConnectors, chaindataProvider, addressesByToken, (error, balances) => {
|
80
68
|
if (error)
|
81
69
|
return log.error(`Failed to fetch ${balanceModule.type} balances`, error);
|
@@ -84,8 +72,11 @@ balanceModules, chaindataProvider, addressesByToken) {
|
|
84
72
|
// ignore balances from old subscriptions which are still in the process of unsubscribing
|
85
73
|
if (subscriptions[key].generation !== generation)
|
86
74
|
return;
|
87
|
-
const putBalances = Object.entries(balances.toJSON()).map(([id, balance]) => (
|
88
|
-
|
75
|
+
const putBalances = Object.entries(balances.toJSON()).map(([id, balance]) => ({
|
76
|
+
id,
|
77
|
+
...balance,
|
78
|
+
}));
|
79
|
+
db.transaction("rw", db.balances, async () => await db.balances.bulkPut(putBalances));
|
89
80
|
});
|
90
81
|
subscriptions[key] = { unsub, refcount: 0, generation };
|
91
82
|
}
|
@@ -104,19 +95,17 @@ balanceModules, chaindataProvider, addressesByToken) {
|
|
104
95
|
subscriptions[key].unsub.then((unsub) => unsub());
|
105
96
|
delete subscriptions[key];
|
106
97
|
// set this subscription's balances in the store to status: cache
|
107
|
-
db.transaction("rw", db.balances, () =>
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
})
|
118
|
-
.modify({ status: "cache" });
|
119
|
-
}));
|
98
|
+
db.transaction("rw", db.balances, async () => await db.balances
|
99
|
+
.filter((balance) => {
|
100
|
+
if (balance.source !== balanceModule.type)
|
101
|
+
return false;
|
102
|
+
if (!Object.keys(addressesByToken).includes(balance.tokenId))
|
103
|
+
return false;
|
104
|
+
if (!addressesByToken[balance.tokenId].includes(balance.address))
|
105
|
+
return false;
|
106
|
+
return true;
|
107
|
+
})
|
108
|
+
.modify({ status: "cache" }));
|
120
109
|
}
|
121
110
|
};
|
122
111
|
const chainConnector = useChainConnector(chaindataProvider);
|
@@ -1,12 +1,3 @@
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
8
|
-
});
|
9
|
-
};
|
10
1
|
import { ChaindataProviderExtension } from "@talismn/chaindata-provider-extension";
|
11
2
|
import { useEffect, useState } from "react";
|
12
3
|
import log from "../log";
|
@@ -18,22 +9,22 @@ export function useChaindata() {
|
|
18
9
|
useEffect(() => {
|
19
10
|
const chaindataProvider = new ChaindataProviderExtension();
|
20
11
|
let shouldHydrate = true;
|
21
|
-
const timer =
|
22
|
-
const hydrate = () =>
|
12
|
+
const timer = 300_000; // 300_000ms = 300s = 5 minutes
|
13
|
+
const hydrate = async () => {
|
23
14
|
if (!shouldHydrate)
|
24
15
|
return;
|
25
16
|
try {
|
26
|
-
const updated =
|
17
|
+
const updated = await chaindataProvider.hydrate();
|
27
18
|
if (updated)
|
28
19
|
setGeneration((generation) => (generation + 1) % Number.MAX_SAFE_INTEGER);
|
29
20
|
setTimeout(hydrate, timer);
|
30
21
|
}
|
31
22
|
catch (error) {
|
32
|
-
const retryTimeout =
|
23
|
+
const retryTimeout = 5_000; // 5_000ms = 5 seconds
|
33
24
|
log.error(`Failed to fetch chaindata, retrying in ${Math.round(retryTimeout / 1000)} seconds`, error);
|
34
25
|
setTimeout(hydrate, retryTimeout);
|
35
26
|
}
|
36
|
-
}
|
27
|
+
};
|
37
28
|
setChaindataProvider(chaindataProvider);
|
38
29
|
hydrate();
|
39
30
|
return () => {
|
@@ -55,7 +46,7 @@ export function useChains(chaindata) {
|
|
55
46
|
return;
|
56
47
|
setChains(chains);
|
57
48
|
});
|
58
|
-
}, [chaindata
|
49
|
+
}, [chaindata?.generation]);
|
59
50
|
return chains || {};
|
60
51
|
}
|
61
52
|
export function useChain(chaindata, chainId) {
|
@@ -66,7 +57,7 @@ export function useChain(chaindata, chainId) {
|
|
66
57
|
if (!chainId)
|
67
58
|
return;
|
68
59
|
chaindata.getChain(chainId).then(setChain);
|
69
|
-
}, [chaindata
|
60
|
+
}, [chaindata?.generation]);
|
70
61
|
return chain;
|
71
62
|
}
|
72
63
|
export function useEvmNetworks(chaindata) {
|
@@ -80,7 +71,7 @@ export function useEvmNetworks(chaindata) {
|
|
80
71
|
return;
|
81
72
|
setEvmNetworks(evmNetworks);
|
82
73
|
});
|
83
|
-
}, [chaindata
|
74
|
+
}, [chaindata?.generation]);
|
84
75
|
return evmNetworks || {};
|
85
76
|
}
|
86
77
|
export function useEvmNetwork(chaindata, evmNetworkId) {
|
@@ -91,7 +82,7 @@ export function useEvmNetwork(chaindata, evmNetworkId) {
|
|
91
82
|
if (!evmNetworkId)
|
92
83
|
return;
|
93
84
|
chaindata.getEvmNetwork(evmNetworkId).then(setEvmNetwork);
|
94
|
-
}, [chaindata
|
85
|
+
}, [chaindata?.generation]);
|
95
86
|
return evmNetwork;
|
96
87
|
}
|
97
88
|
export function useTokens(chaindata) {
|
@@ -105,7 +96,7 @@ export function useTokens(chaindata) {
|
|
105
96
|
return;
|
106
97
|
setTokens(tokens);
|
107
98
|
});
|
108
|
-
}, [chaindata
|
99
|
+
}, [chaindata?.generation]);
|
109
100
|
return tokens || {};
|
110
101
|
}
|
111
102
|
export function useToken(chaindata, tokenId) {
|
@@ -116,6 +107,6 @@ export function useToken(chaindata, tokenId) {
|
|
116
107
|
if (!tokenId)
|
117
108
|
return;
|
118
109
|
chaindata.getToken(tokenId).then(setToken);
|
119
|
-
}, [chaindata
|
110
|
+
}, [chaindata?.generation]);
|
120
111
|
return token;
|
121
112
|
}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@talismn/balances-react",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.2.0",
|
4
4
|
"author": "Talisman",
|
5
5
|
"homepage": "https://talisman.xyz",
|
6
6
|
"license": "UNLICENSED",
|
@@ -30,9 +30,9 @@
|
|
30
30
|
"clean": "rm -rf dist && rm -rf .turbo rm -rf node_modules"
|
31
31
|
},
|
32
32
|
"dependencies": {
|
33
|
-
"@talismn/balances": "^0.
|
33
|
+
"@talismn/balances": "^0.2.0",
|
34
34
|
"@talismn/chain-connector": "^0.1.10",
|
35
|
-
"@talismn/chain-connector-evm": "^0.
|
35
|
+
"@talismn/chain-connector-evm": "^0.2.0",
|
36
36
|
"@talismn/chaindata-provider": "^0.1.10",
|
37
37
|
"@talismn/chaindata-provider-extension": "^0.1.10",
|
38
38
|
"@talismn/token-rates": "^0.1.10",
|