@1delta/margin-fetcher 0.0.214 → 0.0.216

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.d.ts CHANGED
@@ -13,7 +13,7 @@ export { computeEModeAnalysis } from './lending/margin/e-mode';
13
13
  export type { EModeResult, EModeAssets } from './lending/margin/e-mode';
14
14
  export type { LoopPostTradeMetrics, LendingMode } from './lending/margin/loop';
15
15
  export type { SumerPositionInput, GroupAccumulator, } from './lending/margin/base';
16
- export type { LenderYieldComplete, LenderCrossPoolMeta, LenderToLenderCrossPoolMeta, CompoundV2Metadata, AaveMetadata, InitMetadata, EulerV2Metadata, ProtocolParams, } from './lending/user-data/utils/types';
16
+ export type { LenderYieldComplete, LenderCrossPoolMeta, LenderToLenderCrossPoolMeta, CompoundV2Metadata, AaveMetadata, AaveV4Metadata, InitMetadata, EulerV2Metadata, ProtocolParams, } from './lending/user-data/utils/types';
17
17
  export { computeSumerWaterfall, buildSumerAccumulators, applyPositionDelta, } from './lending/margin/base/sumer/waterfall';
18
18
  export { computeSumerDepositDelta, computeSumerWithdrawDelta, computeSumerBorrowDelta, computeSumerRepayDelta, } from './lending/margin/base/sumer';
19
19
  export { fetchEulerSubAccountIndexes, getSubAccountAddress, getSubAccountIndex, } from './lending/user-data/euler/userCallBuild';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -17893,14 +17893,18 @@ var getEulerV2ReservesDataConverter = (lender, chainId, prices, additionalYields
17893
17893
  };
17894
17894
 
17895
17895
  // src/lending/public-data/aave-v4-type/publicCallBuild.ts
17896
- var CALLS_PER_RESERVE = 6;
17896
+ var BASE_CALLS_PER_RESERVE = 5;
17897
17897
  var CALLS_PER_SPOKE_TAIL = 2;
17898
- function hasValidOracle(oracle) {
17899
- return !!oracle && oracle !== "0x" && oracle.length > 2;
17898
+ function isValidAddress(addr) {
17899
+ return !!addr && addr !== "0x" && addr.length > 2;
17900
17900
  }
17901
17901
  function getSpokeReserves(reservesMap, spokeAddr) {
17902
17902
  return reservesMap[spokeAddr.toLowerCase()] ?? reservesMap[spokeAddr] ?? [];
17903
17903
  }
17904
+ function getDynamicConfigCount(spokeEntry) {
17905
+ const max = spokeEntry.dynamicConfigKeyMax ?? 0;
17906
+ return max + 1;
17907
+ }
17904
17908
  var buildAaveV4LenderReserveCall = (chainId, lender) => {
17905
17909
  const spokes = aaveV4Spokes()?.[lender]?.[chainId] ?? [];
17906
17910
  const reservesMap = aaveV4Reserves()?.[lender]?.[chainId] ?? {};
@@ -17909,8 +17913,10 @@ var buildAaveV4LenderReserveCall = (chainId, lender) => {
17909
17913
  const hubAssetKeys = /* @__PURE__ */ new Set();
17910
17914
  const hubAssetList = [];
17911
17915
  for (const spokeEntry of spokes) {
17916
+ if (!isValidAddress(spokeEntry.spoke)) continue;
17912
17917
  const spokeAddr = spokeEntry.spoke;
17913
17918
  const reserves = getSpokeReserves(reservesMap, spokeAddr);
17919
+ const dynConfigCount = getDynamicConfigCount(spokeEntry);
17914
17920
  for (const entry of reserves) {
17915
17921
  const rid = typeof entry === "number" ? entry : entry.reserveId;
17916
17922
  calls.push(
@@ -17938,19 +17944,22 @@ var buildAaveV4LenderReserveCall = (chainId, lender) => {
17938
17944
  address: spokeAddr,
17939
17945
  name: "getReserveTotalDebt",
17940
17946
  params: [rid]
17941
- },
17942
- {
17943
- address: spokeAddr,
17944
- name: "getDynamicReserveConfig",
17945
- params: [rid, 0]
17946
17947
  }
17947
17948
  );
17949
+ for (let key = 0; key < dynConfigCount; key++) {
17950
+ calls.push({
17951
+ address: spokeAddr,
17952
+ name: "getDynamicReserveConfig",
17953
+ params: [rid, key]
17954
+ });
17955
+ }
17948
17956
  if (typeof entry === "object" && spokeEntry.hub && entry.assetId !== void 0) {
17949
- const key = `${spokeEntry.hub}:${entry.assetId}`;
17957
+ const hubLc = spokeEntry.hub.toLowerCase();
17958
+ const key = `${hubLc}:${entry.assetId}`;
17950
17959
  if (!hubAssetKeys.has(key)) {
17951
17960
  hubAssetKeys.add(key);
17952
17961
  hubAssetList.push({
17953
- hub: spokeEntry.hub,
17962
+ hub: hubLc,
17954
17963
  assetId: entry.assetId
17955
17964
  });
17956
17965
  }
@@ -17970,6 +17979,7 @@ var buildAaveV4LenderReserveCall = (chainId, lender) => {
17970
17979
  );
17971
17980
  }
17972
17981
  for (const spokeEntry of spokes) {
17982
+ if (!isValidAddress(spokeEntry.spoke)) continue;
17973
17983
  const reserves = getSpokeReserves(
17974
17984
  reservesMap,
17975
17985
  spokeEntry.spoke
@@ -17977,7 +17987,7 @@ var buildAaveV4LenderReserveCall = (chainId, lender) => {
17977
17987
  const rids = reserves.map(
17978
17988
  (e) => typeof e === "number" ? e : e.reserveId
17979
17989
  );
17980
- if (rids.length > 0 && hasValidOracle(spokeEntry.oracle)) {
17990
+ if (rids.length > 0 && isValidAddress(spokeEntry.oracle)) {
17981
17991
  calls.push({
17982
17992
  address: spokeEntry.oracle,
17983
17993
  name: "getReservesPrices",
@@ -18012,20 +18022,24 @@ var getAaveV4ExpectedCallCount = (chainId, lender) => {
18012
18022
  let count = 0;
18013
18023
  const hubAssetKeys = /* @__PURE__ */ new Set();
18014
18024
  for (const spokeEntry of spokes) {
18025
+ if (!isValidAddress(spokeEntry.spoke)) continue;
18015
18026
  const reserves = getSpokeReserves(
18016
18027
  reservesMap,
18017
18028
  spokeEntry.spoke
18018
18029
  );
18019
- count += reserves.length * CALLS_PER_RESERVE + CALLS_PER_SPOKE_TAIL;
18030
+ const dynConfigCount = getDynamicConfigCount(spokeEntry);
18031
+ count += reserves.length * (BASE_CALLS_PER_RESERVE + dynConfigCount) + CALLS_PER_SPOKE_TAIL;
18020
18032
  const rids = reserves.map(
18021
18033
  (e) => typeof e === "number" ? e : e.reserveId
18022
18034
  );
18023
- if (rids.length > 0 && hasValidOracle(spokeEntry.oracle)) {
18035
+ if (rids.length > 0 && isValidAddress(spokeEntry.oracle)) {
18024
18036
  count += 1;
18025
18037
  }
18026
18038
  for (const entry of reserves) {
18027
18039
  if (typeof entry === "object" && spokeEntry.hub && entry.assetId !== void 0) {
18028
- hubAssetKeys.add(`${spokeEntry.hub}:${entry.assetId}`);
18040
+ hubAssetKeys.add(
18041
+ `${spokeEntry.hub.toLowerCase()}:${entry.assetId}`
18042
+ );
18029
18043
  }
18030
18044
  }
18031
18045
  }
@@ -18073,7 +18087,8 @@ function normalizeAaveV4(spokeDataList, chainId, lender, prices, additionalYield
18073
18087
  for (const reserve of spokeReserves) {
18074
18088
  const underlying = reserve.reserve.underlying.toLowerCase();
18075
18089
  const decimals = reserve.reserve.decimals;
18076
- const refAddress = `${spokeAddr}:${reserve.reserveId}`;
18090
+ const hubAddr = reserve.reserve.hub.toLowerCase();
18091
+ const refAddress = `${hubAddr}:${underlying}`;
18077
18092
  const marketUid = createMarketUidFn(chainId, lender, refAddress);
18078
18093
  const assetMeta = tokenList[underlying];
18079
18094
  const oracleKey = toOracleKeyFn(assetMeta?.assetGroup ?? null) ?? toGenericPriceKeyFn(underlying, chainId);
@@ -18183,8 +18198,8 @@ function normalizeAaveV4(spokeDataList, chainId, lender, prices, additionalYield
18183
18198
  }
18184
18199
 
18185
18200
  // src/lending/public-data/aave-v4-type/publicCallParse.ts
18186
- function hasValidOracle2(oracle) {
18187
- return !!oracle && oracle !== "0x" && oracle.length > 2;
18201
+ function isValidAddress2(addr) {
18202
+ return !!addr && addr !== "0x" && addr.length > 2;
18188
18203
  }
18189
18204
  function getSpokeReserves2(reservesMap, spokeAddr) {
18190
18205
  return reservesMap[spokeAddr.toLowerCase()] ?? reservesMap[spokeAddr] ?? [];
@@ -18200,20 +18215,38 @@ var getAaveV4ReservesDataConverter = (lender, chainId, prices, additionalYields,
18200
18215
  const hubAssetKeys = /* @__PURE__ */ new Set();
18201
18216
  const hubAssetList = [];
18202
18217
  for (const spokeEntry of spokes) {
18218
+ if (!isValidAddress2(spokeEntry.spoke)) continue;
18203
18219
  const spokeAddr = spokeEntry.spoke;
18204
18220
  const reserves = getSpokeReserves2(reservesMap, spokeAddr);
18205
- const reserveCount = reserves.length;
18221
+ const dynConfigCount = (spokeEntry.dynamicConfigKeyMax ?? 0) + 1;
18206
18222
  const parsedReserves = [];
18207
- for (let i = 0; i < reserveCount; i++) {
18223
+ for (let i = 0; i < reserves.length; i++) {
18208
18224
  const entry = reserves[i];
18209
18225
  const reserveId = typeof entry === "number" ? entry : entry.reserveId;
18210
- const baseIdx = offset + i * CALLS_PER_RESERVE;
18211
- const rawReserve = data[baseIdx];
18212
- const rawConfig = data[baseIdx + 1];
18213
- const rawSupplied = data[baseIdx + 2];
18214
- const rawDebt = data[baseIdx + 3];
18215
- const rawTotalDebt = data[baseIdx + 4];
18216
- const rawDynConfig = data[baseIdx + 5];
18226
+ const rawReserve = data[offset];
18227
+ const rawConfig = data[offset + 1];
18228
+ const rawSupplied = data[offset + 2];
18229
+ const rawDebt = data[offset + 3];
18230
+ const rawTotalDebt = data[offset + 4];
18231
+ offset += BASE_CALLS_PER_RESERVE;
18232
+ const dynamicConfigs = {};
18233
+ for (let key = 0; key < dynConfigCount; key++) {
18234
+ const rawDynConfig = data[offset];
18235
+ offset += 1;
18236
+ if (rawDynConfig && rawDynConfig !== "0x") {
18237
+ dynamicConfigs[key] = {
18238
+ collateralFactor: Number(
18239
+ rawDynConfig?.collateralFactor ?? 0
18240
+ ),
18241
+ maxLiquidationBonus: Number(
18242
+ rawDynConfig?.maxLiquidationBonus ?? 0
18243
+ ),
18244
+ liquidationFee: Number(
18245
+ rawDynConfig?.liquidationFee ?? 0
18246
+ )
18247
+ };
18248
+ }
18249
+ }
18217
18250
  const reserve = {
18218
18251
  underlying: rawReserve?.underlying ?? "",
18219
18252
  hub: rawReserve?.hub ?? "",
@@ -18242,26 +18275,13 @@ var getAaveV4ReservesDataConverter = (lender, chainId, prices, additionalYields,
18242
18275
  } else {
18243
18276
  drawnDebt = BigInt(rawDebt ?? 0);
18244
18277
  }
18245
- const dynamicConfigs = {};
18246
- if (rawDynConfig && rawDynConfig !== "0x") {
18247
- dynamicConfigs[0] = {
18248
- collateralFactor: Number(
18249
- rawDynConfig?.collateralFactor ?? 0
18250
- ),
18251
- maxLiquidationBonus: Number(
18252
- rawDynConfig?.maxLiquidationBonus ?? 0
18253
- ),
18254
- liquidationFee: Number(
18255
- rawDynConfig?.liquidationFee ?? 0
18256
- )
18257
- };
18258
- }
18259
18278
  if (spokeEntry.hub && typeof entry === "object" && entry.assetId !== void 0) {
18260
- const key = `${spokeEntry.hub}:${entry.assetId}`;
18279
+ const hubLc = spokeEntry.hub.toLowerCase();
18280
+ const key = `${hubLc}:${entry.assetId}`;
18261
18281
  if (!hubAssetKeys.has(key)) {
18262
18282
  hubAssetKeys.add(key);
18263
18283
  hubAssetList.push({
18264
- hub: spokeEntry.hub,
18284
+ hub: hubLc,
18265
18285
  assetId: entry.assetId
18266
18286
  });
18267
18287
  }
@@ -18279,7 +18299,6 @@ var getAaveV4ReservesDataConverter = (lender, chainId, prices, additionalYields,
18279
18299
  price: 0n
18280
18300
  });
18281
18301
  }
18282
- offset += reserveCount * CALLS_PER_RESERVE;
18283
18302
  const rawLiqConfig = data[offset];
18284
18303
  const rawOracle = data[offset + 1];
18285
18304
  offset += CALLS_PER_SPOKE_TAIL;
@@ -18303,23 +18322,19 @@ var getAaveV4ReservesDataConverter = (lender, chainId, prices, additionalYields,
18303
18322
  reserves: parsedReserves
18304
18323
  });
18305
18324
  }
18306
- for (let si = 0; si < spokes.length; si++) {
18307
- const reserves = getSpokeReserves2(
18308
- reservesMap,
18309
- spokes[si].spoke
18310
- );
18325
+ for (let si = 0; si < spokeDataList.length; si++) {
18326
+ const sd = spokeDataList[si];
18327
+ const reserves = getSpokeReserves2(reservesMap, sd.spoke);
18311
18328
  const rids = reserves.map(
18312
18329
  (e) => typeof e === "number" ? e : e.reserveId
18313
18330
  );
18314
- if (rids.length > 0 && hasValidOracle2(spokes[si].oracle)) {
18331
+ if (rids.length > 0 && isValidAddress2(sd.oracle)) {
18315
18332
  const rawPrices = data[offset];
18316
18333
  offset += 1;
18317
18334
  const priceArray = Array.isArray(rawPrices) ? rawPrices : [];
18318
- for (let ri = 0; ri < spokeDataList[si].reserves.length; ri++) {
18335
+ for (let ri = 0; ri < sd.reserves.length; ri++) {
18319
18336
  if (ri < priceArray.length) {
18320
- spokeDataList[si].reserves[ri].price = BigInt(
18321
- priceArray[ri] ?? 0
18322
- );
18337
+ sd.reserves[ri].price = BigInt(priceArray[ri] ?? 0);
18323
18338
  }
18324
18339
  }
18325
18340
  }
@@ -19039,7 +19054,7 @@ var buildEulerUserCall = async (chainId, lender, account, subAccountIndexes) =>
19039
19054
  };
19040
19055
 
19041
19056
  // src/lending/user-data/aave-v4-type/userCallBuild.ts
19042
- var USER_CALLS_PER_RESERVE = 3;
19057
+ var USER_CALLS_PER_RESERVE = 4;
19043
19058
  var buildAaveV4UserCall = (chainId, lender, account) => {
19044
19059
  const spokes = aaveV4Spokes()?.[lender]?.[chainId] ?? [];
19045
19060
  const reservesMap = aaveV4Reserves()?.[lender]?.[chainId] ?? {};
@@ -19047,6 +19062,7 @@ var buildAaveV4UserCall = (chainId, lender, account) => {
19047
19062
  const calls = [];
19048
19063
  for (const spokeEntry of spokes) {
19049
19064
  const spokeAddr = spokeEntry.spoke;
19065
+ if (!spokeAddr || spokeAddr === "0x" || spokeAddr.length <= 2) continue;
19050
19066
  const reserveIds = reservesMap[spokeAddr.toLowerCase()] ?? reservesMap[spokeAddr] ?? [];
19051
19067
  for (const entry of reserveIds) {
19052
19068
  const rid = typeof entry === "number" ? entry : entry.reserveId;
@@ -19065,6 +19081,11 @@ var buildAaveV4UserCall = (chainId, lender, account) => {
19065
19081
  address: spokeAddr,
19066
19082
  name: "getUserReserveStatus",
19067
19083
  params: [rid, account]
19084
+ },
19085
+ {
19086
+ address: spokeAddr,
19087
+ name: "getUserPosition",
19088
+ params: [rid, account]
19068
19089
  }
19069
19090
  );
19070
19091
  }
@@ -20233,17 +20254,231 @@ var getEulerUserDataConverter = (lender, chainId, account, metaMap, subAccountIn
20233
20254
  ];
20234
20255
  };
20235
20256
 
20257
+ // src/lending/user-data/aave-v4-type/createAaveV4UserState.ts
20258
+ function resolveV4Config(configs, userConfigKey) {
20259
+ if (!configs) return { config: void 0, spokeAddr: void 0 };
20260
+ if (userConfigKey && configs[userConfigKey]) {
20261
+ return {
20262
+ config: configs[userConfigKey],
20263
+ spokeAddr: userConfigKey.split(":")[0]
20264
+ };
20265
+ }
20266
+ const entries = Object.entries(configs);
20267
+ if (entries.length === 0) return { config: void 0, spokeAddr: void 0 };
20268
+ const [key, config] = entries[0];
20269
+ const spokeAddr = key.split(":")[0];
20270
+ return { config, spokeAddr };
20271
+ }
20272
+ function getConfigScopedPrice(meta, spokeAddr, configPriceMap) {
20273
+ return getOraclePrice(meta);
20274
+ }
20275
+ function createAaveV4UserState(payload, lenderData, totalDeposits24h = 0, totalDebt24h = 0, configPriceMap) {
20276
+ const assetKeys = getMarketUidsFromMeta(lenderData);
20277
+ const { chainId, account } = payload;
20278
+ let depositInterest = 0;
20279
+ let borrowInterest = 0;
20280
+ let rewardDepositAccrual = 0;
20281
+ let rewardBorrowAccrual = 0;
20282
+ let stakingDepositAccrual = 0;
20283
+ let stakingBorrowAccrual = 0;
20284
+ let deposits = 0;
20285
+ let debt = 0;
20286
+ let oracleDebt = 0;
20287
+ let collateral = 0;
20288
+ let borrowDiscountedCollateral = 0;
20289
+ let borrowDiscountedCollateralAllActive = 0;
20290
+ let collateralAllActive = 0;
20291
+ let rewardsPerAsset = {};
20292
+ for (const marketUid of assetKeys) {
20293
+ if (!lenderData?.[marketUid] || !payload.lendingPositions[marketUid])
20294
+ continue;
20295
+ const pos = payload.lendingPositions[marketUid];
20296
+ const { depositsUSD, debtStableUSD, debtUSD, collateralEnabled } = pos;
20297
+ const depositsUSDOracle = pos.depositsUSDOracle ?? depositsUSD;
20298
+ const debtUSDOracle = pos.debtUSDOracle ?? debtUSD;
20299
+ const {
20300
+ depositRate,
20301
+ intrinsicYield,
20302
+ variableBorrowRate,
20303
+ stableBorrowRate,
20304
+ rewards,
20305
+ flags,
20306
+ configs
20307
+ } = lenderData[marketUid];
20308
+ const { config: userConfigForAsset } = resolveV4Config(
20309
+ configs,
20310
+ pos.userConfigKey
20311
+ );
20312
+ deposits += depositsUSD;
20313
+ debt += debtUSD + (debtStableUSD ?? 0);
20314
+ oracleDebt += debtUSDOracle + (pos.debtStableUSDOracle ?? debtStableUSD ?? 0);
20315
+ (rewards ?? []).forEach((rewardData) => {
20316
+ const key = rewardData.asset;
20317
+ rewardDepositAccrual += rewardData.depositRate * depositsUSD;
20318
+ rewardBorrowAccrual += rewardData.variableBorrowRate * debtUSD;
20319
+ const rewDepo = rewardData.depositRate * depositsUSD;
20320
+ const rewDebt = rewardData.variableBorrowRate * debtUSD;
20321
+ if (!rewardsPerAsset[key])
20322
+ rewardsPerAsset[key] = { depositApr: 0, borrowApr: 0 };
20323
+ if (rewDepo > 0) rewardsPerAsset[key].depositApr += rewDepo;
20324
+ if (rewDebt > 0) rewardsPerAsset[key].borrowApr += rewDebt;
20325
+ });
20326
+ stakingDepositAccrual += (intrinsicYield ?? 0) * depositsUSD;
20327
+ stakingBorrowAccrual += (intrinsicYield ?? 0) * debtUSD;
20328
+ if (flags?.collateralActive || userConfigForAsset && !userConfigForAsset.collateralDisabled) {
20329
+ if (collateralEnabled) {
20330
+ collateral += (userConfigForAsset?.collateralFactor ?? 1) * depositsUSDOracle;
20331
+ borrowDiscountedCollateral += (userConfigForAsset?.borrowCollateralFactor ?? 1) * depositsUSDOracle;
20332
+ }
20333
+ borrowDiscountedCollateralAllActive += (userConfigForAsset?.borrowCollateralFactor ?? 1) * depositsUSDOracle;
20334
+ collateralAllActive += (userConfigForAsset?.collateralFactor ?? 1) * depositsUSDOracle;
20335
+ }
20336
+ depositInterest += (depositRate ?? 0) * depositsUSD;
20337
+ borrowInterest += debtUSD * (variableBorrowRate ?? 0) + (debtStableUSD ?? 0) * (stableBorrowRate ?? 0);
20338
+ }
20339
+ const nav = deposits - debt;
20340
+ const balanceData2 = {
20341
+ borrowDiscountedCollateral,
20342
+ borrowDiscountedCollateralAllActive,
20343
+ collateral,
20344
+ collateralAllActive,
20345
+ deposits,
20346
+ debt,
20347
+ adjustedDebt: oracleDebt,
20348
+ nav,
20349
+ deposits24h: totalDeposits24h,
20350
+ debt24h: totalDebt24h,
20351
+ nav24h: totalDeposits24h - totalDebt24h,
20352
+ ...payload.rewards ? { rewards: payload.rewards } : {}
20353
+ };
20354
+ const aprData2 = {
20355
+ apr: safeDivide(depositInterest - borrowInterest, nav),
20356
+ borrowApr: safeDivide(borrowInterest, debt),
20357
+ depositApr: safeDivide(depositInterest, deposits),
20358
+ rewards: divideAccrualsToAprs(rewardsPerAsset, nav, deposits, debt),
20359
+ rewardApr: safeDivide(rewardDepositAccrual + rewardBorrowAccrual, nav),
20360
+ rewardDepositApr: safeDivide(rewardDepositAccrual, deposits),
20361
+ rewardBorrowApr: safeDivide(rewardBorrowAccrual, debt),
20362
+ intrinsicApr: safeDivide(stakingDepositAccrual - stakingBorrowAccrual, nav),
20363
+ intrinsicDepositApr: safeDivide(stakingDepositAccrual, deposits),
20364
+ intrinsicBorrowApr: safeDivide(stakingBorrowAccrual, debt)
20365
+ };
20366
+ const userConfig = {
20367
+ selectedMode: "0",
20368
+ id: account,
20369
+ isWhitelisted: true
20370
+ };
20371
+ const creditLine = Math.max(
20372
+ 0,
20373
+ borrowDiscountedCollateral - balanceData2.adjustedDebt
20374
+ );
20375
+ for (const marketUid of assetKeys) {
20376
+ if (!lenderData?.[marketUid]) continue;
20377
+ const meta = lenderData[marketUid];
20378
+ const { configs, flags, borrowLiquidity, withdrawLiquidity } = meta;
20379
+ const pos = payload.lendingPositions[marketUid];
20380
+ const { config, spokeAddr } = resolveV4Config(
20381
+ configs,
20382
+ pos ? pos.userConfigKey : void 0
20383
+ );
20384
+ const price = getConfigScopedPrice(meta);
20385
+ const bcf = config?.borrowCollateralFactor ?? 1;
20386
+ const bf = config?.borrowFactor ?? 1;
20387
+ if (pos) {
20388
+ let withdrawable;
20389
+ if (!pos.collateralEnabled || config?.collateralDisabled) {
20390
+ withdrawable = String(pos.deposits);
20391
+ } else if (balanceData2.debt === 0) {
20392
+ withdrawable = String(pos.deposits);
20393
+ } else {
20394
+ const withdrawableUSD = Math.max(creditLine / bcf, 0);
20395
+ withdrawable = String(
20396
+ Math.min(withdrawableUSD / price, Number(pos.deposits))
20397
+ );
20398
+ }
20399
+ if (withdrawLiquidity != null) {
20400
+ withdrawable = String(Math.min(Number(withdrawable), withdrawLiquidity));
20401
+ }
20402
+ let borrowable;
20403
+ if (!flags?.borrowingEnabled || flags?.isFrozen || config?.debtDisabled) {
20404
+ borrowable = "0";
20405
+ } else {
20406
+ const borrowableUSD = Math.max(creditLine / bf, 0);
20407
+ borrowable = String(borrowableUSD / price);
20408
+ }
20409
+ if (borrowLiquidity != null) {
20410
+ borrowable = String(Math.min(Number(borrowable), borrowLiquidity));
20411
+ }
20412
+ pos.withdrawable = withdrawable;
20413
+ pos.borrowable = borrowable;
20414
+ pos.underlyingInfo = buildUnderlyingInfo(meta);
20415
+ } else if ((deposits > 0 || debt > 0) && flags?.borrowingEnabled && !flags?.isFrozen && !config?.debtDisabled) {
20416
+ let borrowable = String(Math.max(creditLine / bf, 0) / price);
20417
+ if (borrowLiquidity != null) {
20418
+ borrowable = String(Math.min(Number(borrowable), borrowLiquidity));
20419
+ }
20420
+ payload.lendingPositions[marketUid] = {
20421
+ marketUid,
20422
+ deposits: "0",
20423
+ debt: "0",
20424
+ debtStable: "0",
20425
+ depositsUSD: 0,
20426
+ debtUSD: 0,
20427
+ debtStableUSD: 0,
20428
+ collateralEnabled: false,
20429
+ claimableRewards: 0,
20430
+ withdrawable: "0",
20431
+ borrowable,
20432
+ underlyingInfo: buildUnderlyingInfo(meta)
20433
+ };
20434
+ }
20435
+ }
20436
+ return {
20437
+ lender: "",
20438
+ account,
20439
+ chainId,
20440
+ data: [
20441
+ {
20442
+ health: balanceData2.debt === 0 ? null : balanceData2.adjustedDebt > 0 ? balanceData2.collateral / balanceData2.adjustedDebt : balanceData2.collateral / balanceData2.debt,
20443
+ borrowCapacityUSD: creditLine,
20444
+ accountId: "0",
20445
+ balanceData: balanceData2,
20446
+ aprData: aprData2,
20447
+ userConfig,
20448
+ positions: Object.values(payload.lendingPositions)
20449
+ }
20450
+ ]
20451
+ };
20452
+ }
20453
+
20236
20454
  // src/lending/user-data/aave-v4-type/userCallParse.ts
20237
20455
  var getAaveV4UserDataConverter = (lender, chainId, account, metaMap) => {
20238
20456
  const spokes = aaveV4Spokes()?.[lender]?.[chainId] ?? [];
20239
20457
  const reservesMap = aaveV4Reserves()?.[lender]?.[chainId] ?? {};
20458
+ const oracleEntries = aaveV4Oracles()?.[lender]?.[chainId] ?? [];
20459
+ const spokeReserveToUnderlying = /* @__PURE__ */ new Map();
20460
+ for (const oe of oracleEntries) {
20461
+ if (oe.underlying && oe.spoke) {
20462
+ spokeReserveToUnderlying.set(
20463
+ `${oe.spoke.toLowerCase()}:${oe.reserveId}`,
20464
+ oe.underlying.toLowerCase()
20465
+ );
20466
+ }
20467
+ }
20240
20468
  const reserveEntries = [];
20241
20469
  for (const spokeEntry of spokes) {
20242
20470
  const spokeAddr = spokeEntry.spoke;
20243
- const reserveIds = reservesMap[spokeAddr.toLowerCase()] ?? reservesMap[spokeAddr] ?? [];
20244
- for (const entry of reserveIds) {
20471
+ if (!spokeAddr || spokeAddr === "0x" || spokeAddr.length <= 2) continue;
20472
+ const reserves = reservesMap[spokeAddr.toLowerCase()] ?? reservesMap[spokeAddr] ?? [];
20473
+ for (const entry of reserves) {
20245
20474
  const rid = typeof entry === "number" ? entry : entry.reserveId;
20246
- reserveEntries.push({ spokeAddr, reserveId: rid });
20475
+ const underlying = ((typeof entry === "object" ? entry.underlying : void 0) ?? spokeReserveToUnderlying.get(`${spokeAddr.toLowerCase()}:${rid}`) ?? "").toLowerCase();
20476
+ reserveEntries.push({
20477
+ spokeAddr,
20478
+ reserveId: rid,
20479
+ hub: (spokeEntry.hub ?? "").toLowerCase(),
20480
+ underlying
20481
+ });
20247
20482
  }
20248
20483
  }
20249
20484
  const expectedNumberOfCalls = reserveEntries.length * USER_CALLS_PER_RESERVE;
@@ -20253,12 +20488,23 @@ var getAaveV4UserDataConverter = (lender, chainId, account, metaMap) => {
20253
20488
  return void 0;
20254
20489
  }
20255
20490
  const lendingPositions = {};
20491
+ const underlyingToUid = /* @__PURE__ */ new Map();
20492
+ if (metaMap) {
20493
+ for (const [uid, meta] of Object.entries(metaMap)) {
20494
+ const addr = (meta?.underlying ?? "").toLowerCase();
20495
+ if (addr) underlyingToUid.set(addr, uid);
20496
+ }
20497
+ }
20256
20498
  let totalDebt24h = 0;
20257
20499
  let totalDeposits24h = 0;
20258
20500
  for (let i = 0; i < reserveEntries.length; i++) {
20259
- const { spokeAddr, reserveId } = reserveEntries[i];
20260
- const refAddress = `${spokeAddr.toLowerCase()}:${reserveId}`;
20261
- const key = createMarketUid(chainId, lender, refAddress);
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
+ }
20262
20508
  const metaEntity = metaMap?.[key];
20263
20509
  if (!metaEntity) continue;
20264
20510
  const base = i * USER_CALLS_PER_RESERVE;
@@ -20269,6 +20515,11 @@ var getAaveV4UserDataConverter = (lender, chainId, account, metaMap) => {
20269
20515
  metaEntity
20270
20516
  );
20271
20517
  if (!dataForAsset) continue;
20518
+ const userPositionResult = data[base + 3];
20519
+ const userDynConfigKey = Number(
20520
+ userPositionResult?.dynamicConfigKey ?? 0
20521
+ );
20522
+ dataForAsset.userConfigKey = `${spokeAddr.toLowerCase()}:${userDynConfigKey}`;
20272
20523
  totalDebt24h += addedDebt;
20273
20524
  totalDeposits24h += addedDeposits;
20274
20525
  lendingPositions[key] = dataForAsset;
@@ -20277,10 +20528,8 @@ var getAaveV4UserDataConverter = (lender, chainId, account, metaMap) => {
20277
20528
  chainId,
20278
20529
  account,
20279
20530
  lendingPositions,
20280
- rewards: [],
20281
- userEMode: 0
20282
- };
20283
- const userData = createBaseTypeUserState(
20531
+ rewards: []};
20532
+ const userData = createAaveV4UserState(
20284
20533
  payload,
20285
20534
  metaMap,
20286
20535
  totalDeposits24h,
@@ -31877,10 +32126,15 @@ var eulerV2Fetcher = {
31877
32126
  };
31878
32127
  function getAaveV4OracleGroups(chainId) {
31879
32128
  const oracles = aaveV4Oracles() ?? {};
32129
+ const spokes = aaveV4Spokes() ?? {};
31880
32130
  const groups = [];
31881
32131
  for (const [fork, chains] of Object.entries(oracles)) {
31882
32132
  const oracleEntries = chains[chainId] ?? [];
31883
32133
  if (oracleEntries.length === 0) continue;
32134
+ const spokeToHub = /* @__PURE__ */ new Map();
32135
+ for (const s of spokes[fork]?.[chainId] ?? []) {
32136
+ if (s.hub) spokeToHub.set(s.spoke.toLowerCase(), s.hub.toLowerCase());
32137
+ }
31884
32138
  const byOracle = /* @__PURE__ */ new Map();
31885
32139
  for (const entry of oracleEntries) {
31886
32140
  if (!entry.oracle || entry.oracle === "0x") continue;
@@ -31890,10 +32144,13 @@ function getAaveV4OracleGroups(chainId) {
31890
32144
  group = { decimals: entry.decimals ?? 8, entries: [] };
31891
32145
  byOracle.set(key, group);
31892
32146
  }
32147
+ const spokeLc = entry.spoke.toLowerCase();
32148
+ const hub = spokeToHub.get(spokeLc) ?? "";
31893
32149
  group.entries.push({
31894
32150
  underlying: entry.underlying.toLowerCase(),
31895
- spoke: entry.spoke.toLowerCase(),
31896
- reserveId: entry.reserveId
32151
+ hub,
32152
+ reserveId: entry.reserveId,
32153
+ spoke: spokeLc
31897
32154
  });
31898
32155
  }
31899
32156
  for (const [oracle, group] of byOracle) {
@@ -31948,8 +32205,9 @@ function parseAaveV4Results(data, meta, context) {
31948
32205
  marketUid: createMarketUid(
31949
32206
  chainId,
31950
32207
  meta.fork,
31951
- `${entry.spoke}:${entry.reserveId}`
31952
- )
32208
+ `${entry.hub}:${entry.underlying}`
32209
+ ),
32210
+ configId: entry.spoke
31953
32211
  });
31954
32212
  } catch {
31955
32213
  continue;