@1delta/margin-fetcher 0.0.251 → 0.0.253

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 (39) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +504 -6
  4. package/dist/index.js.map +1 -1
  5. package/dist/lending/public-data/fetchLender.d.ts.map +1 -1
  6. package/dist/vaults/displayName.d.ts +19 -0
  7. package/dist/vaults/displayName.d.ts.map +1 -0
  8. package/dist/vaults/euler-earn/fetchFromSubgraph.d.ts +12 -0
  9. package/dist/vaults/euler-earn/fetchFromSubgraph.d.ts.map +1 -0
  10. package/dist/vaults/euler-earn/fetchPublic.d.ts +24 -0
  11. package/dist/vaults/euler-earn/fetchPublic.d.ts.map +1 -0
  12. package/dist/vaults/euler-earn/index.d.ts +4 -0
  13. package/dist/vaults/euler-earn/index.d.ts.map +1 -0
  14. package/dist/vaults/euler-earn/types.d.ts +70 -0
  15. package/dist/vaults/euler-earn/types.d.ts.map +1 -0
  16. package/dist/vaults/fetchVaultsAll.d.ts +4 -2
  17. package/dist/vaults/fetchVaultsAll.d.ts.map +1 -1
  18. package/dist/vaults/fluid/publicCallParse.d.ts.map +1 -1
  19. package/dist/vaults/fluid/types.d.ts +11 -1
  20. package/dist/vaults/fluid/types.d.ts.map +1 -1
  21. package/dist/vaults/gearbox/publicCallParse.d.ts.map +1 -1
  22. package/dist/vaults/gearbox/types.d.ts +14 -1
  23. package/dist/vaults/gearbox/types.d.ts.map +1 -1
  24. package/dist/vaults/index.d.ts +2 -0
  25. package/dist/vaults/index.d.ts.map +1 -1
  26. package/dist/vaults/morpho/fetchFromApi.d.ts.map +1 -1
  27. package/dist/vaults/morpho/fetchFromChain.d.ts +30 -0
  28. package/dist/vaults/morpho/fetchFromChain.d.ts.map +1 -0
  29. package/dist/vaults/morpho/fetchFromSubgraph.d.ts.map +1 -1
  30. package/dist/vaults/morpho/fetchListaFromChain.d.ts +34 -0
  31. package/dist/vaults/morpho/fetchListaFromChain.d.ts.map +1 -0
  32. package/dist/vaults/morpho/index.d.ts +3 -1
  33. package/dist/vaults/morpho/index.d.ts.map +1 -1
  34. package/dist/vaults/morpho/types.d.ts +28 -1
  35. package/dist/vaults/morpho/types.d.ts.map +1 -1
  36. package/dist/vaults/silo/fetchPublic.d.ts.map +1 -1
  37. package/dist/vaults/silo/types.d.ts +12 -1
  38. package/dist/vaults/silo/types.d.ts.map +1 -1
  39. package/package.json +6 -6
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import { Lender, isAaveType, isCompoundV3, isMultiMarket, isSiloV2Type, isSiloV3
5
5
  export { isAaveType, isAaveV2Type, isAaveV32Type, isAaveV3Type, isCompoundV3, isCompoundV3Type, isInit, isMorphoType, isMultiMarket, isYLDR } from '@1delta/lender-registry';
6
6
  import lodash from 'lodash';
7
7
  import { getEvmChain, getEvmClient, getEvmClientUniversal, multicallRetryUniversal } from '@1delta/providers';
8
- import { FluidLendingResolverAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, FluidVaultResolverAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, GearboxCreditAccountCompressorV310Abi } from '@1delta/abis';
8
+ import { FluidLendingResolverAbi, MetaMorphoAbi, MoolahVaultAbi, MorphoLensAbi, AaveV4SpokeAbi, AaveV4OracleAbi, AaveV4HubAbi, FluidVaultResolverAbi, GearboxMarketCompressorV310Abi, MorphoBlueAbi, GearboxCreditAccountCompressorV310Abi } from '@1delta/abis';
9
9
  export { MorphoLensAbi } from '@1delta/abis';
10
10
  import { prepareDebitDataMulticall, prepareLenderDebitMulticall, parseDebitDataResult, parseLenderDebitResult, getPermit2ContractAddress, getCompoundV3CometAddress as getCompoundV3CometAddress$1, getMorphoAddress, getAaveCollateralTokenAddress, getSiloHalfForUnderlying, InitMarginAddresses } from '@1delta/calldata-sdk';
11
11
  import { proxyNativeFetch } from '@1delta/proxy-fetch';
@@ -6269,6 +6269,7 @@ globalThis[GLOBAL_LENDER_DATA_KEY] = {
6269
6269
  morphoOracles: {},
6270
6270
  morphoTypeOracles: {},
6271
6271
  morphoTypeMarkets: {},
6272
+ morphoTypeVaults: {},
6272
6273
  aaveOraclesConfig: {},
6273
6274
  aaveWethGateway: {},
6274
6275
  morphoBundler3: {},
@@ -6300,6 +6301,7 @@ var aaveOracles = () => getGlobalData2()?.aaveOracles;
6300
6301
  var compoundV2Oracles = () => getGlobalData2()?.compoundV2Oracles;
6301
6302
  var compoundV3OraclesData = () => getGlobalData2()?.compoundV3OraclesData;
6302
6303
  var morphoTypeMarkets = () => getGlobalData2()?.morphoTypeMarkets;
6304
+ var morphoTypeVaults = () => getGlobalData2()?.morphoTypeVaults;
6303
6305
  var aaveReserves = () => getGlobalData2()?.aaveReserves;
6304
6306
  var compoundV3Reserves = () => getGlobalData2()?.compoundV3Reserves;
6305
6307
  var compoundV2Reserves = () => getGlobalData2()?.compoundV2Reserves;
@@ -8118,6 +8120,9 @@ function encode(type, value, isArray2 = false) {
8118
8120
  throw new UnsupportedPackedAbiType(type);
8119
8121
  }
8120
8122
 
8123
+ // ../../node_modules/.pnpm/viem@2.45.3_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@6.0.6_zod@4.3.6/node_modules/viem/_esm/constants/bytes.js
8124
+ var zeroHash = "0x0000000000000000000000000000000000000000000000000000000000000000";
8125
+
8121
8126
  // ../../node_modules/.pnpm/viem@2.45.3_bufferutil@4.1.0_typescript@5.9.3_utf-8-validate@6.0.6_zod@4.3.6/node_modules/viem/_esm/errors/unit.js
8122
8127
  var InvalidDecimalNumberError = class extends BaseError {
8123
8128
  constructor({ value }) {
@@ -19835,11 +19840,14 @@ var getLenderPublicData = async (chainId, lenders, prices, additionalYields, mul
19835
19840
  return {};
19836
19841
  }) => {
19837
19842
  let calls = [];
19843
+ const validLenders = [];
19838
19844
  for (const lender of lenders) {
19839
19845
  const abi = getAbi(lender);
19840
19846
  const callData = buildLenderCall(chainId, lender);
19847
+ if (callData.some((c) => !c.address)) continue;
19841
19848
  const mappedCalls = callData.map((call) => ({ call, abi: call.abi ?? abi }));
19842
19849
  calls.push(...mappedCalls);
19850
+ validLenders.push(lender);
19843
19851
  }
19844
19852
  const [rawResults, list] = await Promise.all([
19845
19853
  multicallRetry({
@@ -19853,7 +19861,7 @@ var getLenderPublicData = async (chainId, lenders, prices, additionalYields, mul
19853
19861
  const invalidLenders = [];
19854
19862
  let lenderData = {};
19855
19863
  let currentSlice = 0;
19856
- for (const lender of lenders) {
19864
+ for (const lender of validLenders) {
19857
19865
  const [converter, sliceLength] = getLenderDataConverter(
19858
19866
  lender,
19859
19867
  chainId,
@@ -33928,6 +33936,15 @@ var buildFluidFTokensCall = (chainId) => {
33928
33936
  ];
33929
33937
  };
33930
33938
 
33939
+ // src/vaults/displayName.ts
33940
+ var composeVaultDisplayName = (brand, curatorName, asset, fallbackName) => {
33941
+ const symbol = (asset?.symbol ?? "").trim();
33942
+ const label = (curatorName ?? brand).trim() || brand;
33943
+ if (symbol) return `${label} ${symbol}`;
33944
+ const fallback = (fallbackName ?? "").trim();
33945
+ return fallback || brand;
33946
+ };
33947
+
33931
33948
  // src/vaults/fluid/publicCallParse.ts
33932
33949
  var FLUID_EEE_LOWER4 = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
33933
33950
  var normalizeUnderlying4 = (addr) => addr === FLUID_EEE_LOWER4 ? zeroAddress : addr;
@@ -33964,11 +33981,21 @@ function parseFTokens(fTokens, chainId, prices, tokenList) {
33964
33981
  const rewardsRate = scaleFluidRate2(ft.rewardsRate);
33965
33982
  const liquidityRaw = ft.liquidityUserSupplyData?.withdrawable?.toString() ?? "0";
33966
33983
  const liquidityFormatted = Number(parseRawAmount(liquidityRaw, decimals));
33984
+ const onchainName = (ft.name ?? "").toString().trim();
33985
+ const underlyingSymbol = (assetMeta?.symbol ?? ft.symbol ?? "").toString().replace(/^f/, "").trim();
33986
+ const displayName = onchainName ? onchainName : underlyingSymbol ? `Fluid ${underlyingSymbol}` : "Fluid";
33967
33987
  const entry = {
33968
33988
  address: ft.tokenAddress,
33969
33989
  underlying,
33970
33990
  symbol: ft.symbol ?? "",
33971
- name: ft.name ?? "",
33991
+ name: displayName,
33992
+ displayName: composeVaultDisplayName(
33993
+ "Fluid",
33994
+ void 0,
33995
+ assetMeta,
33996
+ displayName
33997
+ ),
33998
+ curatorName: "Fluid",
33972
33999
  decimals,
33973
34000
  totalAssets: ft.totalAssets?.toString() ?? "0",
33974
34001
  totalSupply: ft.totalSupply?.toString() ?? "0",
@@ -34050,6 +34077,7 @@ var getGearboxV3PoolsConverter = (chainId, prices = {}, tokenList = {}) => {
34050
34077
  };
34051
34078
  function parseMarkets(markets, chainId, prices, tokenList) {
34052
34079
  const out = {};
34080
+ const configuratorNames = gearboxMarketConfigurators(chainId) ?? {};
34053
34081
  for (const m of markets) {
34054
34082
  const pool = m?.pool;
34055
34083
  if (!pool) continue;
@@ -34068,11 +34096,19 @@ function parseMarkets(markets, chainId, prices, tokenList) {
34068
34096
  const priceUsd = prices[oracleKey] ?? prices[underlying] ?? 0;
34069
34097
  const liquidityRaw = pool.availableLiquidity?.toString() ?? "0";
34070
34098
  const liquidityFormatted = Number(parseRawAmount(liquidityRaw, decimals));
34099
+ const configurator = (m?.configurator ?? "").toString().toLowerCase();
34100
+ const curatorName = configurator ? configuratorNames[configurator] : void 0;
34071
34101
  const entry = {
34072
34102
  address: rawAddress,
34073
34103
  underlying,
34074
34104
  symbol: pool.symbol ?? "",
34075
34105
  name: pool.name ?? "",
34106
+ displayName: composeVaultDisplayName(
34107
+ "Gearbox",
34108
+ curatorName,
34109
+ assetMeta,
34110
+ pool.name ?? void 0
34111
+ ),
34076
34112
  decimals,
34077
34113
  totalAssets: totalAssetsRaw,
34078
34114
  totalSupply: pool.totalSupply?.toString() ?? "0",
@@ -34081,6 +34117,8 @@ function parseMarkets(markets, chainId, prices, tokenList) {
34081
34117
  expectedLiquidity: pool.expectedLiquidity?.toString() ?? "0",
34082
34118
  dieselRate: pool.dieselRate?.toString() ?? "0",
34083
34119
  withdrawFeeBps: Number(pool.withdrawFee ?? 0),
34120
+ curator: configurator || void 0,
34121
+ curatorName,
34084
34122
  supplyRate: scaleRate(pool.supplyRate),
34085
34123
  baseInterestRate: scaleRate(pool.baseInterestRate),
34086
34124
  asset: assetMeta,
@@ -34146,6 +34184,12 @@ query GetVaults {
34146
34184
  owner
34147
34185
  curator
34148
34186
  guardian
34187
+ curators {
34188
+ id
34189
+ name
34190
+ image
34191
+ verified
34192
+ }
34149
34193
  rewards {
34150
34194
  supplyApr
34151
34195
  asset {
@@ -34171,6 +34215,21 @@ async function fetchPage(chainId, first, skip) {
34171
34215
  const json = await response.json();
34172
34216
  return json?.data?.vaults?.items ?? [];
34173
34217
  }
34218
+ var parseCurators = (curators) => {
34219
+ if (!curators?.length) return void 0;
34220
+ const out = [];
34221
+ for (const c of curators) {
34222
+ const name = c?.name?.trim();
34223
+ if (!name) continue;
34224
+ out.push({
34225
+ id: c.id ?? "",
34226
+ name,
34227
+ image: c.image ?? void 0,
34228
+ verified: c.verified ?? void 0
34229
+ });
34230
+ }
34231
+ return out.length > 0 ? out : void 0;
34232
+ };
34174
34233
  var sumRewardsApr = (rewards) => {
34175
34234
  if (!rewards) return 0;
34176
34235
  let total = 0;
@@ -34200,11 +34259,19 @@ function parseVault2(v, chainId, prices, tokenList) {
34200
34259
  const rewardsRate = sumRewardsApr(state.rewards);
34201
34260
  const apiTotalAssetsUsd = Number(state.totalAssetsUsd ?? 0);
34202
34261
  const totalAssetsUsd = apiTotalAssetsUsd || totalAssetsFormatted * resolvedPriceUsd;
34262
+ const curators = parseCurators(state.curators);
34263
+ const primaryCurator = curators?.[0];
34203
34264
  return {
34204
34265
  address,
34205
34266
  underlying: assetAddr,
34206
34267
  symbol: v.symbol ?? "",
34207
34268
  name: v.name ?? "",
34269
+ displayName: composeVaultDisplayName(
34270
+ "Morpho",
34271
+ primaryCurator?.name,
34272
+ assetMeta,
34273
+ v.name ?? void 0
34274
+ ),
34208
34275
  decimals,
34209
34276
  totalAssets: totalAssetsRaw,
34210
34277
  totalSupply: state.totalSupply?.toString() ?? "0",
@@ -34217,6 +34284,9 @@ function parseVault2(v, chainId, prices, tokenList) {
34217
34284
  owner: state.owner?.toLowerCase() || void 0,
34218
34285
  curator: state.curator?.toLowerCase() || void 0,
34219
34286
  guardian: state.guardian?.toLowerCase() || void 0,
34287
+ curatorName: primaryCurator?.name,
34288
+ curatorImage: primaryCurator?.image,
34289
+ curators,
34220
34290
  asset: assetMeta,
34221
34291
  priceUsd: resolvedPriceUsd || void 0,
34222
34292
  totalAssetsFormatted,
@@ -34294,6 +34364,12 @@ function parseVault3(v, chainId, prices, tokenList) {
34294
34364
  underlying: assetAddr,
34295
34365
  symbol: v.symbol ?? "",
34296
34366
  name: v.name ?? "",
34367
+ displayName: composeVaultDisplayName(
34368
+ "Morpho",
34369
+ void 0,
34370
+ assetMeta,
34371
+ v.name ?? void 0
34372
+ ),
34297
34373
  decimals,
34298
34374
  totalAssets: totalAssetsRaw,
34299
34375
  totalSupply: v.totalShares?.toString() ?? "0",
@@ -34352,6 +34428,289 @@ var fetchMorphoVaults = async (chainId, prices = {}, tokenList = {}) => {
34352
34428
  }
34353
34429
  return fetchMorphoVaultsFromApi(chainId, prices, tokenList);
34354
34430
  };
34431
+ var VAULT_CALLS = [
34432
+ "name",
34433
+ "symbol",
34434
+ "decimals",
34435
+ "totalAssets",
34436
+ "totalSupply",
34437
+ "fee",
34438
+ "timelock",
34439
+ "owner",
34440
+ "curator",
34441
+ "guardian"
34442
+ ];
34443
+ var CALLS_PER_VAULT = VAULT_CALLS.length;
34444
+ var FEE_SCALE = 1e18;
34445
+ var isHex40 = (addr) => typeof addr === "string" && /^0x[0-9a-f]{40}$/i.test(addr);
34446
+ var lcOrUndefined = (addr) => isHex40(addr) ? addr.toLowerCase() : void 0;
34447
+ var toNumberSafe = (raw, fallback = 0) => {
34448
+ if (raw === void 0 || raw === null) return fallback;
34449
+ const n = Number(raw);
34450
+ return Number.isFinite(n) ? n : fallback;
34451
+ };
34452
+ var toStringSafe = (raw, fallback = "") => {
34453
+ if (raw === void 0 || raw === null) return fallback;
34454
+ return String(raw);
34455
+ };
34456
+ var DEFAULT_SKIP_PROTOCOLS = /* @__PURE__ */ new Set(["LISTA_DAO"]);
34457
+ var collectEntries = (chainId, protocols, skip) => {
34458
+ const all = morphoTypeVaults() ?? {};
34459
+ const out = [];
34460
+ const seen = /* @__PURE__ */ new Set();
34461
+ const protocolKeys = protocols && protocols.length > 0 ? protocols : Object.keys(all);
34462
+ for (const protocol of protocolKeys) {
34463
+ if (skip?.has(protocol)) continue;
34464
+ const list = all[protocol]?.[chainId] ?? [];
34465
+ for (const entry of list) {
34466
+ const vaultAddr = entry?.vault?.toLowerCase();
34467
+ if (!vaultAddr || seen.has(vaultAddr)) continue;
34468
+ seen.add(vaultAddr);
34469
+ out.push({ protocol, entry });
34470
+ }
34471
+ }
34472
+ return out;
34473
+ };
34474
+ var fetchMorphoVaultsFromChain = async (chainId, multicallRetry, prices = {}, tokenList = {}, opts = {}) => {
34475
+ const entries = opts.vaultsOverride ? opts.vaultsOverride.map((entry) => ({ protocol: "", entry })) : collectEntries(chainId, opts.protocols, DEFAULT_SKIP_PROTOCOLS);
34476
+ if (entries.length === 0) return {};
34477
+ const calls = entries.flatMap(
34478
+ ({ entry }) => VAULT_CALLS.map((name) => ({
34479
+ address: entry.vault,
34480
+ name,
34481
+ params: []
34482
+ }))
34483
+ );
34484
+ const raw = await multicallRetry({
34485
+ chain: chainId,
34486
+ calls,
34487
+ abi: calls.map(() => MetaMorphoAbi),
34488
+ allowFailure: true
34489
+ });
34490
+ const out = {};
34491
+ for (let i = 0; i < entries.length; i++) {
34492
+ const { entry } = entries[i];
34493
+ const base = i * CALLS_PER_VAULT;
34494
+ const slice = raw.slice(base, base + CALLS_PER_VAULT);
34495
+ const parsed = parseVault4(entry, slice, chainId, prices, tokenList);
34496
+ if (parsed) out[parsed.address] = parsed;
34497
+ }
34498
+ return out;
34499
+ };
34500
+ function parseVault4(entry, results, chainId, prices, tokenList) {
34501
+ const address = entry?.vault?.toLowerCase();
34502
+ const underlying = entry?.underlying?.toLowerCase();
34503
+ if (!address || !underlying) return null;
34504
+ const [
34505
+ nameRaw,
34506
+ symbolRaw,
34507
+ decimalsRaw,
34508
+ totalAssetsRaw,
34509
+ totalSupplyRaw,
34510
+ feeRaw,
34511
+ timelockRaw,
34512
+ ownerRaw,
34513
+ curatorRaw,
34514
+ guardianRaw
34515
+ ] = results;
34516
+ const assetMeta = tokenList[underlying];
34517
+ const decimals = Number(decimalsRaw ?? assetMeta?.decimals ?? 18);
34518
+ const totalAssets = toStringSafe(totalAssetsRaw, "0");
34519
+ const totalSupply = toStringSafe(totalSupplyRaw, "0");
34520
+ const totalAssetsFormatted = Number(parseRawAmount(totalAssets, decimals));
34521
+ const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(underlying, chainId);
34522
+ const priceUsd = prices[oracleKey] ?? prices[underlying] ?? 0;
34523
+ const onchainName = toStringSafe(nameRaw).trim();
34524
+ const fallbackName = onchainName || (entry.name ?? "").trim();
34525
+ const symbol = toStringSafe(symbolRaw);
34526
+ const fee = toNumberSafe(feeRaw) / FEE_SCALE * 100;
34527
+ const timelock = toNumberSafe(timelockRaw);
34528
+ return {
34529
+ address,
34530
+ underlying,
34531
+ symbol,
34532
+ name: fallbackName,
34533
+ displayName: composeVaultDisplayName("Morpho", void 0, assetMeta, fallbackName),
34534
+ decimals,
34535
+ totalAssets,
34536
+ totalSupply,
34537
+ // On-chain path can't compute the per-allocation supply APR without
34538
+ // walking the underlying market list — surface 0 like the Goldsky path
34539
+ // does for rewards. Callers that need APR on these vaults should layer
34540
+ // it in separately or fall back to the API/subgraph fetchers.
34541
+ supplyRate: 0,
34542
+ rewardsRate: 0,
34543
+ depositRate: 0,
34544
+ fee,
34545
+ timelock,
34546
+ whitelisted: true,
34547
+ owner: lcOrUndefined(ownerRaw),
34548
+ curator: lcOrUndefined(curatorRaw),
34549
+ guardian: lcOrUndefined(guardianRaw),
34550
+ asset: assetMeta,
34551
+ priceUsd: priceUsd || void 0,
34552
+ totalAssetsFormatted,
34553
+ totalAssetsUsd: totalAssetsFormatted * priceUsd,
34554
+ // No on-chain "immediately withdrawable" figure without summing the
34555
+ // public allocator's per-market caps. Use totalAssets as an optimistic
34556
+ // ceiling — same convention as Silo / Euler-Earn / Morpho-Goldsky.
34557
+ liquidity: totalAssets,
34558
+ liquidityFormatted: totalAssetsFormatted,
34559
+ liquidityUsd: totalAssetsFormatted * priceUsd
34560
+ };
34561
+ }
34562
+ var LISTA_PROTOCOL = "LISTA_DAO";
34563
+ var PHASE1_CALLS = [
34564
+ "name",
34565
+ "symbol",
34566
+ "decimals",
34567
+ "totalAssets",
34568
+ "totalSupply",
34569
+ "fee",
34570
+ "feeRecipient",
34571
+ "CURATOR"
34572
+ ];
34573
+ var PHASE1_PER_VAULT = PHASE1_CALLS.length;
34574
+ var FEE_SCALE2 = 1e18;
34575
+ var isHex402 = (addr) => typeof addr === "string" && /^0x[0-9a-f]{40}$/i.test(addr);
34576
+ var lcOrUndefined2 = (addr) => {
34577
+ if (!isHex402(addr)) return void 0;
34578
+ const lower = addr.toLowerCase();
34579
+ return lower === zeroAddress ? void 0 : lower;
34580
+ };
34581
+ var isHex64 = (val) => typeof val === "string" && /^0x[0-9a-f]{64}$/i.test(val);
34582
+ var toNumberSafe2 = (raw, fallback = 0) => {
34583
+ if (raw === void 0 || raw === null) return fallback;
34584
+ const n = Number(raw);
34585
+ return Number.isFinite(n) ? n : fallback;
34586
+ };
34587
+ var toStringSafe2 = (raw, fallback = "") => {
34588
+ if (raw === void 0 || raw === null) return fallback;
34589
+ return String(raw);
34590
+ };
34591
+ var collectEntries2 = (chainId) => {
34592
+ const list = morphoTypeVaults()?.[LISTA_PROTOCOL]?.[chainId] ?? [];
34593
+ const seen = /* @__PURE__ */ new Set();
34594
+ const out = [];
34595
+ for (const entry of list) {
34596
+ const vaultAddr = entry?.vault?.toLowerCase();
34597
+ if (!vaultAddr || seen.has(vaultAddr)) continue;
34598
+ seen.add(vaultAddr);
34599
+ out.push(entry);
34600
+ }
34601
+ return out;
34602
+ };
34603
+ var fetchListaVaultsFromChain = async (chainId, multicallRetry, prices = {}, tokenList = {}, opts = {}) => {
34604
+ const entries = opts.vaultsOverride ?? collectEntries2(chainId);
34605
+ if (entries.length === 0) return {};
34606
+ const phase1Calls = entries.flatMap(
34607
+ (entry) => PHASE1_CALLS.map((name) => ({
34608
+ address: entry.vault,
34609
+ name,
34610
+ params: []
34611
+ }))
34612
+ );
34613
+ const phase1 = await multicallRetry({
34614
+ chain: chainId,
34615
+ calls: phase1Calls,
34616
+ abi: phase1Calls.map(() => MoolahVaultAbi),
34617
+ allowFailure: true
34618
+ });
34619
+ const curatorRoleByVault = [];
34620
+ for (let i = 0; i < entries.length; i++) {
34621
+ const role = phase1[i * PHASE1_PER_VAULT + 7];
34622
+ curatorRoleByVault.push(isHex64(role) ? role : void 0);
34623
+ }
34624
+ const phase2Calls = entries.map((entry, i) => ({
34625
+ address: entry.vault,
34626
+ name: "getRoleMember",
34627
+ params: [curatorRoleByVault[i] ?? zeroHash, 0n]
34628
+ }));
34629
+ const phase2 = await multicallRetry({
34630
+ chain: chainId,
34631
+ calls: phase2Calls,
34632
+ abi: phase2Calls.map(() => MoolahVaultAbi),
34633
+ allowFailure: true
34634
+ });
34635
+ const out = {};
34636
+ for (let i = 0; i < entries.length; i++) {
34637
+ const entry = entries[i];
34638
+ const slice = phase1.slice(
34639
+ i * PHASE1_PER_VAULT,
34640
+ (i + 1) * PHASE1_PER_VAULT
34641
+ );
34642
+ const curatorAddrRaw = curatorRoleByVault[i] ? phase2[i] : void 0;
34643
+ const parsed = parseVault5(
34644
+ entry,
34645
+ slice,
34646
+ curatorAddrRaw,
34647
+ chainId,
34648
+ prices,
34649
+ tokenList
34650
+ );
34651
+ if (parsed) out[parsed.address] = parsed;
34652
+ }
34653
+ return out;
34654
+ };
34655
+ function parseVault5(entry, results, curatorAddrRaw, chainId, prices, tokenList) {
34656
+ const address = entry?.vault?.toLowerCase();
34657
+ const underlying = entry?.underlying?.toLowerCase();
34658
+ if (!address || !underlying) return null;
34659
+ const [
34660
+ nameRaw,
34661
+ symbolRaw,
34662
+ decimalsRaw,
34663
+ totalAssetsRaw,
34664
+ totalSupplyRaw,
34665
+ feeRaw,
34666
+ /* feeRecipientRaw */
34667
+ ,
34668
+ /* curatorRoleRaw */
34669
+ ,
34670
+ ] = results;
34671
+ const assetMeta = tokenList[underlying];
34672
+ const decimals = Number(decimalsRaw ?? assetMeta?.decimals ?? 18);
34673
+ const totalAssets = toStringSafe2(totalAssetsRaw, "0");
34674
+ const totalSupply = toStringSafe2(totalSupplyRaw, "0");
34675
+ const totalAssetsFormatted = Number(parseRawAmount(totalAssets, decimals));
34676
+ const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(underlying, chainId);
34677
+ const priceUsd = prices[oracleKey] ?? prices[underlying] ?? 0;
34678
+ const onchainName = toStringSafe2(nameRaw).trim();
34679
+ const fallbackName = onchainName || (entry.name ?? "").trim();
34680
+ const symbol = toStringSafe2(symbolRaw);
34681
+ const fee = toNumberSafe2(feeRaw) / FEE_SCALE2 * 100;
34682
+ return {
34683
+ address,
34684
+ underlying,
34685
+ symbol,
34686
+ name: fallbackName,
34687
+ displayName: composeVaultDisplayName(
34688
+ "Lista",
34689
+ void 0,
34690
+ assetMeta,
34691
+ fallbackName
34692
+ ),
34693
+ decimals,
34694
+ totalAssets,
34695
+ totalSupply,
34696
+ supplyRate: 0,
34697
+ rewardsRate: 0,
34698
+ depositRate: 0,
34699
+ fee,
34700
+ timelock: 0,
34701
+ whitelisted: true,
34702
+ owner: void 0,
34703
+ curator: lcOrUndefined2(curatorAddrRaw),
34704
+ guardian: void 0,
34705
+ asset: assetMeta,
34706
+ priceUsd: priceUsd || void 0,
34707
+ totalAssetsFormatted,
34708
+ totalAssetsUsd: totalAssetsFormatted * priceUsd,
34709
+ liquidity: totalAssets,
34710
+ liquidityFormatted: totalAssetsFormatted,
34711
+ liquidityUsd: totalAssetsFormatted * priceUsd
34712
+ };
34713
+ }
34355
34714
 
34356
34715
  // src/vaults/silo/fetchPublic.ts
34357
34716
  var SILO_API_URL = "https://api-v3.silo.finance";
@@ -34391,7 +34750,7 @@ var toRawAmount = (decimalString, decimals) => {
34391
34750
  return "0";
34392
34751
  }
34393
34752
  };
34394
- function parseVault4(v, chainId, prices, tokenList) {
34753
+ function parseVault6(v, chainId, prices, tokenList) {
34395
34754
  const address = (v?.id ?? "").toLowerCase();
34396
34755
  const assetAddr = (v?.asset?.id ?? "").toLowerCase();
34397
34756
  if (!address || !assetAddr) return null;
@@ -34415,6 +34774,12 @@ function parseVault4(v, chainId, prices, tokenList) {
34415
34774
  underlying: assetAddr,
34416
34775
  symbol: v.symbol ?? "",
34417
34776
  name: v.name ?? "",
34777
+ displayName: composeVaultDisplayName(
34778
+ "Silo",
34779
+ void 0,
34780
+ assetMeta,
34781
+ v.name ?? void 0
34782
+ ),
34418
34783
  decimals,
34419
34784
  protocolVersion: v.protocol?.protocolVersion ?? "",
34420
34785
  protocolId: (v.protocolId ?? v.protocol?.id ?? "").toLowerCase(),
@@ -34469,10 +34834,131 @@ var fetchSiloVaults = async (chainId, prices = {}, tokenList = {}, options) => {
34469
34834
  if (options?.protocolVersion && v.protocol?.protocolVersion !== options.protocolVersion) {
34470
34835
  continue;
34471
34836
  }
34472
- const parsed = parseVault4(v, chainId, prices, tokenList);
34837
+ const parsed = parseVault6(v, chainId, prices, tokenList);
34838
+ if (parsed) out[parsed.address] = parsed;
34839
+ }
34840
+ return out;
34841
+ };
34842
+
34843
+ // src/vaults/euler-earn/fetchFromSubgraph.ts
34844
+ var EULER_EARN_SUBGRAPH_URLS = {
34845
+ // [Chain.ETHEREUM_MAINNET]:
34846
+ // 'https://api.goldsky.com/api/public/<projectId>/subgraphs/euler-earn-mainnet/<ver>/gn',
34847
+ };
34848
+ var hasEulerEarnVaultSubgraph = (chainId) => chainId in EULER_EARN_SUBGRAPH_URLS;
34849
+ var EULER_EARN_VAULTS_QUERY = `
34850
+ {
34851
+ eulerEarnVaults(first: 200, skip: 0) {
34852
+ id
34853
+ name
34854
+ symbol
34855
+ decimals
34856
+ asset { id }
34857
+ owner { id }
34858
+ curator { id }
34859
+ guardian { id }
34860
+ feeRecipient
34861
+ performanceFee
34862
+ fee
34863
+ totalAssets
34864
+ totalShares
34865
+ supplyApy
34866
+ rate { id rate }
34867
+ }
34868
+ }
34869
+ `;
34870
+ function readAddress2(field5) {
34871
+ if (!field5) return void 0;
34872
+ if (typeof field5 === "string") return field5.toLowerCase();
34873
+ return field5.id?.toLowerCase();
34874
+ }
34875
+ function parseVaultRate2(v) {
34876
+ if (v.supplyApy != null) {
34877
+ const n = Number(v.supplyApy);
34878
+ if (Number.isFinite(n)) {
34879
+ return n < 1 ? n * 100 : n;
34880
+ }
34881
+ }
34882
+ if (v.rate?.rate) {
34883
+ const n = Number(v.rate.rate) * 100;
34884
+ if (Number.isFinite(n)) return n;
34885
+ }
34886
+ return 0;
34887
+ }
34888
+ function parseVaultFee(v) {
34889
+ const raw = v.performanceFee ?? v.fee;
34890
+ if (raw == null) return 0;
34891
+ const n = Number(raw);
34892
+ if (!Number.isFinite(n)) return 0;
34893
+ if (n < 1) return n * 100;
34894
+ if (n > 100) return n / 1e16;
34895
+ return n;
34896
+ }
34897
+ function parseVault7(v, chainId, prices, tokenList) {
34898
+ const address = (v?.id ?? "").toLowerCase();
34899
+ const assetAddr = (v?.asset?.id ?? "").toLowerCase();
34900
+ if (!address || !assetAddr) return null;
34901
+ const assetMeta = tokenList[assetAddr];
34902
+ const decimals = Number(v.decimals ?? assetMeta?.decimals ?? 18);
34903
+ const totalAssetsRaw = v.totalAssets?.toString() ?? "0";
34904
+ const totalAssetsFormatted = Number(parseRawAmount(totalAssetsRaw, decimals));
34905
+ const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(assetAddr, chainId);
34906
+ const priceUsd = prices[oracleKey] ?? prices[assetAddr] ?? 0;
34907
+ const supplyRate = parseVaultRate2(v);
34908
+ const fee = parseVaultFee(v);
34909
+ return {
34910
+ address,
34911
+ underlying: assetAddr,
34912
+ symbol: v.symbol ?? "",
34913
+ name: v.name ?? "",
34914
+ decimals,
34915
+ totalAssets: totalAssetsRaw,
34916
+ totalSupply: v.totalShares?.toString() ?? "0",
34917
+ supplyRate,
34918
+ rewardsRate: 0,
34919
+ depositRate: supplyRate,
34920
+ fee,
34921
+ owner: readAddress2(v.owner),
34922
+ curator: readAddress2(v.curator),
34923
+ guardian: readAddress2(v.guardian),
34924
+ feeRecipient: v.feeRecipient?.toLowerCase() || void 0,
34925
+ asset: assetMeta,
34926
+ priceUsd: priceUsd || void 0,
34927
+ totalAssetsFormatted,
34928
+ totalAssetsUsd: totalAssetsFormatted * priceUsd,
34929
+ // Subgraph doesn't expose immediate-withdraw — same optimistic
34930
+ // ceiling as Morpho/Silo earn-vault fetchers.
34931
+ liquidity: totalAssetsRaw,
34932
+ liquidityFormatted: totalAssetsFormatted,
34933
+ liquidityUsd: totalAssetsFormatted * priceUsd
34934
+ };
34935
+ }
34936
+ async function fetchEulerEarnVaultsFromSubgraph(chainId, prices = {}, tokenList = {}) {
34937
+ const url = EULER_EARN_SUBGRAPH_URLS[chainId];
34938
+ if (!url) return {};
34939
+ const response = await fetch(url, {
34940
+ method: "POST",
34941
+ headers: { "Content-Type": "application/json" },
34942
+ body: JSON.stringify({ query: EULER_EARN_VAULTS_QUERY })
34943
+ });
34944
+ if (!response.ok) {
34945
+ throw new Error(
34946
+ `Euler Earn vaults subgraph failed for chain ${chainId}: ${response.status} - ${response.statusText}`
34947
+ );
34948
+ }
34949
+ const json = await response.json();
34950
+ const items = json?.data?.eulerEarnVaults ?? [];
34951
+ const out = {};
34952
+ for (const v of items) {
34953
+ const parsed = parseVault7(v, chainId, prices, tokenList);
34473
34954
  if (parsed) out[parsed.address] = parsed;
34474
34955
  }
34475
34956
  return out;
34957
+ }
34958
+
34959
+ // src/vaults/euler-earn/fetchPublic.ts
34960
+ var fetchEulerEarnVaults = async (chainId, prices = {}, tokenList = {}) => {
34961
+ return fetchEulerEarnVaultsFromSubgraph(chainId, prices, tokenList);
34476
34962
  };
34477
34963
  var warn3 = (...args) => {
34478
34964
  };
@@ -34532,6 +35018,18 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
34532
35018
  })
34533
35019
  );
34534
35020
  }
35021
+ if (requested.has("euler-earn")) {
35022
+ tasks.push(
35023
+ fetchEulerEarnVaults(chainId, prices, tokenList).then((res) => {
35024
+ out["euler-earn"] = res;
35025
+ }).catch((e) => {
35026
+ warn3(
35027
+ `[vaults] euler-earn fetch failed for chain ${chainId}:`,
35028
+ e?.message ?? e
35029
+ );
35030
+ })
35031
+ );
35032
+ }
34535
35033
  await Promise.all(tasks);
34536
35034
  return out;
34537
35035
  };
@@ -35022,6 +35520,6 @@ async function fetchTokenBalances(chainId, account, tokens, options = {}) {
35022
35520
  return parseTokenBalanceResult(rawResult, prepared.query);
35023
35521
  }
35024
35522
 
35025
- export { EMPTY_BALANCE, MORPHO_LENS, MaxParamThresholds, applyPositionDelta, attachPricesToFlashLiquidity, buildFluidFTokensCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, computeBorrowDelta2 as computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta2 as computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta2 as computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeWithdrawDelta2 as computeWithdrawDelta, computeZapTradeDeltas, convertLenderUserDataResult, createMarketUid, createMulticallRpcCall, createRawRpcCalls, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, encodeBalanceFetcherCalldata, fetchEulerSubAccountIndexes, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromSubgraph, fetchOraclePrices, fetchPendlePrices, fetchSiloVaults, fetchTokenBalances, fetchTokenMetadata, filterActiveLenders, filterLendersByProtocol, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getFluidFTokensConverter, getHealthFactor, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getMaxAmountClose, getMaxAmountCollateralSwap, getMaxAmountDebtSwap, getMaxAmountOpen, getMergedUserData, getMorphoTypeMarketConverter, getSubAccountAddress, getSubAccountIndex, getVaultPublicDataAll, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasMorphoVaultSubgraph, keysFromMaps, multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTokenBalanceResult, positivePart2 as positivePart, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, selectAssetGroupPrices, unflattenLenderData };
35523
+ export { EMPTY_BALANCE, MORPHO_LENS, MaxParamThresholds, applyPositionDelta, attachPricesToFlashLiquidity, buildFluidFTokensCall, buildLoopResult, buildMorphoTypeCall, buildMorphoTypeUserCallWithLens, buildPortfolioTotals, buildSumerAccumulators, buildSummaries, calculateLeverage, calculateNetApr, calculateOverallNetApr, calculateWeightedAverage, computeBorrowDelta2 as computeBorrowDelta, computeCloseTradeDeltas, computeCollateralSwapDeltas, computeDebtSwapDeltas, computeDepositDelta2 as computeDepositDelta, computeEModeAnalysis, computeOpenTradeDeltas, computePostTradeMetrics, computeRepayDelta2 as computeRepayDelta, computeSumerBorrowDelta, computeSumerDepositDelta, computeSumerRepayDelta, computeSumerWaterfall, computeSumerWithdrawDelta, computeWithdrawDelta2 as computeWithdrawDelta, computeZapTradeDeltas, convertLenderUserDataResult, createMarketUid, createMulticallRpcCall, createRawRpcCalls, decodeListaMarkets, decodeMarkets, decodePackedListaUserDataset, decodePackedMorphoUserDataset, encodeBalanceFetcherCalldata, fetchEulerEarnVaults, fetchEulerEarnVaultsFromSubgraph, fetchEulerSubAccountIndexes, fetchFlashLiquidityForChain, fetchFluidFTokens, fetchGeneralYields, fetchGeneralYieldsByMarketUid, fetchListaVaultsFromChain, fetchMorphoUserBalances, fetchMorphoUserPositionMarkets, fetchMorphoVaults, fetchMorphoVaultsFromApi, fetchMorphoVaultsFromChain, fetchMorphoVaultsFromSubgraph, fetchOraclePrices, fetchPendlePrices, fetchSiloVaults, fetchTokenBalances, fetchTokenMetadata, filterActiveLenders, filterLendersByProtocol, fuseLenderData, generateLendingPools, getAavesForChain, getAssetConfig, getBalanceForMarketUid, getBorrowCapacity, getFluidFTokensConverter, getHealthFactor, getLenderAssets, getLenderPublicData, getLenderPublicDataAll, getLenderPublicDataViaApi, getLenderUserDataMulti, getLenderUserDataResult, getLendersForChain, getMaxAmountClose, getMaxAmountCollateralSwap, getMaxAmountDebtSwap, getMaxAmountOpen, getMergedUserData, getMorphoTypeMarketConverter, getSubAccountAddress, getSubAccountIndex, getVaultPublicDataAll, hasEulerEarnVaultSubgraph, hasMorphoPositionIndex, hasMorphoUserApi, hasMorphoUserSubgraph, hasMorphoVaultSubgraph, keysFromMaps, multicall3Abi, nanTo, needsLenderApproval, needsTokenApproval, noOpResult, normalizeToBytes, parseBalanceFetcherResult, parseMergedResult, parseMulticallRpcResponses, parseRawRpcBatchResponses, parseRawRpcResponses, parseTokenBalanceResult, positivePart2 as positivePart, prepareLenderUserDataRpcCalls, prepareMergedMulticallParams, prepareMergedRpcCalls, prepareMulticallInputs, prepareTokenBalanceRpcCalls, selectAssetGroupPrices, unflattenLenderData };
35026
35524
  //# sourceMappingURL=index.js.map
35027
35525
  //# sourceMappingURL=index.js.map