@talismn/balances 0.0.0-pr2075-20250707160526 → 0.0.0-pr2075-20250708110002
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/BalancesProvider.d.ts +23 -0
- package/dist/declarations/src/getMiniMetadata/getMiniMetadatas.d.ts +1 -1
- package/dist/declarations/src/index.d.ts +1 -0
- package/dist/declarations/src/modules/IBalanceModule.d.ts +4 -4
- package/dist/declarations/src/types/balances.d.ts +4 -3
- package/dist/talismn-balances.cjs.dev.js +190 -82
- package/dist/talismn-balances.cjs.prod.js +190 -82
- package/dist/talismn-balances.esm.js +191 -84
- package/package.json +8 -8
@@ -1,6 +1,6 @@
|
|
1
1
|
import { Dexie } from 'dexie';
|
2
2
|
import anylogger from 'anylogger';
|
3
|
-
import { evmErc20TokenId, MINIMETADATA_VERSION, EvmErc20TokenSchema, parseTokenId, parseEvmErc20TokenId, isTokenOfType, TokenBaseSchema, EvmNativeTokenSchema, evmNativeTokenId, EvmUniswapV2TokenSchema, evmUniswapV2TokenId, networkIdFromTokenId, getGithubTokenLogoUrl, SubAssetsTokenSchema, subAssetTokenId, SubForeignAssetsTokenSchema, subForeignAssetTokenId, SubHydrationTokenSchema, subHydrationTokenId, SubNativeTokenSchema, subNativeTokenId, SubPsp22TokenSchema, subPsp22TokenId, SubTokensTokenSchema, subTokensTokenId,
|
3
|
+
import { evmErc20TokenId, MINIMETADATA_VERSION, EvmErc20TokenSchema, parseTokenId, parseEvmErc20TokenId, isTokenOfType, TokenBaseSchema, EvmNativeTokenSchema, evmNativeTokenId, EvmUniswapV2TokenSchema, evmUniswapV2TokenId, networkIdFromTokenId, getGithubTokenLogoUrl, SubAssetsTokenSchema, subAssetTokenId, SubForeignAssetsTokenSchema, subForeignAssetTokenId, SubHydrationTokenSchema, subHydrationTokenId, SubNativeTokenSchema, subNativeTokenId, SubPsp22TokenSchema, subPsp22TokenId, SubTokensTokenSchema, subTokensTokenId, parseSubAssetTokenId, parseSubForeignAssetTokenId, parseSubTokensTokenId, isNetworkDot } from '@talismn/chaindata-provider';
|
4
4
|
export { MINIMETADATA_VERSION } from '@talismn/chaindata-provider';
|
5
5
|
import { newTokenRates } from '@talismn/token-rates';
|
6
6
|
import { isBigInt, BigMath, planckToTokens, isArrayOf, isTruthy, isEthereumAddress, hasOwnProperty, isNotNil, isAbortError, decodeAnyAddress, blake2Concat, Deferred } from '@talismn/util';
|
@@ -11,7 +11,7 @@ import pako from 'pako';
|
|
11
11
|
import { parseAbi, erc20Abi, getContract, ContractFunctionExecutionError, hexToString, erc20Abi_bytes32, encodeFunctionData, isHex, hexToBigInt, withRetry } from 'viem';
|
12
12
|
import { assign, omit, isEqual, fromPairs, toPairs, keys, keyBy, uniq, values, groupBy as groupBy$1 } from 'lodash';
|
13
13
|
import z from 'zod/v4';
|
14
|
-
import { Observable, distinctUntilChanged, of, timer, switchMap, from, firstValueFrom, scan, share, map, switchAll, combineLatest, mergeMap, toArray, interval, startWith, exhaustMap, BehaviorSubject, debounceTime, takeUntil, withLatestFrom, concatMap } from 'rxjs';
|
14
|
+
import { Observable, distinctUntilChanged, of, timer, switchMap, from, firstValueFrom, scan, share, map, switchAll, combineLatest, mergeMap, toArray, interval, startWith, exhaustMap, BehaviorSubject, debounceTime, takeUntil, withLatestFrom, concatMap, tap } from 'rxjs';
|
15
15
|
import isEqual$1 from 'lodash/isEqual';
|
16
16
|
import { unifyMetadata, decAnyMetadata, getDynamicBuilder, getLookupFn, decodeScale, parseMetadataRpc, getStorageKeyPrefix, compactMetadata, encodeMetadata, papiParse, papiStringify, toHex, getMetadataVersion, encodeStateKey } from '@talismn/scale';
|
17
17
|
import { Metadata, TypeRegistry } from '@polkadot/types';
|
@@ -275,11 +275,10 @@ class Balances {
|
|
275
275
|
}
|
276
276
|
const getBalanceId = balance => {
|
277
277
|
const {
|
278
|
-
source,
|
279
278
|
address,
|
280
279
|
tokenId
|
281
280
|
} = balance;
|
282
|
-
return [
|
281
|
+
return [address, tokenId].join("::");
|
283
282
|
};
|
284
283
|
|
285
284
|
/**
|
@@ -1538,16 +1537,16 @@ const getBalanceDefs = addressesByToken => {
|
|
1538
1537
|
|
1539
1538
|
const fetchBalances$c = async ({
|
1540
1539
|
networkId,
|
1541
|
-
|
1540
|
+
tokensWithAddresses,
|
1542
1541
|
connector
|
1543
1542
|
}) => {
|
1544
1543
|
const client = await connector.getPublicClientForEvmNetwork(networkId);
|
1545
1544
|
if (!client) throw new Error(`Could not get rpc provider for evm network ${networkId}`);
|
1546
|
-
for (const [token, addresses] of
|
1545
|
+
for (const [token, addresses] of tokensWithAddresses) {
|
1547
1546
|
if (token.type !== MODULE_TYPE$8 || token.networkId !== networkId) throw new Error(`Invalid token type or networkId for EVM ERC20 balance module: ${token.type} on ${token.networkId}`);
|
1548
1547
|
for (const address of addresses) if (!isEthereumAddress(address)) throw new Error(`Invalid ethereum address for EVM ERC20 balance module: ${address} for token ${token.id}`);
|
1549
1548
|
}
|
1550
|
-
const balanceDefs = getBalanceDefs(
|
1549
|
+
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
1551
1550
|
if (client.chain?.contracts?.erc20Aggregator && balanceDefs.length > 1) {
|
1552
1551
|
const erc20Aggregator = client.chain.contracts.erc20Aggregator;
|
1553
1552
|
return fetchWithAggregator$1(client, balanceDefs, erc20Aggregator.address);
|
@@ -1770,7 +1769,7 @@ const getTransferCallData$8 = ({
|
|
1770
1769
|
const SUBSCRIPTION_INTERVAL$8 = 6_000;
|
1771
1770
|
const subscribeBalances$8 = ({
|
1772
1771
|
networkId,
|
1773
|
-
|
1772
|
+
tokensWithAddresses,
|
1774
1773
|
connector
|
1775
1774
|
}) => {
|
1776
1775
|
return new Observable(subscriber => {
|
@@ -1780,7 +1779,7 @@ const subscribeBalances$8 = ({
|
|
1780
1779
|
if (abortController.signal.aborted) return;
|
1781
1780
|
const balances = await fetchBalances$c({
|
1782
1781
|
networkId,
|
1783
|
-
|
1782
|
+
tokensWithAddresses: tokensWithAddresses,
|
1784
1783
|
connector
|
1785
1784
|
});
|
1786
1785
|
if (abortController.signal.aborted) return;
|
@@ -1790,7 +1789,7 @@ const subscribeBalances$8 = ({
|
|
1790
1789
|
log.error("Error", {
|
1791
1790
|
module: MODULE_TYPE$8,
|
1792
1791
|
networkId,
|
1793
|
-
addressesByToken,
|
1792
|
+
addressesByToken: tokensWithAddresses,
|
1794
1793
|
error
|
1795
1794
|
});
|
1796
1795
|
subscriber.error(error);
|
@@ -1828,16 +1827,16 @@ const PLATFORM$7 = EvmNativeTokenSchema.shape.platform.value;
|
|
1828
1827
|
|
1829
1828
|
const fetchBalances$b = async ({
|
1830
1829
|
networkId,
|
1831
|
-
|
1830
|
+
tokensWithAddresses,
|
1832
1831
|
connector
|
1833
1832
|
}) => {
|
1834
1833
|
const client = await connector.getPublicClientForEvmNetwork(networkId);
|
1835
1834
|
if (!client) throw new Error(`Could not get rpc provider for evm network ${networkId}`);
|
1836
|
-
for (const [token, addresses] of
|
1835
|
+
for (const [token, addresses] of tokensWithAddresses) {
|
1837
1836
|
if (token.type !== MODULE_TYPE$7 || token.networkId !== networkId) throw new Error(`Invalid token type or networkId for EVM ERC20 balance module: ${token.type} on ${token.networkId}`);
|
1838
1837
|
for (const address of addresses) if (!isEthereumAddress(address)) throw new Error(`Invalid ethereum address for EVM ERC20 balance module: ${address} for token ${token.id}`);
|
1839
1838
|
}
|
1840
|
-
const balanceDefs = getBalanceDefs(
|
1839
|
+
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
1841
1840
|
if (client.chain?.contracts?.multicall3 && balanceDefs.length > 1) {
|
1842
1841
|
const multicall3 = client.chain.contracts.multicall3;
|
1843
1842
|
return fetchWithMulticall(client, balanceDefs, multicall3.address);
|
@@ -1984,7 +1983,7 @@ const getTransferCallData$7 = ({
|
|
1984
1983
|
const SUBSCRIPTION_INTERVAL$7 = 6_000;
|
1985
1984
|
const subscribeBalances$7 = ({
|
1986
1985
|
networkId,
|
1987
|
-
|
1986
|
+
tokensWithAddresses,
|
1988
1987
|
connector
|
1989
1988
|
}) => {
|
1990
1989
|
return new Observable(subscriber => {
|
@@ -1994,7 +1993,7 @@ const subscribeBalances$7 = ({
|
|
1994
1993
|
if (abortController.signal.aborted) return;
|
1995
1994
|
const balances = await fetchBalances$b({
|
1996
1995
|
networkId,
|
1997
|
-
|
1996
|
+
tokensWithAddresses: tokensWithAddresses,
|
1998
1997
|
connector
|
1999
1998
|
});
|
2000
1999
|
if (abortController.signal.aborted) return;
|
@@ -2004,7 +2003,7 @@ const subscribeBalances$7 = ({
|
|
2004
2003
|
log.error("Error", {
|
2005
2004
|
module: MODULE_TYPE$7,
|
2006
2005
|
networkId,
|
2007
|
-
addressesByToken,
|
2006
|
+
addressesByToken: tokensWithAddresses,
|
2008
2007
|
error
|
2009
2008
|
});
|
2010
2009
|
subscriber.error(error);
|
@@ -2037,16 +2036,16 @@ const PLATFORM$6 = EvmUniswapV2TokenSchema.shape.platform.value;
|
|
2037
2036
|
|
2038
2037
|
const fetchBalances$a = async ({
|
2039
2038
|
networkId,
|
2040
|
-
|
2039
|
+
tokensWithAddresses,
|
2041
2040
|
connector
|
2042
2041
|
}) => {
|
2043
2042
|
const client = await connector.getPublicClientForEvmNetwork(networkId);
|
2044
2043
|
if (!client) throw new Error(`Could not get rpc provider for evm network ${networkId}`);
|
2045
|
-
for (const [token, addresses] of
|
2044
|
+
for (const [token, addresses] of tokensWithAddresses) {
|
2046
2045
|
if (token.type !== MODULE_TYPE$6 || token.networkId !== networkId) throw new Error(`Invalid token type or networkId for EVM ERC20 balance module: ${token.type} on ${token.networkId}`);
|
2047
2046
|
for (const address of addresses) if (!isEthereumAddress(address)) throw new Error(`Invalid ethereum address for EVM ERC20 balance module: ${address} for token ${token.id}`);
|
2048
2047
|
}
|
2049
|
-
const balanceDefs = getBalanceDefs(
|
2048
|
+
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
2050
2049
|
if (client.chain?.contracts?.erc20Aggregator && balanceDefs.length > 1) {
|
2051
2050
|
const erc20Aggregator = client.chain.contracts.erc20Aggregator;
|
2052
2051
|
return fetchWithAggregator(client, balanceDefs, erc20Aggregator.address);
|
@@ -2317,7 +2316,7 @@ const getTransferCallData$6 = ({
|
|
2317
2316
|
const SUBSCRIPTION_INTERVAL$6 = 6_000;
|
2318
2317
|
const subscribeBalances$6 = ({
|
2319
2318
|
networkId,
|
2320
|
-
|
2319
|
+
tokensWithAddresses,
|
2321
2320
|
connector
|
2322
2321
|
}) => {
|
2323
2322
|
return new Observable(subscriber => {
|
@@ -2327,7 +2326,7 @@ const subscribeBalances$6 = ({
|
|
2327
2326
|
if (abortController.signal.aborted) return;
|
2328
2327
|
const balances = await fetchBalances$a({
|
2329
2328
|
networkId,
|
2330
|
-
|
2329
|
+
tokensWithAddresses: tokensWithAddresses,
|
2331
2330
|
connector
|
2332
2331
|
});
|
2333
2332
|
if (abortController.signal.aborted) return;
|
@@ -2337,7 +2336,7 @@ const subscribeBalances$6 = ({
|
|
2337
2336
|
log.error("Error", {
|
2338
2337
|
module: MODULE_TYPE$6,
|
2339
2338
|
networkId,
|
2340
|
-
addressesByToken,
|
2339
|
+
addressesByToken: tokensWithAddresses,
|
2341
2340
|
error
|
2342
2341
|
});
|
2343
2342
|
subscriber.error(error);
|
@@ -3459,11 +3458,11 @@ const decompress = data => {
|
|
3459
3458
|
|
3460
3459
|
const fetchBalances$6 = async ({
|
3461
3460
|
networkId,
|
3462
|
-
|
3461
|
+
tokensWithAddresses,
|
3463
3462
|
connector,
|
3464
3463
|
miniMetadata
|
3465
3464
|
}) => {
|
3466
|
-
const balanceDefs = getBalanceDefs(
|
3465
|
+
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
3467
3466
|
if (!miniMetadata?.data) {
|
3468
3467
|
log.warn("MiniMetadata is required for fetching balances");
|
3469
3468
|
return {
|
@@ -3838,7 +3837,7 @@ const getTransferAllEncodedArgs$2 = (assetId, to, codec) => {
|
|
3838
3837
|
const SUBSCRIPTION_INTERVAL$5 = 6_000;
|
3839
3838
|
const subscribeBalances$5 = ({
|
3840
3839
|
networkId,
|
3841
|
-
|
3840
|
+
tokensWithAddresses,
|
3842
3841
|
connector,
|
3843
3842
|
miniMetadata
|
3844
3843
|
}) => {
|
@@ -3852,7 +3851,7 @@ const subscribeBalances$5 = ({
|
|
3852
3851
|
if (abortController.signal.aborted) return;
|
3853
3852
|
const balances = await fetchBalances$6({
|
3854
3853
|
networkId,
|
3855
|
-
|
3854
|
+
tokensWithAddresses: tokensWithAddresses,
|
3856
3855
|
connector,
|
3857
3856
|
miniMetadata
|
3858
3857
|
});
|
@@ -3864,7 +3863,7 @@ const subscribeBalances$5 = ({
|
|
3864
3863
|
module: MODULE_TYPE$5,
|
3865
3864
|
networkId,
|
3866
3865
|
miniMetadata,
|
3867
|
-
addressesByToken,
|
3866
|
+
addressesByToken: tokensWithAddresses,
|
3868
3867
|
error
|
3869
3868
|
});
|
3870
3869
|
subscriber.error(error);
|
@@ -3898,11 +3897,11 @@ const PLATFORM$4 = SubForeignAssetsTokenSchema.shape.platform.value;
|
|
3898
3897
|
|
3899
3898
|
const fetchBalances$5 = async ({
|
3900
3899
|
networkId,
|
3901
|
-
|
3900
|
+
tokensWithAddresses,
|
3902
3901
|
connector,
|
3903
3902
|
miniMetadata
|
3904
3903
|
}) => {
|
3905
|
-
const balanceDefs = getBalanceDefs(
|
3904
|
+
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
3906
3905
|
if (!miniMetadata?.data) {
|
3907
3906
|
log.warn("MiniMetadata is required for fetching balances");
|
3908
3907
|
return {
|
@@ -4236,7 +4235,7 @@ const getTransferAllEncodedArgs$1 = (onChainId, to, codec) => {
|
|
4236
4235
|
const SUBSCRIPTION_INTERVAL$4 = 6_000;
|
4237
4236
|
const subscribeBalances$4 = ({
|
4238
4237
|
networkId,
|
4239
|
-
|
4238
|
+
tokensWithAddresses,
|
4240
4239
|
connector,
|
4241
4240
|
miniMetadata
|
4242
4241
|
}) => {
|
@@ -4250,7 +4249,7 @@ const subscribeBalances$4 = ({
|
|
4250
4249
|
if (abortController.signal.aborted) return;
|
4251
4250
|
const balances = await fetchBalances$5({
|
4252
4251
|
networkId,
|
4253
|
-
|
4252
|
+
tokensWithAddresses: tokensWithAddresses,
|
4254
4253
|
connector,
|
4255
4254
|
miniMetadata
|
4256
4255
|
});
|
@@ -4262,7 +4261,7 @@ const subscribeBalances$4 = ({
|
|
4262
4261
|
module: MODULE_TYPE$4,
|
4263
4262
|
networkId,
|
4264
4263
|
miniMetadata,
|
4265
|
-
addressesByToken,
|
4264
|
+
addressesByToken: tokensWithAddresses,
|
4266
4265
|
error
|
4267
4266
|
});
|
4268
4267
|
subscriber.error(error);
|
@@ -4326,11 +4325,11 @@ const tryGetConstantValue = (metadataRpc, pallet, constant) => {
|
|
4326
4325
|
|
4327
4326
|
const fetchBalances$4 = async ({
|
4328
4327
|
networkId,
|
4329
|
-
|
4328
|
+
tokensWithAddresses,
|
4330
4329
|
connector,
|
4331
4330
|
miniMetadata
|
4332
4331
|
}) => {
|
4333
|
-
const balanceDefs = getBalanceDefs(
|
4332
|
+
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
4334
4333
|
if (!miniMetadata?.data) {
|
4335
4334
|
log.warn("MiniMetadata is required for fetching balances");
|
4336
4335
|
return {
|
@@ -4377,7 +4376,7 @@ const fetchBalances$4 = async ({
|
|
4377
4376
|
})).filter(b => b.onChainId !== undefined);
|
4378
4377
|
});
|
4379
4378
|
const balancesByKey = keyBy(fetchedBalances, b => `${b.address}:${b.onChainId}`);
|
4380
|
-
const success =
|
4379
|
+
const success = tokensWithAddresses.reduce((acc, [token, addresses]) => {
|
4381
4380
|
if (token.type === MODULE_TYPE$3) for (const address of addresses) {
|
4382
4381
|
const rawBalance = balancesByKey[`${address}:${token.onChainId}`];
|
4383
4382
|
|
@@ -4582,7 +4581,7 @@ const getTransferCallData$3 = ({
|
|
4582
4581
|
const SUBSCRIPTION_INTERVAL$3 = 6_000;
|
4583
4582
|
const subscribeBalances$3 = ({
|
4584
4583
|
networkId,
|
4585
|
-
|
4584
|
+
tokensWithAddresses,
|
4586
4585
|
connector,
|
4587
4586
|
miniMetadata
|
4588
4587
|
}) => {
|
@@ -4596,7 +4595,7 @@ const subscribeBalances$3 = ({
|
|
4596
4595
|
if (abortController.signal.aborted) return;
|
4597
4596
|
const balances = await fetchBalances$4({
|
4598
4597
|
networkId,
|
4599
|
-
|
4598
|
+
tokensWithAddresses: tokensWithAddresses,
|
4600
4599
|
connector,
|
4601
4600
|
miniMetadata
|
4602
4601
|
});
|
@@ -4608,7 +4607,7 @@ const subscribeBalances$3 = ({
|
|
4608
4607
|
module: MODULE_TYPE$3,
|
4609
4608
|
networkId,
|
4610
4609
|
miniMetadata,
|
4611
|
-
addressesByToken,
|
4610
|
+
addressesByToken: tokensWithAddresses,
|
4612
4611
|
error
|
4613
4612
|
});
|
4614
4613
|
subscriber.error(error);
|
@@ -5481,11 +5480,11 @@ const getNomPoolStateKeys = (coders, nomPoolMemberInfo, extra) => {
|
|
5481
5480
|
|
5482
5481
|
const fetchBalances$3 = async ({
|
5483
5482
|
networkId,
|
5484
|
-
|
5483
|
+
tokensWithAddresses,
|
5485
5484
|
connector,
|
5486
5485
|
miniMetadata
|
5487
5486
|
}) => {
|
5488
|
-
const balanceDefs = getBalanceDefs(
|
5487
|
+
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
5489
5488
|
if (!miniMetadata?.data) {
|
5490
5489
|
log.warn("MiniMetadata is required for fetching balances");
|
5491
5490
|
return {
|
@@ -5763,7 +5762,7 @@ const getTransferAllEncodedArgs = (to, codec) => {
|
|
5763
5762
|
const SUBSCRIPTION_INTERVAL$2 = 6_000;
|
5764
5763
|
const subscribeBalances$2 = ({
|
5765
5764
|
networkId,
|
5766
|
-
|
5765
|
+
tokensWithAddresses,
|
5767
5766
|
connector,
|
5768
5767
|
miniMetadata
|
5769
5768
|
}) => {
|
@@ -5777,7 +5776,7 @@ const subscribeBalances$2 = ({
|
|
5777
5776
|
if (abortController.signal.aborted) return;
|
5778
5777
|
const balances = await fetchBalances$3({
|
5779
5778
|
networkId,
|
5780
|
-
|
5779
|
+
tokensWithAddresses: tokensWithAddresses,
|
5781
5780
|
connector,
|
5782
5781
|
miniMetadata
|
5783
5782
|
});
|
@@ -5789,7 +5788,7 @@ const subscribeBalances$2 = ({
|
|
5789
5788
|
module: MODULE_TYPE$2,
|
5790
5789
|
networkId,
|
5791
5790
|
miniMetadata,
|
5792
|
-
addressesByToken,
|
5791
|
+
addressesByToken: tokensWithAddresses,
|
5793
5792
|
error
|
5794
5793
|
});
|
5795
5794
|
subscriber.error(error);
|
@@ -6980,10 +6979,10 @@ var psp22Abi = {
|
|
6980
6979
|
|
6981
6980
|
const fetchBalances$2 = async ({
|
6982
6981
|
networkId,
|
6983
|
-
|
6982
|
+
tokensWithAddresses,
|
6984
6983
|
connector
|
6985
6984
|
}) => {
|
6986
|
-
const balanceDefs = getBalanceDefs(
|
6985
|
+
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
6987
6986
|
if (!balanceDefs.length) return {
|
6988
6987
|
success: [],
|
6989
6988
|
errors: []
|
@@ -7173,7 +7172,7 @@ const getTransferCallData$1 = async ({
|
|
7173
7172
|
const SUBSCRIPTION_INTERVAL$1 = 6_000;
|
7174
7173
|
const subscribeBalances$1 = ({
|
7175
7174
|
networkId,
|
7176
|
-
|
7175
|
+
tokensWithAddresses,
|
7177
7176
|
connector,
|
7178
7177
|
miniMetadata
|
7179
7178
|
}) => {
|
@@ -7187,7 +7186,7 @@ const subscribeBalances$1 = ({
|
|
7187
7186
|
if (abortController.signal.aborted) return;
|
7188
7187
|
const balances = await fetchBalances$2({
|
7189
7188
|
networkId,
|
7190
|
-
|
7189
|
+
tokensWithAddresses: tokensWithAddresses,
|
7191
7190
|
connector,
|
7192
7191
|
miniMetadata
|
7193
7192
|
});
|
@@ -7199,7 +7198,7 @@ const subscribeBalances$1 = ({
|
|
7199
7198
|
module: MODULE_TYPE$1,
|
7200
7199
|
networkId,
|
7201
7200
|
miniMetadata,
|
7202
|
-
addressesByToken,
|
7201
|
+
addressesByToken: tokensWithAddresses,
|
7203
7202
|
error
|
7204
7203
|
});
|
7205
7204
|
subscriber.error(error);
|
@@ -7233,11 +7232,11 @@ const PLATFORM = SubTokensTokenSchema.shape.platform.value;
|
|
7233
7232
|
|
7234
7233
|
const fetchBalances$1 = async ({
|
7235
7234
|
networkId,
|
7236
|
-
|
7235
|
+
tokensWithAddresses,
|
7237
7236
|
connector,
|
7238
7237
|
miniMetadata
|
7239
7238
|
}) => {
|
7240
|
-
const balanceDefs = getBalanceDefs(
|
7239
|
+
const balanceDefs = getBalanceDefs(tokensWithAddresses);
|
7241
7240
|
if (!miniMetadata?.data) {
|
7242
7241
|
log.warn("MiniMetadata is required for fetching balances");
|
7243
7242
|
return {
|
@@ -7563,7 +7562,7 @@ const getCallDataOptions = (to, token, value, type, config) => {
|
|
7563
7562
|
const SUBSCRIPTION_INTERVAL = 6_000;
|
7564
7563
|
const subscribeBalances = ({
|
7565
7564
|
networkId,
|
7566
|
-
|
7565
|
+
tokensWithAddresses,
|
7567
7566
|
connector,
|
7568
7567
|
miniMetadata
|
7569
7568
|
}) => {
|
@@ -7577,7 +7576,7 @@ const subscribeBalances = ({
|
|
7577
7576
|
if (abortController.signal.aborted) return;
|
7578
7577
|
const balances = await fetchBalances$1({
|
7579
7578
|
networkId,
|
7580
|
-
|
7579
|
+
tokensWithAddresses: tokensWithAddresses,
|
7581
7580
|
connector,
|
7582
7581
|
miniMetadata
|
7583
7582
|
});
|
@@ -7589,7 +7588,7 @@ const subscribeBalances = ({
|
|
7589
7588
|
module: MODULE_TYPE,
|
7590
7589
|
networkId,
|
7591
7590
|
miniMetadata,
|
7592
|
-
addressesByToken,
|
7591
|
+
addressesByToken: tokensWithAddresses,
|
7593
7592
|
error
|
7594
7593
|
});
|
7595
7594
|
subscriber.error(error);
|
@@ -7693,6 +7692,7 @@ const getMiniMetadatas = async (chainConnector, chaindataProvider, networkId, sp
|
|
7693
7692
|
if (CACHE.has(networkId)) return CACHE.get(networkId);
|
7694
7693
|
if (!signal) log.warn("[miniMetadata] getMiniMetadatas called without signal, this may hang the updates", new Error("No signal provided") // this will show the stack trace
|
7695
7694
|
);
|
7695
|
+
if (specVersion === undefined) specVersion = await getSpecVersion(chainConnector, networkId);
|
7696
7696
|
const pResult = POOL.add(() => fetchMiniMetadatas(chainConnector, chaindataProvider, networkId, specVersion), {
|
7697
7697
|
signal
|
7698
7698
|
});
|
@@ -7708,42 +7708,21 @@ const getMiniMetadatas = async (chainConnector, chaindataProvider, networkId, sp
|
|
7708
7708
|
CACHE.delete(networkId);
|
7709
7709
|
}
|
7710
7710
|
};
|
7711
|
-
const DotBalanceModuleTypeSchema = z.keyof(DotNetworkBalancesConfigSchema);
|
7712
7711
|
const fetchMiniMetadatas = async (chainConnector, chaindataProvider, chainId, specVersion, signal) => {
|
7713
7712
|
const start = performance.now();
|
7714
7713
|
log.info("[miniMetadata] fetching minimetadatas for %s", chainId);
|
7715
7714
|
try {
|
7715
|
+
const network = await chaindataProvider.getNetworkById(chainId, "polkadot");
|
7716
|
+
if (!network) throw new Error(`Network ${chainId} not found in chaindataProvider`);
|
7717
|
+
signal?.throwIfAborted();
|
7716
7718
|
const metadataRpc = await getMetadataRpc(chainConnector, chainId);
|
7717
7719
|
signal?.throwIfAborted();
|
7718
|
-
|
7719
|
-
|
7720
|
-
|
7721
|
-
|
7722
|
-
|
7723
|
-
|
7724
|
-
chaindataProvider
|
7725
|
-
})).filter(mod => DotBalanceModuleTypeSchema.safeParse(mod.type).success);
|
7726
|
-
return Promise.all(modules.map(async mod => {
|
7727
|
-
const source = mod.type;
|
7728
|
-
const chain = await chaindataProvider.getNetworkById(chainId, "polkadot");
|
7729
|
-
const balancesConfig = chain?.balancesConfig?.[mod.type];
|
7730
|
-
const chainMeta = await mod.fetchSubstrateChainMeta(chainId, balancesConfig,
|
7731
|
-
// TODO better typing
|
7732
|
-
metadataRpc);
|
7733
|
-
return {
|
7734
|
-
id: deriveMiniMetadataId({
|
7735
|
-
source,
|
7736
|
-
chainId,
|
7737
|
-
specVersion
|
7738
|
-
}),
|
7739
|
-
source,
|
7740
|
-
chainId,
|
7741
|
-
specVersion,
|
7742
|
-
version: MINIMETADATA_VERSION,
|
7743
|
-
data: chainMeta?.miniMetadata ?? null,
|
7744
|
-
extra: chainMeta?.extra ?? null
|
7745
|
-
};
|
7746
|
-
}));
|
7720
|
+
return Promise.all(BALANCE_MODULES.filter(m => m.platform === "polkadot").map(mod => mod.getMiniMetadata({
|
7721
|
+
networkId: chainId,
|
7722
|
+
metadataRpc,
|
7723
|
+
specVersion,
|
7724
|
+
config: network.balancesConfig?.[mod.type]
|
7725
|
+
})));
|
7747
7726
|
} finally {
|
7748
7727
|
log.debug("[miniMetadata] updated miniMetadatas for %s in %sms", chainId, (performance.now() - start).toFixed(2));
|
7749
7728
|
}
|
@@ -10454,4 +10433,132 @@ async function buildQueries(chainConnector, chaindataProvider, addressesByToken,
|
|
10454
10433
|
const defaultBalanceModules = [EvmErc20Module, EvmNativeModule, EvmUniswapV2Module, SubAssetsModule, SubForeignAssetsModule, SubNativeModule, SubPsp22Module, SubTokensModule];
|
10455
10434
|
const BALANCE_MODULES = [SubNativeBalanceModule, SubAssetsBalanceModule, SubHydrationBalanceModule, SubForeignAssetsBalanceModule, SubPsp22BalanceModule, SubTokensBalanceModule, EvmErc20BalanceModule, EvmUniswapV2BalanceModule, EvmNativeBalanceModule];
|
10456
10435
|
|
10457
|
-
|
10436
|
+
const DEFAULT_STORAGE = {
|
10437
|
+
balances: [],
|
10438
|
+
miniMetadatas: []
|
10439
|
+
};
|
10440
|
+
class BalancesProvider {
|
10441
|
+
#chaindataProvider;
|
10442
|
+
#chainConnectors;
|
10443
|
+
#storage;
|
10444
|
+
constructor(chaindataProvider, chainConnectors, storage = DEFAULT_STORAGE) {
|
10445
|
+
this.#chaindataProvider = chaindataProvider;
|
10446
|
+
this.#chainConnectors = chainConnectors;
|
10447
|
+
this.#storage = new BehaviorSubject({
|
10448
|
+
balances: keyBy(storage.balances.filter(isNotNil), b => getBalanceId(b)),
|
10449
|
+
miniMetadatas: keyBy(storage.miniMetadatas.filter(isNotNil), m => m.id)
|
10450
|
+
});
|
10451
|
+
}
|
10452
|
+
get storage$() {
|
10453
|
+
return this.#storage.pipe(map(({
|
10454
|
+
balances,
|
10455
|
+
miniMetadatas
|
10456
|
+
}) => ({
|
10457
|
+
balances: values(balances).filter(isNotNil),
|
10458
|
+
miniMetadatas: values(miniMetadatas).filter(isNotNil)
|
10459
|
+
})));
|
10460
|
+
}
|
10461
|
+
getBalances$(addressesByToken) {
|
10462
|
+
const networkIds = uniq(keys(addressesByToken).map(tokenId => parseTokenId(tokenId).networkId));
|
10463
|
+
return combineLatest(networkIds.map(networkId => this.getNetworkBalances$(networkId, addressesByToken))).pipe(map(results => {
|
10464
|
+
return {
|
10465
|
+
status: results.some(({
|
10466
|
+
status
|
10467
|
+
}) => status === "initialising") ? "initialising" : "live",
|
10468
|
+
balances: results.flatMap(result => result.balances)
|
10469
|
+
};
|
10470
|
+
}), startWith({
|
10471
|
+
status: "initialising",
|
10472
|
+
balances: this.getStoredBalances(addressesByToken)
|
10473
|
+
}), distinctUntilChanged(isEqual));
|
10474
|
+
}
|
10475
|
+
getNetworkBalances$(networkId, addressesByTokenId) {
|
10476
|
+
const network$ = this.#chaindataProvider.getNetworkById$(networkId);
|
10477
|
+
const tokensMapById$ = this.#chaindataProvider.getTokensMapById$();
|
10478
|
+
const miniMetadatas$ = this.getNetworkMiniMetadatas$(networkId);
|
10479
|
+
return combineLatest([network$, miniMetadatas$, tokensMapById$]).pipe(switchMap(([network, miniMetadatas, tokensMapById]) => {
|
10480
|
+
const tokensAndAddresses = toPairs(addressesByTokenId).map(([tokenId, addresses]) => [tokensMapById[tokenId], addresses]);
|
10481
|
+
return combineLatest(BALANCE_MODULES.filter(mod => mod.platform === network?.platform).map(mod => {
|
10482
|
+
const tokensWithAddresses = tokensAndAddresses.filter(([token]) => token.type === mod.type);
|
10483
|
+
const moduleAddressesByTokenId = fromPairs(tokensWithAddresses.map(([token, addresses]) => [token.id, addresses]));
|
10484
|
+
const miniMetadata = miniMetadatas.find(m => m.source === mod.type);
|
10485
|
+
|
10486
|
+
// all balance ids expected in result set
|
10487
|
+
const balanceIds = toPairs(moduleAddressesByTokenId).flatMap(([tokenId, addresses]) => addresses.map(address => getBalanceId({
|
10488
|
+
tokenId,
|
10489
|
+
address
|
10490
|
+
})));
|
10491
|
+
const initValue = {
|
10492
|
+
status: "initialising",
|
10493
|
+
balances: this.getStoredBalances(moduleAddressesByTokenId)
|
10494
|
+
};
|
10495
|
+
const updateStorage = results => {
|
10496
|
+
if (results.status !== "live") return;
|
10497
|
+
const storage = this.#storage.getValue();
|
10498
|
+
const balances = assign({}, storage.balances,
|
10499
|
+
// delete all balances expected in the result set. because if they are not present it means they are empty.
|
10500
|
+
fromPairs(balanceIds.map(balanceId => [balanceId, undefined])), keyBy(results.balances, b => getBalanceId(b)));
|
10501
|
+
this.#storage.next(assign({}, storage, {
|
10502
|
+
balances
|
10503
|
+
}));
|
10504
|
+
};
|
10505
|
+
switch (mod.platform) {
|
10506
|
+
case "ethereum":
|
10507
|
+
{
|
10508
|
+
if (!this.#chainConnectors.evm) return of(initValue);
|
10509
|
+
return mod.subscribeBalances({
|
10510
|
+
networkId,
|
10511
|
+
tokensWithAddresses,
|
10512
|
+
connector: this.#chainConnectors.evm
|
10513
|
+
}).pipe(map(results => ({
|
10514
|
+
status: "live",
|
10515
|
+
// exclude zero balances
|
10516
|
+
balances: results.success.filter(b => new Balance(b).total.planck > 0n)
|
10517
|
+
})), tap(updateStorage), startWith(initValue));
|
10518
|
+
}
|
10519
|
+
case "polkadot":
|
10520
|
+
if (!this.#chainConnectors.substrate || !miniMetadata) {
|
10521
|
+
log.debug("[balances] no substrate connector or miniMetadata for polkadot", mod.type);
|
10522
|
+
return of(initValue);
|
10523
|
+
}
|
10524
|
+
return mod.subscribeBalances({
|
10525
|
+
networkId,
|
10526
|
+
tokensWithAddresses,
|
10527
|
+
connector: this.#chainConnectors.substrate,
|
10528
|
+
miniMetadata: miniMetadata
|
10529
|
+
}).pipe(map(results => ({
|
10530
|
+
status: "live",
|
10531
|
+
// exclude zero balances
|
10532
|
+
balances: results.success.filter(b => new Balance(b).total.planck > 0n)
|
10533
|
+
})), tap(updateStorage), startWith(initValue));
|
10534
|
+
}
|
10535
|
+
}));
|
10536
|
+
}), map(results => {
|
10537
|
+
return {
|
10538
|
+
status: results.some(({
|
10539
|
+
status
|
10540
|
+
}) => status === "initialising") ? "initialising" : "live",
|
10541
|
+
balances: results.flatMap(result => result.balances)
|
10542
|
+
};
|
10543
|
+
}));
|
10544
|
+
}
|
10545
|
+
getNetworkMiniMetadatas$(networkId) {
|
10546
|
+
return this.#chaindataProvider.getNetworkById$(networkId).pipe(switchMap(network => isNetworkDot(network) && this.#chainConnectors.substrate ? from(getMiniMetadatas(this.#chainConnectors.substrate, this.#chaindataProvider, networkId)) : of([])));
|
10547
|
+
}
|
10548
|
+
getStoredBalances(addressesByToken) {
|
10549
|
+
const balanceDefs = toPairs(addressesByToken).flatMap(([tokenId, addresses]) => addresses.map(address => [tokenId, address]));
|
10550
|
+
return balanceDefs.map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({
|
10551
|
+
address,
|
10552
|
+
tokenId
|
10553
|
+
})]).filter(isNotNil);
|
10554
|
+
}
|
10555
|
+
}
|
10556
|
+
|
10557
|
+
// const getStoredBalances = (
|
10558
|
+
// storedBalances: Record<string, IBalance>,
|
10559
|
+
// addressesByToken: Record<TokenId, Address[]>,
|
10560
|
+
// ): IBalance[] => {
|
10561
|
+
|
10562
|
+
// }
|
10563
|
+
|
10564
|
+
export { BALANCE_MODULES, Balance, BalanceFormatter, BalanceValueGetter, Balances, BalancesProvider, Change24hCurrencyFormatter, DefaultBalanceModule, EvmErc20BalanceModule, EvmErc20TokenConfigSchema, EvmNativeBalanceModule, EvmNativeTokenConfigSchema, EvmUniswapV2BalanceModule, EvmUniswapV2TokenConfigSchema, FiatSumBalancesFormatter, ONE_ALPHA_TOKEN$1 as ONE_ALPHA_TOKEN, PlanckSumBalancesFormatter, RpcStateQueryHelper, SCALE_FACTOR$1 as SCALE_FACTOR, SUBTENSOR_MIN_STAKE_AMOUNT_PLANK$1 as SUBTENSOR_MIN_STAKE_AMOUNT_PLANK, SUBTENSOR_ROOT_NETUID$1 as SUBTENSOR_ROOT_NETUID, SubAssetsBalanceModule, SubAssetsTokenConfigSchema, SubForeignAssetsBalanceModule, SubForeignAssetsTokenConfigSchema, SubHydrationBalanceModule, SubHydrationTokenConfigSchema, SubNativeBalanceModule, SubNativeMiniMetadataExtraSchema, SubNativeModuleConfigSchema, SubNativeTokenConfigSchema, SubPsp22BalanceModule, SubPsp22TokenConfigSchema, SubTokensBalanceModule, SubTokensMiniMetadataExtraSchema, SubTokensModuleConfigSchema, SubTokensTokenConfigSchema, SumBalancesFormatter, TalismanBalancesDatabase, abiMulticall, balances, buildNetworkStorageCoders, buildStorageCoders, calculateAlphaPrice$1 as calculateAlphaPrice, calculateTaoAmountFromAlpha$1 as calculateTaoAmountFromAlpha, calculateTaoFromDynamicInfo$1 as calculateTaoFromDynamicInfo, compress, configureStore, db, decodeOutput, decompress, defaultBalanceModules, deriveMiniMetadataId, detectTransferMethod, erc20BalancesAggregatorAbi, excludeFromFeePayableLocks, excludeFromTransferableAmount, filterBaseLocks, filterMirrorTokens, getBalanceId, getLockTitle, getLockedType$1 as getLockedType, getUniqueChainIds, getValueId, includeInTotalExtraAmount, makeContractCaller, uniswapV2PairAbi };
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@talismn/balances",
|
3
|
-
"version": "0.0.0-pr2075-
|
3
|
+
"version": "0.0.0-pr2075-20250708110002",
|
4
4
|
"author": "Talisman",
|
5
5
|
"homepage": "https://talisman.xyz",
|
6
6
|
"license": "GPL-3.0-or-later",
|
@@ -35,13 +35,13 @@
|
|
35
35
|
"scale-ts": "^1.6.1",
|
36
36
|
"viem": "^2.27.3",
|
37
37
|
"zod": "^3.25.62",
|
38
|
-
"@talismn/chain-connector": "0.0.0-pr2075-
|
39
|
-
"@talismn/chain-connector-evm": "0.0.0-pr2075-
|
40
|
-
"@talismn/sapi": "0.0.0-pr2075-
|
41
|
-
"@talismn/scale": "0.0.0-pr2075-
|
42
|
-
"@talismn/
|
43
|
-
"@talismn/
|
44
|
-
"@talismn/
|
38
|
+
"@talismn/chain-connector": "0.0.0-pr2075-20250708110002",
|
39
|
+
"@talismn/chain-connector-evm": "0.0.0-pr2075-20250708110002",
|
40
|
+
"@talismn/sapi": "0.0.0-pr2075-20250708110002",
|
41
|
+
"@talismn/scale": "0.0.0-pr2075-20250708110002",
|
42
|
+
"@talismn/chaindata-provider": "0.0.0-pr2075-20250708110002",
|
43
|
+
"@talismn/token-rates": "0.0.0-pr2075-20250708110002",
|
44
|
+
"@talismn/util": "0.0.0-pr2075-20250708110002"
|
45
45
|
},
|
46
46
|
"devDependencies": {
|
47
47
|
"@polkadot/api-contract": "16.1.2",
|