@talismn/balances 0.0.0-pr2043-20250619003406 → 0.0.0-pr2043-20250619043542

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.
@@ -10,7 +10,7 @@ export type SubPsp22ModuleConfig = {
10
10
  symbol?: string;
11
11
  decimals?: number;
12
12
  ed?: string;
13
- contractAddress?: string;
13
+ contractAddress: string;
14
14
  } & BalancesConfigTokenParams>;
15
15
  };
16
16
  export type SubPsp22Balance = NewBalanceType<ModuleType, "simple">;
@@ -126,7 +126,7 @@ class EvmTokenFetcher {
126
126
 
127
127
  var pkg = {
128
128
  name: "@talismn/balances",
129
- version: "0.0.0-pr2043-20250619003406"};
129
+ version: "0.0.0-pr2043-20250619043542"};
130
130
 
131
131
  var log = anylogger__default.default(pkg.name);
132
132
 
@@ -406,28 +406,6 @@ class Balance {
406
406
  get address() {
407
407
  return this.#storage.address;
408
408
  }
409
-
410
- // /** @deprecated */
411
- // get chainId() {
412
- // return isBalanceEvm(this.#storage) ? undefined : this.#storage.chainId
413
- // }
414
- // /** @deprecated */
415
- // get chain() {
416
- // return (this.#db?.networks && this.networkId && this.#db?.networks[this.networkId]) || null
417
- // }
418
-
419
- // /** @deprecated */
420
- // get evmNetworkId() {
421
- // return isBalanceEvm(this.#storage) ? this.#storage.evmNetworkId : undefined
422
- // }
423
- // /** @deprecated */
424
- // get evmNetwork() {
425
- // return (
426
- // (this.#db?.networks && this.networkId && this.#db?.networks[this.networkId]) ||
427
- // null
428
- // )
429
- // }
430
-
431
409
  get networkId() {
432
410
  return this.#storage.networkId;
433
411
  }
@@ -3219,7 +3197,7 @@ const SubAssetsModule = hydrate => {
3219
3197
  const controller = new AbortController();
3220
3198
  const pUnsubs = Promise.all(lodash.toPairs(byNetwork).map(async ([networkId, addressesByToken]) => {
3221
3199
  try {
3222
- const queries = await buildNetworkQueries$1(networkId, chainConnector, chaindataProvider$1, addressesByToken, controller.signal);
3200
+ const queries = await buildNetworkQueries$2(networkId, chainConnector, chaindataProvider$1, addressesByToken, controller.signal);
3223
3201
  if (controller.signal.aborted) return () => {};
3224
3202
  const stateHelper = new RpcStateQueryHelper(chainConnector, queries);
3225
3203
  return await stateHelper.subscribe((error, result) => {
@@ -3312,7 +3290,7 @@ const SubAssetsModule = hydrate => {
3312
3290
  }
3313
3291
  };
3314
3292
  };
3315
- async function buildNetworkQueries$1(networkId, chainConnector, chaindataProvider, addressesByToken, signal) {
3293
+ async function buildNetworkQueries$2(networkId, chainConnector, chaindataProvider, addressesByToken, signal) {
3316
3294
  const miniMetadata = await getMiniMetadata(chaindataProvider, chainConnector, networkId, moduleType$4, signal);
3317
3295
  // console.log("Fetched miniMetadata for network", networkId, { miniMetadata })
3318
3296
  const chain = await chaindataProvider.chainById(networkId);
@@ -3401,7 +3379,7 @@ async function buildQueries$3(chainConnector, chaindataProvider$1, addressesByTo
3401
3379
  return acc;
3402
3380
  }, {});
3403
3381
  return (await Promise.all(lodash.toPairs(byNetwork).map(([networkId, addressesByToken]) => {
3404
- return buildNetworkQueries$1(networkId, chainConnector, chaindataProvider$1, addressesByToken, signal);
3382
+ return buildNetworkQueries$2(networkId, chainConnector, chaindataProvider$1, addressesByToken, signal);
3405
3383
  }))).flat();
3406
3384
  }
3407
3385
  // NOTE: Different chains need different formats for assetId when encoding the stateKey
@@ -3427,10 +3405,7 @@ const SubForeignAssetsModule = hydrate => {
3427
3405
  return {
3428
3406
  ...DefaultBalanceModule(moduleType$3),
3429
3407
  async fetchSubstrateChainMeta(chainId, moduleConfig, metadataRpc) {
3430
- // const isTestnet = (await chaindataProvider.chainById(chainId))?.isTestnet || false
3431
3408
  if (metadataRpc === undefined) return {};
3432
- // if ((moduleConfig?.tokens ?? []).length < 1) return { isTestnet }
3433
-
3434
3409
  const metadataVersion = scale.getMetadataVersion(metadataRpc);
3435
3410
  if (metadataVersion < 14) return {};
3436
3411
  const metadata = scale.decAnyMetadata(metadataRpc);
@@ -3449,9 +3424,6 @@ const SubForeignAssetsModule = hydrate => {
3449
3424
  miniMetadata
3450
3425
  } = chainMeta;
3451
3426
  if (!miniMetadata) return {};
3452
- // if (miniMetadata === undefined || metadataVersion === undefined) return {}
3453
- // if (metadataVersion < 14) return {}
3454
-
3455
3427
  const metadata = scale.decAnyMetadata(miniMetadata);
3456
3428
  const unifiedMetadata = scale.unifyMetadata(metadata);
3457
3429
  const scaleBuilder = scale.getDynamicBuilder(scale.getLookupFn(unifiedMetadata));
@@ -3505,17 +3477,38 @@ const SubForeignAssetsModule = hydrate => {
3505
3477
  async subscribeBalances({
3506
3478
  addressesByToken
3507
3479
  }, callback) {
3508
- const queries = await buildQueries$2(chaindataProvider$1, addressesByToken);
3509
- const unsubscribe = await new RpcStateQueryHelper(chainConnector, queries).subscribe((error, result) => {
3510
- if (error) return callback(error);
3511
- const balances = result?.filter(b => b !== null) ?? [];
3512
- if (balances.length > 0) callback(null, new Balances(balances));
3513
- });
3514
- return unsubscribe;
3480
+ const byNetwork = lodash.keys(addressesByToken).reduce((acc, tokenId) => {
3481
+ const networkId = chaindataProvider.parseSubForeignAssetTokenId(tokenId).networkId;
3482
+ if (!acc[networkId]) acc[networkId] = {};
3483
+ acc[networkId][tokenId] = addressesByToken[tokenId];
3484
+ return acc;
3485
+ }, {});
3486
+ const controller = new AbortController();
3487
+ const pUnsubs = Promise.all(lodash.toPairs(byNetwork).map(async ([networkId, addressesByToken]) => {
3488
+ try {
3489
+ const queries = await buildNetworkQueries$1(networkId, chainConnector, chaindataProvider$1, addressesByToken, controller.signal);
3490
+ if (controller.signal.aborted) return () => {};
3491
+ const stateHelper = new RpcStateQueryHelper(chainConnector, queries);
3492
+ return await stateHelper.subscribe((error, result) => {
3493
+ if (error) return callback(error);
3494
+ const balances = result?.filter(b => b !== null) ?? [];
3495
+ if (balances.length > 0) callback(null, new Balances(balances));
3496
+ });
3497
+ } catch (err) {
3498
+ if (!controller.signal.aborted) log.error(`Failed to subscribe ${moduleType$3} balances for network ${networkId}`, err);
3499
+ return () => {};
3500
+ }
3501
+ }));
3502
+ return () => {
3503
+ controller.abort();
3504
+ pUnsubs.then(unsubs => {
3505
+ unsubs.forEach(unsubscribe => unsubscribe());
3506
+ });
3507
+ };
3515
3508
  },
3516
3509
  async fetchBalances(addressesByToken) {
3517
3510
  util$1.assert(chainConnectors.substrate, "This module requires a substrate chain connector");
3518
- const queries = await buildQueries$2(chaindataProvider$1, addressesByToken);
3511
+ const queries = await buildQueries$2(chainConnector, chaindataProvider$1, addressesByToken);
3519
3512
  const result = await new RpcStateQueryHelper(chainConnectors.substrate, queries).fetch();
3520
3513
  const balances = result?.filter(b => b !== null) ?? [];
3521
3514
  return new Balances(balances);
@@ -3571,23 +3564,16 @@ const SubForeignAssetsModule = hydrate => {
3571
3564
  }
3572
3565
  };
3573
3566
  };
3574
- async function buildQueries$2(chaindataProvider, addressesByToken) {
3575
- const allChains = await chaindataProvider.chainsById();
3576
- const tokens = await chaindataProvider.tokensById();
3577
- const miniMetadatas = new Map((await db.miniMetadatas.toArray()).map(miniMetadata => [miniMetadata.id, miniMetadata]));
3578
- const uniqueChainIds = getUniqueChainIds(addressesByToken, tokens);
3579
- const chains = Object.fromEntries(uniqueChainIds.map(chainId => [chainId, allChains[chainId]]));
3580
- const chainStorageCoders = buildStorageCoders({
3581
- chainIds: uniqueChainIds,
3582
- chains,
3583
- miniMetadatas,
3584
- moduleType: "substrate-foreignassets",
3585
- coders: {
3586
- storage: ["ForeignAssets", "Account"]
3587
- }
3567
+ async function buildNetworkQueries$1(networkId, chainConnector, chaindataProvider, addressesByToken, signal) {
3568
+ const miniMetadata = await getMiniMetadata(chaindataProvider, chainConnector, networkId, moduleType$3, signal);
3569
+ const chain = await chaindataProvider.chainById(networkId);
3570
+ const tokensById = await chaindataProvider.tokensById();
3571
+ signal?.throwIfAborted();
3572
+ const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
3573
+ storage: ["ForeignAssets", "Account"]
3588
3574
  });
3589
3575
  return Object.entries(addressesByToken).flatMap(([tokenId, addresses]) => {
3590
- const token = tokens[tokenId];
3576
+ const token = tokensById[tokenId];
3591
3577
  if (!token) {
3592
3578
  log.warn(`Token ${tokenId} not found`);
3593
3579
  return [];
@@ -3596,18 +3582,12 @@ async function buildQueries$2(chaindataProvider, addressesByToken) {
3596
3582
  log.debug(`This module doesn't handle tokens of type ${token.type}`);
3597
3583
  return [];
3598
3584
  }
3599
- const networkId = token.networkId;
3600
- if (!networkId) {
3601
- log.warn(`Token ${tokenId} has no chain`);
3602
- return [];
3603
- }
3604
- const chain = chains[networkId];
3605
3585
  if (!chain) {
3606
3586
  log.warn(`Chain ${networkId} for token ${tokenId} not found`);
3607
3587
  return [];
3608
3588
  }
3609
3589
  return addresses.flatMap(address => {
3610
- const scaleCoder = chainStorageCoders.get(networkId)?.storage;
3590
+ const scaleCoder = networkStorageCoders?.storage;
3611
3591
  const onChainId = (() => {
3612
3592
  try {
3613
3593
  return scale.papiParse(token.onChainId);
@@ -3667,6 +3647,17 @@ async function buildQueries$2(chaindataProvider, addressesByToken) {
3667
3647
  });
3668
3648
  });
3669
3649
  }
3650
+ async function buildQueries$2(chainConnector, chaindataProvider$1, addressesByToken, signal) {
3651
+ const byNetwork = lodash.keys(addressesByToken).reduce((acc, tokenId) => {
3652
+ const networkId = chaindataProvider.parseSubForeignAssetTokenId(tokenId).networkId;
3653
+ if (!acc[networkId]) acc[networkId] = {};
3654
+ acc[networkId][tokenId] = addressesByToken[tokenId];
3655
+ return acc;
3656
+ }, {});
3657
+ return (await Promise.all(lodash.toPairs(byNetwork).map(([networkId, addressesByToken]) => {
3658
+ return buildNetworkQueries$1(networkId, chainConnector, chaindataProvider$1, addressesByToken, signal);
3659
+ }))).flat();
3660
+ }
3670
3661
 
3671
3662
  async function subscribeBase(queries, chainConnector, callback) {
3672
3663
  const unsubscribe = await new RpcStateQueryHelper(chainConnector, queries).subscribe((error, result) => {
@@ -6664,8 +6655,6 @@ const SubPsp22Module = hydrate => {
6664
6655
  return {
6665
6656
  ...DefaultBalanceModule(moduleType$1),
6666
6657
  async fetchSubstrateChainMeta(_chainId) {
6667
- // const isTestnet = (await chaindataProvider.chainById(chainId))?.isTestnet || false
6668
- // return { isTestnet }
6669
6658
  return undefined;
6670
6659
  },
6671
6660
  async fetchSubstrateChainTokens(chainId, _chainMeta, moduleConfig) {
@@ -126,7 +126,7 @@ class EvmTokenFetcher {
126
126
 
127
127
  var pkg = {
128
128
  name: "@talismn/balances",
129
- version: "0.0.0-pr2043-20250619003406"};
129
+ version: "0.0.0-pr2043-20250619043542"};
130
130
 
131
131
  var log = anylogger__default.default(pkg.name);
132
132
 
@@ -406,28 +406,6 @@ class Balance {
406
406
  get address() {
407
407
  return this.#storage.address;
408
408
  }
409
-
410
- // /** @deprecated */
411
- // get chainId() {
412
- // return isBalanceEvm(this.#storage) ? undefined : this.#storage.chainId
413
- // }
414
- // /** @deprecated */
415
- // get chain() {
416
- // return (this.#db?.networks && this.networkId && this.#db?.networks[this.networkId]) || null
417
- // }
418
-
419
- // /** @deprecated */
420
- // get evmNetworkId() {
421
- // return isBalanceEvm(this.#storage) ? this.#storage.evmNetworkId : undefined
422
- // }
423
- // /** @deprecated */
424
- // get evmNetwork() {
425
- // return (
426
- // (this.#db?.networks && this.networkId && this.#db?.networks[this.networkId]) ||
427
- // null
428
- // )
429
- // }
430
-
431
409
  get networkId() {
432
410
  return this.#storage.networkId;
433
411
  }
@@ -3219,7 +3197,7 @@ const SubAssetsModule = hydrate => {
3219
3197
  const controller = new AbortController();
3220
3198
  const pUnsubs = Promise.all(lodash.toPairs(byNetwork).map(async ([networkId, addressesByToken]) => {
3221
3199
  try {
3222
- const queries = await buildNetworkQueries$1(networkId, chainConnector, chaindataProvider$1, addressesByToken, controller.signal);
3200
+ const queries = await buildNetworkQueries$2(networkId, chainConnector, chaindataProvider$1, addressesByToken, controller.signal);
3223
3201
  if (controller.signal.aborted) return () => {};
3224
3202
  const stateHelper = new RpcStateQueryHelper(chainConnector, queries);
3225
3203
  return await stateHelper.subscribe((error, result) => {
@@ -3312,7 +3290,7 @@ const SubAssetsModule = hydrate => {
3312
3290
  }
3313
3291
  };
3314
3292
  };
3315
- async function buildNetworkQueries$1(networkId, chainConnector, chaindataProvider, addressesByToken, signal) {
3293
+ async function buildNetworkQueries$2(networkId, chainConnector, chaindataProvider, addressesByToken, signal) {
3316
3294
  const miniMetadata = await getMiniMetadata(chaindataProvider, chainConnector, networkId, moduleType$4, signal);
3317
3295
  // console.log("Fetched miniMetadata for network", networkId, { miniMetadata })
3318
3296
  const chain = await chaindataProvider.chainById(networkId);
@@ -3401,7 +3379,7 @@ async function buildQueries$3(chainConnector, chaindataProvider$1, addressesByTo
3401
3379
  return acc;
3402
3380
  }, {});
3403
3381
  return (await Promise.all(lodash.toPairs(byNetwork).map(([networkId, addressesByToken]) => {
3404
- return buildNetworkQueries$1(networkId, chainConnector, chaindataProvider$1, addressesByToken, signal);
3382
+ return buildNetworkQueries$2(networkId, chainConnector, chaindataProvider$1, addressesByToken, signal);
3405
3383
  }))).flat();
3406
3384
  }
3407
3385
  // NOTE: Different chains need different formats for assetId when encoding the stateKey
@@ -3427,10 +3405,7 @@ const SubForeignAssetsModule = hydrate => {
3427
3405
  return {
3428
3406
  ...DefaultBalanceModule(moduleType$3),
3429
3407
  async fetchSubstrateChainMeta(chainId, moduleConfig, metadataRpc) {
3430
- // const isTestnet = (await chaindataProvider.chainById(chainId))?.isTestnet || false
3431
3408
  if (metadataRpc === undefined) return {};
3432
- // if ((moduleConfig?.tokens ?? []).length < 1) return { isTestnet }
3433
-
3434
3409
  const metadataVersion = scale.getMetadataVersion(metadataRpc);
3435
3410
  if (metadataVersion < 14) return {};
3436
3411
  const metadata = scale.decAnyMetadata(metadataRpc);
@@ -3449,9 +3424,6 @@ const SubForeignAssetsModule = hydrate => {
3449
3424
  miniMetadata
3450
3425
  } = chainMeta;
3451
3426
  if (!miniMetadata) return {};
3452
- // if (miniMetadata === undefined || metadataVersion === undefined) return {}
3453
- // if (metadataVersion < 14) return {}
3454
-
3455
3427
  const metadata = scale.decAnyMetadata(miniMetadata);
3456
3428
  const unifiedMetadata = scale.unifyMetadata(metadata);
3457
3429
  const scaleBuilder = scale.getDynamicBuilder(scale.getLookupFn(unifiedMetadata));
@@ -3505,17 +3477,38 @@ const SubForeignAssetsModule = hydrate => {
3505
3477
  async subscribeBalances({
3506
3478
  addressesByToken
3507
3479
  }, callback) {
3508
- const queries = await buildQueries$2(chaindataProvider$1, addressesByToken);
3509
- const unsubscribe = await new RpcStateQueryHelper(chainConnector, queries).subscribe((error, result) => {
3510
- if (error) return callback(error);
3511
- const balances = result?.filter(b => b !== null) ?? [];
3512
- if (balances.length > 0) callback(null, new Balances(balances));
3513
- });
3514
- return unsubscribe;
3480
+ const byNetwork = lodash.keys(addressesByToken).reduce((acc, tokenId) => {
3481
+ const networkId = chaindataProvider.parseSubForeignAssetTokenId(tokenId).networkId;
3482
+ if (!acc[networkId]) acc[networkId] = {};
3483
+ acc[networkId][tokenId] = addressesByToken[tokenId];
3484
+ return acc;
3485
+ }, {});
3486
+ const controller = new AbortController();
3487
+ const pUnsubs = Promise.all(lodash.toPairs(byNetwork).map(async ([networkId, addressesByToken]) => {
3488
+ try {
3489
+ const queries = await buildNetworkQueries$1(networkId, chainConnector, chaindataProvider$1, addressesByToken, controller.signal);
3490
+ if (controller.signal.aborted) return () => {};
3491
+ const stateHelper = new RpcStateQueryHelper(chainConnector, queries);
3492
+ return await stateHelper.subscribe((error, result) => {
3493
+ if (error) return callback(error);
3494
+ const balances = result?.filter(b => b !== null) ?? [];
3495
+ if (balances.length > 0) callback(null, new Balances(balances));
3496
+ });
3497
+ } catch (err) {
3498
+ if (!controller.signal.aborted) log.error(`Failed to subscribe ${moduleType$3} balances for network ${networkId}`, err);
3499
+ return () => {};
3500
+ }
3501
+ }));
3502
+ return () => {
3503
+ controller.abort();
3504
+ pUnsubs.then(unsubs => {
3505
+ unsubs.forEach(unsubscribe => unsubscribe());
3506
+ });
3507
+ };
3515
3508
  },
3516
3509
  async fetchBalances(addressesByToken) {
3517
3510
  util$1.assert(chainConnectors.substrate, "This module requires a substrate chain connector");
3518
- const queries = await buildQueries$2(chaindataProvider$1, addressesByToken);
3511
+ const queries = await buildQueries$2(chainConnector, chaindataProvider$1, addressesByToken);
3519
3512
  const result = await new RpcStateQueryHelper(chainConnectors.substrate, queries).fetch();
3520
3513
  const balances = result?.filter(b => b !== null) ?? [];
3521
3514
  return new Balances(balances);
@@ -3571,23 +3564,16 @@ const SubForeignAssetsModule = hydrate => {
3571
3564
  }
3572
3565
  };
3573
3566
  };
3574
- async function buildQueries$2(chaindataProvider, addressesByToken) {
3575
- const allChains = await chaindataProvider.chainsById();
3576
- const tokens = await chaindataProvider.tokensById();
3577
- const miniMetadatas = new Map((await db.miniMetadatas.toArray()).map(miniMetadata => [miniMetadata.id, miniMetadata]));
3578
- const uniqueChainIds = getUniqueChainIds(addressesByToken, tokens);
3579
- const chains = Object.fromEntries(uniqueChainIds.map(chainId => [chainId, allChains[chainId]]));
3580
- const chainStorageCoders = buildStorageCoders({
3581
- chainIds: uniqueChainIds,
3582
- chains,
3583
- miniMetadatas,
3584
- moduleType: "substrate-foreignassets",
3585
- coders: {
3586
- storage: ["ForeignAssets", "Account"]
3587
- }
3567
+ async function buildNetworkQueries$1(networkId, chainConnector, chaindataProvider, addressesByToken, signal) {
3568
+ const miniMetadata = await getMiniMetadata(chaindataProvider, chainConnector, networkId, moduleType$3, signal);
3569
+ const chain = await chaindataProvider.chainById(networkId);
3570
+ const tokensById = await chaindataProvider.tokensById();
3571
+ signal?.throwIfAborted();
3572
+ const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
3573
+ storage: ["ForeignAssets", "Account"]
3588
3574
  });
3589
3575
  return Object.entries(addressesByToken).flatMap(([tokenId, addresses]) => {
3590
- const token = tokens[tokenId];
3576
+ const token = tokensById[tokenId];
3591
3577
  if (!token) {
3592
3578
  log.warn(`Token ${tokenId} not found`);
3593
3579
  return [];
@@ -3596,18 +3582,12 @@ async function buildQueries$2(chaindataProvider, addressesByToken) {
3596
3582
  log.debug(`This module doesn't handle tokens of type ${token.type}`);
3597
3583
  return [];
3598
3584
  }
3599
- const networkId = token.networkId;
3600
- if (!networkId) {
3601
- log.warn(`Token ${tokenId} has no chain`);
3602
- return [];
3603
- }
3604
- const chain = chains[networkId];
3605
3585
  if (!chain) {
3606
3586
  log.warn(`Chain ${networkId} for token ${tokenId} not found`);
3607
3587
  return [];
3608
3588
  }
3609
3589
  return addresses.flatMap(address => {
3610
- const scaleCoder = chainStorageCoders.get(networkId)?.storage;
3590
+ const scaleCoder = networkStorageCoders?.storage;
3611
3591
  const onChainId = (() => {
3612
3592
  try {
3613
3593
  return scale.papiParse(token.onChainId);
@@ -3667,6 +3647,17 @@ async function buildQueries$2(chaindataProvider, addressesByToken) {
3667
3647
  });
3668
3648
  });
3669
3649
  }
3650
+ async function buildQueries$2(chainConnector, chaindataProvider$1, addressesByToken, signal) {
3651
+ const byNetwork = lodash.keys(addressesByToken).reduce((acc, tokenId) => {
3652
+ const networkId = chaindataProvider.parseSubForeignAssetTokenId(tokenId).networkId;
3653
+ if (!acc[networkId]) acc[networkId] = {};
3654
+ acc[networkId][tokenId] = addressesByToken[tokenId];
3655
+ return acc;
3656
+ }, {});
3657
+ return (await Promise.all(lodash.toPairs(byNetwork).map(([networkId, addressesByToken]) => {
3658
+ return buildNetworkQueries$1(networkId, chainConnector, chaindataProvider$1, addressesByToken, signal);
3659
+ }))).flat();
3660
+ }
3670
3661
 
3671
3662
  async function subscribeBase(queries, chainConnector, callback) {
3672
3663
  const unsubscribe = await new RpcStateQueryHelper(chainConnector, queries).subscribe((error, result) => {
@@ -6664,8 +6655,6 @@ const SubPsp22Module = hydrate => {
6664
6655
  return {
6665
6656
  ...DefaultBalanceModule(moduleType$1),
6666
6657
  async fetchSubstrateChainMeta(_chainId) {
6667
- // const isTestnet = (await chaindataProvider.chainById(chainId))?.isTestnet || false
6668
- // return { isTestnet }
6669
6658
  return undefined;
6670
6659
  },
6671
6660
  async fetchSubstrateChainTokens(chainId, _chainMeta, moduleConfig) {
@@ -6,7 +6,7 @@ import BigNumber from 'bignumber.js';
6
6
  import { u8aToHex, assert, stringCamelCase, u8aConcatStrict, u8aConcat, arrayChunk, u8aToString, hexToNumber, hexToU8a } from '@polkadot/util';
7
7
  import { xxhashAsU8a, blake2AsU8a } from '@polkadot/util-crypto';
8
8
  import pako from 'pako';
9
- import { evmErc20TokenId as evmErc20TokenId$1, EvmErc20TokenSchema, evmNativeTokenId, evmUniswapV2TokenId, githubTokenLogoUrl, parseSubAssetTokenId, subAssetTokenId, subForeignAssetTokenId, parseSubNativeTokenId, subNativeTokenId, subPsp22TokenId, parseSubTokensTokenId, subTokensTokenId } from '@talismn/chaindata-provider';
9
+ import { evmErc20TokenId as evmErc20TokenId$1, EvmErc20TokenSchema, evmNativeTokenId, evmUniswapV2TokenId, githubTokenLogoUrl, parseSubAssetTokenId, subAssetTokenId, parseSubForeignAssetTokenId, subForeignAssetTokenId, parseSubNativeTokenId, subNativeTokenId, subPsp22TokenId, parseSubTokensTokenId, subTokensTokenId } from '@talismn/chaindata-provider';
10
10
  import { parseAbi, isHex, hexToBigInt } from 'viem';
11
11
  import isEqual from 'lodash/isEqual';
12
12
  import { defineMethod } from '@substrate/txwrapper-core';
@@ -111,7 +111,7 @@ class EvmTokenFetcher {
111
111
 
112
112
  var pkg = {
113
113
  name: "@talismn/balances",
114
- version: "0.0.0-pr2043-20250619003406"};
114
+ version: "0.0.0-pr2043-20250619043542"};
115
115
 
116
116
  var log = anylogger(pkg.name);
117
117
 
@@ -391,28 +391,6 @@ class Balance {
391
391
  get address() {
392
392
  return this.#storage.address;
393
393
  }
394
-
395
- // /** @deprecated */
396
- // get chainId() {
397
- // return isBalanceEvm(this.#storage) ? undefined : this.#storage.chainId
398
- // }
399
- // /** @deprecated */
400
- // get chain() {
401
- // return (this.#db?.networks && this.networkId && this.#db?.networks[this.networkId]) || null
402
- // }
403
-
404
- // /** @deprecated */
405
- // get evmNetworkId() {
406
- // return isBalanceEvm(this.#storage) ? this.#storage.evmNetworkId : undefined
407
- // }
408
- // /** @deprecated */
409
- // get evmNetwork() {
410
- // return (
411
- // (this.#db?.networks && this.networkId && this.#db?.networks[this.networkId]) ||
412
- // null
413
- // )
414
- // }
415
-
416
394
  get networkId() {
417
395
  return this.#storage.networkId;
418
396
  }
@@ -3204,7 +3182,7 @@ const SubAssetsModule = hydrate => {
3204
3182
  const controller = new AbortController();
3205
3183
  const pUnsubs = Promise.all(toPairs(byNetwork).map(async ([networkId, addressesByToken]) => {
3206
3184
  try {
3207
- const queries = await buildNetworkQueries$1(networkId, chainConnector, chaindataProvider, addressesByToken, controller.signal);
3185
+ const queries = await buildNetworkQueries$2(networkId, chainConnector, chaindataProvider, addressesByToken, controller.signal);
3208
3186
  if (controller.signal.aborted) return () => {};
3209
3187
  const stateHelper = new RpcStateQueryHelper(chainConnector, queries);
3210
3188
  return await stateHelper.subscribe((error, result) => {
@@ -3297,7 +3275,7 @@ const SubAssetsModule = hydrate => {
3297
3275
  }
3298
3276
  };
3299
3277
  };
3300
- async function buildNetworkQueries$1(networkId, chainConnector, chaindataProvider, addressesByToken, signal) {
3278
+ async function buildNetworkQueries$2(networkId, chainConnector, chaindataProvider, addressesByToken, signal) {
3301
3279
  const miniMetadata = await getMiniMetadata(chaindataProvider, chainConnector, networkId, moduleType$4, signal);
3302
3280
  // console.log("Fetched miniMetadata for network", networkId, { miniMetadata })
3303
3281
  const chain = await chaindataProvider.chainById(networkId);
@@ -3386,7 +3364,7 @@ async function buildQueries$3(chainConnector, chaindataProvider, addressesByToke
3386
3364
  return acc;
3387
3365
  }, {});
3388
3366
  return (await Promise.all(toPairs(byNetwork).map(([networkId, addressesByToken]) => {
3389
- return buildNetworkQueries$1(networkId, chainConnector, chaindataProvider, addressesByToken, signal);
3367
+ return buildNetworkQueries$2(networkId, chainConnector, chaindataProvider, addressesByToken, signal);
3390
3368
  }))).flat();
3391
3369
  }
3392
3370
  // NOTE: Different chains need different formats for assetId when encoding the stateKey
@@ -3412,10 +3390,7 @@ const SubForeignAssetsModule = hydrate => {
3412
3390
  return {
3413
3391
  ...DefaultBalanceModule(moduleType$3),
3414
3392
  async fetchSubstrateChainMeta(chainId, moduleConfig, metadataRpc) {
3415
- // const isTestnet = (await chaindataProvider.chainById(chainId))?.isTestnet || false
3416
3393
  if (metadataRpc === undefined) return {};
3417
- // if ((moduleConfig?.tokens ?? []).length < 1) return { isTestnet }
3418
-
3419
3394
  const metadataVersion = getMetadataVersion(metadataRpc);
3420
3395
  if (metadataVersion < 14) return {};
3421
3396
  const metadata = decAnyMetadata(metadataRpc);
@@ -3434,9 +3409,6 @@ const SubForeignAssetsModule = hydrate => {
3434
3409
  miniMetadata
3435
3410
  } = chainMeta;
3436
3411
  if (!miniMetadata) return {};
3437
- // if (miniMetadata === undefined || metadataVersion === undefined) return {}
3438
- // if (metadataVersion < 14) return {}
3439
-
3440
3412
  const metadata = decAnyMetadata(miniMetadata);
3441
3413
  const unifiedMetadata = unifyMetadata(metadata);
3442
3414
  const scaleBuilder = getDynamicBuilder(getLookupFn(unifiedMetadata));
@@ -3490,17 +3462,38 @@ const SubForeignAssetsModule = hydrate => {
3490
3462
  async subscribeBalances({
3491
3463
  addressesByToken
3492
3464
  }, callback) {
3493
- const queries = await buildQueries$2(chaindataProvider, addressesByToken);
3494
- const unsubscribe = await new RpcStateQueryHelper(chainConnector, queries).subscribe((error, result) => {
3495
- if (error) return callback(error);
3496
- const balances = result?.filter(b => b !== null) ?? [];
3497
- if (balances.length > 0) callback(null, new Balances(balances));
3498
- });
3499
- return unsubscribe;
3465
+ const byNetwork = keys(addressesByToken).reduce((acc, tokenId) => {
3466
+ const networkId = parseSubForeignAssetTokenId(tokenId).networkId;
3467
+ if (!acc[networkId]) acc[networkId] = {};
3468
+ acc[networkId][tokenId] = addressesByToken[tokenId];
3469
+ return acc;
3470
+ }, {});
3471
+ const controller = new AbortController();
3472
+ const pUnsubs = Promise.all(toPairs(byNetwork).map(async ([networkId, addressesByToken]) => {
3473
+ try {
3474
+ const queries = await buildNetworkQueries$1(networkId, chainConnector, chaindataProvider, addressesByToken, controller.signal);
3475
+ if (controller.signal.aborted) return () => {};
3476
+ const stateHelper = new RpcStateQueryHelper(chainConnector, queries);
3477
+ return await stateHelper.subscribe((error, result) => {
3478
+ if (error) return callback(error);
3479
+ const balances = result?.filter(b => b !== null) ?? [];
3480
+ if (balances.length > 0) callback(null, new Balances(balances));
3481
+ });
3482
+ } catch (err) {
3483
+ if (!controller.signal.aborted) log.error(`Failed to subscribe ${moduleType$3} balances for network ${networkId}`, err);
3484
+ return () => {};
3485
+ }
3486
+ }));
3487
+ return () => {
3488
+ controller.abort();
3489
+ pUnsubs.then(unsubs => {
3490
+ unsubs.forEach(unsubscribe => unsubscribe());
3491
+ });
3492
+ };
3500
3493
  },
3501
3494
  async fetchBalances(addressesByToken) {
3502
3495
  assert(chainConnectors.substrate, "This module requires a substrate chain connector");
3503
- const queries = await buildQueries$2(chaindataProvider, addressesByToken);
3496
+ const queries = await buildQueries$2(chainConnector, chaindataProvider, addressesByToken);
3504
3497
  const result = await new RpcStateQueryHelper(chainConnectors.substrate, queries).fetch();
3505
3498
  const balances = result?.filter(b => b !== null) ?? [];
3506
3499
  return new Balances(balances);
@@ -3556,23 +3549,16 @@ const SubForeignAssetsModule = hydrate => {
3556
3549
  }
3557
3550
  };
3558
3551
  };
3559
- async function buildQueries$2(chaindataProvider, addressesByToken) {
3560
- const allChains = await chaindataProvider.chainsById();
3561
- const tokens = await chaindataProvider.tokensById();
3562
- const miniMetadatas = new Map((await db.miniMetadatas.toArray()).map(miniMetadata => [miniMetadata.id, miniMetadata]));
3563
- const uniqueChainIds = getUniqueChainIds(addressesByToken, tokens);
3564
- const chains = Object.fromEntries(uniqueChainIds.map(chainId => [chainId, allChains[chainId]]));
3565
- const chainStorageCoders = buildStorageCoders({
3566
- chainIds: uniqueChainIds,
3567
- chains,
3568
- miniMetadatas,
3569
- moduleType: "substrate-foreignassets",
3570
- coders: {
3571
- storage: ["ForeignAssets", "Account"]
3572
- }
3552
+ async function buildNetworkQueries$1(networkId, chainConnector, chaindataProvider, addressesByToken, signal) {
3553
+ const miniMetadata = await getMiniMetadata(chaindataProvider, chainConnector, networkId, moduleType$3, signal);
3554
+ const chain = await chaindataProvider.chainById(networkId);
3555
+ const tokensById = await chaindataProvider.tokensById();
3556
+ signal?.throwIfAborted();
3557
+ const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
3558
+ storage: ["ForeignAssets", "Account"]
3573
3559
  });
3574
3560
  return Object.entries(addressesByToken).flatMap(([tokenId, addresses]) => {
3575
- const token = tokens[tokenId];
3561
+ const token = tokensById[tokenId];
3576
3562
  if (!token) {
3577
3563
  log.warn(`Token ${tokenId} not found`);
3578
3564
  return [];
@@ -3581,18 +3567,12 @@ async function buildQueries$2(chaindataProvider, addressesByToken) {
3581
3567
  log.debug(`This module doesn't handle tokens of type ${token.type}`);
3582
3568
  return [];
3583
3569
  }
3584
- const networkId = token.networkId;
3585
- if (!networkId) {
3586
- log.warn(`Token ${tokenId} has no chain`);
3587
- return [];
3588
- }
3589
- const chain = chains[networkId];
3590
3570
  if (!chain) {
3591
3571
  log.warn(`Chain ${networkId} for token ${tokenId} not found`);
3592
3572
  return [];
3593
3573
  }
3594
3574
  return addresses.flatMap(address => {
3595
- const scaleCoder = chainStorageCoders.get(networkId)?.storage;
3575
+ const scaleCoder = networkStorageCoders?.storage;
3596
3576
  const onChainId = (() => {
3597
3577
  try {
3598
3578
  return papiParse(token.onChainId);
@@ -3652,6 +3632,17 @@ async function buildQueries$2(chaindataProvider, addressesByToken) {
3652
3632
  });
3653
3633
  });
3654
3634
  }
3635
+ async function buildQueries$2(chainConnector, chaindataProvider, addressesByToken, signal) {
3636
+ const byNetwork = keys(addressesByToken).reduce((acc, tokenId) => {
3637
+ const networkId = parseSubForeignAssetTokenId(tokenId).networkId;
3638
+ if (!acc[networkId]) acc[networkId] = {};
3639
+ acc[networkId][tokenId] = addressesByToken[tokenId];
3640
+ return acc;
3641
+ }, {});
3642
+ return (await Promise.all(toPairs(byNetwork).map(([networkId, addressesByToken]) => {
3643
+ return buildNetworkQueries$1(networkId, chainConnector, chaindataProvider, addressesByToken, signal);
3644
+ }))).flat();
3645
+ }
3655
3646
 
3656
3647
  async function subscribeBase(queries, chainConnector, callback) {
3657
3648
  const unsubscribe = await new RpcStateQueryHelper(chainConnector, queries).subscribe((error, result) => {
@@ -6649,8 +6640,6 @@ const SubPsp22Module = hydrate => {
6649
6640
  return {
6650
6641
  ...DefaultBalanceModule(moduleType$1),
6651
6642
  async fetchSubstrateChainMeta(_chainId) {
6652
- // const isTestnet = (await chaindataProvider.chainById(chainId))?.isTestnet || false
6653
- // return { isTestnet }
6654
6643
  return undefined;
6655
6644
  },
6656
6645
  async fetchSubstrateChainTokens(chainId, _chainMeta, moduleConfig) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@talismn/balances",
3
- "version": "0.0.0-pr2043-20250619003406",
3
+ "version": "0.0.0-pr2043-20250619043542",
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-pr2043-20250619003406",
39
- "@talismn/chain-connector-evm": "0.0.0-pr2043-20250619003406",
40
- "@talismn/chaindata-provider": "0.0.0-pr2043-20250619003406",
41
- "@talismn/sapi": "0.0.0-pr2043-20250619003406",
38
+ "@talismn/chain-connector": "0.0.0-pr2043-20250619043542",
39
+ "@talismn/sapi": "0.0.0-pr2043-20250619043542",
40
+ "@talismn/token-rates": "0.0.0-pr2043-20250619043542",
41
+ "@talismn/chaindata-provider": "0.0.0-pr2043-20250619043542",
42
42
  "@talismn/util": "0.4.2",
43
43
  "@talismn/scale": "0.1.2",
44
- "@talismn/token-rates": "0.0.0-pr2043-20250619003406"
44
+ "@talismn/chain-connector-evm": "0.0.0-pr2043-20250619043542"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@polkadot/api-contract": "16.1.2",