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