@1delta/margin-fetcher 0.0.215 → 0.0.217

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;
@@ -12104,7 +12106,9 @@ function convertMarketsToMorphoResponse(response, chainId, additionalYields = {
12104
12106
  loaded: true
12105
12107
  }, tokens = {}) {
12106
12108
  const data = {};
12107
- response.markets.items.forEach((market) => {
12109
+ const items = response?.markets?.items;
12110
+ if (!items) return data;
12111
+ items.forEach((market) => {
12108
12112
  const {
12109
12113
  uniqueKey,
12110
12114
  lltv,
@@ -17893,7 +17897,7 @@ var getEulerV2ReservesDataConverter = (lender, chainId, prices, additionalYields
17893
17897
  };
17894
17898
 
17895
17899
  // src/lending/public-data/aave-v4-type/publicCallBuild.ts
17896
- var CALLS_PER_RESERVE = 6;
17900
+ var BASE_CALLS_PER_RESERVE = 5;
17897
17901
  var CALLS_PER_SPOKE_TAIL = 2;
17898
17902
  function isValidAddress(addr) {
17899
17903
  return !!addr && addr !== "0x" && addr.length > 2;
@@ -17901,6 +17905,10 @@ function isValidAddress(addr) {
17901
17905
  function getSpokeReserves(reservesMap, spokeAddr) {
17902
17906
  return reservesMap[spokeAddr.toLowerCase()] ?? reservesMap[spokeAddr] ?? [];
17903
17907
  }
17908
+ function getDynamicConfigCount(spokeEntry) {
17909
+ const max = spokeEntry.dynamicConfigKeyMax ?? 0;
17910
+ return max + 1;
17911
+ }
17904
17912
  var buildAaveV4LenderReserveCall = (chainId, lender) => {
17905
17913
  const spokes = aaveV4Spokes()?.[lender]?.[chainId] ?? [];
17906
17914
  const reservesMap = aaveV4Reserves()?.[lender]?.[chainId] ?? {};
@@ -17912,6 +17920,7 @@ var buildAaveV4LenderReserveCall = (chainId, lender) => {
17912
17920
  if (!isValidAddress(spokeEntry.spoke)) continue;
17913
17921
  const spokeAddr = spokeEntry.spoke;
17914
17922
  const reserves = getSpokeReserves(reservesMap, spokeAddr);
17923
+ const dynConfigCount = getDynamicConfigCount(spokeEntry);
17915
17924
  for (const entry of reserves) {
17916
17925
  const rid = typeof entry === "number" ? entry : entry.reserveId;
17917
17926
  calls.push(
@@ -17939,13 +17948,15 @@ var buildAaveV4LenderReserveCall = (chainId, lender) => {
17939
17948
  address: spokeAddr,
17940
17949
  name: "getReserveTotalDebt",
17941
17950
  params: [rid]
17942
- },
17943
- {
17944
- address: spokeAddr,
17945
- name: "getDynamicReserveConfig",
17946
- params: [rid, 0]
17947
17951
  }
17948
17952
  );
17953
+ for (let key = 0; key < dynConfigCount; key++) {
17954
+ calls.push({
17955
+ address: spokeAddr,
17956
+ name: "getDynamicReserveConfig",
17957
+ params: [rid, key]
17958
+ });
17959
+ }
17949
17960
  if (typeof entry === "object" && spokeEntry.hub && entry.assetId !== void 0) {
17950
17961
  const hubLc = spokeEntry.hub.toLowerCase();
17951
17962
  const key = `${hubLc}:${entry.assetId}`;
@@ -18020,7 +18031,8 @@ var getAaveV4ExpectedCallCount = (chainId, lender) => {
18020
18031
  reservesMap,
18021
18032
  spokeEntry.spoke
18022
18033
  );
18023
- count += reserves.length * CALLS_PER_RESERVE + CALLS_PER_SPOKE_TAIL;
18034
+ const dynConfigCount = getDynamicConfigCount(spokeEntry);
18035
+ count += reserves.length * (BASE_CALLS_PER_RESERVE + dynConfigCount) + CALLS_PER_SPOKE_TAIL;
18024
18036
  const rids = reserves.map(
18025
18037
  (e) => typeof e === "number" ? e : e.reserveId
18026
18038
  );
@@ -18029,7 +18041,9 @@ var getAaveV4ExpectedCallCount = (chainId, lender) => {
18029
18041
  }
18030
18042
  for (const entry of reserves) {
18031
18043
  if (typeof entry === "object" && spokeEntry.hub && entry.assetId !== void 0) {
18032
- hubAssetKeys.add(`${spokeEntry.hub.toLowerCase()}:${entry.assetId}`);
18044
+ hubAssetKeys.add(
18045
+ `${spokeEntry.hub.toLowerCase()}:${entry.assetId}`
18046
+ );
18033
18047
  }
18034
18048
  }
18035
18049
  }
@@ -18052,13 +18066,17 @@ function rayRateToApr(rateRay) {
18052
18066
  if (rateRay === 0n) return 0;
18053
18067
  return Number(rateRay) / RAY2 * 100;
18054
18068
  }
18055
- function normalizeAaveV4(spokeDataList, chainId, lender, prices, additionalYields, tokenList, lenderShortNameFn, createMarketUidFn, toOracleKeyFn, toGenericPriceKeyFn) {
18069
+ function normalizeAaveV4(spokeDataList, chainId, lender, prices, additionalYields, tokenList, lenderShortNameFn, createMarketUidFn, toOracleKeyFn, toGenericPriceKeyFn, expectedHub) {
18056
18070
  const data = {};
18057
18071
  const eModes = {};
18072
+ const hubFilter = expectedHub?.toLowerCase();
18058
18073
  for (const spokeData of spokeDataList) {
18059
18074
  const spokeAddr = spokeData.spoke.toLowerCase();
18060
18075
  const spokeReserves = spokeData.reserves;
18061
18076
  for (const reserve of spokeReserves) {
18077
+ const reserveHub = reserve.reserve.hub?.toLowerCase();
18078
+ if (hubFilter && reserveHub && reserveHub !== hubFilter)
18079
+ continue;
18062
18080
  for (const [keyStr, dynCfg] of Object.entries(
18063
18081
  reserve.dynamicConfigs
18064
18082
  )) {
@@ -18075,6 +18093,9 @@ function normalizeAaveV4(spokeDataList, chainId, lender, prices, additionalYield
18075
18093
  }
18076
18094
  }
18077
18095
  for (const reserve of spokeReserves) {
18096
+ const reserveHub = reserve.reserve.hub?.toLowerCase();
18097
+ if (hubFilter && reserveHub && reserveHub !== hubFilter)
18098
+ continue;
18078
18099
  const underlying = reserve.reserve.underlying.toLowerCase();
18079
18100
  const decimals = reserve.reserve.decimals;
18080
18101
  const hubAddr = reserve.reserve.hub.toLowerCase();
@@ -18208,18 +18229,35 @@ var getAaveV4ReservesDataConverter = (lender, chainId, prices, additionalYields,
18208
18229
  if (!isValidAddress2(spokeEntry.spoke)) continue;
18209
18230
  const spokeAddr = spokeEntry.spoke;
18210
18231
  const reserves = getSpokeReserves2(reservesMap, spokeAddr);
18211
- const reserveCount = reserves.length;
18232
+ const dynConfigCount = (spokeEntry.dynamicConfigKeyMax ?? 0) + 1;
18212
18233
  const parsedReserves = [];
18213
- for (let i = 0; i < reserveCount; i++) {
18234
+ for (let i = 0; i < reserves.length; i++) {
18214
18235
  const entry = reserves[i];
18215
18236
  const reserveId = typeof entry === "number" ? entry : entry.reserveId;
18216
- const baseIdx = offset + i * CALLS_PER_RESERVE;
18217
- const rawReserve = data[baseIdx];
18218
- const rawConfig = data[baseIdx + 1];
18219
- const rawSupplied = data[baseIdx + 2];
18220
- const rawDebt = data[baseIdx + 3];
18221
- const rawTotalDebt = data[baseIdx + 4];
18222
- const rawDynConfig = data[baseIdx + 5];
18237
+ const rawReserve = data[offset];
18238
+ const rawConfig = data[offset + 1];
18239
+ const rawSupplied = data[offset + 2];
18240
+ const rawDebt = data[offset + 3];
18241
+ const rawTotalDebt = data[offset + 4];
18242
+ offset += BASE_CALLS_PER_RESERVE;
18243
+ const dynamicConfigs = {};
18244
+ for (let key = 0; key < dynConfigCount; key++) {
18245
+ const rawDynConfig = data[offset];
18246
+ offset += 1;
18247
+ if (rawDynConfig && rawDynConfig !== "0x") {
18248
+ dynamicConfigs[key] = {
18249
+ collateralFactor: Number(
18250
+ rawDynConfig?.collateralFactor ?? 0
18251
+ ),
18252
+ maxLiquidationBonus: Number(
18253
+ rawDynConfig?.maxLiquidationBonus ?? 0
18254
+ ),
18255
+ liquidationFee: Number(
18256
+ rawDynConfig?.liquidationFee ?? 0
18257
+ )
18258
+ };
18259
+ }
18260
+ }
18223
18261
  const reserve = {
18224
18262
  underlying: rawReserve?.underlying ?? "",
18225
18263
  hub: rawReserve?.hub ?? "",
@@ -18248,20 +18286,6 @@ var getAaveV4ReservesDataConverter = (lender, chainId, prices, additionalYields,
18248
18286
  } else {
18249
18287
  drawnDebt = BigInt(rawDebt ?? 0);
18250
18288
  }
18251
- const dynamicConfigs = {};
18252
- if (rawDynConfig && rawDynConfig !== "0x") {
18253
- dynamicConfigs[0] = {
18254
- collateralFactor: Number(
18255
- rawDynConfig?.collateralFactor ?? 0
18256
- ),
18257
- maxLiquidationBonus: Number(
18258
- rawDynConfig?.maxLiquidationBonus ?? 0
18259
- ),
18260
- liquidationFee: Number(
18261
- rawDynConfig?.liquidationFee ?? 0
18262
- )
18263
- };
18264
- }
18265
18289
  if (spokeEntry.hub && typeof entry === "object" && entry.assetId !== void 0) {
18266
18290
  const hubLc = spokeEntry.hub.toLowerCase();
18267
18291
  const key = `${hubLc}:${entry.assetId}`;
@@ -18286,7 +18310,6 @@ var getAaveV4ReservesDataConverter = (lender, chainId, prices, additionalYields,
18286
18310
  price: 0n
18287
18311
  });
18288
18312
  }
18289
- offset += reserveCount * CALLS_PER_RESERVE;
18290
18313
  const rawLiqConfig = data[offset];
18291
18314
  const rawOracle = data[offset + 1];
18292
18315
  offset += CALLS_PER_SPOKE_TAIL;
@@ -18373,6 +18396,8 @@ var getAaveV4ReservesDataConverter = (lender, chainId, prices, additionalYields,
18373
18396
  }
18374
18397
  }
18375
18398
  }
18399
+ const hubEntry = aaveV4Hubs()?.[lender]?.[chainId];
18400
+ const expectedHub = hubEntry?.hub;
18376
18401
  return normalizeAaveV4(
18377
18402
  spokeDataList,
18378
18403
  chainId,
@@ -18383,7 +18408,8 @@ var getAaveV4ReservesDataConverter = (lender, chainId, prices, additionalYields,
18383
18408
  lenderShortName,
18384
18409
  createMarketUid,
18385
18410
  toOracleKey,
18386
- toGenericPriceKey
18411
+ toGenericPriceKey,
18412
+ expectedHub
18387
18413
  );
18388
18414
  };
18389
18415
  return [converter, expectedCalls];
@@ -19042,7 +19068,7 @@ var buildEulerUserCall = async (chainId, lender, account, subAccountIndexes) =>
19042
19068
  };
19043
19069
 
19044
19070
  // src/lending/user-data/aave-v4-type/userCallBuild.ts
19045
- var USER_CALLS_PER_RESERVE = 3;
19071
+ var USER_CALLS_PER_RESERVE = 4;
19046
19072
  var buildAaveV4UserCall = (chainId, lender, account) => {
19047
19073
  const spokes = aaveV4Spokes()?.[lender]?.[chainId] ?? [];
19048
19074
  const reservesMap = aaveV4Reserves()?.[lender]?.[chainId] ?? {};
@@ -19069,6 +19095,11 @@ var buildAaveV4UserCall = (chainId, lender, account) => {
19069
19095
  address: spokeAddr,
19070
19096
  name: "getUserReserveStatus",
19071
19097
  params: [rid, account]
19098
+ },
19099
+ {
19100
+ address: spokeAddr,
19101
+ name: "getUserPosition",
19102
+ params: [rid, account]
19072
19103
  }
19073
19104
  );
19074
19105
  }
@@ -20237,21 +20268,230 @@ var getEulerUserDataConverter = (lender, chainId, account, metaMap, subAccountIn
20237
20268
  ];
20238
20269
  };
20239
20270
 
20271
+ // src/lending/user-data/aave-v4-type/createAaveV4UserState.ts
20272
+ function resolveV4Config(configs, userConfigKey) {
20273
+ if (!configs) return { config: void 0, spokeAddr: void 0 };
20274
+ if (userConfigKey && configs[userConfigKey]) {
20275
+ return {
20276
+ config: configs[userConfigKey],
20277
+ spokeAddr: userConfigKey.split(":")[0]
20278
+ };
20279
+ }
20280
+ const entries = Object.entries(configs);
20281
+ if (entries.length === 0) return { config: void 0, spokeAddr: void 0 };
20282
+ const [key, config] = entries[0];
20283
+ const spokeAddr = key.split(":")[0];
20284
+ return { config, spokeAddr };
20285
+ }
20286
+ function getConfigScopedPrice(meta, spokeAddr, configPriceMap) {
20287
+ return getOraclePrice(meta);
20288
+ }
20289
+ function createAaveV4UserState(payload, lenderData, totalDeposits24h = 0, totalDebt24h = 0, configPriceMap) {
20290
+ const assetKeys = getMarketUidsFromMeta(lenderData);
20291
+ const { chainId, account } = payload;
20292
+ let depositInterest = 0;
20293
+ let borrowInterest = 0;
20294
+ let rewardDepositAccrual = 0;
20295
+ let rewardBorrowAccrual = 0;
20296
+ let stakingDepositAccrual = 0;
20297
+ let stakingBorrowAccrual = 0;
20298
+ let deposits = 0;
20299
+ let debt = 0;
20300
+ let oracleDebt = 0;
20301
+ let collateral = 0;
20302
+ let borrowDiscountedCollateral = 0;
20303
+ let borrowDiscountedCollateralAllActive = 0;
20304
+ let collateralAllActive = 0;
20305
+ let rewardsPerAsset = {};
20306
+ for (const marketUid of assetKeys) {
20307
+ if (!lenderData?.[marketUid] || !payload.lendingPositions[marketUid])
20308
+ continue;
20309
+ const pos = payload.lendingPositions[marketUid];
20310
+ const { depositsUSD, debtStableUSD, debtUSD, collateralEnabled } = pos;
20311
+ const depositsUSDOracle = pos.depositsUSDOracle ?? depositsUSD;
20312
+ const debtUSDOracle = pos.debtUSDOracle ?? debtUSD;
20313
+ const {
20314
+ depositRate,
20315
+ intrinsicYield,
20316
+ variableBorrowRate,
20317
+ stableBorrowRate,
20318
+ rewards,
20319
+ flags,
20320
+ configs
20321
+ } = lenderData[marketUid];
20322
+ const { config: userConfigForAsset } = resolveV4Config(
20323
+ configs,
20324
+ pos.userConfigKey
20325
+ );
20326
+ deposits += depositsUSD;
20327
+ debt += debtUSD + (debtStableUSD ?? 0);
20328
+ oracleDebt += debtUSDOracle + (pos.debtStableUSDOracle ?? debtStableUSD ?? 0);
20329
+ (rewards ?? []).forEach((rewardData) => {
20330
+ const key = rewardData.asset;
20331
+ rewardDepositAccrual += rewardData.depositRate * depositsUSD;
20332
+ rewardBorrowAccrual += rewardData.variableBorrowRate * debtUSD;
20333
+ const rewDepo = rewardData.depositRate * depositsUSD;
20334
+ const rewDebt = rewardData.variableBorrowRate * debtUSD;
20335
+ if (!rewardsPerAsset[key])
20336
+ rewardsPerAsset[key] = { depositApr: 0, borrowApr: 0 };
20337
+ if (rewDepo > 0) rewardsPerAsset[key].depositApr += rewDepo;
20338
+ if (rewDebt > 0) rewardsPerAsset[key].borrowApr += rewDebt;
20339
+ });
20340
+ stakingDepositAccrual += (intrinsicYield ?? 0) * depositsUSD;
20341
+ stakingBorrowAccrual += (intrinsicYield ?? 0) * debtUSD;
20342
+ if (flags?.collateralActive || userConfigForAsset && !userConfigForAsset.collateralDisabled) {
20343
+ if (collateralEnabled) {
20344
+ collateral += (userConfigForAsset?.collateralFactor ?? 1) * depositsUSDOracle;
20345
+ borrowDiscountedCollateral += (userConfigForAsset?.borrowCollateralFactor ?? 1) * depositsUSDOracle;
20346
+ }
20347
+ borrowDiscountedCollateralAllActive += (userConfigForAsset?.borrowCollateralFactor ?? 1) * depositsUSDOracle;
20348
+ collateralAllActive += (userConfigForAsset?.collateralFactor ?? 1) * depositsUSDOracle;
20349
+ }
20350
+ depositInterest += (depositRate ?? 0) * depositsUSD;
20351
+ borrowInterest += debtUSD * (variableBorrowRate ?? 0) + (debtStableUSD ?? 0) * (stableBorrowRate ?? 0);
20352
+ }
20353
+ const nav = deposits - debt;
20354
+ const balanceData2 = {
20355
+ borrowDiscountedCollateral,
20356
+ borrowDiscountedCollateralAllActive,
20357
+ collateral,
20358
+ collateralAllActive,
20359
+ deposits,
20360
+ debt,
20361
+ adjustedDebt: oracleDebt,
20362
+ nav,
20363
+ deposits24h: totalDeposits24h,
20364
+ debt24h: totalDebt24h,
20365
+ nav24h: totalDeposits24h - totalDebt24h,
20366
+ ...payload.rewards ? { rewards: payload.rewards } : {}
20367
+ };
20368
+ const aprData2 = {
20369
+ apr: safeDivide(depositInterest - borrowInterest, nav),
20370
+ borrowApr: safeDivide(borrowInterest, debt),
20371
+ depositApr: safeDivide(depositInterest, deposits),
20372
+ rewards: divideAccrualsToAprs(rewardsPerAsset, nav, deposits, debt),
20373
+ rewardApr: safeDivide(rewardDepositAccrual + rewardBorrowAccrual, nav),
20374
+ rewardDepositApr: safeDivide(rewardDepositAccrual, deposits),
20375
+ rewardBorrowApr: safeDivide(rewardBorrowAccrual, debt),
20376
+ intrinsicApr: safeDivide(stakingDepositAccrual - stakingBorrowAccrual, nav),
20377
+ intrinsicDepositApr: safeDivide(stakingDepositAccrual, deposits),
20378
+ intrinsicBorrowApr: safeDivide(stakingBorrowAccrual, debt)
20379
+ };
20380
+ const userConfig = {
20381
+ selectedMode: "0",
20382
+ id: account,
20383
+ isWhitelisted: true
20384
+ };
20385
+ const creditLine = Math.max(
20386
+ 0,
20387
+ borrowDiscountedCollateral - balanceData2.adjustedDebt
20388
+ );
20389
+ for (const marketUid of assetKeys) {
20390
+ if (!lenderData?.[marketUid]) continue;
20391
+ const meta = lenderData[marketUid];
20392
+ const { configs, flags, borrowLiquidity, withdrawLiquidity } = meta;
20393
+ const pos = payload.lendingPositions[marketUid];
20394
+ const { config, spokeAddr } = resolveV4Config(
20395
+ configs,
20396
+ pos ? pos.userConfigKey : void 0
20397
+ );
20398
+ const price = getConfigScopedPrice(meta);
20399
+ const bcf = config?.borrowCollateralFactor ?? 1;
20400
+ const bf = config?.borrowFactor ?? 1;
20401
+ if (pos) {
20402
+ let withdrawable;
20403
+ if (!pos.collateralEnabled || config?.collateralDisabled) {
20404
+ withdrawable = String(pos.deposits);
20405
+ } else if (balanceData2.debt === 0) {
20406
+ withdrawable = String(pos.deposits);
20407
+ } else {
20408
+ const withdrawableUSD = Math.max(creditLine / bcf, 0);
20409
+ withdrawable = String(
20410
+ Math.min(withdrawableUSD / price, Number(pos.deposits))
20411
+ );
20412
+ }
20413
+ if (withdrawLiquidity != null) {
20414
+ withdrawable = String(Math.min(Number(withdrawable), withdrawLiquidity));
20415
+ }
20416
+ let borrowable;
20417
+ if (!flags?.borrowingEnabled || flags?.isFrozen || config?.debtDisabled) {
20418
+ borrowable = "0";
20419
+ } else {
20420
+ const borrowableUSD = Math.max(creditLine / bf, 0);
20421
+ borrowable = String(borrowableUSD / price);
20422
+ }
20423
+ if (borrowLiquidity != null) {
20424
+ borrowable = String(Math.min(Number(borrowable), borrowLiquidity));
20425
+ }
20426
+ pos.withdrawable = withdrawable;
20427
+ pos.borrowable = borrowable;
20428
+ pos.underlyingInfo = buildUnderlyingInfo(meta);
20429
+ } else if ((deposits > 0 || debt > 0) && flags?.borrowingEnabled && !flags?.isFrozen && !config?.debtDisabled) {
20430
+ let borrowable = String(Math.max(creditLine / bf, 0) / price);
20431
+ if (borrowLiquidity != null) {
20432
+ borrowable = String(Math.min(Number(borrowable), borrowLiquidity));
20433
+ }
20434
+ payload.lendingPositions[marketUid] = {
20435
+ marketUid,
20436
+ deposits: "0",
20437
+ debt: "0",
20438
+ debtStable: "0",
20439
+ depositsUSD: 0,
20440
+ debtUSD: 0,
20441
+ debtStableUSD: 0,
20442
+ collateralEnabled: false,
20443
+ claimableRewards: 0,
20444
+ withdrawable: "0",
20445
+ borrowable,
20446
+ underlyingInfo: buildUnderlyingInfo(meta)
20447
+ };
20448
+ }
20449
+ }
20450
+ return {
20451
+ lender: "",
20452
+ account,
20453
+ chainId,
20454
+ data: [
20455
+ {
20456
+ health: balanceData2.debt === 0 ? null : balanceData2.adjustedDebt > 0 ? balanceData2.collateral / balanceData2.adjustedDebt : balanceData2.collateral / balanceData2.debt,
20457
+ borrowCapacityUSD: creditLine,
20458
+ accountId: "0",
20459
+ balanceData: balanceData2,
20460
+ aprData: aprData2,
20461
+ userConfig,
20462
+ positions: Object.values(payload.lendingPositions)
20463
+ }
20464
+ ]
20465
+ };
20466
+ }
20467
+
20240
20468
  // src/lending/user-data/aave-v4-type/userCallParse.ts
20241
20469
  var getAaveV4UserDataConverter = (lender, chainId, account, metaMap) => {
20242
20470
  const spokes = aaveV4Spokes()?.[lender]?.[chainId] ?? [];
20243
20471
  const reservesMap = aaveV4Reserves()?.[lender]?.[chainId] ?? {};
20472
+ const oracleEntries = aaveV4Oracles()?.[lender]?.[chainId] ?? [];
20473
+ const spokeReserveToUnderlying = /* @__PURE__ */ new Map();
20474
+ for (const oe of oracleEntries) {
20475
+ if (oe.underlying && oe.spoke) {
20476
+ spokeReserveToUnderlying.set(
20477
+ `${oe.spoke.toLowerCase()}:${oe.reserveId}`,
20478
+ oe.underlying.toLowerCase()
20479
+ );
20480
+ }
20481
+ }
20244
20482
  const reserveEntries = [];
20245
20483
  for (const spokeEntry of spokes) {
20246
20484
  const spokeAddr = spokeEntry.spoke;
20247
20485
  if (!spokeAddr || spokeAddr === "0x" || spokeAddr.length <= 2) continue;
20248
20486
  const reserves = reservesMap[spokeAddr.toLowerCase()] ?? reservesMap[spokeAddr] ?? [];
20249
20487
  for (const entry of reserves) {
20488
+ const rid = typeof entry === "number" ? entry : entry.reserveId;
20489
+ const underlying = ((typeof entry === "object" ? entry.underlying : void 0) ?? spokeReserveToUnderlying.get(`${spokeAddr.toLowerCase()}:${rid}`) ?? "").toLowerCase();
20250
20490
  reserveEntries.push({
20251
20491
  spokeAddr,
20252
- reserveId: typeof entry === "number" ? entry : entry.reserveId,
20492
+ reserveId: rid,
20253
20493
  hub: (spokeEntry.hub ?? "").toLowerCase(),
20254
- underlying: (typeof entry === "object" ? entry.underlying ?? "" : "").toLowerCase()
20494
+ underlying
20255
20495
  });
20256
20496
  }
20257
20497
  }
@@ -20262,12 +20502,23 @@ var getAaveV4UserDataConverter = (lender, chainId, account, metaMap) => {
20262
20502
  return void 0;
20263
20503
  }
20264
20504
  const lendingPositions = {};
20505
+ const underlyingToUid = /* @__PURE__ */ new Map();
20506
+ if (metaMap) {
20507
+ for (const [uid, meta] of Object.entries(metaMap)) {
20508
+ const addr = (meta?.underlying ?? "").toLowerCase();
20509
+ if (addr) underlyingToUid.set(addr, uid);
20510
+ }
20511
+ }
20265
20512
  let totalDebt24h = 0;
20266
20513
  let totalDeposits24h = 0;
20267
20514
  for (let i = 0; i < reserveEntries.length; i++) {
20268
- const { hub, underlying } = reserveEntries[i];
20269
- const refAddress = `${hub}:${underlying}`;
20270
- const key = createMarketUid(chainId, lender, refAddress);
20515
+ const { hub, underlying, spokeAddr } = reserveEntries[i];
20516
+ let key;
20517
+ if (hub) {
20518
+ key = createMarketUid(chainId, lender, `${hub}:${underlying}`);
20519
+ } else {
20520
+ key = underlyingToUid.get(underlying) ?? createMarketUid(chainId, lender, `:${underlying}`);
20521
+ }
20271
20522
  const metaEntity = metaMap?.[key];
20272
20523
  if (!metaEntity) continue;
20273
20524
  const base = i * USER_CALLS_PER_RESERVE;
@@ -20278,6 +20529,11 @@ var getAaveV4UserDataConverter = (lender, chainId, account, metaMap) => {
20278
20529
  metaEntity
20279
20530
  );
20280
20531
  if (!dataForAsset) continue;
20532
+ const userPositionResult = data[base + 3];
20533
+ const userDynConfigKey = Number(
20534
+ userPositionResult?.dynamicConfigKey ?? 0
20535
+ );
20536
+ dataForAsset.userConfigKey = `${spokeAddr.toLowerCase()}:${userDynConfigKey}`;
20281
20537
  totalDebt24h += addedDebt;
20282
20538
  totalDeposits24h += addedDeposits;
20283
20539
  lendingPositions[key] = dataForAsset;
@@ -20286,10 +20542,8 @@ var getAaveV4UserDataConverter = (lender, chainId, account, metaMap) => {
20286
20542
  chainId,
20287
20543
  account,
20288
20544
  lendingPositions,
20289
- rewards: [],
20290
- userEMode: 0
20291
- };
20292
- const userData = createBaseTypeUserState(
20545
+ rewards: []};
20546
+ const userData = createAaveV4UserState(
20293
20547
  payload,
20294
20548
  metaMap,
20295
20549
  totalDeposits24h,
@@ -27381,34 +27635,18 @@ var yusdFetcher = {
27381
27635
  };
27382
27636
 
27383
27637
  // src/yields/intrinsic/fetchers/resolv.ts
27384
- var RLP_URL = "https://api.resolv.xyz/apr/rlp/7d";
27385
- var WSTUSR_URL = "https://api.resolv.xyz/apr/staking/7d";
27386
27638
  var rlp = "Resolv RLP::RLP";
27387
27639
  var wstusr = "Resolv wstUSR::WSTUSR";
27388
27640
  var rlpFetcher = {
27389
27641
  label: "RLP",
27390
27642
  fetch: async () => {
27391
- const res = await fetch(RLP_URL, {
27392
- method: "GET",
27393
- headers: {
27394
- Accept: "application/json",
27395
- "User-Agent": "1delta/yields"
27396
- }
27397
- }).then((r) => r.json());
27398
- return { [rlp]: Number(res?.value ?? 0) * 100 };
27643
+ return { [rlp]: 0 };
27399
27644
  }
27400
27645
  };
27401
27646
  var wstusrFetcher = {
27402
27647
  label: "WSTUSR",
27403
27648
  fetch: async () => {
27404
- const res = await fetch(WSTUSR_URL, {
27405
- method: "GET",
27406
- headers: {
27407
- Accept: "application/json",
27408
- "User-Agent": "1delta/yields"
27409
- }
27410
- }).then((r) => r.json());
27411
- return { [wstusr]: Number(res?.value ?? 0) * 100 };
27649
+ return { [wstusr]: 0 };
27412
27650
  }
27413
27651
  };
27414
27652
 
@@ -27625,7 +27863,7 @@ var susdxFetcher = {
27625
27863
  };
27626
27864
 
27627
27865
  // src/yields/intrinsic/fetchers/reserve.ts
27628
- var RTOKENS_URL = "https://yields.reserve.org/pools";
27866
+ var RTOKENS_URL = "https://yields.reserve.org";
27629
27867
  var hyUSD = "High Yield USD Base::HYUSD";
27630
27868
  var bsdETH = "Based ETH::BSDETH";
27631
27869
  var ethPlus = "ETHPlus::ETH+";
@@ -27638,18 +27876,18 @@ var rtokensFetcher = {
27638
27876
  label: "RTOKENS",
27639
27877
  fetch: async () => {
27640
27878
  const res = await fetch(RTOKENS_URL).then((r) => r.json());
27641
- const data = res.rtokens["8453"];
27642
- const dataMainnet = res.rtokens["1"];
27643
- const dataMainnetColalterals = res.collaterals["1"];
27879
+ const data = res?.rtokens?.["8453"];
27880
+ const dataMainnet = res?.rtokens?.["1"];
27881
+ const dataMainnetColalterals = res?.collaterals?.["1"];
27644
27882
  return {
27645
- [bsdETH]: apyToAprPercent(data.bsdETH / 100) * 100,
27646
- [hyUSD]: apyToAprPercent(data.hyUSD / 100) * 100,
27647
- [sfrxeth]: apyToAprPercent(dataMainnetColalterals.sfrxeth / 100) * 100,
27648
- [sfrax]: apyToAprPercent(dataMainnetColalterals.sfrax / 100) * 100,
27649
- [ceth]: apyToAprPercent(dataMainnetColalterals.ceth / 100) * 100,
27650
- [ethPlus]: apyToAprPercent(dataMainnet["ETH+"] / 100) * 100,
27651
- [usdThree]: apyToAprPercent(dataMainnet["USD3"] / 100) * 100,
27652
- [woEth]: apyToAprPercent(dataMainnetColalterals.woeth / 100) * 100
27883
+ [bsdETH]: apyToAprPercent((data?.bsdETH ?? 0) / 100) * 100,
27884
+ [hyUSD]: apyToAprPercent((data?.hyUSD ?? 0) / 100) * 100,
27885
+ [sfrxeth]: apyToAprPercent((dataMainnetColalterals?.sfrxeth ?? 0) / 100) * 100,
27886
+ [sfrax]: apyToAprPercent((dataMainnetColalterals?.sfrax ?? 0) / 100) * 100,
27887
+ [ceth]: apyToAprPercent((dataMainnetColalterals?.ceth ?? 0) / 100) * 100,
27888
+ [ethPlus]: apyToAprPercent((dataMainnet?.["ETH+"] ?? 0) / 100) * 100,
27889
+ [usdThree]: apyToAprPercent((dataMainnet?.["USD3"] ?? 0) / 100) * 100,
27890
+ [woEth]: apyToAprPercent((dataMainnetColalterals?.woeth ?? 0) / 100) * 100
27653
27891
  };
27654
27892
  }
27655
27893
  };