@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.
@@ -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, DotNetworkBalancesConfigSchema, parseSubAssetTokenId, parseSubForeignAssetTokenId, parseSubTokensTokenId } from '@talismn/chaindata-provider';
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 [source, address, tokenId].join("::");
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
- addressesByToken,
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 addressesByToken) {
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(addressesByToken);
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
- addressesByToken,
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
- addressesByToken,
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
- addressesByToken,
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 addressesByToken) {
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(addressesByToken);
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
- addressesByToken,
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
- addressesByToken,
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
- addressesByToken,
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 addressesByToken) {
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(addressesByToken);
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
- addressesByToken,
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
- addressesByToken,
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
- addressesByToken,
3461
+ tokensWithAddresses,
3463
3462
  connector,
3464
3463
  miniMetadata
3465
3464
  }) => {
3466
- const balanceDefs = getBalanceDefs(addressesByToken);
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
- addressesByToken,
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
- addressesByToken,
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
- addressesByToken,
3900
+ tokensWithAddresses,
3902
3901
  connector,
3903
3902
  miniMetadata
3904
3903
  }) => {
3905
- const balanceDefs = getBalanceDefs(addressesByToken);
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
- addressesByToken,
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
- addressesByToken,
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
- addressesByToken,
4328
+ tokensWithAddresses,
4330
4329
  connector,
4331
4330
  miniMetadata
4332
4331
  }) => {
4333
- const balanceDefs = getBalanceDefs(addressesByToken);
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 = addressesByToken.reduce((acc, [token, addresses]) => {
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
- addressesByToken,
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
- addressesByToken,
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
- addressesByToken,
5483
+ tokensWithAddresses,
5485
5484
  connector,
5486
5485
  miniMetadata
5487
5486
  }) => {
5488
- const balanceDefs = getBalanceDefs(addressesByToken);
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
- addressesByToken,
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
- addressesByToken,
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
- addressesByToken,
6982
+ tokensWithAddresses,
6984
6983
  connector
6985
6984
  }) => {
6986
- const balanceDefs = getBalanceDefs(addressesByToken);
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
- addressesByToken,
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
- addressesByToken,
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
- addressesByToken,
7235
+ tokensWithAddresses,
7237
7236
  connector,
7238
7237
  miniMetadata
7239
7238
  }) => {
7240
- const balanceDefs = getBalanceDefs(addressesByToken);
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
- addressesByToken,
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
- addressesByToken,
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
- const chainConnectors = {
7719
- substrate: chainConnector,
7720
- evm: {} // wont be used but workarounds error for module creation
7721
- };
7722
- const modules = defaultBalanceModules.map(mod => mod({
7723
- chainConnectors,
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
- export { BALANCE_MODULES, Balance, BalanceFormatter, BalanceValueGetter, Balances, 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 };
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-20250707160526",
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-20250707160526",
39
- "@talismn/chain-connector-evm": "0.0.0-pr2075-20250707160526",
40
- "@talismn/sapi": "0.0.0-pr2075-20250707160526",
41
- "@talismn/scale": "0.0.0-pr2075-20250707160526",
42
- "@talismn/token-rates": "0.0.0-pr2075-20250707160526",
43
- "@talismn/util": "0.0.0-pr2075-20250707160526",
44
- "@talismn/chaindata-provider": "0.0.0-pr2075-20250707160526"
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",