@1delta/margin-fetcher 0.0.170 → 0.0.171

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/dist/abis/euler/accountLens.d.ts +191 -0
  2. package/dist/abis/euler/accountLens.d.ts.map +1 -0
  3. package/dist/abis/euler/eVault.d.ts +206 -0
  4. package/dist/abis/euler/eVault.d.ts.map +1 -0
  5. package/dist/abis/euler/evc.d.ts +81 -0
  6. package/dist/abis/euler/evc.d.ts.map +1 -0
  7. package/dist/abis/euler/genericFactory.d.ts +26 -0
  8. package/dist/abis/euler/genericFactory.d.ts.map +1 -0
  9. package/dist/abis/euler/index.d.ts +7 -0
  10. package/dist/abis/euler/index.d.ts.map +1 -0
  11. package/dist/abis/euler/payments.d.ts +140 -0
  12. package/dist/abis/euler/payments.d.ts.map +1 -0
  13. package/dist/abis/euler/swapper.d.ts +143 -0
  14. package/dist/abis/euler/swapper.d.ts.map +1 -0
  15. package/dist/abis/euler/vaultLens.d.ts +336 -0
  16. package/dist/abis/euler/vaultLens.d.ts.map +1 -0
  17. package/dist/index.js +1306 -137
  18. package/dist/index.js.map +1 -1
  19. package/dist/lending/margin/base/borrow.d.ts +1 -1
  20. package/dist/lending/margin/base/deposit.d.ts +1 -1
  21. package/dist/lending/margin/base/repay.d.ts +1 -1
  22. package/dist/lending/margin/base/standard/borrow.d.ts +1 -1
  23. package/dist/lending/margin/base/standard/deposit.d.ts +1 -1
  24. package/dist/lending/margin/base/standard/repay.d.ts +1 -1
  25. package/dist/lending/margin/base/standard/withdraw.d.ts +1 -1
  26. package/dist/lending/margin/base/utils.d.ts +1 -1
  27. package/dist/lending/margin/base/withdraw.d.ts +1 -1
  28. package/dist/lending/margin/base/yield/getRewardYieldChange.d.ts +0 -4
  29. package/dist/lending/margin/base/yield/getRewardYieldChange.d.ts.map +1 -1
  30. package/dist/lending/margin/e-mode/index.d.ts.map +1 -1
  31. package/dist/lending/margin/loop/types.d.ts +3 -3
  32. package/dist/lending/margin/loop/types.d.ts.map +1 -1
  33. package/dist/lending/margin/loop/utils.d.ts +4 -0
  34. package/dist/lending/margin/loop/utils.d.ts.map +1 -1
  35. package/dist/lending/public-data/aave-v2-type/publicCallBuild.d.ts.map +1 -1
  36. package/dist/lending/public-data/aave-v2-type/publicCallParse.d.ts.map +1 -1
  37. package/dist/lending/public-data/compound-v2/convert/benqi.d.ts +1 -1
  38. package/dist/lending/public-data/compound-v2/convert/standard.d.ts +1 -1
  39. package/dist/lending/public-data/compound-v2/convert/sumer.d.ts +1 -1
  40. package/dist/lending/public-data/compound-v2/convert/takara.d.ts +1 -1
  41. package/dist/lending/public-data/compound-v2/convert/tectonic.d.ts +1 -1
  42. package/dist/lending/public-data/compound-v3/publicCallParse.d.ts.map +1 -1
  43. package/dist/lending/public-data/euler/fetcher/cluster.d.ts +21 -0
  44. package/dist/lending/public-data/euler/fetcher/cluster.d.ts.map +1 -0
  45. package/dist/lending/public-data/euler/fetcher/constants.d.ts +29 -0
  46. package/dist/lending/public-data/euler/fetcher/constants.d.ts.map +1 -0
  47. package/dist/lending/public-data/euler/fetcher/normalize.d.ts +171 -0
  48. package/dist/lending/public-data/euler/fetcher/normalize.d.ts.map +1 -0
  49. package/dist/lending/public-data/euler/fetcher/types.d.ts +113 -0
  50. package/dist/lending/public-data/euler/fetcher/types.d.ts.map +1 -0
  51. package/dist/lending/public-data/euler/publicCallBuild.d.ts +335 -0
  52. package/dist/lending/public-data/euler/publicCallBuild.d.ts.map +1 -0
  53. package/dist/lending/public-data/euler/publicCallParse.d.ts +9 -0
  54. package/dist/lending/public-data/euler/publicCallParse.d.ts.map +1 -0
  55. package/dist/lending/public-data/fetchLender.d.ts.map +1 -1
  56. package/dist/lending/public-data/morpho/convertPublic.d.ts.map +1 -1
  57. package/dist/lending/public-data/morpho/fetchPublic.d.ts.map +1 -1
  58. package/dist/lending/public-data/morpho/getMarketsFromChain.d.ts.map +1 -1
  59. package/dist/lending/user-data/abis.d.ts +1 -10437
  60. package/dist/lending/user-data/abis.d.ts.map +1 -1
  61. package/dist/lending/user-data/euler/userCallBuild.d.ts +22 -0
  62. package/dist/lending/user-data/euler/userCallBuild.d.ts.map +1 -0
  63. package/dist/lending/user-data/euler/userCallParse.d.ts +10 -0
  64. package/dist/lending/user-data/euler/userCallParse.d.ts.map +1 -0
  65. package/dist/lending/user-data/fetch-balances/parse.d.ts.map +1 -1
  66. package/dist/lending/user-data/fetch-balances/prepare.d.ts.map +1 -1
  67. package/dist/lending/user-data/fetch-balances/types.d.ts +1 -1
  68. package/dist/lending/user-data/utils/createEulerMultiAccountTypeUserState.d.ts +51 -0
  69. package/dist/lending/user-data/utils/createEulerMultiAccountTypeUserState.d.ts.map +1 -0
  70. package/dist/lending/user-data/utils/createGeneralUserState.d.ts.map +1 -1
  71. package/dist/lending/user-data/utils/createSumerUserState.d.ts.map +1 -1
  72. package/dist/lending/user-data/utils/types.d.ts +2 -1
  73. package/dist/lending/user-data/utils/types.d.ts.map +1 -1
  74. package/dist/lending-pairs/computeLendingPairs.d.ts.map +1 -1
  75. package/dist/prices/oracle-prices/fetchOraclePrices.d.ts.map +1 -1
  76. package/dist/prices/oracle-prices/fetchers/euler.d.ts +363 -0
  77. package/dist/prices/oracle-prices/fetchers/euler.d.ts.map +1 -0
  78. package/dist/prices/oracle-prices/fetchers/index.d.ts +1 -0
  79. package/dist/prices/oracle-prices/fetchers/index.d.ts.map +1 -1
  80. package/dist/types/apiReturnType.d.ts +6 -2
  81. package/dist/types/apiReturnType.d.ts.map +1 -1
  82. package/dist/types/lender/aave-v2-types.d.ts +2 -2
  83. package/dist/types/lender/aave-v2-types.d.ts.map +1 -1
  84. package/dist/types/lender/aave-v3-types.d.ts +5 -1
  85. package/dist/types/lender/aave-v3-types.d.ts.map +1 -1
  86. package/dist/types/lender/compound-v2-types.d.ts +2 -2
  87. package/dist/types/lender/compound-v2-types.d.ts.map +1 -1
  88. package/dist/types/lender/compound-v3-types.d.ts +2 -2
  89. package/dist/types/lender/compound-v3-types.d.ts.map +1 -1
  90. package/dist/types/lender/init-types.d.ts +2 -2
  91. package/dist/types/lender/init-types.d.ts.map +1 -1
  92. package/dist/types/lender/morpho-types.d.ts +7 -6
  93. package/dist/types/lender/morpho-types.d.ts.map +1 -1
  94. package/dist/types/lenderTypes.d.ts +4 -4
  95. package/dist/types/lenderTypes.d.ts.map +1 -1
  96. package/dist/utils/index.d.ts +2 -1
  97. package/dist/utils/index.d.ts.map +1 -1
  98. package/dist/yields/intrinsic/fetchers/usdx.d.ts +1 -0
  99. package/dist/yields/intrinsic/fetchers/usdx.d.ts.map +1 -1
  100. package/package.json +6 -6
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { parseAbi, formatEther, BaseError, encodeFunctionData, formatUnits, decodeFunctionResult, decodeAbiParameters, AbiEncodingLengthMismatchError, concatHex, isAddress, InvalidAddressError, pad, stringToHex, boolToHex, integerRegex, numberToHex, bytesRegex, BytesSizeMismatchError, arrayRegex, UnsupportedPackedAbiType } from './chunk-ZVIJSUIM.js';
2
2
  import './chunk-BYTNVMX7.js';
3
3
  import './chunk-PR4QN5HX.js';
4
- import { Lender, isAaveType, isCompoundV3, isMultiMarket, isInit, isCompoundV2Type, isVenusType, isMorphoType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isYLDR, isCompoundV3Type, isTectonicType, isBenqiType, isLista } from '@1delta/lender-registry';
4
+ import { Lender, isAaveType, isCompoundV3, isMultiMarket, isInit, isCompoundV2Type, isVenusType, isMorphoType, isSumerType, AAVE_V3_LENDERS, AAVE_V2_LENDERS, isAaveV2Type, isAaveV32Type, isAaveV3Type, isEulerType, isYLDR, isCompoundV3Type, isTectonicType, isBenqiType, isLista } from '@1delta/lender-registry';
5
5
  export { isAaveType, isAaveV2Type, isAaveV32Type, isAaveV3Type, isCompoundV3, isCompoundV3Type, isInit, isMorphoType, isMultiMarket, isYLDR } from '@1delta/lender-registry';
6
6
  import lodash from 'lodash';
7
7
  import { getEvmChain, multicallRetry, getEvmClient, getEvmClientUniversal } from '@1delta/providers';
@@ -6271,7 +6271,9 @@ globalThis[GLOBAL_LENDER_DATA_KEY] = {
6271
6271
  aaveWethGateway: {},
6272
6272
  morphoBundler3: {},
6273
6273
  listaNativeProvider: {},
6274
- compoundV3Bulker: {}
6274
+ compoundV3Bulker: {},
6275
+ eulerConfigs: {},
6276
+ eulerVaults: {}
6275
6277
  };
6276
6278
  function getGlobalData2() {
6277
6279
  return globalThis[GLOBAL_LENDER_DATA_KEY];
@@ -6293,6 +6295,8 @@ var compoundV2Pools = () => getGlobalData2()?.compoundV2Pools;
6293
6295
  var compoundV2Tokens = () => getGlobalData2()?.compoundV2Tokens;
6294
6296
  var compoundV2TokenArray = () => getGlobalData2()?.compoundV2TokenArray;
6295
6297
  var initConfig = () => getGlobalData2()?.initConfig;
6298
+ var eulerConfigs = () => getGlobalData2()?.eulerConfigs;
6299
+ var eulerVaults = () => getGlobalData2()?.eulerVaults;
6296
6300
  var getListUrl = (chainId) => `https://raw.githubusercontent.com/1delta-DAO/token-lists/main/${chainId}.json`;
6297
6301
  async function fetchTokenList(chainId) {
6298
6302
  const data = await fetch(getListUrl(chainId));
@@ -7441,6 +7445,9 @@ var ENABLED_COMPOUNDS = [
7441
7445
  var DISABLED_COMPOUNDS = {
7442
7446
  [Chain.ETHEREUM_MAINNET]: [Lender.CREAM_FINANCE]
7443
7447
  };
7448
+ var ENABLED_EULER_V2_CHAINS = [
7449
+ Chain.BNB_SMART_CHAIN_MAINNET
7450
+ ];
7444
7451
  var getLendersForChain = (c) => {
7445
7452
  let lenders = [];
7446
7453
  Object.entries(aavePools() ?? {}).forEach(([l, data]) => {
@@ -7462,6 +7469,11 @@ var getLendersForChain = (c) => {
7462
7469
  if (!DISABLED_COMPOUNDS[c]?.includes(l) && chains.includes(c) && ENABLED_COMPOUNDS.includes(l))
7463
7470
  lenders.push(l);
7464
7471
  });
7472
+ if (ENABLED_EULER_V2_CHAINS.includes(c)) {
7473
+ Object.entries(eulerVaults() ?? {}).forEach(([l, data]) => {
7474
+ if (data[c]?.length > 0) lenders.push(l);
7475
+ });
7476
+ }
7465
7477
  return lenders;
7466
7478
  };
7467
7479
  var filterLendersByProtocol = (allLenders, protocolList) => {
@@ -8108,13 +8120,14 @@ var getAaveV2ReservesDataConverter = (lender, chainId, prices, additionalYields,
8108
8120
  ),
8109
8121
  intrinsicYield: additionalYields?.intrinsicYields[oracleKey] ?? 0,
8110
8122
  // rewards
8111
- rewards: lender === Lender.MERIDIAN && chainId === Chain.TAIKO_ALETHIA && additionalYields?.lenderRewards ? {
8112
- TAIKO: {
8123
+ rewards: lender === Lender.MERIDIAN && chainId === Chain.TAIKO_ALETHIA && additionalYields?.lenderRewards ? [
8124
+ {
8125
+ asset: "0xa9d23408b9ba935c230493c40c73824df71a0975",
8113
8126
  depositRate: additionalYields?.lenderRewards[Lender.MERIDIAN]?.[asset]?.deposit ?? 0,
8114
8127
  variableBorrowRate: additionalYields?.lenderRewards[Lender.MERIDIAN]?.[asset]?.borrow ?? 0,
8115
8128
  stableBorrowRate: 0
8116
8129
  }
8117
- } : {},
8130
+ ] : [],
8118
8131
  decimals: Number(
8119
8132
  configData?.[0 /* decimals */]
8120
8133
  ),
@@ -8266,9 +8279,9 @@ var getAaveV3ReservesDataConverter = (lender, chainId, prices, additionalYields,
8266
8279
  stableBorrowRate: formatAaveRawApyToApr(
8267
8280
  reserveData?.[7 /* stableBorrowRate */]?.toString()
8268
8281
  ),
8269
- intrinsicYield: additionalYields.intrinsicYields[toOracleKey(assetMeta?.assetGroup)] ?? 0,
8282
+ intrinsicYield: additionalYields?.intrinsicYields?.[toOracleKey(assetMeta?.assetGroup)] ?? 0,
8270
8283
  // rewards
8271
- rewards: {}
8284
+ rewards: []
8272
8285
  };
8273
8286
  const eModeCategory = Number(reserveEMode?.toString());
8274
8287
  resultReserves[marketUid] = {
@@ -8468,9 +8481,9 @@ function parseYLDRCall(chainId, lender, additionalYields, prices, tokenList) {
8468
8481
  reserveData?.[4 /* variableBorrowRate */]?.toString()
8469
8482
  ),
8470
8483
  stableBorrowRate: 0,
8471
- intrinsicYield: additionalYields.intrinsicYields[oracleKey] ?? 0,
8484
+ intrinsicYield: additionalYields?.intrinsicYields?.[oracleKey] ?? 0,
8472
8485
  // rewards
8473
- rewards: {},
8486
+ rewards: [],
8474
8487
  decimals: Number(
8475
8488
  configData?.[0 /* decimals */]
8476
8489
  ),
@@ -8607,9 +8620,9 @@ function parseAave32(chainId, lender, prices, additionalYields, tokenList) {
8607
8620
  stableBorrowRate: formatAaveRawApyToApr(
8608
8621
  reserveData?.[7 /* stableBorrowRate */]?.toString()
8609
8622
  ),
8610
- intrinsicYield: additionalYields.intrinsicYields[toOracleKey(assetMeta?.assetGroup)] ?? 0,
8623
+ intrinsicYield: additionalYields?.intrinsicYields?.[toOracleKey(assetMeta?.assetGroup)] ?? 0,
8611
8624
  // rewards
8612
- rewards: {}
8625
+ rewards: []
8613
8626
  };
8614
8627
  const assetIndex = lowerReservesList.indexOf(asset);
8615
8628
  const usageAsCollateralEnabled = configData?.[5 /* usageAsCollateralEnabled */];
@@ -8737,8 +8750,8 @@ var getInitReservesDataConverter = (lender, chainId, prices, additionalYields, t
8737
8750
  ),
8738
8751
  stableBorrowRate: 0,
8739
8752
  collateralActive: true,
8740
- intrinsicYield: additionalYields.intrinsicYields[oracleKey] ?? 0,
8741
- rewards: {},
8753
+ intrinsicYield: additionalYields?.intrinsicYields?.[oracleKey] ?? 0,
8754
+ rewards: [],
8742
8755
  config: {},
8743
8756
  borrowingEnabled: totalDebt !== "0",
8744
8757
  params
@@ -8795,6 +8808,16 @@ var getInitReservesDataConverter = (lender, chainId, prices, additionalYields, t
8795
8808
  var COMET_RISK_DECIMALS = 18;
8796
8809
  var SECONDS_PER_DAY = 3600 * 24;
8797
8810
  var DAYS_IN_YEAR = 365;
8811
+ var COMP_ADDRESSES = {
8812
+ "1": "0xc00e94cb662c3520282e6f5717214004a7f26888",
8813
+ "10": "0x7e7d4467112689329f7e06571ed0e8cbad4910ee",
8814
+ "130": "0xdf78e4f0a8279942ca68046476919a90f2288656",
8815
+ "137": "0x8505b9d2254a7ae468c0e9dd10ccea3a837aef5c",
8816
+ "5000": "0x52b7d8851d6ccbc6342ba0855be65f7b82a3f17f",
8817
+ "8453": "0x9e1028f5f1d5ede59748ffcee5532509976840e0",
8818
+ "42161": "0x354a6da3fcde098f8389cad84b0182725c6c91de",
8819
+ "534352": "0x643e160a3c3e2b7eae198f0beb1bfd2441450e86"
8820
+ };
8798
8821
  var getCompoundV3ReservesDataConverter = (lender, chainId, prices, additionalYields, tokenList = {}) => {
8799
8822
  const assetsToQuery = getCompoundV3Assets(chainId, lender);
8800
8823
  const baseAssetData = getCompoundV3BaseAsset(lender, chainId);
@@ -8849,7 +8872,7 @@ var getCompoundV3ReservesDataConverter = (lender, chainId, prices, additionalYie
8849
8872
  variableBorrowRate: 0,
8850
8873
  stableBorrowRate: 0,
8851
8874
  depositRate: 0,
8852
- intrinsicYield: additionalYields.intrinsicYields[oracleKey] ?? 0,
8875
+ intrinsicYield: additionalYields?.intrinsicYields?.[oracleKey] ?? 0,
8853
8876
  utilization: 0,
8854
8877
  // debt and liquidity are zero
8855
8878
  totalDebt: 0,
@@ -8860,7 +8883,7 @@ var getCompoundV3ReservesDataConverter = (lender, chainId, prices, additionalYie
8860
8883
  totalDeposits: totals,
8861
8884
  totalDepositsUSD: totalUsd,
8862
8885
  // rewards
8863
- rewards: {},
8886
+ rewards: [],
8864
8887
  collateralActive: true,
8865
8888
  isActive: true,
8866
8889
  isFrozen: false,
@@ -8887,7 +8910,11 @@ var getCompoundV3ReservesDataConverter = (lender, chainId, prices, additionalYie
8887
8910
  const price = prices[oracleKeyBase] ?? 1;
8888
8911
  const liquidity = Number(resultsSupply) - Number(resultsBorrow);
8889
8912
  const compPrice = prices["COMP"];
8890
- const baseMarketUid = createMarketUid(chainId, lender, baseAssetData.baseAsset);
8913
+ const baseMarketUid = createMarketUid(
8914
+ chainId,
8915
+ lender,
8916
+ baseAssetData.baseAsset
8917
+ );
8891
8918
  const baseData = {
8892
8919
  [baseAssetData.baseAsset]: {
8893
8920
  marketUid: baseMarketUid,
@@ -8924,19 +8951,20 @@ var getCompoundV3ReservesDataConverter = (lender, chainId, prices, additionalYie
8924
8951
  totalDeposits: resultsSupply,
8925
8952
  totalDebtUSD: Number(resultsBorrow) * price,
8926
8953
  totalDepositsUSD: Number(resultsSupply) * price,
8927
- // rewards
8928
- rewards: {
8929
- COMP: {
8954
+ // rewards - only populate if COMP exists on this chain
8955
+ rewards: COMP_ADDRESSES[chainId] ? [
8956
+ {
8957
+ asset: COMP_ADDRESSES[chainId],
8930
8958
  depositRate: compPrice * compToSuppliersPerDay / Number(resultsSupply) * DAYS_IN_YEAR * 100 / price,
8931
8959
  variableBorrowRate: compPrice * compToBorrowersPerDay / Number(resultsBorrow) * DAYS_IN_YEAR * 100 / price,
8932
8960
  stableBorrowRate: 0
8933
8961
  }
8934
- },
8962
+ ] : [],
8935
8963
  borrowingEnabled: true,
8936
8964
  collateralActive: false,
8937
8965
  isActive: true,
8938
8966
  isFrozen: false,
8939
- intrinsicYield: additionalYields.intrinsicYields[oracleKeyBase] ?? 0
8967
+ intrinsicYield: additionalYields?.intrinsicYields?.[oracleKeyBase] ?? 0
8940
8968
  }
8941
8969
  };
8942
8970
  return { data: { ...result, ...baseData }, chainId };
@@ -10846,7 +10874,7 @@ function getMarketUidsFromMeta(meta) {
10846
10874
  function createBaseTypeUserState(payload, lenderData, totalDeposits24h = 0, totalDebt24h = 0) {
10847
10875
  let assetKeys = getMarketUidsFromMeta(lenderData);
10848
10876
  const { chainId, account } = payload;
10849
- const mode = Number(payload.userEMode ?? 0);
10877
+ const mode = String(payload.userEMode ?? 0);
10850
10878
  const isWhitelisted = !Boolean(payload?.notWhitelisted ?? false);
10851
10879
  let depositInterest = 0;
10852
10880
  let borrowInterest = 0;
@@ -10886,18 +10914,17 @@ function createBaseTypeUserState(payload, lenderData, totalDeposits24h = 0, tota
10886
10914
  debt += debtUSD;
10887
10915
  oracleDebt += debtStableUSDOracle;
10888
10916
  oracleDebt += debtUSDOracle;
10889
- Object.entries(rewards ?? {}).forEach(
10890
- ([key, rewardData]) => {
10891
- rewardDepositAccrual += rewardData.depositRate * depositsUSD;
10892
- rewardBorrowAccrual += rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * debtStableUSD;
10893
- const rewDepo = rewardData.depositRate * depositsUSD;
10894
- const rewDebt = rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * (debtStableUSD ?? 0);
10895
- if (!rewardsPerAsset[key])
10896
- rewardsPerAsset[key] = { depositApr: 0, borrowApr: 0 };
10897
- if (rewDepo > 0) rewardsPerAsset[key].depositApr += rewDepo;
10898
- if (rewDebt > 0) rewardsPerAsset[key].borrowApr += rewDebt;
10899
- }
10900
- );
10917
+ (rewards ?? []).forEach((rewardData) => {
10918
+ const key = rewardData.asset;
10919
+ rewardDepositAccrual += rewardData.depositRate * depositsUSD;
10920
+ rewardBorrowAccrual += rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * debtStableUSD;
10921
+ const rewDepo = rewardData.depositRate * depositsUSD;
10922
+ const rewDebt = rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * (debtStableUSD ?? 0);
10923
+ if (!rewardsPerAsset[key])
10924
+ rewardsPerAsset[key] = { depositApr: 0, borrowApr: 0 };
10925
+ if (rewDepo > 0) rewardsPerAsset[key].depositApr += rewDepo;
10926
+ if (rewDebt > 0) rewardsPerAsset[key].borrowApr += rewDebt;
10927
+ });
10901
10928
  stakingDepositAccrual += (intrinsicYield ?? 0) * depositsUSD;
10902
10929
  stakingBorrowAccrual += (intrinsicYield ?? 0) * (debtStableUSD + debtUSD);
10903
10930
  if (flags?.collateralActive || userConfigForAsset && !userConfigForAsset.collateralDisabled) {
@@ -11152,13 +11179,13 @@ function getIntrinsicYieldRepay(amountUSD, cashFlowDeposits, cashFlowDebt, depos
11152
11179
  // src/lending/margin/base/yield/getRewardYieldChange.ts
11153
11180
  function getRewardYieldDeposit(amountUSD, cashFlowDeposits, cashFlowDebt, deposits, debt, yieldParams) {
11154
11181
  const rewards = yieldParams?.rewards;
11155
- if (!rewards) return {};
11182
+ if (!Array.isArray(rewards) || rewards.length === 0) return {};
11156
11183
  const data = {};
11157
- for (const key of Object.keys(rewards)) {
11158
- const _flowOut = amountUSD * (rewards[key]?.depositRate ?? 0);
11184
+ for (const reward of rewards) {
11185
+ const _flowOut = amountUSD * (reward.depositRate ?? 0);
11159
11186
  const totalCashFlowDeposits = cashFlowDeposits + _flowOut;
11160
11187
  const newCollat = deposits + amountUSD;
11161
- data[key] = {
11188
+ data[reward.asset] = {
11162
11189
  borrowApr: Math.abs(debt) < 0.01 ? 0 : cashFlowDebt / debt,
11163
11190
  depositApr: totalCashFlowDeposits / newCollat,
11164
11191
  apr: (cashFlowDeposits + cashFlowDebt + _flowOut) / (newCollat - debt)
@@ -11168,13 +11195,13 @@ function getRewardYieldDeposit(amountUSD, cashFlowDeposits, cashFlowDebt, deposi
11168
11195
  }
11169
11196
  function getRewardYieldBorrow(amountUSD, irMode, cashFlowDeposits, cashFlowDebt, deposits, debt, yieldParams) {
11170
11197
  const rewards = yieldParams?.rewards;
11171
- if (!rewards) return {};
11198
+ if (!Array.isArray(rewards) || rewards.length === 0) return {};
11172
11199
  const data = {};
11173
- for (const key of Object.keys(rewards)) {
11174
- const _flowIn = amountUSD * ((irMode === 1 ? rewards[key]?.stableBorrowRate : rewards[key]?.variableBorrowRate) ?? 0);
11200
+ for (const reward of rewards) {
11201
+ const _flowIn = amountUSD * ((irMode === 1 ? reward.stableBorrowRate : reward.variableBorrowRate) ?? 0);
11175
11202
  const totalCashFlowDebt = cashFlowDebt + _flowIn;
11176
11203
  const newDebt = debt + amountUSD;
11177
- data[key] = {
11204
+ data[reward.asset] = {
11178
11205
  borrowApr: totalCashFlowDebt / newDebt,
11179
11206
  depositApr: Math.abs(deposits) < 0.01 ? 0 : cashFlowDeposits / deposits,
11180
11207
  apr: (cashFlowDeposits + cashFlowDebt + _flowIn) / (deposits - newDebt)
@@ -11184,13 +11211,13 @@ function getRewardYieldBorrow(amountUSD, irMode, cashFlowDeposits, cashFlowDebt,
11184
11211
  }
11185
11212
  function getRewardYieldWithdraw(amountUSD, cashFlowDeposits, cashFlowDebt, deposits, debt, yieldParams) {
11186
11213
  const rewards = yieldParams?.rewards;
11187
- if (!rewards) return {};
11214
+ if (!Array.isArray(rewards) || rewards.length === 0) return {};
11188
11215
  const data = {};
11189
- for (const key of Object.keys(rewards)) {
11190
- const _flowIn = amountUSD * (rewards[key]?.depositRate ?? 0);
11216
+ for (const reward of rewards) {
11217
+ const _flowIn = amountUSD * (reward.depositRate ?? 0);
11191
11218
  const totalCashFlowDeposits = cashFlowDeposits - _flowIn;
11192
11219
  const newCollat = deposits - amountUSD;
11193
- data[key] = {
11220
+ data[reward.asset] = {
11194
11221
  borrowApr: Math.abs(debt) < 0.01 ? 0 : cashFlowDebt / debt,
11195
11222
  depositApr: totalCashFlowDeposits / newCollat,
11196
11223
  apr: (cashFlowDeposits + cashFlowDebt - _flowIn) / (newCollat - debt)
@@ -11200,13 +11227,13 @@ function getRewardYieldWithdraw(amountUSD, cashFlowDeposits, cashFlowDebt, depos
11200
11227
  }
11201
11228
  function getRewardYieldRepay(amountUSD, irMode, cashFlowDeposits, cashFlowDebt, deposits, debt, yieldParams) {
11202
11229
  const rewards = yieldParams?.rewards;
11203
- if (!rewards) return {};
11230
+ if (!Array.isArray(rewards) || rewards.length === 0) return {};
11204
11231
  const data = {};
11205
- for (const key of Object.keys(rewards)) {
11206
- const _flowOut = amountUSD * ((irMode === 1 ? rewards[key]?.stableBorrowRate : rewards[key]?.variableBorrowRate) ?? 0);
11232
+ for (const reward of rewards) {
11233
+ const _flowOut = amountUSD * ((irMode === 1 ? reward.stableBorrowRate : reward.variableBorrowRate) ?? 0);
11207
11234
  const totalCashFlowDebt = cashFlowDebt - _flowOut;
11208
11235
  const newDebt = debt - amountUSD;
11209
- data[key] = {
11236
+ data[reward.asset] = {
11210
11237
  borrowApr: Math.abs(newDebt) < 0.01 ? 0 : totalCashFlowDebt / newDebt,
11211
11238
  depositApr: Math.abs(deposits) < 0.01 ? 0 : cashFlowDeposits / deposits,
11212
11239
  apr: (cashFlowDeposits + cashFlowDebt - _flowOut) / (deposits - newDebt)
@@ -11611,18 +11638,17 @@ function createSumerUserState(payload, lenderData, totalDeposits24h = 0, totalDe
11611
11638
  debt += debtUSD;
11612
11639
  oracleDebt += debtStableUSDOracle;
11613
11640
  oracleDebt += debtUSDOracle;
11614
- Object.entries(rewards ?? {}).forEach(
11615
- ([key, rewardData]) => {
11616
- rewardDepositAccrual += rewardData.depositRate * depositsUSD;
11617
- rewardBorrowAccrual += rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * debtStableUSD;
11618
- const rewDepo = rewardData.depositRate * depositsUSD;
11619
- const rewDebt = rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * (debtStableUSD ?? 0);
11620
- if (!rewardsPerAsset[key])
11621
- rewardsPerAsset[key] = { depositApr: 0, borrowApr: 0 };
11622
- if (rewDepo > 0) rewardsPerAsset[key].depositApr += rewDepo;
11623
- if (rewDebt > 0) rewardsPerAsset[key].borrowApr += rewDebt;
11624
- }
11625
- );
11641
+ (rewards ?? []).forEach((rewardData) => {
11642
+ const key = rewardData.asset;
11643
+ rewardDepositAccrual += rewardData.depositRate * depositsUSD;
11644
+ rewardBorrowAccrual += rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * debtStableUSD;
11645
+ const rewDepo = rewardData.depositRate * depositsUSD;
11646
+ const rewDebt = rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * (debtStableUSD ?? 0);
11647
+ if (!rewardsPerAsset[key])
11648
+ rewardsPerAsset[key] = { depositApr: 0, borrowApr: 0 };
11649
+ if (rewDepo > 0) rewardsPerAsset[key].depositApr += rewDepo;
11650
+ if (rewDebt > 0) rewardsPerAsset[key].borrowApr += rewDebt;
11651
+ });
11626
11652
  stakingDepositAccrual += (intrinsicYield ?? 0) * depositsUSD;
11627
11653
  stakingBorrowAccrual += (intrinsicYield ?? 0) * (debtStableUSD + debtUSD);
11628
11654
  if (sumerMeta) {
@@ -11684,7 +11710,7 @@ function createSumerUserState(payload, lenderData, totalDeposits24h = 0, totalDe
11684
11710
  intrinsicDepositApr: safeDivide(stakingDepositAccrual, deposits),
11685
11711
  intrinsicBorrowApr: safeDivide(stakingBorrowAccrual, debt)
11686
11712
  };
11687
- const userConfig = { selectedMode: 0, id: account, isWhitelisted };
11713
+ const userConfig = { selectedMode: "0", id: account, isWhitelisted };
11688
11714
  const creditLine = Math.max(
11689
11715
  0,
11690
11716
  borrowDiscountedCollateral - balanceData2.adjustedDebt
@@ -11778,7 +11804,7 @@ function createMultiAccountTypeUserState(payload, lenderData, histData) {
11778
11804
  for (let j = 0; j < positionKeys.length; j++) {
11779
11805
  const posId = positionKeys[j];
11780
11806
  const posMode = payload.modes?.[posId];
11781
- const mode = posMode ?? LENDER_MODE_NO_MODE;
11807
+ const mode = String(posMode ?? LENDER_MODE_NO_MODE);
11782
11808
  const userConfig = {
11783
11809
  id: posId,
11784
11810
  selectedMode: mode,
@@ -11812,9 +11838,9 @@ function createMultiAccountTypeUserState(payload, lenderData, histData) {
11812
11838
  } = lenderData[marketUid];
11813
11839
  deposits += depositsUSD;
11814
11840
  debt += debtUSD;
11815
- Object.entries(rewards ?? {}).map(([key, rewardData]) => {
11841
+ (rewards ?? []).forEach((rewardData) => {
11816
11842
  rewardDepositAccrual += rewardData.depositRate * depositsUSD;
11817
- rewardBorrowAccrual += rewardData.variableBorrowRate * debtUSD + rewardData.stableBorrowRate * debtUSD;
11843
+ rewardBorrowAccrual += rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * debtUSD;
11818
11844
  });
11819
11845
  stakingDepositAccrual += (intrinsicYield ?? 0) * depositsUSD;
11820
11846
  stakingBorrowAccrual += (intrinsicYield ?? 0) * debtUSD;
@@ -11994,7 +12020,15 @@ function convertMarketsToMorphoResponse(response, chainId, additionalYields = {
11994
12020
  if (collateralAsset && loanAsset && oracleAddress && oracleAddress !== zeroAddress) {
11995
12021
  const m = "MORPHO_BLUE_" + uniqueKey.slice(2).toUpperCase();
11996
12022
  if (!data[m]) data[m] = { data: {} };
11997
- const loanRewards = {};
12023
+ const loanRewards = [];
12024
+ state.rewards?.forEach((reward) => {
12025
+ loanRewards.push({
12026
+ asset: reward.asset.address,
12027
+ depositRate: reward.supplyApr * 100,
12028
+ variableBorrowRate: reward.borrowApr * 100,
12029
+ stableBorrowRate: 0
12030
+ });
12031
+ });
11998
12032
  const loanAssetAddress = loanAsset.address.toLowerCase();
11999
12033
  const meta = tokens[loanAssetAddress] ?? loanAsset;
12000
12034
  const totalDeposits = formatNr(state.supplyAssets, loanAsset.decimals);
@@ -12016,8 +12050,8 @@ function convertMarketsToMorphoResponse(response, chainId, additionalYields = {
12016
12050
  depositRate: apyToApr2(Number(state.supplyApy)) * 100,
12017
12051
  variableBorrowRate: apyToApr2(Number(state.borrowApy)) * 100,
12018
12052
  stableBorrowRate: 0,
12019
- intrinsicYield: additionalYields.intrinsicYields[meta?.assetGroup] ?? 0,
12020
- rewards: Object.keys(loanRewards).length > 0 ? loanRewards : void 0,
12053
+ intrinsicYield: additionalYields?.intrinsicYields?.[meta?.assetGroup] ?? 0,
12054
+ rewards: loanRewards.length > 0 ? loanRewards : void 0,
12021
12055
  decimals: loanAsset.decimals,
12022
12056
  config: {
12023
12057
  0: {
@@ -12065,7 +12099,7 @@ function convertMarketsToMorphoResponse(response, chainId, additionalYields = {
12065
12099
  depositRate: 0,
12066
12100
  variableBorrowRate: 0,
12067
12101
  stableBorrowRate: 0,
12068
- intrinsicYield: additionalYields.intrinsicYields[metaCollateral?.assetGroup] ?? 0,
12102
+ intrinsicYield: additionalYields?.intrinsicYields?.[metaCollateral?.assetGroup] ?? 0,
12069
12103
  rewards: void 0,
12070
12104
  decimals: collateralAsset.decimals,
12071
12105
  config: {
@@ -12139,12 +12173,9 @@ query GetMarkets {
12139
12173
  rewards {
12140
12174
  asset {
12141
12175
  address
12142
- name
12143
- symbol
12144
- decimals
12145
12176
  }
12146
- amountPerBorrowedToken
12147
- amountPerSuppliedToken
12177
+ supplyApr
12178
+ borrowApr
12148
12179
  }
12149
12180
  borrowAssets
12150
12181
  borrowAssetsUsd
@@ -12643,7 +12674,7 @@ function getListaMarketDataConverter(lender, chainId, prices, additionalYields =
12643
12674
  if (collateralToken && loanToken && oracle && oracle !== zeroAddress) {
12644
12675
  const m = "LISTA_DAO_" + uniqueKey.slice(2).toUpperCase();
12645
12676
  if (!data[m]) data[m] = { data: {} };
12646
- const loanRewards = {};
12677
+ const loanRewards = [];
12647
12678
  const loanTokenAddress = loanToken.toLowerCase();
12648
12679
  const collateralAssetAddress = collateralToken.toLowerCase();
12649
12680
  const loanAsset = tokens[loanTokenAddress];
@@ -12702,8 +12733,8 @@ function getListaMarketDataConverter(lender, chainId, prices, additionalYields =
12702
12733
  depositRate: depositApr,
12703
12734
  variableBorrowRate: borrowApr,
12704
12735
  stableBorrowRate: 0,
12705
- intrinsicYield: additionalYields.intrinsicYields[meta?.assetGroup] ?? 0,
12706
- rewards: Object.keys(loanRewards).length > 0 ? loanRewards : void 0,
12736
+ intrinsicYield: additionalYields?.intrinsicYields?.[meta?.assetGroup] ?? 0,
12737
+ rewards: loanRewards.length > 0 ? loanRewards : void 0,
12707
12738
  decimals: loanDecimals,
12708
12739
  config: {
12709
12740
  0: {
@@ -12741,7 +12772,7 @@ function getListaMarketDataConverter(lender, chainId, prices, additionalYields =
12741
12772
  depositRate: 0,
12742
12773
  variableBorrowRate: 0,
12743
12774
  stableBorrowRate: 0,
12744
- intrinsicYield: additionalYields.intrinsicYields[metaCollateral?.assetGroup] ?? 0,
12775
+ intrinsicYield: additionalYields?.intrinsicYields?.[metaCollateral?.assetGroup] ?? 0,
12745
12776
  rewards: void 0,
12746
12777
  decimals: collateralDecimals,
12747
12778
  config: {
@@ -12842,7 +12873,7 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
12842
12873
  if (collateralToken && loanToken && oracle && collateralToken !== zeroAddress && loanToken !== zeroAddress) {
12843
12874
  const m = "MORPHO_BLUE_" + uniqueKey.slice(2).toUpperCase();
12844
12875
  if (!data[m]) data[m] = { data: {} };
12845
- const loanRewards = {};
12876
+ const loanRewards = [];
12846
12877
  const loanAsset = tokens[loanToken.toLowerCase()];
12847
12878
  const collateralAsset = tokens[collateralToken.toLowerCase()];
12848
12879
  const loanDecimals = loanAsset?.decimals ?? 18;
@@ -12903,8 +12934,8 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
12903
12934
  depositRate: depositApr,
12904
12935
  variableBorrowRate: borrowApr,
12905
12936
  stableBorrowRate: 0,
12906
- intrinsicYield: additionalYields.intrinsicYields[meta?.assetGroup] ?? 0,
12907
- rewards: Object.keys(loanRewards).length > 0 ? loanRewards : void 0,
12937
+ intrinsicYield: additionalYields?.intrinsicYields?.[meta?.assetGroup] ?? 0,
12938
+ rewards: loanRewards.length > 0 ? loanRewards : void 0,
12908
12939
  decimals: loanDecimals,
12909
12940
  config: {
12910
12941
  0: {
@@ -12925,7 +12956,11 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
12925
12956
  const ltv = parseLtv(lltv);
12926
12957
  const collateralAssetAddress = (collateralAsset?.address ?? collateralToken).toLowerCase();
12927
12958
  const metaCollateral = tokens[collateralAssetAddress] ?? collateralAsset;
12928
- const collateralMarketUid = createMarketUid(chainId, m, collateralAssetAddress);
12959
+ const collateralMarketUid = createMarketUid(
12960
+ chainId,
12961
+ m,
12962
+ collateralAssetAddress
12963
+ );
12929
12964
  data[m].data[collateralMarketUid] = {
12930
12965
  marketUid: collateralMarketUid,
12931
12966
  poolId: collateralAssetAddress,
@@ -12943,7 +12978,7 @@ function getMorphoMarketDataConverter(lender, chainId, prices, additionalYields
12943
12978
  depositRate: 0,
12944
12979
  variableBorrowRate: 0,
12945
12980
  stableBorrowRate: 0,
12946
- intrinsicYield: additionalYields.intrinsicYields[metaCollateral?.assetGroup] ?? 0,
12981
+ intrinsicYield: additionalYields?.intrinsicYields?.[metaCollateral?.assetGroup] ?? 0,
12947
12982
  rewards: void 0,
12948
12983
  decimals: collateralDecimals,
12949
12984
  config: {
@@ -15528,7 +15563,7 @@ function convertSingleEntry(opts) {
15528
15563
  totalDepositsUSD: totalSupplyUnderlying * price,
15529
15564
  totalDebtStable: 0,
15530
15565
  totalDebtStableUSD: 0,
15531
- intrinsicYield: additionalYields.intrinsicYields[asset.assetGroup] ?? 0,
15566
+ intrinsicYield: additionalYields?.intrinsicYields?.[asset.assetGroup] ?? 0,
15532
15567
  config: {
15533
15568
  [LENDER_MODE_NO_MODE]: {
15534
15569
  category: LENDER_MODE_NO_MODE,
@@ -15544,7 +15579,7 @@ function convertSingleEntry(opts) {
15544
15579
  underlying: asset.address,
15545
15580
  isActive: Boolean(currentEntry?.isListed) && !allPaused,
15546
15581
  isFrozen: pausedActions[0 /* MINT */] && pausedActions[2 /* BORROW */],
15547
- rewards: {},
15582
+ rewards: [],
15548
15583
  collateralActive,
15549
15584
  borrowingEnabled,
15550
15585
  params: {
@@ -15627,13 +15662,13 @@ function convertSumerEntry(opts) {
15627
15662
  totalDepositsUSD: totalSupplyUnderlying * price,
15628
15663
  totalDebtStable: 0,
15629
15664
  totalDebtStableUSD: 0,
15630
- stakingYield: additionalYields.intrinsicYields[asset.assetGroup] ?? 0,
15665
+ stakingYield: additionalYields?.intrinsicYields?.[asset.assetGroup] ?? 0,
15631
15666
  config,
15632
15667
  hasStable: false,
15633
15668
  underlying: asset.address,
15634
15669
  isActive: Boolean(currentEntry.isListed),
15635
15670
  isFrozen: false,
15636
- rewards: {},
15671
+ rewards: [],
15637
15672
  collateralActive,
15638
15673
  borrowingEnabled,
15639
15674
  params: {
@@ -15688,7 +15723,7 @@ function convertTakaraEntry(opts) {
15688
15723
  totalDepositsUSD: totalSupplyUSD,
15689
15724
  totalDebtStable: 0,
15690
15725
  totalDebtStableUSD: 0,
15691
- intrinsicYield: additionalYields.intrinsicYields[asset.assetGroup] ?? 0,
15726
+ intrinsicYield: additionalYields?.intrinsicYields?.[asset.assetGroup] ?? 0,
15692
15727
  config: {
15693
15728
  [LENDER_MODE_NO_MODE]: {
15694
15729
  category: LENDER_MODE_NO_MODE,
@@ -15703,7 +15738,7 @@ function convertTakaraEntry(opts) {
15703
15738
  underlying: asset.address,
15704
15739
  isActive: info.isListed,
15705
15740
  isFrozen: false,
15706
- rewards: {},
15741
+ rewards: [],
15707
15742
  collateralActive: info.isListed,
15708
15743
  borrowingEnabled: info.isListed,
15709
15744
  params: {
@@ -15751,7 +15786,7 @@ function convertTectonicEntry(opts) {
15751
15786
  totalDepositsUSD: totalSupplyUnderlying * price,
15752
15787
  totalDebtStable: 0,
15753
15788
  totalDebtStableUSD: 0,
15754
- intrinsicYield: additionalYields.intrinsicYields[asset.assetGroup] ?? 0,
15789
+ intrinsicYield: additionalYields?.intrinsicYields?.[asset.assetGroup] ?? 0,
15755
15790
  config: {
15756
15791
  [LENDER_MODE_NO_MODE]: {
15757
15792
  category: LENDER_MODE_NO_MODE,
@@ -15766,7 +15801,7 @@ function convertTectonicEntry(opts) {
15766
15801
  underlying: asset.address,
15767
15802
  isActive: info.asCollateralEnabled,
15768
15803
  isFrozen: false,
15769
- rewards: {},
15804
+ rewards: [],
15770
15805
  collateralActive: info.asCollateralEnabled,
15771
15806
  borrowingEnabled: info.asCollateralEnabled,
15772
15807
  params: {
@@ -15913,7 +15948,7 @@ function convertBenqiEntry(opts) {
15913
15948
  totalDepositsUSD: totalDeposits * price,
15914
15949
  totalDebtStable: 0,
15915
15950
  totalDebtStableUSD: 0,
15916
- intrinsicYield: additionalYields.intrinsicYields[asset.assetGroup] ?? 0,
15951
+ intrinsicYield: additionalYields?.intrinsicYields?.[asset.assetGroup] ?? 0,
15917
15952
  config: {
15918
15953
  [LENDER_MODE_NO_MODE]: {
15919
15954
  category: LENDER_MODE_NO_MODE,
@@ -15928,7 +15963,7 @@ function convertBenqiEntry(opts) {
15928
15963
  underlying: asset.address,
15929
15964
  isActive: !parsed.mintPaused || !parsed.borrowPaused,
15930
15965
  isFrozen: parsed.mintPaused && parsed.borrowPaused,
15931
- rewards: {},
15966
+ rewards: [],
15932
15967
  collateralActive,
15933
15968
  borrowingEnabled,
15934
15969
  params: {
@@ -17052,6 +17087,634 @@ var VenusLensAbi = [
17052
17087
  }
17053
17088
  ];
17054
17089
 
17090
+ // src/abis/euler/vaultLens.ts
17091
+ var vaultLensAbi = [
17092
+ {
17093
+ type: "function",
17094
+ name: "getVaultInfoFull",
17095
+ inputs: [{ name: "vault", type: "address" }],
17096
+ outputs: [
17097
+ {
17098
+ name: "",
17099
+ type: "tuple",
17100
+ components: [
17101
+ { name: "timestamp", type: "uint256" },
17102
+ { name: "vault", type: "address" },
17103
+ { name: "vaultName", type: "string" },
17104
+ { name: "vaultSymbol", type: "string" },
17105
+ { name: "vaultDecimals", type: "uint256" },
17106
+ { name: "asset", type: "address" },
17107
+ { name: "assetName", type: "string" },
17108
+ { name: "assetSymbol", type: "string" },
17109
+ { name: "assetDecimals", type: "uint256" },
17110
+ { name: "unitOfAccount", type: "address" },
17111
+ { name: "unitOfAccountName", type: "string" },
17112
+ { name: "unitOfAccountSymbol", type: "string" },
17113
+ { name: "unitOfAccountDecimals", type: "uint256" },
17114
+ { name: "totalShares", type: "uint256" },
17115
+ { name: "totalCash", type: "uint256" },
17116
+ { name: "totalBorrowed", type: "uint256" },
17117
+ { name: "totalAssets", type: "uint256" },
17118
+ { name: "accumulatedFeesShares", type: "uint256" },
17119
+ { name: "accumulatedFeesAssets", type: "uint256" },
17120
+ { name: "governorFeeReceiver", type: "address" },
17121
+ { name: "protocolFeeReceiver", type: "address" },
17122
+ { name: "protocolFeeShare", type: "uint256" },
17123
+ { name: "interestFee", type: "uint256" },
17124
+ { name: "hookedOperations", type: "uint256" },
17125
+ { name: "configFlags", type: "uint256" },
17126
+ { name: "supplyCap", type: "uint256" },
17127
+ { name: "borrowCap", type: "uint256" },
17128
+ { name: "maxLiquidationDiscount", type: "uint256" },
17129
+ { name: "liquidationCoolOffTime", type: "uint256" },
17130
+ { name: "dToken", type: "address" },
17131
+ { name: "oracle", type: "address" },
17132
+ { name: "interestRateModel", type: "address" },
17133
+ { name: "hookTarget", type: "address" },
17134
+ { name: "evc", type: "address" },
17135
+ { name: "protocolConfig", type: "address" },
17136
+ { name: "balanceTracker", type: "address" },
17137
+ { name: "permit2", type: "address" },
17138
+ { name: "creator", type: "address" },
17139
+ { name: "governorAdmin", type: "address" },
17140
+ // irmInfo: VaultInterestRateModelInfo
17141
+ {
17142
+ name: "irmInfo",
17143
+ type: "tuple",
17144
+ components: [
17145
+ { name: "queryFailure", type: "bool" },
17146
+ { name: "queryFailureReason", type: "bytes" },
17147
+ { name: "vault", type: "address" },
17148
+ { name: "interestRateModel", type: "address" },
17149
+ {
17150
+ name: "interestRateInfo",
17151
+ type: "tuple[]",
17152
+ components: [
17153
+ { name: "cash", type: "uint256" },
17154
+ { name: "borrows", type: "uint256" },
17155
+ { name: "borrowSPY", type: "uint256" },
17156
+ { name: "borrowAPY", type: "uint256" },
17157
+ { name: "supplyAPY", type: "uint256" }
17158
+ ]
17159
+ },
17160
+ {
17161
+ name: "interestRateModelInfo",
17162
+ type: "tuple",
17163
+ components: [
17164
+ { name: "interestRateModel", type: "address" },
17165
+ { name: "interestRateModelType", type: "uint8" },
17166
+ { name: "interestRateModelParams", type: "bytes" }
17167
+ ]
17168
+ }
17169
+ ]
17170
+ },
17171
+ // collateralLTVInfo: LTVInfo[]
17172
+ {
17173
+ name: "collateralLTVInfo",
17174
+ type: "tuple[]",
17175
+ components: [
17176
+ { name: "collateral", type: "address" },
17177
+ { name: "borrowLTV", type: "uint256" },
17178
+ { name: "liquidationLTV", type: "uint256" },
17179
+ { name: "initialLiquidationLTV", type: "uint256" },
17180
+ { name: "targetTimestamp", type: "uint256" },
17181
+ { name: "rampDuration", type: "uint256" }
17182
+ ]
17183
+ },
17184
+ // liabilityPriceInfo: AssetPriceInfo
17185
+ {
17186
+ name: "liabilityPriceInfo",
17187
+ type: "tuple",
17188
+ components: [
17189
+ { name: "queryFailure", type: "bool" },
17190
+ { name: "queryFailureReason", type: "bytes" },
17191
+ { name: "timestamp", type: "uint256" },
17192
+ { name: "oracle", type: "address" },
17193
+ { name: "asset", type: "address" },
17194
+ { name: "unitOfAccount", type: "address" },
17195
+ { name: "amountIn", type: "uint256" },
17196
+ { name: "amountOutMid", type: "uint256" },
17197
+ { name: "amountOutBid", type: "uint256" },
17198
+ { name: "amountOutAsk", type: "uint256" }
17199
+ ]
17200
+ },
17201
+ // collateralPriceInfo: AssetPriceInfo[]
17202
+ {
17203
+ name: "collateralPriceInfo",
17204
+ type: "tuple[]",
17205
+ components: [
17206
+ { name: "queryFailure", type: "bool" },
17207
+ { name: "queryFailureReason", type: "bytes" },
17208
+ { name: "timestamp", type: "uint256" },
17209
+ { name: "oracle", type: "address" },
17210
+ { name: "asset", type: "address" },
17211
+ { name: "unitOfAccount", type: "address" },
17212
+ { name: "amountIn", type: "uint256" },
17213
+ { name: "amountOutMid", type: "uint256" },
17214
+ { name: "amountOutBid", type: "uint256" },
17215
+ { name: "amountOutAsk", type: "uint256" }
17216
+ ]
17217
+ },
17218
+ // oracleInfo: OracleDetailedInfo
17219
+ {
17220
+ name: "oracleInfo",
17221
+ type: "tuple",
17222
+ components: [
17223
+ { name: "oracle", type: "address" },
17224
+ { name: "name", type: "string" },
17225
+ { name: "oracleInfo", type: "bytes" }
17226
+ ]
17227
+ },
17228
+ // backupAssetPriceInfo: AssetPriceInfo
17229
+ {
17230
+ name: "backupAssetPriceInfo",
17231
+ type: "tuple",
17232
+ components: [
17233
+ { name: "queryFailure", type: "bool" },
17234
+ { name: "queryFailureReason", type: "bytes" },
17235
+ { name: "timestamp", type: "uint256" },
17236
+ { name: "oracle", type: "address" },
17237
+ { name: "asset", type: "address" },
17238
+ { name: "unitOfAccount", type: "address" },
17239
+ { name: "amountIn", type: "uint256" },
17240
+ { name: "amountOutMid", type: "uint256" },
17241
+ { name: "amountOutBid", type: "uint256" },
17242
+ { name: "amountOutAsk", type: "uint256" }
17243
+ ]
17244
+ },
17245
+ // backupAssetOracleInfo: OracleDetailedInfo
17246
+ {
17247
+ name: "backupAssetOracleInfo",
17248
+ type: "tuple",
17249
+ components: [
17250
+ { name: "oracle", type: "address" },
17251
+ { name: "name", type: "string" },
17252
+ { name: "oracleInfo", type: "bytes" }
17253
+ ]
17254
+ }
17255
+ ]
17256
+ }
17257
+ ],
17258
+ stateMutability: "view"
17259
+ }
17260
+ ];
17261
+
17262
+ // src/lending/public-data/euler/publicCallBuild.ts
17263
+ var buildEulerV2LenderReserveCall = (chainId, lender) => {
17264
+ if (!ENABLED_EULER_V2_CHAINS.includes(chainId)) return [];
17265
+ const config = eulerConfigs()?.[lender]?.[chainId];
17266
+ const vaults = eulerVaults()?.[lender]?.[chainId] ?? [];
17267
+ if (!config || vaults.length === 0) return [];
17268
+ return vaults.map((vault) => ({
17269
+ address: config.vaultLens,
17270
+ name: "getVaultInfoFull",
17271
+ params: [vault],
17272
+ abi: vaultLensAbi
17273
+ }));
17274
+ };
17275
+
17276
+ // src/lending/public-data/euler/fetcher/constants.ts
17277
+ var ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
17278
+
17279
+ // src/lending/public-data/euler/fetcher/cluster.ts
17280
+ function getActiveCollaterals(ltvInfo) {
17281
+ const active = /* @__PURE__ */ new Set();
17282
+ for (const entry of ltvInfo) {
17283
+ if (entry.borrowLTV > 0n) {
17284
+ active.add(entry.collateral.toLowerCase());
17285
+ }
17286
+ }
17287
+ return active;
17288
+ }
17289
+ function findVaultInfo(normalizedAddr, vaultData) {
17290
+ for (const [key, value] of vaultData) {
17291
+ if (key.toLowerCase() === normalizedAddr) return value;
17292
+ }
17293
+ return void 0;
17294
+ }
17295
+ function buildAdjacencyList(vaultData) {
17296
+ const adj = /* @__PURE__ */ new Map();
17297
+ const knownVaults = /* @__PURE__ */ new Set();
17298
+ for (const addr of vaultData.keys()) {
17299
+ const norm = addr.toLowerCase();
17300
+ knownVaults.add(norm);
17301
+ adj.set(norm, /* @__PURE__ */ new Set());
17302
+ }
17303
+ for (const [addr, info] of vaultData) {
17304
+ const from = addr.toLowerCase();
17305
+ const activeCollaterals = getActiveCollaterals(info.collateralLTVInfo);
17306
+ for (const to of activeCollaterals) {
17307
+ if (knownVaults.has(to) && from !== to) {
17308
+ adj.get(from).add(to);
17309
+ adj.get(to).add(from);
17310
+ }
17311
+ }
17312
+ }
17313
+ return adj;
17314
+ }
17315
+ function bfs(start, adj, visited) {
17316
+ const component = [];
17317
+ const queue = [start];
17318
+ visited.add(start);
17319
+ while (queue.length > 0) {
17320
+ const current = queue.shift();
17321
+ component.push(current);
17322
+ const neighbors = adj.get(current);
17323
+ if (!neighbors) continue;
17324
+ for (const neighbor of neighbors) {
17325
+ if (!visited.has(neighbor)) {
17326
+ visited.add(neighbor);
17327
+ queue.push(neighbor);
17328
+ }
17329
+ }
17330
+ }
17331
+ return component;
17332
+ }
17333
+ function findConnectedComponents(adj) {
17334
+ const visited = /* @__PURE__ */ new Set();
17335
+ const components = [];
17336
+ for (const vault of adj.keys()) {
17337
+ if (!visited.has(vault)) {
17338
+ const component = bfs(vault, adj, visited);
17339
+ components.push(component);
17340
+ }
17341
+ }
17342
+ return components;
17343
+ }
17344
+ function deriveGovernor(vaultAddresses, vaultData) {
17345
+ const counts = /* @__PURE__ */ new Map();
17346
+ const zeroNorm = ZERO_ADDRESS.toLowerCase();
17347
+ for (const addr of vaultAddresses) {
17348
+ const info = findVaultInfo(addr, vaultData);
17349
+ if (!info) continue;
17350
+ const gov = info.governorAdmin.toLowerCase();
17351
+ if (gov === zeroNorm) continue;
17352
+ counts.set(gov, (counts.get(gov) ?? 0) + 1);
17353
+ }
17354
+ let best = ZERO_ADDRESS;
17355
+ let bestCount = 0;
17356
+ for (const [gov, count] of counts) {
17357
+ if (count > bestCount) {
17358
+ best = gov;
17359
+ bestCount = count;
17360
+ }
17361
+ }
17362
+ return best;
17363
+ }
17364
+ function deriveClusters(vaultData, includeSingletons = false) {
17365
+ if (vaultData.size === 0) return [];
17366
+ const adj = buildAdjacencyList(vaultData);
17367
+ const components = findConnectedComponents(adj);
17368
+ const clusters = [];
17369
+ for (const component of components) {
17370
+ if (!includeSingletons && component.length < 2) continue;
17371
+ if (!includeSingletons) {
17372
+ let hasActiveEdge = false;
17373
+ for (const addr of component) {
17374
+ const neighbors = adj.get(addr);
17375
+ if (neighbors && neighbors.size > 0) {
17376
+ hasActiveEdge = true;
17377
+ break;
17378
+ }
17379
+ }
17380
+ if (!hasActiveEdge) continue;
17381
+ }
17382
+ const clusterVaultData = /* @__PURE__ */ new Map();
17383
+ for (const addr of component) {
17384
+ const info = findVaultInfo(addr, vaultData);
17385
+ if (info) clusterVaultData.set(addr, info);
17386
+ }
17387
+ clusters.push({
17388
+ governor: deriveGovernor(component, vaultData),
17389
+ vaults: component,
17390
+ vaultData: clusterVaultData
17391
+ });
17392
+ }
17393
+ return clusters;
17394
+ }
17395
+
17396
+ // src/lending/public-data/euler/fetcher/normalize.ts
17397
+ var LTV_SCALE = 10000n;
17398
+ function ltvToNumber(ltv) {
17399
+ return Number(ltv) / Number(LTV_SCALE);
17400
+ }
17401
+ var RAY = 10n ** 27n;
17402
+ function rayToNumber(ray) {
17403
+ return Number(ray) / Number(RAY);
17404
+ }
17405
+ function toTokenAmount(raw, decimals) {
17406
+ return Number(raw) / 10 ** Number(decimals);
17407
+ }
17408
+ function identifyBorrowVaults(cluster) {
17409
+ const borrowVaults = /* @__PURE__ */ new Set();
17410
+ for (const [addr, info] of cluster.vaultData) {
17411
+ const hasIRM = info.interestRateModel.toLowerCase() !== ZERO_ADDRESS.toLowerCase();
17412
+ const hasActiveCollateral = info.collateralLTVInfo.some(
17413
+ (ltv) => ltv.borrowLTV > 0n
17414
+ );
17415
+ if (hasIRM && hasActiveCollateral) {
17416
+ borrowVaults.add(addr.toLowerCase());
17417
+ }
17418
+ }
17419
+ return borrowVaults;
17420
+ }
17421
+ function buildReverseLTVIndex(cluster) {
17422
+ const index = /* @__PURE__ */ new Map();
17423
+ for (const [addr, info] of cluster.vaultData) {
17424
+ const borrowVault = addr.toLowerCase();
17425
+ for (const ltv of info.collateralLTVInfo) {
17426
+ if (ltv.borrowLTV <= 0n) continue;
17427
+ const collateral = ltv.collateral.toLowerCase();
17428
+ let entries = index.get(collateral);
17429
+ if (!entries) {
17430
+ entries = [];
17431
+ index.set(collateral, entries);
17432
+ }
17433
+ entries.push({ borrowVault, ltv });
17434
+ }
17435
+ }
17436
+ return index;
17437
+ }
17438
+ function buildForwardLTVIndex(cluster) {
17439
+ const index = /* @__PURE__ */ new Map();
17440
+ for (const [addr, info] of cluster.vaultData) {
17441
+ const borrowVault = addr.toLowerCase();
17442
+ const entries = [];
17443
+ for (const ltv of info.collateralLTVInfo) {
17444
+ if (ltv.borrowLTV <= 0n) continue;
17445
+ entries.push({
17446
+ collateralVault: ltv.collateral.toLowerCase(),
17447
+ ltv
17448
+ });
17449
+ }
17450
+ if (entries.length > 0) {
17451
+ index.set(borrowVault, entries);
17452
+ }
17453
+ }
17454
+ return index;
17455
+ }
17456
+ function buildTokenConfig(vaultAddr, reverseLTV, forwardLTV, borrowVaults, clusterVaults) {
17457
+ const config = {};
17458
+ const reverseEntries = reverseLTV.get(vaultAddr) ?? [];
17459
+ for (const { borrowVault, ltv } of reverseEntries) {
17460
+ if (!borrowVaults.has(borrowVault)) continue;
17461
+ config[borrowVault] = {
17462
+ category: borrowVault,
17463
+ borrowCollateralFactor: ltvToNumber(ltv.borrowLTV),
17464
+ collateralFactor: ltvToNumber(ltv.liquidationLTV),
17465
+ borrowFactor: 1
17466
+ };
17467
+ }
17468
+ if (borrowVaults.has(vaultAddr)) {
17469
+ const forwardEntries = forwardLTV.get(vaultAddr) ?? [];
17470
+ for (const { collateralVault } of forwardEntries) {
17471
+ if (!clusterVaults.has(collateralVault)) continue;
17472
+ if (config[collateralVault]) continue;
17473
+ config[collateralVault] = {
17474
+ category: collateralVault,
17475
+ borrowCollateralFactor: 0,
17476
+ collateralFactor: 0,
17477
+ borrowFactor: 1
17478
+ };
17479
+ }
17480
+ }
17481
+ return config;
17482
+ }
17483
+ function buildEModes(borrowVaults, cluster) {
17484
+ const eModes = {};
17485
+ for (const addr of borrowVaults) {
17486
+ const info = findInfo(addr, cluster.vaultData);
17487
+ if (!info) continue;
17488
+ const activeLTVs = info.collateralLTVInfo.filter(
17489
+ (l) => l.borrowLTV > 0n
17490
+ );
17491
+ const avgBorrowLTV = activeLTVs.length > 0 ? activeLTVs.reduce((sum, l) => sum + ltvToNumber(l.borrowLTV), 0) / activeLTVs.length : 0;
17492
+ const avgLiqLTV = activeLTVs.length > 0 ? activeLTVs.reduce(
17493
+ (sum, l) => sum + ltvToNumber(l.liquidationLTV),
17494
+ 0
17495
+ ) / activeLTVs.length : 0;
17496
+ eModes[addr] = {
17497
+ category: addr,
17498
+ label: `${info.assetSymbol} Borrow (${info.vaultSymbol})`,
17499
+ borrowCollateralFactor: avgBorrowLTV,
17500
+ collateralFactor: avgLiqLTV,
17501
+ priceSource: info.oracle
17502
+ };
17503
+ }
17504
+ return eModes;
17505
+ }
17506
+ function buildMetadata(info) {
17507
+ return {
17508
+ vault: info.vault.toLowerCase(),
17509
+ dToken: info.dToken.toLowerCase(),
17510
+ oracle: info.oracle.toLowerCase(),
17511
+ interestRateModel: info.interestRateModel.toLowerCase(),
17512
+ unitOfAccount: info.unitOfAccount.toLowerCase(),
17513
+ evc: info.evc.toLowerCase(),
17514
+ governorAdmin: info.governorAdmin.toLowerCase()
17515
+ };
17516
+ }
17517
+ function buildTokenEntry(info, config, collateralActive, borrowVaults, opts) {
17518
+ const addr = info.asset.toLowerCase();
17519
+ const tokenMeta = opts.tokenList?.[addr];
17520
+ const asset = {
17521
+ chainId: opts.chainId,
17522
+ address: addr,
17523
+ name: tokenMeta?.name ?? info.assetName,
17524
+ symbol: tokenMeta?.symbol ?? info.assetSymbol,
17525
+ decimals: tokenMeta?.decimals ?? Number(info.assetDecimals)
17526
+ };
17527
+ const irmData = info.irmInfo.interestRateInfo;
17528
+ const currentRate = irmData.length > 0 ? irmData[irmData.length - 1] : null;
17529
+ const depositRate = currentRate ? rayToNumber(currentRate.supplyAPY) : 0;
17530
+ const variableBorrowRate = currentRate ? rayToNumber(currentRate.borrowAPY) : 0;
17531
+ const totalDeposits = toTokenAmount(info.totalAssets, info.assetDecimals);
17532
+ const totalDebt = toTokenAmount(info.totalBorrowed, info.assetDecimals);
17533
+ const priceInfo = info.liabilityPriceInfo;
17534
+ const hasPrice = !priceInfo.queryFailure && priceInfo.amountOutMid > 0n;
17535
+ const pricePerUnit = hasPrice ? Number(priceInfo.amountOutMid) / Number(10n ** info.unitOfAccountDecimals) : 0;
17536
+ const vaultAddrNorm = info.vault.toLowerCase();
17537
+ const isBorrowVault = borrowVaults.has(vaultAddrNorm);
17538
+ const selfEMode = isBorrowVault ? {
17539
+ label: `${info.assetSymbol} Borrow`,
17540
+ category: vaultAddrNorm,
17541
+ borrowCollateralFactor: 0,
17542
+ collateralFactor: 0,
17543
+ priceSource: info.oracle
17544
+ } : {
17545
+ label: "None",
17546
+ category: ZERO_ADDRESS,
17547
+ borrowCollateralFactor: 0,
17548
+ collateralFactor: 0,
17549
+ priceSource: ZERO_ADDRESS
17550
+ };
17551
+ return {
17552
+ vaultName: info.vaultName,
17553
+ asset,
17554
+ totalDeposits,
17555
+ totalDebtStable: 0,
17556
+ totalDebt,
17557
+ totalDepositsUSD: totalDeposits * pricePerUnit,
17558
+ totalDebtStableUSD: 0,
17559
+ totalDebtUSD: totalDebt * pricePerUnit,
17560
+ depositRate,
17561
+ variableBorrowRate,
17562
+ stableBorrowRate: 0,
17563
+ averageStableBorrowRate: 0,
17564
+ liquidityIndex: "0",
17565
+ variableBorrowIndex: "0",
17566
+ lastUpdateTimestamp: Number(info.timestamp),
17567
+ config,
17568
+ collateralActive,
17569
+ borrowingEnabled: isBorrowVault,
17570
+ hasStable: false,
17571
+ isActive: true,
17572
+ isFrozen: false,
17573
+ borrowCap: toTokenAmount(info.borrowCap, info.assetDecimals),
17574
+ supplyCap: toTokenAmount(info.supplyCap, info.assetDecimals),
17575
+ debtCeiling: 0,
17576
+ eMode: selfEMode,
17577
+ decimals: Number(info.assetDecimals),
17578
+ params: { metadata: buildMetadata(info) }
17579
+ };
17580
+ }
17581
+ function findInfo(addr, vaultData) {
17582
+ for (const [key, value] of vaultData) {
17583
+ if (key.toLowerCase() === addr) return value;
17584
+ }
17585
+ return void 0;
17586
+ }
17587
+ function normalizeCluster(cluster, opts) {
17588
+ const borrowVaults = identifyBorrowVaults(cluster);
17589
+ const reverseLTV = buildReverseLTVIndex(cluster);
17590
+ const forwardLTV = buildForwardLTVIndex(cluster);
17591
+ const clusterVaults = new Set(
17592
+ [...cluster.vaultData.keys()].map((a) => a.toLowerCase())
17593
+ );
17594
+ const collateralActiveVaults = /* @__PURE__ */ new Set();
17595
+ for (const [collateral, entries] of reverseLTV) {
17596
+ if (entries.some((e) => borrowVaults.has(e.borrowVault))) {
17597
+ collateralActiveVaults.add(collateral);
17598
+ }
17599
+ }
17600
+ const eModes = buildEModes(borrowVaults, cluster);
17601
+ const data = {};
17602
+ for (const [addr, info] of cluster.vaultData) {
17603
+ const norm = addr.toLowerCase();
17604
+ const config = buildTokenConfig(
17605
+ norm,
17606
+ reverseLTV,
17607
+ forwardLTV,
17608
+ borrowVaults,
17609
+ clusterVaults
17610
+ );
17611
+ data[norm] = buildTokenEntry(
17612
+ info,
17613
+ config,
17614
+ collateralActiveVaults.has(norm),
17615
+ borrowVaults,
17616
+ opts
17617
+ );
17618
+ }
17619
+ return {
17620
+ data,
17621
+ chainId: opts.chainId,
17622
+ eModes
17623
+ };
17624
+ }
17625
+
17626
+ // src/lending/public-data/euler/publicCallParse.ts
17627
+ var getEulerV2ReservesDataConverter = (lender, chainId, prices, additionalYields, tokenList = {}) => {
17628
+ const vaultAddresses = eulerVaults()?.[lender]?.[chainId] ?? [];
17629
+ const expectedNumberOfCalls = vaultAddresses.length;
17630
+ return [
17631
+ (data) => {
17632
+ if (data.length !== expectedNumberOfCalls) {
17633
+ return void 0;
17634
+ }
17635
+ const vaultDataMap = /* @__PURE__ */ new Map();
17636
+ for (let i = 0; i < vaultAddresses.length; i++) {
17637
+ const result = data[i];
17638
+ if (result) {
17639
+ vaultDataMap.set(vaultAddresses[i].toLowerCase(), result);
17640
+ }
17641
+ }
17642
+ if (vaultDataMap.size === 0) return void 0;
17643
+ const clusters = deriveClusters(vaultDataMap, true);
17644
+ const resultReserves = {};
17645
+ for (const cluster of clusters) {
17646
+ const normalized = normalizeCluster(cluster, {
17647
+ chainId,
17648
+ tokenList
17649
+ });
17650
+ for (const [vaultAddr, entry] of Object.entries(normalized.data)) {
17651
+ const marketUid = createMarketUid(chainId, lender, vaultAddr);
17652
+ const assetMeta = tokenList[entry.asset.address];
17653
+ const oracleKey = toOracleKey(assetMeta?.assetGroup ?? null) || toGenericPriceKey(entry.asset.address, chainId);
17654
+ const price = prices[oracleKey] ?? 0;
17655
+ const totalDeposits = entry.totalDeposits;
17656
+ const totalDebt = entry.totalDebt;
17657
+ const totalLiquidity = totalDeposits - totalDebt;
17658
+ const totalDepositsUSD = price > 0 ? totalDeposits * price : entry.totalDepositsUSD;
17659
+ const totalDebtUSD = price > 0 ? totalDebt * price : entry.totalDebtUSD;
17660
+ const totalLiquidityUSD = price > 0 ? totalLiquidity * price : totalDepositsUSD - totalDebtUSD;
17661
+ resultReserves[marketUid] = {
17662
+ marketUid,
17663
+ poolId: vaultAddr,
17664
+ underlying: entry.asset.address,
17665
+ asset: {
17666
+ chainId,
17667
+ decimals: entry.asset.decimals,
17668
+ name: entry.asset.name,
17669
+ address: entry.asset.address,
17670
+ symbol: entry.asset.symbol
17671
+ },
17672
+ // token amounts
17673
+ totalDeposits: String(totalDeposits),
17674
+ totalDebtStable: String(entry.totalDebtStable),
17675
+ totalDebt: String(totalDebt),
17676
+ totalLiquidity: String(totalLiquidity),
17677
+ // USD amounts
17678
+ totalDepositsUSD,
17679
+ totalDebtStableUSD: entry.totalDebtStableUSD,
17680
+ totalDebtUSD,
17681
+ totalLiquidityUSD,
17682
+ // rates (normalizer yields APY as decimal, convert to APR percentage)
17683
+ depositRate: apyToApr(entry.depositRate) * 100,
17684
+ variableBorrowRate: apyToApr(entry.variableBorrowRate) * 100,
17685
+ stableBorrowRate: entry.stableBorrowRate,
17686
+ intrinsicYield: additionalYields?.intrinsicYields?.[oracleKey] ?? 0,
17687
+ // rewards
17688
+ rewards: [],
17689
+ decimals: entry.decimals,
17690
+ // config (keyed by counterparty vault address)
17691
+ config: entry.config,
17692
+ // flags
17693
+ collateralActive: entry.collateralActive,
17694
+ borrowingEnabled: entry.borrowingEnabled,
17695
+ hasStable: entry.hasStable,
17696
+ isActive: entry.isActive,
17697
+ isFrozen: entry.isFrozen,
17698
+ // caps
17699
+ borrowCap: entry.borrowCap,
17700
+ supplyCap: entry.supplyCap,
17701
+ debtCeiling: entry.debtCeiling,
17702
+ // metadata
17703
+ params: {
17704
+ metadata: entry.params.metadata
17705
+ }
17706
+ };
17707
+ }
17708
+ }
17709
+ return {
17710
+ data: resultReserves,
17711
+ chainId
17712
+ };
17713
+ },
17714
+ expectedNumberOfCalls
17715
+ ];
17716
+ };
17717
+
17055
17718
  // src/lending/public-data/fetchLender.ts
17056
17719
  function getMorphoTypeMarketConverter(lender, chainId, prices, additionalYields, tokenList = {}, marketsOverride) {
17057
17720
  if (lender.startsWith("LISTA_DAO"))
@@ -17085,6 +17748,8 @@ function buildLenderCall(chainId, lender) {
17085
17748
  }
17086
17749
  if (isCompoundV2Type(lender))
17087
17750
  return buildCompoundV2StyleLenderReserveCall(chainId, lender);
17751
+ if (isEulerType(lender))
17752
+ return buildEulerV2LenderReserveCall(chainId, lender);
17088
17753
  return [];
17089
17754
  }
17090
17755
  function getLenderDataConverter(lender, chainId, prices, additionalYields, tokenList = {}) {
@@ -17137,6 +17802,14 @@ function getLenderDataConverter(lender, chainId, prices, additionalYields, token
17137
17802
  additionalYields,
17138
17803
  tokenList
17139
17804
  );
17805
+ if (isEulerType(lender))
17806
+ return getEulerV2ReservesDataConverter(
17807
+ lender,
17808
+ chainId,
17809
+ prices,
17810
+ additionalYields,
17811
+ tokenList
17812
+ );
17140
17813
  return [() => null, 0];
17141
17814
  }
17142
17815
  var getAbi = (lender) => {
@@ -17155,6 +17828,7 @@ var getAbi = (lender) => {
17155
17828
  if (isCompoundV3(lender)) return [...IrgetterAbi, ...CometAbi, ...CometExtAbi];
17156
17829
  if (isInit(lender)) return InitLensAbi;
17157
17830
  if (isMorphoType(lender)) return MorphoLensAbi;
17831
+ if (isEulerType(lender)) return vaultLensAbi;
17158
17832
  if (isSumerType(lender)) return [...SumerLensAbi, ...SumerComptrollerAbi];
17159
17833
  if (lender === Lender.TAKARA) return [...TakaraMarketStateAbi];
17160
17834
  if (isCompoundV2Type(lender)) return VenusLensAbi;
@@ -17535,6 +18209,37 @@ function createCompoundV2Entry(i, data, key, assetsIn, vToken, meta, claimableRe
17535
18209
  };
17536
18210
  }
17537
18211
 
18212
+ // src/lending/user-data/euler/userCallBuild.ts
18213
+ var DEFAULT_MAX_SUB_ACCOUNTS = 255;
18214
+ function getSubAccountAddress(owner, index) {
18215
+ const prefix = owner.slice(0, 40);
18216
+ const suffix = index.toString(16).padStart(2, "0");
18217
+ return (prefix + suffix).toLowerCase();
18218
+ }
18219
+ function getSubAccountIndex(addr) {
18220
+ return parseInt(addr.slice(40), 16);
18221
+ }
18222
+ var buildEulerUserCall = (chainId, lender, account, maxSubAccounts = DEFAULT_MAX_SUB_ACCOUNTS) => {
18223
+ if (!ENABLED_EULER_V2_CHAINS.includes(chainId)) return [];
18224
+ const config = eulerConfigs()?.[lender]?.[chainId];
18225
+ if (!config) return [];
18226
+ const accountLensAddress = config.accountLens;
18227
+ const evcAddress = config.evc;
18228
+ if (!accountLensAddress || !evcAddress) return [];
18229
+ const ownerIndex = getSubAccountIndex(account);
18230
+ const indices = /* @__PURE__ */ new Set();
18231
+ indices.add(ownerIndex);
18232
+ for (let i = 0; indices.size < maxSubAccounts && i < 256; i++) {
18233
+ indices.add(i);
18234
+ }
18235
+ const sortedIndices = [...indices].sort((a, b) => a - b);
18236
+ return sortedIndices.map((i) => ({
18237
+ address: accountLensAddress,
18238
+ name: "getAccountEnabledVaultsInfo",
18239
+ params: [evcAddress, getSubAccountAddress(account, i)]
18240
+ }));
18241
+ };
18242
+
17538
18243
  // src/lending/user-data/fetch-balances/prepare.ts
17539
18244
  function buildUserCall(chainId, lender, account, params) {
17540
18245
  if (isAaveV2Type(lender)) return buildAaveV2UserCall(chainId, lender, account);
@@ -17544,6 +18249,8 @@ function buildUserCall(chainId, lender, account, params) {
17544
18249
  return buildMorphoTypeUserCallWithLens(chainId, account, lender, params);
17545
18250
  if (isCompoundV3Type(lender))
17546
18251
  return buildCompoundV3UserCall(chainId, lender, account);
18252
+ if (isEulerType(lender))
18253
+ return buildEulerUserCall(chainId, lender, account);
17547
18254
  return buildCompoundV2UserCall(chainId, lender, account);
17548
18255
  }
17549
18256
  function organizeUserQueries(queries) {
@@ -18198,7 +18905,7 @@ var userDataEmpty = (account, chainId, notWhitelisted = false) => {
18198
18905
  balanceData,
18199
18906
  aprData,
18200
18907
  positions: [],
18201
- userConfig: { selectedMode: 0, id: account, notWhitelisted }
18908
+ userConfig: { selectedMode: "0", id: account, notWhitelisted }
18202
18909
  }
18203
18910
  ]
18204
18911
  };
@@ -18429,6 +19136,266 @@ function createMorphoEntryFromMarketWithLens(balanceInfo, metaMap, chainId, lend
18429
19136
  };
18430
19137
  }
18431
19138
 
19139
+ // src/lending/user-data/utils/createEulerMultiAccountTypeUserState.ts
19140
+ function createEulerMultiAccountTypeUserState(payload, lenderData, histData) {
19141
+ const subAccountKeys = Object.keys(payload.lendingPositions ?? {});
19142
+ const marketUids = getMarketUidsFromMeta(lenderData);
19143
+ const { chainId, account } = payload;
19144
+ const data = [];
19145
+ for (let j = 0; j < subAccountKeys.length; j++) {
19146
+ const subAccount = subAccountKeys[j];
19147
+ const controller = payload.controllers?.[subAccount];
19148
+ const configKey = controller ?? String(LENDER_MODE_NO_MODE);
19149
+ const userConfig = {
19150
+ id: subAccount,
19151
+ selectedMode: configKey,
19152
+ isWhitelisted: true
19153
+ };
19154
+ let depositInterest = 0;
19155
+ let borrowInterest = 0;
19156
+ let rewardDepositAccrual = 0;
19157
+ let rewardBorrowAccrual = 0;
19158
+ let stakingDepositAccrual = 0;
19159
+ let stakingBorrowAccrual = 0;
19160
+ let deposits = 0;
19161
+ let debt = 0;
19162
+ let collateral = 0;
19163
+ let borrowDiscountedCollateral = 0;
19164
+ let adjustedDebt = 0;
19165
+ for (let i = 0; i < marketUids.length; i++) {
19166
+ const marketUid = marketUids[i];
19167
+ if (!lenderData?.[marketUid] || !payload.lendingPositions[subAccount][marketUid])
19168
+ continue;
19169
+ const pos = payload.lendingPositions[subAccount][marketUid];
19170
+ const { depositsUSD, debtUSD } = pos;
19171
+ const depositsUSDOracle = pos.depositsUSDOracle ?? depositsUSD;
19172
+ const debtUSDOracle = pos.debtUSDOracle ?? debtUSD;
19173
+ const {
19174
+ depositRate,
19175
+ intrinsicYield,
19176
+ variableBorrowRate,
19177
+ rewards,
19178
+ configs
19179
+ } = lenderData[marketUid];
19180
+ deposits += depositsUSD;
19181
+ debt += debtUSD;
19182
+ (rewards ?? []).forEach((rewardData) => {
19183
+ rewardDepositAccrual += rewardData.depositRate * depositsUSD;
19184
+ rewardBorrowAccrual += rewardData.variableBorrowRate * debtUSD + (rewardData.stableBorrowRate ?? 0) * debtUSD;
19185
+ });
19186
+ stakingDepositAccrual += (intrinsicYield ?? 0) * depositsUSD;
19187
+ stakingBorrowAccrual += (intrinsicYield ?? 0) * debtUSD;
19188
+ const config = configs?.[configKey];
19189
+ collateral += (config?.collateralFactor ?? 1) * depositsUSDOracle;
19190
+ borrowDiscountedCollateral += (config?.borrowCollateralFactor ?? 1) * depositsUSDOracle;
19191
+ adjustedDebt += (config?.borrowFactor ?? 1) * debtUSDOracle;
19192
+ depositInterest += depositRate * depositsUSD;
19193
+ borrowInterest += debtUSD * variableBorrowRate;
19194
+ }
19195
+ const nav = deposits - debt;
19196
+ const balanceData2 = {
19197
+ borrowDiscountedCollateral,
19198
+ borrowDiscountedCollateralAllActive: borrowDiscountedCollateral,
19199
+ collateral,
19200
+ collateralAllActive: collateral,
19201
+ deposits,
19202
+ debt,
19203
+ adjustedDebt,
19204
+ nav,
19205
+ deposits24h: histData[subAccount]?.totalDeposits24h,
19206
+ debt24h: histData[subAccount]?.totalDebt24h,
19207
+ nav24h: histData[subAccount]?.totalDeposits24h - histData[subAccount]?.totalDebt24h
19208
+ };
19209
+ const aprData2 = {
19210
+ apr: safeDivide(depositInterest - borrowInterest, nav),
19211
+ borrowApr: safeDivide(borrowInterest, debt),
19212
+ depositApr: safeDivide(depositInterest, deposits),
19213
+ rewardApr: safeDivide(rewardDepositAccrual + rewardBorrowAccrual, nav),
19214
+ rewardDepositApr: safeDivide(rewardDepositAccrual, deposits),
19215
+ rewardBorrowApr: safeDivide(rewardBorrowAccrual, debt),
19216
+ intrinsicApr: safeDivide(
19217
+ stakingDepositAccrual - stakingBorrowAccrual,
19218
+ nav
19219
+ ),
19220
+ intrinsicDepositApr: safeDivide(stakingDepositAccrual, deposits),
19221
+ intrinsicBorrowApr: safeDivide(stakingBorrowAccrual, debt),
19222
+ rewards: {}
19223
+ };
19224
+ const creditLine = Math.max(0, borrowDiscountedCollateral - adjustedDebt);
19225
+ for (let i = 0; i < marketUids.length; i++) {
19226
+ const marketUid = marketUids[i];
19227
+ if (!lenderData?.[marketUid]) continue;
19228
+ const { configs, flags, borrowLiquidity, withdrawLiquidity } = lenderData[marketUid];
19229
+ const config = configs?.[configKey];
19230
+ const price = getOraclePrice(lenderData[marketUid]);
19231
+ const bcf = config?.borrowCollateralFactor ?? 1;
19232
+ const bf = config?.borrowFactor ?? 1;
19233
+ const pos = payload.lendingPositions[subAccount]?.[marketUid];
19234
+ if (pos) {
19235
+ let withdrawable;
19236
+ if (!pos.collateralEnabled || config?.collateralDisabled) {
19237
+ withdrawable = String(pos.deposits);
19238
+ } else if (balanceData2.debt === 0) {
19239
+ withdrawable = String(pos.deposits);
19240
+ } else {
19241
+ const withdrawableUSD = Math.max(creditLine / bcf, 0);
19242
+ withdrawable = String(
19243
+ Math.min(withdrawableUSD / price, Number(pos.deposits))
19244
+ );
19245
+ }
19246
+ if (withdrawLiquidity != null) {
19247
+ withdrawable = String(
19248
+ Math.min(Number(withdrawable), withdrawLiquidity)
19249
+ );
19250
+ }
19251
+ let borrowable;
19252
+ if (!flags?.borrowingEnabled || flags?.isFrozen || config?.debtDisabled) {
19253
+ borrowable = "0";
19254
+ } else {
19255
+ const borrowableUSD = Math.max(creditLine / bf, 0);
19256
+ borrowable = String(borrowableUSD / price);
19257
+ }
19258
+ if (borrowLiquidity != null) {
19259
+ borrowable = String(Math.min(Number(borrowable), borrowLiquidity));
19260
+ }
19261
+ pos.withdrawable = withdrawable;
19262
+ pos.borrowable = borrowable;
19263
+ } else if ((deposits > 0 || debt > 0) && flags?.borrowingEnabled && !flags?.isFrozen && !config?.debtDisabled) {
19264
+ let borrowable = String(Math.max(creditLine / bf, 0) / price);
19265
+ if (borrowLiquidity != null) {
19266
+ borrowable = String(Math.min(Number(borrowable), borrowLiquidity));
19267
+ }
19268
+ payload.lendingPositions[subAccount][marketUid] = {
19269
+ marketUid,
19270
+ underlying: lenderData[marketUid].underlying,
19271
+ deposits: "0",
19272
+ debt: "0",
19273
+ debtStable: "0",
19274
+ depositsUSD: 0,
19275
+ debtUSD: 0,
19276
+ debtStableUSD: 0,
19277
+ depositsUSDOracle: 0,
19278
+ debtUSDOracle: 0,
19279
+ debtStableUSDOracle: 0,
19280
+ collateralEnabled: false,
19281
+ isAllowed: false,
19282
+ withdrawable: "0",
19283
+ borrowable
19284
+ };
19285
+ }
19286
+ }
19287
+ data.push({
19288
+ accountId: subAccount,
19289
+ health: balanceData2.debt === 0 ? null : balanceData2.adjustedDebt > 0 ? balanceData2.borrowDiscountedCollateral / balanceData2.adjustedDebt : balanceData2.collateral / balanceData2.debt,
19290
+ borrowCapacityUSD: creditLine,
19291
+ userConfig,
19292
+ balanceData: balanceData2,
19293
+ aprData: aprData2,
19294
+ positions: Object.values(payload.lendingPositions[subAccount])
19295
+ });
19296
+ }
19297
+ return {
19298
+ lender: "",
19299
+ account,
19300
+ chainId,
19301
+ data
19302
+ };
19303
+ }
19304
+
19305
+ // src/lending/user-data/euler/userCallParse.ts
19306
+ var getEulerUserDataConverter = (lender, chainId, account, metaMap, maxSubAccounts = DEFAULT_MAX_SUB_ACCOUNTS) => {
19307
+ const ownerIndex = getSubAccountIndex(account);
19308
+ const indices = /* @__PURE__ */ new Set();
19309
+ indices.add(ownerIndex);
19310
+ for (let i = 0; indices.size < maxSubAccounts && i < 256; i++) {
19311
+ indices.add(i);
19312
+ }
19313
+ const sortedIndices = [...indices].sort((a, b) => a - b);
19314
+ const expectedNumberOfCalls = sortedIndices.length;
19315
+ return [
19316
+ (_data) => {
19317
+ if (_data.length !== expectedNumberOfCalls) {
19318
+ return void 0;
19319
+ }
19320
+ const lendingPositions = {};
19321
+ const controllers = {};
19322
+ const histData = {};
19323
+ for (let idx = 0; idx < sortedIndices.length; idx++) {
19324
+ const result = _data[idx];
19325
+ if (!result) continue;
19326
+ const evcInfo = result.evcAccountInfo ?? result[0];
19327
+ const vaultAccounts = result.vaultAccountInfo ?? result[1] ?? [];
19328
+ if (vaultAccounts.length === 0) continue;
19329
+ const subAccountAddr = getSubAccountAddress(
19330
+ account,
19331
+ sortedIndices[idx]
19332
+ ).toLowerCase();
19333
+ const enabledControllers = (evcInfo?.enabledControllers ?? []).map((a) => a.toLowerCase());
19334
+ const controller = enabledControllers.length > 0 ? enabledControllers[0] : void 0;
19335
+ if (controller) {
19336
+ controllers[subAccountAddr] = controller;
19337
+ }
19338
+ const positions = {};
19339
+ let totalDebt24h = 0;
19340
+ let totalDeposits24h = 0;
19341
+ for (const va of vaultAccounts) {
19342
+ const vaultAddr = (va.vault?.toString() ?? "").toLowerCase();
19343
+ const assetAddr = (va.asset?.toString() ?? "").toLowerCase();
19344
+ const assets = BigInt(va.assets ?? 0);
19345
+ const borrowed = BigInt(va.borrowed ?? 0);
19346
+ if (assets === 0n && borrowed === 0n) continue;
19347
+ const marketUid = createMarketUid(chainId, lender, vaultAddr);
19348
+ const meta = metaMap?.[marketUid];
19349
+ const decimals = meta?.asset?.decimals ?? 18;
19350
+ const depositsStr = parseRawAmount(assets.toString(), decimals);
19351
+ const debtStr = parseRawAmount(borrowed.toString(), decimals);
19352
+ const depositsNum = Number(depositsStr);
19353
+ const debtNum = Number(debtStr);
19354
+ const displayPrice = meta ? getDisplayPrice(meta) : 0;
19355
+ const oraclePrice = meta ? getOraclePrice(meta) : 0;
19356
+ const priceHist = meta?.price?.priceUsd24h ?? displayPrice;
19357
+ const depositsUSD = depositsNum * displayPrice;
19358
+ const debtUSD = debtNum * displayPrice;
19359
+ const depositsUSDOracle = depositsNum * oraclePrice;
19360
+ const debtUSDOracle = debtNum * oraclePrice;
19361
+ totalDeposits24h += depositsNum * priceHist;
19362
+ totalDebt24h += debtNum * priceHist;
19363
+ positions[marketUid] = {
19364
+ marketUid,
19365
+ underlying: assetAddr,
19366
+ deposits: depositsStr,
19367
+ debt: debtStr,
19368
+ debtStable: "0",
19369
+ depositsUSD,
19370
+ debtUSD,
19371
+ debtStableUSD: 0,
19372
+ depositsUSDOracle,
19373
+ debtUSDOracle,
19374
+ debtStableUSDOracle: 0,
19375
+ collateralEnabled: Boolean(va.isCollateral),
19376
+ isAllowed: assets > 0n || borrowed > 0n
19377
+ };
19378
+ }
19379
+ if (Object.keys(positions).length > 0) {
19380
+ lendingPositions[subAccountAddr] = positions;
19381
+ histData[subAccountAddr] = { totalDebt24h, totalDeposits24h };
19382
+ }
19383
+ }
19384
+ if (Object.keys(lendingPositions).length === 0) {
19385
+ return void 0;
19386
+ }
19387
+ const payload = {
19388
+ chainId,
19389
+ lendingPositions,
19390
+ controllers,
19391
+ account
19392
+ };
19393
+ return createEulerMultiAccountTypeUserState(payload, metaMap, histData);
19394
+ },
19395
+ expectedNumberOfCalls
19396
+ ];
19397
+ };
19398
+
18432
19399
  // src/lending/user-data/fetch-balances/parse.ts
18433
19400
  function getUserDataConverter(lender, chainId, account, params, meta) {
18434
19401
  if (isYLDR(lender))
@@ -18454,6 +19421,8 @@ function getUserDataConverter(lender, chainId, account, params, meta) {
18454
19421
  account,
18455
19422
  meta?.[lender]
18456
19423
  );
19424
+ if (isEulerType(lender))
19425
+ return getEulerUserDataConverter(lender, chainId, account, meta?.[lender]);
18457
19426
  return getCompoundV2UserDataConverter(
18458
19427
  lender,
18459
19428
  chainId,
@@ -23000,6 +23969,111 @@ var CompoundV2CollateralToken = [
23000
23969
  }
23001
23970
  ];
23002
23971
 
23972
+ // src/abis/euler/accountLens.ts
23973
+ var accountLensAbi = [
23974
+ {
23975
+ type: "function",
23976
+ name: "getAccountEnabledVaultsInfo",
23977
+ inputs: [
23978
+ { name: "evc", type: "address" },
23979
+ { name: "account", type: "address" }
23980
+ ],
23981
+ outputs: [
23982
+ {
23983
+ name: "",
23984
+ type: "tuple",
23985
+ components: [
23986
+ // EVCAccountInfo
23987
+ {
23988
+ name: "evcAccountInfo",
23989
+ type: "tuple",
23990
+ components: [
23991
+ { name: "timestamp", type: "uint256" },
23992
+ { name: "evc", type: "address" },
23993
+ { name: "account", type: "address" },
23994
+ { name: "addressPrefix", type: "bytes19" },
23995
+ { name: "owner", type: "address" },
23996
+ { name: "isLockdownMode", type: "bool" },
23997
+ { name: "isPermitDisabledMode", type: "bool" },
23998
+ { name: "lastAccountStatusCheckTimestamp", type: "uint256" },
23999
+ { name: "enabledControllers", type: "address[]" },
24000
+ { name: "enabledCollaterals", type: "address[]" }
24001
+ ]
24002
+ },
24003
+ // VaultAccountInfo[]
24004
+ {
24005
+ name: "vaultAccountInfo",
24006
+ type: "tuple[]",
24007
+ components: [
24008
+ { name: "timestamp", type: "uint256" },
24009
+ { name: "account", type: "address" },
24010
+ { name: "vault", type: "address" },
24011
+ { name: "asset", type: "address" },
24012
+ { name: "assetsAccount", type: "uint256" },
24013
+ { name: "shares", type: "uint256" },
24014
+ { name: "assets", type: "uint256" },
24015
+ { name: "borrowed", type: "uint256" },
24016
+ { name: "assetAllowanceVault", type: "uint256" },
24017
+ { name: "assetAllowanceVaultPermit2", type: "uint256" },
24018
+ { name: "assetAllowanceExpirationVaultPermit2", type: "uint256" },
24019
+ { name: "assetAllowancePermit2", type: "uint256" },
24020
+ { name: "balanceForwarderEnabled", type: "bool" },
24021
+ { name: "isController", type: "bool" },
24022
+ { name: "isCollateral", type: "bool" },
24023
+ // AccountLiquidityInfo
24024
+ {
24025
+ name: "liquidityInfo",
24026
+ type: "tuple",
24027
+ components: [
24028
+ { name: "queryFailure", type: "bool" },
24029
+ { name: "queryFailureReason", type: "bytes" },
24030
+ { name: "account", type: "address" },
24031
+ { name: "vault", type: "address" },
24032
+ { name: "unitOfAccount", type: "address" },
24033
+ { name: "timeToLiquidation", type: "int256" },
24034
+ { name: "liabilityValueBorrowing", type: "uint256" },
24035
+ { name: "liabilityValueLiquidation", type: "uint256" },
24036
+ { name: "collateralValueBorrowing", type: "uint256" },
24037
+ { name: "collateralValueLiquidation", type: "uint256" },
24038
+ { name: "collateralValueRaw", type: "uint256" },
24039
+ { name: "collaterals", type: "address[]" },
24040
+ { name: "collateralValuesBorrowing", type: "uint256[]" },
24041
+ { name: "collateralValuesLiquidation", type: "uint256[]" },
24042
+ { name: "collateralValuesRaw", type: "uint256[]" }
24043
+ ]
24044
+ }
24045
+ ]
24046
+ },
24047
+ // AccountRewardInfo[]
24048
+ {
24049
+ name: "accountRewardInfo",
24050
+ type: "tuple[]",
24051
+ components: [
24052
+ { name: "timestamp", type: "uint256" },
24053
+ { name: "account", type: "address" },
24054
+ { name: "vault", type: "address" },
24055
+ { name: "balanceTracker", type: "address" },
24056
+ { name: "balanceForwarderEnabled", type: "bool" },
24057
+ { name: "balance", type: "uint256" },
24058
+ // EnabledRewardInfo[]
24059
+ {
24060
+ name: "enabledRewardsInfo",
24061
+ type: "tuple[]",
24062
+ components: [
24063
+ { name: "reward", type: "address" },
24064
+ { name: "earnedReward", type: "uint256" },
24065
+ { name: "earnedRewardRecentIgnored", type: "uint256" }
24066
+ ]
24067
+ }
24068
+ ]
24069
+ }
24070
+ ]
24071
+ }
24072
+ ],
24073
+ stateMutability: "view"
24074
+ }
24075
+ ];
24076
+
23003
24077
  // src/lending/user-data/abis.ts
23004
24078
  var getAbi2 = (lender) => {
23005
24079
  if (isAaveV2Type(lender))
@@ -23024,6 +24098,7 @@ var getAbi2 = (lender) => {
23024
24098
  return [...CometAbi, ...CometExtAbi, ...CometRewardsAbi];
23025
24099
  if (isMorphoType(lender)) return [...MorphoBlueAbi, ...MorphoLensAbi];
23026
24100
  if (isInit(lender)) return InitLensAbi;
24101
+ if (isEulerType(lender)) return accountLensAbi;
23027
24102
  if (isCompoundV2Type(lender))
23028
24103
  return [...ComptrollerAbi, ...CompoundV2CollateralToken];
23029
24104
  return [];
@@ -24113,6 +25188,11 @@ function keysFromMaps(a, b) {
24113
25188
  if (b) for (const k of Object.keys(b)) set.add(k);
24114
25189
  return [...set];
24115
25190
  }
25191
+ function rewardsToMap(rewards) {
25192
+ const map = {};
25193
+ if (Array.isArray(rewards)) for (const r of rewards) map[r.asset] = r;
25194
+ return map;
25195
+ }
24116
25196
  function noOpResult(balance, apr) {
24117
25197
  const hf = getHealthFactor2(balance.collateral, balance.adjustedDebt);
24118
25198
  const bc = balance.collateral - balance.adjustedDebt;
@@ -24189,13 +25269,13 @@ function getOrganicYieldCollateralSwap(amountInUSD, amountOutUSD, cashFlowDeposi
24189
25269
 
24190
25270
  // src/lending/margin/loop/yield/getRewardYieldChange.ts
24191
25271
  function getRewardYieldOpen(amountInUSD, amountOutUSD, irModeIn, cashFlowDeposits, cashFlowDebt, deposits, debt, yieldIn, yieldOut) {
24192
- const rewardsIn = yieldIn?.rewards;
24193
- const rewardsOut = yieldOut?.rewards;
24194
- if (!rewardsIn || !rewardsOut) return {};
25272
+ const mapIn = rewardsToMap(yieldIn?.rewards);
25273
+ const mapOut = rewardsToMap(yieldOut?.rewards);
25274
+ if (!yieldIn?.rewards?.length && !yieldOut?.rewards?.length) return {};
24195
25275
  const data = {};
24196
- for (const key of keysFromMaps(rewardsIn, rewardsOut)) {
24197
- const _flowIn = amountInUSD * ((irModeIn === 1 ? rewardsIn[key]?.stableBorrowRate : rewardsIn[key]?.variableBorrowRate) ?? 0);
24198
- const _flowOut = amountOutUSD * (rewardsOut[key]?.depositRate ?? 0);
25276
+ for (const key of keysFromMaps(mapIn, mapOut)) {
25277
+ const _flowIn = amountInUSD * ((irModeIn === 1 ? mapIn[key]?.stableBorrowRate : mapIn[key]?.variableBorrowRate) ?? 0);
25278
+ const _flowOut = amountOutUSD * (mapOut[key]?.depositRate ?? 0);
24199
25279
  const totalCashFlowDebt = cashFlowDebt + _flowIn;
24200
25280
  const totalCashFlowDeposits = cashFlowDeposits + _flowOut;
24201
25281
  const newCollat = deposits + amountOutUSD;
@@ -24209,13 +25289,13 @@ function getRewardYieldOpen(amountInUSD, amountOutUSD, irModeIn, cashFlowDeposit
24209
25289
  return data;
24210
25290
  }
24211
25291
  function getRewardYieldClose(amountInUSD, amountOutUSD, irModeOut, cashFlowDeposits, cashFlowDebt, deposits, debt, yieldIn, yieldOut) {
24212
- const rewardsIn = yieldIn?.rewards;
24213
- const rewardsOut = yieldOut?.rewards;
24214
- if (!rewardsIn || !rewardsOut) return {};
25292
+ const mapIn = rewardsToMap(yieldIn?.rewards);
25293
+ const mapOut = rewardsToMap(yieldOut?.rewards);
25294
+ if (!yieldIn?.rewards?.length && !yieldOut?.rewards?.length) return {};
24215
25295
  const data = {};
24216
- for (const key of keysFromMaps(rewardsIn, rewardsOut)) {
24217
- const _flowIn = amountInUSD * (rewardsIn[key]?.depositRate ?? 0);
24218
- const _flowOut = amountOutUSD * ((irModeOut === 1 ? rewardsOut[key]?.stableBorrowRate : rewardsOut[key]?.variableBorrowRate) ?? 0);
25296
+ for (const key of keysFromMaps(mapIn, mapOut)) {
25297
+ const _flowIn = amountInUSD * (mapIn[key]?.depositRate ?? 0);
25298
+ const _flowOut = amountOutUSD * ((irModeOut === 1 ? mapOut[key]?.stableBorrowRate : mapOut[key]?.variableBorrowRate) ?? 0);
24219
25299
  const totalCashFlowDebt = cashFlowDebt - _flowOut;
24220
25300
  const totalCashFlowDeposits = cashFlowDeposits - _flowIn;
24221
25301
  const newCollat = deposits - amountInUSD;
@@ -24229,13 +25309,13 @@ function getRewardYieldClose(amountInUSD, amountOutUSD, irModeOut, cashFlowDepos
24229
25309
  return data;
24230
25310
  }
24231
25311
  function getRewardYieldDebtSwap(amountInUSD, amountOutUSD, irModeIn, irModeOut, cashFlowDeposits, cashFlowDebt, deposits, debt, yieldIn, yieldOut) {
24232
- const rewardsIn = yieldIn?.rewards;
24233
- const rewardsOut = yieldOut?.rewards;
24234
- if (!rewardsIn || !rewardsOut) return {};
25312
+ const mapIn = rewardsToMap(yieldIn?.rewards);
25313
+ const mapOut = rewardsToMap(yieldOut?.rewards);
25314
+ if (!yieldIn?.rewards?.length && !yieldOut?.rewards?.length) return {};
24235
25315
  const data = {};
24236
- for (const key of keysFromMaps(rewardsIn, rewardsOut)) {
24237
- const _flowIn = amountInUSD * ((irModeIn === 1 ? rewardsIn[key]?.stableBorrowRate : rewardsIn[key]?.variableBorrowRate) ?? 0);
24238
- const _flowOut = amountOutUSD * ((irModeOut === 1 ? rewardsOut[key]?.stableBorrowRate : rewardsOut[key]?.variableBorrowRate) ?? 0);
25316
+ for (const key of keysFromMaps(mapIn, mapOut)) {
25317
+ const _flowIn = amountInUSD * ((irModeIn === 1 ? mapIn[key]?.stableBorrowRate : mapIn[key]?.variableBorrowRate) ?? 0);
25318
+ const _flowOut = amountOutUSD * ((irModeOut === 1 ? mapOut[key]?.stableBorrowRate : mapOut[key]?.variableBorrowRate) ?? 0);
24239
25319
  const totalCashFlowDebt = cashFlowDebt + _flowIn - _flowOut;
24240
25320
  const newDebt = debt - amountOutUSD + amountInUSD;
24241
25321
  data[key] = {
@@ -24247,13 +25327,13 @@ function getRewardYieldDebtSwap(amountInUSD, amountOutUSD, irModeIn, irModeOut,
24247
25327
  return data;
24248
25328
  }
24249
25329
  function getRewardYieldCollateralSwap(amountInUSD, amountOutUSD, cashFlowDeposits, cashFlowDebt, deposits, debt, yieldIn, yieldOut) {
24250
- const rewardsIn = yieldIn?.rewards;
24251
- const rewardsOut = yieldOut?.rewards;
24252
- if (!rewardsIn || !rewardsOut) return {};
25330
+ const mapIn = rewardsToMap(yieldIn?.rewards);
25331
+ const mapOut = rewardsToMap(yieldOut?.rewards);
25332
+ if (!yieldIn?.rewards?.length && !yieldOut?.rewards?.length) return {};
24253
25333
  const data = {};
24254
- for (const key of keysFromMaps(rewardsIn, rewardsOut)) {
24255
- const _flowIn = amountInUSD * (rewardsIn[key]?.depositRate ?? 0);
24256
- const _flowOut = amountOutUSD * (rewardsOut[key]?.depositRate ?? 0);
25334
+ for (const key of keysFromMaps(mapIn, mapOut)) {
25335
+ const _flowIn = amountInUSD * (mapIn[key]?.depositRate ?? 0);
25336
+ const _flowOut = amountOutUSD * (mapOut[key]?.depositRate ?? 0);
24257
25337
  const totalCashFlowDeposits = cashFlowDeposits + _flowOut - _flowIn;
24258
25338
  const newCollat = deposits + amountOutUSD - amountInUSD;
24259
25339
  data[key] = {
@@ -24627,9 +25707,8 @@ function meetsLiquidityThresholdsShort(pool, thresholds) {
24627
25707
  }
24628
25708
  function findMaxBorrowCollateralFactorRatio(lender, configsIn, configsOut) {
24629
25709
  let maxRatio = -Infinity;
24630
- let result = { modeId: 0, eModeCategory: 0 };
24631
- for (const modeIdStr of Object.keys(configsIn)) {
24632
- const modeId = Number(modeIdStr);
25710
+ let result = { modeId: "0", eModeCategory: 0 };
25711
+ for (const modeId of Object.keys(configsIn)) {
24633
25712
  const dataIn = configsIn[modeId];
24634
25713
  const dataOut = configsOut[modeId];
24635
25714
  if (dataIn.debtDisabled || isAaveV32Type(lender) && dataOut.collateralDisabled) {
@@ -24658,7 +25737,7 @@ var isEMode = (lender, longData, shortData) => findMaxBorrowCollateralFactorRati
24658
25737
  var intersection = (a0, a1) => {
24659
25738
  return a0.filter((a) => a1.includes(a));
24660
25739
  };
24661
- var LENDER_MODE_NO_MODE2 = 0;
25740
+ var LENDER_MODE_NO_MODE2 = "0";
24662
25741
  var getMaxLeverage = (lender, longData, shortData) => {
24663
25742
  if (isAaveV3Type(lender)) {
24664
25743
  const emode = isEMode(lender, longData, shortData).modeId;
@@ -24671,9 +25750,9 @@ var getMaxLeverage = (lender, longData, shortData) => {
24671
25750
  Object.values(shortData.config).map((c) => c.category)
24672
25751
  );
24673
25752
  if (modeIntersect.length === 0) return 1;
24674
- const configId = Object.values(longData.config).filter((c) => modeIntersect.includes(c.category)).sort(
25753
+ const configId = String(Object.values(longData.config).filter((c) => modeIntersect.includes(c.category)).sort(
24675
25754
  (c, d) => c.borrowCollateralFactor < d.borrowCollateralFactor ? 1 : -1
24676
- )[0].category;
25755
+ )[0].category);
24677
25756
  const cf2 = longData.config[configId]?.borrowCollateralFactor;
24678
25757
  const bf = shortData.config[configId]?.borrowFactor;
24679
25758
  return 1 / (1 - cf2 / bf);
@@ -24681,11 +25760,9 @@ var getMaxLeverage = (lender, longData, shortData) => {
24681
25760
  if (isSumerType(lender)) {
24682
25761
  const shortEntries = Object.entries(shortData?.config ?? {});
24683
25762
  if (shortEntries.length === 0) return 1;
24684
- const shortGroupId = Number(
24685
- shortEntries.sort(
24686
- ([, a], [, b]) => b.borrowCollateralFactor - a.borrowCollateralFactor
24687
- )[0][0]
24688
- );
25763
+ const shortGroupId = shortEntries.sort(
25764
+ ([, a], [, b]) => b.borrowCollateralFactor - a.borrowCollateralFactor
25765
+ )[0][0];
24689
25766
  const cf2 = longData?.config?.[shortGroupId]?.borrowCollateralFactor ?? 0;
24690
25767
  return cf2 > 0 && cf2 < 1 ? 1 / (1 - cf2) : 1;
24691
25768
  }
@@ -25454,13 +26531,14 @@ var hwhlpFetcher = {
25454
26531
  };
25455
26532
 
25456
26533
  // src/yields/intrinsic/fetchers/usdx.ts
25457
- var SUSDX_URL = "https://app.usdx.money/v1/base/apyInfo";
25458
26534
  var susdx = "SUSDX";
25459
26535
  var susdxFetcher = {
25460
26536
  label: "SUSDX",
25461
26537
  fetch: async () => {
25462
- const res = await fetch(SUSDX_URL).then((r) => r.json());
25463
- return { [susdx]: apyToApr(res.result.susdxApy) * 100 };
26538
+ return {
26539
+ [susdx]: 0
26540
+ // apyToApr(res.result.susdxApy) * 100
26541
+ };
25464
26542
  }
25465
26543
  };
25466
26544
 
@@ -29308,6 +30386,84 @@ var listaFetcher = {
29308
30386
  getAbi: getListaAbi
29309
30387
  };
29310
30388
 
30389
+ // src/prices/oracle-prices/fetchers/euler.ts
30390
+ var MAX_VIRTUAL_ADDRESS = 65535;
30391
+ function isUsdUnitOfAccount(addr) {
30392
+ const numeric = parseInt(addr, 16);
30393
+ return numeric <= MAX_VIRTUAL_ADDRESS;
30394
+ }
30395
+ function getEulerV2Calls(chainId) {
30396
+ if (!ENABLED_EULER_V2_CHAINS.includes(chainId)) return [];
30397
+ const configs = eulerConfigs() ?? {};
30398
+ const vaults = eulerVaults() ?? {};
30399
+ const results = [];
30400
+ for (const [lender, chainVaults] of Object.entries(vaults)) {
30401
+ const vaultList = chainVaults[chainId] ?? [];
30402
+ const config = configs[lender]?.[chainId];
30403
+ if (!config || vaultList.length === 0) continue;
30404
+ const calls = [];
30405
+ const meta = [];
30406
+ for (const vault of vaultList) {
30407
+ calls.push({
30408
+ address: config.vaultLens,
30409
+ name: "getVaultInfoFull",
30410
+ params: [vault]
30411
+ });
30412
+ meta.push({
30413
+ vault: vault.toLowerCase(),
30414
+ lender
30415
+ });
30416
+ }
30417
+ if (calls.length > 0) {
30418
+ results.push({ calls, meta, lender });
30419
+ }
30420
+ }
30421
+ return results;
30422
+ }
30423
+ function parseEulerV2Results(data, meta, context) {
30424
+ const entries = [];
30425
+ data.forEach((result, index) => {
30426
+ const queryMeta = meta[index];
30427
+ if (!queryMeta || !result) return;
30428
+ try {
30429
+ const priceInfo = result.liabilityPriceInfo;
30430
+ if (!priceInfo || priceInfo.queryFailure) return;
30431
+ const amountOutMid = BigInt(priceInfo.amountOutMid);
30432
+ if (amountOutMid === 0n) return;
30433
+ const unitOfAccountDecimals = BigInt(result.unitOfAccountDecimals);
30434
+ const priceInUoA = Number(amountOutMid) / Number(10n ** unitOfAccountDecimals);
30435
+ if (isNaN(priceInUoA) || priceInUoA === 0) return;
30436
+ const unitOfAccount = result.unitOfAccount.toLowerCase();
30437
+ let priceUSD;
30438
+ if (isUsdUnitOfAccount(unitOfAccount)) {
30439
+ priceUSD = priceInUoA;
30440
+ } else {
30441
+ const uoaUSD = context.usdPrices[unitOfAccount] ?? 0;
30442
+ if (uoaUSD === 0) return;
30443
+ priceUSD = priceInUoA * uoaUSD;
30444
+ }
30445
+ if (isNaN(priceUSD) || priceUSD === 0) return;
30446
+ const asset = result.asset.toLowerCase();
30447
+ entries.push({
30448
+ asset,
30449
+ price: priceInUoA,
30450
+ priceUSD,
30451
+ marketUid: createMarketUid(context.chainId, queryMeta.lender, queryMeta.vault)
30452
+ });
30453
+ } catch {
30454
+ }
30455
+ });
30456
+ return entries;
30457
+ }
30458
+ function getEulerV2Abi() {
30459
+ return vaultLensAbi;
30460
+ }
30461
+ var eulerV2Fetcher = {
30462
+ getCalls: getEulerV2Calls,
30463
+ parse: parseEulerV2Results,
30464
+ getAbi: getEulerV2Abi
30465
+ };
30466
+
29311
30467
  // src/prices/oracle-prices/fetchOraclePrices.ts
29312
30468
  async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3, batchSize = void 0, allowFailure = true, basePrices = {}, morphoMarketOverrides, listaMarketOverrides) {
29313
30469
  const result = {};
@@ -29315,7 +30471,8 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
29315
30471
  ...AaveOracleAbi,
29316
30472
  ...ProxyOracleAbi,
29317
30473
  ...CompoundV2OracleAbi,
29318
- ...ChainlinkAggregatorAbi
30474
+ ...ChainlinkAggregatorAbi,
30475
+ ...vaultLensAbi
29319
30476
  ];
29320
30477
  const chainPromises = chainIds.map(async (chainId) => {
29321
30478
  const chainResult = {};
@@ -29326,6 +30483,7 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
29326
30483
  const listaResults = listaFetcher.getCalls(chainId, {
29327
30484
  marketOverrides: listaMarketOverrides
29328
30485
  });
30486
+ const eulerResults = eulerV2Fetcher.getCalls(chainId);
29329
30487
  const morphoResults = morphoFetcher.getCalls(chainId, {
29330
30488
  marketOverrides: morphoMarketOverrides
29331
30489
  });
@@ -29371,6 +30529,16 @@ async function fetchOraclePrices(chainIds, rpcOverrides, lists = {}, retries = 3
29371
30529
  });
29372
30530
  allCalls.push(...fr.calls);
29373
30531
  }
30532
+ for (const fr of eulerResults) {
30533
+ fetcherTracker.push({
30534
+ lender: fr.lender,
30535
+ meta: fr.meta,
30536
+ offset: allCalls.length,
30537
+ count: fr.calls.length,
30538
+ parse: eulerV2Fetcher.parse
30539
+ });
30540
+ allCalls.push(...fr.calls);
30541
+ }
29374
30542
  for (const fr of morphoResults) {
29375
30543
  fetcherTracker.push({
29376
30544
  lender: fr.lender,
@@ -29976,19 +31144,20 @@ function computeEModeAnalysis(subAccount, lenderMeta, eModes) {
29976
31144
  const { positions, balanceData: balanceData2, userConfig } = subAccount;
29977
31145
  const currentMode = userConfig.selectedMode;
29978
31146
  return Object.values(eModes).map((eMode) => {
31147
+ const targetMode = String(eMode.category);
29979
31148
  const healthFactor = computeEModeSwitchHealth(
29980
31149
  positions,
29981
31150
  lenderMeta,
29982
31151
  balanceData2.collateral,
29983
31152
  balanceData2.adjustedDebt,
29984
31153
  currentMode,
29985
- eMode.category
31154
+ targetMode
29986
31155
  );
29987
- const supportedAssets = getSupportedAssets(lenderMeta, eMode.category);
31156
+ const supportedAssets = getSupportedAssets(lenderMeta, targetMode);
29988
31157
  const canSwitch = canSwitchToEMode(
29989
31158
  positions,
29990
31159
  lenderMeta,
29991
- eMode.category,
31160
+ targetMode,
29992
31161
  healthFactor
29993
31162
  );
29994
31163
  return {