@talismn/balances 0.0.0-pr2075-20250710043243 → 0.0.0-pr2075-20250710071608
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/modules/shared/index.d.ts +0 -3
- package/dist/declarations/src/modules/shared/utils.d.ts +2 -0
- package/dist/talismn-balances.cjs.dev.js +84 -281
- package/dist/talismn-balances.cjs.prod.js +84 -281
- package/dist/talismn-balances.esm.js +32 -229
- package/package.json +10 -10
- package/dist/declarations/src/modules/shared/getContantValue.d.ts +0 -1
- package/dist/declarations/src/modules/shared/hasConstantValue.d.ts +0 -427
- package/dist/declarations/src/modules/shared/tryGetConstantValue.d.ts +0 -1
@@ -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 = {
|
@@ -1286,19 +1286,6 @@ const getUniswapV2PairContractData = async (client, contractAddress) => {
|
|
1286
1286
|
};
|
1287
1287
|
};
|
1288
1288
|
|
1289
|
-
// const TokenCacheSchema = EvmUniswapV2TokenSchema.pick({
|
1290
|
-
// id: true,
|
1291
|
-
// symbol: true,
|
1292
|
-
// decimals: true,
|
1293
|
-
// name: true,
|
1294
|
-
// tokenAddress0: true,
|
1295
|
-
// tokenAddress1: true,
|
1296
|
-
// decimals0: true,
|
1297
|
-
// decimals1: true,
|
1298
|
-
// symbol0: true,
|
1299
|
-
// symbol1: true,
|
1300
|
-
// })
|
1301
|
-
|
1302
1289
|
const TokenCacheSchema = z__default.default.discriminatedUnion("isValid", [z__default.default.strictObject({
|
1303
1290
|
id: chaindataProvider.EvmUniswapV2TokenSchema.shape.id,
|
1304
1291
|
isValid: z__default.default.literal(true),
|
@@ -1382,7 +1369,7 @@ const fetchTokens$6 = async ({
|
|
1382
1369
|
};
|
1383
1370
|
const cached2 = cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data;
|
1384
1371
|
if (cached2?.isValid === false) continue;
|
1385
|
-
const token =
|
1372
|
+
const token = lodashEs.assign(base, cached2?.isValid ? lodashEs.omit(cached2, ["isValid"]) : {}, tokenConfig);
|
1386
1373
|
const parsed = chaindataProvider.EvmUniswapV2TokenSchema.safeParse(token);
|
1387
1374
|
if (!parsed.success) {
|
1388
1375
|
log.warn("Ignoring token with invalid schema", token);
|
@@ -1455,7 +1442,7 @@ const subscribeBalances$6 = ({
|
|
1455
1442
|
return () => {
|
1456
1443
|
abortController.abort();
|
1457
1444
|
};
|
1458
|
-
}).pipe(rxjs.distinctUntilChanged(
|
1445
|
+
}).pipe(rxjs.distinctUntilChanged(lodashEs.isEqual));
|
1459
1446
|
};
|
1460
1447
|
|
1461
1448
|
const EvmUniswapV2BalanceModule = {
|
@@ -1534,6 +1521,21 @@ const fetchRuntimeCallResult = async (connector, networkId, metadataRpc, apiName
|
|
1534
1521
|
return call.value.dec(hex);
|
1535
1522
|
};
|
1536
1523
|
|
1524
|
+
const hasStorageItem = (metadata, palletName, itemName) => {
|
1525
|
+
const pallet = metadata.pallets.find(p => p.name === palletName);
|
1526
|
+
if (!pallet || !pallet.storage) return false;
|
1527
|
+
return pallet.storage.items.some(item => item.name === itemName);
|
1528
|
+
};
|
1529
|
+
const hasStorageItems = (metadata, palletName, itemNames) => {
|
1530
|
+
const pallet = metadata.pallets.find(p => p.name === palletName);
|
1531
|
+
if (!pallet || !pallet.storage) return false;
|
1532
|
+
return itemNames.every(itemName => pallet.storage?.items.some(item => item.name === itemName));
|
1533
|
+
};
|
1534
|
+
const hasRuntimeApi = (metadata, apiName, method) => {
|
1535
|
+
const api = metadata.apis.find(api => api.name === apiName);
|
1536
|
+
if (!api || !api.methods) return false;
|
1537
|
+
return api.methods.some(m => m.name === method);
|
1538
|
+
};
|
1537
1539
|
const getConstantValue = (metadataRpc, pallet, constant) => {
|
1538
1540
|
const {
|
1539
1541
|
unifiedMetadata,
|
@@ -1548,7 +1550,6 @@ const getConstantValue = (metadataRpc, pallet, constant) => {
|
|
1548
1550
|
if (!encodedValue) throw new Error(`Constant ${pallet}.${constant} not found`);
|
1549
1551
|
return codec.dec(encodedValue);
|
1550
1552
|
};
|
1551
|
-
|
1552
1553
|
const tryGetConstantValue = (metadataRpc, pallet, constant) => {
|
1553
1554
|
const {
|
1554
1555
|
unifiedMetadata,
|
@@ -1564,22 +1565,6 @@ const tryGetConstantValue = (metadataRpc, pallet, constant) => {
|
|
1564
1565
|
return codec.dec(encodedValue);
|
1565
1566
|
};
|
1566
1567
|
|
1567
|
-
const hasStorageItem = (metadata, palletName, itemName) => {
|
1568
|
-
const pallet = metadata.pallets.find(p => p.name === palletName);
|
1569
|
-
if (!pallet || !pallet.storage) return false;
|
1570
|
-
return pallet.storage.items.some(item => item.name === itemName);
|
1571
|
-
};
|
1572
|
-
const hasStorageItems = (metadata, palletName, itemNames) => {
|
1573
|
-
const pallet = metadata.pallets.find(p => p.name === palletName);
|
1574
|
-
if (!pallet || !pallet.storage) return false;
|
1575
|
-
return itemNames.every(itemName => pallet.storage?.items.some(item => item.name === itemName));
|
1576
|
-
};
|
1577
|
-
const hasRuntimeApi = (metadata, apiName, method) => {
|
1578
|
-
const api = metadata.apis.find(api => api.name === apiName);
|
1579
|
-
if (!api || !api.methods) return false;
|
1580
|
-
return api.methods.some(m => m.name === method);
|
1581
|
-
};
|
1582
|
-
|
1583
1568
|
const buildNetworkStorageCoders = (chainId, miniMetadata, coders) => {
|
1584
1569
|
if (!miniMetadata.data) return null;
|
1585
1570
|
const metadata = scale.unifyMetadata(scale.decAnyMetadata(miniMetadata.data));
|
@@ -1767,7 +1752,7 @@ const fetchTokens$5 = async ({
|
|
1767
1752
|
const [assetStorageResults, metadataStorageResults] = await Promise.all([connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]), connector.send(networkId, "state_queryStorageAt", [allMetadataStorageKeys])]);
|
1768
1753
|
const assetStorageEntries = assetStorageResults[0].changes;
|
1769
1754
|
const metadataStorageEntries = metadataStorageResults[0].changes;
|
1770
|
-
const assetByAssetId =
|
1755
|
+
const assetByAssetId = lodashEs.keyBy(assetStorageEntries.map(([key, value]) => {
|
1771
1756
|
const [assetId] = assetCodec.keys.dec(key);
|
1772
1757
|
const asset = assetCodec.value.dec(value);
|
1773
1758
|
return {
|
@@ -1776,7 +1761,7 @@ const fetchTokens$5 = async ({
|
|
1776
1761
|
isSufficient: asset.is_sufficient
|
1777
1762
|
};
|
1778
1763
|
}), a => a.assetId);
|
1779
|
-
const metadataByAssetId =
|
1764
|
+
const metadataByAssetId = lodashEs.keyBy(metadataStorageEntries.map(([key, value]) => {
|
1780
1765
|
const [assetId] = metadataCodec.keys.dec(key);
|
1781
1766
|
const metadata = metadataCodec.value.dec(value);
|
1782
1767
|
return {
|
@@ -1787,8 +1772,8 @@ const fetchTokens$5 = async ({
|
|
1787
1772
|
symbol: metadata.symbol?.asText()
|
1788
1773
|
};
|
1789
1774
|
}), a => a.assetId);
|
1790
|
-
const allTokens =
|
1791
|
-
const configTokenByAssetId =
|
1775
|
+
const allTokens = lodashEs.keys(assetByAssetId).map(assetId => lodashEs.assign({}, assetByAssetId[assetId], metadataByAssetId[assetId] ?? undefined));
|
1776
|
+
const configTokenByAssetId = lodashEs.keyBy(tokens, t => t.assetId);
|
1792
1777
|
return allTokens.map(asset => ({
|
1793
1778
|
id: chaindataProvider.subAssetTokenId(networkId, String(asset.assetId)),
|
1794
1779
|
type: MODULE_TYPE$5,
|
@@ -1811,7 +1796,7 @@ const fetchTokens$5 = async ({
|
|
1811
1796
|
// apply config overrides
|
1812
1797
|
.map(token => {
|
1813
1798
|
const configToken = configTokenByAssetId[token.assetId];
|
1814
|
-
return configToken ?
|
1799
|
+
return configToken ? lodashEs.assign({}, token, configToken) : token;
|
1815
1800
|
})
|
1816
1801
|
// validate results
|
1817
1802
|
.filter(t => {
|
@@ -2919,7 +2904,7 @@ const fetchTokens$4 = async ({
|
|
2919
2904
|
const [assetStorageResults, metadataStorageResults] = await Promise.all([connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]), connector.send(networkId, "state_queryStorageAt", [allMetadataStorageKeys])]);
|
2920
2905
|
const assetStorageEntries = assetStorageResults[0].changes;
|
2921
2906
|
const metadataStorageEntries = metadataStorageResults[0].changes;
|
2922
|
-
const assetByOnChainId =
|
2907
|
+
const assetByOnChainId = lodashEs.keyBy(assetStorageEntries.map(([key, value]) => {
|
2923
2908
|
const [decodedKey] = assetCodec.keys.dec(key);
|
2924
2909
|
const onChainId = scale.papiStringify(decodedKey);
|
2925
2910
|
const asset = assetCodec.value.dec(value);
|
@@ -2929,7 +2914,7 @@ const fetchTokens$4 = async ({
|
|
2929
2914
|
isSufficient: asset.is_sufficient
|
2930
2915
|
};
|
2931
2916
|
}), a => a.onChainId);
|
2932
|
-
const metadataByOnChainId =
|
2917
|
+
const metadataByOnChainId = lodashEs.keyBy(metadataStorageEntries.map(([key, value]) => {
|
2933
2918
|
const [decodedKey] = metadataCodec.keys.dec(key);
|
2934
2919
|
const onChainId = scale.papiStringify(decodedKey);
|
2935
2920
|
const metadata = metadataCodec.value.dec(value);
|
@@ -2941,8 +2926,8 @@ const fetchTokens$4 = async ({
|
|
2941
2926
|
symbol: metadata.symbol?.asText()
|
2942
2927
|
};
|
2943
2928
|
}), a => a.onChainId);
|
2944
|
-
const allTokens =
|
2945
|
-
const configTokenByOnChainId =
|
2929
|
+
const allTokens = lodashEs.keys(assetByOnChainId).map(onChainId => lodashEs.assign({}, assetByOnChainId[onChainId], metadataByOnChainId[onChainId] ?? undefined));
|
2930
|
+
const configTokenByOnChainId = lodashEs.keyBy(tokens, t => t.onChainId);
|
2946
2931
|
return allTokens.map(asset => ({
|
2947
2932
|
id: chaindataProvider.subForeignAssetTokenId(networkId, asset.onChainId),
|
2948
2933
|
type: MODULE_TYPE$4,
|
@@ -2965,7 +2950,7 @@ const fetchTokens$4 = async ({
|
|
2965
2950
|
// apply config overrides
|
2966
2951
|
.map(token => {
|
2967
2952
|
const configToken = configTokenByOnChainId[token.onChainId];
|
2968
|
-
return configToken ?
|
2953
|
+
return configToken ? lodashEs.assign({}, token, configToken) : token;
|
2969
2954
|
})
|
2970
2955
|
// validate results
|
2971
2956
|
.filter(t => {
|
@@ -3187,7 +3172,7 @@ const fetchBalances$3 = async ({
|
|
3187
3172
|
}))
|
3188
3173
|
};
|
3189
3174
|
}
|
3190
|
-
const addresses =
|
3175
|
+
const addresses = lodashEs.uniq(balanceDefs.map(def => def.address));
|
3191
3176
|
try {
|
3192
3177
|
const res = await Promise.all(addresses.map(address => fetchRuntimeCallResult(connector, networkId, miniMetadata.data, "CurrenciesApi", "accounts", [address])));
|
3193
3178
|
const fetchedBalances = addresses.flatMap((address, index) => {
|
@@ -3199,7 +3184,7 @@ const fetchBalances$3 = async ({
|
|
3199
3184
|
frozen: balance.frozen.toString()
|
3200
3185
|
})).filter(b => b.onChainId !== undefined);
|
3201
3186
|
});
|
3202
|
-
const balancesByKey =
|
3187
|
+
const balancesByKey = lodashEs.keyBy(fetchedBalances, b => `${b.address}:${b.onChainId}`);
|
3203
3188
|
const success = tokensWithAddresses.reduce((acc, [token, addresses]) => {
|
3204
3189
|
if (token.type === MODULE_TYPE$3) for (const address of addresses) {
|
3205
3190
|
const rawBalance = balancesByKey[`${address}:${token.onChainId}`];
|
@@ -3263,7 +3248,7 @@ const fetchTokens$3 = async ({
|
|
3263
3248
|
const allAssetStorageKeys = await connector.send(networkId, "state_getKeys", [scale.getStorageKeyPrefix("AssetRegistry", "Assets")]);
|
3264
3249
|
const assetStorageResults = await connector.send(networkId, "state_queryStorageAt", [allAssetStorageKeys]);
|
3265
3250
|
const assetStorageEntries = assetStorageResults[0].changes;
|
3266
|
-
const configTokenByAssetId =
|
3251
|
+
const configTokenByAssetId = lodashEs.keyBy(tokens, t => t.onChainId);
|
3267
3252
|
return assetStorageEntries.map(([key, value]) => {
|
3268
3253
|
// parse results
|
3269
3254
|
const [onChainId] = assetsCodec.keys.dec(key);
|
@@ -3306,7 +3291,7 @@ const fetchTokens$3 = async ({
|
|
3306
3291
|
// apply config overrides
|
3307
3292
|
.map(token => {
|
3308
3293
|
const configToken = configTokenByAssetId[token.onChainId];
|
3309
|
-
return configToken ?
|
3294
|
+
return configToken ? lodashEs.assign({}, token, configToken) : token;
|
3310
3295
|
})
|
3311
3296
|
// validate results
|
3312
3297
|
.filter(t => {
|
@@ -3445,7 +3430,7 @@ const subscribeBalances$3 = ({
|
|
3445
3430
|
return () => {
|
3446
3431
|
abortController.abort();
|
3447
3432
|
};
|
3448
|
-
}).pipe(rxjs.distinctUntilChanged(
|
3433
|
+
}).pipe(rxjs.distinctUntilChanged(lodashEs.isEqual));
|
3449
3434
|
};
|
3450
3435
|
|
3451
3436
|
const SubHydrationBalanceModule = {
|
@@ -3512,9 +3497,9 @@ const getSubtensorStakingBalances$ = (connector, networkId, balanceDefs, miniMet
|
|
3512
3497
|
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
3498
|
};
|
3514
3499
|
const fetchStakingBalanceValuesByAddress = async (connector, networkId, miniMetadata, stakeInfoByAddress) => {
|
3515
|
-
const uniqueNetuids =
|
3500
|
+
const uniqueNetuids = lodashEs.uniq(lodashEs.values(stakeInfoByAddress).flatMap(infos => infos.map(info => info.netuid))).filter(netuid => netuid !== SUBTENSOR_ROOT_NETUID);
|
3516
3501
|
const dynamicInfoByNetuid = await fetchDynamicInfoByNetuid(connector, networkId, miniMetadata, uniqueNetuids);
|
3517
|
-
return
|
3502
|
+
return lodashEs.fromPairs(lodashEs.toPairs(stakeInfoByAddress).map(([address, stakeInfos]) => {
|
3518
3503
|
const stakesBalances = stakeInfos.filter(({
|
3519
3504
|
stake
|
3520
3505
|
}) => stake >= SUBTENSOR_MIN_STAKE_AMOUNT_PLANK).map(({
|
@@ -3539,7 +3524,7 @@ const fetchStakingBalanceValuesByAddress = async (connector, networkId, miniMeta
|
|
3539
3524
|
} = dynamicInfo ?? {};
|
3540
3525
|
const tokenSymbol = new TextDecoder().decode(Uint8Array.from(token_symbol ?? []));
|
3541
3526
|
const subnetName = new TextDecoder().decode(Uint8Array.from(subnet_name ?? []));
|
3542
|
-
const subnetIdentity = subnet_identity ?
|
3527
|
+
const subnetIdentity = subnet_identity ? lodashEs.fromPairs(lodashEs.toPairs(subnet_identity).map(([key, binary]) => [key, binary.asText()])) : undefined;
|
3543
3528
|
|
3544
3529
|
// 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
3530
|
const alphaStakedInTao = dynamicInfo ? calculateTaoFromDynamicInfo({
|
@@ -3582,7 +3567,7 @@ const fetchStakeInfoByAddress = async (connector, networkId, miniMetadata, addre
|
|
3582
3567
|
delay: 500,
|
3583
3568
|
retryCount: 3
|
3584
3569
|
})]));
|
3585
|
-
return
|
3570
|
+
return lodashEs.fromPairs(pairs);
|
3586
3571
|
};
|
3587
3572
|
|
3588
3573
|
// assume dynamic info doesnt change over the course of a browser session
|
@@ -3606,7 +3591,7 @@ const fetchDynamicInfoByNetuid = async (connector, networkId, miniMetadata, uniq
|
|
3606
3591
|
return dynamicInfoCache.get(cacheKey) ?? null;
|
3607
3592
|
};
|
3608
3593
|
const results = await Promise.all(uniqueNetuids.map(async netuid => [netuid, await fetchInfo(netuid)]));
|
3609
|
-
return
|
3594
|
+
return lodashEs.fromPairs(results);
|
3610
3595
|
};
|
3611
3596
|
|
3612
3597
|
const getOtherType = input => `other-${input}`;
|
@@ -3757,41 +3742,6 @@ const buildBaseQueries = (networkId, balanceDefs, miniMetadata) => {
|
|
3757
3742
|
};
|
3758
3743
|
}).filter(util.isNotNil);
|
3759
3744
|
};
|
3760
|
-
|
3761
|
-
// AccountInfo is the state_storage data format for nativeToken balances
|
3762
|
-
// Theory: new chains will be at least on metadata v14, and so we won't need to hardcode their AccountInfo type.
|
3763
|
-
// But for chains we want to support which aren't on metadata v14, hardcode them here:
|
3764
|
-
// If the chain upgrades to metadata v14, this override will be ignored :)
|
3765
|
-
// const RegularAccountInfoFallback = Struct({
|
3766
|
-
// nonce: u32,
|
3767
|
-
// consumers: u32,
|
3768
|
-
// providers: u32,
|
3769
|
-
// sufficients: u32,
|
3770
|
-
// data: Struct({ free: u128, reserved: u128, miscFrozen: u128, feeFrozen: u128 }),
|
3771
|
-
// })
|
3772
|
-
// const NoSufficientsAccountInfoFallback = Struct({
|
3773
|
-
// nonce: u32,
|
3774
|
-
// consumers: u32,
|
3775
|
-
// providers: u32,
|
3776
|
-
// data: Struct({ free: u128, reserved: u128, miscFrozen: u128, feeFrozen: u128 }),
|
3777
|
-
// })
|
3778
|
-
// const AccountInfoOverrides: Record<
|
3779
|
-
// string,
|
3780
|
-
// typeof RegularAccountInfoFallback | typeof NoSufficientsAccountInfoFallback | undefined
|
3781
|
-
// > = {
|
3782
|
-
// // crown-sterlin is not yet on metadata v14
|
3783
|
-
// "crown-sterling": NoSufficientsAccountInfoFallback,
|
3784
|
-
|
3785
|
-
// // crust is not yet on metadata v14
|
3786
|
-
// "crust": NoSufficientsAccountInfoFallback,
|
3787
|
-
|
3788
|
-
// // kulupu is not yet on metadata v14
|
3789
|
-
// "kulupu": RegularAccountInfoFallback,
|
3790
|
-
|
3791
|
-
// // nftmart is not yet on metadata v14
|
3792
|
-
// "nftmart": RegularAccountInfoFallback,
|
3793
|
-
// }
|
3794
|
-
|
3795
3745
|
const decodeBaseResult = (coder, value, networkId) => {
|
3796
3746
|
/** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */
|
3797
3747
|
|
@@ -3842,15 +3792,6 @@ const decodeLocksResult = (coder, value, networkId) => {
|
|
3842
3792
|
amount: (lock?.amount ?? 0n).toString()
|
3843
3793
|
})) ?? [];
|
3844
3794
|
return locksQueryLocks;
|
3845
|
-
|
3846
|
-
// // locked values should be replaced entirely, not merged or appended
|
3847
|
-
// const nonLockValues = balanceJson.values.filter(
|
3848
|
-
// (v) => v.source !== "substrate-native-locks",
|
3849
|
-
// )
|
3850
|
-
// balanceJson.values = nonLockValues.concat(locksQueryLocks)
|
3851
|
-
|
3852
|
-
// // fix any double-counting between Balances.Locks (for staking locks) and Staking.Ledger (for unbonding locks)
|
3853
|
-
// balanceJson.values = updateStakingLocksUsingUnbondingLocks(balanceJson.values)
|
3854
3795
|
};
|
3855
3796
|
const decodeFreezesResult = (coder, value, networkId) => {
|
3856
3797
|
/** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */
|
@@ -3863,14 +3804,6 @@ const decodeFreezesResult = (coder, value, networkId) => {
|
|
3863
3804
|
amount: lock?.amount?.toString?.() ?? "0"
|
3864
3805
|
})) ?? [];
|
3865
3806
|
return freezesValues;
|
3866
|
-
|
3867
|
-
// // freezes values should be replaced entirely, not merged or appended
|
3868
|
-
// const nonFreezesValues = balanceJson.values.filter(
|
3869
|
-
// (v) => v.source !== "substrate-native-freezes",
|
3870
|
-
// )
|
3871
|
-
// balanceJson.values = nonFreezesValues.concat(freezesQueryLocks)
|
3872
|
-
|
3873
|
-
// return balanceJson
|
3874
3807
|
};
|
3875
3808
|
const decodeHoldsResult = (coder, value, networkId) => {
|
3876
3809
|
/** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */
|
@@ -3889,14 +3822,6 @@ const decodeHoldsResult = (coder, value, networkId) => {
|
|
3889
3822
|
}
|
3890
3823
|
})) ?? [];
|
3891
3824
|
return holdsValues;
|
3892
|
-
|
3893
|
-
// // values should be replaced entirely, not merged or appended
|
3894
|
-
// const nonHoldsValues = balanceJson.values.filter(
|
3895
|
-
// (v) => v.source !== "substrate-native-holds",
|
3896
|
-
// )
|
3897
|
-
// balanceJson.values = nonHoldsValues.concat(holdsQueryLocks)
|
3898
|
-
|
3899
|
-
// return balanceJson
|
3900
3825
|
};
|
3901
3826
|
const decodeStakingLedgerResult = (coder, value, networkId) => {
|
3902
3827
|
/** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */
|
@@ -3911,29 +3836,6 @@ const decodeStakingLedgerResult = (coder, value, networkId) => {
|
|
3911
3836
|
amount: totalUnlocking.toString()
|
3912
3837
|
}];
|
3913
3838
|
return stakingLedgerResults;
|
3914
|
-
|
3915
|
-
// if (totalUnlocking <= 0n) unbondingQueryLocks = []
|
3916
|
-
// else {
|
3917
|
-
// unbondingQueryLocks = [
|
3918
|
-
// {
|
3919
|
-
// type: "locked",
|
3920
|
-
// source: "substrate-native-unbonding",
|
3921
|
-
// label: "Unbonding",
|
3922
|
-
// amount: totalUnlocking.toString(),
|
3923
|
-
// },
|
3924
|
-
// ]
|
3925
|
-
// }
|
3926
|
-
|
3927
|
-
// // unbonding values should be replaced entirely, not merged or appended
|
3928
|
-
// const nonUnbondingValues = balanceJson.values.filter(
|
3929
|
-
// (v) => v.source !== "substrate-native-unbonding",
|
3930
|
-
// )
|
3931
|
-
// balanceJson.values = nonUnbondingValues.concat(unbondingQueryLocks)
|
3932
|
-
|
3933
|
-
// // fix any double-counting between Balances.Locks (for staking locks) and Staking.Ledger (for unbonding locks)
|
3934
|
-
// balanceJson.values = updateStakingLocksUsingUnbondingLocks(balanceJson.values)
|
3935
|
-
|
3936
|
-
// return balanceJson
|
3937
3839
|
};
|
3938
3840
|
const decodePoolMemberResult = (coder, value, networkId) => {
|
3939
3841
|
/** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */
|
@@ -3960,109 +3862,6 @@ const decodePoolMemberResult = (coder, value, networkId) => {
|
|
3960
3862
|
};
|
3961
3863
|
};
|
3962
3864
|
|
3963
|
-
// const getBaseQuery = (
|
3964
|
-
// networkId: string,
|
3965
|
-
// address: string,
|
3966
|
-
// coder: ScaleStorageCoder,
|
3967
|
-
// ): RpcStateQuery<Array<AmountWithLabel<string>>> | null => {
|
3968
|
-
// // For chains which are using metadata < v14
|
3969
|
-
// const getFallbackStateKey = () => {
|
3970
|
-
// const addressBytes = decodeAnyAddress(address) // TODO replace with modern api, this is slow
|
3971
|
-
// const addressHash = blake2Concat(addressBytes).replace(/^0x/, "")
|
3972
|
-
// const moduleHash = "26aa394eea5630e07c48ae0c9558cef7" // util_crypto.xxhashAsHex("System", 128);
|
3973
|
-
// const storageHash = "b99d880ec681799c0cf30e8886371da9" // util_crypto.xxhashAsHex("Account", 128);
|
3974
|
-
// const moduleStorageHash = `${moduleHash}${storageHash}` // System.Account is the state_storage key prefix for nativeToken balances
|
3975
|
-
// return `0x${moduleStorageHash}${addressHash}`
|
3976
|
-
// }
|
3977
|
-
|
3978
|
-
// // const scaleCoder = chainStorageCoders.get(chainId)?.base
|
3979
|
-
// // NOTE: Only use fallback key when `scaleCoder` is not defined
|
3980
|
-
// // i.e. when chain doesn't have metadata v14/v15
|
3981
|
-
// const stateKey = coder
|
3982
|
-
// ? encodeStateKey(coder, `Invalid address in ${networkId} base query ${address}`, address)
|
3983
|
-
// : getFallbackStateKey()
|
3984
|
-
// if (!stateKey) return null
|
3985
|
-
|
3986
|
-
// const decodeResult = (change: string | null) => {
|
3987
|
-
// // BEGIN: Handle chains which use metadata < v14
|
3988
|
-
// let oldChainBalance = null
|
3989
|
-
// if (!coder) {
|
3990
|
-
// const scaleAccountInfo = AccountInfoOverrides[networkId]
|
3991
|
-
// if (scaleAccountInfo === undefined) {
|
3992
|
-
// // chain metadata version is < 15 and we also don't have an override hardcoded in
|
3993
|
-
// // the best way to handle this case: log a warning and return an empty balance
|
3994
|
-
// log.debug(
|
3995
|
-
// `Native token on chain ${networkId} has no balance type for decoding. Defaulting to a balance of 0 (zero).`,
|
3996
|
-
// )
|
3997
|
-
// return []
|
3998
|
-
// }
|
3999
|
-
|
4000
|
-
// try {
|
4001
|
-
// // eslint-disable-next-line no-var
|
4002
|
-
// oldChainBalance = change === null ? null : scaleAccountInfo.dec(change)
|
4003
|
-
// } catch (error) {
|
4004
|
-
// log.warn(
|
4005
|
-
// `Failed to create pre-metadataV14 balance type for native on chain ${networkId}: ${error?.toString()}`,
|
4006
|
-
// )
|
4007
|
-
// return []
|
4008
|
-
// }
|
4009
|
-
// }
|
4010
|
-
// // END: Handle chains which use metadata < v14
|
4011
|
-
|
4012
|
-
// /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */
|
4013
|
-
// type DecodedType = {
|
4014
|
-
// data?: {
|
4015
|
-
// flags?: bigint
|
4016
|
-
// free?: bigint
|
4017
|
-
// frozen?: bigint
|
4018
|
-
// reserved?: bigint
|
4019
|
-
|
4020
|
-
// // deprecated fields (they only show up on old chains)
|
4021
|
-
// feeFrozen?: bigint
|
4022
|
-
// miscFrozen?: bigint
|
4023
|
-
// }
|
4024
|
-
// }
|
4025
|
-
// const decoded =
|
4026
|
-
// decodeScale<DecodedType>(
|
4027
|
-
// coder,
|
4028
|
-
// change,
|
4029
|
-
// `Failed to decode base native balance on chain ${networkId}`,
|
4030
|
-
// ) ?? oldChainBalance
|
4031
|
-
|
4032
|
-
// const free = (decoded?.data?.free ?? 0n).toString()
|
4033
|
-
// const reserved = (decoded?.data?.reserved ?? 0n).toString()
|
4034
|
-
// const miscLock = (
|
4035
|
-
// (decoded?.data?.miscFrozen ?? 0n) +
|
4036
|
-
// // new chains don't split their `frozen` amount into `feeFrozen` and `miscFrozen`.
|
4037
|
-
// // for these chains, we'll use the `frozen` amount as `miscFrozen`.
|
4038
|
-
// ((decoded?.data as DecodedType["data"])?.frozen ?? 0n)
|
4039
|
-
// ).toString()
|
4040
|
-
// const feesLock = (decoded?.data?.feeFrozen ?? 0n).toString()
|
4041
|
-
|
4042
|
-
// // even if these values are 0, we still need to add them to the balanceJson.values array
|
4043
|
-
// // so that the balance pool can handle newly zeroed balances
|
4044
|
-
// // const existingValues = Object.fromEntries(
|
4045
|
-
// // balanceJson.values.map((v) => [getValueId(v), v]),
|
4046
|
-
// // )
|
4047
|
-
// const newValues: AmountWithLabel<string>[] = [
|
4048
|
-
// { type: "free", label: "free", amount: free.toString() },
|
4049
|
-
// { type: "reserved", label: "reserved", amount: reserved.toString() },
|
4050
|
-
// { type: "locked", label: "misc", amount: miscLock.toString() },
|
4051
|
-
// { type: "locked", label: "fees", amount: feesLock.toString() },
|
4052
|
-
// ]
|
4053
|
-
|
4054
|
-
// return newValues
|
4055
|
-
|
4056
|
-
// // const newValuesObj = Object.fromEntries(newValues.map((v) => [getValueId(v), v]))
|
4057
|
-
|
4058
|
-
// // balanceJson.values = Object.values({ ...existingValues, ...newValuesObj })
|
4059
|
-
|
4060
|
-
// // return balanceJson
|
4061
|
-
// }
|
4062
|
-
|
4063
|
-
// return { chainId: networkId, stateKey, decodeResult }
|
4064
|
-
// }
|
4065
|
-
|
4066
3865
|
/**
|
4067
3866
|
* Each nominationPool in the nominationPools pallet has access to some accountIds which have no
|
4068
3867
|
* associated private key. Instead, they are derived from this function.
|
@@ -4110,7 +3909,9 @@ const buildNomPoolQueries = (networkId, partialBalances, miniMetadata) => {
|
|
4110
3909
|
}) => total + BigInt(amount ?? "0"), 0n);
|
4111
3910
|
return {
|
4112
3911
|
...balance,
|
4113
|
-
values: [...(balance.values
|
3912
|
+
values: [...(balance.values?.filter(({
|
3913
|
+
source
|
3914
|
+
}) => source !== "nompools-staking") ?? []), {
|
4114
3915
|
source: "nompools-staking",
|
4115
3916
|
type: "nompool",
|
4116
3917
|
label: "nompools-staking",
|
@@ -4240,7 +4041,9 @@ const fetchBalances$2 = async ({
|
|
4240
4041
|
const subtensorBalancesByAddress = await rxjs.firstValueFrom(subtensorBalances$);
|
4241
4042
|
for (const [address, subtensorBalances] of Object.entries(subtensorBalancesByAddress)) {
|
4242
4043
|
const balance = balances.find(b => b.address === address);
|
4243
|
-
if (balance?.values) balance.values.
|
4044
|
+
if (balance?.values) balance.values = [...balance.values.filter(({
|
4045
|
+
source
|
4046
|
+
}) => source !== "subtensor-staking"), ...subtensorBalances];
|
4244
4047
|
}
|
4245
4048
|
return {
|
4246
4049
|
success: balances,
|
@@ -4272,7 +4075,7 @@ const fetchTokens$2 = async ({
|
|
4272
4075
|
decimals: decimals,
|
4273
4076
|
existentialDeposit: miniMetadata.extra.existentialDeposit ?? "0"
|
4274
4077
|
};
|
4275
|
-
const token =
|
4078
|
+
const token = lodashEs.assign(nativeToken, tokenConfig);
|
4276
4079
|
const parsed = chaindataProvider.SubNativeTokenSchema.safeParse(token);
|
4277
4080
|
if (!parsed.success) {
|
4278
4081
|
log.warn(`Ignoring invalid token ${MODULE_TYPE$2}`, token, parsed.error);
|
@@ -4354,13 +4157,9 @@ const getMiniMetadata$2 = ({
|
|
4354
4157
|
}, {
|
4355
4158
|
pallet: "Staking",
|
4356
4159
|
items: ["Ledger"]
|
4357
|
-
},
|
4358
|
-
// TotalColdkeyStake is used until v.2.2.1, then it is replaced by StakingHotkeys+Stake
|
4359
|
-
// Need to keep TotalColdkeyStake for a while so chaindata keeps including it in miniMetadatas, so it doesnt break old versions of the wallet
|
4360
|
-
// TODO: Since chaindata v4 this is safe to now delete
|
4361
|
-
{
|
4160
|
+
}, {
|
4362
4161
|
pallet: "SubtensorModule",
|
4363
|
-
items: ["
|
4162
|
+
items: ["StakingHotkeys", "Stake"]
|
4364
4163
|
}], [{
|
4365
4164
|
runtimeApi: "StakeInfoRuntimeApi",
|
4366
4165
|
methods: ["get_stake_info_for_coldkey"]
|
@@ -4490,9 +4289,11 @@ const subscribeBalances$2 = ({
|
|
4490
4289
|
const subtensorBalancesByAddress$ = getSubtensorStakingBalances$(connector, networkId, balanceDefs, miniMetadata);
|
4491
4290
|
return rxjs.combineLatest([baseBalances$, subtensorBalancesByAddress$]).pipe(rxjs.map(([baseBalances, subtensorBalancesByAddress]) => {
|
4492
4291
|
// add subtensor balances to base balances
|
4493
|
-
for (const [address, subtensorBalances] of
|
4292
|
+
for (const [address, subtensorBalances] of lodashEs.toPairs(subtensorBalancesByAddress)) {
|
4494
4293
|
const balance = baseBalances.find(b => b.address === address);
|
4495
|
-
if (balance?.values) balance.values.
|
4294
|
+
if (balance?.values) balance.values = [...balance.values.filter(({
|
4295
|
+
source
|
4296
|
+
}) => source !== "subtensor-staking"), ...subtensorBalances];
|
4496
4297
|
}
|
4497
4298
|
return {
|
4498
4299
|
success: baseBalances,
|
@@ -5805,7 +5606,7 @@ const fetchTokens$1 = async ({
|
|
5805
5606
|
continue;
|
5806
5607
|
}
|
5807
5608
|
}
|
5808
|
-
return
|
5609
|
+
return lodashEs.values(tokenList).filter(t => {
|
5809
5610
|
const parsed = chaindataProvider.SubPsp22TokenSchema.safeParse(t);
|
5810
5611
|
if (!parsed.success) log.warn(`Ignoring invalid token ${MODULE_TYPE$1}`, t);
|
5811
5612
|
return parsed.success;
|
@@ -5934,7 +5735,7 @@ const subscribeBalances$1 = ({
|
|
5934
5735
|
return () => {
|
5935
5736
|
abortController.abort();
|
5936
5737
|
};
|
5937
|
-
}).pipe(rxjs.distinctUntilChanged(
|
5738
|
+
}).pipe(rxjs.distinctUntilChanged(lodashEs.isEqual));
|
5938
5739
|
};
|
5939
5740
|
|
5940
5741
|
const SubPsp22BalanceModule = {
|
@@ -6100,7 +5901,7 @@ const fetchTokens = async ({
|
|
6100
5901
|
// in this module we do not fetch any token information from the chain
|
6101
5902
|
// this is because there are basically as many pallet implementations as there are networks (Expect Chaos, they said)
|
6102
5903
|
// we rely on the config to provide all the info we need
|
6103
|
-
return tokens.map(tokenConfig =>
|
5904
|
+
return tokens.map(tokenConfig => lodashEs.assign({
|
6104
5905
|
id: chaindataProvider.subTokensTokenId(networkId, tokenConfig.onChainId),
|
6105
5906
|
type: MODULE_TYPE,
|
6106
5907
|
platform: PLATFORM,
|
@@ -6347,8 +6148,10 @@ const getMetadataRpc = async (chainConnector, networkId) => {
|
|
6347
6148
|
if (CACHE$1.has(networkId)) return CACHE$1.get(networkId);
|
6348
6149
|
const pResult = sapi.fetchBestMetadata((method, params, isCacheable) => chainConnector.send(networkId, method, params, isCacheable, {
|
6349
6150
|
expectErrors: true
|
6350
|
-
}),
|
6351
|
-
|
6151
|
+
}),
|
6152
|
+
// do not allow fallback to v14 unless unavailable.
|
6153
|
+
// substrate-native and substrate-hydration need v15 metadata for runtime api calls
|
6154
|
+
false);
|
6352
6155
|
CACHE$1.set(networkId, pResult);
|
6353
6156
|
try {
|
6354
6157
|
return await pResult;
|
@@ -6448,8 +6251,8 @@ class BalancesProvider {
|
|
6448
6251
|
this.#chaindataProvider = chaindataProvider;
|
6449
6252
|
this.#chainConnectors = chainConnectors;
|
6450
6253
|
this.#storage = new rxjs.BehaviorSubject({
|
6451
|
-
balances:
|
6452
|
-
miniMetadatas:
|
6254
|
+
balances: lodashEs.keyBy(storage.balances.filter(util.isNotNil), b => getBalanceId(b)),
|
6255
|
+
miniMetadatas: lodashEs.keyBy(storage.miniMetadatas.filter(util.isNotNil), m => m.id)
|
6453
6256
|
});
|
6454
6257
|
}
|
6455
6258
|
get storage$() {
|
@@ -6457,8 +6260,8 @@ class BalancesProvider {
|
|
6457
6260
|
balances,
|
6458
6261
|
miniMetadatas
|
6459
6262
|
}) => ({
|
6460
|
-
balances:
|
6461
|
-
miniMetadatas:
|
6263
|
+
balances: lodashEs.values(balances).filter(util.isNotNil),
|
6264
|
+
miniMetadatas: lodashEs.values(miniMetadatas).filter(util.isNotNil)
|
6462
6265
|
})));
|
6463
6266
|
}
|
6464
6267
|
|
@@ -6469,7 +6272,7 @@ class BalancesProvider {
|
|
6469
6272
|
return util.getSharedObservable("BalancesProvider.getBalances$", addressesByTokenId, () => {
|
6470
6273
|
return this.cleanupAddressesByTokenId(addressesByTokenId).pipe(rxjs.map(
|
6471
6274
|
// split by network
|
6472
|
-
addressesByTokenId =>
|
6275
|
+
addressesByTokenId => lodashEs.toPairs(addressesByTokenId).reduce((acc, [tokenId, addresses]) => {
|
6473
6276
|
const networkId = chaindataProvider.parseTokenId(tokenId).networkId;
|
6474
6277
|
if (!acc[networkId]) acc[networkId] = {};
|
6475
6278
|
acc[networkId][tokenId] = addresses;
|
@@ -6478,7 +6281,7 @@ class BalancesProvider {
|
|
6478
6281
|
// fetch balances and start a 30s timer to mark the whole subscription live after 30s
|
6479
6282
|
rxjs.combineLatest({
|
6480
6283
|
isStale: rxjs.timer(30_000).pipe(rxjs.map(() => true), rxjs.startWith(false)),
|
6481
|
-
results: rxjs.combineLatest(
|
6284
|
+
results: rxjs.combineLatest(lodashEs.toPairs(addressesByTokenIdByNetworkId).map(([networkId]) => this.getNetworkBalances$(networkId, addressesByTokenIdByNetworkId[networkId])))
|
6482
6285
|
})), rxjs.map(
|
6483
6286
|
// combine
|
6484
6287
|
({
|
@@ -6495,7 +6298,7 @@ class BalancesProvider {
|
|
6495
6298
|
})), rxjs.startWith({
|
6496
6299
|
status: "initialising",
|
6497
6300
|
balances: this.getStoredBalances(addressesByTokenId)
|
6498
|
-
}), rxjs.distinctUntilChanged(
|
6301
|
+
}), rxjs.distinctUntilChanged(lodashEs.isEqual));
|
6499
6302
|
});
|
6500
6303
|
}
|
6501
6304
|
fetchBalances(addressesByTokenId) {
|
@@ -6511,14 +6314,14 @@ class BalancesProvider {
|
|
6511
6314
|
const tokensMapById$ = this.#chaindataProvider.getTokensMapById$();
|
6512
6315
|
const miniMetadatas$ = this.getNetworkMiniMetadatas$(networkId);
|
6513
6316
|
return rxjs.combineLatest([network$, miniMetadatas$, tokensMapById$]).pipe(rxjs.switchMap(([network, miniMetadatas, tokensMapById]) => {
|
6514
|
-
const tokensAndAddresses =
|
6317
|
+
const tokensAndAddresses = lodashEs.toPairs(addressesByTokenId).map(([tokenId, addresses]) => [tokensMapById[tokenId], addresses]);
|
6515
6318
|
return rxjs.combineLatest(BALANCE_MODULES.filter(mod => mod.platform === network?.platform).map(mod => {
|
6516
6319
|
const tokensWithAddresses = tokensAndAddresses.filter(([token]) => token.type === mod.type);
|
6517
|
-
const moduleAddressesByTokenId =
|
6320
|
+
const moduleAddressesByTokenId = lodashEs.fromPairs(tokensWithAddresses.map(([token, addresses]) => [token.id, addresses]));
|
6518
6321
|
const miniMetadata = miniMetadatas.find(m => m.source === mod.type);
|
6519
6322
|
|
6520
6323
|
// all balance ids expected in result set
|
6521
|
-
const balanceIds =
|
6324
|
+
const balanceIds = lodashEs.toPairs(moduleAddressesByTokenId).flatMap(([tokenId, addresses]) => addresses.map(address => getBalanceId({
|
6522
6325
|
tokenId,
|
6523
6326
|
address
|
6524
6327
|
})));
|
@@ -6531,15 +6334,15 @@ class BalancesProvider {
|
|
6531
6334
|
const updateStorage = results => {
|
6532
6335
|
if (results.status !== "live") return;
|
6533
6336
|
const storage = this.#storage.getValue();
|
6534
|
-
const balances =
|
6337
|
+
const balances = lodashEs.assign({}, storage.balances,
|
6535
6338
|
// delete all balances expected in the result set. because if they are not present it means they are empty.
|
6536
|
-
|
6339
|
+
lodashEs.fromPairs(balanceIds.map(balanceId => [balanceId, undefined])), lodashEs.keyBy(
|
6537
6340
|
// storage balances must have status "cache", because they are used as start value when initialising subsequent subscriptions
|
6538
6341
|
results.balances.map(b => ({
|
6539
6342
|
...b,
|
6540
6343
|
status: "cache"
|
6541
6344
|
})), b => getBalanceId(b)));
|
6542
|
-
this.#storage.next(
|
6345
|
+
this.#storage.next(lodashEs.assign({}, storage, {
|
6543
6346
|
balances
|
6544
6347
|
}));
|
6545
6348
|
};
|
@@ -6609,12 +6412,12 @@ class BalancesProvider {
|
|
6609
6412
|
rxjs.tap(newMiniMetadatas => {
|
6610
6413
|
if (!newMiniMetadatas.length) return;
|
6611
6414
|
const storage = this.#storage.getValue();
|
6612
|
-
const miniMetadatas =
|
6415
|
+
const miniMetadatas = lodashEs.assign(
|
6613
6416
|
// keep minimetadatas of other networks
|
6614
|
-
|
6417
|
+
lodashEs.keyBy(lodashEs.values(storage.miniMetadatas).filter(m => m.chainId !== networkId), m => m.id),
|
6615
6418
|
// add the ones for our network
|
6616
|
-
|
6617
|
-
this.#storage.next(
|
6419
|
+
lodashEs.keyBy(newMiniMetadatas, m => m.id));
|
6420
|
+
this.#storage.next(lodashEs.assign({}, storage, {
|
6618
6421
|
miniMetadatas
|
6619
6422
|
}));
|
6620
6423
|
}));
|
@@ -6626,13 +6429,13 @@ class BalancesProvider {
|
|
6626
6429
|
});
|
6627
6430
|
}
|
6628
6431
|
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(
|
6432
|
+
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
6433
|
}
|
6631
6434
|
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(
|
6435
|
+
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
6436
|
}
|
6634
6437
|
getStoredBalances(addressesByToken) {
|
6635
|
-
const balanceDefs =
|
6438
|
+
const balanceDefs = lodashEs.toPairs(addressesByToken).flatMap(([tokenId, addresses]) => addresses.map(address => [tokenId, address]));
|
6636
6439
|
return balanceDefs.map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({
|
6637
6440
|
address,
|
6638
6441
|
tokenId
|
@@ -6640,7 +6443,7 @@ class BalancesProvider {
|
|
6640
6443
|
}
|
6641
6444
|
cleanupAddressesByTokenId(addressesByTokenId) {
|
6642
6445
|
return this.#chaindataProvider.getNetworksMapById$().pipe(rxjs.map(networksById => {
|
6643
|
-
return
|
6446
|
+
return lodashEs.fromPairs(lodashEs.toPairs(addressesByTokenId).map(([tokenId, addresses]) => {
|
6644
6447
|
const networkId = chaindataProvider.parseTokenId(tokenId).networkId;
|
6645
6448
|
const network = networksById[networkId];
|
6646
6449
|
return [tokenId, addresses.filter(address => network && isAddressCompatibleWithNetwork(network, address))];
|