@talismn/balances 0.0.0-pr2075-20250710035408 → 0.0.0-pr2075-20250710052843
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.
@@ -3,7 +3,7 @@
|
|
3
3
|
var chaindataProvider = require('@talismn/chaindata-provider');
|
4
4
|
var util = require('@talismn/util');
|
5
5
|
var viem = require('viem');
|
6
|
-
var
|
6
|
+
var lodashEs = require('lodash-es');
|
7
7
|
var z = require('zod/v4');
|
8
8
|
var anylogger = require('anylogger');
|
9
9
|
var rxjs = require('rxjs');
|
@@ -12,7 +12,7 @@ var tokenRates = require('@talismn/token-rates');
|
|
12
12
|
var BigNumber = require('bignumber.js');
|
13
13
|
var utils = require('@polkadot-api/utils');
|
14
14
|
var polkadotApi = require('polkadot-api');
|
15
|
-
var upperFirst = require('lodash/upperFirst');
|
15
|
+
var upperFirst = require('lodash-es/upperFirst');
|
16
16
|
var scaleTs = require('scale-ts');
|
17
17
|
var apiContract = require('@polkadot/api-contract');
|
18
18
|
var types = require('@polkadot/types');
|
@@ -821,7 +821,7 @@ const fetchTokens$8 = async ({
|
|
821
821
|
};
|
822
822
|
const cached2 = cache[tokenId] && TokenCacheSchema$1.safeParse(cache[tokenId]).data;
|
823
823
|
if (cached2?.isValid === false) continue;
|
824
|
-
const token =
|
824
|
+
const token = lodashEs.assign(base, cached2?.isValid ? lodashEs.omit(cached2, ["isValid"]) : {}, tokenConfig);
|
825
825
|
const parsed = chaindataProvider.EvmErc20TokenSchema.safeParse(token);
|
826
826
|
if (!parsed.success) {
|
827
827
|
log.warn("Ignoring token with invalid EvmErc20TokenSchema", {
|
@@ -896,7 +896,7 @@ const subscribeBalances$8 = ({
|
|
896
896
|
return () => {
|
897
897
|
abortController.abort();
|
898
898
|
};
|
899
|
-
}).pipe(rxjs.distinctUntilChanged(
|
899
|
+
}).pipe(rxjs.distinctUntilChanged(lodashEs.isEqual));
|
900
900
|
};
|
901
901
|
|
902
902
|
const EvmErc20BalanceModule = {
|
@@ -1043,7 +1043,7 @@ const fetchTokens$7 = async ({
|
|
1043
1043
|
}) => {
|
1044
1044
|
// assume there is one and only one token in the array
|
1045
1045
|
if (tokens.length !== 1) throw new Error("EVM Native module expects the nativeCurrency to be passed as a single token in the array");
|
1046
|
-
const token =
|
1046
|
+
const token = lodashEs.assign({
|
1047
1047
|
id: chaindataProvider.evmNativeTokenId(networkId),
|
1048
1048
|
type: MODULE_TYPE$7,
|
1049
1049
|
platform: PLATFORM$7,
|
@@ -1116,7 +1116,7 @@ const subscribeBalances$7 = ({
|
|
1116
1116
|
return () => {
|
1117
1117
|
abortController.abort();
|
1118
1118
|
};
|
1119
|
-
}).pipe(rxjs.distinctUntilChanged(
|
1119
|
+
}).pipe(rxjs.distinctUntilChanged(lodashEs.isEqual));
|
1120
1120
|
};
|
1121
1121
|
|
1122
1122
|
const EvmNativeBalanceModule = {
|
@@ -1382,7 +1382,7 @@ const fetchTokens$6 = async ({
|
|
1382
1382
|
};
|
1383
1383
|
const cached2 = cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data;
|
1384
1384
|
if (cached2?.isValid === false) continue;
|
1385
|
-
const token =
|
1385
|
+
const token = lodashEs.assign(base, cached2?.isValid ? lodashEs.omit(cached2, ["isValid"]) : {}, tokenConfig);
|
1386
1386
|
const parsed = chaindataProvider.EvmUniswapV2TokenSchema.safeParse(token);
|
1387
1387
|
if (!parsed.success) {
|
1388
1388
|
log.warn("Ignoring token with invalid schema", token);
|
@@ -1455,7 +1455,7 @@ const subscribeBalances$6 = ({
|
|
1455
1455
|
return () => {
|
1456
1456
|
abortController.abort();
|
1457
1457
|
};
|
1458
|
-
}).pipe(rxjs.distinctUntilChanged(
|
1458
|
+
}).pipe(rxjs.distinctUntilChanged(lodashEs.isEqual));
|
1459
1459
|
};
|
1460
1460
|
|
1461
1461
|
const EvmUniswapV2BalanceModule = {
|
@@ -1767,7 +1767,7 @@ const fetchTokens$5 = async ({
|
|
1767
1767
|
const [assetStorageResults, metadataStorageResults] = await Promise.all([connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]), connector.send(networkId, "state_queryStorageAt", [allMetadataStorageKeys])]);
|
1768
1768
|
const assetStorageEntries = assetStorageResults[0].changes;
|
1769
1769
|
const metadataStorageEntries = metadataStorageResults[0].changes;
|
1770
|
-
const assetByAssetId =
|
1770
|
+
const assetByAssetId = lodashEs.keyBy(assetStorageEntries.map(([key, value]) => {
|
1771
1771
|
const [assetId] = assetCodec.keys.dec(key);
|
1772
1772
|
const asset = assetCodec.value.dec(value);
|
1773
1773
|
return {
|
@@ -1776,7 +1776,7 @@ const fetchTokens$5 = async ({
|
|
1776
1776
|
isSufficient: asset.is_sufficient
|
1777
1777
|
};
|
1778
1778
|
}), a => a.assetId);
|
1779
|
-
const metadataByAssetId =
|
1779
|
+
const metadataByAssetId = lodashEs.keyBy(metadataStorageEntries.map(([key, value]) => {
|
1780
1780
|
const [assetId] = metadataCodec.keys.dec(key);
|
1781
1781
|
const metadata = metadataCodec.value.dec(value);
|
1782
1782
|
return {
|
@@ -1787,8 +1787,8 @@ const fetchTokens$5 = async ({
|
|
1787
1787
|
symbol: metadata.symbol?.asText()
|
1788
1788
|
};
|
1789
1789
|
}), a => a.assetId);
|
1790
|
-
const allTokens =
|
1791
|
-
const configTokenByAssetId =
|
1790
|
+
const allTokens = lodashEs.keys(assetByAssetId).map(assetId => lodashEs.assign({}, assetByAssetId[assetId], metadataByAssetId[assetId] ?? undefined));
|
1791
|
+
const configTokenByAssetId = lodashEs.keyBy(tokens, t => t.assetId);
|
1792
1792
|
return allTokens.map(asset => ({
|
1793
1793
|
id: chaindataProvider.subAssetTokenId(networkId, String(asset.assetId)),
|
1794
1794
|
type: MODULE_TYPE$5,
|
@@ -1811,7 +1811,7 @@ const fetchTokens$5 = async ({
|
|
1811
1811
|
// apply config overrides
|
1812
1812
|
.map(token => {
|
1813
1813
|
const configToken = configTokenByAssetId[token.assetId];
|
1814
|
-
return configToken ?
|
1814
|
+
return configToken ? lodashEs.assign({}, token, configToken) : token;
|
1815
1815
|
})
|
1816
1816
|
// validate results
|
1817
1817
|
.filter(t => {
|
@@ -2919,7 +2919,7 @@ const fetchTokens$4 = async ({
|
|
2919
2919
|
const [assetStorageResults, metadataStorageResults] = await Promise.all([connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]), connector.send(networkId, "state_queryStorageAt", [allMetadataStorageKeys])]);
|
2920
2920
|
const assetStorageEntries = assetStorageResults[0].changes;
|
2921
2921
|
const metadataStorageEntries = metadataStorageResults[0].changes;
|
2922
|
-
const assetByOnChainId =
|
2922
|
+
const assetByOnChainId = lodashEs.keyBy(assetStorageEntries.map(([key, value]) => {
|
2923
2923
|
const [decodedKey] = assetCodec.keys.dec(key);
|
2924
2924
|
const onChainId = scale.papiStringify(decodedKey);
|
2925
2925
|
const asset = assetCodec.value.dec(value);
|
@@ -2929,7 +2929,7 @@ const fetchTokens$4 = async ({
|
|
2929
2929
|
isSufficient: asset.is_sufficient
|
2930
2930
|
};
|
2931
2931
|
}), a => a.onChainId);
|
2932
|
-
const metadataByOnChainId =
|
2932
|
+
const metadataByOnChainId = lodashEs.keyBy(metadataStorageEntries.map(([key, value]) => {
|
2933
2933
|
const [decodedKey] = metadataCodec.keys.dec(key);
|
2934
2934
|
const onChainId = scale.papiStringify(decodedKey);
|
2935
2935
|
const metadata = metadataCodec.value.dec(value);
|
@@ -2941,8 +2941,8 @@ const fetchTokens$4 = async ({
|
|
2941
2941
|
symbol: metadata.symbol?.asText()
|
2942
2942
|
};
|
2943
2943
|
}), a => a.onChainId);
|
2944
|
-
const allTokens =
|
2945
|
-
const configTokenByOnChainId =
|
2944
|
+
const allTokens = lodashEs.keys(assetByOnChainId).map(onChainId => lodashEs.assign({}, assetByOnChainId[onChainId], metadataByOnChainId[onChainId] ?? undefined));
|
2945
|
+
const configTokenByOnChainId = lodashEs.keyBy(tokens, t => t.onChainId);
|
2946
2946
|
return allTokens.map(asset => ({
|
2947
2947
|
id: chaindataProvider.subForeignAssetTokenId(networkId, asset.onChainId),
|
2948
2948
|
type: MODULE_TYPE$4,
|
@@ -2965,7 +2965,7 @@ const fetchTokens$4 = async ({
|
|
2965
2965
|
// apply config overrides
|
2966
2966
|
.map(token => {
|
2967
2967
|
const configToken = configTokenByOnChainId[token.onChainId];
|
2968
|
-
return configToken ?
|
2968
|
+
return configToken ? lodashEs.assign({}, token, configToken) : token;
|
2969
2969
|
})
|
2970
2970
|
// validate results
|
2971
2971
|
.filter(t => {
|
@@ -3187,7 +3187,7 @@ const fetchBalances$3 = async ({
|
|
3187
3187
|
}))
|
3188
3188
|
};
|
3189
3189
|
}
|
3190
|
-
const addresses =
|
3190
|
+
const addresses = lodashEs.uniq(balanceDefs.map(def => def.address));
|
3191
3191
|
try {
|
3192
3192
|
const res = await Promise.all(addresses.map(address => fetchRuntimeCallResult(connector, networkId, miniMetadata.data, "CurrenciesApi", "accounts", [address])));
|
3193
3193
|
const fetchedBalances = addresses.flatMap((address, index) => {
|
@@ -3199,7 +3199,7 @@ const fetchBalances$3 = async ({
|
|
3199
3199
|
frozen: balance.frozen.toString()
|
3200
3200
|
})).filter(b => b.onChainId !== undefined);
|
3201
3201
|
});
|
3202
|
-
const balancesByKey =
|
3202
|
+
const balancesByKey = lodashEs.keyBy(fetchedBalances, b => `${b.address}:${b.onChainId}`);
|
3203
3203
|
const success = tokensWithAddresses.reduce((acc, [token, addresses]) => {
|
3204
3204
|
if (token.type === MODULE_TYPE$3) for (const address of addresses) {
|
3205
3205
|
const rawBalance = balancesByKey[`${address}:${token.onChainId}`];
|
@@ -3263,7 +3263,7 @@ const fetchTokens$3 = async ({
|
|
3263
3263
|
const allAssetStorageKeys = await connector.send(networkId, "state_getKeys", [scale.getStorageKeyPrefix("AssetRegistry", "Assets")]);
|
3264
3264
|
const assetStorageResults = await connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]);
|
3265
3265
|
const assetStorageEntries = assetStorageResults[0].changes;
|
3266
|
-
const configTokenByAssetId =
|
3266
|
+
const configTokenByAssetId = lodashEs.keyBy(tokens, t => t.onChainId);
|
3267
3267
|
return assetStorageEntries.map(([key, value]) => {
|
3268
3268
|
// parse results
|
3269
3269
|
const [onChainId] = assetsCodec.keys.dec(key);
|
@@ -3306,7 +3306,7 @@ const fetchTokens$3 = async ({
|
|
3306
3306
|
// apply config overrides
|
3307
3307
|
.map(token => {
|
3308
3308
|
const configToken = configTokenByAssetId[token.onChainId];
|
3309
|
-
return configToken ?
|
3309
|
+
return configToken ? lodashEs.assign({}, token, configToken) : token;
|
3310
3310
|
})
|
3311
3311
|
// validate results
|
3312
3312
|
.filter(t => {
|
@@ -3445,7 +3445,7 @@ const subscribeBalances$3 = ({
|
|
3445
3445
|
return () => {
|
3446
3446
|
abortController.abort();
|
3447
3447
|
};
|
3448
|
-
}).pipe(rxjs.distinctUntilChanged(
|
3448
|
+
}).pipe(rxjs.distinctUntilChanged(lodashEs.isEqual));
|
3449
3449
|
};
|
3450
3450
|
|
3451
3451
|
const SubHydrationBalanceModule = {
|
@@ -3512,9 +3512,9 @@ const getSubtensorStakingBalances$ = (connector, networkId, balanceDefs, miniMet
|
|
3512
3512
|
return rxjs.timer(0, 30000).pipe(rxjs.switchMap(() => rxjs.from(fetchStakeInfoByAddress(connector, networkId, miniMetadata, addresses)).pipe(rxjs.switchMap(stakeInfoByAddress => fetchStakingBalanceValuesByAddress(connector, networkId, miniMetadata, stakeInfoByAddress)))));
|
3513
3513
|
};
|
3514
3514
|
const fetchStakingBalanceValuesByAddress = async (connector, networkId, miniMetadata, stakeInfoByAddress) => {
|
3515
|
-
const uniqueNetuids =
|
3515
|
+
const uniqueNetuids = lodashEs.uniq(lodashEs.values(stakeInfoByAddress).flatMap(infos => infos.map(info => info.netuid))).filter(netuid => netuid !== SUBTENSOR_ROOT_NETUID);
|
3516
3516
|
const dynamicInfoByNetuid = await fetchDynamicInfoByNetuid(connector, networkId, miniMetadata, uniqueNetuids);
|
3517
|
-
return
|
3517
|
+
return lodashEs.fromPairs(lodashEs.toPairs(stakeInfoByAddress).map(([address, stakeInfos]) => {
|
3518
3518
|
const stakesBalances = stakeInfos.filter(({
|
3519
3519
|
stake
|
3520
3520
|
}) => stake >= SUBTENSOR_MIN_STAKE_AMOUNT_PLANK).map(({
|
@@ -3539,7 +3539,7 @@ const fetchStakingBalanceValuesByAddress = async (connector, networkId, miniMeta
|
|
3539
3539
|
} = dynamicInfo ?? {};
|
3540
3540
|
const tokenSymbol = new TextDecoder().decode(Uint8Array.from(token_symbol ?? []));
|
3541
3541
|
const subnetName = new TextDecoder().decode(Uint8Array.from(subnet_name ?? []));
|
3542
|
-
const subnetIdentity = subnet_identity ?
|
3542
|
+
const subnetIdentity = subnet_identity ? lodashEs.fromPairs(lodashEs.toPairs(subnet_identity).map(([key, binary]) => [key, binary.asText()])) : undefined;
|
3543
3543
|
|
3544
3544
|
// Add 1n balance if failed to fetch dynamic info, so the position is not ignored by Balance lib and is displayed in the UI.
|
3545
3545
|
const alphaStakedInTao = dynamicInfo ? calculateTaoFromDynamicInfo({
|
@@ -3582,7 +3582,7 @@ const fetchStakeInfoByAddress = async (connector, networkId, miniMetadata, addre
|
|
3582
3582
|
delay: 500,
|
3583
3583
|
retryCount: 3
|
3584
3584
|
})]));
|
3585
|
-
return
|
3585
|
+
return lodashEs.fromPairs(pairs);
|
3586
3586
|
};
|
3587
3587
|
|
3588
3588
|
// assume dynamic info doesnt change over the course of a browser session
|
@@ -3606,7 +3606,7 @@ const fetchDynamicInfoByNetuid = async (connector, networkId, miniMetadata, uniq
|
|
3606
3606
|
return dynamicInfoCache.get(cacheKey) ?? null;
|
3607
3607
|
};
|
3608
3608
|
const results = await Promise.all(uniqueNetuids.map(async netuid => [netuid, await fetchInfo(netuid)]));
|
3609
|
-
return
|
3609
|
+
return lodashEs.fromPairs(results);
|
3610
3610
|
};
|
3611
3611
|
|
3612
3612
|
const getOtherType = input => `other-${input}`;
|
@@ -4272,7 +4272,7 @@ const fetchTokens$2 = async ({
|
|
4272
4272
|
decimals: decimals,
|
4273
4273
|
existentialDeposit: miniMetadata.extra.existentialDeposit ?? "0"
|
4274
4274
|
};
|
4275
|
-
const token =
|
4275
|
+
const token = lodashEs.assign(nativeToken, tokenConfig);
|
4276
4276
|
const parsed = chaindataProvider.SubNativeTokenSchema.safeParse(token);
|
4277
4277
|
if (!parsed.success) {
|
4278
4278
|
log.warn(`Ignoring invalid token ${MODULE_TYPE$2}`, token, parsed.error);
|
@@ -4490,7 +4490,7 @@ const subscribeBalances$2 = ({
|
|
4490
4490
|
const subtensorBalancesByAddress$ = getSubtensorStakingBalances$(connector, networkId, balanceDefs, miniMetadata);
|
4491
4491
|
return rxjs.combineLatest([baseBalances$, subtensorBalancesByAddress$]).pipe(rxjs.map(([baseBalances, subtensorBalancesByAddress]) => {
|
4492
4492
|
// add subtensor balances to base balances
|
4493
|
-
for (const [address, subtensorBalances] of
|
4493
|
+
for (const [address, subtensorBalances] of lodashEs.toPairs(subtensorBalancesByAddress)) {
|
4494
4494
|
const balance = baseBalances.find(b => b.address === address);
|
4495
4495
|
if (balance?.values) balance.values.push(...subtensorBalances);
|
4496
4496
|
}
|
@@ -5805,7 +5805,7 @@ const fetchTokens$1 = async ({
|
|
5805
5805
|
continue;
|
5806
5806
|
}
|
5807
5807
|
}
|
5808
|
-
return
|
5808
|
+
return lodashEs.values(tokenList).filter(t => {
|
5809
5809
|
const parsed = chaindataProvider.SubPsp22TokenSchema.safeParse(t);
|
5810
5810
|
if (!parsed.success) log.warn(`Ignoring invalid token ${MODULE_TYPE$1}`, t);
|
5811
5811
|
return parsed.success;
|
@@ -5934,7 +5934,7 @@ const subscribeBalances$1 = ({
|
|
5934
5934
|
return () => {
|
5935
5935
|
abortController.abort();
|
5936
5936
|
};
|
5937
|
-
}).pipe(rxjs.distinctUntilChanged(
|
5937
|
+
}).pipe(rxjs.distinctUntilChanged(lodashEs.isEqual));
|
5938
5938
|
};
|
5939
5939
|
|
5940
5940
|
const SubPsp22BalanceModule = {
|
@@ -6100,7 +6100,7 @@ const fetchTokens = async ({
|
|
6100
6100
|
// in this module we do not fetch any token information from the chain
|
6101
6101
|
// this is because there are basically as many pallet implementations as there are networks (Expect Chaos, they said)
|
6102
6102
|
// we rely on the config to provide all the info we need
|
6103
|
-
return tokens.map(tokenConfig =>
|
6103
|
+
return tokens.map(tokenConfig => lodashEs.assign({
|
6104
6104
|
id: chaindataProvider.subTokensTokenId(networkId, tokenConfig.onChainId),
|
6105
6105
|
type: MODULE_TYPE,
|
6106
6106
|
platform: PLATFORM,
|
@@ -6448,8 +6448,8 @@ class BalancesProvider {
|
|
6448
6448
|
this.#chaindataProvider = chaindataProvider;
|
6449
6449
|
this.#chainConnectors = chainConnectors;
|
6450
6450
|
this.#storage = new rxjs.BehaviorSubject({
|
6451
|
-
balances:
|
6452
|
-
miniMetadatas:
|
6451
|
+
balances: lodashEs.keyBy(storage.balances.filter(util.isNotNil), b => getBalanceId(b)),
|
6452
|
+
miniMetadatas: lodashEs.keyBy(storage.miniMetadatas.filter(util.isNotNil), m => m.id)
|
6453
6453
|
});
|
6454
6454
|
}
|
6455
6455
|
get storage$() {
|
@@ -6457,8 +6457,8 @@ class BalancesProvider {
|
|
6457
6457
|
balances,
|
6458
6458
|
miniMetadatas
|
6459
6459
|
}) => ({
|
6460
|
-
balances:
|
6461
|
-
miniMetadatas:
|
6460
|
+
balances: lodashEs.values(balances).filter(util.isNotNil),
|
6461
|
+
miniMetadatas: lodashEs.values(miniMetadatas).filter(util.isNotNil)
|
6462
6462
|
})));
|
6463
6463
|
}
|
6464
6464
|
|
@@ -6469,7 +6469,7 @@ class BalancesProvider {
|
|
6469
6469
|
return util.getSharedObservable("BalancesProvider.getBalances$", addressesByTokenId, () => {
|
6470
6470
|
return this.cleanupAddressesByTokenId(addressesByTokenId).pipe(rxjs.map(
|
6471
6471
|
// split by network
|
6472
|
-
addressesByTokenId =>
|
6472
|
+
addressesByTokenId => lodashEs.toPairs(addressesByTokenId).reduce((acc, [tokenId, addresses]) => {
|
6473
6473
|
const networkId = chaindataProvider.parseTokenId(tokenId).networkId;
|
6474
6474
|
if (!acc[networkId]) acc[networkId] = {};
|
6475
6475
|
acc[networkId][tokenId] = addresses;
|
@@ -6478,7 +6478,7 @@ class BalancesProvider {
|
|
6478
6478
|
// fetch balances and start a 30s timer to mark the whole subscription live after 30s
|
6479
6479
|
rxjs.combineLatest({
|
6480
6480
|
isStale: rxjs.timer(30_000).pipe(rxjs.map(() => true), rxjs.startWith(false)),
|
6481
|
-
results: rxjs.combineLatest(
|
6481
|
+
results: rxjs.combineLatest(lodashEs.toPairs(addressesByTokenIdByNetworkId).map(([networkId]) => this.getNetworkBalances$(networkId, addressesByTokenIdByNetworkId[networkId])))
|
6482
6482
|
})), rxjs.map(
|
6483
6483
|
// combine
|
6484
6484
|
({
|
@@ -6495,7 +6495,7 @@ class BalancesProvider {
|
|
6495
6495
|
})), rxjs.startWith({
|
6496
6496
|
status: "initialising",
|
6497
6497
|
balances: this.getStoredBalances(addressesByTokenId)
|
6498
|
-
}), rxjs.distinctUntilChanged(
|
6498
|
+
}), rxjs.distinctUntilChanged(lodashEs.isEqual));
|
6499
6499
|
});
|
6500
6500
|
}
|
6501
6501
|
fetchBalances(addressesByTokenId) {
|
@@ -6511,14 +6511,14 @@ class BalancesProvider {
|
|
6511
6511
|
const tokensMapById$ = this.#chaindataProvider.getTokensMapById$();
|
6512
6512
|
const miniMetadatas$ = this.getNetworkMiniMetadatas$(networkId);
|
6513
6513
|
return rxjs.combineLatest([network$, miniMetadatas$, tokensMapById$]).pipe(rxjs.switchMap(([network, miniMetadatas, tokensMapById]) => {
|
6514
|
-
const tokensAndAddresses =
|
6514
|
+
const tokensAndAddresses = lodashEs.toPairs(addressesByTokenId).map(([tokenId, addresses]) => [tokensMapById[tokenId], addresses]);
|
6515
6515
|
return rxjs.combineLatest(BALANCE_MODULES.filter(mod => mod.platform === network?.platform).map(mod => {
|
6516
6516
|
const tokensWithAddresses = tokensAndAddresses.filter(([token]) => token.type === mod.type);
|
6517
|
-
const moduleAddressesByTokenId =
|
6517
|
+
const moduleAddressesByTokenId = lodashEs.fromPairs(tokensWithAddresses.map(([token, addresses]) => [token.id, addresses]));
|
6518
6518
|
const miniMetadata = miniMetadatas.find(m => m.source === mod.type);
|
6519
6519
|
|
6520
6520
|
// all balance ids expected in result set
|
6521
|
-
const balanceIds =
|
6521
|
+
const balanceIds = lodashEs.toPairs(moduleAddressesByTokenId).flatMap(([tokenId, addresses]) => addresses.map(address => getBalanceId({
|
6522
6522
|
tokenId,
|
6523
6523
|
address
|
6524
6524
|
})));
|
@@ -6531,15 +6531,15 @@ class BalancesProvider {
|
|
6531
6531
|
const updateStorage = results => {
|
6532
6532
|
if (results.status !== "live") return;
|
6533
6533
|
const storage = this.#storage.getValue();
|
6534
|
-
const balances =
|
6534
|
+
const balances = lodashEs.assign({}, storage.balances,
|
6535
6535
|
// delete all balances expected in the result set. because if they are not present it means they are empty.
|
6536
|
-
|
6536
|
+
lodashEs.fromPairs(balanceIds.map(balanceId => [balanceId, undefined])), lodashEs.keyBy(
|
6537
6537
|
// storage balances must have status "cache", because they are used as start value when initialising subsequent subscriptions
|
6538
6538
|
results.balances.map(b => ({
|
6539
6539
|
...b,
|
6540
6540
|
status: "cache"
|
6541
6541
|
})), b => getBalanceId(b)));
|
6542
|
-
this.#storage.next(
|
6542
|
+
this.#storage.next(lodashEs.assign({}, storage, {
|
6543
6543
|
balances
|
6544
6544
|
}));
|
6545
6545
|
};
|
@@ -6609,12 +6609,12 @@ class BalancesProvider {
|
|
6609
6609
|
rxjs.tap(newMiniMetadatas => {
|
6610
6610
|
if (!newMiniMetadatas.length) return;
|
6611
6611
|
const storage = this.#storage.getValue();
|
6612
|
-
const miniMetadatas =
|
6612
|
+
const miniMetadatas = lodashEs.assign(
|
6613
6613
|
// keep minimetadatas of other networks
|
6614
|
-
|
6614
|
+
lodashEs.keyBy(lodashEs.values(storage.miniMetadatas).filter(m => m.chainId !== networkId), m => m.id),
|
6615
6615
|
// add the ones for our network
|
6616
|
-
|
6617
|
-
this.#storage.next(
|
6616
|
+
lodashEs.keyBy(newMiniMetadatas, m => m.id));
|
6617
|
+
this.#storage.next(lodashEs.assign({}, storage, {
|
6618
6618
|
miniMetadatas
|
6619
6619
|
}));
|
6620
6620
|
}));
|
@@ -6626,13 +6626,13 @@ class BalancesProvider {
|
|
6626
6626
|
});
|
6627
6627
|
}
|
6628
6628
|
getStoredMiniMetadatas$(networkId, specVersion) {
|
6629
|
-
return this.storage$.pipe(rxjs.map(storage => storage.miniMetadatas.filter(m => m.chainId === networkId && m.specVersion === specVersion && m.version === chaindataProvider.MINIMETADATA_VERSION)), rxjs.distinctUntilChanged(
|
6629
|
+
return this.storage$.pipe(rxjs.map(storage => storage.miniMetadatas.filter(m => m.chainId === networkId && m.specVersion === specVersion && m.version === chaindataProvider.MINIMETADATA_VERSION)), rxjs.distinctUntilChanged(lodashEs.isEqual));
|
6630
6630
|
}
|
6631
6631
|
getDefaultMiniMetadatas$(networkId, specVersion) {
|
6632
|
-
return this.#chaindataProvider.miniMetadatas$.pipe(rxjs.map(miniMetadatas => miniMetadatas.filter(m => m.chainId === networkId && m.specVersion === specVersion && m.version === chaindataProvider.MINIMETADATA_VERSION)), rxjs.distinctUntilChanged(
|
6632
|
+
return this.#chaindataProvider.miniMetadatas$.pipe(rxjs.map(miniMetadatas => miniMetadatas.filter(m => m.chainId === networkId && m.specVersion === specVersion && m.version === chaindataProvider.MINIMETADATA_VERSION)), rxjs.distinctUntilChanged(lodashEs.isEqual));
|
6633
6633
|
}
|
6634
6634
|
getStoredBalances(addressesByToken) {
|
6635
|
-
const balanceDefs =
|
6635
|
+
const balanceDefs = lodashEs.toPairs(addressesByToken).flatMap(([tokenId, addresses]) => addresses.map(address => [tokenId, address]));
|
6636
6636
|
return balanceDefs.map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({
|
6637
6637
|
address,
|
6638
6638
|
tokenId
|
@@ -6640,7 +6640,7 @@ class BalancesProvider {
|
|
6640
6640
|
}
|
6641
6641
|
cleanupAddressesByTokenId(addressesByTokenId) {
|
6642
6642
|
return this.#chaindataProvider.getNetworksMapById$().pipe(rxjs.map(networksById => {
|
6643
|
-
return
|
6643
|
+
return lodashEs.fromPairs(lodashEs.toPairs(addressesByTokenId).map(([tokenId, addresses]) => {
|
6644
6644
|
const networkId = chaindataProvider.parseTokenId(tokenId).networkId;
|
6645
6645
|
const network = networksById[networkId];
|
6646
6646
|
return [tokenId, addresses.filter(address => network && isAddressCompatibleWithNetwork(network, address))];
|
@@ -3,7 +3,7 @@
|
|
3
3
|
var chaindataProvider = require('@talismn/chaindata-provider');
|
4
4
|
var util = require('@talismn/util');
|
5
5
|
var viem = require('viem');
|
6
|
-
var
|
6
|
+
var lodashEs = require('lodash-es');
|
7
7
|
var z = require('zod/v4');
|
8
8
|
var anylogger = require('anylogger');
|
9
9
|
var rxjs = require('rxjs');
|
@@ -12,7 +12,7 @@ var tokenRates = require('@talismn/token-rates');
|
|
12
12
|
var BigNumber = require('bignumber.js');
|
13
13
|
var utils = require('@polkadot-api/utils');
|
14
14
|
var polkadotApi = require('polkadot-api');
|
15
|
-
var upperFirst = require('lodash/upperFirst');
|
15
|
+
var upperFirst = require('lodash-es/upperFirst');
|
16
16
|
var scaleTs = require('scale-ts');
|
17
17
|
var apiContract = require('@polkadot/api-contract');
|
18
18
|
var types = require('@polkadot/types');
|
@@ -821,7 +821,7 @@ const fetchTokens$8 = async ({
|
|
821
821
|
};
|
822
822
|
const cached2 = cache[tokenId] && TokenCacheSchema$1.safeParse(cache[tokenId]).data;
|
823
823
|
if (cached2?.isValid === false) continue;
|
824
|
-
const token =
|
824
|
+
const token = lodashEs.assign(base, cached2?.isValid ? lodashEs.omit(cached2, ["isValid"]) : {}, tokenConfig);
|
825
825
|
const parsed = chaindataProvider.EvmErc20TokenSchema.safeParse(token);
|
826
826
|
if (!parsed.success) {
|
827
827
|
log.warn("Ignoring token with invalid EvmErc20TokenSchema", {
|
@@ -896,7 +896,7 @@ const subscribeBalances$8 = ({
|
|
896
896
|
return () => {
|
897
897
|
abortController.abort();
|
898
898
|
};
|
899
|
-
}).pipe(rxjs.distinctUntilChanged(
|
899
|
+
}).pipe(rxjs.distinctUntilChanged(lodashEs.isEqual));
|
900
900
|
};
|
901
901
|
|
902
902
|
const EvmErc20BalanceModule = {
|
@@ -1043,7 +1043,7 @@ const fetchTokens$7 = async ({
|
|
1043
1043
|
}) => {
|
1044
1044
|
// assume there is one and only one token in the array
|
1045
1045
|
if (tokens.length !== 1) throw new Error("EVM Native module expects the nativeCurrency to be passed as a single token in the array");
|
1046
|
-
const token =
|
1046
|
+
const token = lodashEs.assign({
|
1047
1047
|
id: chaindataProvider.evmNativeTokenId(networkId),
|
1048
1048
|
type: MODULE_TYPE$7,
|
1049
1049
|
platform: PLATFORM$7,
|
@@ -1116,7 +1116,7 @@ const subscribeBalances$7 = ({
|
|
1116
1116
|
return () => {
|
1117
1117
|
abortController.abort();
|
1118
1118
|
};
|
1119
|
-
}).pipe(rxjs.distinctUntilChanged(
|
1119
|
+
}).pipe(rxjs.distinctUntilChanged(lodashEs.isEqual));
|
1120
1120
|
};
|
1121
1121
|
|
1122
1122
|
const EvmNativeBalanceModule = {
|
@@ -1382,7 +1382,7 @@ const fetchTokens$6 = async ({
|
|
1382
1382
|
};
|
1383
1383
|
const cached2 = cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data;
|
1384
1384
|
if (cached2?.isValid === false) continue;
|
1385
|
-
const token =
|
1385
|
+
const token = lodashEs.assign(base, cached2?.isValid ? lodashEs.omit(cached2, ["isValid"]) : {}, tokenConfig);
|
1386
1386
|
const parsed = chaindataProvider.EvmUniswapV2TokenSchema.safeParse(token);
|
1387
1387
|
if (!parsed.success) {
|
1388
1388
|
log.warn("Ignoring token with invalid schema", token);
|
@@ -1455,7 +1455,7 @@ const subscribeBalances$6 = ({
|
|
1455
1455
|
return () => {
|
1456
1456
|
abortController.abort();
|
1457
1457
|
};
|
1458
|
-
}).pipe(rxjs.distinctUntilChanged(
|
1458
|
+
}).pipe(rxjs.distinctUntilChanged(lodashEs.isEqual));
|
1459
1459
|
};
|
1460
1460
|
|
1461
1461
|
const EvmUniswapV2BalanceModule = {
|
@@ -1767,7 +1767,7 @@ const fetchTokens$5 = async ({
|
|
1767
1767
|
const [assetStorageResults, metadataStorageResults] = await Promise.all([connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]), connector.send(networkId, "state_queryStorageAt", [allMetadataStorageKeys])]);
|
1768
1768
|
const assetStorageEntries = assetStorageResults[0].changes;
|
1769
1769
|
const metadataStorageEntries = metadataStorageResults[0].changes;
|
1770
|
-
const assetByAssetId =
|
1770
|
+
const assetByAssetId = lodashEs.keyBy(assetStorageEntries.map(([key, value]) => {
|
1771
1771
|
const [assetId] = assetCodec.keys.dec(key);
|
1772
1772
|
const asset = assetCodec.value.dec(value);
|
1773
1773
|
return {
|
@@ -1776,7 +1776,7 @@ const fetchTokens$5 = async ({
|
|
1776
1776
|
isSufficient: asset.is_sufficient
|
1777
1777
|
};
|
1778
1778
|
}), a => a.assetId);
|
1779
|
-
const metadataByAssetId =
|
1779
|
+
const metadataByAssetId = lodashEs.keyBy(metadataStorageEntries.map(([key, value]) => {
|
1780
1780
|
const [assetId] = metadataCodec.keys.dec(key);
|
1781
1781
|
const metadata = metadataCodec.value.dec(value);
|
1782
1782
|
return {
|
@@ -1787,8 +1787,8 @@ const fetchTokens$5 = async ({
|
|
1787
1787
|
symbol: metadata.symbol?.asText()
|
1788
1788
|
};
|
1789
1789
|
}), a => a.assetId);
|
1790
|
-
const allTokens =
|
1791
|
-
const configTokenByAssetId =
|
1790
|
+
const allTokens = lodashEs.keys(assetByAssetId).map(assetId => lodashEs.assign({}, assetByAssetId[assetId], metadataByAssetId[assetId] ?? undefined));
|
1791
|
+
const configTokenByAssetId = lodashEs.keyBy(tokens, t => t.assetId);
|
1792
1792
|
return allTokens.map(asset => ({
|
1793
1793
|
id: chaindataProvider.subAssetTokenId(networkId, String(asset.assetId)),
|
1794
1794
|
type: MODULE_TYPE$5,
|
@@ -1811,7 +1811,7 @@ const fetchTokens$5 = async ({
|
|
1811
1811
|
// apply config overrides
|
1812
1812
|
.map(token => {
|
1813
1813
|
const configToken = configTokenByAssetId[token.assetId];
|
1814
|
-
return configToken ?
|
1814
|
+
return configToken ? lodashEs.assign({}, token, configToken) : token;
|
1815
1815
|
})
|
1816
1816
|
// validate results
|
1817
1817
|
.filter(t => {
|
@@ -2919,7 +2919,7 @@ const fetchTokens$4 = async ({
|
|
2919
2919
|
const [assetStorageResults, metadataStorageResults] = await Promise.all([connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]), connector.send(networkId, "state_queryStorageAt", [allMetadataStorageKeys])]);
|
2920
2920
|
const assetStorageEntries = assetStorageResults[0].changes;
|
2921
2921
|
const metadataStorageEntries = metadataStorageResults[0].changes;
|
2922
|
-
const assetByOnChainId =
|
2922
|
+
const assetByOnChainId = lodashEs.keyBy(assetStorageEntries.map(([key, value]) => {
|
2923
2923
|
const [decodedKey] = assetCodec.keys.dec(key);
|
2924
2924
|
const onChainId = scale.papiStringify(decodedKey);
|
2925
2925
|
const asset = assetCodec.value.dec(value);
|
@@ -2929,7 +2929,7 @@ const fetchTokens$4 = async ({
|
|
2929
2929
|
isSufficient: asset.is_sufficient
|
2930
2930
|
};
|
2931
2931
|
}), a => a.onChainId);
|
2932
|
-
const metadataByOnChainId =
|
2932
|
+
const metadataByOnChainId = lodashEs.keyBy(metadataStorageEntries.map(([key, value]) => {
|
2933
2933
|
const [decodedKey] = metadataCodec.keys.dec(key);
|
2934
2934
|
const onChainId = scale.papiStringify(decodedKey);
|
2935
2935
|
const metadata = metadataCodec.value.dec(value);
|
@@ -2941,8 +2941,8 @@ const fetchTokens$4 = async ({
|
|
2941
2941
|
symbol: metadata.symbol?.asText()
|
2942
2942
|
};
|
2943
2943
|
}), a => a.onChainId);
|
2944
|
-
const allTokens =
|
2945
|
-
const configTokenByOnChainId =
|
2944
|
+
const allTokens = lodashEs.keys(assetByOnChainId).map(onChainId => lodashEs.assign({}, assetByOnChainId[onChainId], metadataByOnChainId[onChainId] ?? undefined));
|
2945
|
+
const configTokenByOnChainId = lodashEs.keyBy(tokens, t => t.onChainId);
|
2946
2946
|
return allTokens.map(asset => ({
|
2947
2947
|
id: chaindataProvider.subForeignAssetTokenId(networkId, asset.onChainId),
|
2948
2948
|
type: MODULE_TYPE$4,
|
@@ -2965,7 +2965,7 @@ const fetchTokens$4 = async ({
|
|
2965
2965
|
// apply config overrides
|
2966
2966
|
.map(token => {
|
2967
2967
|
const configToken = configTokenByOnChainId[token.onChainId];
|
2968
|
-
return configToken ?
|
2968
|
+
return configToken ? lodashEs.assign({}, token, configToken) : token;
|
2969
2969
|
})
|
2970
2970
|
// validate results
|
2971
2971
|
.filter(t => {
|
@@ -3187,7 +3187,7 @@ const fetchBalances$3 = async ({
|
|
3187
3187
|
}))
|
3188
3188
|
};
|
3189
3189
|
}
|
3190
|
-
const addresses =
|
3190
|
+
const addresses = lodashEs.uniq(balanceDefs.map(def => def.address));
|
3191
3191
|
try {
|
3192
3192
|
const res = await Promise.all(addresses.map(address => fetchRuntimeCallResult(connector, networkId, miniMetadata.data, "CurrenciesApi", "accounts", [address])));
|
3193
3193
|
const fetchedBalances = addresses.flatMap((address, index) => {
|
@@ -3199,7 +3199,7 @@ const fetchBalances$3 = async ({
|
|
3199
3199
|
frozen: balance.frozen.toString()
|
3200
3200
|
})).filter(b => b.onChainId !== undefined);
|
3201
3201
|
});
|
3202
|
-
const balancesByKey =
|
3202
|
+
const balancesByKey = lodashEs.keyBy(fetchedBalances, b => `${b.address}:${b.onChainId}`);
|
3203
3203
|
const success = tokensWithAddresses.reduce((acc, [token, addresses]) => {
|
3204
3204
|
if (token.type === MODULE_TYPE$3) for (const address of addresses) {
|
3205
3205
|
const rawBalance = balancesByKey[`${address}:${token.onChainId}`];
|
@@ -3263,7 +3263,7 @@ const fetchTokens$3 = async ({
|
|
3263
3263
|
const allAssetStorageKeys = await connector.send(networkId, "state_getKeys", [scale.getStorageKeyPrefix("AssetRegistry", "Assets")]);
|
3264
3264
|
const assetStorageResults = await connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]);
|
3265
3265
|
const assetStorageEntries = assetStorageResults[0].changes;
|
3266
|
-
const configTokenByAssetId =
|
3266
|
+
const configTokenByAssetId = lodashEs.keyBy(tokens, t => t.onChainId);
|
3267
3267
|
return assetStorageEntries.map(([key, value]) => {
|
3268
3268
|
// parse results
|
3269
3269
|
const [onChainId] = assetsCodec.keys.dec(key);
|
@@ -3306,7 +3306,7 @@ const fetchTokens$3 = async ({
|
|
3306
3306
|
// apply config overrides
|
3307
3307
|
.map(token => {
|
3308
3308
|
const configToken = configTokenByAssetId[token.onChainId];
|
3309
|
-
return configToken ?
|
3309
|
+
return configToken ? lodashEs.assign({}, token, configToken) : token;
|
3310
3310
|
})
|
3311
3311
|
// validate results
|
3312
3312
|
.filter(t => {
|
@@ -3445,7 +3445,7 @@ const subscribeBalances$3 = ({
|
|
3445
3445
|
return () => {
|
3446
3446
|
abortController.abort();
|
3447
3447
|
};
|
3448
|
-
}).pipe(rxjs.distinctUntilChanged(
|
3448
|
+
}).pipe(rxjs.distinctUntilChanged(lodashEs.isEqual));
|
3449
3449
|
};
|
3450
3450
|
|
3451
3451
|
const SubHydrationBalanceModule = {
|
@@ -3512,9 +3512,9 @@ const getSubtensorStakingBalances$ = (connector, networkId, balanceDefs, miniMet
|
|
3512
3512
|
return rxjs.timer(0, 30000).pipe(rxjs.switchMap(() => rxjs.from(fetchStakeInfoByAddress(connector, networkId, miniMetadata, addresses)).pipe(rxjs.switchMap(stakeInfoByAddress => fetchStakingBalanceValuesByAddress(connector, networkId, miniMetadata, stakeInfoByAddress)))));
|
3513
3513
|
};
|
3514
3514
|
const fetchStakingBalanceValuesByAddress = async (connector, networkId, miniMetadata, stakeInfoByAddress) => {
|
3515
|
-
const uniqueNetuids =
|
3515
|
+
const uniqueNetuids = lodashEs.uniq(lodashEs.values(stakeInfoByAddress).flatMap(infos => infos.map(info => info.netuid))).filter(netuid => netuid !== SUBTENSOR_ROOT_NETUID);
|
3516
3516
|
const dynamicInfoByNetuid = await fetchDynamicInfoByNetuid(connector, networkId, miniMetadata, uniqueNetuids);
|
3517
|
-
return
|
3517
|
+
return lodashEs.fromPairs(lodashEs.toPairs(stakeInfoByAddress).map(([address, stakeInfos]) => {
|
3518
3518
|
const stakesBalances = stakeInfos.filter(({
|
3519
3519
|
stake
|
3520
3520
|
}) => stake >= SUBTENSOR_MIN_STAKE_AMOUNT_PLANK).map(({
|
@@ -3539,7 +3539,7 @@ const fetchStakingBalanceValuesByAddress = async (connector, networkId, miniMeta
|
|
3539
3539
|
} = dynamicInfo ?? {};
|
3540
3540
|
const tokenSymbol = new TextDecoder().decode(Uint8Array.from(token_symbol ?? []));
|
3541
3541
|
const subnetName = new TextDecoder().decode(Uint8Array.from(subnet_name ?? []));
|
3542
|
-
const subnetIdentity = subnet_identity ?
|
3542
|
+
const subnetIdentity = subnet_identity ? lodashEs.fromPairs(lodashEs.toPairs(subnet_identity).map(([key, binary]) => [key, binary.asText()])) : undefined;
|
3543
3543
|
|
3544
3544
|
// Add 1n balance if failed to fetch dynamic info, so the position is not ignored by Balance lib and is displayed in the UI.
|
3545
3545
|
const alphaStakedInTao = dynamicInfo ? calculateTaoFromDynamicInfo({
|
@@ -3582,7 +3582,7 @@ const fetchStakeInfoByAddress = async (connector, networkId, miniMetadata, addre
|
|
3582
3582
|
delay: 500,
|
3583
3583
|
retryCount: 3
|
3584
3584
|
})]));
|
3585
|
-
return
|
3585
|
+
return lodashEs.fromPairs(pairs);
|
3586
3586
|
};
|
3587
3587
|
|
3588
3588
|
// assume dynamic info doesnt change over the course of a browser session
|
@@ -3606,7 +3606,7 @@ const fetchDynamicInfoByNetuid = async (connector, networkId, miniMetadata, uniq
|
|
3606
3606
|
return dynamicInfoCache.get(cacheKey) ?? null;
|
3607
3607
|
};
|
3608
3608
|
const results = await Promise.all(uniqueNetuids.map(async netuid => [netuid, await fetchInfo(netuid)]));
|
3609
|
-
return
|
3609
|
+
return lodashEs.fromPairs(results);
|
3610
3610
|
};
|
3611
3611
|
|
3612
3612
|
const getOtherType = input => `other-${input}`;
|
@@ -4272,7 +4272,7 @@ const fetchTokens$2 = async ({
|
|
4272
4272
|
decimals: decimals,
|
4273
4273
|
existentialDeposit: miniMetadata.extra.existentialDeposit ?? "0"
|
4274
4274
|
};
|
4275
|
-
const token =
|
4275
|
+
const token = lodashEs.assign(nativeToken, tokenConfig);
|
4276
4276
|
const parsed = chaindataProvider.SubNativeTokenSchema.safeParse(token);
|
4277
4277
|
if (!parsed.success) {
|
4278
4278
|
log.warn(`Ignoring invalid token ${MODULE_TYPE$2}`, token, parsed.error);
|
@@ -4490,7 +4490,7 @@ const subscribeBalances$2 = ({
|
|
4490
4490
|
const subtensorBalancesByAddress$ = getSubtensorStakingBalances$(connector, networkId, balanceDefs, miniMetadata);
|
4491
4491
|
return rxjs.combineLatest([baseBalances$, subtensorBalancesByAddress$]).pipe(rxjs.map(([baseBalances, subtensorBalancesByAddress]) => {
|
4492
4492
|
// add subtensor balances to base balances
|
4493
|
-
for (const [address, subtensorBalances] of
|
4493
|
+
for (const [address, subtensorBalances] of lodashEs.toPairs(subtensorBalancesByAddress)) {
|
4494
4494
|
const balance = baseBalances.find(b => b.address === address);
|
4495
4495
|
if (balance?.values) balance.values.push(...subtensorBalances);
|
4496
4496
|
}
|
@@ -5805,7 +5805,7 @@ const fetchTokens$1 = async ({
|
|
5805
5805
|
continue;
|
5806
5806
|
}
|
5807
5807
|
}
|
5808
|
-
return
|
5808
|
+
return lodashEs.values(tokenList).filter(t => {
|
5809
5809
|
const parsed = chaindataProvider.SubPsp22TokenSchema.safeParse(t);
|
5810
5810
|
if (!parsed.success) log.warn(`Ignoring invalid token ${MODULE_TYPE$1}`, t);
|
5811
5811
|
return parsed.success;
|
@@ -5934,7 +5934,7 @@ const subscribeBalances$1 = ({
|
|
5934
5934
|
return () => {
|
5935
5935
|
abortController.abort();
|
5936
5936
|
};
|
5937
|
-
}).pipe(rxjs.distinctUntilChanged(
|
5937
|
+
}).pipe(rxjs.distinctUntilChanged(lodashEs.isEqual));
|
5938
5938
|
};
|
5939
5939
|
|
5940
5940
|
const SubPsp22BalanceModule = {
|
@@ -6100,7 +6100,7 @@ const fetchTokens = async ({
|
|
6100
6100
|
// in this module we do not fetch any token information from the chain
|
6101
6101
|
// this is because there are basically as many pallet implementations as there are networks (Expect Chaos, they said)
|
6102
6102
|
// we rely on the config to provide all the info we need
|
6103
|
-
return tokens.map(tokenConfig =>
|
6103
|
+
return tokens.map(tokenConfig => lodashEs.assign({
|
6104
6104
|
id: chaindataProvider.subTokensTokenId(networkId, tokenConfig.onChainId),
|
6105
6105
|
type: MODULE_TYPE,
|
6106
6106
|
platform: PLATFORM,
|
@@ -6448,8 +6448,8 @@ class BalancesProvider {
|
|
6448
6448
|
this.#chaindataProvider = chaindataProvider;
|
6449
6449
|
this.#chainConnectors = chainConnectors;
|
6450
6450
|
this.#storage = new rxjs.BehaviorSubject({
|
6451
|
-
balances:
|
6452
|
-
miniMetadatas:
|
6451
|
+
balances: lodashEs.keyBy(storage.balances.filter(util.isNotNil), b => getBalanceId(b)),
|
6452
|
+
miniMetadatas: lodashEs.keyBy(storage.miniMetadatas.filter(util.isNotNil), m => m.id)
|
6453
6453
|
});
|
6454
6454
|
}
|
6455
6455
|
get storage$() {
|
@@ -6457,8 +6457,8 @@ class BalancesProvider {
|
|
6457
6457
|
balances,
|
6458
6458
|
miniMetadatas
|
6459
6459
|
}) => ({
|
6460
|
-
balances:
|
6461
|
-
miniMetadatas:
|
6460
|
+
balances: lodashEs.values(balances).filter(util.isNotNil),
|
6461
|
+
miniMetadatas: lodashEs.values(miniMetadatas).filter(util.isNotNil)
|
6462
6462
|
})));
|
6463
6463
|
}
|
6464
6464
|
|
@@ -6469,7 +6469,7 @@ class BalancesProvider {
|
|
6469
6469
|
return util.getSharedObservable("BalancesProvider.getBalances$", addressesByTokenId, () => {
|
6470
6470
|
return this.cleanupAddressesByTokenId(addressesByTokenId).pipe(rxjs.map(
|
6471
6471
|
// split by network
|
6472
|
-
addressesByTokenId =>
|
6472
|
+
addressesByTokenId => lodashEs.toPairs(addressesByTokenId).reduce((acc, [tokenId, addresses]) => {
|
6473
6473
|
const networkId = chaindataProvider.parseTokenId(tokenId).networkId;
|
6474
6474
|
if (!acc[networkId]) acc[networkId] = {};
|
6475
6475
|
acc[networkId][tokenId] = addresses;
|
@@ -6478,7 +6478,7 @@ class BalancesProvider {
|
|
6478
6478
|
// fetch balances and start a 30s timer to mark the whole subscription live after 30s
|
6479
6479
|
rxjs.combineLatest({
|
6480
6480
|
isStale: rxjs.timer(30_000).pipe(rxjs.map(() => true), rxjs.startWith(false)),
|
6481
|
-
results: rxjs.combineLatest(
|
6481
|
+
results: rxjs.combineLatest(lodashEs.toPairs(addressesByTokenIdByNetworkId).map(([networkId]) => this.getNetworkBalances$(networkId, addressesByTokenIdByNetworkId[networkId])))
|
6482
6482
|
})), rxjs.map(
|
6483
6483
|
// combine
|
6484
6484
|
({
|
@@ -6495,7 +6495,7 @@ class BalancesProvider {
|
|
6495
6495
|
})), rxjs.startWith({
|
6496
6496
|
status: "initialising",
|
6497
6497
|
balances: this.getStoredBalances(addressesByTokenId)
|
6498
|
-
}), rxjs.distinctUntilChanged(
|
6498
|
+
}), rxjs.distinctUntilChanged(lodashEs.isEqual));
|
6499
6499
|
});
|
6500
6500
|
}
|
6501
6501
|
fetchBalances(addressesByTokenId) {
|
@@ -6511,14 +6511,14 @@ class BalancesProvider {
|
|
6511
6511
|
const tokensMapById$ = this.#chaindataProvider.getTokensMapById$();
|
6512
6512
|
const miniMetadatas$ = this.getNetworkMiniMetadatas$(networkId);
|
6513
6513
|
return rxjs.combineLatest([network$, miniMetadatas$, tokensMapById$]).pipe(rxjs.switchMap(([network, miniMetadatas, tokensMapById]) => {
|
6514
|
-
const tokensAndAddresses =
|
6514
|
+
const tokensAndAddresses = lodashEs.toPairs(addressesByTokenId).map(([tokenId, addresses]) => [tokensMapById[tokenId], addresses]);
|
6515
6515
|
return rxjs.combineLatest(BALANCE_MODULES.filter(mod => mod.platform === network?.platform).map(mod => {
|
6516
6516
|
const tokensWithAddresses = tokensAndAddresses.filter(([token]) => token.type === mod.type);
|
6517
|
-
const moduleAddressesByTokenId =
|
6517
|
+
const moduleAddressesByTokenId = lodashEs.fromPairs(tokensWithAddresses.map(([token, addresses]) => [token.id, addresses]));
|
6518
6518
|
const miniMetadata = miniMetadatas.find(m => m.source === mod.type);
|
6519
6519
|
|
6520
6520
|
// all balance ids expected in result set
|
6521
|
-
const balanceIds =
|
6521
|
+
const balanceIds = lodashEs.toPairs(moduleAddressesByTokenId).flatMap(([tokenId, addresses]) => addresses.map(address => getBalanceId({
|
6522
6522
|
tokenId,
|
6523
6523
|
address
|
6524
6524
|
})));
|
@@ -6531,15 +6531,15 @@ class BalancesProvider {
|
|
6531
6531
|
const updateStorage = results => {
|
6532
6532
|
if (results.status !== "live") return;
|
6533
6533
|
const storage = this.#storage.getValue();
|
6534
|
-
const balances =
|
6534
|
+
const balances = lodashEs.assign({}, storage.balances,
|
6535
6535
|
// delete all balances expected in the result set. because if they are not present it means they are empty.
|
6536
|
-
|
6536
|
+
lodashEs.fromPairs(balanceIds.map(balanceId => [balanceId, undefined])), lodashEs.keyBy(
|
6537
6537
|
// storage balances must have status "cache", because they are used as start value when initialising subsequent subscriptions
|
6538
6538
|
results.balances.map(b => ({
|
6539
6539
|
...b,
|
6540
6540
|
status: "cache"
|
6541
6541
|
})), b => getBalanceId(b)));
|
6542
|
-
this.#storage.next(
|
6542
|
+
this.#storage.next(lodashEs.assign({}, storage, {
|
6543
6543
|
balances
|
6544
6544
|
}));
|
6545
6545
|
};
|
@@ -6609,12 +6609,12 @@ class BalancesProvider {
|
|
6609
6609
|
rxjs.tap(newMiniMetadatas => {
|
6610
6610
|
if (!newMiniMetadatas.length) return;
|
6611
6611
|
const storage = this.#storage.getValue();
|
6612
|
-
const miniMetadatas =
|
6612
|
+
const miniMetadatas = lodashEs.assign(
|
6613
6613
|
// keep minimetadatas of other networks
|
6614
|
-
|
6614
|
+
lodashEs.keyBy(lodashEs.values(storage.miniMetadatas).filter(m => m.chainId !== networkId), m => m.id),
|
6615
6615
|
// add the ones for our network
|
6616
|
-
|
6617
|
-
this.#storage.next(
|
6616
|
+
lodashEs.keyBy(newMiniMetadatas, m => m.id));
|
6617
|
+
this.#storage.next(lodashEs.assign({}, storage, {
|
6618
6618
|
miniMetadatas
|
6619
6619
|
}));
|
6620
6620
|
}));
|
@@ -6626,13 +6626,13 @@ class BalancesProvider {
|
|
6626
6626
|
});
|
6627
6627
|
}
|
6628
6628
|
getStoredMiniMetadatas$(networkId, specVersion) {
|
6629
|
-
return this.storage$.pipe(rxjs.map(storage => storage.miniMetadatas.filter(m => m.chainId === networkId && m.specVersion === specVersion && m.version === chaindataProvider.MINIMETADATA_VERSION)), rxjs.distinctUntilChanged(
|
6629
|
+
return this.storage$.pipe(rxjs.map(storage => storage.miniMetadatas.filter(m => m.chainId === networkId && m.specVersion === specVersion && m.version === chaindataProvider.MINIMETADATA_VERSION)), rxjs.distinctUntilChanged(lodashEs.isEqual));
|
6630
6630
|
}
|
6631
6631
|
getDefaultMiniMetadatas$(networkId, specVersion) {
|
6632
|
-
return this.#chaindataProvider.miniMetadatas$.pipe(rxjs.map(miniMetadatas => miniMetadatas.filter(m => m.chainId === networkId && m.specVersion === specVersion && m.version === chaindataProvider.MINIMETADATA_VERSION)), rxjs.distinctUntilChanged(
|
6632
|
+
return this.#chaindataProvider.miniMetadatas$.pipe(rxjs.map(miniMetadatas => miniMetadatas.filter(m => m.chainId === networkId && m.specVersion === specVersion && m.version === chaindataProvider.MINIMETADATA_VERSION)), rxjs.distinctUntilChanged(lodashEs.isEqual));
|
6633
6633
|
}
|
6634
6634
|
getStoredBalances(addressesByToken) {
|
6635
|
-
const balanceDefs =
|
6635
|
+
const balanceDefs = lodashEs.toPairs(addressesByToken).flatMap(([tokenId, addresses]) => addresses.map(address => [tokenId, address]));
|
6636
6636
|
return balanceDefs.map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({
|
6637
6637
|
address,
|
6638
6638
|
tokenId
|
@@ -6640,7 +6640,7 @@ class BalancesProvider {
|
|
6640
6640
|
}
|
6641
6641
|
cleanupAddressesByTokenId(addressesByTokenId) {
|
6642
6642
|
return this.#chaindataProvider.getNetworksMapById$().pipe(rxjs.map(networksById => {
|
6643
|
-
return
|
6643
|
+
return lodashEs.fromPairs(lodashEs.toPairs(addressesByTokenId).map(([tokenId, addresses]) => {
|
6644
6644
|
const networkId = chaindataProvider.parseTokenId(tokenId).networkId;
|
6645
6645
|
const network = networksById[networkId];
|
6646
6646
|
return [tokenId, addresses.filter(address => network && isAddressCompatibleWithNetwork(network, address))];
|
@@ -2,7 +2,7 @@ import { EvmErc20TokenSchema, parseTokenId, parseEvmErc20TokenId, evmErc20TokenI
|
|
2
2
|
export { MINIMETADATA_VERSION } from '@talismn/chaindata-provider';
|
3
3
|
import { isEthereumAddress, isNotNil, BigMath, isArrayOf, isBigInt, planckToTokens, isAbortError, getSharedObservable } from '@talismn/util';
|
4
4
|
import { parseAbi, erc20Abi, getContract, ContractFunctionExecutionError, hexToString, erc20Abi_bytes32, encodeFunctionData, withRetry } from 'viem';
|
5
|
-
import { assign, omit, isEqual, keyBy, keys, uniq, fromPairs, values, toPairs } from 'lodash';
|
5
|
+
import { assign, omit, isEqual, keyBy, keys, uniq, fromPairs, values, toPairs } from 'lodash-es';
|
6
6
|
import z from 'zod/v4';
|
7
7
|
import anylogger from 'anylogger';
|
8
8
|
import { of, Observable, distinctUntilChanged, map, timer, switchMap, from, firstValueFrom, combineLatest, BehaviorSubject, startWith, filter, tap } from 'rxjs';
|
@@ -11,7 +11,7 @@ import { newTokenRates } from '@talismn/token-rates';
|
|
11
11
|
import BigNumber from 'bignumber.js';
|
12
12
|
import { mergeUint8 } from '@polkadot-api/utils';
|
13
13
|
import { Binary, Enum, AccountId } from 'polkadot-api';
|
14
|
-
import upperFirst from 'lodash/upperFirst';
|
14
|
+
import upperFirst from 'lodash-es/upperFirst';
|
15
15
|
import { u32 } from 'scale-ts';
|
16
16
|
import { Abi } from '@polkadot/api-contract';
|
17
17
|
import { TypeRegistry } from '@polkadot/types';
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@talismn/balances",
|
3
|
-
"version": "0.0.0-pr2075-
|
3
|
+
"version": "0.0.0-pr2075-20250710052843",
|
4
4
|
"author": "Talisman",
|
5
5
|
"homepage": "https://talisman.xyz",
|
6
6
|
"license": "GPL-3.0-or-later",
|
@@ -26,7 +26,7 @@
|
|
26
26
|
"anylogger": "^1.0.11",
|
27
27
|
"bignumber.js": "^9.1.2",
|
28
28
|
"dexie": "^4.0.9",
|
29
|
-
"lodash": "4.17.21",
|
29
|
+
"lodash-es": "4.17.21",
|
30
30
|
"p-queue": "^8.1.0",
|
31
31
|
"pako": "^2.1.0",
|
32
32
|
"polkadot-api": "1.13.1",
|
@@ -34,13 +34,13 @@
|
|
34
34
|
"scale-ts": "^1.6.1",
|
35
35
|
"viem": "^2.27.3",
|
36
36
|
"zod": "^3.25.62",
|
37
|
-
"@talismn/
|
38
|
-
"@talismn/chain-connector
|
39
|
-
"@talismn/
|
40
|
-
"@talismn/
|
41
|
-
"@talismn/
|
42
|
-
"@talismn/
|
43
|
-
"@talismn/
|
37
|
+
"@talismn/chaindata-provider": "0.0.0-pr2075-20250710052843",
|
38
|
+
"@talismn/chain-connector": "0.0.0-pr2075-20250710052843",
|
39
|
+
"@talismn/chain-connector-evm": "0.0.0-pr2075-20250710052843",
|
40
|
+
"@talismn/scale": "0.0.0-pr2075-20250710052843",
|
41
|
+
"@talismn/util": "0.0.0-pr2075-20250710052843",
|
42
|
+
"@talismn/sapi": "0.0.0-pr2075-20250710052843",
|
43
|
+
"@talismn/token-rates": "0.0.0-pr2075-20250710052843"
|
44
44
|
},
|
45
45
|
"devDependencies": {
|
46
46
|
"@polkadot/api-contract": "16.1.2",
|
@@ -49,7 +49,7 @@
|
|
49
49
|
"@polkadot/util-crypto": "13.5.1",
|
50
50
|
"@substrate/txwrapper-core": "7.5.3",
|
51
51
|
"@types/jest": "^29.5.14",
|
52
|
-
"@types/lodash": "^4.17.12",
|
52
|
+
"@types/lodash-es": "^4.17.12",
|
53
53
|
"@types/pako": "^2.0.3",
|
54
54
|
"eslint": "^8.57.1",
|
55
55
|
"jest": "^29.7.0",
|