@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.
@@ -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 lodash = require('lodash');
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 = lodash.assign(base, cached2?.isValid ? lodash.omit(cached2, ["isValid"]) : {}, tokenConfig);
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(lodash.isEqual));
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 = lodash.assign({
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(lodash.isEqual));
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 = lodash.assign(base, cached2?.isValid ? lodash.omit(cached2, ["isValid"]) : {}, tokenConfig);
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(lodash.isEqual));
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 = lodash.keyBy(assetStorageEntries.map(([key, value]) => {
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 = lodash.keyBy(metadataStorageEntries.map(([key, value]) => {
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 = lodash.keys(assetByAssetId).map(assetId => lodash.assign({}, assetByAssetId[assetId], metadataByAssetId[assetId] ?? undefined));
1791
- const configTokenByAssetId = lodash.keyBy(tokens, t => t.assetId);
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 ? lodash.assign({}, token, configToken) : token;
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 = lodash.keyBy(assetStorageEntries.map(([key, value]) => {
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 = lodash.keyBy(metadataStorageEntries.map(([key, value]) => {
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 = lodash.keys(assetByOnChainId).map(onChainId => lodash.assign({}, assetByOnChainId[onChainId], metadataByOnChainId[onChainId] ?? undefined));
2945
- const configTokenByOnChainId = lodash.keyBy(tokens, t => t.onChainId);
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 ? lodash.assign({}, token, configToken) : token;
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 = lodash.uniq(balanceDefs.map(def => def.address));
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 = lodash.keyBy(fetchedBalances, b => `${b.address}:${b.onChainId}`);
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 = lodash.keyBy(tokens, t => t.onChainId);
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 ? lodash.assign({}, token, configToken) : token;
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(lodash.isEqual));
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 = lodash.uniq(lodash.values(stakeInfoByAddress).flatMap(infos => infos.map(info => info.netuid))).filter(netuid => netuid !== SUBTENSOR_ROOT_NETUID);
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 lodash.fromPairs(lodash.toPairs(stakeInfoByAddress).map(([address, stakeInfos]) => {
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 ? lodash.fromPairs(lodash.toPairs(subnet_identity).map(([key, binary]) => [key, binary.asText()])) : undefined;
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 lodash.fromPairs(pairs);
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 lodash.fromPairs(results);
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.push(...subtensorBalances);
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 = lodash.assign(nativeToken, tokenConfig);
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: ["TotalColdkeyStake", "StakingHotkeys", "Stake"]
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 lodash.toPairs(subtensorBalancesByAddress)) {
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.push(...subtensorBalances);
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 lodash.values(tokenList).filter(t => {
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(lodash.isEqual));
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 => lodash.assign({
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
- }), true // allow fallback to 14 as modules dont use any v15 or v16 specifics yet
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: lodash.keyBy(storage.balances.filter(util.isNotNil), b => getBalanceId(b)),
6452
- miniMetadatas: lodash.keyBy(storage.miniMetadatas.filter(util.isNotNil), m => m.id)
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: lodash.values(balances).filter(util.isNotNil),
6461
- miniMetadatas: lodash.values(miniMetadatas).filter(util.isNotNil)
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 => lodash.toPairs(addressesByTokenId).reduce((acc, [tokenId, addresses]) => {
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(lodash.toPairs(addressesByTokenIdByNetworkId).map(([networkId]) => this.getNetworkBalances$(networkId, addressesByTokenIdByNetworkId[networkId])))
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(lodash.isEqual));
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 = lodash.toPairs(addressesByTokenId).map(([tokenId, addresses]) => [tokensMapById[tokenId], addresses]);
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 = lodash.fromPairs(tokensWithAddresses.map(([token, addresses]) => [token.id, addresses]));
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 = lodash.toPairs(moduleAddressesByTokenId).flatMap(([tokenId, addresses]) => addresses.map(address => getBalanceId({
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 = lodash.assign({}, storage.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
- lodash.fromPairs(balanceIds.map(balanceId => [balanceId, undefined])), lodash.keyBy(
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(lodash.assign({}, storage, {
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 = lodash.assign(
6415
+ const miniMetadatas = lodashEs.assign(
6613
6416
  // keep minimetadatas of other networks
6614
- lodash.keyBy(lodash.values(storage.miniMetadatas).filter(m => m.chainId !== networkId), m => m.id),
6417
+ lodashEs.keyBy(lodashEs.values(storage.miniMetadatas).filter(m => m.chainId !== networkId), m => m.id),
6615
6418
  // add the ones for our network
6616
- lodash.keyBy(newMiniMetadatas, m => m.id));
6617
- this.#storage.next(lodash.assign({}, storage, {
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(lodash.isEqual));
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(lodash.isEqual));
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 = lodash.toPairs(addressesByToken).flatMap(([tokenId, addresses]) => addresses.map(address => [tokenId, address]));
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 lodash.fromPairs(lodash.toPairs(addressesByTokenId).map(([tokenId, addresses]) => {
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))];