@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.
@@ -288,11 +288,10 @@ class Balances {
288
288
  }
289
289
  const getBalanceId = balance => {
290
290
  const {
291
- source,
292
291
  address,
293
292
  tokenId
294
293
  } = balance;
295
- return [source, address, tokenId].join("::");
294
+ return [address, tokenId].join("::");
296
295
  };
297
296
 
298
297
  /**
@@ -1551,16 +1550,16 @@ const getBalanceDefs = addressesByToken => {
1551
1550
 
1552
1551
  const fetchBalances$c = async ({
1553
1552
  networkId,
1554
- addressesByToken,
1553
+ tokensWithAddresses,
1555
1554
  connector
1556
1555
  }) => {
1557
1556
  const client = await connector.getPublicClientForEvmNetwork(networkId);
1558
1557
  if (!client) throw new Error(`Could not get rpc provider for evm network ${networkId}`);
1559
- for (const [token, addresses] of addressesByToken) {
1558
+ for (const [token, addresses] of tokensWithAddresses) {
1560
1559
  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}`);
1561
1560
  for (const address of addresses) if (!util.isEthereumAddress(address)) throw new Error(`Invalid ethereum address for EVM ERC20 balance module: ${address} for token ${token.id}`);
1562
1561
  }
1563
- const balanceDefs = getBalanceDefs(addressesByToken);
1562
+ const balanceDefs = getBalanceDefs(tokensWithAddresses);
1564
1563
  if (client.chain?.contracts?.erc20Aggregator && balanceDefs.length > 1) {
1565
1564
  const erc20Aggregator = client.chain.contracts.erc20Aggregator;
1566
1565
  return fetchWithAggregator$1(client, balanceDefs, erc20Aggregator.address);
@@ -1783,7 +1782,7 @@ const getTransferCallData$8 = ({
1783
1782
  const SUBSCRIPTION_INTERVAL$8 = 6_000;
1784
1783
  const subscribeBalances$8 = ({
1785
1784
  networkId,
1786
- addressesByToken,
1785
+ tokensWithAddresses,
1787
1786
  connector
1788
1787
  }) => {
1789
1788
  return new rxjs.Observable(subscriber => {
@@ -1793,7 +1792,7 @@ const subscribeBalances$8 = ({
1793
1792
  if (abortController.signal.aborted) return;
1794
1793
  const balances = await fetchBalances$c({
1795
1794
  networkId,
1796
- addressesByToken,
1795
+ tokensWithAddresses: tokensWithAddresses,
1797
1796
  connector
1798
1797
  });
1799
1798
  if (abortController.signal.aborted) return;
@@ -1803,7 +1802,7 @@ const subscribeBalances$8 = ({
1803
1802
  log.error("Error", {
1804
1803
  module: MODULE_TYPE$8,
1805
1804
  networkId,
1806
- addressesByToken,
1805
+ addressesByToken: tokensWithAddresses,
1807
1806
  error
1808
1807
  });
1809
1808
  subscriber.error(error);
@@ -1841,16 +1840,16 @@ const PLATFORM$7 = chaindataProvider.EvmNativeTokenSchema.shape.platform.value;
1841
1840
 
1842
1841
  const fetchBalances$b = async ({
1843
1842
  networkId,
1844
- addressesByToken,
1843
+ tokensWithAddresses,
1845
1844
  connector
1846
1845
  }) => {
1847
1846
  const client = await connector.getPublicClientForEvmNetwork(networkId);
1848
1847
  if (!client) throw new Error(`Could not get rpc provider for evm network ${networkId}`);
1849
- for (const [token, addresses] of addressesByToken) {
1848
+ for (const [token, addresses] of tokensWithAddresses) {
1850
1849
  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}`);
1851
1850
  for (const address of addresses) if (!util.isEthereumAddress(address)) throw new Error(`Invalid ethereum address for EVM ERC20 balance module: ${address} for token ${token.id}`);
1852
1851
  }
1853
- const balanceDefs = getBalanceDefs(addressesByToken);
1852
+ const balanceDefs = getBalanceDefs(tokensWithAddresses);
1854
1853
  if (client.chain?.contracts?.multicall3 && balanceDefs.length > 1) {
1855
1854
  const multicall3 = client.chain.contracts.multicall3;
1856
1855
  return fetchWithMulticall(client, balanceDefs, multicall3.address);
@@ -1997,7 +1996,7 @@ const getTransferCallData$7 = ({
1997
1996
  const SUBSCRIPTION_INTERVAL$7 = 6_000;
1998
1997
  const subscribeBalances$7 = ({
1999
1998
  networkId,
2000
- addressesByToken,
1999
+ tokensWithAddresses,
2001
2000
  connector
2002
2001
  }) => {
2003
2002
  return new rxjs.Observable(subscriber => {
@@ -2007,7 +2006,7 @@ const subscribeBalances$7 = ({
2007
2006
  if (abortController.signal.aborted) return;
2008
2007
  const balances = await fetchBalances$b({
2009
2008
  networkId,
2010
- addressesByToken,
2009
+ tokensWithAddresses: tokensWithAddresses,
2011
2010
  connector
2012
2011
  });
2013
2012
  if (abortController.signal.aborted) return;
@@ -2017,7 +2016,7 @@ const subscribeBalances$7 = ({
2017
2016
  log.error("Error", {
2018
2017
  module: MODULE_TYPE$7,
2019
2018
  networkId,
2020
- addressesByToken,
2019
+ addressesByToken: tokensWithAddresses,
2021
2020
  error
2022
2021
  });
2023
2022
  subscriber.error(error);
@@ -2050,16 +2049,16 @@ const PLATFORM$6 = chaindataProvider.EvmUniswapV2TokenSchema.shape.platform.valu
2050
2049
 
2051
2050
  const fetchBalances$a = async ({
2052
2051
  networkId,
2053
- addressesByToken,
2052
+ tokensWithAddresses,
2054
2053
  connector
2055
2054
  }) => {
2056
2055
  const client = await connector.getPublicClientForEvmNetwork(networkId);
2057
2056
  if (!client) throw new Error(`Could not get rpc provider for evm network ${networkId}`);
2058
- for (const [token, addresses] of addressesByToken) {
2057
+ for (const [token, addresses] of tokensWithAddresses) {
2059
2058
  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}`);
2060
2059
  for (const address of addresses) if (!util.isEthereumAddress(address)) throw new Error(`Invalid ethereum address for EVM ERC20 balance module: ${address} for token ${token.id}`);
2061
2060
  }
2062
- const balanceDefs = getBalanceDefs(addressesByToken);
2061
+ const balanceDefs = getBalanceDefs(tokensWithAddresses);
2063
2062
  if (client.chain?.contracts?.erc20Aggregator && balanceDefs.length > 1) {
2064
2063
  const erc20Aggregator = client.chain.contracts.erc20Aggregator;
2065
2064
  return fetchWithAggregator(client, balanceDefs, erc20Aggregator.address);
@@ -2330,7 +2329,7 @@ const getTransferCallData$6 = ({
2330
2329
  const SUBSCRIPTION_INTERVAL$6 = 6_000;
2331
2330
  const subscribeBalances$6 = ({
2332
2331
  networkId,
2333
- addressesByToken,
2332
+ tokensWithAddresses,
2334
2333
  connector
2335
2334
  }) => {
2336
2335
  return new rxjs.Observable(subscriber => {
@@ -2340,7 +2339,7 @@ const subscribeBalances$6 = ({
2340
2339
  if (abortController.signal.aborted) return;
2341
2340
  const balances = await fetchBalances$a({
2342
2341
  networkId,
2343
- addressesByToken,
2342
+ tokensWithAddresses: tokensWithAddresses,
2344
2343
  connector
2345
2344
  });
2346
2345
  if (abortController.signal.aborted) return;
@@ -2350,7 +2349,7 @@ const subscribeBalances$6 = ({
2350
2349
  log.error("Error", {
2351
2350
  module: MODULE_TYPE$6,
2352
2351
  networkId,
2353
- addressesByToken,
2352
+ addressesByToken: tokensWithAddresses,
2354
2353
  error
2355
2354
  });
2356
2355
  subscriber.error(error);
@@ -3472,11 +3471,11 @@ const decompress = data => {
3472
3471
 
3473
3472
  const fetchBalances$6 = async ({
3474
3473
  networkId,
3475
- addressesByToken,
3474
+ tokensWithAddresses,
3476
3475
  connector,
3477
3476
  miniMetadata
3478
3477
  }) => {
3479
- const balanceDefs = getBalanceDefs(addressesByToken);
3478
+ const balanceDefs = getBalanceDefs(tokensWithAddresses);
3480
3479
  if (!miniMetadata?.data) {
3481
3480
  log.warn("MiniMetadata is required for fetching balances");
3482
3481
  return {
@@ -3851,7 +3850,7 @@ const getTransferAllEncodedArgs$2 = (assetId, to, codec) => {
3851
3850
  const SUBSCRIPTION_INTERVAL$5 = 6_000;
3852
3851
  const subscribeBalances$5 = ({
3853
3852
  networkId,
3854
- addressesByToken,
3853
+ tokensWithAddresses,
3855
3854
  connector,
3856
3855
  miniMetadata
3857
3856
  }) => {
@@ -3865,7 +3864,7 @@ const subscribeBalances$5 = ({
3865
3864
  if (abortController.signal.aborted) return;
3866
3865
  const balances = await fetchBalances$6({
3867
3866
  networkId,
3868
- addressesByToken,
3867
+ tokensWithAddresses: tokensWithAddresses,
3869
3868
  connector,
3870
3869
  miniMetadata
3871
3870
  });
@@ -3877,7 +3876,7 @@ const subscribeBalances$5 = ({
3877
3876
  module: MODULE_TYPE$5,
3878
3877
  networkId,
3879
3878
  miniMetadata,
3880
- addressesByToken,
3879
+ addressesByToken: tokensWithAddresses,
3881
3880
  error
3882
3881
  });
3883
3882
  subscriber.error(error);
@@ -3911,11 +3910,11 @@ const PLATFORM$4 = chaindataProvider.SubForeignAssetsTokenSchema.shape.platform.
3911
3910
 
3912
3911
  const fetchBalances$5 = async ({
3913
3912
  networkId,
3914
- addressesByToken,
3913
+ tokensWithAddresses,
3915
3914
  connector,
3916
3915
  miniMetadata
3917
3916
  }) => {
3918
- const balanceDefs = getBalanceDefs(addressesByToken);
3917
+ const balanceDefs = getBalanceDefs(tokensWithAddresses);
3919
3918
  if (!miniMetadata?.data) {
3920
3919
  log.warn("MiniMetadata is required for fetching balances");
3921
3920
  return {
@@ -4249,7 +4248,7 @@ const getTransferAllEncodedArgs$1 = (onChainId, to, codec) => {
4249
4248
  const SUBSCRIPTION_INTERVAL$4 = 6_000;
4250
4249
  const subscribeBalances$4 = ({
4251
4250
  networkId,
4252
- addressesByToken,
4251
+ tokensWithAddresses,
4253
4252
  connector,
4254
4253
  miniMetadata
4255
4254
  }) => {
@@ -4263,7 +4262,7 @@ const subscribeBalances$4 = ({
4263
4262
  if (abortController.signal.aborted) return;
4264
4263
  const balances = await fetchBalances$5({
4265
4264
  networkId,
4266
- addressesByToken,
4265
+ tokensWithAddresses: tokensWithAddresses,
4267
4266
  connector,
4268
4267
  miniMetadata
4269
4268
  });
@@ -4275,7 +4274,7 @@ const subscribeBalances$4 = ({
4275
4274
  module: MODULE_TYPE$4,
4276
4275
  networkId,
4277
4276
  miniMetadata,
4278
- addressesByToken,
4277
+ addressesByToken: tokensWithAddresses,
4279
4278
  error
4280
4279
  });
4281
4280
  subscriber.error(error);
@@ -4339,11 +4338,11 @@ const tryGetConstantValue = (metadataRpc, pallet, constant) => {
4339
4338
 
4340
4339
  const fetchBalances$4 = async ({
4341
4340
  networkId,
4342
- addressesByToken,
4341
+ tokensWithAddresses,
4343
4342
  connector,
4344
4343
  miniMetadata
4345
4344
  }) => {
4346
- const balanceDefs = getBalanceDefs(addressesByToken);
4345
+ const balanceDefs = getBalanceDefs(tokensWithAddresses);
4347
4346
  if (!miniMetadata?.data) {
4348
4347
  log.warn("MiniMetadata is required for fetching balances");
4349
4348
  return {
@@ -4390,7 +4389,7 @@ const fetchBalances$4 = async ({
4390
4389
  })).filter(b => b.onChainId !== undefined);
4391
4390
  });
4392
4391
  const balancesByKey = lodash.keyBy(fetchedBalances, b => `${b.address}:${b.onChainId}`);
4393
- const success = addressesByToken.reduce((acc, [token, addresses]) => {
4392
+ const success = tokensWithAddresses.reduce((acc, [token, addresses]) => {
4394
4393
  if (token.type === MODULE_TYPE$3) for (const address of addresses) {
4395
4394
  const rawBalance = balancesByKey[`${address}:${token.onChainId}`];
4396
4395
 
@@ -4595,7 +4594,7 @@ const getTransferCallData$3 = ({
4595
4594
  const SUBSCRIPTION_INTERVAL$3 = 6_000;
4596
4595
  const subscribeBalances$3 = ({
4597
4596
  networkId,
4598
- addressesByToken,
4597
+ tokensWithAddresses,
4599
4598
  connector,
4600
4599
  miniMetadata
4601
4600
  }) => {
@@ -4609,7 +4608,7 @@ const subscribeBalances$3 = ({
4609
4608
  if (abortController.signal.aborted) return;
4610
4609
  const balances = await fetchBalances$4({
4611
4610
  networkId,
4612
- addressesByToken,
4611
+ tokensWithAddresses: tokensWithAddresses,
4613
4612
  connector,
4614
4613
  miniMetadata
4615
4614
  });
@@ -4621,7 +4620,7 @@ const subscribeBalances$3 = ({
4621
4620
  module: MODULE_TYPE$3,
4622
4621
  networkId,
4623
4622
  miniMetadata,
4624
- addressesByToken,
4623
+ addressesByToken: tokensWithAddresses,
4625
4624
  error
4626
4625
  });
4627
4626
  subscriber.error(error);
@@ -5494,11 +5493,11 @@ const getNomPoolStateKeys = (coders, nomPoolMemberInfo, extra) => {
5494
5493
 
5495
5494
  const fetchBalances$3 = async ({
5496
5495
  networkId,
5497
- addressesByToken,
5496
+ tokensWithAddresses,
5498
5497
  connector,
5499
5498
  miniMetadata
5500
5499
  }) => {
5501
- const balanceDefs = getBalanceDefs(addressesByToken);
5500
+ const balanceDefs = getBalanceDefs(tokensWithAddresses);
5502
5501
  if (!miniMetadata?.data) {
5503
5502
  log.warn("MiniMetadata is required for fetching balances");
5504
5503
  return {
@@ -5776,7 +5775,7 @@ const getTransferAllEncodedArgs = (to, codec) => {
5776
5775
  const SUBSCRIPTION_INTERVAL$2 = 6_000;
5777
5776
  const subscribeBalances$2 = ({
5778
5777
  networkId,
5779
- addressesByToken,
5778
+ tokensWithAddresses,
5780
5779
  connector,
5781
5780
  miniMetadata
5782
5781
  }) => {
@@ -5790,7 +5789,7 @@ const subscribeBalances$2 = ({
5790
5789
  if (abortController.signal.aborted) return;
5791
5790
  const balances = await fetchBalances$3({
5792
5791
  networkId,
5793
- addressesByToken,
5792
+ tokensWithAddresses: tokensWithAddresses,
5794
5793
  connector,
5795
5794
  miniMetadata
5796
5795
  });
@@ -5802,7 +5801,7 @@ const subscribeBalances$2 = ({
5802
5801
  module: MODULE_TYPE$2,
5803
5802
  networkId,
5804
5803
  miniMetadata,
5805
- addressesByToken,
5804
+ addressesByToken: tokensWithAddresses,
5806
5805
  error
5807
5806
  });
5808
5807
  subscriber.error(error);
@@ -6993,10 +6992,10 @@ var psp22Abi = {
6993
6992
 
6994
6993
  const fetchBalances$2 = async ({
6995
6994
  networkId,
6996
- addressesByToken,
6995
+ tokensWithAddresses,
6997
6996
  connector
6998
6997
  }) => {
6999
- const balanceDefs = getBalanceDefs(addressesByToken);
6998
+ const balanceDefs = getBalanceDefs(tokensWithAddresses);
7000
6999
  if (!balanceDefs.length) return {
7001
7000
  success: [],
7002
7001
  errors: []
@@ -7186,7 +7185,7 @@ const getTransferCallData$1 = async ({
7186
7185
  const SUBSCRIPTION_INTERVAL$1 = 6_000;
7187
7186
  const subscribeBalances$1 = ({
7188
7187
  networkId,
7189
- addressesByToken,
7188
+ tokensWithAddresses,
7190
7189
  connector,
7191
7190
  miniMetadata
7192
7191
  }) => {
@@ -7200,7 +7199,7 @@ const subscribeBalances$1 = ({
7200
7199
  if (abortController.signal.aborted) return;
7201
7200
  const balances = await fetchBalances$2({
7202
7201
  networkId,
7203
- addressesByToken,
7202
+ tokensWithAddresses: tokensWithAddresses,
7204
7203
  connector,
7205
7204
  miniMetadata
7206
7205
  });
@@ -7212,7 +7211,7 @@ const subscribeBalances$1 = ({
7212
7211
  module: MODULE_TYPE$1,
7213
7212
  networkId,
7214
7213
  miniMetadata,
7215
- addressesByToken,
7214
+ addressesByToken: tokensWithAddresses,
7216
7215
  error
7217
7216
  });
7218
7217
  subscriber.error(error);
@@ -7246,11 +7245,11 @@ const PLATFORM = chaindataProvider.SubTokensTokenSchema.shape.platform.value;
7246
7245
 
7247
7246
  const fetchBalances$1 = async ({
7248
7247
  networkId,
7249
- addressesByToken,
7248
+ tokensWithAddresses,
7250
7249
  connector,
7251
7250
  miniMetadata
7252
7251
  }) => {
7253
- const balanceDefs = getBalanceDefs(addressesByToken);
7252
+ const balanceDefs = getBalanceDefs(tokensWithAddresses);
7254
7253
  if (!miniMetadata?.data) {
7255
7254
  log.warn("MiniMetadata is required for fetching balances");
7256
7255
  return {
@@ -7576,7 +7575,7 @@ const getCallDataOptions = (to, token, value, type, config) => {
7576
7575
  const SUBSCRIPTION_INTERVAL = 6_000;
7577
7576
  const subscribeBalances = ({
7578
7577
  networkId,
7579
- addressesByToken,
7578
+ tokensWithAddresses,
7580
7579
  connector,
7581
7580
  miniMetadata
7582
7581
  }) => {
@@ -7590,7 +7589,7 @@ const subscribeBalances = ({
7590
7589
  if (abortController.signal.aborted) return;
7591
7590
  const balances = await fetchBalances$1({
7592
7591
  networkId,
7593
- addressesByToken,
7592
+ tokensWithAddresses: tokensWithAddresses,
7594
7593
  connector,
7595
7594
  miniMetadata
7596
7595
  });
@@ -7602,7 +7601,7 @@ const subscribeBalances = ({
7602
7601
  module: MODULE_TYPE,
7603
7602
  networkId,
7604
7603
  miniMetadata,
7605
- addressesByToken,
7604
+ addressesByToken: tokensWithAddresses,
7606
7605
  error
7607
7606
  });
7608
7607
  subscriber.error(error);
@@ -7706,6 +7705,7 @@ const getMiniMetadatas = async (chainConnector, chaindataProvider, networkId, sp
7706
7705
  if (CACHE.has(networkId)) return CACHE.get(networkId);
7707
7706
  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
7708
7707
  );
7708
+ if (specVersion === undefined) specVersion = await getSpecVersion(chainConnector, networkId);
7709
7709
  const pResult = POOL.add(() => fetchMiniMetadatas(chainConnector, chaindataProvider, networkId, specVersion), {
7710
7710
  signal
7711
7711
  });
@@ -7721,42 +7721,21 @@ const getMiniMetadatas = async (chainConnector, chaindataProvider, networkId, sp
7721
7721
  CACHE.delete(networkId);
7722
7722
  }
7723
7723
  };
7724
- const DotBalanceModuleTypeSchema = z__default.default.keyof(chaindataProvider.DotNetworkBalancesConfigSchema);
7725
- const fetchMiniMetadatas = async (chainConnector, chaindataProvider$1, chainId, specVersion, signal) => {
7724
+ const fetchMiniMetadatas = async (chainConnector, chaindataProvider, chainId, specVersion, signal) => {
7726
7725
  const start = performance.now();
7727
7726
  log.info("[miniMetadata] fetching minimetadatas for %s", chainId);
7728
7727
  try {
7728
+ const network = await chaindataProvider.getNetworkById(chainId, "polkadot");
7729
+ if (!network) throw new Error(`Network ${chainId} not found in chaindataProvider`);
7730
+ signal?.throwIfAborted();
7729
7731
  const metadataRpc = await getMetadataRpc(chainConnector, chainId);
7730
7732
  signal?.throwIfAborted();
7731
- const chainConnectors = {
7732
- substrate: chainConnector,
7733
- evm: {} // wont be used but workarounds error for module creation
7734
- };
7735
- const modules = defaultBalanceModules.map(mod => mod({
7736
- chainConnectors,
7737
- chaindataProvider: chaindataProvider$1
7738
- })).filter(mod => DotBalanceModuleTypeSchema.safeParse(mod.type).success);
7739
- return Promise.all(modules.map(async mod => {
7740
- const source = mod.type;
7741
- const chain = await chaindataProvider$1.getNetworkById(chainId, "polkadot");
7742
- const balancesConfig = chain?.balancesConfig?.[mod.type];
7743
- const chainMeta = await mod.fetchSubstrateChainMeta(chainId, balancesConfig,
7744
- // TODO better typing
7745
- metadataRpc);
7746
- return {
7747
- id: deriveMiniMetadataId({
7748
- source,
7749
- chainId,
7750
- specVersion
7751
- }),
7752
- source,
7753
- chainId,
7754
- specVersion,
7755
- version: chaindataProvider.MINIMETADATA_VERSION,
7756
- data: chainMeta?.miniMetadata ?? null,
7757
- extra: chainMeta?.extra ?? null
7758
- };
7759
- }));
7733
+ return Promise.all(BALANCE_MODULES.filter(m => m.platform === "polkadot").map(mod => mod.getMiniMetadata({
7734
+ networkId: chainId,
7735
+ metadataRpc,
7736
+ specVersion,
7737
+ config: network.balancesConfig?.[mod.type]
7738
+ })));
7760
7739
  } finally {
7761
7740
  log.debug("[miniMetadata] updated miniMetadatas for %s in %sms", chainId, (performance.now() - start).toFixed(2));
7762
7741
  }
@@ -10467,6 +10446,134 @@ async function buildQueries(chainConnector, chaindataProvider$1, addressesByToke
10467
10446
  const defaultBalanceModules = [EvmErc20Module, EvmNativeModule, EvmUniswapV2Module, SubAssetsModule, SubForeignAssetsModule, SubNativeModule, SubPsp22Module, SubTokensModule];
10468
10447
  const BALANCE_MODULES = [SubNativeBalanceModule, SubAssetsBalanceModule, SubHydrationBalanceModule, SubForeignAssetsBalanceModule, SubPsp22BalanceModule, SubTokensBalanceModule, EvmErc20BalanceModule, EvmUniswapV2BalanceModule, EvmNativeBalanceModule];
10469
10448
 
10449
+ const DEFAULT_STORAGE = {
10450
+ balances: [],
10451
+ miniMetadatas: []
10452
+ };
10453
+ class BalancesProvider {
10454
+ #chaindataProvider;
10455
+ #chainConnectors;
10456
+ #storage;
10457
+ constructor(chaindataProvider, chainConnectors, storage = DEFAULT_STORAGE) {
10458
+ this.#chaindataProvider = chaindataProvider;
10459
+ this.#chainConnectors = chainConnectors;
10460
+ this.#storage = new rxjs.BehaviorSubject({
10461
+ balances: lodash.keyBy(storage.balances.filter(util.isNotNil), b => getBalanceId(b)),
10462
+ miniMetadatas: lodash.keyBy(storage.miniMetadatas.filter(util.isNotNil), m => m.id)
10463
+ });
10464
+ }
10465
+ get storage$() {
10466
+ return this.#storage.pipe(rxjs.map(({
10467
+ balances,
10468
+ miniMetadatas
10469
+ }) => ({
10470
+ balances: lodash.values(balances).filter(util.isNotNil),
10471
+ miniMetadatas: lodash.values(miniMetadatas).filter(util.isNotNil)
10472
+ })));
10473
+ }
10474
+ getBalances$(addressesByToken) {
10475
+ const networkIds = lodash.uniq(lodash.keys(addressesByToken).map(tokenId => chaindataProvider.parseTokenId(tokenId).networkId));
10476
+ return rxjs.combineLatest(networkIds.map(networkId => this.getNetworkBalances$(networkId, addressesByToken))).pipe(rxjs.map(results => {
10477
+ return {
10478
+ status: results.some(({
10479
+ status
10480
+ }) => status === "initialising") ? "initialising" : "live",
10481
+ balances: results.flatMap(result => result.balances)
10482
+ };
10483
+ }), rxjs.startWith({
10484
+ status: "initialising",
10485
+ balances: this.getStoredBalances(addressesByToken)
10486
+ }), rxjs.distinctUntilChanged(lodash.isEqual));
10487
+ }
10488
+ getNetworkBalances$(networkId, addressesByTokenId) {
10489
+ const network$ = this.#chaindataProvider.getNetworkById$(networkId);
10490
+ const tokensMapById$ = this.#chaindataProvider.getTokensMapById$();
10491
+ const miniMetadatas$ = this.getNetworkMiniMetadatas$(networkId);
10492
+ return rxjs.combineLatest([network$, miniMetadatas$, tokensMapById$]).pipe(rxjs.switchMap(([network, miniMetadatas, tokensMapById]) => {
10493
+ const tokensAndAddresses = lodash.toPairs(addressesByTokenId).map(([tokenId, addresses]) => [tokensMapById[tokenId], addresses]);
10494
+ return rxjs.combineLatest(BALANCE_MODULES.filter(mod => mod.platform === network?.platform).map(mod => {
10495
+ const tokensWithAddresses = tokensAndAddresses.filter(([token]) => token.type === mod.type);
10496
+ const moduleAddressesByTokenId = lodash.fromPairs(tokensWithAddresses.map(([token, addresses]) => [token.id, addresses]));
10497
+ const miniMetadata = miniMetadatas.find(m => m.source === mod.type);
10498
+
10499
+ // all balance ids expected in result set
10500
+ const balanceIds = lodash.toPairs(moduleAddressesByTokenId).flatMap(([tokenId, addresses]) => addresses.map(address => getBalanceId({
10501
+ tokenId,
10502
+ address
10503
+ })));
10504
+ const initValue = {
10505
+ status: "initialising",
10506
+ balances: this.getStoredBalances(moduleAddressesByTokenId)
10507
+ };
10508
+ const updateStorage = results => {
10509
+ if (results.status !== "live") return;
10510
+ const storage = this.#storage.getValue();
10511
+ const balances = lodash.assign({}, storage.balances,
10512
+ // delete all balances expected in the result set. because if they are not present it means they are empty.
10513
+ lodash.fromPairs(balanceIds.map(balanceId => [balanceId, undefined])), lodash.keyBy(results.balances, b => getBalanceId(b)));
10514
+ this.#storage.next(lodash.assign({}, storage, {
10515
+ balances
10516
+ }));
10517
+ };
10518
+ switch (mod.platform) {
10519
+ case "ethereum":
10520
+ {
10521
+ if (!this.#chainConnectors.evm) return rxjs.of(initValue);
10522
+ return mod.subscribeBalances({
10523
+ networkId,
10524
+ tokensWithAddresses,
10525
+ connector: this.#chainConnectors.evm
10526
+ }).pipe(rxjs.map(results => ({
10527
+ status: "live",
10528
+ // exclude zero balances
10529
+ balances: results.success.filter(b => new Balance(b).total.planck > 0n)
10530
+ })), rxjs.tap(updateStorage), rxjs.startWith(initValue));
10531
+ }
10532
+ case "polkadot":
10533
+ if (!this.#chainConnectors.substrate || !miniMetadata) {
10534
+ log.debug("[balances] no substrate connector or miniMetadata for polkadot", mod.type);
10535
+ return rxjs.of(initValue);
10536
+ }
10537
+ return mod.subscribeBalances({
10538
+ networkId,
10539
+ tokensWithAddresses,
10540
+ connector: this.#chainConnectors.substrate,
10541
+ miniMetadata: miniMetadata
10542
+ }).pipe(rxjs.map(results => ({
10543
+ status: "live",
10544
+ // exclude zero balances
10545
+ balances: results.success.filter(b => new Balance(b).total.planck > 0n)
10546
+ })), rxjs.tap(updateStorage), rxjs.startWith(initValue));
10547
+ }
10548
+ }));
10549
+ }), rxjs.map(results => {
10550
+ return {
10551
+ status: results.some(({
10552
+ status
10553
+ }) => status === "initialising") ? "initialising" : "live",
10554
+ balances: results.flatMap(result => result.balances)
10555
+ };
10556
+ }));
10557
+ }
10558
+ getNetworkMiniMetadatas$(networkId) {
10559
+ return this.#chaindataProvider.getNetworkById$(networkId).pipe(rxjs.switchMap(network => chaindataProvider.isNetworkDot(network) && this.#chainConnectors.substrate ? rxjs.from(getMiniMetadatas(this.#chainConnectors.substrate, this.#chaindataProvider, networkId)) : rxjs.of([])));
10560
+ }
10561
+ getStoredBalances(addressesByToken) {
10562
+ const balanceDefs = lodash.toPairs(addressesByToken).flatMap(([tokenId, addresses]) => addresses.map(address => [tokenId, address]));
10563
+ return balanceDefs.map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({
10564
+ address,
10565
+ tokenId
10566
+ })]).filter(util.isNotNil);
10567
+ }
10568
+ }
10569
+
10570
+ // const getStoredBalances = (
10571
+ // storedBalances: Record<string, IBalance>,
10572
+ // addressesByToken: Record<TokenId, Address[]>,
10573
+ // ): IBalance[] => {
10574
+
10575
+ // }
10576
+
10470
10577
  Object.defineProperty(exports, "MINIMETADATA_VERSION", {
10471
10578
  enumerable: true,
10472
10579
  get: function () { return chaindataProvider.MINIMETADATA_VERSION; }
@@ -10476,6 +10583,7 @@ exports.Balance = Balance;
10476
10583
  exports.BalanceFormatter = BalanceFormatter;
10477
10584
  exports.BalanceValueGetter = BalanceValueGetter;
10478
10585
  exports.Balances = Balances;
10586
+ exports.BalancesProvider = BalancesProvider;
10479
10587
  exports.Change24hCurrencyFormatter = Change24hCurrencyFormatter;
10480
10588
  exports.DefaultBalanceModule = DefaultBalanceModule;
10481
10589
  exports.EvmErc20BalanceModule = EvmErc20BalanceModule;