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

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.
Files changed (24) hide show
  1. package/dist/declarations/src/EvmTokenFetcher.d.ts +2 -2
  2. package/dist/declarations/src/MiniMetadataUpdater.d.ts +3 -3
  3. package/dist/declarations/src/libVersion.d.ts +1 -0
  4. package/dist/declarations/src/modules/EvmErc20Module.d.ts +4 -7
  5. package/dist/declarations/src/modules/EvmNativeModule.d.ts +4 -7
  6. package/dist/declarations/src/modules/EvmUniswapV2Module.d.ts +4 -7
  7. package/dist/declarations/src/modules/SubstrateAssetsModule.d.ts +2 -5
  8. package/dist/declarations/src/modules/SubstrateForeignAssetsModule.d.ts +2 -5
  9. package/dist/declarations/src/modules/SubstrateNativeModule/index.d.ts +0 -1
  10. package/dist/declarations/src/modules/SubstrateNativeModule/types.d.ts +2 -3
  11. package/dist/declarations/src/modules/SubstrateNativeModule/util/balanceLockTypes.d.ts +2 -4
  12. package/dist/declarations/src/modules/SubstrateNativeModule/util/buildQueries.d.ts +2 -2
  13. package/dist/declarations/src/modules/SubstratePsp22Module.d.ts +4 -7
  14. package/dist/declarations/src/modules/SubstrateTokensModule.d.ts +2 -5
  15. package/dist/declarations/src/modules/index.d.ts +1 -207
  16. package/dist/declarations/src/modules/util/buildStorageCoders.d.ts +3 -3
  17. package/dist/declarations/src/modules/util/findChainMeta.d.ts +2 -2
  18. package/dist/declarations/src/types/balances.d.ts +7 -145
  19. package/dist/declarations/src/types/balancetypes.d.ts +6 -16
  20. package/dist/declarations/src/types/minimetadatas.d.ts +4 -13
  21. package/dist/talismn-balances.cjs.dev.js +400 -405
  22. package/dist/talismn-balances.cjs.prod.js +400 -405
  23. package/dist/talismn-balances.esm.js +398 -395
  24. package/package.json +6 -7
@@ -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-20250617025844"};
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,12 +1608,12 @@ 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,
1616
+ //isTestnet,
1545
1617
  isDefault: tokenConfig.isDefault ?? true,
1546
1618
  symbol,
1547
1619
  decimals,
@@ -1572,7 +1644,7 @@ const EvmErc20Module = hydrate => {
1572
1644
  const subscriptionInterval = 6_000; // 6_000ms == 6 seconds
1573
1645
  const initDelay = 1_500; // 1_500ms == 1.5 seconds
1574
1646
  const initialisingBalances = new Set();
1575
- const positiveBalanceNetworks = new Set(initialBalances?.map(b => b.evmNetworkId));
1647
+ const positiveBalanceNetworks = new Set(initialBalances?.map(b => b.networkId));
1576
1648
  const tokens = await getModuleTokens();
1577
1649
 
1578
1650
  // for chains with a zero balance we only call fetchBalances once every 5 subscriptionIntervals
@@ -1709,20 +1781,18 @@ const fetchBalances$3 = async (evmChainConnector, tokenAddressesByNetwork, erc20
1709
1781
  results: [],
1710
1782
  errors: []
1711
1783
  };
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]);
1784
+ await Promise.all(Object.entries(tokenAddressesByNetwork).map(async ([networkId, networkParams]) => {
1785
+ const publicClient = await evmChainConnector.getPublicClientForEvmNetwork(networkId);
1786
+ if (!publicClient) throw new EvmErc20NetworkError(`Could not get rpc provider for evm network ${networkId}`, networkId);
1787
+ const balances = await getEvmTokenBalances(publicClient, networkParams, result.errors, erc20Aggregators[networkId]);
1716
1788
 
1717
1789
  // consider only non null balances in the results
1718
1790
  result.results.push(...balances.filter(util.isTruthy).map((free, i) => ({
1719
1791
  source: "evm-erc20",
1720
1792
  status: "live",
1721
1793
  address: networkParams[i].address,
1722
- multiChainId: {
1723
- evmChainId: evmNetworkId
1724
- },
1725
- evmNetworkId,
1794
+ // multiChainId: { evmChainId: evmNetworkId },
1795
+ networkId,
1726
1796
  tokenId: networkParams[i].token.id,
1727
1797
  value: free
1728
1798
  })));
@@ -1807,9 +1877,12 @@ function groupAddressesByTokenByEvmNetwork$1(addressesByToken, tokens) {
1807
1877
  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
1878
 
1809
1879
  const moduleType$6 = "evm-native";
1810
- const evmNativeTokenId = chainId => `${chainId}-evm-native`.toLowerCase().replace(/ /g, "-");
1880
+
1881
+ // export const evmNativeTokenId = (chainId: EvmNetworkId) =>
1882
+ // `${chainId}-evm-native`.toLowerCase().replace(/ /g, "-")
1883
+
1811
1884
  const getEvmNetworkIdFromTokenId = tokenId => {
1812
- const evmNetworkId = tokenId.split("-")[0];
1885
+ const evmNetworkId = tokenId.split(":")[0];
1813
1886
  if (!evmNetworkId) throw new Error(`Can't detect chainId for token ${tokenId}`);
1814
1887
  return evmNetworkId;
1815
1888
  };
@@ -1830,35 +1903,31 @@ const EvmNativeModule = hydrate => {
1830
1903
  * This method is currently executed on [a squid](https://github.com/TalismanSociety/chaindata-squid/blob/0ee02818bf5caa7362e3f3664e55ef05ec8df078/src/steps/updateEvmNetworksFromGithub.ts#L280-L284).
1831
1904
  * 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
1905
  */
1833
- async fetchEvmChainMeta(chainId) {
1834
- const isTestnet = (await chaindataProvider$1.evmNetworkById(chainId))?.isTestnet || false;
1835
- return {
1836
- isTestnet
1837
- };
1906
+ async fetchEvmChainMeta(_chainId) {
1907
+ // const isTestnet = (await chaindataProvider.evmNetworkById(chainId))?.isTestnet || false
1908
+
1909
+ // return { isTestnet }
1910
+ return undefined;
1838
1911
  },
1839
1912
  /**
1840
1913
  * This method is currently executed on [a squid](https://github.com/TalismanSociety/chaindata-squid/blob/0ee02818bf5caa7362e3f3664e55ef05ec8df078/src/steps/updateEvmNetworksFromGithub.ts#L338-L343).
1841
1914
  * 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
1915
  */
1843
- async fetchEvmChainTokens(chainId, chainMeta, moduleConfig) {
1844
- const {
1845
- isTestnet
1846
- } = chainMeta;
1916
+ async fetchEvmChainTokens(networkId, chainMeta, moduleConfig) {
1847
1917
  const symbol = moduleConfig?.symbol ?? "ETH";
1848
1918
  const decimals = typeof moduleConfig?.decimals === "number" ? moduleConfig.decimals : 18;
1849
1919
  const name = moduleConfig?.name ?? symbol;
1850
- const id = evmNativeTokenId(chainId);
1920
+ const id = chaindataProvider.evmNativeTokenId(networkId);
1851
1921
  const nativeToken = {
1852
1922
  platform: "ethereum",
1853
1923
  id,
1854
1924
  type: "evm-native",
1855
- isTestnet,
1856
1925
  isDefault: true,
1857
1926
  symbol,
1858
1927
  decimals,
1859
1928
  name,
1860
1929
  logo: moduleConfig?.logo || chaindataProvider.githubTokenLogoUrl(id),
1861
- networkId: chainId
1930
+ networkId
1862
1931
  };
1863
1932
  if (moduleConfig?.symbol) nativeToken.symbol = moduleConfig?.symbol;
1864
1933
  if (moduleConfig?.coingeckoId) nativeToken.coingeckoId = moduleConfig?.coingeckoId;
@@ -1893,7 +1962,7 @@ const EvmNativeModule = hydrate => {
1893
1962
  // setup initialising balances for all active evm networks
1894
1963
  const activeEvmNetworkIds = Object.keys(ethAddressesByToken).map(getEvmNetworkIdFromTokenId);
1895
1964
  const initialisingBalances = new Set(activeEvmNetworkIds);
1896
- const positiveBalanceNetworks = new Set(initialBalances?.map(b => b.evmNetworkId));
1965
+ const positiveBalanceNetworks = new Set(initialBalances?.map(b => b.networkId));
1897
1966
  const poll = async () => {
1898
1967
  if (!subscriptionActive) return;
1899
1968
  zeroBalanceSubscriptionIntervalCounter = (zeroBalanceSubscriptionIntervalCounter + 1) % 5;
@@ -1920,10 +1989,10 @@ const EvmNativeModule = hydrate => {
1920
1989
  log.error(balance.message, balance.networkId);
1921
1990
  initialisingBalances.delete(balance.networkId);
1922
1991
  } else {
1923
- if (balance.evmNetworkId) {
1924
- initialisingBalances.delete(balance.evmNetworkId);
1992
+ if (balance.networkId) {
1993
+ initialisingBalances.delete(balance.networkId);
1925
1994
  if (BigInt(balance.value) > 0n) {
1926
- positiveBalanceNetworks.add(balance.evmNetworkId);
1995
+ positiveBalanceNetworks.add(balance.networkId);
1927
1996
  }
1928
1997
  resultBalances.push(balance);
1929
1998
  }
@@ -1973,23 +2042,23 @@ const fetchBalances$2 = async (evmChainConnector, addressesByToken, tokens) => {
1973
2042
  if (!evmChainConnector) throw new Error(`This module requires an evm chain connector`);
1974
2043
  return Promise.all(Object.entries(addressesByToken).map(async ([tokenId, addresses]) => {
1975
2044
  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}`);
2045
+ const networkId = token.networkId;
2046
+ if (!networkId) throw new Error(`Token ${token.id} has no evm network`);
2047
+ const publicClient = await evmChainConnector.getPublicClientForEvmNetwork(networkId);
2048
+ if (!publicClient) throw new Error(`Could not get rpc provider for evm network ${networkId}`);
1980
2049
 
1981
2050
  // fetch all balances
1982
2051
  const freeBalances = await getFreeBalances(publicClient, addresses);
1983
2052
  const balanceResults = addresses.map((address, i) => {
1984
- if (freeBalances[i] === "error") return new EvmNativeBalanceError("Could not fetch balance ", evmNetworkId);
2053
+ if (freeBalances[i] === "error") return new EvmNativeBalanceError("Could not fetch balance ", networkId);
1985
2054
  return {
1986
2055
  source: "evm-native",
1987
2056
  status: "live",
1988
2057
  address: address,
1989
2058
  multiChainId: {
1990
- evmChainId: evmNetworkId
2059
+ evmChainId: networkId
1991
2060
  },
1992
- evmNetworkId,
2061
+ networkId,
1993
2062
  tokenId,
1994
2063
  value: freeBalances[i].toString()
1995
2064
  };
@@ -2611,7 +2680,6 @@ const uniswapV2PairAbi = [{
2611
2680
  }];
2612
2681
 
2613
2682
  const moduleType$5 = "evm-uniswapv2";
2614
- const evmUniswapV2TokenId = (chainId, contractAddress) => `${chainId}-evm-uniswapv2-${contractAddress}`.toLowerCase();
2615
2683
  const EvmUniswapV2Module = hydrate => {
2616
2684
  const {
2617
2685
  chainConnectors,
@@ -2621,16 +2689,15 @@ const EvmUniswapV2Module = hydrate => {
2621
2689
  util$1.assert(chainConnector, "This module requires an evm chain connector");
2622
2690
  return {
2623
2691
  ...DefaultBalanceModule(moduleType$5),
2624
- async fetchEvmChainMeta(chainId) {
2625
- const isTestnet = (await chaindataProvider$1.evmNetworkById(chainId))?.isTestnet || false;
2626
- return {
2627
- isTestnet
2628
- };
2692
+ async fetchEvmChainMeta(_chainId) {
2693
+ // const isTestnet = (await chaindataProvider.evmNetworkById(chainId))?.isTestnet || false
2694
+
2695
+ // return { isTestnet }
2696
+ return undefined;
2629
2697
  },
2630
- async fetchEvmChainTokens(chainId, chainMeta, moduleConfig) {
2631
- const {
2632
- isTestnet
2633
- } = chainMeta;
2698
+ async fetchEvmChainTokens(chainId, _chainMeta, moduleConfig) {
2699
+ //const { isTestnet } = chainMeta
2700
+
2634
2701
  const tokens = {};
2635
2702
  for (const tokenConfig of moduleConfig?.pools ?? []) {
2636
2703
  const {
@@ -2650,12 +2717,12 @@ const EvmUniswapV2Module = hydrate => {
2650
2717
  log.warn("ignoring token on chain %s", chainId, tokenConfig);
2651
2718
  continue;
2652
2719
  }
2653
- const id = evmUniswapV2TokenId(chainId, contractAddress);
2720
+ const id = chaindataProvider.evmUniswapV2TokenId(chainId, contractAddress);
2654
2721
  const token = {
2655
2722
  id,
2656
2723
  type: "evm-uniswapv2",
2657
2724
  platform: "ethereum",
2658
- isTestnet,
2725
+ // isTestnet,
2659
2726
  isDefault: tokenConfig.isDefault ?? false,
2660
2727
  symbol: `${symbol0 ?? "UNKNOWN"}/${symbol1 ?? "UNKNOWN"}`,
2661
2728
  name: name ?? `${symbol0 ?? "UNKNOWN"}/${symbol1 ?? "UNKNOWN"}`,
@@ -2689,9 +2756,9 @@ const EvmUniswapV2Module = hydrate => {
2689
2756
  const initDelay = 1_500; // 1_500ms == 1.5 seconds
2690
2757
 
2691
2758
  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;
2759
+ if (!b.networkId) return result;
2760
+ if (!result[b.networkId]) result[b.networkId] = {};
2761
+ result[b.networkId][getBalanceId(b)] = b;
2695
2762
  return result;
2696
2763
  }, {});
2697
2764
  const cache = new Map(Object.entries(initialBalancesByNetwork ?? {}));
@@ -2751,12 +2818,12 @@ const EvmUniswapV2Module = hydrate => {
2751
2818
  };
2752
2819
  const fetchBalances$1 = async (evmChainConnector, evmNetworks, tokens, addressesByToken) => {
2753
2820
  const addressesByTokenGroupedByEvmNetwork = groupAddressesByTokenByEvmNetwork(addressesByToken, tokens);
2754
- const balances = (await Promise.allSettled(Object.entries(addressesByTokenGroupedByEvmNetwork).map(async ([evmNetworkId, addressesByToken]) => {
2821
+ const balances = (await Promise.allSettled(Object.entries(addressesByTokenGroupedByEvmNetwork).map(async ([networkId, addressesByToken]) => {
2755
2822
  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}`);
2823
+ const evmNetwork = evmNetworks[networkId];
2824
+ if (!evmNetwork) throw new Error(`Evm network ${networkId} not found`);
2825
+ const publicClient = await evmChainConnector.getPublicClientForEvmNetwork(networkId);
2826
+ if (!publicClient) throw new Error(`Could not get rpc provider for evm network ${networkId}`);
2760
2827
  const tokensAndAddresses = Object.entries(addressesByToken).reduce((tokensAndAddresses, [tokenId, addresses]) => {
2761
2828
  const token = tokens[tokenId];
2762
2829
  if (!token) {
@@ -2778,10 +2845,7 @@ const fetchBalances$1 = async (evmChainConnector, evmNetworks, tokens, addresses
2778
2845
  source: "evm-uniswapv2",
2779
2846
  status: "live",
2780
2847
  address: address,
2781
- multiChainId: {
2782
- evmChainId: evmNetwork.id
2783
- },
2784
- evmNetworkId,
2848
+ networkId,
2785
2849
  tokenId: token.id,
2786
2850
  values: await getPoolBalance(publicClient, token.contractAddress, address)
2787
2851
  }));
@@ -2913,24 +2977,20 @@ async function balances(balanceModule, addressesByToken, callback) {
2913
2977
  */
2914
2978
  const findChainMeta = (miniMetadatas, moduleType, chain) => {
2915
2979
  if (!chain) return [undefined, undefined];
2916
- if (!chain.specName) return [undefined, undefined];
2917
2980
  if (!chain.specVersion) return [undefined, undefined];
2918
2981
 
2919
2982
  // TODO: This is spaghetti to import this here, it should be injected into each balance module or something.
2920
2983
  const metadataId = deriveMiniMetadataId({
2921
2984
  source: moduleType,
2922
2985
  chainId: chain.id,
2923
- specName: chain.specName,
2924
2986
  specVersion: chain.specVersion,
2925
- balancesConfig: JSON.stringify(chain.balancesConfig?.find(config => config.moduleType === moduleType)?.moduleConfig ?? {})
2987
+ libVersion
2926
2988
  });
2927
2989
 
2928
2990
  // TODO: Fix this (needs to fetch miniMetadata without being async)
2929
2991
  const miniMetadata = miniMetadatas.get(metadataId);
2930
2992
  const chainMeta = miniMetadata ? {
2931
- miniMetadata: miniMetadata.data,
2932
- metadataVersion: miniMetadata.version,
2933
- ...JSON.parse(miniMetadata.extra)
2993
+ miniMetadata: miniMetadata.data
2934
2994
  } : undefined;
2935
2995
  return [chainMeta, miniMetadata];
2936
2996
  };
@@ -3158,7 +3218,6 @@ const decompress = data => {
3158
3218
  };
3159
3219
 
3160
3220
  const moduleType$4 = "substrate-assets";
3161
- const subAssetTokenId = (chainId, assetId, tokenSymbol) => `${chainId}-substrate-assets-${assetId}-${tokenSymbol}`.toLowerCase().replace(/ /g, "-");
3162
3221
  const SubAssetsModule = hydrate => {
3163
3222
  const {
3164
3223
  chainConnectors,
@@ -3192,12 +3251,9 @@ const SubAssetsModule = hydrate => {
3192
3251
  async fetchSubstrateChainTokens(chainId, chainMeta, moduleConfig) {
3193
3252
  if ((moduleConfig?.tokens ?? []).length < 1) return {};
3194
3253
  const {
3195
- isTestnet,
3196
- miniMetadata,
3197
- metadataVersion
3254
+ miniMetadata
3198
3255
  } = chainMeta;
3199
- if (miniMetadata === undefined || metadataVersion === undefined) return {};
3200
- if (metadataVersion < 14) return {};
3256
+ if (!miniMetadata) return {};
3201
3257
  const metadata = scale.unifyMetadata(scale.decAnyMetadata(miniMetadata));
3202
3258
  const scaleBuilder = scale.getDynamicBuilder(scale.getLookupFn(metadata));
3203
3259
  const assetCoder = scaleBuilder.buildStorage("Assets", "Asset");
@@ -3214,12 +3270,11 @@ const SubAssetsModule = hydrate => {
3214
3270
  const symbol = assetsMetadata?.symbol?.asText?.() ?? "Unit";
3215
3271
  const decimals = assetsMetadata?.decimals ?? 0;
3216
3272
  const isFrozen = assetsMetadata?.is_frozen ?? false;
3217
- const id = subAssetTokenId(chainId, assetId, symbol);
3273
+ const id = chaindataProvider.subAssetTokenId(chainId, assetId);
3218
3274
  const token = {
3219
3275
  id,
3220
3276
  type: "substrate-assets",
3221
3277
  platform: "polkadot",
3222
- isTestnet,
3223
3278
  isDefault: tokenConfig?.isDefault ?? true,
3224
3279
  symbol,
3225
3280
  name: tokenConfig?.name || symbol,
@@ -3232,7 +3287,7 @@ const SubAssetsModule = hydrate => {
3232
3287
  };
3233
3288
  if (tokenConfig?.symbol) {
3234
3289
  token.symbol = tokenConfig?.symbol;
3235
- token.id = subAssetTokenId(chainId, assetId, token.symbol);
3290
+ token.id = chaindataProvider.subAssetTokenId(chainId, assetId);
3236
3291
  }
3237
3292
  if (tokenConfig?.coingeckoId) token.coingeckoId = tokenConfig?.coingeckoId;
3238
3293
  if (tokenConfig?.mirrorOf) token.mirrorOf = tokenConfig?.mirrorOf;
@@ -3353,27 +3408,27 @@ async function buildQueries$3(chaindataProvider, addressesByToken) {
3353
3408
  log.debug(`This module doesn't handle tokens of type ${token.type}`);
3354
3409
  return [];
3355
3410
  }
3356
- const chainId = token.networkId;
3357
- if (!chainId) {
3411
+ const networkId = token.networkId;
3412
+ if (!networkId) {
3358
3413
  log.warn(`Token ${tokenId} has no chain`);
3359
3414
  return [];
3360
3415
  }
3361
- const chain = chains[chainId];
3416
+ const chain = chains[networkId];
3362
3417
  if (!chain) {
3363
- log.warn(`Chain ${chainId} for token ${tokenId} not found`);
3418
+ log.warn(`Chain ${networkId} for token ${tokenId} not found`);
3364
3419
  return [];
3365
3420
  }
3366
3421
  return addresses.flatMap(address => {
3367
- const scaleCoder = chainStorageCoders.get(chainId)?.storage;
3422
+ const scaleCoder = chainStorageCoders.get(networkId)?.storage;
3368
3423
  const stateKey = tryEncode(scaleCoder, BigInt(token.assetId), address) ?? tryEncode(scaleCoder, token.assetId, address);
3369
3424
  if (!stateKey) {
3370
- log.warn(`Invalid assetId / address in ${chainId} storage query ${token.assetId} / ${address}`);
3425
+ log.warn(`Invalid assetId / address in ${networkId} storage query ${token.assetId} / ${address}`);
3371
3426
  return [];
3372
3427
  }
3373
3428
  const decodeResult = change => {
3374
3429
  /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */
3375
3430
 
3376
- const decoded = scale.decodeScale(scaleCoder, change, `Failed to decode substrate-assets balance on chain ${chainId}`) ?? {
3431
+ const decoded = scale.decodeScale(scaleCoder, change, `Failed to decode substrate-assets balance on chain ${networkId}`) ?? {
3377
3432
  balance: 0n,
3378
3433
  status: {
3379
3434
  type: "Liquid"
@@ -3407,16 +3462,13 @@ async function buildQueries$3(chaindataProvider, addressesByToken) {
3407
3462
  source: "substrate-assets",
3408
3463
  status: "live",
3409
3464
  address,
3410
- multiChainId: {
3411
- subChainId: chainId
3412
- },
3413
- chainId,
3465
+ networkId,
3414
3466
  tokenId: token.id,
3415
3467
  values: balanceValues
3416
3468
  };
3417
3469
  };
3418
3470
  return {
3419
- chainId,
3471
+ chainId: networkId,
3420
3472
  stateKey,
3421
3473
  decodeResult
3422
3474
  };
@@ -3436,7 +3488,6 @@ const tryEncode = (scaleCoder, ...args) => {
3436
3488
  };
3437
3489
 
3438
3490
  const moduleType$3 = "substrate-foreignassets";
3439
- const subForeignAssetTokenId = (chainId, tokenSymbol) => `${chainId}-substrate-foreignassets-${tokenSymbol}`.toLowerCase().replace(/ /g, "-");
3440
3491
  const SubForeignAssetsModule = hydrate => {
3441
3492
  const {
3442
3493
  chainConnectors,
@@ -3447,14 +3498,12 @@ const SubForeignAssetsModule = hydrate => {
3447
3498
  return {
3448
3499
  ...DefaultBalanceModule(moduleType$3),
3449
3500
  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
- };
3501
+ // const isTestnet = (await chaindataProvider.chainById(chainId))?.isTestnet || false
3502
+ if (metadataRpc === undefined) return {};
3503
+ // if ((moduleConfig?.tokens ?? []).length < 1) return { isTestnet }
3504
+
3457
3505
  const metadataVersion = scale.getMetadataVersion(metadataRpc);
3506
+ if (metadataVersion < 14) return {};
3458
3507
  const metadata = scale.decAnyMetadata(metadataRpc);
3459
3508
  scale.compactMetadata(metadata, [{
3460
3509
  pallet: "ForeignAssets",
@@ -3462,20 +3511,18 @@ const SubForeignAssetsModule = hydrate => {
3462
3511
  }]);
3463
3512
  const miniMetadata = scale.encodeMetadata(metadata);
3464
3513
  return {
3465
- isTestnet,
3466
- miniMetadata,
3467
- metadataVersion
3514
+ miniMetadata
3468
3515
  };
3469
3516
  },
3470
3517
  async fetchSubstrateChainTokens(chainId, chainMeta, moduleConfig) {
3471
3518
  if ((moduleConfig?.tokens ?? []).length < 1) return {};
3472
3519
  const {
3473
- isTestnet,
3474
- miniMetadata,
3475
- metadataVersion
3520
+ miniMetadata
3476
3521
  } = chainMeta;
3477
- if (miniMetadata === undefined || metadataVersion === undefined) return {};
3478
- if (metadataVersion < 14) return {};
3522
+ if (!miniMetadata) return {};
3523
+ // if (miniMetadata === undefined || metadataVersion === undefined) return {}
3524
+ // if (metadataVersion < 14) return {}
3525
+
3479
3526
  const metadata = scale.decAnyMetadata(miniMetadata);
3480
3527
  const unifiedMetadata = scale.unifyMetadata(metadata);
3481
3528
  const scaleBuilder = scale.getDynamicBuilder(scale.getLookupFn(unifiedMetadata));
@@ -3499,12 +3546,12 @@ const SubForeignAssetsModule = hydrate => {
3499
3546
  const symbol = assetsMetadata?.symbol?.asText?.() ?? "Unit";
3500
3547
  const decimals = assetsMetadata?.decimals ?? 0;
3501
3548
  const isFrozen = assetsMetadata?.is_frozen ?? false;
3502
- const id = subForeignAssetTokenId(chainId, symbol);
3549
+ const id = chaindataProvider.subForeignAssetTokenId(chainId, tokenConfig.onChainId);
3503
3550
  const token = {
3504
3551
  id,
3505
3552
  type: "substrate-foreignassets",
3506
3553
  platform: "polkadot",
3507
- isTestnet,
3554
+ // isTestnet,
3508
3555
  isDefault: tokenConfig?.isDefault ?? true,
3509
3556
  symbol,
3510
3557
  decimals,
@@ -3515,10 +3562,6 @@ const SubForeignAssetsModule = hydrate => {
3515
3562
  isFrozen,
3516
3563
  networkId: chainId
3517
3564
  };
3518
- if (tokenConfig?.symbol) {
3519
- token.symbol = tokenConfig?.symbol;
3520
- token.id = subForeignAssetTokenId(chainId, token.symbol);
3521
- }
3522
3565
  if (tokenConfig?.coingeckoId) token.coingeckoId = tokenConfig?.coingeckoId;
3523
3566
  if (tokenConfig?.mirrorOf) token.mirrorOf = tokenConfig?.mirrorOf;
3524
3567
  tokens[token.id] = token;
@@ -3624,18 +3667,18 @@ async function buildQueries$2(chaindataProvider, addressesByToken) {
3624
3667
  log.debug(`This module doesn't handle tokens of type ${token.type}`);
3625
3668
  return [];
3626
3669
  }
3627
- const chainId = token.networkId;
3628
- if (!chainId) {
3670
+ const networkId = token.networkId;
3671
+ if (!networkId) {
3629
3672
  log.warn(`Token ${tokenId} has no chain`);
3630
3673
  return [];
3631
3674
  }
3632
- const chain = chains[chainId];
3675
+ const chain = chains[networkId];
3633
3676
  if (!chain) {
3634
- log.warn(`Chain ${chainId} for token ${tokenId} not found`);
3677
+ log.warn(`Chain ${networkId} for token ${tokenId} not found`);
3635
3678
  return [];
3636
3679
  }
3637
3680
  return addresses.flatMap(address => {
3638
- const scaleCoder = chainStorageCoders.get(chainId)?.storage;
3681
+ const scaleCoder = chainStorageCoders.get(networkId)?.storage;
3639
3682
  const onChainId = (() => {
3640
3683
  try {
3641
3684
  return scale.papiParse(token.onChainId);
@@ -3643,12 +3686,12 @@ async function buildQueries$2(chaindataProvider, addressesByToken) {
3643
3686
  return token.onChainId;
3644
3687
  }
3645
3688
  })();
3646
- const stateKey = scale.encodeStateKey(scaleCoder, `Invalid address / token onChainId in ${chainId} storage query ${address} / ${token.onChainId}`, onChainId, address);
3689
+ const stateKey = scale.encodeStateKey(scaleCoder, `Invalid address / token onChainId in ${networkId} storage query ${address} / ${token.onChainId}`, onChainId, address);
3647
3690
  if (!stateKey) return [];
3648
3691
  const decodeResult = change => {
3649
3692
  /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */
3650
3693
 
3651
- const decoded = scale.decodeScale(scaleCoder, change, `Failed to decode substrate-foreignassets balance on chain ${chainId}`) ?? {
3694
+ const decoded = scale.decodeScale(scaleCoder, change, `Failed to decode substrate-foreignassets balance on chain ${networkId}`) ?? {
3652
3695
  balance: 0n,
3653
3696
  status: {
3654
3697
  type: "Liquid"
@@ -3682,16 +3725,13 @@ async function buildQueries$2(chaindataProvider, addressesByToken) {
3682
3725
  source: "substrate-foreignassets",
3683
3726
  status: "live",
3684
3727
  address,
3685
- multiChainId: {
3686
- subChainId: chainId
3687
- },
3688
- chainId,
3728
+ networkId,
3689
3729
  tokenId: token.id,
3690
3730
  values: balanceValues
3691
3731
  };
3692
3732
  };
3693
3733
  return {
3694
- chainId,
3734
+ chainId: networkId,
3695
3735
  stateKey,
3696
3736
  decodeResult
3697
3737
  };
@@ -3948,10 +3988,7 @@ async function subscribeCrowdloans(chaindataProvider, chainConnector, addressesB
3948
3988
  source: "substrate-native",
3949
3989
  status: "live",
3950
3990
  address,
3951
- multiChainId: {
3952
- subChainId: chainId
3953
- },
3954
- chainId,
3991
+ networkId: chainId,
3955
3992
  tokenId,
3956
3993
  values: Array.from(contributions).map(({
3957
3994
  amount,
@@ -4234,10 +4271,7 @@ async function subscribeNompoolStaking(chaindataProvider, chainConnector, addres
4234
4271
  source: "substrate-native",
4235
4272
  status: "live",
4236
4273
  address,
4237
- multiChainId: {
4238
- subChainId: chainId
4239
- },
4240
- chainId,
4274
+ networkId: chainId,
4241
4275
  tokenId,
4242
4276
  values: [{
4243
4277
  source: "nompools-staking",
@@ -4481,10 +4515,7 @@ async function subscribeSubtensorStaking(chaindataProvider, chainConnector, addr
4481
4515
  source: "substrate-native",
4482
4516
  status: "live",
4483
4517
  address,
4484
- multiChainId: {
4485
- subChainId: chainId
4486
- },
4487
- chainId,
4518
+ networkId: chainId,
4488
4519
  tokenId,
4489
4520
  values: [{
4490
4521
  source: "subtensor-staking",
@@ -4584,17 +4615,22 @@ const filterBaseLocks = locks => {
4584
4615
  };
4585
4616
 
4586
4617
  // TODO: Make these titles translatable
4587
- const getLockTitle = (lock, {
4588
- balance
4589
- } = {}) => {
4618
+ const getLockTitle = (lock
4619
+ // {
4620
+ // // balance
4621
+ // }: { balance?: Balance } = {},
4622
+ ) => {
4590
4623
  if (!lock.label) return lock.label;
4591
4624
  if (lock.label === "democracy") return "Governance";
4592
4625
  if (lock.label === "crowdloan") {
4593
4626
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
4594
4627
  const paraId = lock.meta?.paraId;
4595
4628
  if (!paraId) return "Crowdloan";
4596
- const name = balance?.chain?.parathreads?.find(parathread => parathread?.paraId === paraId)?.name;
4597
- return `${name ? name : `Parachain ${paraId}`} Crowdloan`;
4629
+ // balance?.network?.parathreads?.find(
4630
+ // (parathread) => parathread?.paraId === paraId,
4631
+ // )?.name
4632
+
4633
+ return `${`Parachain ${paraId}`} Crowdloan`;
4598
4634
  }
4599
4635
  if (lock.label === "nompools-staking") return "Pooled Staking";
4600
4636
  if (lock.label === "nompools-unbonding") return "Pooled Staking";
@@ -4607,7 +4643,9 @@ const getLockTitle = (lock, {
4607
4643
  };
4608
4644
 
4609
4645
  const moduleType$2 = "substrate-native";
4610
- const subNativeTokenId = chainId => `${chainId}-substrate-native`.toLowerCase().replace(/ /g, "-");
4646
+
4647
+ // export const subNativeTokenId = (chainId: ChainId) =>
4648
+ // `${chainId}-substrate-native`.toLowerCase().replace(/ /g, "-")
4611
4649
 
4612
4650
  /**
4613
4651
  * Function to merge two 'sub sources' of the same balance together, or
@@ -4706,10 +4744,7 @@ async function buildQueries$1(chains, tokens, chainStorageCoders, miniMetadatas,
4706
4744
  source: "substrate-native",
4707
4745
  status: "live",
4708
4746
  address,
4709
- multiChainId: {
4710
- subChainId: chainId
4711
- },
4712
- chainId,
4747
+ networkId: chainId,
4713
4748
  tokenId,
4714
4749
  values: []
4715
4750
  };
@@ -5242,7 +5277,7 @@ const SubNativeModule = hydrate => {
5242
5277
  decimals,
5243
5278
  existentialDeposit
5244
5279
  } = chainMeta;
5245
- const id = subNativeTokenId(chainId);
5280
+ const id = chaindataProvider.subNativeTokenId(chainId);
5246
5281
  const nativeToken = {
5247
5282
  id,
5248
5283
  type: "substrate-native",
@@ -6645,7 +6680,6 @@ var psp22Abi = {
6645
6680
  };
6646
6681
 
6647
6682
  const moduleType$1 = "substrate-psp22";
6648
- const subPsp22TokenId = (chainId, tokenSymbol) => `${chainId}-substrate-psp22-${tokenSymbol}`.toLowerCase().replace(/ /g, "-");
6649
6683
  const SubPsp22Module = hydrate => {
6650
6684
  const {
6651
6685
  chainConnectors,
@@ -6655,16 +6689,14 @@ const SubPsp22Module = hydrate => {
6655
6689
  util$1.assert(chainConnector, "This module requires a substrate chain connector");
6656
6690
  return {
6657
6691
  ...DefaultBalanceModule(moduleType$1),
6658
- async fetchSubstrateChainMeta(chainId) {
6659
- const isTestnet = (await chaindataProvider$1.chainById(chainId))?.isTestnet || false;
6660
- return {
6661
- isTestnet
6662
- };
6692
+ async fetchSubstrateChainMeta(_chainId) {
6693
+ // const isTestnet = (await chaindataProvider.chainById(chainId))?.isTestnet || false
6694
+ // return { isTestnet }
6695
+ return undefined;
6663
6696
  },
6664
- async fetchSubstrateChainTokens(chainId, chainMeta, moduleConfig) {
6665
- const {
6666
- isTestnet
6667
- } = chainMeta;
6697
+ async fetchSubstrateChainTokens(chainId, _chainMeta, moduleConfig) {
6698
+ // const { isTestnet } = chainMeta
6699
+
6668
6700
  const registry = new types.TypeRegistry();
6669
6701
  const Psp22Abi = new apiContract.Abi(psp22Abi);
6670
6702
 
@@ -6695,12 +6727,12 @@ const SubPsp22Module = hydrate => {
6695
6727
  const decimalsData = decimalsResult.toJSON()?.result?.ok?.data;
6696
6728
  decimals = typeof decimalsData === "string" && decimalsData.startsWith("0x") ? util$1.hexToNumber(decimalsData) : decimals;
6697
6729
  })();
6698
- const id = subPsp22TokenId(chainId, symbol);
6730
+ const id = chaindataProvider.subPsp22TokenId(chainId, contractAddress);
6699
6731
  const token = {
6700
6732
  id,
6701
6733
  type: "substrate-psp22",
6702
6734
  platform: "polkadot",
6703
- isTestnet,
6735
+ // isTestnet,
6704
6736
  isDefault: tokenConfig.isDefault ?? true,
6705
6737
  symbol,
6706
6738
  decimals,
@@ -6710,10 +6742,6 @@ const SubPsp22Module = hydrate => {
6710
6742
  contractAddress,
6711
6743
  networkId: chainId
6712
6744
  };
6713
- if (tokenConfig?.symbol) {
6714
- token.symbol = tokenConfig?.symbol;
6715
- token.id = subPsp22TokenId(chainId, token.symbol);
6716
- }
6717
6745
  if (tokenConfig?.coingeckoId) token.coingeckoId = tokenConfig?.coingeckoId;
6718
6746
  if (tokenConfig?.mirrorOf) token.mirrorOf = tokenConfig?.mirrorOf;
6719
6747
  tokens[token.id] = token;
@@ -6874,10 +6902,7 @@ const fetchBalances = async (chainConnector, tokens, addressesByToken) => {
6874
6902
  source: "substrate-psp22",
6875
6903
  status: "live",
6876
6904
  address,
6877
- multiChainId: {
6878
- subChainId: token.networkId
6879
- },
6880
- chainId: token.networkId,
6905
+ networkId: token.networkId,
6881
6906
  tokenId,
6882
6907
  value: balance
6883
6908
  };
@@ -6901,7 +6926,6 @@ const fetchBalances = async (chainConnector, tokens, addressesByToken) => {
6901
6926
 
6902
6927
  const moduleType = "substrate-tokens";
6903
6928
  const defaultPalletId = "Tokens";
6904
- const subTokensTokenId = (chainId, onChainId) => `${chainId}-substrate-tokens-${lzString.compressToEncodedURIComponent(String(onChainId))}`;
6905
6929
  const SubTokensModule = hydrate => {
6906
6930
  const {
6907
6931
  chainConnectors,
@@ -6912,14 +6936,8 @@ const SubTokensModule = hydrate => {
6912
6936
  return {
6913
6937
  ...DefaultBalanceModule(moduleType),
6914
6938
  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);
6939
+ if (metadataRpc === undefined) return {};
6940
+ if ((moduleConfig?.tokens ?? []).length < 1) return {};
6923
6941
  const metadata = scale.decAnyMetadata(metadataRpc);
6924
6942
  const palletId = moduleConfig?.palletId ?? defaultPalletId;
6925
6943
  scale.compactMetadata(metadata, [{
@@ -6928,20 +6946,13 @@ const SubTokensModule = hydrate => {
6928
6946
  }]);
6929
6947
  const miniMetadata = scale.encodeMetadata(metadata);
6930
6948
  return palletId === defaultPalletId ? {
6931
- isTestnet,
6932
- miniMetadata,
6933
- metadataVersion
6949
+ miniMetadata
6934
6950
  } : {
6935
- isTestnet,
6936
6951
  palletId,
6937
- miniMetadata,
6938
- metadataVersion
6952
+ miniMetadata
6939
6953
  };
6940
6954
  },
6941
6955
  async fetchSubstrateChainTokens(chainId, chainMeta, moduleConfig) {
6942
- const {
6943
- isTestnet
6944
- } = chainMeta;
6945
6956
  const tokens = {};
6946
6957
  for (const tokenConfig of moduleConfig?.tokens ?? []) {
6947
6958
  try {
@@ -6950,12 +6961,11 @@ const SubTokensModule = hydrate => {
6950
6961
  const existentialDeposit = tokenConfig?.ed ?? "0";
6951
6962
  const onChainId = tokenConfig?.onChainId ?? undefined;
6952
6963
  if (onChainId === undefined) continue;
6953
- const id = subTokensTokenId(chainId, onChainId);
6964
+ const id = chaindataProvider.subTokensTokenId(chainId, onChainId);
6954
6965
  const token = {
6955
6966
  id,
6956
6967
  type: "substrate-tokens",
6957
6968
  platform: "polkadot",
6958
- isTestnet,
6959
6969
  isDefault: tokenConfig.isDefault ?? true,
6960
6970
  symbol,
6961
6971
  decimals,
@@ -6965,10 +6975,6 @@ const SubTokensModule = hydrate => {
6965
6975
  onChainId,
6966
6976
  networkId: chainId
6967
6977
  };
6968
- if (tokenConfig?.symbol) {
6969
- token.symbol = tokenConfig?.symbol;
6970
- token.id = subTokensTokenId(chainId, token.onChainId);
6971
- }
6972
6978
  if (tokenConfig?.coingeckoId) token.coingeckoId = tokenConfig?.coingeckoId;
6973
6979
  if (tokenConfig?.mirrorOf) token.mirrorOf = tokenConfig?.mirrorOf;
6974
6980
  tokens[token.id] = token;
@@ -7140,18 +7146,18 @@ async function buildQueries(chaindataProvider, addressesByToken) {
7140
7146
  log.debug(`This module doesn't handle tokens of type ${token.type}`);
7141
7147
  return [];
7142
7148
  }
7143
- const chainId = token.networkId;
7144
- if (!chainId) {
7149
+ const networkId = token.networkId;
7150
+ if (!networkId) {
7145
7151
  log.warn(`Token ${tokenId} has no chain`);
7146
7152
  return [];
7147
7153
  }
7148
- const chain = chains[chainId];
7154
+ const chain = chains[networkId];
7149
7155
  if (!chain) {
7150
- log.warn(`Chain ${chainId} for token ${tokenId} not found`);
7156
+ log.warn(`Chain ${networkId} for token ${tokenId} not found`);
7151
7157
  return [];
7152
7158
  }
7153
7159
  return addresses.flatMap(address => {
7154
- const scaleCoder = chainStorageCoders.get(chainId)?.storage;
7160
+ const scaleCoder = chainStorageCoders.get(networkId)?.storage;
7155
7161
  const onChainId = (() => {
7156
7162
  try {
7157
7163
  return scale.papiParse(token.onChainId);
@@ -7159,12 +7165,12 @@ async function buildQueries(chaindataProvider, addressesByToken) {
7159
7165
  return token.onChainId;
7160
7166
  }
7161
7167
  })();
7162
- const stateKey = scale.encodeStateKey(scaleCoder, `Invalid address / token onChainId in ${chainId} storage query ${address} / ${token.onChainId}`, address, onChainId);
7168
+ const stateKey = scale.encodeStateKey(scaleCoder, `Invalid address / token onChainId in ${networkId} storage query ${address} / ${token.onChainId}`, address, onChainId);
7163
7169
  if (!stateKey) return [];
7164
7170
  const decodeResult = change => {
7165
7171
  /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */
7166
7172
 
7167
- const decoded = scale.decodeScale(scaleCoder, change, `Failed to decode substrate-tokens balance on chain ${chainId}`) ?? {
7173
+ const decoded = scale.decodeScale(scaleCoder, change, `Failed to decode substrate-tokens balance on chain ${networkId}`) ?? {
7168
7174
  free: 0n,
7169
7175
  reserved: 0n,
7170
7176
  frozen: 0n
@@ -7189,16 +7195,13 @@ async function buildQueries(chaindataProvider, addressesByToken) {
7189
7195
  source: "substrate-tokens",
7190
7196
  status: "live",
7191
7197
  address,
7192
- multiChainId: {
7193
- subChainId: chainId
7194
- },
7195
- chainId,
7198
+ networkId,
7196
7199
  tokenId: token.id,
7197
7200
  values: balanceValues
7198
7201
  };
7199
7202
  };
7200
7203
  return {
7201
- chainId,
7204
+ chainId: networkId,
7202
7205
  stateKey,
7203
7206
  decodeResult
7204
7207
  };
@@ -7211,7 +7214,7 @@ const defaultBalanceModules = [EvmErc20Module, EvmNativeModule, EvmUniswapV2Modu
7211
7214
  /** Pulls the latest chaindata from https://github.com/TalismanSociety/chaindata */
7212
7215
  const hydrateChaindataAndMiniMetadata = async (chaindataProvider, miniMetadataUpdater) => {
7213
7216
  // need chains to be provisioned first, or substrate balances won't fetch on first subscription
7214
- await chaindataProvider.hydrateChains();
7217
+ await chaindataProvider.hydrate();
7215
7218
  await Promise.all([miniMetadataUpdater.hydrateFromChaindata(), miniMetadataUpdater.hydrateCustomChains()]);
7216
7219
  const chains = await chaindataProvider.chains();
7217
7220
  const {
@@ -7229,7 +7232,7 @@ const updateCustomMiniMetadata = async (chaindataProvider, miniMetadataUpdater)
7229
7232
 
7230
7233
  /** Fetches any missing Evm Tokens */
7231
7234
  const updateEvmTokens = async (chaindataProvider, evmTokenFetcher) => {
7232
- await chaindataProvider.hydrateEvmNetworks();
7235
+ await chaindataProvider.hydrate();
7233
7236
  const evmNetworkIds = await chaindataProvider.evmNetworkIds();
7234
7237
  await evmTokenFetcher.update(evmNetworkIds);
7235
7238
  };
@@ -7275,9 +7278,6 @@ exports.deriveMiniMetadataId = deriveMiniMetadataId;
7275
7278
  exports.detectTransferMethod = detectTransferMethod;
7276
7279
  exports.erc20Abi = erc20Abi;
7277
7280
  exports.erc20BalancesAggregatorAbi = erc20BalancesAggregatorAbi;
7278
- exports.evmErc20TokenId = evmErc20TokenId;
7279
- exports.evmNativeTokenId = evmNativeTokenId;
7280
- exports.evmUniswapV2TokenId = evmUniswapV2TokenId;
7281
7281
  exports.excludeFromFeePayableLocks = excludeFromFeePayableLocks;
7282
7282
  exports.excludeFromTransferableAmount = excludeFromTransferableAmount;
7283
7283
  exports.filterBaseLocks = filterBaseLocks;
@@ -7290,11 +7290,6 @@ exports.getValueId = getValueId;
7290
7290
  exports.hydrateChaindataAndMiniMetadata = hydrateChaindataAndMiniMetadata;
7291
7291
  exports.includeInTotalExtraAmount = includeInTotalExtraAmount;
7292
7292
  exports.makeContractCaller = makeContractCaller;
7293
- exports.subAssetTokenId = subAssetTokenId;
7294
- exports.subForeignAssetTokenId = subForeignAssetTokenId;
7295
- exports.subNativeTokenId = subNativeTokenId;
7296
- exports.subPsp22TokenId = subPsp22TokenId;
7297
- exports.subTokensTokenId = subTokensTokenId;
7298
7293
  exports.uniswapV2PairAbi = uniswapV2PairAbi;
7299
7294
  exports.updateCustomMiniMetadata = updateCustomMiniMetadata;
7300
7295
  exports.updateEvmTokens = updateEvmTokens;