@talismn/balances 0.0.0-pr2043-20250615092436 → 0.0.0-pr2043-20250617092446

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,10 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var PromisePool = require('@supercharge/promise-pool');
4
3
  var chaindataProvider = require('@talismn/chaindata-provider');
5
- var sapi = require('@talismn/sapi');
6
4
  var dexie = require('dexie');
7
- var isEqual = require('lodash/isEqual');
8
5
  var rxjs = require('rxjs');
9
6
  var anylogger = require('anylogger');
10
7
  var tokenRates = require('@talismn/token-rates');
@@ -14,6 +11,7 @@ var util$1 = require('@polkadot/util');
14
11
  var utilCrypto = require('@polkadot/util-crypto');
15
12
  var pako = require('pako');
16
13
  var viem = require('viem');
14
+ var isEqual = require('lodash/isEqual');
17
15
  var txwrapperCore = require('@substrate/txwrapper-core');
18
16
  var scale = require('@talismn/scale');
19
17
  var camelCase = require('lodash/camelCase');
@@ -21,21 +19,22 @@ var types = require('@polkadot/types');
21
19
  var groupBy = require('lodash/groupBy');
22
20
  var utils = require('@polkadot-api/utils');
23
21
  var polkadotApi = require('polkadot-api');
22
+ var PromisePool = require('@supercharge/promise-pool');
24
23
  var chainConnector = require('@talismn/chain-connector');
25
24
  var scaleTs = require('scale-ts');
25
+ var sapi = require('@talismn/sapi');
26
26
  var upperFirst = require('lodash/upperFirst');
27
27
  var apiContract = require('@polkadot/api-contract');
28
- var lzString = require('lz-string');
29
28
 
30
29
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
31
30
 
32
- var PromisePool__default = /*#__PURE__*/_interopDefault(PromisePool);
33
- var isEqual__default = /*#__PURE__*/_interopDefault(isEqual);
34
31
  var anylogger__default = /*#__PURE__*/_interopDefault(anylogger);
35
32
  var BigNumber__default = /*#__PURE__*/_interopDefault(BigNumber);
36
33
  var pako__default = /*#__PURE__*/_interopDefault(pako);
34
+ var isEqual__default = /*#__PURE__*/_interopDefault(isEqual);
37
35
  var camelCase__default = /*#__PURE__*/_interopDefault(camelCase);
38
36
  var groupBy__default = /*#__PURE__*/_interopDefault(groupBy);
37
+ var PromisePool__default = /*#__PURE__*/_interopDefault(PromisePool);
39
38
  var upperFirst__default = /*#__PURE__*/_interopDefault(upperFirst);
40
39
 
41
40
  // TODO: Document default balances module purpose/usage
@@ -71,8 +70,12 @@ const DefaultBalanceModule = type => ({
71
70
  // internal
72
71
  //
73
72
 
73
+ // TODO yeet ?
74
+ // there is no need to construct a lit of tokens, it's done by∏ chaindata
75
+
74
76
  /**
75
77
  * Fetches tokens for EVM networks.
78
+ * @deprecated
76
79
  */
77
80
  class EvmTokenFetcher {
78
81
  #chaindataProvider;
@@ -81,36 +84,46 @@ class EvmTokenFetcher {
81
84
  this.#chaindataProvider = chaindataProvider;
82
85
  this.#balanceModules = balanceModules;
83
86
  }
84
- async update(evmNetworkIds) {
85
- await this.updateEvmNetworks(evmNetworkIds);
86
- }
87
- async updateEvmNetworks(evmNetworkIds) {
88
- const evmNetworks = new Map((await this.#chaindataProvider.evmNetworks()).map(evmNetwork => [evmNetwork.id, evmNetwork]));
89
- const allEvmTokens = {};
90
- const evmNetworkConcurrency = 10;
91
- await PromisePool.PromisePool.withConcurrency(evmNetworkConcurrency).for(evmNetworkIds).process(async evmNetworkId => {
92
- const evmNetwork = evmNetworks.get(evmNetworkId);
93
- if (!evmNetwork) return;
94
- for (const mod of this.#balanceModules.filter(m => m.type.startsWith("evm-"))) {
95
- const balancesConfig = (evmNetwork.balancesConfig ?? []).find(({
96
- moduleType
97
- }) => moduleType === mod.type);
98
- const moduleConfig = balancesConfig?.moduleConfig ?? {};
99
-
100
- // chainMeta arg only needs the isTestnet property, let's save a db roundtrip for now
101
- const isTestnet = evmNetwork.isTestnet ?? false;
102
- const tokens = await mod.fetchEvmChainTokens(evmNetworkId, {
103
- isTestnet
104
- }, moduleConfig);
105
- for (const [tokenId, token] of Object.entries(tokens)) allEvmTokens[tokenId] = token;
106
- }
107
- });
108
- await this.#chaindataProvider.updateEvmNetworkTokens(Object.values(allEvmTokens));
87
+ async update(_evmNetworkIds) {
88
+ // chaindataProvider's tokens should be in sync already
89
+ // await this.updateEvmNetworks(evmNetworkIds)
109
90
  }
91
+
92
+ // private async updateEvmNetworks(evmNetworkIds: EvmNetworkId[]) {
93
+ // // feels unnecessary, chaindataProvider's tokens should be in sync already
94
+ // // const evmNetworks = new Map(
95
+ // // (await this.#chaindataProvider.evmNetworks()).map((evmNetwork) => [
96
+ // // evmNetwork.id,
97
+ // // evmNetwork,
98
+ // // ]),
99
+ // // )
100
+ // // const allEvmTokens: TokenList = {}
101
+ // // const evmNetworkConcurrency = 10
102
+ // // await PromisePool.withConcurrency(evmNetworkConcurrency)
103
+ // // .for(evmNetworkIds)
104
+ // // .process(async (evmNetworkId) => {
105
+ // // const evmNetwork = evmNetworks.get(evmNetworkId)
106
+ // // if (!evmNetwork) return
107
+ // // for (const mod of this.#balanceModules.filter((m) => m.type.startsWith("evm-"))) {
108
+ // // // const balancesConfig = (evmNetwork.balancesConfig ?? []).find(
109
+ // // // ({ moduleType }) => moduleType === mod.type,
110
+ // // // )
111
+ // // // const moduleConfig = balancesConfig?.moduleConfig ?? {}
112
+ // // // chainMeta arg only needs the isTestnet property, let's save a db roundtrip for now
113
+ // // const isTestnet = evmNetwork.isTestnet ?? false
114
+ // // const tokens = await mod.fetchEvmChainTokens(evmNetworkId, { isTestnet }, moduleConfig)
115
+ // // for (const [tokenId, token] of Object.entries(tokens)) allEvmTokens[tokenId] = token
116
+ // // }
117
+ // // })
118
+ // // await this.#chaindataProvider.updateEvmNetworkTokens(Object.values(allEvmTokens))
119
+ // }
110
120
  }
111
121
 
112
122
  var packageJson = {
113
- name: "@talismn/balances"};
123
+ name: "@talismn/balances",
124
+ version: "0.0.0-pr2043-20250617092446"};
125
+
126
+ const libVersion = packageJson.version;
114
127
 
115
128
  var log = anylogger__default.default(packageJson.name);
116
129
 
@@ -322,15 +335,20 @@ class Balances {
322
335
  return new SumBalancesFormatter(this);
323
336
  }
324
337
  }
325
- const isBalanceEvm = balance => "evmNetworkId" in balance;
338
+
339
+ // type BalanceJsonEvm = BalanceJson & { evmNetworkId: string }
340
+
341
+ // const isBalanceEvm = (balance: BalanceJson): balance is BalanceJsonEvm => "evmNetworkId" in balance
342
+
326
343
  const getBalanceId = balance => {
327
344
  const {
328
345
  source,
329
346
  address,
330
- tokenId
347
+ tokenId,
348
+ networkId
331
349
  } = balance;
332
- const locationId = isBalanceEvm(balance) ? balance.evmNetworkId : balance.chainId;
333
- return [source, address, locationId, tokenId].filter(util.isTruthy).join("::");
350
+ //const locationId = isBalanceEvm(balance) ? balance.evmNetworkId : balance.chainId
351
+ return [source, address, networkId, tokenId].filter(util.isTruthy).join("::");
334
352
  };
335
353
 
336
354
  /**
@@ -392,17 +410,33 @@ class Balance {
392
410
  get address() {
393
411
  return this.#storage.address;
394
412
  }
395
- get chainId() {
396
- return isBalanceEvm(this.#storage) ? undefined : this.#storage.chainId;
397
- }
398
- get chain() {
399
- return this.#db?.chains && this.chainId && this.#db?.chains[this.chainId] || null;
400
- }
401
- get evmNetworkId() {
402
- return isBalanceEvm(this.#storage) ? this.#storage.evmNetworkId : undefined;
413
+
414
+ // /** @deprecated */
415
+ // get chainId() {
416
+ // return isBalanceEvm(this.#storage) ? undefined : this.#storage.chainId
417
+ // }
418
+ // /** @deprecated */
419
+ // get chain() {
420
+ // return (this.#db?.networks && this.networkId && this.#db?.networks[this.networkId]) || null
421
+ // }
422
+
423
+ // /** @deprecated */
424
+ // get evmNetworkId() {
425
+ // return isBalanceEvm(this.#storage) ? this.#storage.evmNetworkId : undefined
426
+ // }
427
+ // /** @deprecated */
428
+ // get evmNetwork() {
429
+ // return (
430
+ // (this.#db?.networks && this.networkId && this.#db?.networks[this.networkId]) ||
431
+ // null
432
+ // )
433
+ // }
434
+
435
+ get networkId() {
436
+ return this.#storage.networkId;
403
437
  }
404
- get evmNetwork() {
405
- return this.#db?.evmNetworks && this.evmNetworkId && this.#db?.evmNetworks[this.evmNetworkId] || null;
438
+ get network() {
439
+ return this.#db?.networks && this.networkId && this.#db?.networks[this.networkId] || null;
406
440
  }
407
441
  get tokenId() {
408
442
  return this.#storage.tokenId;
@@ -421,9 +455,11 @@ class Balance {
421
455
  //
422
456
  // This means that those rates are always available for calculating the uniswapv2 rates,
423
457
  // regardless of whether or not the underlying erc20s are actually in chaindata and enabled.
424
- if (this.isSource("evm-uniswapv2") && this.token?.type === "evm-uniswapv2" && this.evmNetworkId) {
425
- const tokenId0 = evmErc20TokenId$1(this.evmNetworkId, this.token.tokenAddress0);
426
- const tokenId1 = evmErc20TokenId$1(this.evmNetworkId, this.token.tokenAddress1);
458
+ if (this.isSource("evm-uniswapv2") && this.token?.type === "evm-uniswapv2" // &&
459
+ //this.evmNetworkId
460
+ ) {
461
+ const tokenId0 = evmErc20TokenId(this.networkId, this.token.tokenAddress0);
462
+ const tokenId1 = evmErc20TokenId(this.networkId, this.token.tokenAddress1);
427
463
  const decimals = this.token.decimals;
428
464
  const decimals0 = this.token.decimals0;
429
465
  const decimals1 = this.token.decimals1;
@@ -858,7 +894,7 @@ const filterMirrorTokens = (balance, i, balances) => {
858
894
 
859
895
  // TODO: Move this into a common module which can then be imported both here and into EvmErc20Module
860
896
  // We can't import this directly from EvmErc20Module because then we'd have a circular dependency
861
- const evmErc20TokenId$1 = (chainId, tokenContractAddress) => `${chainId}-evm-erc20-${tokenContractAddress}`.toLowerCase();
897
+ const evmErc20TokenId = (chainId, tokenContractAddress) => `${chainId}-evm-erc20-${tokenContractAddress}`.toLowerCase();
862
898
 
863
899
  /**
864
900
  * `BalanceTypes` is an automatically determined sub-selection of `PluginBalanceTypes`.
@@ -880,8 +916,21 @@ const evmErc20TokenId$1 = (chainId, tokenContractAddress) => `${chainId}-evm-erc
880
916
 
881
917
  /** A collection of `BalanceJson` objects */
882
918
 
919
+ // type IBalanceBaseEvm = {
920
+ // /** WIP, use `chainId` or `evmNetworkId` for now */
921
+ // multiChainId: EvmChainId
922
+
923
+ // }
924
+
925
+ // type IBalanceBaseSubstrate = {
926
+ // multiChainId: SubChainId
927
+
928
+ // }
929
+
883
930
  /** `IBalance` is a common interface which all balance types must implement. */
884
931
 
932
+ // & (IBalanceBaseEvm | IBalanceBaseSubstrate)
933
+
885
934
  /** An unlabelled amount of a balance */
886
935
 
887
936
  /** A labelled amount of a balance */
@@ -914,10 +963,9 @@ const getValueId = amount => {
914
963
  const deriveMiniMetadataId = ({
915
964
  source,
916
965
  chainId,
917
- specName,
918
966
  specVersion,
919
- balancesConfig
920
- }) => util$1.u8aToHex(utilCrypto.xxhashAsU8a(new TextEncoder().encode(`${source}${chainId}${specName}${specVersion}${balancesConfig}`), 64), undefined, false);
967
+ libVersion
968
+ }) => util$1.u8aToHex(utilCrypto.xxhashAsU8a(new TextEncoder().encode(`${source}${chainId}${specVersion}${libVersion}`), 64), undefined, false);
921
969
 
922
970
  // for DB version 3, Wallet version 1.21.0
923
971
  const upgradeRemoveSymbolFromNativeTokenId = async tx => {
@@ -1063,8 +1111,7 @@ class MiniMetadataUpdater {
1063
1111
  const wantedIdsByChain = new Map(chains.flatMap(({
1064
1112
  id: chainId,
1065
1113
  specName,
1066
- specVersion,
1067
- balancesConfig
1114
+ specVersion
1068
1115
  }) => {
1069
1116
  if (specName === null) return [];
1070
1117
  if (specVersion === null) return [];
@@ -1072,12 +1119,9 @@ class MiniMetadataUpdater {
1072
1119
  type: source
1073
1120
  }) => deriveMiniMetadataId({
1074
1121
  source,
1075
- chainId: chainId,
1076
- specName: specName,
1077
- specVersion: specVersion,
1078
- balancesConfig: JSON.stringify((balancesConfig ?? []).find(({
1079
- moduleType
1080
- }) => moduleType === source)?.moduleConfig ?? {})
1122
+ chainId,
1123
+ specVersion,
1124
+ libVersion
1081
1125
  }))]];
1082
1126
  }));
1083
1127
  const statusesByChain = new Map(Array.from(wantedIdsByChain.entries()).map(([chainId, wantedIds]) => [chainId, wantedIds.every(wantedId => ids.includes(wantedId)) ? "good" : "none"]));
@@ -1087,17 +1131,18 @@ class MiniMetadataUpdater {
1087
1131
  };
1088
1132
  }
1089
1133
  async hydrateFromChaindata() {
1134
+ // TODO review this. feels unnecessary to fetch them all
1135
+
1090
1136
  const now = Date.now();
1091
1137
  if (now - this.#lastHydratedMiniMetadatasAt < minimumHydrationInterval) return false;
1092
1138
  const dbHasMiniMetadatas = (await db.miniMetadatas.count()) > 0;
1093
1139
  try {
1094
1140
  try {
1095
- // TODO: Move `fetchMiniMetadatas` into this package,
1096
- // so that we don't have a circular import between `@talismn/balances` and `@talismn/chaindata-provider`.
1097
- var miniMetadatas = await chaindataProvider.fetchMiniMetadatas(); // eslint-disable-line no-var
1141
+ var miniMetadatas = await this.#chaindataProvider.miniMetadatas(); // eslint-disable-line no-var
1098
1142
  if (miniMetadatas.length <= 0) throw new Error("Ignoring empty chaindata miniMetadatas response");
1099
1143
  } catch (error) {
1100
1144
  if (dbHasMiniMetadatas) throw error;
1145
+ log.warn("Failed to fetch miniMetadatas from chaindata", error);
1101
1146
  // On first start-up (db is empty), if we fail to fetch miniMetadatas then we should
1102
1147
  // initialize the DB with the list of miniMetadatas inside our init/mini-metadatas.json file.
1103
1148
  // This data will represent a relatively recent copy of what's in chaindata,
@@ -1113,127 +1158,156 @@ class MiniMetadataUpdater {
1113
1158
  }
1114
1159
  }
1115
1160
  async hydrateCustomChains() {
1116
- const now = Date.now();
1117
- if (now - this.#lastHydratedCustomChainsAt < minimumHydrationInterval) return false;
1118
- const chains = await this.#chaindataProvider.chains();
1119
- const customChains = chains.filter(chain => "isCustom" in chain && chain.isCustom);
1120
- const updatedCustomChains = [];
1121
- const concurrency = 4;
1122
- (await PromisePool.PromisePool.withConcurrency(concurrency).for(customChains).process(async customChain => {
1123
- const send = (method, params) => this.#chainConnectors.substrate?.send(customChain.id, method, params);
1124
- const [genesisHash, runtimeVersion, chainName, chainType] = await Promise.all([send("chain_getBlockHash", [0]), send("state_getRuntimeVersion", []), send("system_chain", []), send("system_chainType", [])]);
1125
-
1126
- // deconstruct rpc data
1127
- const {
1128
- specName,
1129
- implName
1130
- } = runtimeVersion;
1131
- const specVersion = String(runtimeVersion.specVersion);
1132
- const changed = customChain.genesisHash !== genesisHash || customChain.chainName !== chainName || !isEqual__default.default(customChain.chainType, chainType) || customChain.implName !== implName || customChain.specName !== specName || customChain.specVersion !== specVersion;
1133
- if (!changed) return;
1134
- customChain.genesisHash = genesisHash;
1135
- customChain.chainName = chainName;
1136
- customChain.chainType = chainType;
1137
- customChain.implName = implName;
1138
- customChain.specName = specName;
1139
- customChain.specVersion = specVersion;
1140
- updatedCustomChains.push(customChain);
1141
- })).errors.forEach(error => log.error("Error hydrating custom chains", error));
1142
- if (updatedCustomChains.length > 0) {
1143
- await this.#chaindataProvider.transaction("rw", ["chains"], async () => {
1144
- for (const updatedCustomChain of updatedCustomChains) {
1145
- await this.#chaindataProvider.removeCustomChain(updatedCustomChain.id);
1146
- await this.#chaindataProvider.addCustomChain(updatedCustomChain);
1147
- }
1148
- });
1149
- }
1150
- if (updatedCustomChains.length > 0) this.#lastHydratedCustomChainsAt = now;
1151
- return true;
1161
+ // TODO
1162
+ // const now = Date.now()
1163
+ // if (now - this.#lastHydratedCustomChainsAt < minimumHydrationInterval) return false
1164
+ // const chains = await this.#chaindataProvider.chains()
1165
+ // const customChains = chains.filter(
1166
+ // (chain): chain is CustomChain => "isCustom" in chain && chain.isCustom,
1167
+ // )
1168
+ // const updatedCustomChains: Array<CustomChain> = []
1169
+ // const concurrency = 4
1170
+ // ;(
1171
+ // await PromisePool.withConcurrency(concurrency)
1172
+ // .for(customChains)
1173
+ // .process(async (customChain) => {
1174
+ // const send = (method: string, params: unknown[]) =>
1175
+ // this.#chainConnectors.substrate?.send(customChain.id, method, params)
1176
+ // const [genesisHash, runtimeVersion, chainName, chainType] = await Promise.all([
1177
+ // send("chain_getBlockHash", [0]),
1178
+ // send("state_getRuntimeVersion", []),
1179
+ // send("system_chain", []),
1180
+ // send("system_chainType", []),
1181
+ // ])
1182
+ // // deconstruct rpc data
1183
+ // const { specName, implName } = runtimeVersion
1184
+ // const specVersion = String(runtimeVersion.specVersion)
1185
+ // const changed =
1186
+ // customChain.genesisHash !== genesisHash ||
1187
+ // customChain.chainName !== chainName ||
1188
+ // !isEqual(customChain.chainType, chainType) ||
1189
+ // customChain.implName !== implName ||
1190
+ // customChain.specName !== specName ||
1191
+ // customChain.specVersion !== specVersion
1192
+ // if (!changed) return
1193
+ // customChain.genesisHash = genesisHash
1194
+ // customChain.chainName = chainName
1195
+ // customChain.chainType = chainType
1196
+ // customChain.implName = implName
1197
+ // customChain.specName = specName
1198
+ // customChain.specVersion = specVersion
1199
+ // updatedCustomChains.push(customChain)
1200
+ // })
1201
+ // ).errors.forEach((error) => log.error("Error hydrating custom chains", error))
1202
+ // if (updatedCustomChains.length > 0) {
1203
+ // await this.#chaindataProvider.transaction("rw", ["chains"], async () => {
1204
+ // for (const updatedCustomChain of updatedCustomChains) {
1205
+ // await this.#chaindataProvider.removeCustomChain(updatedCustomChain.id)
1206
+ // await this.#chaindataProvider.addCustomChain(updatedCustomChain)
1207
+ // }
1208
+ // })
1209
+ // }
1210
+ // if (updatedCustomChains.length > 0) this.#lastHydratedCustomChainsAt = now
1211
+ // return true
1152
1212
  }
1153
- async updateSubstrateChains(chainIds) {
1154
- const chains = new Map((await this.#chaindataProvider.chains()).map(chain => [chain.id, chain]));
1155
- const filteredChains = chainIds.flatMap(chainId => chains.get(chainId) ?? []);
1156
- const ids = await db.miniMetadatas.orderBy("id").primaryKeys();
1157
- const {
1158
- wantedIdsByChain,
1159
- statusesByChain
1160
- } = await this.statuses(filteredChains);
1161
-
1162
- // clean up store
1163
- const wantedIds = Array.from(wantedIdsByChain.values()).flatMap(ids => ids);
1164
- const unwantedIds = ids.filter(id => !wantedIds.includes(id));
1165
- if (unwantedIds.length > 0) {
1166
- const chainIds = Array.from(new Set((await db.miniMetadatas.bulkGet(unwantedIds)).map(m => m?.chainId)));
1167
- log.info(`Pruning ${unwantedIds.length} miniMetadatas on chains ${chainIds.join(", ")}`);
1168
- await db.miniMetadatas.bulkDelete(unwantedIds);
1169
- }
1170
- const needUpdates = Array.from(statusesByChain.entries()).filter(([, status]) => status !== "good").map(([chainId]) => chainId);
1171
- if (needUpdates.length > 0) log.info(`${needUpdates.length} miniMetadatas need updates (${needUpdates.join(", ")})`);
1172
- const availableTokenLogos = await chaindataProvider.availableTokenLogoFilenames().catch(error => {
1173
- log.error("Failed to fetch available token logos", error);
1174
- return [];
1175
- });
1176
- const concurrency = 12;
1177
- (await PromisePool.PromisePool.withConcurrency(concurrency).for(needUpdates).process(async chainId => {
1178
- log.info(`Updating metadata for chain ${chainId}`);
1179
- const chain = chains.get(chainId);
1180
- if (!chain) return;
1181
- const {
1182
- specName,
1183
- specVersion
1184
- } = chain;
1185
- if (specName === null) return;
1186
- if (specVersion === null) return;
1187
- const fetchMetadata = async () => {
1188
- try {
1189
- return await sapi.fetchBestMetadata((method, params, isCacheable) => {
1190
- if (!this.#chainConnectors.substrate) throw new Error("Substrate connector is not available");
1191
- return this.#chainConnectors.substrate.send(chainId, method, params, isCacheable);
1192
- }, true // allow v14 fallback
1193
- );
1194
- } catch (err) {
1195
- log.warn(`Failed to fetch metadata for chain ${chainId}`);
1196
- return undefined;
1197
- }
1198
- };
1199
- const [metadataRpc, systemProperties] = await Promise.all([fetchMetadata(), this.#chainConnectors.substrate?.send(chainId, "system_properties", [])]);
1200
- for (const mod of this.#balanceModules.filter(m => m.type.startsWith("substrate-"))) {
1201
- const balancesConfig = (chain.balancesConfig ?? []).find(({
1202
- moduleType
1203
- }) => moduleType === mod.type);
1204
- const moduleConfig = balancesConfig?.moduleConfig ?? {};
1205
- const chainMeta = await mod.fetchSubstrateChainMeta(chainId, moduleConfig, metadataRpc, systemProperties);
1206
- const tokens = await mod.fetchSubstrateChainTokens(chainId, chainMeta, moduleConfig);
1207
-
1208
- // update tokens in chaindata
1209
- await this.#chaindataProvider.updateChainTokens(chainId, mod.type, Object.values(tokens), availableTokenLogos);
1210
-
1211
- // update miniMetadatas
1212
- const {
1213
- miniMetadata: data,
1214
- metadataVersion: version,
1215
- ...extra
1216
- } = chainMeta ?? {};
1217
- await db.miniMetadatas.put({
1218
- id: deriveMiniMetadataId({
1219
- source: mod.type,
1220
- chainId,
1221
- specName,
1222
- specVersion,
1223
- balancesConfig: JSON.stringify(moduleConfig)
1224
- }),
1225
- source: mod.type,
1226
- chainId,
1227
- specName,
1228
- specVersion,
1229
- balancesConfig: JSON.stringify(moduleConfig),
1230
- // TODO: Standardise return value from `fetchSubstrateChainMeta`
1231
- version,
1232
- data,
1233
- extra: JSON.stringify(extra)
1234
- });
1235
- }
1236
- })).errors.forEach(error => log.error("Error updating chain metadata", error));
1213
+ async updateSubstrateChains(_chainIds) {
1214
+ // const chains = new Map(
1215
+ // (await this.#chaindataProvider.chains()).map((chain) => [chain.id, chain]),
1216
+ // )
1217
+ // const filteredChains = chainIds.flatMap((chainId) => chains.get(chainId) ?? [])
1218
+ // const ids = await balancesDb.miniMetadatas.orderBy("id").primaryKeys()
1219
+ // const { wantedIdsByChain, statusesByChain } = await this.statuses(filteredChains)
1220
+ // // clean up store
1221
+ // const wantedIds = Array.from(wantedIdsByChain.values()).flatMap((ids) => ids)
1222
+ // const unwantedIds = ids.filter((id) => !wantedIds.includes(id))
1223
+ // if (unwantedIds.length > 0) {
1224
+ // const chainIds = Array.from(
1225
+ // new Set((await balancesDb.miniMetadatas.bulkGet(unwantedIds)).map((m) => m?.chainId)),
1226
+ // )
1227
+ // log.info(`Pruning ${unwantedIds.length} miniMetadatas on chains ${chainIds.join(", ")}`)
1228
+ // await balancesDb.miniMetadatas.bulkDelete(unwantedIds)
1229
+ // }
1230
+ // const needUpdates = Array.from(statusesByChain.entries())
1231
+ // .filter(([, status]) => status !== "good")
1232
+ // .map(([chainId]) => chainId)
1233
+ // if (needUpdates.length > 0)
1234
+ // log.info(`${needUpdates.length} miniMetadatas need updates (${needUpdates.join(", ")})`)
1235
+ // const availableTokenLogos = await availableTokenLogoFilenames().catch((error) => {
1236
+ // log.error("Failed to fetch available token logos", error)
1237
+ // return []
1238
+ // })
1239
+ // const concurrency = 12
1240
+ // ;(
1241
+ // await PromisePool.withConcurrency(concurrency)
1242
+ // .for(needUpdates)
1243
+ // .process(async (chainId) => {
1244
+ // log.info(`Updating metadata for chain ${chainId}`)
1245
+ // const chain = chains.get(chainId)
1246
+ // if (!chain) return
1247
+ // const { specName, specVersion } = chain
1248
+ // if (specName === null) return
1249
+ // if (specVersion === null) return
1250
+ // const fetchMetadata = async () => {
1251
+ // try {
1252
+ // return await fetchBestMetadata(
1253
+ // (method, params, isCacheable) => {
1254
+ // if (!this.#chainConnectors.substrate)
1255
+ // throw new Error("Substrate connector is not available")
1256
+ // return this.#chainConnectors.substrate.send(chainId, method, params, isCacheable)
1257
+ // },
1258
+ // true, // allow v14 fallback
1259
+ // )
1260
+ // } catch (err) {
1261
+ // log.warn(`Failed to fetch metadata for chain ${chainId}`)
1262
+ // return undefined
1263
+ // }
1264
+ // }
1265
+ // const [metadataRpc, systemProperties] = await Promise.all([
1266
+ // fetchMetadata(),
1267
+ // this.#chainConnectors.substrate?.send(chainId, "system_properties", []),
1268
+ // ])
1269
+ // for (const mod of this.#balanceModules.filter((m) => m.type.startsWith("substrate-"))) {
1270
+ // const balancesConfig = (chain.balancesConfig ?? []).find(
1271
+ // ({ moduleType }) => moduleType === mod.type,
1272
+ // )
1273
+ // const moduleConfig = balancesConfig?.moduleConfig ?? {}
1274
+ // const chainMeta = await mod.fetchSubstrateChainMeta(
1275
+ // chainId,
1276
+ // moduleConfig,
1277
+ // metadataRpc,
1278
+ // systemProperties,
1279
+ // )
1280
+ // const tokens = await mod.fetchSubstrateChainTokens(chainId, chainMeta, moduleConfig)
1281
+ // // update tokens in chaindata
1282
+ // await this.#chaindataProvider.updateChainTokens(
1283
+ // chainId,
1284
+ // mod.type,
1285
+ // Object.values(tokens),
1286
+ // availableTokenLogos,
1287
+ // )
1288
+ // // update miniMetadatas
1289
+ // const { miniMetadata: data, metadataVersion: version, ...extra } = chainMeta ?? {}
1290
+ // await balancesDb.miniMetadatas.put({
1291
+ // id: deriveMiniMetadataId({
1292
+ // source: mod.type,
1293
+ // chainId,
1294
+ // specName,
1295
+ // specVersion,
1296
+ // balancesConfig: JSON.stringify(moduleConfig),
1297
+ // }),
1298
+ // source: mod.type,
1299
+ // chainId,
1300
+ // specName,
1301
+ // specVersion,
1302
+ // balancesConfig: JSON.stringify(moduleConfig),
1303
+ // // TODO: Standardise return value from `fetchSubstrateChainMeta`
1304
+ // version,
1305
+ // data,
1306
+ // extra: JSON.stringify(extra),
1307
+ // })
1308
+ // }
1309
+ // })
1310
+ // ).errors.forEach((error) => log.error("Error updating chain metadata", error))
1237
1311
  }
1238
1312
  }
1239
1313
 
@@ -1468,7 +1542,6 @@ const erc20Abi = [{
1468
1542
  const erc20BalancesAggregatorAbi = viem.parseAbi(["struct AccountToken {address account; address token;}", "function balances(AccountToken[] memory accountTokens) public view returns (uint256[] memory)"]);
1469
1543
 
1470
1544
  const moduleType$7 = "evm-erc20";
1471
- const evmErc20TokenId = (chainId, tokenContractAddress) => `${chainId}-evm-erc20-${tokenContractAddress}`.toLowerCase();
1472
1545
  const EvmErc20Module = hydrate => {
1473
1546
  const {
1474
1547
  chainConnectors,
@@ -1496,7 +1569,7 @@ const EvmErc20Module = hydrate => {
1496
1569
  };
1497
1570
  const getErc20Aggregators = async () => {
1498
1571
  const evmNetworks = await chaindataProvider$1.evmNetworks();
1499
- return Object.fromEntries(evmNetworks.filter(n => n.erc20aggregator).map(n => [n.id, n.erc20aggregator]));
1572
+ return Object.fromEntries(evmNetworks.filter(n => n.contracts?.Erc20Aggregator).map(n => [n.id, n.contracts.Erc20Aggregator]));
1500
1573
  };
1501
1574
  return {
1502
1575
  ...DefaultBalanceModule(moduleType$7),
@@ -1504,20 +1577,19 @@ const EvmErc20Module = hydrate => {
1504
1577
  * This method is currently executed on [a squid](https://github.com/TalismanSociety/chaindata-squid/blob/0ee02818bf5caa7362e3f3664e55ef05ec8df078/src/steps/updateEvmNetworksFromGithub.ts#L280-L284).
1505
1578
  * In a future version of the balance libraries, we may build some kind of async scheduling system which will keep the chainmeta for each chain up to date without relying on a squid.
1506
1579
  */
1507
- async fetchEvmChainMeta(chainId) {
1508
- const isTestnet = (await chaindataProvider$1.evmNetworkById(chainId))?.isTestnet || false;
1509
- return {
1510
- isTestnet
1511
- };
1580
+ async fetchEvmChainMeta(_chainId) {
1581
+ return undefined;
1582
+ // const isTestnet = (await chaindataProvider.evmNetworkById(chainId))?.isTestnet || false
1583
+
1584
+ // return { isTestnet }
1512
1585
  },
1513
1586
  /**
1514
1587
  * This method is currently executed on [a squid](https://github.com/TalismanSociety/chaindata-squid/blob/0ee02818bf5caa7362e3f3664e55ef05ec8df078/src/steps/updateEvmNetworksFromGithub.ts#L338-L343).
1515
1588
  * In a future version of the balance libraries, we may build some kind of async scheduling system which will keep the list of tokens for each chain up to date without relying on a squid.
1516
1589
  */
1517
- async fetchEvmChainTokens(chainId, chainMeta, moduleConfig) {
1518
- const {
1519
- isTestnet
1520
- } = chainMeta;
1590
+ async fetchEvmChainTokens(chainId, _chainMeta, moduleConfig) {
1591
+ //const { isTestnet } = chainMeta
1592
+
1521
1593
  const chainTokens = {};
1522
1594
  for (const tokenConfig of moduleConfig?.tokens ?? []) {
1523
1595
  const {
@@ -1536,17 +1608,16 @@ const EvmErc20Module = hydrate => {
1536
1608
  const symbol = tokenConfig?.symbol ?? contractSymbol ?? "ETH";
1537
1609
  const decimals = typeof tokenConfig?.decimals === "number" ? tokenConfig.decimals : typeof contractDecimals === "number" ? contractDecimals : 18;
1538
1610
  if (!symbol || typeof decimals !== "number") continue;
1539
- const id = evmErc20TokenId(chainId, contractAddress);
1611
+ const id = chaindataProvider.evmErc20TokenId(chainId, contractAddress);
1540
1612
  const token = {
1541
1613
  id,
1542
1614
  type: "evm-erc20",
1543
1615
  platform: "ethereum",
1544
- isTestnet,
1545
1616
  isDefault: tokenConfig.isDefault ?? true,
1546
1617
  symbol,
1547
1618
  decimals,
1548
1619
  name: contractName ?? symbol,
1549
- logo: tokenConfig?.logo || chaindataProvider.githubTokenLogoUrl(id),
1620
+ logo: tokenConfig?.logo,
1550
1621
  contractAddress,
1551
1622
  networkId: chainId
1552
1623
  };
@@ -1572,7 +1643,7 @@ const EvmErc20Module = hydrate => {
1572
1643
  const subscriptionInterval = 6_000; // 6_000ms == 6 seconds
1573
1644
  const initDelay = 1_500; // 1_500ms == 1.5 seconds
1574
1645
  const initialisingBalances = new Set();
1575
- const positiveBalanceNetworks = new Set(initialBalances?.map(b => b.evmNetworkId));
1646
+ const positiveBalanceNetworks = new Set(initialBalances?.map(b => b.networkId));
1576
1647
  const tokens = await getModuleTokens();
1577
1648
 
1578
1649
  // for chains with a zero balance we only call fetchBalances once every 5 subscriptionIntervals
@@ -1709,20 +1780,18 @@ const fetchBalances$3 = async (evmChainConnector, tokenAddressesByNetwork, erc20
1709
1780
  results: [],
1710
1781
  errors: []
1711
1782
  };
1712
- await Promise.all(Object.entries(tokenAddressesByNetwork).map(async ([evmNetworkId, networkParams]) => {
1713
- const publicClient = await evmChainConnector.getPublicClientForEvmNetwork(evmNetworkId);
1714
- if (!publicClient) throw new EvmErc20NetworkError(`Could not get rpc provider for evm network ${evmNetworkId}`, evmNetworkId);
1715
- const balances = await getEvmTokenBalances(publicClient, networkParams, result.errors, erc20Aggregators[evmNetworkId]);
1783
+ await Promise.all(Object.entries(tokenAddressesByNetwork).map(async ([networkId, networkParams]) => {
1784
+ const publicClient = await evmChainConnector.getPublicClientForEvmNetwork(networkId);
1785
+ if (!publicClient) throw new EvmErc20NetworkError(`Could not get rpc provider for evm network ${networkId}`, networkId);
1786
+ const balances = await getEvmTokenBalances(publicClient, networkParams, result.errors, erc20Aggregators[networkId]);
1716
1787
 
1717
1788
  // consider only non null balances in the results
1718
1789
  result.results.push(...balances.filter(util.isTruthy).map((free, i) => ({
1719
1790
  source: "evm-erc20",
1720
1791
  status: "live",
1721
1792
  address: networkParams[i].address,
1722
- multiChainId: {
1723
- evmChainId: evmNetworkId
1724
- },
1725
- evmNetworkId,
1793
+ // multiChainId: { evmChainId: evmNetworkId },
1794
+ networkId,
1726
1795
  tokenId: networkParams[i].token.id,
1727
1796
  value: free
1728
1797
  })));
@@ -1807,9 +1876,12 @@ function groupAddressesByTokenByEvmNetwork$1(addressesByToken, tokens) {
1807
1876
  const abiMulticall = viem.parseAbi(["struct Call { address target; bytes callData; }", "struct Call3 { address target; bool allowFailure; bytes callData; }", "struct Call3Value { address target; bool allowFailure; uint256 value; bytes callData; }", "struct Result { bool success; bytes returnData; }", "function aggregate(Call[] calldata calls) public payable returns (uint256 blockNumber, bytes[] memory returnData)", "function aggregate3(Call3[] calldata calls) public payable returns (Result[] memory returnData)", "function aggregate3Value(Call3Value[] calldata calls) public payable returns (Result[] memory returnData)", "function blockAndAggregate(Call[] calldata calls) public payable returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData)", "function getBasefee() view returns (uint256 basefee)", "function getBlockHash(uint256 blockNumber) view returns (bytes32 blockHash)", "function getBlockNumber() view returns (uint256 blockNumber)", "function getChainId() view returns (uint256 chainid)", "function getCurrentBlockCoinbase() view returns (address coinbase)", "function getCurrentBlockDifficulty() view returns (uint256 difficulty)", "function getCurrentBlockGasLimit() view returns (uint256 gaslimit)", "function getCurrentBlockTimestamp() view returns (uint256 timestamp)", "function getEthBalance(address addr) view returns (uint256 balance)", "function getLastBlockHash() view returns (bytes32 blockHash)", "function tryAggregate(bool requireSuccess, Call[] calldata calls) public payable returns (Result[] memory returnData)", "function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) public payable returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData)"]);
1808
1877
 
1809
1878
  const moduleType$6 = "evm-native";
1810
- const evmNativeTokenId = chainId => `${chainId}-evm-native`.toLowerCase().replace(/ /g, "-");
1879
+
1880
+ // export const evmNativeTokenId = (chainId: EvmNetworkId) =>
1881
+ // `${chainId}-evm-native`.toLowerCase().replace(/ /g, "-")
1882
+
1811
1883
  const getEvmNetworkIdFromTokenId = tokenId => {
1812
- const evmNetworkId = tokenId.split("-")[0];
1884
+ const evmNetworkId = tokenId.split(":")[0];
1813
1885
  if (!evmNetworkId) throw new Error(`Can't detect chainId for token ${tokenId}`);
1814
1886
  return evmNetworkId;
1815
1887
  };
@@ -1830,35 +1902,31 @@ const EvmNativeModule = hydrate => {
1830
1902
  * This method is currently executed on [a squid](https://github.com/TalismanSociety/chaindata-squid/blob/0ee02818bf5caa7362e3f3664e55ef05ec8df078/src/steps/updateEvmNetworksFromGithub.ts#L280-L284).
1831
1903
  * In a future version of the balance libraries, we may build some kind of async scheduling system which will keep the chainmeta for each chain up to date without relying on a squid.
1832
1904
  */
1833
- async fetchEvmChainMeta(chainId) {
1834
- const isTestnet = (await chaindataProvider$1.evmNetworkById(chainId))?.isTestnet || false;
1835
- return {
1836
- isTestnet
1837
- };
1905
+ async fetchEvmChainMeta(_chainId) {
1906
+ // const isTestnet = (await chaindataProvider.evmNetworkById(chainId))?.isTestnet || false
1907
+
1908
+ // return { isTestnet }
1909
+ return undefined;
1838
1910
  },
1839
1911
  /**
1840
1912
  * This method is currently executed on [a squid](https://github.com/TalismanSociety/chaindata-squid/blob/0ee02818bf5caa7362e3f3664e55ef05ec8df078/src/steps/updateEvmNetworksFromGithub.ts#L338-L343).
1841
1913
  * In a future version of the balance libraries, we may build some kind of async scheduling system which will keep the list of tokens for each chain up to date without relying on a squid.
1842
1914
  */
1843
- async fetchEvmChainTokens(chainId, chainMeta, moduleConfig) {
1844
- const {
1845
- isTestnet
1846
- } = chainMeta;
1915
+ async fetchEvmChainTokens(networkId, chainMeta, moduleConfig) {
1847
1916
  const symbol = moduleConfig?.symbol ?? "ETH";
1848
1917
  const decimals = typeof moduleConfig?.decimals === "number" ? moduleConfig.decimals : 18;
1849
1918
  const name = moduleConfig?.name ?? symbol;
1850
- const id = evmNativeTokenId(chainId);
1919
+ const id = chaindataProvider.evmNativeTokenId(networkId);
1851
1920
  const nativeToken = {
1852
1921
  platform: "ethereum",
1853
1922
  id,
1854
1923
  type: "evm-native",
1855
- isTestnet,
1856
1924
  isDefault: true,
1857
1925
  symbol,
1858
1926
  decimals,
1859
1927
  name,
1860
- logo: moduleConfig?.logo || chaindataProvider.githubTokenLogoUrl(id),
1861
- networkId: chainId
1928
+ logo: moduleConfig?.logo,
1929
+ networkId
1862
1930
  };
1863
1931
  if (moduleConfig?.symbol) nativeToken.symbol = moduleConfig?.symbol;
1864
1932
  if (moduleConfig?.coingeckoId) nativeToken.coingeckoId = moduleConfig?.coingeckoId;
@@ -1893,7 +1961,7 @@ const EvmNativeModule = hydrate => {
1893
1961
  // setup initialising balances for all active evm networks
1894
1962
  const activeEvmNetworkIds = Object.keys(ethAddressesByToken).map(getEvmNetworkIdFromTokenId);
1895
1963
  const initialisingBalances = new Set(activeEvmNetworkIds);
1896
- const positiveBalanceNetworks = new Set(initialBalances?.map(b => b.evmNetworkId));
1964
+ const positiveBalanceNetworks = new Set(initialBalances?.map(b => b.networkId));
1897
1965
  const poll = async () => {
1898
1966
  if (!subscriptionActive) return;
1899
1967
  zeroBalanceSubscriptionIntervalCounter = (zeroBalanceSubscriptionIntervalCounter + 1) % 5;
@@ -1920,10 +1988,10 @@ const EvmNativeModule = hydrate => {
1920
1988
  log.error(balance.message, balance.networkId);
1921
1989
  initialisingBalances.delete(balance.networkId);
1922
1990
  } else {
1923
- if (balance.evmNetworkId) {
1924
- initialisingBalances.delete(balance.evmNetworkId);
1991
+ if (balance.networkId) {
1992
+ initialisingBalances.delete(balance.networkId);
1925
1993
  if (BigInt(balance.value) > 0n) {
1926
- positiveBalanceNetworks.add(balance.evmNetworkId);
1994
+ positiveBalanceNetworks.add(balance.networkId);
1927
1995
  }
1928
1996
  resultBalances.push(balance);
1929
1997
  }
@@ -1973,23 +2041,23 @@ const fetchBalances$2 = async (evmChainConnector, addressesByToken, tokens) => {
1973
2041
  if (!evmChainConnector) throw new Error(`This module requires an evm chain connector`);
1974
2042
  return Promise.all(Object.entries(addressesByToken).map(async ([tokenId, addresses]) => {
1975
2043
  const token = tokens[tokenId];
1976
- const evmNetworkId = token.networkId;
1977
- if (!evmNetworkId) throw new Error(`Token ${token.id} has no evm network`);
1978
- const publicClient = await evmChainConnector.getPublicClientForEvmNetwork(evmNetworkId);
1979
- if (!publicClient) throw new Error(`Could not get rpc provider for evm network ${evmNetworkId}`);
2044
+ const networkId = token.networkId;
2045
+ if (!networkId) throw new Error(`Token ${token.id} has no evm network`);
2046
+ const publicClient = await evmChainConnector.getPublicClientForEvmNetwork(networkId);
2047
+ if (!publicClient) throw new Error(`Could not get rpc provider for evm network ${networkId}`);
1980
2048
 
1981
2049
  // fetch all balances
1982
2050
  const freeBalances = await getFreeBalances(publicClient, addresses);
1983
2051
  const balanceResults = addresses.map((address, i) => {
1984
- if (freeBalances[i] === "error") return new EvmNativeBalanceError("Could not fetch balance ", evmNetworkId);
2052
+ if (freeBalances[i] === "error") return new EvmNativeBalanceError("Could not fetch balance ", networkId);
1985
2053
  return {
1986
2054
  source: "evm-native",
1987
2055
  status: "live",
1988
2056
  address: address,
1989
2057
  multiChainId: {
1990
- evmChainId: evmNetworkId
2058
+ evmChainId: networkId
1991
2059
  },
1992
- evmNetworkId,
2060
+ networkId,
1993
2061
  tokenId,
1994
2062
  value: freeBalances[i].toString()
1995
2063
  };
@@ -2611,7 +2679,6 @@ const uniswapV2PairAbi = [{
2611
2679
  }];
2612
2680
 
2613
2681
  const moduleType$5 = "evm-uniswapv2";
2614
- const evmUniswapV2TokenId = (chainId, contractAddress) => `${chainId}-evm-uniswapv2-${contractAddress}`.toLowerCase();
2615
2682
  const EvmUniswapV2Module = hydrate => {
2616
2683
  const {
2617
2684
  chainConnectors,
@@ -2621,16 +2688,15 @@ const EvmUniswapV2Module = hydrate => {
2621
2688
  util$1.assert(chainConnector, "This module requires an evm chain connector");
2622
2689
  return {
2623
2690
  ...DefaultBalanceModule(moduleType$5),
2624
- async fetchEvmChainMeta(chainId) {
2625
- const isTestnet = (await chaindataProvider$1.evmNetworkById(chainId))?.isTestnet || false;
2626
- return {
2627
- isTestnet
2628
- };
2691
+ async fetchEvmChainMeta(_chainId) {
2692
+ // const isTestnet = (await chaindataProvider.evmNetworkById(chainId))?.isTestnet || false
2693
+
2694
+ // return { isTestnet }
2695
+ return undefined;
2629
2696
  },
2630
- async fetchEvmChainTokens(chainId, chainMeta, moduleConfig) {
2631
- const {
2632
- isTestnet
2633
- } = chainMeta;
2697
+ async fetchEvmChainTokens(chainId, _chainMeta, moduleConfig) {
2698
+ //const { isTestnet } = chainMeta
2699
+
2634
2700
  const tokens = {};
2635
2701
  for (const tokenConfig of moduleConfig?.pools ?? []) {
2636
2702
  const {
@@ -2650,12 +2716,12 @@ const EvmUniswapV2Module = hydrate => {
2650
2716
  log.warn("ignoring token on chain %s", chainId, tokenConfig);
2651
2717
  continue;
2652
2718
  }
2653
- const id = evmUniswapV2TokenId(chainId, contractAddress);
2719
+ const id = chaindataProvider.evmUniswapV2TokenId(chainId, contractAddress);
2654
2720
  const token = {
2655
2721
  id,
2656
2722
  type: "evm-uniswapv2",
2657
2723
  platform: "ethereum",
2658
- isTestnet,
2724
+ // isTestnet,
2659
2725
  isDefault: tokenConfig.isDefault ?? false,
2660
2726
  symbol: `${symbol0 ?? "UNKNOWN"}/${symbol1 ?? "UNKNOWN"}`,
2661
2727
  name: name ?? `${symbol0 ?? "UNKNOWN"}/${symbol1 ?? "UNKNOWN"}`,
@@ -2689,9 +2755,9 @@ const EvmUniswapV2Module = hydrate => {
2689
2755
  const initDelay = 1_500; // 1_500ms == 1.5 seconds
2690
2756
 
2691
2757
  const initialBalancesByNetwork = initialBalances?.reduce((result, b) => {
2692
- if (!b.evmNetworkId) return result;
2693
- if (!result[b.evmNetworkId]) result[b.evmNetworkId] = {};
2694
- result[b.evmNetworkId][getBalanceId(b)] = b;
2758
+ if (!b.networkId) return result;
2759
+ if (!result[b.networkId]) result[b.networkId] = {};
2760
+ result[b.networkId][getBalanceId(b)] = b;
2695
2761
  return result;
2696
2762
  }, {});
2697
2763
  const cache = new Map(Object.entries(initialBalancesByNetwork ?? {}));
@@ -2751,12 +2817,12 @@ const EvmUniswapV2Module = hydrate => {
2751
2817
  };
2752
2818
  const fetchBalances$1 = async (evmChainConnector, evmNetworks, tokens, addressesByToken) => {
2753
2819
  const addressesByTokenGroupedByEvmNetwork = groupAddressesByTokenByEvmNetwork(addressesByToken, tokens);
2754
- const balances = (await Promise.allSettled(Object.entries(addressesByTokenGroupedByEvmNetwork).map(async ([evmNetworkId, addressesByToken]) => {
2820
+ const balances = (await Promise.allSettled(Object.entries(addressesByTokenGroupedByEvmNetwork).map(async ([networkId, addressesByToken]) => {
2755
2821
  if (!evmChainConnector) throw new Error(`This module requires an evm chain connector`);
2756
- const evmNetwork = evmNetworks[evmNetworkId];
2757
- if (!evmNetwork) throw new Error(`Evm network ${evmNetworkId} not found`);
2758
- const publicClient = await evmChainConnector.getPublicClientForEvmNetwork(evmNetworkId);
2759
- if (!publicClient) throw new Error(`Could not get rpc provider for evm network ${evmNetworkId}`);
2822
+ const evmNetwork = evmNetworks[networkId];
2823
+ if (!evmNetwork) throw new Error(`Evm network ${networkId} not found`);
2824
+ const publicClient = await evmChainConnector.getPublicClientForEvmNetwork(networkId);
2825
+ if (!publicClient) throw new Error(`Could not get rpc provider for evm network ${networkId}`);
2760
2826
  const tokensAndAddresses = Object.entries(addressesByToken).reduce((tokensAndAddresses, [tokenId, addresses]) => {
2761
2827
  const token = tokens[tokenId];
2762
2828
  if (!token) {
@@ -2778,10 +2844,7 @@ const fetchBalances$1 = async (evmChainConnector, evmNetworks, tokens, addresses
2778
2844
  source: "evm-uniswapv2",
2779
2845
  status: "live",
2780
2846
  address: address,
2781
- multiChainId: {
2782
- evmChainId: evmNetwork.id
2783
- },
2784
- evmNetworkId,
2847
+ networkId,
2785
2848
  tokenId: token.id,
2786
2849
  values: await getPoolBalance(publicClient, token.contractAddress, address)
2787
2850
  }));
@@ -2913,24 +2976,20 @@ async function balances(balanceModule, addressesByToken, callback) {
2913
2976
  */
2914
2977
  const findChainMeta = (miniMetadatas, moduleType, chain) => {
2915
2978
  if (!chain) return [undefined, undefined];
2916
- if (!chain.specName) return [undefined, undefined];
2917
2979
  if (!chain.specVersion) return [undefined, undefined];
2918
2980
 
2919
2981
  // TODO: This is spaghetti to import this here, it should be injected into each balance module or something.
2920
2982
  const metadataId = deriveMiniMetadataId({
2921
2983
  source: moduleType,
2922
2984
  chainId: chain.id,
2923
- specName: chain.specName,
2924
2985
  specVersion: chain.specVersion,
2925
- balancesConfig: JSON.stringify(chain.balancesConfig?.find(config => config.moduleType === moduleType)?.moduleConfig ?? {})
2986
+ libVersion
2926
2987
  });
2927
2988
 
2928
2989
  // TODO: Fix this (needs to fetch miniMetadata without being async)
2929
2990
  const miniMetadata = miniMetadatas.get(metadataId);
2930
2991
  const chainMeta = miniMetadata ? {
2931
- miniMetadata: miniMetadata.data,
2932
- metadataVersion: miniMetadata.version,
2933
- ...JSON.parse(miniMetadata.extra)
2992
+ miniMetadata: miniMetadata.data
2934
2993
  } : undefined;
2935
2994
  return [chainMeta, miniMetadata];
2936
2995
  };
@@ -3158,7 +3217,6 @@ const decompress = data => {
3158
3217
  };
3159
3218
 
3160
3219
  const moduleType$4 = "substrate-assets";
3161
- const subAssetTokenId = (chainId, assetId, tokenSymbol) => `${chainId}-substrate-assets-${assetId}-${tokenSymbol}`.toLowerCase().replace(/ /g, "-");
3162
3220
  const SubAssetsModule = hydrate => {
3163
3221
  const {
3164
3222
  chainConnectors,
@@ -3192,12 +3250,9 @@ const SubAssetsModule = hydrate => {
3192
3250
  async fetchSubstrateChainTokens(chainId, chainMeta, moduleConfig) {
3193
3251
  if ((moduleConfig?.tokens ?? []).length < 1) return {};
3194
3252
  const {
3195
- isTestnet,
3196
- miniMetadata,
3197
- metadataVersion
3253
+ miniMetadata
3198
3254
  } = chainMeta;
3199
- if (miniMetadata === undefined || metadataVersion === undefined) return {};
3200
- if (metadataVersion < 14) return {};
3255
+ if (!miniMetadata) return {};
3201
3256
  const metadata = scale.unifyMetadata(scale.decAnyMetadata(miniMetadata));
3202
3257
  const scaleBuilder = scale.getDynamicBuilder(scale.getLookupFn(metadata));
3203
3258
  const assetCoder = scaleBuilder.buildStorage("Assets", "Asset");
@@ -3214,17 +3269,16 @@ const SubAssetsModule = hydrate => {
3214
3269
  const symbol = assetsMetadata?.symbol?.asText?.() ?? "Unit";
3215
3270
  const decimals = assetsMetadata?.decimals ?? 0;
3216
3271
  const isFrozen = assetsMetadata?.is_frozen ?? false;
3217
- const id = subAssetTokenId(chainId, assetId, symbol);
3272
+ const id = chaindataProvider.subAssetTokenId(chainId, assetId);
3218
3273
  const token = {
3219
3274
  id,
3220
3275
  type: "substrate-assets",
3221
3276
  platform: "polkadot",
3222
- isTestnet,
3223
3277
  isDefault: tokenConfig?.isDefault ?? true,
3224
3278
  symbol,
3225
3279
  name: tokenConfig?.name || symbol,
3226
3280
  decimals,
3227
- logo: tokenConfig?.logo || chaindataProvider.githubTokenLogoUrl(id),
3281
+ logo: tokenConfig?.logo,
3228
3282
  existentialDeposit,
3229
3283
  assetId,
3230
3284
  isFrozen,
@@ -3232,7 +3286,7 @@ const SubAssetsModule = hydrate => {
3232
3286
  };
3233
3287
  if (tokenConfig?.symbol) {
3234
3288
  token.symbol = tokenConfig?.symbol;
3235
- token.id = subAssetTokenId(chainId, assetId, token.symbol);
3289
+ token.id = chaindataProvider.subAssetTokenId(chainId, assetId);
3236
3290
  }
3237
3291
  if (tokenConfig?.coingeckoId) token.coingeckoId = tokenConfig?.coingeckoId;
3238
3292
  if (tokenConfig?.mirrorOf) token.mirrorOf = tokenConfig?.mirrorOf;
@@ -3353,27 +3407,27 @@ async function buildQueries$3(chaindataProvider, addressesByToken) {
3353
3407
  log.debug(`This module doesn't handle tokens of type ${token.type}`);
3354
3408
  return [];
3355
3409
  }
3356
- const chainId = token.networkId;
3357
- if (!chainId) {
3410
+ const networkId = token.networkId;
3411
+ if (!networkId) {
3358
3412
  log.warn(`Token ${tokenId} has no chain`);
3359
3413
  return [];
3360
3414
  }
3361
- const chain = chains[chainId];
3415
+ const chain = chains[networkId];
3362
3416
  if (!chain) {
3363
- log.warn(`Chain ${chainId} for token ${tokenId} not found`);
3417
+ log.warn(`Chain ${networkId} for token ${tokenId} not found`);
3364
3418
  return [];
3365
3419
  }
3366
3420
  return addresses.flatMap(address => {
3367
- const scaleCoder = chainStorageCoders.get(chainId)?.storage;
3421
+ const scaleCoder = chainStorageCoders.get(networkId)?.storage;
3368
3422
  const stateKey = tryEncode(scaleCoder, BigInt(token.assetId), address) ?? tryEncode(scaleCoder, token.assetId, address);
3369
3423
  if (!stateKey) {
3370
- log.warn(`Invalid assetId / address in ${chainId} storage query ${token.assetId} / ${address}`);
3424
+ log.warn(`Invalid assetId / address in ${networkId} storage query ${token.assetId} / ${address}`);
3371
3425
  return [];
3372
3426
  }
3373
3427
  const decodeResult = change => {
3374
3428
  /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */
3375
3429
 
3376
- const decoded = scale.decodeScale(scaleCoder, change, `Failed to decode substrate-assets balance on chain ${chainId}`) ?? {
3430
+ const decoded = scale.decodeScale(scaleCoder, change, `Failed to decode substrate-assets balance on chain ${networkId}`) ?? {
3377
3431
  balance: 0n,
3378
3432
  status: {
3379
3433
  type: "Liquid"
@@ -3407,16 +3461,13 @@ async function buildQueries$3(chaindataProvider, addressesByToken) {
3407
3461
  source: "substrate-assets",
3408
3462
  status: "live",
3409
3463
  address,
3410
- multiChainId: {
3411
- subChainId: chainId
3412
- },
3413
- chainId,
3464
+ networkId,
3414
3465
  tokenId: token.id,
3415
3466
  values: balanceValues
3416
3467
  };
3417
3468
  };
3418
3469
  return {
3419
- chainId,
3470
+ chainId: networkId,
3420
3471
  stateKey,
3421
3472
  decodeResult
3422
3473
  };
@@ -3436,7 +3487,6 @@ const tryEncode = (scaleCoder, ...args) => {
3436
3487
  };
3437
3488
 
3438
3489
  const moduleType$3 = "substrate-foreignassets";
3439
- const subForeignAssetTokenId = (chainId, tokenSymbol) => `${chainId}-substrate-foreignassets-${tokenSymbol}`.toLowerCase().replace(/ /g, "-");
3440
3490
  const SubForeignAssetsModule = hydrate => {
3441
3491
  const {
3442
3492
  chainConnectors,
@@ -3447,14 +3497,12 @@ const SubForeignAssetsModule = hydrate => {
3447
3497
  return {
3448
3498
  ...DefaultBalanceModule(moduleType$3),
3449
3499
  async fetchSubstrateChainMeta(chainId, moduleConfig, metadataRpc) {
3450
- const isTestnet = (await chaindataProvider$1.chainById(chainId))?.isTestnet || false;
3451
- if (metadataRpc === undefined) return {
3452
- isTestnet
3453
- };
3454
- if ((moduleConfig?.tokens ?? []).length < 1) return {
3455
- isTestnet
3456
- };
3500
+ // const isTestnet = (await chaindataProvider.chainById(chainId))?.isTestnet || false
3501
+ if (metadataRpc === undefined) return {};
3502
+ // if ((moduleConfig?.tokens ?? []).length < 1) return { isTestnet }
3503
+
3457
3504
  const metadataVersion = scale.getMetadataVersion(metadataRpc);
3505
+ if (metadataVersion < 14) return {};
3458
3506
  const metadata = scale.decAnyMetadata(metadataRpc);
3459
3507
  scale.compactMetadata(metadata, [{
3460
3508
  pallet: "ForeignAssets",
@@ -3462,20 +3510,18 @@ const SubForeignAssetsModule = hydrate => {
3462
3510
  }]);
3463
3511
  const miniMetadata = scale.encodeMetadata(metadata);
3464
3512
  return {
3465
- isTestnet,
3466
- miniMetadata,
3467
- metadataVersion
3513
+ miniMetadata
3468
3514
  };
3469
3515
  },
3470
3516
  async fetchSubstrateChainTokens(chainId, chainMeta, moduleConfig) {
3471
3517
  if ((moduleConfig?.tokens ?? []).length < 1) return {};
3472
3518
  const {
3473
- isTestnet,
3474
- miniMetadata,
3475
- metadataVersion
3519
+ miniMetadata
3476
3520
  } = chainMeta;
3477
- if (miniMetadata === undefined || metadataVersion === undefined) return {};
3478
- if (metadataVersion < 14) return {};
3521
+ if (!miniMetadata) return {};
3522
+ // if (miniMetadata === undefined || metadataVersion === undefined) return {}
3523
+ // if (metadataVersion < 14) return {}
3524
+
3479
3525
  const metadata = scale.decAnyMetadata(miniMetadata);
3480
3526
  const unifiedMetadata = scale.unifyMetadata(metadata);
3481
3527
  const scaleBuilder = scale.getDynamicBuilder(scale.getLookupFn(unifiedMetadata));
@@ -3499,26 +3545,22 @@ const SubForeignAssetsModule = hydrate => {
3499
3545
  const symbol = assetsMetadata?.symbol?.asText?.() ?? "Unit";
3500
3546
  const decimals = assetsMetadata?.decimals ?? 0;
3501
3547
  const isFrozen = assetsMetadata?.is_frozen ?? false;
3502
- const id = subForeignAssetTokenId(chainId, symbol);
3548
+ const id = chaindataProvider.subForeignAssetTokenId(chainId, tokenConfig.onChainId);
3503
3549
  const token = {
3504
3550
  id,
3505
3551
  type: "substrate-foreignassets",
3506
3552
  platform: "polkadot",
3507
- isTestnet,
3553
+ // isTestnet,
3508
3554
  isDefault: tokenConfig?.isDefault ?? true,
3509
3555
  symbol,
3510
3556
  decimals,
3511
3557
  name: tokenConfig?.name || symbol,
3512
- logo: tokenConfig?.logo || chaindataProvider.githubTokenLogoUrl(id),
3558
+ logo: tokenConfig?.logo,
3513
3559
  existentialDeposit,
3514
3560
  onChainId: tokenConfig.onChainId,
3515
3561
  isFrozen,
3516
3562
  networkId: chainId
3517
3563
  };
3518
- if (tokenConfig?.symbol) {
3519
- token.symbol = tokenConfig?.symbol;
3520
- token.id = subForeignAssetTokenId(chainId, token.symbol);
3521
- }
3522
3564
  if (tokenConfig?.coingeckoId) token.coingeckoId = tokenConfig?.coingeckoId;
3523
3565
  if (tokenConfig?.mirrorOf) token.mirrorOf = tokenConfig?.mirrorOf;
3524
3566
  tokens[token.id] = token;
@@ -3624,18 +3666,18 @@ async function buildQueries$2(chaindataProvider, addressesByToken) {
3624
3666
  log.debug(`This module doesn't handle tokens of type ${token.type}`);
3625
3667
  return [];
3626
3668
  }
3627
- const chainId = token.networkId;
3628
- if (!chainId) {
3669
+ const networkId = token.networkId;
3670
+ if (!networkId) {
3629
3671
  log.warn(`Token ${tokenId} has no chain`);
3630
3672
  return [];
3631
3673
  }
3632
- const chain = chains[chainId];
3674
+ const chain = chains[networkId];
3633
3675
  if (!chain) {
3634
- log.warn(`Chain ${chainId} for token ${tokenId} not found`);
3676
+ log.warn(`Chain ${networkId} for token ${tokenId} not found`);
3635
3677
  return [];
3636
3678
  }
3637
3679
  return addresses.flatMap(address => {
3638
- const scaleCoder = chainStorageCoders.get(chainId)?.storage;
3680
+ const scaleCoder = chainStorageCoders.get(networkId)?.storage;
3639
3681
  const onChainId = (() => {
3640
3682
  try {
3641
3683
  return scale.papiParse(token.onChainId);
@@ -3643,12 +3685,12 @@ async function buildQueries$2(chaindataProvider, addressesByToken) {
3643
3685
  return token.onChainId;
3644
3686
  }
3645
3687
  })();
3646
- const stateKey = scale.encodeStateKey(scaleCoder, `Invalid address / token onChainId in ${chainId} storage query ${address} / ${token.onChainId}`, onChainId, address);
3688
+ const stateKey = scale.encodeStateKey(scaleCoder, `Invalid address / token onChainId in ${networkId} storage query ${address} / ${token.onChainId}`, onChainId, address);
3647
3689
  if (!stateKey) return [];
3648
3690
  const decodeResult = change => {
3649
3691
  /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */
3650
3692
 
3651
- const decoded = scale.decodeScale(scaleCoder, change, `Failed to decode substrate-foreignassets balance on chain ${chainId}`) ?? {
3693
+ const decoded = scale.decodeScale(scaleCoder, change, `Failed to decode substrate-foreignassets balance on chain ${networkId}`) ?? {
3652
3694
  balance: 0n,
3653
3695
  status: {
3654
3696
  type: "Liquid"
@@ -3682,16 +3724,13 @@ async function buildQueries$2(chaindataProvider, addressesByToken) {
3682
3724
  source: "substrate-foreignassets",
3683
3725
  status: "live",
3684
3726
  address,
3685
- multiChainId: {
3686
- subChainId: chainId
3687
- },
3688
- chainId,
3727
+ networkId,
3689
3728
  tokenId: token.id,
3690
3729
  values: balanceValues
3691
3730
  };
3692
3731
  };
3693
3732
  return {
3694
- chainId,
3733
+ chainId: networkId,
3695
3734
  stateKey,
3696
3735
  decodeResult
3697
3736
  };
@@ -3948,10 +3987,7 @@ async function subscribeCrowdloans(chaindataProvider, chainConnector, addressesB
3948
3987
  source: "substrate-native",
3949
3988
  status: "live",
3950
3989
  address,
3951
- multiChainId: {
3952
- subChainId: chainId
3953
- },
3954
- chainId,
3990
+ networkId: chainId,
3955
3991
  tokenId,
3956
3992
  values: Array.from(contributions).map(({
3957
3993
  amount,
@@ -4234,10 +4270,7 @@ async function subscribeNompoolStaking(chaindataProvider, chainConnector, addres
4234
4270
  source: "substrate-native",
4235
4271
  status: "live",
4236
4272
  address,
4237
- multiChainId: {
4238
- subChainId: chainId
4239
- },
4240
- chainId,
4273
+ networkId: chainId,
4241
4274
  tokenId,
4242
4275
  values: [{
4243
4276
  source: "nompools-staking",
@@ -4481,10 +4514,7 @@ async function subscribeSubtensorStaking(chaindataProvider, chainConnector, addr
4481
4514
  source: "substrate-native",
4482
4515
  status: "live",
4483
4516
  address,
4484
- multiChainId: {
4485
- subChainId: chainId
4486
- },
4487
- chainId,
4517
+ networkId: chainId,
4488
4518
  tokenId,
4489
4519
  values: [{
4490
4520
  source: "subtensor-staking",
@@ -4593,8 +4623,12 @@ const getLockTitle = (lock, {
4593
4623
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
4594
4624
  const paraId = lock.meta?.paraId;
4595
4625
  if (!paraId) return "Crowdloan";
4596
- const name = balance?.chain?.parathreads?.find(parathread => parathread?.paraId === paraId)?.name;
4597
- return `${name ? name : `Parachain ${paraId}`} Crowdloan`;
4626
+
4627
+ // balance?.network?.parathreads?.find(
4628
+ // (parathread) => parathread?.paraId === paraId,
4629
+ // )?.name
4630
+
4631
+ return `${`Parachain ${paraId}`} Crowdloan`;
4598
4632
  }
4599
4633
  if (lock.label === "nompools-staking") return "Pooled Staking";
4600
4634
  if (lock.label === "nompools-unbonding") return "Pooled Staking";
@@ -4607,7 +4641,9 @@ const getLockTitle = (lock, {
4607
4641
  };
4608
4642
 
4609
4643
  const moduleType$2 = "substrate-native";
4610
- const subNativeTokenId = chainId => `${chainId}-substrate-native`.toLowerCase().replace(/ /g, "-");
4644
+
4645
+ // export const subNativeTokenId = (chainId: ChainId) =>
4646
+ // `${chainId}-substrate-native`.toLowerCase().replace(/ /g, "-")
4611
4647
 
4612
4648
  /**
4613
4649
  * Function to merge two 'sub sources' of the same balance together, or
@@ -4706,10 +4742,7 @@ async function buildQueries$1(chains, tokens, chainStorageCoders, miniMetadatas,
4706
4742
  source: "substrate-native",
4707
4743
  status: "live",
4708
4744
  address,
4709
- multiChainId: {
4710
- subChainId: chainId
4711
- },
4712
- chainId,
4745
+ networkId: chainId,
4713
4746
  tokenId,
4714
4747
  values: []
4715
4748
  };
@@ -5242,7 +5275,7 @@ const SubNativeModule = hydrate => {
5242
5275
  decimals,
5243
5276
  existentialDeposit
5244
5277
  } = chainMeta;
5245
- const id = subNativeTokenId(chainId);
5278
+ const id = chaindataProvider.subNativeTokenId(chainId);
5246
5279
  const nativeToken = {
5247
5280
  id,
5248
5281
  type: "substrate-native",
@@ -5252,7 +5285,7 @@ const SubNativeModule = hydrate => {
5252
5285
  symbol: symbol ?? DEFAULT_SYMBOL,
5253
5286
  name: moduleConfig?.name ?? symbol ?? DEFAULT_SYMBOL,
5254
5287
  decimals: decimals ?? DEFAULT_DECIMALS,
5255
- logo: moduleConfig?.logo || chaindataProvider.githubTokenLogoUrl(id),
5288
+ logo: moduleConfig?.logo,
5256
5289
  existentialDeposit: existentialDeposit ?? "0",
5257
5290
  networkId: chainId
5258
5291
  };
@@ -6645,7 +6678,6 @@ var psp22Abi = {
6645
6678
  };
6646
6679
 
6647
6680
  const moduleType$1 = "substrate-psp22";
6648
- const subPsp22TokenId = (chainId, tokenSymbol) => `${chainId}-substrate-psp22-${tokenSymbol}`.toLowerCase().replace(/ /g, "-");
6649
6681
  const SubPsp22Module = hydrate => {
6650
6682
  const {
6651
6683
  chainConnectors,
@@ -6655,16 +6687,14 @@ const SubPsp22Module = hydrate => {
6655
6687
  util$1.assert(chainConnector, "This module requires a substrate chain connector");
6656
6688
  return {
6657
6689
  ...DefaultBalanceModule(moduleType$1),
6658
- async fetchSubstrateChainMeta(chainId) {
6659
- const isTestnet = (await chaindataProvider$1.chainById(chainId))?.isTestnet || false;
6660
- return {
6661
- isTestnet
6662
- };
6690
+ async fetchSubstrateChainMeta(_chainId) {
6691
+ // const isTestnet = (await chaindataProvider.chainById(chainId))?.isTestnet || false
6692
+ // return { isTestnet }
6693
+ return undefined;
6663
6694
  },
6664
- async fetchSubstrateChainTokens(chainId, chainMeta, moduleConfig) {
6665
- const {
6666
- isTestnet
6667
- } = chainMeta;
6695
+ async fetchSubstrateChainTokens(chainId, _chainMeta, moduleConfig) {
6696
+ // const { isTestnet } = chainMeta
6697
+
6668
6698
  const registry = new types.TypeRegistry();
6669
6699
  const Psp22Abi = new apiContract.Abi(psp22Abi);
6670
6700
 
@@ -6695,25 +6725,21 @@ const SubPsp22Module = hydrate => {
6695
6725
  const decimalsData = decimalsResult.toJSON()?.result?.ok?.data;
6696
6726
  decimals = typeof decimalsData === "string" && decimalsData.startsWith("0x") ? util$1.hexToNumber(decimalsData) : decimals;
6697
6727
  })();
6698
- const id = subPsp22TokenId(chainId, symbol);
6728
+ const id = chaindataProvider.subPsp22TokenId(chainId, contractAddress);
6699
6729
  const token = {
6700
6730
  id,
6701
6731
  type: "substrate-psp22",
6702
6732
  platform: "polkadot",
6703
- isTestnet,
6733
+ // isTestnet,
6704
6734
  isDefault: tokenConfig.isDefault ?? true,
6705
6735
  symbol,
6706
6736
  decimals,
6707
6737
  name: tokenConfig?.name || symbol,
6708
- logo: tokenConfig?.logo || chaindataProvider.githubTokenLogoUrl(id),
6738
+ logo: tokenConfig?.logo,
6709
6739
  existentialDeposit,
6710
6740
  contractAddress,
6711
6741
  networkId: chainId
6712
6742
  };
6713
- if (tokenConfig?.symbol) {
6714
- token.symbol = tokenConfig?.symbol;
6715
- token.id = subPsp22TokenId(chainId, token.symbol);
6716
- }
6717
6743
  if (tokenConfig?.coingeckoId) token.coingeckoId = tokenConfig?.coingeckoId;
6718
6744
  if (tokenConfig?.mirrorOf) token.mirrorOf = tokenConfig?.mirrorOf;
6719
6745
  tokens[token.id] = token;
@@ -6874,10 +6900,7 @@ const fetchBalances = async (chainConnector, tokens, addressesByToken) => {
6874
6900
  source: "substrate-psp22",
6875
6901
  status: "live",
6876
6902
  address,
6877
- multiChainId: {
6878
- subChainId: token.networkId
6879
- },
6880
- chainId: token.networkId,
6903
+ networkId: token.networkId,
6881
6904
  tokenId,
6882
6905
  value: balance
6883
6906
  };
@@ -6901,7 +6924,6 @@ const fetchBalances = async (chainConnector, tokens, addressesByToken) => {
6901
6924
 
6902
6925
  const moduleType = "substrate-tokens";
6903
6926
  const defaultPalletId = "Tokens";
6904
- const subTokensTokenId = (chainId, onChainId) => `${chainId}-substrate-tokens-${lzString.compressToEncodedURIComponent(String(onChainId))}`;
6905
6927
  const SubTokensModule = hydrate => {
6906
6928
  const {
6907
6929
  chainConnectors,
@@ -6912,14 +6934,8 @@ const SubTokensModule = hydrate => {
6912
6934
  return {
6913
6935
  ...DefaultBalanceModule(moduleType),
6914
6936
  async fetchSubstrateChainMeta(chainId, moduleConfig, metadataRpc) {
6915
- const isTestnet = (await chaindataProvider$1.chainById(chainId))?.isTestnet || false;
6916
- if (metadataRpc === undefined) return {
6917
- isTestnet
6918
- };
6919
- if ((moduleConfig?.tokens ?? []).length < 1) return {
6920
- isTestnet
6921
- };
6922
- const metadataVersion = scale.getMetadataVersion(metadataRpc);
6937
+ if (metadataRpc === undefined) return {};
6938
+ if ((moduleConfig?.tokens ?? []).length < 1) return {};
6923
6939
  const metadata = scale.decAnyMetadata(metadataRpc);
6924
6940
  const palletId = moduleConfig?.palletId ?? defaultPalletId;
6925
6941
  scale.compactMetadata(metadata, [{
@@ -6928,20 +6944,13 @@ const SubTokensModule = hydrate => {
6928
6944
  }]);
6929
6945
  const miniMetadata = scale.encodeMetadata(metadata);
6930
6946
  return palletId === defaultPalletId ? {
6931
- isTestnet,
6932
- miniMetadata,
6933
- metadataVersion
6947
+ miniMetadata
6934
6948
  } : {
6935
- isTestnet,
6936
6949
  palletId,
6937
- miniMetadata,
6938
- metadataVersion
6950
+ miniMetadata
6939
6951
  };
6940
6952
  },
6941
6953
  async fetchSubstrateChainTokens(chainId, chainMeta, moduleConfig) {
6942
- const {
6943
- isTestnet
6944
- } = chainMeta;
6945
6954
  const tokens = {};
6946
6955
  for (const tokenConfig of moduleConfig?.tokens ?? []) {
6947
6956
  try {
@@ -6950,25 +6959,20 @@ const SubTokensModule = hydrate => {
6950
6959
  const existentialDeposit = tokenConfig?.ed ?? "0";
6951
6960
  const onChainId = tokenConfig?.onChainId ?? undefined;
6952
6961
  if (onChainId === undefined) continue;
6953
- const id = subTokensTokenId(chainId, onChainId);
6962
+ const id = chaindataProvider.subTokensTokenId(chainId, onChainId);
6954
6963
  const token = {
6955
6964
  id,
6956
6965
  type: "substrate-tokens",
6957
6966
  platform: "polkadot",
6958
- isTestnet,
6959
6967
  isDefault: tokenConfig.isDefault ?? true,
6960
6968
  symbol,
6961
6969
  decimals,
6962
6970
  name: tokenConfig?.name ?? symbol,
6963
- logo: tokenConfig?.logo || chaindataProvider.githubTokenLogoUrl(id),
6971
+ logo: tokenConfig?.logo,
6964
6972
  existentialDeposit,
6965
6973
  onChainId,
6966
6974
  networkId: chainId
6967
6975
  };
6968
- if (tokenConfig?.symbol) {
6969
- token.symbol = tokenConfig?.symbol;
6970
- token.id = subTokensTokenId(chainId, token.onChainId);
6971
- }
6972
6976
  if (tokenConfig?.coingeckoId) token.coingeckoId = tokenConfig?.coingeckoId;
6973
6977
  if (tokenConfig?.mirrorOf) token.mirrorOf = tokenConfig?.mirrorOf;
6974
6978
  tokens[token.id] = token;
@@ -7140,18 +7144,18 @@ async function buildQueries(chaindataProvider, addressesByToken) {
7140
7144
  log.debug(`This module doesn't handle tokens of type ${token.type}`);
7141
7145
  return [];
7142
7146
  }
7143
- const chainId = token.networkId;
7144
- if (!chainId) {
7147
+ const networkId = token.networkId;
7148
+ if (!networkId) {
7145
7149
  log.warn(`Token ${tokenId} has no chain`);
7146
7150
  return [];
7147
7151
  }
7148
- const chain = chains[chainId];
7152
+ const chain = chains[networkId];
7149
7153
  if (!chain) {
7150
- log.warn(`Chain ${chainId} for token ${tokenId} not found`);
7154
+ log.warn(`Chain ${networkId} for token ${tokenId} not found`);
7151
7155
  return [];
7152
7156
  }
7153
7157
  return addresses.flatMap(address => {
7154
- const scaleCoder = chainStorageCoders.get(chainId)?.storage;
7158
+ const scaleCoder = chainStorageCoders.get(networkId)?.storage;
7155
7159
  const onChainId = (() => {
7156
7160
  try {
7157
7161
  return scale.papiParse(token.onChainId);
@@ -7159,12 +7163,12 @@ async function buildQueries(chaindataProvider, addressesByToken) {
7159
7163
  return token.onChainId;
7160
7164
  }
7161
7165
  })();
7162
- const stateKey = scale.encodeStateKey(scaleCoder, `Invalid address / token onChainId in ${chainId} storage query ${address} / ${token.onChainId}`, address, onChainId);
7166
+ const stateKey = scale.encodeStateKey(scaleCoder, `Invalid address / token onChainId in ${networkId} storage query ${address} / ${token.onChainId}`, address, onChainId);
7163
7167
  if (!stateKey) return [];
7164
7168
  const decodeResult = change => {
7165
7169
  /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */
7166
7170
 
7167
- const decoded = scale.decodeScale(scaleCoder, change, `Failed to decode substrate-tokens balance on chain ${chainId}`) ?? {
7171
+ const decoded = scale.decodeScale(scaleCoder, change, `Failed to decode substrate-tokens balance on chain ${networkId}`) ?? {
7168
7172
  free: 0n,
7169
7173
  reserved: 0n,
7170
7174
  frozen: 0n
@@ -7189,16 +7193,13 @@ async function buildQueries(chaindataProvider, addressesByToken) {
7189
7193
  source: "substrate-tokens",
7190
7194
  status: "live",
7191
7195
  address,
7192
- multiChainId: {
7193
- subChainId: chainId
7194
- },
7195
- chainId,
7196
+ networkId,
7196
7197
  tokenId: token.id,
7197
7198
  values: balanceValues
7198
7199
  };
7199
7200
  };
7200
7201
  return {
7201
- chainId,
7202
+ chainId: networkId,
7202
7203
  stateKey,
7203
7204
  decodeResult
7204
7205
  };
@@ -7211,7 +7212,7 @@ const defaultBalanceModules = [EvmErc20Module, EvmNativeModule, EvmUniswapV2Modu
7211
7212
  /** Pulls the latest chaindata from https://github.com/TalismanSociety/chaindata */
7212
7213
  const hydrateChaindataAndMiniMetadata = async (chaindataProvider, miniMetadataUpdater) => {
7213
7214
  // need chains to be provisioned first, or substrate balances won't fetch on first subscription
7214
- await chaindataProvider.hydrateChains();
7215
+ await chaindataProvider.hydrate();
7215
7216
  await Promise.all([miniMetadataUpdater.hydrateFromChaindata(), miniMetadataUpdater.hydrateCustomChains()]);
7216
7217
  const chains = await chaindataProvider.chains();
7217
7218
  const {
@@ -7229,7 +7230,7 @@ const updateCustomMiniMetadata = async (chaindataProvider, miniMetadataUpdater)
7229
7230
 
7230
7231
  /** Fetches any missing Evm Tokens */
7231
7232
  const updateEvmTokens = async (chaindataProvider, evmTokenFetcher) => {
7232
- await chaindataProvider.hydrateEvmNetworks();
7233
+ await chaindataProvider.hydrate();
7233
7234
  const evmNetworkIds = await chaindataProvider.evmNetworkIds();
7234
7235
  await evmTokenFetcher.update(evmNetworkIds);
7235
7236
  };
@@ -7275,9 +7276,6 @@ exports.deriveMiniMetadataId = deriveMiniMetadataId;
7275
7276
  exports.detectTransferMethod = detectTransferMethod;
7276
7277
  exports.erc20Abi = erc20Abi;
7277
7278
  exports.erc20BalancesAggregatorAbi = erc20BalancesAggregatorAbi;
7278
- exports.evmErc20TokenId = evmErc20TokenId;
7279
- exports.evmNativeTokenId = evmNativeTokenId;
7280
- exports.evmUniswapV2TokenId = evmUniswapV2TokenId;
7281
7279
  exports.excludeFromFeePayableLocks = excludeFromFeePayableLocks;
7282
7280
  exports.excludeFromTransferableAmount = excludeFromTransferableAmount;
7283
7281
  exports.filterBaseLocks = filterBaseLocks;
@@ -7290,11 +7288,6 @@ exports.getValueId = getValueId;
7290
7288
  exports.hydrateChaindataAndMiniMetadata = hydrateChaindataAndMiniMetadata;
7291
7289
  exports.includeInTotalExtraAmount = includeInTotalExtraAmount;
7292
7290
  exports.makeContractCaller = makeContractCaller;
7293
- exports.subAssetTokenId = subAssetTokenId;
7294
- exports.subForeignAssetTokenId = subForeignAssetTokenId;
7295
- exports.subNativeTokenId = subNativeTokenId;
7296
- exports.subPsp22TokenId = subPsp22TokenId;
7297
- exports.subTokensTokenId = subTokensTokenId;
7298
7291
  exports.uniswapV2PairAbi = uniswapV2PairAbi;
7299
7292
  exports.updateCustomMiniMetadata = updateCustomMiniMetadata;
7300
7293
  exports.updateEvmTokens = updateEvmTokens;