@1delta/margin-fetcher 0.0.274 → 0.0.276

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.
Files changed (36) hide show
  1. package/dist/index.js +324 -24
  2. package/dist/index.js.map +1 -1
  3. package/dist/vaults/assetDecimals.d.ts +14 -0
  4. package/dist/vaults/assetDecimals.d.ts.map +1 -0
  5. package/dist/vaults/classification.d.ts +22 -4
  6. package/dist/vaults/classification.d.ts.map +1 -1
  7. package/dist/vaults/euler-earn/fetchFromSubgraph.d.ts.map +1 -1
  8. package/dist/vaults/euler-earn/types.d.ts +3 -0
  9. package/dist/vaults/euler-earn/types.d.ts.map +1 -1
  10. package/dist/vaults/fluid/fetchPublic.d.ts.map +1 -1
  11. package/dist/vaults/gearbox/publicCallParse.d.ts.map +1 -1
  12. package/dist/vaults/gearbox/types.d.ts +3 -0
  13. package/dist/vaults/gearbox/types.d.ts.map +1 -1
  14. package/dist/vaults/lookup.d.ts +5 -0
  15. package/dist/vaults/lookup.d.ts.map +1 -1
  16. package/dist/vaults/lst/abis/etherfi.d.ts +14 -1
  17. package/dist/vaults/lst/abis/etherfi.d.ts.map +1 -1
  18. package/dist/vaults/lst/fetchPublic.d.ts.map +1 -1
  19. package/dist/vaults/lst/readers/etherfi.d.ts +8 -6
  20. package/dist/vaults/lst/readers/etherfi.d.ts.map +1 -1
  21. package/dist/vaults/lst/readers/shared.d.ts +20 -0
  22. package/dist/vaults/lst/readers/shared.d.ts.map +1 -1
  23. package/dist/vaults/lst/types.d.ts +13 -7
  24. package/dist/vaults/lst/types.d.ts.map +1 -1
  25. package/dist/vaults/lst/withdrawals/registry.d.ts.map +1 -1
  26. package/dist/vaults/morpho/fetchFromApi.d.ts.map +1 -1
  27. package/dist/vaults/morpho/fetchFromChain.d.ts.map +1 -1
  28. package/dist/vaults/morpho/fetchListaFromChain.d.ts.map +1 -1
  29. package/dist/vaults/morpho/types.d.ts +3 -0
  30. package/dist/vaults/morpho/types.d.ts.map +1 -1
  31. package/dist/vaults/sharePrice.d.ts +18 -0
  32. package/dist/vaults/sharePrice.d.ts.map +1 -0
  33. package/dist/vaults/silo/fetchPublic.d.ts.map +1 -1
  34. package/dist/vaults/silo/types.d.ts +3 -0
  35. package/dist/vaults/silo/types.d.ts.map +1 -1
  36. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -35740,6 +35740,32 @@ function parseFTokens(fTokens, chainId, prices, tokenList) {
35740
35740
  }
35741
35741
  return out;
35742
35742
  }
35743
+
35744
+ // src/vaults/assetDecimals.ts
35745
+ var ERC20_DECIMALS_ABI = parseAbi([
35746
+ "function decimals() view returns (uint8)"
35747
+ ]);
35748
+ async function fetchAssetDecimals(chainId, underlyings, multicallRetry) {
35749
+ const map = /* @__PURE__ */ new Map();
35750
+ if (underlyings.length === 0) return map;
35751
+ const raw = await multicallRetry({
35752
+ chain: chainId,
35753
+ calls: underlyings.map((address) => ({
35754
+ address,
35755
+ name: "decimals",
35756
+ params: []
35757
+ })),
35758
+ abi: underlyings.map(() => ERC20_DECIMALS_ABI),
35759
+ allowFailure: true
35760
+ });
35761
+ underlyings.forEach((address, i) => {
35762
+ const d = Number(raw[i]);
35763
+ if (Number.isFinite(d) && d > 0 && d <= 36) map.set(address, d);
35764
+ });
35765
+ return map;
35766
+ }
35767
+
35768
+ // src/vaults/fluid/fetchPublic.ts
35743
35769
  var fetchFluidFTokens = async (chainId, multicallRetry, prices = {}, tokenList = {}) => {
35744
35770
  const calls = buildFluidFTokensCall(chainId);
35745
35771
  if (calls.length === 0) return {};
@@ -35750,6 +35776,25 @@ var fetchFluidFTokens = async (chainId, multicallRetry, prices = {}, tokenList =
35750
35776
  });
35751
35777
  const [converter] = getFluidFTokensConverter(chainId, prices, tokenList);
35752
35778
  const fTokens = converter(raw) ?? {};
35779
+ try {
35780
+ const underlyings = Object.values(fTokens).map((f) => f.underlying).filter((a) => !!a && a !== zeroAddress);
35781
+ const assetDec = await fetchAssetDecimals(
35782
+ chainId,
35783
+ [...new Set(underlyings)],
35784
+ multicallRetry
35785
+ );
35786
+ for (const f of Object.values(fTokens)) {
35787
+ const dec = assetDec.get(f.underlying);
35788
+ if (dec == null || dec === f.decimals) continue;
35789
+ const price2 = f.priceUsd ?? 0;
35790
+ f.decimals = dec;
35791
+ f.totalAssetsFormatted = Number(parseRawAmount(f.totalAssets, dec));
35792
+ f.totalAssetsUsd = f.totalAssetsFormatted * price2;
35793
+ f.liquidityFormatted = Number(parseRawAmount(f.liquidity, dec));
35794
+ f.liquidityUsd = f.liquidityFormatted * price2;
35795
+ }
35796
+ } catch {
35797
+ }
35753
35798
  try {
35754
35799
  const exposuresByUnderlying = await fetchFluidExposures(
35755
35800
  chainId,
@@ -35846,6 +35891,20 @@ var buildGearboxV3PoolsCall = (chainId) => {
35846
35891
  ];
35847
35892
  };
35848
35893
 
35894
+ // src/vaults/sharePrice.ts
35895
+ function deriveConvertToAssets(totalAssetsRaw, totalSupplyRaw, shareDecimals) {
35896
+ try {
35897
+ const ta = BigInt(totalAssetsRaw ?? 0);
35898
+ const ts = BigInt(totalSupplyRaw ?? 0);
35899
+ if (ts <= 0n) return "0";
35900
+ const dec = Math.max(0, Math.round(Number(shareDecimals) || 0));
35901
+ const probe = 10n ** BigInt(dec);
35902
+ return (ta * probe / ts).toString();
35903
+ } catch {
35904
+ return "0";
35905
+ }
35906
+ }
35907
+
35849
35908
  // src/vaults/gearbox/publicCallParse.ts
35850
35909
  var WETH_MAINNET = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2";
35851
35910
  var normalizeUnderlying6 = (addr, chainId) => {
@@ -35883,9 +35942,15 @@ function parseMarkets(markets, chainId, prices, tokenList) {
35883
35942
  const assetMeta = tokenList[underlying];
35884
35943
  const decimals = Number(assetMeta?.decimals ?? pool.decimals ?? 18);
35885
35944
  const totalAssetsRaw = pool.expectedLiquidity?.toString() ?? "0";
35945
+ const totalSupplyRaw = pool.totalSupply?.toString() ?? "0";
35886
35946
  const totalAssetsFormatted = Number(
35887
35947
  parseRawAmount(totalAssetsRaw, decimals)
35888
35948
  );
35949
+ const convertToAssets = deriveConvertToAssets(
35950
+ totalAssetsRaw,
35951
+ totalSupplyRaw,
35952
+ decimals
35953
+ );
35889
35954
  const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(underlying, chainId);
35890
35955
  const priceUsd = prices[oracleKey] ?? prices[underlying] ?? 0;
35891
35956
  const liquidityRaw = pool.availableLiquidity?.toString() ?? "0";
@@ -35905,7 +35970,8 @@ function parseMarkets(markets, chainId, prices, tokenList) {
35905
35970
  ),
35906
35971
  decimals,
35907
35972
  totalAssets: totalAssetsRaw,
35908
- totalSupply: pool.totalSupply?.toString() ?? "0",
35973
+ totalSupply: totalSupplyRaw,
35974
+ convertToAssets,
35909
35975
  totalBorrowed: pool.totalBorrowed?.toString() ?? "0",
35910
35976
  availableLiquidity: pool.availableLiquidity?.toString() ?? "0",
35911
35977
  expectedLiquidity: pool.expectedLiquidity?.toString() ?? "0",
@@ -35940,6 +36006,7 @@ var fetchGearboxV3Pools = async (chainId, multicallRetry, prices = {}, tokenList
35940
36006
  };
35941
36007
 
35942
36008
  // src/vaults/morpho/fetchFromApi.ts
36009
+ var MORPHO_SHARE_DECIMALS = 18;
35943
36010
  var MORPHO_API_URL = "https://blue-api.morpho.org/graphql";
35944
36011
  var PAGE_SIZE = 200;
35945
36012
  var vaultsQuery = (first, skip, chainId) => `
@@ -36046,7 +36113,13 @@ function parseVault2(v, chainId, prices, tokenList) {
36046
36113
  const assetMeta = tokenList[assetAddr];
36047
36114
  const decimals = Number(v.asset?.decimals ?? assetMeta?.decimals ?? 18);
36048
36115
  const totalAssetsRaw = state.totalAssets?.toString() ?? "0";
36116
+ const totalSupplyRaw = state.totalSupply?.toString() ?? "0";
36049
36117
  const totalAssetsFormatted = Number(parseRawAmount(totalAssetsRaw, decimals));
36118
+ const convertToAssets = deriveConvertToAssets(
36119
+ totalAssetsRaw,
36120
+ totalSupplyRaw,
36121
+ MORPHO_SHARE_DECIMALS
36122
+ );
36050
36123
  const liquidityRaw = v.liquidity?.underlying?.toString() ?? "0";
36051
36124
  const liquidityFormatted = Number(parseRawAmount(liquidityRaw, decimals));
36052
36125
  const liquidityUsd = Number(v.liquidity?.usd ?? 0);
@@ -36073,7 +36146,8 @@ function parseVault2(v, chainId, prices, tokenList) {
36073
36146
  ),
36074
36147
  decimals,
36075
36148
  totalAssets: totalAssetsRaw,
36076
- totalSupply: state.totalSupply?.toString() ?? "0",
36149
+ totalSupply: totalSupplyRaw,
36150
+ convertToAssets,
36077
36151
  supplyRate,
36078
36152
  rewardsRate,
36079
36153
  depositRate: supplyRate + rewardsRate,
@@ -36307,7 +36381,12 @@ var fetchMorphoVaultsFromChain = async (chainId, multicallRetry, prices = {}, to
36307
36381
  });
36308
36382
  const core = morphoPools()?.MORPHO_BLUE?.[chainId];
36309
36383
  const allMarketIds = [...new Set(marketIdsByVault.flat())];
36310
- const [rateMap, positionMap] = await Promise.all([
36384
+ const underlyings = [
36385
+ ...new Set(
36386
+ entries.map(({ entry }) => entry.underlying?.toLowerCase()).filter((a) => !!a)
36387
+ )
36388
+ ];
36389
+ const [rateMap, positionMap, assetDecimals] = await Promise.all([
36311
36390
  fetchMorphoMarketRates(chainId, core, allMarketIds, multicallRetry),
36312
36391
  fetchVaultSupplyShares(
36313
36392
  chainId,
@@ -36315,7 +36394,8 @@ var fetchMorphoVaultsFromChain = async (chainId, multicallRetry, prices = {}, to
36315
36394
  entries.map((e) => e.entry),
36316
36395
  marketIdsByVault,
36317
36396
  multicallRetry
36318
- )
36397
+ ),
36398
+ fetchAssetDecimals(chainId, underlyings, multicallRetry)
36319
36399
  ]);
36320
36400
  const out = {};
36321
36401
  for (let i = 0; i < entries.length; i++) {
@@ -36330,7 +36410,8 @@ var fetchMorphoVaultsFromChain = async (chainId, multicallRetry, prices = {}, to
36330
36410
  tokenList,
36331
36411
  marketIdsByVault[i],
36332
36412
  rateMap,
36333
- positionMap
36413
+ positionMap,
36414
+ assetDecimals
36334
36415
  );
36335
36416
  if (parsed) out[parsed.address] = parsed;
36336
36417
  }
@@ -36391,7 +36472,7 @@ async function fetchMorphoMarketRates(chainId, core, marketIds, multicallRetry)
36391
36472
  });
36392
36473
  return map;
36393
36474
  }
36394
- function parseVault3(entry, results, chainId, prices, tokenList, marketIds, rateMap, positionMap) {
36475
+ function parseVault3(entry, results, chainId, prices, tokenList, marketIds, rateMap, positionMap, assetDecimals) {
36395
36476
  const address = entry?.vault?.toLowerCase();
36396
36477
  const underlying = entry?.underlying?.toLowerCase();
36397
36478
  if (!address || !underlying) return null;
@@ -36408,10 +36489,15 @@ function parseVault3(entry, results, chainId, prices, tokenList, marketIds, rate
36408
36489
  guardianRaw
36409
36490
  ] = results;
36410
36491
  const assetMeta = tokenList[underlying];
36411
- const decimals = Number(decimalsRaw ?? assetMeta?.decimals ?? 18);
36492
+ const decimals = assetDecimals.get(underlying) ?? assetMeta?.decimals ?? Number(decimalsRaw ?? 18);
36412
36493
  const totalAssets = toStringSafe(totalAssetsRaw, "0");
36413
36494
  const totalSupply = toStringSafe(totalSupplyRaw, "0");
36414
36495
  const totalAssetsFormatted = Number(parseRawAmount(totalAssets, decimals));
36496
+ const convertToAssets = deriveConvertToAssets(
36497
+ totalAssets,
36498
+ totalSupply,
36499
+ Number(decimalsRaw ?? 18)
36500
+ );
36415
36501
  const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(underlying, chainId);
36416
36502
  const priceUsd = prices[oracleKey] ?? prices[underlying] ?? 0;
36417
36503
  const onchainName = toStringSafe(nameRaw).trim();
@@ -36445,6 +36531,7 @@ function parseVault3(entry, results, chainId, prices, tokenList, marketIds, rate
36445
36531
  decimals,
36446
36532
  totalAssets,
36447
36533
  totalSupply,
36534
+ convertToAssets,
36448
36535
  supplyRate: depositRate,
36449
36536
  rewardsRate: 0,
36450
36537
  depositRate,
@@ -36679,7 +36766,12 @@ var fetchListaVaultsFromChain = async (chainId, multicallRetry, prices = {}, tok
36679
36766
  });
36680
36767
  const moolah = morphoPools()?.[LISTA_PROTOCOL]?.[chainId];
36681
36768
  const allMarketIds = [...new Set(marketIdsByVault.flat())];
36682
- const [rateMap, positionMap] = await Promise.all([
36769
+ const underlyings = [
36770
+ ...new Set(
36771
+ entries.map((entry) => entry.underlying?.toLowerCase()).filter((a) => !!a)
36772
+ )
36773
+ ];
36774
+ const [rateMap, positionMap, assetDecimals] = await Promise.all([
36683
36775
  fetchListaMarketRates(chainId, moolah, allMarketIds, multicallRetry),
36684
36776
  fetchVaultSupplyShares(
36685
36777
  chainId,
@@ -36687,7 +36779,8 @@ var fetchListaVaultsFromChain = async (chainId, multicallRetry, prices = {}, tok
36687
36779
  entries,
36688
36780
  marketIdsByVault,
36689
36781
  multicallRetry
36690
- )
36782
+ ),
36783
+ fetchAssetDecimals(chainId, underlyings, multicallRetry)
36691
36784
  ]);
36692
36785
  const out = {};
36693
36786
  for (let i = 0; i < entries.length; i++) {
@@ -36702,7 +36795,8 @@ var fetchListaVaultsFromChain = async (chainId, multicallRetry, prices = {}, tok
36702
36795
  tokenList,
36703
36796
  marketIdsByVault[i],
36704
36797
  rateMap,
36705
- positionMap
36798
+ positionMap,
36799
+ assetDecimals
36706
36800
  );
36707
36801
  if (parsed) out[parsed.address] = parsed;
36708
36802
  }
@@ -36765,7 +36859,7 @@ async function fetchListaMarketRates(chainId, moolah, marketIds, multicallRetry)
36765
36859
  });
36766
36860
  return map;
36767
36861
  }
36768
- function parseVault4(entry, results, curatorAddrRaw, chainId, prices, tokenList, marketIds, rateMap, positionMap) {
36862
+ function parseVault4(entry, results, curatorAddrRaw, chainId, prices, tokenList, marketIds, rateMap, positionMap, assetDecimals) {
36769
36863
  const address = entry?.vault?.toLowerCase();
36770
36864
  const underlying = entry?.underlying?.toLowerCase();
36771
36865
  if (!address || !underlying) return null;
@@ -36782,10 +36876,15 @@ function parseVault4(entry, results, curatorAddrRaw, chainId, prices, tokenList,
36782
36876
  ,
36783
36877
  ] = results;
36784
36878
  const assetMeta = tokenList[underlying];
36785
- const decimals = Number(decimalsRaw ?? assetMeta?.decimals ?? 18);
36879
+ const decimals = assetDecimals.get(underlying) ?? assetMeta?.decimals ?? Number(decimalsRaw ?? 18);
36786
36880
  const totalAssets = toStringSafe2(totalAssetsRaw, "0");
36787
36881
  const totalSupply = toStringSafe2(totalSupplyRaw, "0");
36788
36882
  const totalAssetsFormatted = Number(parseRawAmount(totalAssets, decimals));
36883
+ const convertToAssets = deriveConvertToAssets(
36884
+ totalAssets,
36885
+ totalSupply,
36886
+ Number(decimalsRaw ?? 18)
36887
+ );
36789
36888
  const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(underlying, chainId);
36790
36889
  const priceUsd = prices[oracleKey] ?? prices[underlying] ?? 0;
36791
36890
  const onchainName = toStringSafe2(nameRaw).trim();
@@ -36818,6 +36917,7 @@ function parseVault4(entry, results, curatorAddrRaw, chainId, prices, tokenList,
36818
36917
  decimals,
36819
36918
  totalAssets,
36820
36919
  totalSupply,
36920
+ convertToAssets,
36821
36921
  supplyRate: depositRate,
36822
36922
  rewardsRate: 0,
36823
36923
  depositRate,
@@ -36961,6 +37061,11 @@ function parseVault5(v, chainId, prices, tokenList, exposures, liquidityFormatte
36961
37061
  const totalAssetsFormatted = Number(v.totalAssets ?? 0) || 0;
36962
37062
  const totalAssetsRaw = toRawAmount3(v.totalAssets, decimals);
36963
37063
  const totalSupplyRaw = toRawAmount3(v.totalSupply, decimals);
37064
+ const convertToAssets = deriveConvertToAssets(
37065
+ totalAssetsRaw,
37066
+ totalSupplyRaw,
37067
+ decimals
37068
+ );
36964
37069
  const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(assetAddr, chainId);
36965
37070
  const priceUsd = prices[oracleKey] ?? prices[assetAddr] ?? 0;
36966
37071
  const supplyRate = Number(v.userApr ?? 0) || 0;
@@ -36985,6 +37090,7 @@ function parseVault5(v, chainId, prices, tokenList, exposures, liquidityFormatte
36985
37090
  protocolId: (v.protocolId ?? v.protocol?.id ?? "").toLowerCase(),
36986
37091
  totalAssets: totalAssetsRaw,
36987
37092
  totalSupply: totalSupplyRaw,
37093
+ convertToAssets,
36988
37094
  supplyRate,
36989
37095
  grossRate,
36990
37096
  rewardsRate: 0,
@@ -37224,6 +37330,11 @@ function parseVault6(v, chainId, prices, tokenList, evkIndex) {
37224
37330
  evkIndex
37225
37331
  );
37226
37332
  const totalSupplyRaw = v.totalSupply?.toString() ?? v.totalShares?.toString() ?? "0";
37333
+ const convertToAssets = deriveConvertToAssets(
37334
+ totalAssetsRaw,
37335
+ totalSupplyRaw,
37336
+ decimals
37337
+ );
37227
37338
  const liquidityBig = computeRealLiquidity(
37228
37339
  v.strategies,
37229
37340
  totalAssetsRaw,
@@ -37239,6 +37350,7 @@ function parseVault6(v, chainId, prices, tokenList, evkIndex) {
37239
37350
  decimals,
37240
37351
  totalAssets: totalAssetsRaw,
37241
37352
  totalSupply: totalSupplyRaw,
37353
+ convertToAssets,
37242
37354
  supplyRate,
37243
37355
  rewardsRate: 0,
37244
37356
  depositRate: supplyRate,
@@ -38822,6 +38934,16 @@ var Erc4626PreviewRedeemAbi = [
38822
38934
 
38823
38935
  // src/vaults/lst/readers/shared.ts
38824
38936
  var ONE_E187 = 10n ** 18n;
38937
+ var MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
38938
+ var Multicall3BalanceAbi = [
38939
+ {
38940
+ name: "getEthBalance",
38941
+ type: "function",
38942
+ stateMutability: "view",
38943
+ inputs: [{ name: "addr", type: "address" }],
38944
+ outputs: [{ type: "uint256" }]
38945
+ }
38946
+ ];
38825
38947
  var toBigInt10 = (v) => {
38826
38948
  if (v === void 0 || v === null) return void 0;
38827
38949
  if (typeof v === "bigint") return v;
@@ -39006,6 +39128,13 @@ var EtherFiLiquidityPoolAbi = [
39006
39128
  stateMutability: "view",
39007
39129
  inputs: [],
39008
39130
  outputs: [{ type: "uint256" }]
39131
+ },
39132
+ {
39133
+ name: "ethAmountLockedForWithdrawal",
39134
+ type: "function",
39135
+ stateMutability: "view",
39136
+ inputs: [],
39137
+ outputs: [{ type: "uint256" }]
39009
39138
  }
39010
39139
  ];
39011
39140
 
@@ -39018,8 +39147,17 @@ var readerEtherFiWeEth = (entry) => {
39018
39147
  ];
39019
39148
  const abis = [TotalSupplyAbi, EtherFiWeEthAbi];
39020
39149
  if (lp) {
39021
- calls.push({ address: lp, name: "getTotalPooledEther", params: [] });
39022
- abis.push(EtherFiLiquidityPoolAbi);
39150
+ calls.push({
39151
+ address: MULTICALL3_ADDRESS,
39152
+ name: "getEthBalance",
39153
+ params: [lp]
39154
+ });
39155
+ calls.push({
39156
+ address: lp,
39157
+ name: "ethAmountLockedForWithdrawal",
39158
+ params: []
39159
+ });
39160
+ abis.push(Multicall3BalanceAbi, EtherFiLiquidityPoolAbi);
39023
39161
  }
39024
39162
  return {
39025
39163
  calls,
@@ -39030,7 +39168,14 @@ var readerEtherFiWeEth = (entry) => {
39030
39168
  if (totalSupply === void 0 || exchangeRate === void 0) {
39031
39169
  return void 0;
39032
39170
  }
39033
- const liquidity = lp ? toBigInt10(slice[2]) : void 0;
39171
+ let liquidity;
39172
+ if (lp) {
39173
+ const lpBalance = toBigInt10(slice[2]);
39174
+ const locked = toBigInt10(slice[3]);
39175
+ if (lpBalance !== void 0 && locked !== void 0) {
39176
+ liquidity = lpBalance > locked ? lpBalance - locked : 0n;
39177
+ }
39178
+ }
39034
39179
  return {
39035
39180
  totalAssets: totalSupply * exchangeRate / ONE_E187,
39036
39181
  totalSupply,
@@ -40062,6 +40207,11 @@ var resolveYieldApr = async (entries) => {
40062
40207
 
40063
40208
  // src/vaults/lst/fetchPublic.ts
40064
40209
  var ONE_E188 = 10n ** 18n;
40210
+ var ERC20_BALANCE_ABI = parseAbi([
40211
+ "function balanceOf(address) view returns (uint256)"
40212
+ ]);
40213
+ var INSTANT_MODES = /* @__PURE__ */ new Set(["instant-or-queued", "fee-or-queued"]);
40214
+ var IDLE_READER_KINDS = /* @__PURE__ */ new Set(["erc4626", "erc4626PreviewRedeem"]);
40065
40215
  var resolveAcceptedInputs = (chainId, shareToken, entry) => {
40066
40216
  const enriched = getLstAcceptedInputs(chainId, shareToken);
40067
40217
  if (enriched) return enriched;
@@ -40079,6 +40229,20 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
40079
40229
  const readers = entries.map(buildReader);
40080
40230
  const allCalls = readers.flatMap((r) => r.calls);
40081
40231
  const allAbis = readers.flatMap((r) => r.abis);
40232
+ const idleEntries = entries.filter(
40233
+ (e) => INSTANT_MODES.has(e.withdrawalMode) && IDLE_READER_KINDS.has(e.reader)
40234
+ );
40235
+ const idleIsNative = (e) => e.underlying.toLowerCase() === zeroAddress;
40236
+ const idleCalls = idleEntries.map(
40237
+ (e) => idleIsNative(e) ? {
40238
+ address: MULTICALL3_ADDRESS,
40239
+ name: "getEthBalance",
40240
+ params: [e.address]
40241
+ } : { address: e.underlying, name: "balanceOf", params: [e.address] }
40242
+ );
40243
+ const idleAbis = idleEntries.map(
40244
+ (e) => idleIsNative(e) ? Multicall3BalanceAbi : ERC20_BALANCE_ABI
40245
+ );
40082
40246
  const groups = {};
40083
40247
  for (let i = 0; i < allCalls.length; i++) {
40084
40248
  const target = allCalls[i].chainId ?? chainId;
@@ -40088,7 +40252,7 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
40088
40252
  g.positions.push(i);
40089
40253
  }
40090
40254
  const chainEntries = Object.entries(groups);
40091
- const [perChainResults, aprByAddress] = await Promise.all([
40255
+ const [perChainResults, aprByAddress, idleResults] = await Promise.all([
40092
40256
  chainEntries.length > 0 ? Promise.all(
40093
40257
  chainEntries.map(async ([chain, { calls, abis }]) => ({
40094
40258
  chain,
@@ -40099,8 +40263,19 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
40099
40263
  })
40100
40264
  }))
40101
40265
  ) : Promise.resolve([]),
40102
- resolveYieldApr(entries)
40266
+ resolveYieldApr(entries),
40267
+ idleEntries.length > 0 ? multicallRetry({
40268
+ chain: chainId,
40269
+ calls: idleCalls,
40270
+ abi: idleAbis,
40271
+ allowFailure: true
40272
+ }) : Promise.resolve([])
40103
40273
  ]);
40274
+ const idleByAddress = /* @__PURE__ */ new Map();
40275
+ idleEntries.forEach((e, i) => {
40276
+ const bal = toBigInt10(idleResults[i]);
40277
+ if (bal !== void 0) idleByAddress.set(e.address.toLowerCase(), bal);
40278
+ });
40104
40279
  const rawResults = new Array(allCalls.length);
40105
40280
  for (const { chain, results } of perChainResults) {
40106
40281
  const positions = groups[chain].positions;
@@ -40129,9 +40304,15 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
40129
40304
  const totalAssetsUsd = priceUsd !== void 0 ? totalAssetsFormatted * priceUsd : 0;
40130
40305
  const convertToAssets = state.exchangeRate;
40131
40306
  const convertToShares = state.exchangeRate > 0n ? ONE_E188 * ONE_E188 / state.exchangeRate : 0n;
40132
- const liquidity = state.liquidity;
40133
- const liquidityFormatted = liquidity !== void 0 ? Number(liquidity) / decimalsFactor : void 0;
40134
- const liquidityUsd = liquidityFormatted !== void 0 && priceUsd !== void 0 ? liquidityFormatted * priceUsd : liquidityFormatted !== void 0 ? 0 : void 0;
40307
+ let liquidityRaw;
40308
+ if (state.liquidity !== void 0) {
40309
+ liquidityRaw = state.liquidity;
40310
+ } else {
40311
+ const idle = idleByAddress.get(addressLc);
40312
+ liquidityRaw = idle !== void 0 ? idle > state.totalAssets ? state.totalAssets : idle : 0n;
40313
+ }
40314
+ const liquidityFormatted = Number(liquidityRaw) / decimalsFactor;
40315
+ const liquidityUsd = priceUsd !== void 0 ? liquidityFormatted * priceUsd : 0;
40135
40316
  const displayName = composeVaultDisplayName(
40136
40317
  entry.brand,
40137
40318
  entry.brand,
@@ -40171,7 +40352,7 @@ var fetchLstShareTokens = async (chainId, multicallRetry, prices = {}, tokenList
40171
40352
  priceUsd,
40172
40353
  totalAssetsFormatted,
40173
40354
  totalAssetsUsd,
40174
- liquidity: liquidity?.toString(),
40355
+ liquidity: liquidityRaw.toString(),
40175
40356
  liquidityFormatted,
40176
40357
  liquidityUsd
40177
40358
  };
@@ -42585,6 +42766,71 @@ var buildWithdrawalReader = (entry) => {
42585
42766
  // src/vaults/lst/withdrawals/registry.ts
42586
42767
  var LST_WITHDRAWAL_REGISTRY = {
42587
42768
  "1": [
42769
+ // Ankr ankrETH — Ankr unstake queue; reader not yet implemented.
42770
+ {
42771
+ lst: "0xe95a203b1a91a908f9b9ce46459d101078c2c3cb",
42772
+ brand: "Ankr",
42773
+ symbol: "ankrETH",
42774
+ reader: "unverified"
42775
+ },
42776
+ // BTC LSTs — exits via issuer/DEX or a protocol queue; per-protocol
42777
+ // readers not yet implemented. Listed as `unverified` placeholders so the
42778
+ // orchestrator surfaces the asset (returns [] requests) instead of
42779
+ // silently omitting it.
42780
+ {
42781
+ lst: "0x8db2350d78abc13f5673a411d4700bcf87864dde",
42782
+ brand: "Swell",
42783
+ symbol: "swBTC",
42784
+ reader: "unverified"
42785
+ },
42786
+ {
42787
+ lst: "0x8236a87084f8b84306f72007f36f2618a5634494",
42788
+ brand: "Lombard",
42789
+ symbol: "LBTC",
42790
+ reader: "unverified"
42791
+ },
42792
+ {
42793
+ lst: "0x657e8c867d8b37dcc18fa4caead9c45eb088c642",
42794
+ brand: "ether.fi",
42795
+ symbol: "eBTC",
42796
+ reader: "unverified"
42797
+ },
42798
+ {
42799
+ lst: "0x004e9c3ef86bc1ca1f0bb5c7662861ee93350568",
42800
+ brand: "Bedrock",
42801
+ symbol: "uniBTC",
42802
+ reader: "unverified"
42803
+ },
42804
+ {
42805
+ lst: "0x2ec37d45fcae65d9787ecf71dc85a444968f6646",
42806
+ brand: "Bedrock",
42807
+ symbol: "brBTC",
42808
+ reader: "unverified"
42809
+ },
42810
+ {
42811
+ lst: "0xf469fbd2abcd6b9de8e169d128226c0fc90a012e",
42812
+ brand: "PumpBTC",
42813
+ symbol: "pumpBTC",
42814
+ reader: "unverified"
42815
+ },
42816
+ {
42817
+ lst: "0x7a56e1c57c7475ccf742a1832b028f0456652f97",
42818
+ brand: "Solv",
42819
+ symbol: "SolvBTC",
42820
+ reader: "unverified"
42821
+ },
42822
+ {
42823
+ lst: "0xd9d920aa40f578ab794426f5c90f6c731d159def",
42824
+ brand: "Solv",
42825
+ symbol: "xSolvBTC",
42826
+ reader: "unverified"
42827
+ },
42828
+ {
42829
+ lst: "0xcea2daf93617b97504e05affc5bcf9b3922d3034",
42830
+ brand: "Solv",
42831
+ symbol: "BTC+",
42832
+ reader: "unverified"
42833
+ },
42588
42834
  {
42589
42835
  lst: "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0",
42590
42836
  brand: "Lido",
@@ -42748,6 +42994,13 @@ var LST_WITHDRAWAL_REGISTRY = {
42748
42994
  }
42749
42995
  ],
42750
42996
  "56": [
42997
+ // Ankr ankrBNB — Ankr unstake queue; reader not yet implemented.
42998
+ {
42999
+ lst: "0x52f24a5e03aee338da5fd9df68d2b6fae1178827",
43000
+ brand: "Ankr",
43001
+ symbol: "ankrBNB",
43002
+ reader: "unverified"
43003
+ },
42751
43004
  {
42752
43005
  // slisBNB — ListaStakeManager withdrawal queue. Per-user
42753
43006
  // requests via getUserWithdrawalRequests; claimability + BNB
@@ -42776,6 +43029,13 @@ var LST_WITHDRAWAL_REGISTRY = {
42776
43029
  }
42777
43030
  ],
42778
43031
  "137": [
43032
+ // Ankr ankrMATIC — bridged, non-mintable on Polygon; exit via DEX only.
43033
+ {
43034
+ lst: "0x0e9b89007eee9c958c0eda24ef70723c2c93dd58",
43035
+ brand: "Ankr",
43036
+ symbol: "ankrMATIC",
43037
+ reader: "noQueue"
43038
+ },
42779
43039
  {
42780
43040
  // Polygon-side MaticX is a bridged ERC-20 — users bridge to
42781
43041
  // Ethereum and claim from the L1 home contract.
@@ -42786,6 +43046,13 @@ var LST_WITHDRAWAL_REGISTRY = {
42786
43046
  }
42787
43047
  ],
42788
43048
  "43114": [
43049
+ // Ankr ankrAVAX — Ankr unstake queue; reader not yet implemented.
43050
+ {
43051
+ lst: "0xc3344870d52688874b06d844e0c36cc39fc727f6",
43052
+ brand: "Ankr",
43053
+ symbol: "ankrAVAX",
43054
+ reader: "unverified"
43055
+ },
42789
43056
  {
42790
43057
  lst: "0x2b2c81e08f1af8835a78bb2a90ae924ace0ea4be",
42791
43058
  brand: "BENQI",
@@ -42969,6 +43236,35 @@ var LST_WITHDRAWAL_REGISTRY = {
42969
43236
  reader: "stellaUnbondQueue",
42970
43237
  withdrawalContract: "0xbc7e02c4178a7df7d3e564323a5c359dc96c4db4"
42971
43238
  }
43239
+ ],
43240
+ "1116": [
43241
+ // Core DAO LSTs — CoreDAO stakers unbond via the Earn / staking
43242
+ // contracts; per-protocol queue readers not yet implemented.
43243
+ {
43244
+ lst: "0xb3a8f0f0da9ffc65318aa39e55079796093029ad",
43245
+ brand: "Core",
43246
+ symbol: "stCORE",
43247
+ reader: "unverified"
43248
+ },
43249
+ {
43250
+ lst: "0xc5555ea27e63cd89f8b227dece2a3916800c0f4f",
43251
+ brand: "b14g",
43252
+ symbol: "dualCORE",
43253
+ reader: "unverified"
43254
+ },
43255
+ {
43256
+ lst: "0xa20b3b97df3a02f9185175760300a06b4e0a2c05",
43257
+ brand: "StakedCore",
43258
+ symbol: "SCORE",
43259
+ reader: "unverified"
43260
+ },
43261
+ // pumpBTC on Core — bridged, non-mintable; exit via DEX only.
43262
+ {
43263
+ lst: "0x5a2aa871954ebdf89b1547e75d032598356caad5",
43264
+ brand: "PumpBTC",
43265
+ symbol: "pumpBTC",
43266
+ reader: "noQueue"
43267
+ }
42972
43268
  ]
42973
43269
  };
42974
43270
  var getLstWithdrawalRegistry = (chainId, extraEntries) => {
@@ -44191,10 +44487,12 @@ var classifyVault = (input) => {
44191
44487
  const denomination = isStablecoinSymbol(input.underlyingSymbol) ? "stable" : "volatile";
44192
44488
  return { yieldProfile, denomination };
44193
44489
  };
44194
- var stampVaultClassification = (data, chainId) => {
44490
+ var stampVaultClassification = (data, chainId, tokenList = {}) => {
44195
44491
  const stampBag = (bag, provider) => {
44196
44492
  if (!bag) return;
44197
44493
  for (const v of Object.values(bag)) {
44494
+ const shareAsset = tokenList[v.address?.toLowerCase?.() ?? ""];
44495
+ if (shareAsset) v.shareAsset = shareAsset;
44198
44496
  const c = classifyVault({
44199
44497
  provider,
44200
44498
  chainId,
@@ -44203,6 +44501,7 @@ var stampVaultClassification = (data, chainId) => {
44203
44501
  });
44204
44502
  v.yieldProfile = c.yieldProfile;
44205
44503
  v.denomination = c.denomination;
44504
+ v.sharePrice = v.convertToAssets ?? v.pricePerShare;
44206
44505
  }
44207
44506
  };
44208
44507
  stampBag(data.fluid, "fluid");
@@ -45475,7 +45774,8 @@ function buildVaultLookup(data) {
45475
45774
  // Carried through from `stampVaultClassification` (set on the
45476
45775
  // provider objects before the lookup is built).
45477
45776
  yieldProfile: v.yieldProfile,
45478
- denomination: v.denomination
45777
+ denomination: v.denomination,
45778
+ sharePrice: v.sharePrice
45479
45779
  });
45480
45780
  }
45481
45781
  };
@@ -45663,7 +45963,7 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
45663
45963
  );
45664
45964
  }
45665
45965
  await Promise.all(tasks);
45666
- stampVaultClassification(out, chainId);
45966
+ stampVaultClassification(out, chainId, tokenList);
45667
45967
  return { data: out, lookup: buildVaultLookup(out) };
45668
45968
  };
45669
45969