@1delta/margin-fetcher 0.0.308 → 0.0.310

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -11275,6 +11275,7 @@ var MORPHO_LENS = {
11275
11275
  [Chain.CELO_MAINNET]: "0x4b5458BB47dCBC1a41B31b41e1a8773dE312BE9d",
11276
11276
  [Chain.PLUME_MAINNET]: "0x8E24CfC19c6C00c524353CB8816f5f1c2F33c201",
11277
11277
  [Chain.FLARE_MAINNET]: "0x8E24CfC19c6C00c524353CB8816f5f1c2F33c201",
11278
+ [Chain.PHAROS_MAINNET]: "0x8E24CfC19c6C00c524353CB8816f5f1c2F33c201",
11278
11279
  [Chain.STABLE_MAINNET]: "0x8E24CfC19c6C00c524353CB8816f5f1c2F33c201",
11279
11280
  [Chain.CORN]: "0x8E24CfC19c6C00c524353CB8816f5f1c2F33c201",
11280
11281
  [Chain.LISK]: "0x8E24CfC19c6C00c524353CB8816f5f1c2F33c201",
@@ -19580,7 +19581,7 @@ var getSiloV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
19580
19581
  { self: market.silo0, other: market.silo1 },
19581
19582
  { self: market.silo1, other: market.silo0 }
19582
19583
  ];
19583
- const toBigInt13 = (v) => {
19584
+ const toBigInt14 = (v) => {
19584
19585
  if (v === void 0 || v === null || v === "0x") return 0n;
19585
19586
  if (typeof v === "bigint") return v;
19586
19587
  try {
@@ -19592,8 +19593,8 @@ var getSiloV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
19592
19593
  for (let s = 0; s < 2; s++) {
19593
19594
  const { self, other } = sides[s];
19594
19595
  const slot = s * SILO_V2_CALLS_PER_SIDE;
19595
- const totalAssetsRaw = toBigInt13(data[slot]);
19596
- const debtAssetsRaw = toBigInt13(data[slot + 1]);
19596
+ const totalAssetsRaw = toBigInt14(data[slot]);
19597
+ const debtAssetsRaw = toBigInt14(data[slot + 1]);
19597
19598
  const irmConfigRaw = data[slot + 2];
19598
19599
  const decimals = self.decimals;
19599
19600
  const totalDeposits = Number(formatUnits(totalAssetsRaw, decimals));
@@ -19748,7 +19749,7 @@ var getSiloV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
19748
19749
  { self: market.silo0, other: market.silo1 },
19749
19750
  { self: market.silo1, other: market.silo0 }
19750
19751
  ];
19751
- const toBigInt13 = (v) => {
19752
+ const toBigInt14 = (v) => {
19752
19753
  if (v === void 0 || v === null || v === "0x") return 0n;
19753
19754
  if (typeof v === "bigint") return v;
19754
19755
  try {
@@ -19760,8 +19761,8 @@ var getSiloV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
19760
19761
  for (let s = 0; s < 2; s++) {
19761
19762
  const { self, other } = sides[s];
19762
19763
  const slot = s * SILO_V3_CALLS_PER_SIDE;
19763
- const totalAssetsRaw = toBigInt13(data[slot]);
19764
- const debtAssetsRaw = toBigInt13(data[slot + 1]);
19764
+ const totalAssetsRaw = toBigInt14(data[slot]);
19765
+ const debtAssetsRaw = toBigInt14(data[slot + 1]);
19765
19766
  const irmConfigRaw = data[slot + 2];
19766
19767
  const decimals = self.decimals;
19767
19768
  const totalDeposits = Number(formatUnits(totalAssetsRaw, decimals));
@@ -21534,6 +21535,8 @@ function lenderApiOnly(lender, chainId) {
21534
21535
  if (chainId === Chain.TAC_MAINNET) return false;
21535
21536
  if (chainId === Chain.FLARE_MAINNET) return false;
21536
21537
  if (chainId === Chain.PLUME_MAINNET) return false;
21538
+ if (chainId === Chain.KAIA_MAINNET) return false;
21539
+ if (chainId === Chain.PHAROS_MAINNET) return false;
21537
21540
  if (chainId === "4114") return false;
21538
21541
  return true;
21539
21542
  }
@@ -45561,6 +45564,267 @@ var fetchLagoonVaults = async (chainId, prices = {}, tokenList = {}) => {
45561
45564
  return out;
45562
45565
  };
45563
45566
 
45567
+ // src/vaults/aave-earn/abis/shared.ts
45568
+ var Erc20MetaAbi = [
45569
+ {
45570
+ name: "decimals",
45571
+ type: "function",
45572
+ stateMutability: "view",
45573
+ inputs: [],
45574
+ outputs: [{ type: "uint8" }]
45575
+ },
45576
+ {
45577
+ name: "totalSupply",
45578
+ type: "function",
45579
+ stateMutability: "view",
45580
+ inputs: [],
45581
+ outputs: [{ type: "uint256" }]
45582
+ }
45583
+ ];
45584
+ var Erc4626ConvertAbi = [
45585
+ {
45586
+ name: "convertToAssets",
45587
+ type: "function",
45588
+ stateMutability: "view",
45589
+ inputs: [{ type: "uint256", name: "shares" }],
45590
+ outputs: [{ type: "uint256", name: "assets" }]
45591
+ }
45592
+ ];
45593
+
45594
+ // src/vaults/aave-earn/api.ts
45595
+ var AAVE_EARN_API_URL = "https://api.v3.aave.com/graphql";
45596
+ var PAGE_SIZE3 = "FIFTY";
45597
+ var VAULT_FIELDS = `
45598
+ address
45599
+ shareName
45600
+ shareSymbol
45601
+ owner
45602
+ chainId
45603
+ vaultApr { value formatted }
45604
+ fee { value formatted }
45605
+ balance { amount { raw decimals value } usd usdPerToken }
45606
+ usedReserve {
45607
+ underlyingToken { address symbol name decimals imageUrl }
45608
+ }`;
45609
+ var OWNED_VAULTS_QUERY = `
45610
+ query AaveEarnOwnedVaults($request: VaultsRequest!) {
45611
+ vaults(request: $request) {
45612
+ items {${VAULT_FIELDS}
45613
+ }
45614
+ pageInfo { next }
45615
+ }
45616
+ }`;
45617
+ var SINGLE_VAULT_QUERY = `
45618
+ query AaveEarnVault($request: VaultRequest!) {
45619
+ vault(request: $request) {${VAULT_FIELDS}
45620
+ }
45621
+ }`;
45622
+ async function postGraphql(query3, variables) {
45623
+ const response = await fetch(AAVE_EARN_API_URL, {
45624
+ method: "POST",
45625
+ headers: { "Content-Type": "application/json" },
45626
+ body: JSON.stringify({ query: query3, variables })
45627
+ });
45628
+ if (!response.ok) {
45629
+ throw new Error(
45630
+ `Aave Earn vaults API failed: ${response.status} - ${response.statusText}`
45631
+ );
45632
+ }
45633
+ const json = await response.json();
45634
+ if (json?.errors?.length) {
45635
+ throw new Error(
45636
+ `Aave Earn vaults API error: ${json.errors[0]?.message ?? "unknown"}`
45637
+ );
45638
+ }
45639
+ return json?.data;
45640
+ }
45641
+ async function fetchAaveEarnApiVaults(chainId, targets) {
45642
+ const target = Number(chainId);
45643
+ const byAddress = /* @__PURE__ */ new Map();
45644
+ const keep = (it) => {
45645
+ const addr = it?.address?.toLowerCase();
45646
+ if (!addr || Number(it.chainId) !== target) return;
45647
+ if (!byAddress.has(addr)) byAddress.set(addr, it);
45648
+ };
45649
+ for (const owner of targets.owners) {
45650
+ let cursor = null;
45651
+ for (let page = 0; page < 20; page++) {
45652
+ const request = {
45653
+ criteria: { ownedBy: [owner] },
45654
+ pageSize: PAGE_SIZE3
45655
+ };
45656
+ if (cursor) request.cursor = cursor;
45657
+ const data = await postGraphql(OWNED_VAULTS_QUERY, { request });
45658
+ for (const it of data?.vaults?.items ?? []) keep(it);
45659
+ cursor = data?.vaults?.pageInfo?.next ?? null;
45660
+ if (!cursor) break;
45661
+ }
45662
+ }
45663
+ for (const address of targets.vaults) {
45664
+ const data = await postGraphql(SINGLE_VAULT_QUERY, {
45665
+ request: { by: { address }, chainId: target }
45666
+ });
45667
+ keep(data?.vault);
45668
+ }
45669
+ return [...byAddress.values()];
45670
+ }
45671
+
45672
+ // src/vaults/aave-earn/registry.ts
45673
+ var EMPTY = { curators: [], vaults: [] };
45674
+ var AAVE_EARN_REGISTRY = {
45675
+ // Ethereum. Owners run vaults across multiple chains (CREATE3 factory
45676
+ // `0xa35995bb2fFC5F2b33379C2e95d00C20FbF71E70`), so the same owner is
45677
+ // listed on every chain it deploys to; the fetcher filters `ownedBy`
45678
+ // results down to the queried chain.
45679
+ "1": {
45680
+ curators: [
45681
+ // avWETH / avUSDC and 6 more across chains 1/56/42161.
45682
+ { owner: "0xfe9BCB07604842cC2F8780B75586F4EF18811668" },
45683
+ // avUSDC (Aave USDC Vault Shares).
45684
+ { owner: "0x4a7cCbB601d08B0450663b27408e6351727175A4" },
45685
+ // Limassol Vault (EURC).
45686
+ { owner: "0x888aD9A82a80f0865D872c210191B623edFc5649" }
45687
+ ],
45688
+ vaults: []
45689
+ },
45690
+ // BSC
45691
+ "56": {
45692
+ curators: [{ owner: "0xfe9BCB07604842cC2F8780B75586F4EF18811668" }],
45693
+ vaults: []
45694
+ },
45695
+ // Arbitrum
45696
+ "42161": {
45697
+ curators: [{ owner: "0xfe9BCB07604842cC2F8780B75586F4EF18811668" }],
45698
+ vaults: []
45699
+ }
45700
+ };
45701
+ var getAaveEarnRegistry = (chainId) => AAVE_EARN_REGISTRY[String(chainId)] ?? EMPTY;
45702
+ var hasAaveEarnVaults = (chainId) => {
45703
+ const reg = getAaveEarnRegistry(chainId);
45704
+ return reg.curators.length > 0 || reg.vaults.length > 0;
45705
+ };
45706
+ var resolveAaveEarnCuratorName = (chainId, owner) => {
45707
+ if (!owner) return void 0;
45708
+ const target = owner.toLowerCase();
45709
+ return getAaveEarnRegistry(chainId).curators.find(
45710
+ (c) => c.owner.toLowerCase() === target
45711
+ )?.name;
45712
+ };
45713
+
45714
+ // src/vaults/aave-earn/fetchPublic.ts
45715
+ var BRAND2 = "Aave";
45716
+ var toBigInt13 = (v) => {
45717
+ if (v === void 0 || v === null) return void 0;
45718
+ if (typeof v === "bigint") return v;
45719
+ if (typeof v === "number") return BigInt(v);
45720
+ if (typeof v === "string") {
45721
+ if (v === "" || v === "0x" || v === "0X") return void 0;
45722
+ try {
45723
+ return BigInt(v);
45724
+ } catch {
45725
+ return void 0;
45726
+ }
45727
+ }
45728
+ return void 0;
45729
+ };
45730
+ var num2 = (v) => {
45731
+ const n = Number(v);
45732
+ return Number.isFinite(n) ? n : 0;
45733
+ };
45734
+ var fetchAaveEarnVaults = async (chainId, multicallRetry, prices = {}, tokenList = {}) => {
45735
+ if (!hasAaveEarnVaults(chainId)) return {};
45736
+ const reg = getAaveEarnRegistry(chainId);
45737
+ const items = await fetchAaveEarnApiVaults(chainId, {
45738
+ owners: reg.curators.map((c) => c.owner),
45739
+ vaults: reg.vaults
45740
+ });
45741
+ const usable = items.filter(
45742
+ (v) => !!v?.address && !!v?.usedReserve?.underlyingToken?.address && v.usedReserve.underlyingToken.decimals != null
45743
+ );
45744
+ if (usable.length === 0) return {};
45745
+ const calls = usable.flatMap((v) => {
45746
+ const underlyingDec = v.usedReserve.underlyingToken.decimals;
45747
+ const shareUnit = 10n ** BigInt(underlyingDec);
45748
+ return [
45749
+ { address: v.address, name: "decimals", params: [] },
45750
+ { address: v.address, name: "totalSupply", params: [] },
45751
+ { address: v.address, name: "convertToAssets", params: [shareUnit] }
45752
+ ];
45753
+ });
45754
+ const abis = usable.flatMap(() => [
45755
+ Erc20MetaAbi,
45756
+ Erc20MetaAbi,
45757
+ Erc4626ConvertAbi
45758
+ ]);
45759
+ const rawResults = calls.length > 0 ? await multicallRetry({
45760
+ chain: chainId,
45761
+ calls,
45762
+ abi: abis
45763
+ }) : [];
45764
+ const out = {};
45765
+ for (let i = 0; i < usable.length; i++) {
45766
+ const v = usable[i];
45767
+ const slice = rawResults.slice(i * 3, i * 3 + 3);
45768
+ const addressLc = v.address.toLowerCase();
45769
+ const token = v.usedReserve.underlyingToken;
45770
+ const underlyingLc = token.address.toLowerCase();
45771
+ const assetDecimals = token.decimals;
45772
+ const shareDecOnChain = toBigInt13(slice[0]);
45773
+ const decimals = shareDecOnChain !== void 0 ? Number(shareDecOnChain) : assetDecimals;
45774
+ const totalSupply = toBigInt13(slice[1]);
45775
+ if (totalSupply === void 0) continue;
45776
+ const shareUnit = 10n ** BigInt(decimals);
45777
+ const underlyingUnit = 10n ** BigInt(assetDecimals);
45778
+ const convertToAssets = toBigInt13(slice[2]) ?? 0n;
45779
+ const convertToShares = convertToAssets > 0n ? shareUnit * underlyingUnit / convertToAssets : 0n;
45780
+ const totalAssetsRaw = v.balance?.amount?.raw ?? "0";
45781
+ const totalAssets = toBigInt13(totalAssetsRaw) ?? 0n;
45782
+ const totalAssetsFormatted = Number(totalAssets) / 10 ** assetDecimals;
45783
+ const asset = tokenList[underlyingLc];
45784
+ const priceUsd = prices[underlyingLc] ?? (v.balance?.usdPerToken != null ? num2(v.balance.usdPerToken) : void 0);
45785
+ const totalAssetsUsd = v.balance?.usd != null ? num2(v.balance.usd) : priceUsd !== void 0 ? totalAssetsFormatted * priceUsd : 0;
45786
+ const supplyRate = num2(v.vaultApr?.formatted);
45787
+ const rewardsRate = 0;
45788
+ const depositRate = supplyRate + rewardsRate;
45789
+ const fee = num2(v.fee?.value);
45790
+ const symbol = (v.shareSymbol ?? "").trim();
45791
+ const name = (v.shareName ?? "").trim() || symbol;
45792
+ const curatorName = resolveAaveEarnCuratorName(chainId, v.owner);
45793
+ const displayName = composeVaultDisplayName(
45794
+ BRAND2,
45795
+ curatorName,
45796
+ asset ?? (token.symbol ? {
45797
+ symbol: token.symbol} : void 0),
45798
+ name
45799
+ );
45800
+ out[addressLc] = {
45801
+ address: addressLc,
45802
+ underlying: underlyingLc,
45803
+ symbol,
45804
+ name,
45805
+ displayName,
45806
+ ...curatorName ? { curatorName } : {},
45807
+ owner: (v.owner ?? "").toLowerCase(),
45808
+ decimals,
45809
+ assetDecimals,
45810
+ totalAssets: totalAssets.toString(),
45811
+ totalSupply: totalSupply.toString(),
45812
+ convertToAssets: convertToAssets.toString(),
45813
+ convertToShares: convertToShares.toString(),
45814
+ supplyRate,
45815
+ rewardsRate,
45816
+ depositRate,
45817
+ fee,
45818
+ isErc4626: true,
45819
+ asset,
45820
+ priceUsd,
45821
+ totalAssetsFormatted,
45822
+ totalAssetsUsd
45823
+ };
45824
+ }
45825
+ return out;
45826
+ };
45827
+
45564
45828
  // src/vaults/upshift/api.ts
45565
45829
  var UPSHIFT_VAULTS_URL2 = "https://app.upshift.finance/api/proxy/vaults";
45566
45830
  var UPSHIFT_CHAIN_IDS = /* @__PURE__ */ new Set([
@@ -45598,7 +45862,7 @@ async function fetchUpshiftApiVaults() {
45598
45862
  }
45599
45863
 
45600
45864
  // src/vaults/upshift/fetchPublic.ts
45601
- var num2 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
45865
+ var num3 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
45602
45866
  var isEvmAddress = (a) => /^0x[0-9a-fA-F]{40}$/.test(a);
45603
45867
  var derivePricePerShare = (totalAssetsRaw, totalSupplyRaw, shareDecimals) => {
45604
45868
  try {
@@ -45625,12 +45889,12 @@ function parseVault8(v, chainId, prices, tokenList) {
45625
45889
  const totalAssetsFormatted = Number(
45626
45890
  parseRawAmount(totalAssetsRaw, assetDecimals)
45627
45891
  );
45628
- const base = num2(v.apy?.apy) ?? 0;
45629
- const campaign = num2(v.apy?.campaignApy);
45892
+ const base = num3(v.apy?.apy) ?? 0;
45893
+ const campaign = num3(v.apy?.campaignApy);
45630
45894
  const supplyRate = apyToAprPercent(base);
45631
45895
  const rewardsRate = campaign != null ? apyToAprPercent(campaign) : 0;
45632
45896
  const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(assetAddr, chainId);
45633
- const apiTvlUsd = num2(v.latest_reported_tvl) ?? 0;
45897
+ const apiTvlUsd = num3(v.latest_reported_tvl) ?? 0;
45634
45898
  const impliedPriceUsd = totalAssetsFormatted > 0 ? apiTvlUsd / totalAssetsFormatted : 0;
45635
45899
  const priceUsd = prices[oracleKey] ?? prices[assetAddr] ?? impliedPriceUsd;
45636
45900
  const totalAssetsUsd = apiTvlUsd || totalAssetsFormatted * priceUsd;
@@ -45655,10 +45919,10 @@ function parseVault8(v, chainId, prices, tokenList) {
45655
45919
  rewardsRate,
45656
45920
  depositRate: supplyRate + rewardsRate,
45657
45921
  apy: {
45658
- base: num2(v.apy?.apy),
45922
+ base: num3(v.apy?.apy),
45659
45923
  campaign,
45660
- points: num2(v.apy?.pointsApy),
45661
- underlying: num2(v.apy?.underlyingApy)
45924
+ points: num3(v.apy?.pointsApy),
45925
+ underlying: num3(v.apy?.underlyingApy)
45662
45926
  },
45663
45927
  isDepositPaused: v.isDepositPaused ?? false,
45664
45928
  isWithdrawalPaused: v.isWithdrawalPaused ?? false,
@@ -45702,11 +45966,11 @@ var YEARN_CHAIN_IDS = /* @__PURE__ */ new Set([
45702
45966
  ]);
45703
45967
  var hasYearnVaults = (chainId) => YEARN_CHAIN_IDS.has(String(chainId));
45704
45968
  var isYearnV3 = (v) => typeof v?.version === "string" && v.version.startsWith("3.");
45705
- var PAGE_SIZE3 = 500;
45969
+ var PAGE_SIZE4 = 500;
45706
45970
  async function fetchYearnApiVaults(chainId) {
45707
45971
  const out = [];
45708
45972
  for (let page = 1; page <= 20; page++) {
45709
- const url = `${YEARN_YDAEMON_BASE}/${chainId}/vaults/all?limit=${PAGE_SIZE3}&page=${page}`;
45973
+ const url = `${YEARN_YDAEMON_BASE}/${chainId}/vaults/all?limit=${PAGE_SIZE4}&page=${page}`;
45710
45974
  const response = await fetch(url);
45711
45975
  if (!response.ok) {
45712
45976
  throw new Error(
@@ -45718,13 +45982,13 @@ async function fetchYearnApiVaults(chainId) {
45718
45982
  for (const v of items) {
45719
45983
  if (isYearnV3(v) && v.endorsed) out.push(v);
45720
45984
  }
45721
- if (items.length < PAGE_SIZE3) break;
45985
+ if (items.length < PAGE_SIZE4) break;
45722
45986
  }
45723
45987
  return out;
45724
45988
  }
45725
45989
 
45726
45990
  // src/vaults/yearn/fetchPublic.ts
45727
- var BRAND2 = "Yearn";
45991
+ var BRAND3 = "Yearn";
45728
45992
  var ZERO_ADDR = "0x0000000000000000000000000000000000000000";
45729
45993
  var YearnLiquidityAbi = [
45730
45994
  {
@@ -45767,9 +46031,9 @@ var asBig = (v) => {
45767
46031
  return null;
45768
46032
  }
45769
46033
  };
45770
- var num3 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
46034
+ var num4 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
45771
46035
  var toPct = (v) => {
45772
- const n = num3(v);
46036
+ const n = num4(v);
45773
46037
  return n == null ? 0 : n * 100;
45774
46038
  };
45775
46039
  var deriveTotalSupply = (totalAssetsRaw, pricePerShareRaw, decimals) => {
@@ -45801,27 +46065,27 @@ function parseVault9(v, chainId, prices, tokenList) {
45801
46065
  const totalAssetsFormatted = Number(
45802
46066
  parseRawAmount(totalAssetsRaw, assetDecimals)
45803
46067
  );
45804
- const realized = num3(v.apr?.netAPR);
45805
- const forward = num3(v.apr?.forwardAPR?.netAPR);
46068
+ const realized = num4(v.apr?.netAPR);
46069
+ const forward = num4(v.apr?.forwardAPR?.netAPR);
45806
46070
  const isForwardApr = realized == null && forward != null;
45807
46071
  const supplyRate = toPct(realized ?? forward);
45808
46072
  const rewardsRate = toPct(v.apr?.extra?.stakingRewardsAPR);
45809
46073
  const fee = toPct(v.apr?.fees?.performance);
45810
46074
  const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(assetAddr, chainId);
45811
- const apiPrice = num3(v.tvl?.price) ?? 0;
46075
+ const apiPrice = num4(v.tvl?.price) ?? 0;
45812
46076
  const priceUsd = prices[oracleKey] ?? prices[assetAddr] ?? apiPrice;
45813
- const apiTvlUsd = num3(v.tvl?.tvl) ?? 0;
46077
+ const apiTvlUsd = num4(v.tvl?.tvl) ?? 0;
45814
46078
  const totalAssetsUsd = apiTvlUsd || totalAssetsFormatted * priceUsd;
45815
46079
  const name = (v.name ?? "").trim();
45816
46080
  const symbol = (v.symbol ?? "").trim();
45817
- const displayName = composeVaultDisplayName(BRAND2, BRAND2, assetMeta, name);
46081
+ const displayName = composeVaultDisplayName(BRAND3, BRAND3, assetMeta, name);
45818
46082
  return {
45819
46083
  address,
45820
46084
  underlying: assetAddr,
45821
46085
  symbol,
45822
46086
  name: name || symbol,
45823
46087
  displayName,
45824
- curatorName: BRAND2,
46088
+ curatorName: BRAND3,
45825
46089
  decimals,
45826
46090
  assetDecimals,
45827
46091
  totalAssets: totalAssetsRaw,
@@ -46089,7 +46353,10 @@ var SYNC_REDEMPTION_PROVIDERS = /* @__PURE__ */ new Set([
46089
46353
  "fluid",
46090
46354
  "gearbox",
46091
46355
  "silo",
46092
- "yearn"
46356
+ "yearn",
46357
+ // Aave Earn vaults are standard synchronous ERC-4626 wrappers over an
46358
+ // Aave v3 supply position — withdraw up to available reserve liquidity.
46359
+ "aave-earn"
46093
46360
  ]);
46094
46361
  var ASYNC_REDEMPTION_PROVIDERS = /* @__PURE__ */ new Set(["lagoon", "upshift"]);
46095
46362
  var classifyRedemption = (provider, v) => {
@@ -46242,6 +46509,7 @@ var stampVaultClassification = (data, chainId, tokenList = {}) => {
46242
46509
  stampBag(data.lst, "lst");
46243
46510
  stampBag(data.savings, "savings");
46244
46511
  stampBag(data.lagoon, "lagoon");
46512
+ stampBag(data["aave-earn"], "aave-earn");
46245
46513
  stampBag(data.upshift, "upshift");
46246
46514
  stampBag(data.yearn, "yearn");
46247
46515
  stampBag(data.hypercore, "hypercore", false);
@@ -47063,7 +47331,7 @@ var fetchGmxExecutionFees = async (chainId, multicallRetry, gasPriceWei) => {
47063
47331
  // src/vaults/gmx/fetchPublic.ts
47064
47332
  var GMX_TOKEN_DECIMALS = 18;
47065
47333
  var DEFAULT_PERIOD = "90d";
47066
- var num4 = (n) => typeof n === "number" && Number.isFinite(n) ? n : 0;
47334
+ var num5 = (n) => typeof n === "number" && Number.isFinite(n) ? n : 0;
47067
47335
  var minDefined = (a, b) => a == null ? b : b == null ? a : Math.min(a, b);
47068
47336
  var glvMarketRoomUsd = (cap, priceUsd) => {
47069
47337
  const currentUsd = Number(cap.balanceAmount) / 1e18 * priceUsd;
@@ -47097,9 +47365,9 @@ var fetchGmxVaults = async (chainId, multicallRetry, options) => {
47097
47365
  indexToken: indexToken ? indexToken.toLowerCase() : void 0,
47098
47366
  longSymbol,
47099
47367
  shortSymbol,
47100
- apy: num4(entry?.apy),
47101
- baseApy: num4(entry?.baseApy),
47102
- bonusApr: num4(entry?.bonusApr),
47368
+ apy: num5(entry?.apy),
47369
+ baseApy: num5(entry?.baseApy),
47370
+ bonusApr: num5(entry?.bonusApr),
47103
47371
  yieldProfile: "volatile",
47104
47372
  denomination: denominationFor(longSymbol, shortSymbol)
47105
47373
  };
@@ -47523,6 +47791,7 @@ function buildVaultLookup(data) {
47523
47791
  addEntries(data.lst, "lst");
47524
47792
  addEntries(data.savings, "savings");
47525
47793
  addEntries(data.lagoon, "lagoon");
47794
+ addEntries(data["aave-earn"], "aave-earn");
47526
47795
  addEntries(data.upshift, "upshift");
47527
47796
  addEntries(data.yearn, "yearn");
47528
47797
  return map;
@@ -47646,6 +47915,18 @@ var getVaultPublicDataAll = async (chainId, providers, multicallRetry, prices =
47646
47915
  })
47647
47916
  );
47648
47917
  }
47918
+ if (requested.has("aave-earn")) {
47919
+ tasks.push(
47920
+ fetchAaveEarnVaults(chainId, multicallRetry, prices, tokenList).then((res) => {
47921
+ out["aave-earn"] = res;
47922
+ }).catch((e) => {
47923
+ warn4(
47924
+ `[vaults] aave-earn fetch failed for chain ${chainId}:`,
47925
+ e?.message ?? e
47926
+ );
47927
+ })
47928
+ );
47929
+ }
47649
47930
  if (requested.has("upshift")) {
47650
47931
  tasks.push(
47651
47932
  fetchUpshiftVaults(chainId, prices, tokenList).then((res) => {