@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.
- package/dist/declarations/src/EvmTokenFetcher.d.ts +2 -2
- package/dist/declarations/src/MiniMetadataUpdater.d.ts +3 -3
- package/dist/declarations/src/libVersion.d.ts +1 -0
- package/dist/declarations/src/modules/EvmErc20Module.d.ts +4 -7
- package/dist/declarations/src/modules/EvmNativeModule.d.ts +4 -7
- package/dist/declarations/src/modules/EvmUniswapV2Module.d.ts +4 -7
- package/dist/declarations/src/modules/SubstrateAssetsModule.d.ts +2 -5
- package/dist/declarations/src/modules/SubstrateForeignAssetsModule.d.ts +2 -5
- package/dist/declarations/src/modules/SubstrateNativeModule/index.d.ts +0 -1
- package/dist/declarations/src/modules/SubstrateNativeModule/types.d.ts +2 -3
- package/dist/declarations/src/modules/SubstrateNativeModule/util/balanceLockTypes.d.ts +2 -4
- package/dist/declarations/src/modules/SubstrateNativeModule/util/buildQueries.d.ts +2 -2
- package/dist/declarations/src/modules/SubstratePsp22Module.d.ts +4 -7
- package/dist/declarations/src/modules/SubstrateTokensModule.d.ts +2 -5
- package/dist/declarations/src/modules/index.d.ts +1 -207
- package/dist/declarations/src/modules/util/buildStorageCoders.d.ts +3 -3
- package/dist/declarations/src/modules/util/findChainMeta.d.ts +2 -2
- package/dist/declarations/src/types/balances.d.ts +7 -145
- package/dist/declarations/src/types/balancetypes.d.ts +6 -16
- package/dist/declarations/src/types/minimetadatas.d.ts +4 -13
- package/dist/talismn-balances.cjs.dev.js +400 -405
- package/dist/talismn-balances.cjs.prod.js +400 -405
- package/dist/talismn-balances.esm.js +398 -395
- 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(
|
85
|
-
|
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
|
-
|
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,
|
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
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
get
|
402
|
-
|
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
|
405
|
-
return this.#db?.
|
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" &&
|
425
|
-
|
426
|
-
|
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
|
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
|
-
|
920
|
-
}) => util$1.u8aToHex(utilCrypto.xxhashAsU8a(new TextEncoder().encode(`${source}${chainId}${
|
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
|
1076
|
-
|
1077
|
-
|
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
|
-
|
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
|
-
|
1117
|
-
|
1118
|
-
|
1119
|
-
const
|
1120
|
-
const
|
1121
|
-
|
1122
|
-
|
1123
|
-
|
1124
|
-
|
1125
|
-
|
1126
|
-
|
1127
|
-
|
1128
|
-
|
1129
|
-
|
1130
|
-
|
1131
|
-
|
1132
|
-
|
1133
|
-
|
1134
|
-
|
1135
|
-
|
1136
|
-
|
1137
|
-
|
1138
|
-
|
1139
|
-
|
1140
|
-
|
1141
|
-
|
1142
|
-
|
1143
|
-
|
1144
|
-
|
1145
|
-
|
1146
|
-
|
1147
|
-
|
1148
|
-
|
1149
|
-
|
1150
|
-
|
1151
|
-
|
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(
|
1154
|
-
const chains = new Map(
|
1155
|
-
|
1156
|
-
|
1157
|
-
const
|
1158
|
-
|
1159
|
-
|
1160
|
-
|
1161
|
-
|
1162
|
-
//
|
1163
|
-
|
1164
|
-
const
|
1165
|
-
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1169
|
-
}
|
1170
|
-
const needUpdates = Array.from(statusesByChain.entries())
|
1171
|
-
|
1172
|
-
|
1173
|
-
|
1174
|
-
|
1175
|
-
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1183
|
-
|
1184
|
-
|
1185
|
-
|
1186
|
-
|
1187
|
-
|
1188
|
-
|
1189
|
-
|
1190
|
-
|
1191
|
-
|
1192
|
-
|
1193
|
-
|
1194
|
-
|
1195
|
-
|
1196
|
-
|
1197
|
-
|
1198
|
-
|
1199
|
-
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
1203
|
-
|
1204
|
-
|
1205
|
-
|
1206
|
-
|
1207
|
-
|
1208
|
-
|
1209
|
-
|
1210
|
-
|
1211
|
-
|
1212
|
-
|
1213
|
-
|
1214
|
-
|
1215
|
-
|
1216
|
-
|
1217
|
-
|
1218
|
-
|
1219
|
-
|
1220
|
-
|
1221
|
-
|
1222
|
-
|
1223
|
-
|
1224
|
-
|
1225
|
-
|
1226
|
-
|
1227
|
-
|
1228
|
-
|
1229
|
-
|
1230
|
-
|
1231
|
-
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1235
|
-
|
1236
|
-
|
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.
|
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(
|
1508
|
-
|
1509
|
-
|
1510
|
-
|
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,
|
1518
|
-
const {
|
1519
|
-
|
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.
|
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 ([
|
1713
|
-
const publicClient = await evmChainConnector.getPublicClientForEvmNetwork(
|
1714
|
-
if (!publicClient) throw new EvmErc20NetworkError(`Could not get rpc provider for evm network ${
|
1715
|
-
const balances = await getEvmTokenBalances(publicClient, networkParams, result.errors, erc20Aggregators[
|
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
|
-
|
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
|
-
|
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("
|
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(
|
1834
|
-
const isTestnet = (await chaindataProvider
|
1835
|
-
|
1836
|
-
|
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(
|
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(
|
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
|
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.
|
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.
|
1924
|
-
initialisingBalances.delete(balance.
|
1992
|
+
if (balance.networkId) {
|
1993
|
+
initialisingBalances.delete(balance.networkId);
|
1925
1994
|
if (BigInt(balance.value) > 0n) {
|
1926
|
-
positiveBalanceNetworks.add(balance.
|
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
|
1977
|
-
if (!
|
1978
|
-
const publicClient = await evmChainConnector.getPublicClientForEvmNetwork(
|
1979
|
-
if (!publicClient) throw new Error(`Could not get rpc provider for evm network ${
|
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 ",
|
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:
|
2059
|
+
evmChainId: networkId
|
1991
2060
|
},
|
1992
|
-
|
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(
|
2625
|
-
const isTestnet = (await chaindataProvider
|
2626
|
-
|
2627
|
-
|
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,
|
2631
|
-
const {
|
2632
|
-
|
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.
|
2693
|
-
if (!result[b.
|
2694
|
-
result[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 ([
|
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[
|
2757
|
-
if (!evmNetwork) throw new Error(`Evm network ${
|
2758
|
-
const publicClient = await evmChainConnector.getPublicClientForEvmNetwork(
|
2759
|
-
if (!publicClient) throw new Error(`Could not get rpc provider for evm network ${
|
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
|
-
|
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
|
-
|
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
|
-
|
3196
|
-
miniMetadata,
|
3197
|
-
metadataVersion
|
3254
|
+
miniMetadata
|
3198
3255
|
} = chainMeta;
|
3199
|
-
if (miniMetadata
|
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
|
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
|
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
|
3357
|
-
if (!
|
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[
|
3416
|
+
const chain = chains[networkId];
|
3362
3417
|
if (!chain) {
|
3363
|
-
log.warn(`Chain ${
|
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(
|
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 ${
|
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 ${
|
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
|
-
|
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
|
3451
|
-
if (metadataRpc === undefined) return {
|
3452
|
-
|
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
|
-
|
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
|
-
|
3474
|
-
miniMetadata,
|
3475
|
-
metadataVersion
|
3520
|
+
miniMetadata
|
3476
3521
|
} = chainMeta;
|
3477
|
-
if (miniMetadata
|
3478
|
-
if (metadataVersion
|
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,
|
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
|
3628
|
-
if (!
|
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[
|
3675
|
+
const chain = chains[networkId];
|
3633
3676
|
if (!chain) {
|
3634
|
-
log.warn(`Chain ${
|
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(
|
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 ${
|
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 ${
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
4597
|
-
|
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
|
-
|
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
|
-
|
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(
|
6659
|
-
const isTestnet = (await chaindataProvider
|
6660
|
-
return {
|
6661
|
-
|
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,
|
6665
|
-
const {
|
6666
|
-
|
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,
|
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
|
-
|
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
|
-
|
6916
|
-
if (
|
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
|
-
|
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
|
7144
|
-
if (!
|
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[
|
7154
|
+
const chain = chains[networkId];
|
7149
7155
|
if (!chain) {
|
7150
|
-
log.warn(`Chain ${
|
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(
|
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 ${
|
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 ${
|
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
|
-
|
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.
|
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.
|
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;
|