@1delta/margin-fetcher 0.0.216 → 0.0.218

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
@@ -6275,6 +6275,7 @@ globalThis[GLOBAL_LENDER_DATA_KEY] = {
6275
6275
  compoundV3Bulker: {},
6276
6276
  eulerConfigs: {},
6277
6277
  eulerVaults: {},
6278
+ aaveV4Hubs: {},
6278
6279
  aaveV4Spokes: {},
6279
6280
  aaveV4Reserves: {},
6280
6281
  aaveV4Oracles: {}
@@ -6302,6 +6303,7 @@ var initConfig = () => getGlobalData2()?.initConfig;
6302
6303
  var aaveOraclesConfig = () => getGlobalData2()?.aaveOraclesConfig;
6303
6304
  var eulerConfigs = () => getGlobalData2()?.eulerConfigs;
6304
6305
  var eulerVaults = () => getGlobalData2()?.eulerVaults;
6306
+ var aaveV4Hubs = () => getGlobalData2()?.aaveV4Hubs;
6305
6307
  var aaveV4Spokes = () => getGlobalData2()?.aaveV4Spokes;
6306
6308
  var aaveV4Reserves = () => getGlobalData2()?.aaveV4Reserves;
6307
6309
  var aaveV4Oracles = () => getGlobalData2()?.aaveV4Oracles;
@@ -8469,18 +8471,18 @@ var populateEModes32 = (borrowCollateralFactor, collateralFactor, collateralBitm
8469
8471
  data[e].borrowCollateralFactor = borrowCollateralFactor;
8470
8472
  data[e].debtDisabled = !!eModeConfigs[e];
8471
8473
  if (eModeConfigs[e]) {
8472
- data[e] = {
8473
- ...data[e],
8474
- category: e,
8475
- borrowCollateralFactor: eModeConfigs[e]?.borrowCollateralFactor ?? 0,
8476
- collateralFactor: eModeConfigs[e]?.collateralFactor ?? 0,
8477
- borrowFactor: 1,
8478
- collateralDisabled: !isReserveEnabledOnBitmap(
8479
- collateralBitmap[e],
8480
- assetIndex
8481
- ),
8482
- debtDisabled: !isReserveEnabledOnBitmap(debtBitmap[e], assetIndex)
8483
- };
8474
+ data[e].category = e;
8475
+ data[e].borrowCollateralFactor = eModeConfigs[e]?.borrowCollateralFactor ?? 0;
8476
+ data[e].collateralFactor = eModeConfigs[e]?.collateralFactor ?? 0;
8477
+ data[e].borrowFactor = 1;
8478
+ data[e].collateralDisabled = !isReserveEnabledOnBitmap(
8479
+ collateralBitmap[e],
8480
+ assetIndex
8481
+ );
8482
+ data[e].debtDisabled = !isReserveEnabledOnBitmap(
8483
+ debtBitmap[e],
8484
+ assetIndex
8485
+ );
8484
8486
  }
8485
8487
  }
8486
8488
  }
@@ -8775,65 +8777,61 @@ var getInitReservesDataConverter = (lender, chainId, prices, additionalYields, t
8775
8777
  return void 0;
8776
8778
  }
8777
8779
  const modeOne = 0;
8778
- let result = Object.assign(
8779
- {},
8780
- ...data[modeOne]?.map((dat) => {
8781
- const asset = dat?.underlying.toLowerCase();
8782
- const meta = tokenList[asset];
8783
- const totalDeposits = parseRawAmount(
8784
- dat?.totalSupply.toString(),
8785
- meta?.decimals
8786
- );
8787
- const totalDebt = parseRawAmount(
8788
- dat?.totalDebt.toString(),
8780
+ const result = {};
8781
+ data[modeOne]?.forEach((dat) => {
8782
+ const asset = dat?.underlying.toLowerCase();
8783
+ const meta = tokenList[asset];
8784
+ const totalDeposits = parseRawAmount(
8785
+ dat?.totalSupply.toString(),
8786
+ meta?.decimals
8787
+ );
8788
+ const totalDebt = parseRawAmount(
8789
+ dat?.totalDebt.toString(),
8790
+ meta.decimals
8791
+ );
8792
+ const oracleKey = toOracleKey(meta?.assetGroup) ?? toGenericPriceKey(asset, chainId);
8793
+ const price = prices[oracleKey];
8794
+ const liquidity = Number(totalDeposits) - Number(totalDebt);
8795
+ const poolId = underlyingToPoolMap.get(asset);
8796
+ const params = !!poolId ? { metadata: { poolId } } : void 0;
8797
+ if (!poolId) return;
8798
+ const marketUid = createMarketUid(chainId, lender, poolId);
8799
+ const name = INIT_POOL_NAME_OVERRIDES[poolId.toLowerCase()] ?? lenderShortName(lender) + " " + (meta?.symbol ?? "");
8800
+ result[asset] = {
8801
+ marketUid,
8802
+ name,
8803
+ poolId: asset,
8804
+ underlying: asset,
8805
+ asset: meta,
8806
+ borrowCap: parseRawAmount(
8807
+ dat?.borrowCap.toString(),
8789
8808
  meta.decimals
8790
- );
8791
- const oracleKey = toOracleKey(meta?.assetGroup) ?? toGenericPriceKey(asset, chainId);
8792
- const price = prices[oracleKey];
8793
- const liquidity = Number(totalDeposits) - Number(totalDebt);
8794
- const poolId = underlyingToPoolMap.get(asset);
8795
- const params = !!poolId ? { metadata: { poolId } } : void 0;
8796
- if (!poolId) return;
8797
- const marketUid = createMarketUid(chainId, lender, poolId);
8798
- const name = INIT_POOL_NAME_OVERRIDES[poolId.toLowerCase()] ?? lenderShortName(lender) + " " + (meta?.symbol ?? "");
8799
- return {
8800
- [asset]: {
8801
- marketUid,
8802
- name,
8803
- poolId: asset,
8804
- underlying: asset,
8805
- asset: meta,
8806
- borrowCap: parseRawAmount(
8807
- dat?.borrowCap.toString(),
8808
- meta.decimals
8809
- ),
8810
- canBurn: Boolean(dat?.canBurn),
8811
- canFlash: Boolean(dat?.canFlash),
8812
- canMint: Boolean(dat?.canMint),
8813
- canRepay: Boolean(dat?.canRepay),
8814
- totalDeposits,
8815
- totalDebt,
8816
- totalDepositsUSD: price * Number(totalDeposits),
8817
- totalDebtUSD: price * Number(totalDebt),
8818
- totalLiquidity: liquidity,
8819
- totalLiquidityUSD: liquidity * price,
8820
- depositRate: convertRateToApr(
8821
- Number(parseRawAmount(dat?.supplyRate.toString(), 18))
8822
- ),
8823
- variableBorrowRate: convertRateToApr(
8824
- Number(parseRawAmount(dat?.borrowRate.toString(), 18))
8825
- ),
8826
- stableBorrowRate: 0,
8827
- collateralActive: true,
8828
- intrinsicYield: additionalYields?.intrinsicYields?.[oracleKey] ?? 0,
8829
- rewards: [],
8830
- config: {},
8831
- borrowingEnabled: totalDebt !== "0",
8832
- params
8833
- }
8834
- };
8835
- })
8836
- );
8809
+ ),
8810
+ canBurn: Boolean(dat?.canBurn),
8811
+ canFlash: Boolean(dat?.canFlash),
8812
+ canMint: Boolean(dat?.canMint),
8813
+ canRepay: Boolean(dat?.canRepay),
8814
+ totalDeposits,
8815
+ totalDebt,
8816
+ totalDepositsUSD: price * Number(totalDeposits),
8817
+ totalDebtUSD: price * Number(totalDebt),
8818
+ totalLiquidity: liquidity,
8819
+ totalLiquidityUSD: liquidity * price,
8820
+ depositRate: convertRateToApr(
8821
+ Number(parseRawAmount(dat?.supplyRate.toString(), 18))
8822
+ ),
8823
+ variableBorrowRate: convertRateToApr(
8824
+ Number(parseRawAmount(dat?.borrowRate.toString(), 18))
8825
+ ),
8826
+ stableBorrowRate: 0,
8827
+ collateralActive: true,
8828
+ intrinsicYield: additionalYields?.intrinsicYields?.[oracleKey] ?? 0,
8829
+ rewards: [],
8830
+ config: {},
8831
+ borrowingEnabled: totalDebt !== "0",
8832
+ params
8833
+ };
8834
+ });
8837
8835
  let eModes = {};
8838
8836
  INIT_MODES.forEach((mode, index) => {
8839
8837
  data[index]?.forEach((multicallData) => {
@@ -8857,11 +8855,12 @@ var getInitReservesDataConverter = (lender, chainId, prices, additionalYields, t
8857
8855
  result[asset].config[mode] = modeData;
8858
8856
  });
8859
8857
  });
8860
- Object.entries(eModes).forEach(([modeId, data2]) => {
8861
- Object.entries(result)?.forEach(([key, _3]) => {
8858
+ Object.entries(eModes).forEach(([modeId, modeData]) => {
8859
+ Object.entries(result).forEach(([key, _3]) => {
8862
8860
  if (!result[key].config[modeId]) {
8863
- let mode = {
8864
- ...data2,
8861
+ result[key].config[modeId] = {
8862
+ label: modeData.label,
8863
+ category: modeData.category,
8865
8864
  debtDisabled: true,
8866
8865
  collateralDisabled: true,
8867
8866
  collateralFactor: 0,
@@ -8869,7 +8868,6 @@ var getInitReservesDataConverter = (lender, chainId, prices, additionalYields, t
8869
8868
  borrowFactor: 3402823669209385e5
8870
8869
  // disabled flag
8871
8870
  };
8872
- result[key].config[modeId] = mode;
8873
8871
  }
8874
8872
  });
8875
8873
  });
@@ -12104,7 +12102,9 @@ function convertMarketsToMorphoResponse(response, chainId, additionalYields = {
12104
12102
  loaded: true
12105
12103
  }, tokens = {}) {
12106
12104
  const data = {};
12107
- response.markets.items.forEach((market) => {
12105
+ const items = response?.markets?.items;
12106
+ if (!items) return data;
12107
+ items.forEach((market) => {
12108
12108
  const {
12109
12109
  uniqueKey,
12110
12110
  lltv,
@@ -17895,6 +17895,7 @@ var getEulerV2ReservesDataConverter = (lender, chainId, prices, additionalYields
17895
17895
  // src/lending/public-data/aave-v4-type/publicCallBuild.ts
17896
17896
  var BASE_CALLS_PER_RESERVE = 5;
17897
17897
  var CALLS_PER_SPOKE_TAIL = 2;
17898
+ var MAX_HUB_ASSETS = 25;
17898
17899
  function isValidAddress(addr) {
17899
17900
  return !!addr && addr !== "0x" && addr.length > 2;
17900
17901
  }
@@ -17910,8 +17911,6 @@ var buildAaveV4LenderReserveCall = (chainId, lender) => {
17910
17911
  const reservesMap = aaveV4Reserves()?.[lender]?.[chainId] ?? {};
17911
17912
  if (spokes.length === 0) return [];
17912
17913
  const calls = [];
17913
- const hubAssetKeys = /* @__PURE__ */ new Set();
17914
- const hubAssetList = [];
17915
17914
  for (const spokeEntry of spokes) {
17916
17915
  if (!isValidAddress(spokeEntry.spoke)) continue;
17917
17916
  const spokeAddr = spokeEntry.spoke;
@@ -17953,17 +17952,6 @@ var buildAaveV4LenderReserveCall = (chainId, lender) => {
17953
17952
  params: [rid, key]
17954
17953
  });
17955
17954
  }
17956
- if (typeof entry === "object" && spokeEntry.hub && entry.assetId !== void 0) {
17957
- const hubLc = spokeEntry.hub.toLowerCase();
17958
- const key = `${hubLc}:${entry.assetId}`;
17959
- if (!hubAssetKeys.has(key)) {
17960
- hubAssetKeys.add(key);
17961
- hubAssetList.push({
17962
- hub: hubLc,
17963
- assetId: entry.assetId
17964
- });
17965
- }
17966
- }
17967
17955
  }
17968
17956
  calls.push(
17969
17957
  {
@@ -17980,10 +17968,7 @@ var buildAaveV4LenderReserveCall = (chainId, lender) => {
17980
17968
  }
17981
17969
  for (const spokeEntry of spokes) {
17982
17970
  if (!isValidAddress(spokeEntry.spoke)) continue;
17983
- const reserves = getSpokeReserves(
17984
- reservesMap,
17985
- spokeEntry.spoke
17986
- );
17971
+ const reserves = getSpokeReserves(reservesMap, spokeEntry.spoke);
17987
17972
  const rids = reserves.map(
17988
17973
  (e) => typeof e === "number" ? e : e.reserveId
17989
17974
  );
@@ -17995,24 +17980,33 @@ var buildAaveV4LenderReserveCall = (chainId, lender) => {
17995
17980
  });
17996
17981
  }
17997
17982
  }
17998
- for (const { hub, assetId } of hubAssetList) {
17999
- calls.push(
18000
- {
18001
- address: hub,
18002
- name: "getAsset",
18003
- params: [assetId]
18004
- },
18005
- {
18006
- address: hub,
18007
- name: "getAddedAssets",
18008
- params: [assetId]
18009
- },
18010
- {
18011
- address: hub,
18012
- name: "getAssetTotalOwed",
18013
- params: [assetId]
18014
- }
18015
- );
17983
+ const hubEntry = aaveV4Hubs()?.[lender]?.[chainId];
17984
+ if (hubEntry?.hub && isValidAddress(hubEntry.hub)) {
17985
+ const hubAddr = hubEntry.hub.toLowerCase();
17986
+ calls.push({
17987
+ address: hubAddr,
17988
+ name: "getAssetCount",
17989
+ params: []
17990
+ });
17991
+ for (let i = 0; i < MAX_HUB_ASSETS; i++) {
17992
+ calls.push(
17993
+ {
17994
+ address: hubAddr,
17995
+ name: "getAsset",
17996
+ params: [i]
17997
+ },
17998
+ {
17999
+ address: hubAddr,
18000
+ name: "getAddedAssets",
18001
+ params: [i]
18002
+ },
18003
+ {
18004
+ address: hubAddr,
18005
+ name: "getAssetTotalOwed",
18006
+ params: [i]
18007
+ }
18008
+ );
18009
+ }
18016
18010
  }
18017
18011
  return calls;
18018
18012
  };
@@ -18020,13 +18014,9 @@ var getAaveV4ExpectedCallCount = (chainId, lender) => {
18020
18014
  const spokes = aaveV4Spokes()?.[lender]?.[chainId] ?? [];
18021
18015
  const reservesMap = aaveV4Reserves()?.[lender]?.[chainId] ?? {};
18022
18016
  let count = 0;
18023
- const hubAssetKeys = /* @__PURE__ */ new Set();
18024
18017
  for (const spokeEntry of spokes) {
18025
18018
  if (!isValidAddress(spokeEntry.spoke)) continue;
18026
- const reserves = getSpokeReserves(
18027
- reservesMap,
18028
- spokeEntry.spoke
18029
- );
18019
+ const reserves = getSpokeReserves(reservesMap, spokeEntry.spoke);
18030
18020
  const dynConfigCount = getDynamicConfigCount(spokeEntry);
18031
18021
  count += reserves.length * (BASE_CALLS_PER_RESERVE + dynConfigCount) + CALLS_PER_SPOKE_TAIL;
18032
18022
  const rids = reserves.map(
@@ -18035,15 +18025,11 @@ var getAaveV4ExpectedCallCount = (chainId, lender) => {
18035
18025
  if (rids.length > 0 && isValidAddress(spokeEntry.oracle)) {
18036
18026
  count += 1;
18037
18027
  }
18038
- for (const entry of reserves) {
18039
- if (typeof entry === "object" && spokeEntry.hub && entry.assetId !== void 0) {
18040
- hubAssetKeys.add(
18041
- `${spokeEntry.hub.toLowerCase()}:${entry.assetId}`
18042
- );
18043
- }
18044
- }
18045
18028
  }
18046
- count += hubAssetKeys.size * 3;
18029
+ const hubEntry = aaveV4Hubs()?.[lender]?.[chainId];
18030
+ if (hubEntry?.hub && isValidAddress(hubEntry.hub)) {
18031
+ count += 1 + MAX_HUB_ASSETS * 3;
18032
+ }
18047
18033
  return count;
18048
18034
  };
18049
18035
 
@@ -18058,17 +18044,22 @@ function toTokenNumber(raw, decimals) {
18058
18044
  return Number(raw) / 10 ** decimals;
18059
18045
  }
18060
18046
  var RAY2 = 1e27;
18047
+ var SECONDS_PER_YEAR4 = 31536e3;
18061
18048
  function rayRateToApr(rateRay) {
18062
18049
  if (rateRay === 0n) return 0;
18063
- return Number(rateRay) / RAY2 * 100;
18050
+ return (Number(rateRay) / RAY2 - 1) * SECONDS_PER_YEAR4 * 100;
18064
18051
  }
18065
- function normalizeAaveV4(spokeDataList, chainId, lender, prices, additionalYields, tokenList, lenderShortNameFn, createMarketUidFn, toOracleKeyFn, toGenericPriceKeyFn) {
18052
+ function normalizeAaveV4(spokeDataList, chainId, lender, prices, additionalYields, tokenList, lenderShortNameFn, createMarketUidFn, toOracleKeyFn, toGenericPriceKeyFn, expectedHub) {
18066
18053
  const data = {};
18067
18054
  const eModes = {};
18055
+ const hubFilter = expectedHub?.toLowerCase();
18068
18056
  for (const spokeData of spokeDataList) {
18069
18057
  const spokeAddr = spokeData.spoke.toLowerCase();
18070
18058
  const spokeReserves = spokeData.reserves;
18071
18059
  for (const reserve of spokeReserves) {
18060
+ const reserveHub = reserve.reserve.hub?.toLowerCase();
18061
+ if (hubFilter && reserveHub && reserveHub !== hubFilter)
18062
+ continue;
18072
18063
  for (const [keyStr, dynCfg] of Object.entries(
18073
18064
  reserve.dynamicConfigs
18074
18065
  )) {
@@ -18085,11 +18076,12 @@ function normalizeAaveV4(spokeDataList, chainId, lender, prices, additionalYield
18085
18076
  }
18086
18077
  }
18087
18078
  for (const reserve of spokeReserves) {
18079
+ const reserveHub = reserve.reserve.hub?.toLowerCase();
18080
+ if (hubFilter && reserveHub && reserveHub !== hubFilter)
18081
+ continue;
18088
18082
  const underlying = reserve.reserve.underlying.toLowerCase();
18089
18083
  const decimals = reserve.reserve.decimals;
18090
- const hubAddr = reserve.reserve.hub.toLowerCase();
18091
- const refAddress = `${hubAddr}:${underlying}`;
18092
- const marketUid = createMarketUidFn(chainId, lender, refAddress);
18084
+ const marketUid = createMarketUidFn(chainId, lender, underlying);
18093
18085
  const assetMeta = tokenList[underlying];
18094
18086
  const oracleKey = toOracleKeyFn(assetMeta?.assetGroup ?? null) ?? toGenericPriceKeyFn(underlying, chainId);
18095
18087
  let price = 0;
@@ -18151,47 +18143,59 @@ function normalizeAaveV4(spokeDataList, chainId, lender, prices, additionalYield
18151
18143
  debtDisabled: !reserve.config.borrowable || reserve.config.paused
18152
18144
  };
18153
18145
  }
18154
- data[marketUid] = {
18155
- marketUid,
18156
- name: lenderShortNameFn(lender) + " " + (assetMeta?.symbol ?? ""),
18157
- poolId: underlying,
18158
- underlying,
18159
- asset: assetMeta,
18160
- totalDeposits,
18161
- totalDebtStable: "0",
18162
- totalDebt,
18163
- totalLiquidity: liquidity,
18164
- totalDepositsUSD: totalDepositsNum * price,
18165
- totalDebtStableUSD: 0,
18166
- totalDebtUSD: totalDebtNum * price,
18167
- totalLiquidityUSD: liquidity * price,
18168
- depositRate,
18169
- variableBorrowRate,
18170
- stableBorrowRate: 0,
18171
- intrinsicYield: additionalYields?.intrinsicYields?.[oracleKey] ?? 0,
18172
- rewards: [],
18173
- decimals,
18174
- config,
18175
- collateralActive: Object.values(reserve.dynamicConfigs).some(
18176
- (c) => c.collateralFactor > 0
18177
- ),
18178
- borrowingEnabled: reserve.config.borrowable,
18179
- hasStable: false,
18180
- isActive: !reserve.config.paused,
18181
- isFrozen: reserve.config.frozen,
18182
- borrowCap: 0,
18183
- supplyCap: 0,
18184
- debtCeiling: 0,
18185
- params: {
18186
- metadata: {
18187
- spoke: spokeAddr,
18188
- hub: reserve.reserve.hub.toLowerCase(),
18189
- assetId: reserve.reserve.assetId,
18190
- reserveId: reserve.reserveId,
18191
- oracle: spokeData.oracle.toLowerCase()
18192
- }
18146
+ if (data[marketUid]) {
18147
+ Object.assign(data[marketUid].config, config);
18148
+ if (!data[marketUid].collateralActive) {
18149
+ data[marketUid].collateralActive = Object.values(reserve.dynamicConfigs).some(
18150
+ (c) => c.collateralFactor > 0
18151
+ );
18193
18152
  }
18194
- };
18153
+ if (!data[marketUid].borrowingEnabled) {
18154
+ data[marketUid].borrowingEnabled = reserve.config.borrowable;
18155
+ }
18156
+ } else {
18157
+ data[marketUid] = {
18158
+ marketUid,
18159
+ name: lenderShortNameFn(lender) + " " + (assetMeta?.symbol ?? ""),
18160
+ poolId: underlying,
18161
+ underlying,
18162
+ asset: assetMeta,
18163
+ totalDeposits,
18164
+ totalDebtStable: "0",
18165
+ totalDebt,
18166
+ totalLiquidity: liquidity,
18167
+ totalDepositsUSD: totalDepositsNum * price,
18168
+ totalDebtStableUSD: 0,
18169
+ totalDebtUSD: totalDebtNum * price,
18170
+ totalLiquidityUSD: liquidity * price,
18171
+ depositRate,
18172
+ variableBorrowRate,
18173
+ stableBorrowRate: 0,
18174
+ intrinsicYield: additionalYields?.intrinsicYields?.[oracleKey] ?? 0,
18175
+ rewards: [],
18176
+ decimals,
18177
+ config,
18178
+ collateralActive: Object.values(reserve.dynamicConfigs).some(
18179
+ (c) => c.collateralFactor > 0
18180
+ ),
18181
+ borrowingEnabled: reserve.config.borrowable,
18182
+ hasStable: false,
18183
+ isActive: !reserve.config.paused,
18184
+ isFrozen: reserve.config.frozen,
18185
+ borrowCap: 0,
18186
+ supplyCap: 0,
18187
+ debtCeiling: 0,
18188
+ params: {
18189
+ metadata: {
18190
+ spoke: spokeAddr,
18191
+ hub: reserve.reserve.hub.toLowerCase(),
18192
+ assetId: reserve.reserve.assetId,
18193
+ reserveId: reserve.reserveId,
18194
+ oracle: spokeData.oracle.toLowerCase()
18195
+ }
18196
+ }
18197
+ };
18198
+ }
18195
18199
  }
18196
18200
  }
18197
18201
  return { data, chainId, eModes };
@@ -18212,8 +18216,6 @@ var getAaveV4ReservesDataConverter = (lender, chainId, prices, additionalYields,
18212
18216
  const reservesMap = aaveV4Reserves()?.[lender]?.[chainId] ?? {};
18213
18217
  let offset = 0;
18214
18218
  const spokeDataList = [];
18215
- const hubAssetKeys = /* @__PURE__ */ new Set();
18216
- const hubAssetList = [];
18217
18219
  for (const spokeEntry of spokes) {
18218
18220
  if (!isValidAddress2(spokeEntry.spoke)) continue;
18219
18221
  const spokeAddr = spokeEntry.spoke;
@@ -18275,17 +18277,6 @@ var getAaveV4ReservesDataConverter = (lender, chainId, prices, additionalYields,
18275
18277
  } else {
18276
18278
  drawnDebt = BigInt(rawDebt ?? 0);
18277
18279
  }
18278
- if (spokeEntry.hub && typeof entry === "object" && entry.assetId !== void 0) {
18279
- const hubLc = spokeEntry.hub.toLowerCase();
18280
- const key = `${hubLc}:${entry.assetId}`;
18281
- if (!hubAssetKeys.has(key)) {
18282
- hubAssetKeys.add(key);
18283
- hubAssetList.push({
18284
- hub: hubLc,
18285
- assetId: entry.assetId
18286
- });
18287
- }
18288
- }
18289
18280
  parsedReserves.push({
18290
18281
  reserveId,
18291
18282
  reserve,
@@ -18339,40 +18330,51 @@ var getAaveV4ReservesDataConverter = (lender, chainId, prices, additionalYields,
18339
18330
  }
18340
18331
  }
18341
18332
  }
18333
+ const hubEntry = aaveV4Hubs()?.[lender]?.[chainId];
18342
18334
  const hubAssetMap = /* @__PURE__ */ new Map();
18343
- for (let hi = 0; hi < hubAssetList.length; hi++) {
18344
- const baseIdx = offset + hi * 3;
18345
- const rawHubAsset = data[baseIdx];
18346
- const rawAddedAssets = data[baseIdx + 1];
18347
- const rawTotalOwed = data[baseIdx + 2];
18348
- if (!rawHubAsset || rawHubAsset === "0x") continue;
18349
- const underlying = (rawHubAsset?.underlying ?? "").toLowerCase();
18350
- const key = underlying || `${hubAssetList[hi].hub}:${hubAssetList[hi].assetId}`;
18351
- hubAssetMap.set(key, {
18352
- liquidity: BigInt(rawHubAsset?.liquidity ?? 0),
18353
- realizedFees: BigInt(rawHubAsset?.realizedFees ?? 0),
18354
- decimals: Number(rawHubAsset?.decimals ?? 18),
18355
- addedShares: BigInt(rawHubAsset?.addedShares ?? 0),
18356
- swept: BigInt(rawHubAsset?.swept ?? 0),
18357
- premiumOffsetRay: BigInt(
18358
- rawHubAsset?.premiumOffsetRay ?? 0
18359
- ),
18360
- drawnShares: BigInt(rawHubAsset?.drawnShares ?? 0),
18361
- premiumShares: BigInt(rawHubAsset?.premiumShares ?? 0),
18362
- liquidityFee: Number(rawHubAsset?.liquidityFee ?? 0),
18363
- drawnIndex: BigInt(rawHubAsset?.drawnIndex ?? 0),
18364
- drawnRate: BigInt(rawHubAsset?.drawnRate ?? 0),
18365
- lastUpdateTimestamp: Number(
18366
- rawHubAsset?.lastUpdateTimestamp ?? 0
18367
- ),
18368
- underlying: rawHubAsset?.underlying ?? "",
18369
- irStrategy: rawHubAsset?.irStrategy ?? "",
18370
- reinvestmentController: rawHubAsset?.reinvestmentController ?? "",
18371
- feeReceiver: rawHubAsset?.feeReceiver ?? "",
18372
- deficitRay: BigInt(rawHubAsset?.deficitRay ?? 0),
18373
- totalAddedAssets: BigInt(rawAddedAssets ?? 0),
18374
- totalOwedAssets: BigInt(rawTotalOwed ?? 0)
18375
- });
18335
+ if (hubEntry?.hub && isValidAddress2(hubEntry.hub)) {
18336
+ const rawAssetCount = data[offset];
18337
+ offset += 1;
18338
+ const assetCount = Math.min(
18339
+ Number(rawAssetCount ?? 0),
18340
+ MAX_HUB_ASSETS
18341
+ );
18342
+ for (let i = 0; i < MAX_HUB_ASSETS; i++) {
18343
+ const baseIdx = offset + i * 3;
18344
+ const rawHubAsset = data[baseIdx];
18345
+ const rawAddedAssets = data[baseIdx + 1];
18346
+ const rawTotalOwed = data[baseIdx + 2];
18347
+ if (i >= assetCount || !rawHubAsset || rawHubAsset === "0x")
18348
+ continue;
18349
+ const underlying = (rawHubAsset?.underlying ?? "").toLowerCase();
18350
+ if (!underlying) continue;
18351
+ hubAssetMap.set(underlying, {
18352
+ liquidity: BigInt(rawHubAsset?.liquidity ?? 0),
18353
+ realizedFees: BigInt(rawHubAsset?.realizedFees ?? 0),
18354
+ decimals: Number(rawHubAsset?.decimals ?? 18),
18355
+ addedShares: BigInt(rawHubAsset?.addedShares ?? 0),
18356
+ swept: BigInt(rawHubAsset?.swept ?? 0),
18357
+ premiumOffsetRay: BigInt(
18358
+ rawHubAsset?.premiumOffsetRay ?? 0
18359
+ ),
18360
+ drawnShares: BigInt(rawHubAsset?.drawnShares ?? 0),
18361
+ premiumShares: BigInt(rawHubAsset?.premiumShares ?? 0),
18362
+ liquidityFee: Number(rawHubAsset?.liquidityFee ?? 0),
18363
+ drawnIndex: BigInt(rawHubAsset?.drawnIndex ?? 0),
18364
+ drawnRate: BigInt(rawHubAsset?.drawnRate ?? 0),
18365
+ lastUpdateTimestamp: Number(
18366
+ rawHubAsset?.lastUpdateTimestamp ?? 0
18367
+ ),
18368
+ underlying: rawHubAsset?.underlying ?? "",
18369
+ irStrategy: rawHubAsset?.irStrategy ?? "",
18370
+ reinvestmentController: rawHubAsset?.reinvestmentController ?? "",
18371
+ feeReceiver: rawHubAsset?.feeReceiver ?? "",
18372
+ deficitRay: BigInt(rawHubAsset?.deficitRay ?? 0),
18373
+ totalAddedAssets: BigInt(rawAddedAssets ?? 0),
18374
+ totalOwedAssets: BigInt(rawTotalOwed ?? 0)
18375
+ });
18376
+ }
18377
+ offset += MAX_HUB_ASSETS * 3;
18376
18378
  }
18377
18379
  for (const spokeData of spokeDataList) {
18378
18380
  for (const reserve of spokeData.reserves) {
@@ -18385,6 +18387,7 @@ var getAaveV4ReservesDataConverter = (lender, chainId, prices, additionalYields,
18385
18387
  }
18386
18388
  }
18387
18389
  }
18390
+ const expectedHub = hubEntry?.hub;
18388
18391
  return normalizeAaveV4(
18389
18392
  spokeDataList,
18390
18393
  chainId,
@@ -18395,7 +18398,8 @@ var getAaveV4ReservesDataConverter = (lender, chainId, prices, additionalYields,
18395
18398
  lenderShortName,
18396
18399
  createMarketUid,
18397
18400
  toOracleKey,
18398
- toGenericPriceKey
18401
+ toGenericPriceKey,
18402
+ expectedHub
18399
18403
  );
18400
18404
  };
18401
18405
  return [converter, expectedCalls];
@@ -18535,7 +18539,7 @@ var getLenderPublicData = async (chainId, lenders, prices, additionalYields, mul
18535
18539
  const abi = getAbi(lender);
18536
18540
  const callData = buildLenderCall(chainId, lender);
18537
18541
  const mappedCalls = callData.map((call) => ({ call, abi: call.abi ?? abi }));
18538
- calls = [...calls, ...mappedCalls];
18542
+ calls.push(...mappedCalls);
18539
18543
  }
18540
18544
  const [rawResults, list] = await Promise.all([
18541
18545
  multicallRetry({
@@ -18544,7 +18548,7 @@ var getLenderPublicData = async (chainId, lenders, prices, additionalYields, mul
18544
18548
  abi: calls.map((call) => call.abi),
18545
18549
  batchSize: chainId === Chain.ETHEREUM_MAINNET ? 500 : void 0
18546
18550
  }),
18547
- await tokenList()
18551
+ tokenList()
18548
18552
  ]);
18549
18553
  const invalidLenders = [];
18550
18554
  let lenderData = {};
@@ -18565,7 +18569,7 @@ var getLenderPublicData = async (chainId, lenders, prices, additionalYields, mul
18565
18569
  if (!convertedData) {
18566
18570
  invalidLenders.push(lender);
18567
18571
  } else {
18568
- lenderData = { ...lenderData, ...convertedData };
18572
+ Object.assign(lenderData, convertedData);
18569
18573
  }
18570
18574
  } else {
18571
18575
  if (!convertedData) {
@@ -18638,9 +18642,7 @@ var getLenderPublicDataViaApi = async (chainId, lenders, prices, additionalYield
18638
18642
  additionalYields,
18639
18643
  list
18640
18644
  );
18641
- Object.keys(converted).forEach((marketId) => {
18642
- lenderData[marketId] = converted[marketId];
18643
- });
18645
+ Object.assign(lenderData, converted);
18644
18646
  } else {
18645
18647
  lenderData[lender] = convertLenderDataFromApi(
18646
18648
  lender,
@@ -20269,10 +20271,15 @@ function resolveV4Config(configs, userConfigKey) {
20269
20271
  const spokeAddr = key.split(":")[0];
20270
20272
  return { config, spokeAddr };
20271
20273
  }
20272
- function getConfigScopedPrice(meta, spokeAddr, configPriceMap) {
20274
+ function getConfigScopedPrice(meta, spokeAddr) {
20275
+ if (spokeAddr) {
20276
+ const byConfig = meta?.oraclePrice?.byConfig;
20277
+ const configPrice = byConfig?.[spokeAddr]?.oraclePriceUsd;
20278
+ if (configPrice != null && configPrice > 0) return configPrice;
20279
+ }
20273
20280
  return getOraclePrice(meta);
20274
20281
  }
20275
- function createAaveV4UserState(payload, lenderData, totalDeposits24h = 0, totalDebt24h = 0, configPriceMap) {
20282
+ function createAaveV4UserState(payload, lenderData, totalDeposits24h = 0, totalDebt24h = 0) {
20276
20283
  const assetKeys = getMarketUidsFromMeta(lenderData);
20277
20284
  const { chainId, account } = payload;
20278
20285
  let depositInterest = 0;
@@ -20381,7 +20388,7 @@ function createAaveV4UserState(payload, lenderData, totalDeposits24h = 0, totalD
20381
20388
  configs,
20382
20389
  pos ? pos.userConfigKey : void 0
20383
20390
  );
20384
- const price = getConfigScopedPrice(meta);
20391
+ const price = getConfigScopedPrice(meta, spokeAddr);
20385
20392
  const bcf = config?.borrowCollateralFactor ?? 1;
20386
20393
  const bf = config?.borrowFactor ?? 1;
20387
20394
  if (pos) {
@@ -20476,7 +20483,6 @@ var getAaveV4UserDataConverter = (lender, chainId, account, metaMap) => {
20476
20483
  reserveEntries.push({
20477
20484
  spokeAddr,
20478
20485
  reserveId: rid,
20479
- hub: (spokeEntry.hub ?? "").toLowerCase(),
20480
20486
  underlying
20481
20487
  });
20482
20488
  }
@@ -20498,28 +20504,25 @@ var getAaveV4UserDataConverter = (lender, chainId, account, metaMap) => {
20498
20504
  let totalDebt24h = 0;
20499
20505
  let totalDeposits24h = 0;
20500
20506
  for (let i = 0; i < reserveEntries.length; i++) {
20501
- const { hub, underlying, spokeAddr } = reserveEntries[i];
20502
- let key;
20503
- if (hub) {
20504
- key = createMarketUid(chainId, lender, `${hub}:${underlying}`);
20505
- } else {
20506
- key = underlyingToUid.get(underlying) ?? createMarketUid(chainId, lender, `:${underlying}`);
20507
- }
20507
+ const { underlying, spokeAddr } = reserveEntries[i];
20508
+ const key = underlying ? createMarketUid(chainId, lender, underlying) : underlyingToUid.get(underlying) ?? "";
20508
20509
  const metaEntity = metaMap?.[key];
20509
20510
  if (!metaEntity) continue;
20510
20511
  const base = i * USER_CALLS_PER_RESERVE;
20512
+ const spokeLc = spokeAddr.toLowerCase();
20513
+ const userPositionResult = data[base + 3];
20514
+ const userDynConfigKey = Number(
20515
+ userPositionResult?.dynamicConfigKey ?? 0
20516
+ );
20511
20517
  const { dataForAsset, addedDebt, addedDeposits } = createAaveV4Entry(
20512
20518
  base,
20513
20519
  data,
20514
20520
  key,
20515
- metaEntity
20521
+ metaEntity,
20522
+ spokeLc
20516
20523
  );
20517
20524
  if (!dataForAsset) continue;
20518
- const userPositionResult = data[base + 3];
20519
- const userDynConfigKey = Number(
20520
- userPositionResult?.dynamicConfigKey ?? 0
20521
- );
20522
- dataForAsset.userConfigKey = `${spokeAddr.toLowerCase()}:${userDynConfigKey}`;
20525
+ dataForAsset.userConfigKey = `${spokeLc}:${userDynConfigKey}`;
20523
20526
  totalDebt24h += addedDebt;
20524
20527
  totalDeposits24h += addedDeposits;
20525
20528
  lendingPositions[key] = dataForAsset;
@@ -20540,7 +20543,15 @@ var getAaveV4UserDataConverter = (lender, chainId, account, metaMap) => {
20540
20543
  expectedNumberOfCalls
20541
20544
  ];
20542
20545
  };
20543
- function createAaveV4Entry(base, data, key, meta) {
20546
+ function getConfigOraclePrice(meta, spokeAddr) {
20547
+ if (spokeAddr) {
20548
+ const byConfig = meta?.oraclePrice?.byConfig;
20549
+ const configPrice = byConfig?.[spokeAddr]?.oraclePriceUsd;
20550
+ if (configPrice != null && configPrice > 0) return configPrice;
20551
+ }
20552
+ return getOraclePrice(meta);
20553
+ }
20554
+ function createAaveV4Entry(base, data, key, meta, spokeAddr) {
20544
20555
  const rawSupply = data[base];
20545
20556
  const debtResult = data[base + 1];
20546
20557
  const statusResult = data[base + 2];
@@ -20561,7 +20572,7 @@ function createAaveV4Entry(base, data, key, meta) {
20561
20572
  const currentDebt = parseRawAmount(totalDebtRaw, decimals);
20562
20573
  const collateralEnabled = Boolean(statusResult?.[0]);
20563
20574
  const price = getDisplayPrice(meta);
20564
- const oPrice = getOraclePrice(meta);
20575
+ const oPrice = getConfigOraclePrice(meta, spokeAddr);
20565
20576
  const priceHist = meta?.price?.priceUsd24h ?? price;
20566
20577
  const dataForAsset = {
20567
20578
  marketUid: key,
@@ -25399,19 +25410,20 @@ function unflattenLenderData(pools) {
25399
25410
  return result;
25400
25411
  }
25401
25412
  var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient3, allowFailure = true, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, retries = 3, logs = false) => {
25402
- let calls = [];
25403
25413
  const queries = organizeUserQueries(queriesRaw);
25404
- for (const query2 of queries) {
25405
- const abi = getAbi2(query2.lender);
25406
- const callData = await buildUserCall(
25407
- chainId,
25408
- query2.lender,
25409
- query2.account,
25410
- query2.params
25411
- );
25412
- const mappedCalls = callData.map((call) => ({ call, abi }));
25413
- calls = [...calls, ...mappedCalls];
25414
- }
25414
+ const builtCalls = await Promise.all(
25415
+ queries.map(async (query2) => {
25416
+ const abi = getAbi2(query2.lender);
25417
+ const callData = await buildUserCall(
25418
+ chainId,
25419
+ query2.lender,
25420
+ query2.account,
25421
+ query2.params
25422
+ );
25423
+ return callData.map((call) => ({ call, abi }));
25424
+ })
25425
+ );
25426
+ const calls = builtCalls.flat();
25415
25427
  return await multicallViemAbiArray(
25416
25428
  chainId,
25417
25429
  calls.map((call) => call.abi),
@@ -25426,20 +25438,21 @@ var getLenderUserDataResult = async (chainId, queriesRaw, getEvmClient3, allowFa
25426
25438
  );
25427
25439
  };
25428
25440
  var prepareLenderUserDataRpcCalls = async (chainId, queriesRaw, batchSize = MULTICALL_DEFAULT_BATCH_SIZE, blockTag = "latest", allowFailure = true) => {
25429
- let calls = [];
25430
25441
  const multicallAddress = getEvmChain(chainId).contracts?.multicall3?.address;
25431
25442
  const queries = organizeUserQueries(queriesRaw);
25432
- for (const query2 of queries) {
25433
- const abi = getAbi2(query2.lender);
25434
- const callData = await buildUserCall(
25435
- chainId,
25436
- query2.lender,
25437
- query2.account,
25438
- query2.params
25439
- );
25440
- const mappedCalls = callData.map((call) => ({ call, abi }));
25441
- calls = [...calls, ...mappedCalls];
25442
- }
25443
+ const builtCalls = await Promise.all(
25444
+ queries.map(async (query2) => {
25445
+ const abi = getAbi2(query2.lender);
25446
+ const callData = await buildUserCall(
25447
+ chainId,
25448
+ query2.lender,
25449
+ query2.account,
25450
+ query2.params
25451
+ );
25452
+ return callData.map((call) => ({ call, abi }));
25453
+ })
25454
+ );
25455
+ const calls = builtCalls.flat();
25443
25456
  const preparedCalls = prepareMulticallInputs(
25444
25457
  calls.map((c) => c.abi),
25445
25458
  calls.map((c) => c.call)
@@ -27621,34 +27634,18 @@ var yusdFetcher = {
27621
27634
  };
27622
27635
 
27623
27636
  // src/yields/intrinsic/fetchers/resolv.ts
27624
- var RLP_URL = "https://api.resolv.xyz/apr/rlp/7d";
27625
- var WSTUSR_URL = "https://api.resolv.xyz/apr/staking/7d";
27626
27637
  var rlp = "Resolv RLP::RLP";
27627
27638
  var wstusr = "Resolv wstUSR::WSTUSR";
27628
27639
  var rlpFetcher = {
27629
27640
  label: "RLP",
27630
27641
  fetch: async () => {
27631
- const res = await fetch(RLP_URL, {
27632
- method: "GET",
27633
- headers: {
27634
- Accept: "application/json",
27635
- "User-Agent": "1delta/yields"
27636
- }
27637
- }).then((r) => r.json());
27638
- return { [rlp]: Number(res?.value ?? 0) * 100 };
27642
+ return { [rlp]: 0 };
27639
27643
  }
27640
27644
  };
27641
27645
  var wstusrFetcher = {
27642
27646
  label: "WSTUSR",
27643
27647
  fetch: async () => {
27644
- const res = await fetch(WSTUSR_URL, {
27645
- method: "GET",
27646
- headers: {
27647
- Accept: "application/json",
27648
- "User-Agent": "1delta/yields"
27649
- }
27650
- }).then((r) => r.json());
27651
- return { [wstusr]: Number(res?.value ?? 0) * 100 };
27648
+ return { [wstusr]: 0 };
27652
27649
  }
27653
27650
  };
27654
27651
 
@@ -27865,7 +27862,7 @@ var susdxFetcher = {
27865
27862
  };
27866
27863
 
27867
27864
  // src/yields/intrinsic/fetchers/reserve.ts
27868
- var RTOKENS_URL = "https://yields.reserve.org/pools";
27865
+ var RTOKENS_URL = "https://yields.reserve.org";
27869
27866
  var hyUSD = "High Yield USD Base::HYUSD";
27870
27867
  var bsdETH = "Based ETH::BSDETH";
27871
27868
  var ethPlus = "ETHPlus::ETH+";
@@ -27878,18 +27875,18 @@ var rtokensFetcher = {
27878
27875
  label: "RTOKENS",
27879
27876
  fetch: async () => {
27880
27877
  const res = await fetch(RTOKENS_URL).then((r) => r.json());
27881
- const data = res.rtokens["8453"];
27882
- const dataMainnet = res.rtokens["1"];
27883
- const dataMainnetColalterals = res.collaterals["1"];
27878
+ const data = res?.rtokens?.["8453"];
27879
+ const dataMainnet = res?.rtokens?.["1"];
27880
+ const dataMainnetColalterals = res?.collaterals?.["1"];
27884
27881
  return {
27885
- [bsdETH]: apyToAprPercent(data.bsdETH / 100) * 100,
27886
- [hyUSD]: apyToAprPercent(data.hyUSD / 100) * 100,
27887
- [sfrxeth]: apyToAprPercent(dataMainnetColalterals.sfrxeth / 100) * 100,
27888
- [sfrax]: apyToAprPercent(dataMainnetColalterals.sfrax / 100) * 100,
27889
- [ceth]: apyToAprPercent(dataMainnetColalterals.ceth / 100) * 100,
27890
- [ethPlus]: apyToAprPercent(dataMainnet["ETH+"] / 100) * 100,
27891
- [usdThree]: apyToAprPercent(dataMainnet["USD3"] / 100) * 100,
27892
- [woEth]: apyToAprPercent(dataMainnetColalterals.woeth / 100) * 100
27882
+ [bsdETH]: apyToAprPercent((data?.bsdETH ?? 0) / 100) * 100,
27883
+ [hyUSD]: apyToAprPercent((data?.hyUSD ?? 0) / 100) * 100,
27884
+ [sfrxeth]: apyToAprPercent((dataMainnetColalterals?.sfrxeth ?? 0) / 100) * 100,
27885
+ [sfrax]: apyToAprPercent((dataMainnetColalterals?.sfrax ?? 0) / 100) * 100,
27886
+ [ceth]: apyToAprPercent((dataMainnetColalterals?.ceth ?? 0) / 100) * 100,
27887
+ [ethPlus]: apyToAprPercent((dataMainnet?.["ETH+"] ?? 0) / 100) * 100,
27888
+ [usdThree]: apyToAprPercent((dataMainnet?.["USD3"] ?? 0) / 100) * 100,
27889
+ [woEth]: apyToAprPercent((dataMainnetColalterals?.woeth ?? 0) / 100) * 100
27893
27890
  };
27894
27891
  }
27895
27892
  };