@defisaver/positions-sdk 2.1.161-portfolio-api-2-dev → 2.1.161-portfolio-api-3-dev

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 (166) hide show
  1. package/cjs/aaveV2/index.js +2 -0
  2. package/cjs/aaveV3/index.d.ts +39 -0
  3. package/cjs/aaveV3/index.js +237 -2
  4. package/cjs/aaveV4/lend.d.ts +2 -43
  5. package/cjs/curveUsd/index.d.ts +5 -2
  6. package/cjs/curveUsd/index.js +30 -15
  7. package/cjs/fluid/index.d.ts +5 -0
  8. package/cjs/fluid/index.js +36 -1
  9. package/cjs/helpers/aaveHelpers/index.d.ts +9 -1
  10. package/cjs/helpers/aaveHelpers/index.js +26 -6
  11. package/cjs/helpers/aaveV4Helpers/index.js +1 -0
  12. package/cjs/helpers/compoundHelpers/index.js +2 -0
  13. package/cjs/helpers/curveUsdHelpers/index.d.ts +3 -1
  14. package/cjs/helpers/curveUsdHelpers/index.js +15 -2
  15. package/cjs/helpers/fluidHelpers/index.js +1 -0
  16. package/cjs/helpers/liquityV2Helpers/index.js +1 -0
  17. package/cjs/helpers/llamaLendHelpers/index.js +1 -0
  18. package/cjs/helpers/makerHelpers/index.d.ts +1 -1
  19. package/cjs/helpers/makerHelpers/index.js +2 -2
  20. package/cjs/helpers/morphoBlueHelpers/index.js +2 -0
  21. package/cjs/helpers/morphoMidnightHelpers/index.js +2 -0
  22. package/cjs/helpers/sparkHelpers/index.js +1 -0
  23. package/cjs/liquity/index.js +15 -2
  24. package/cjs/liquityV2/index.d.ts +5 -0
  25. package/cjs/liquityV2/index.js +37 -19
  26. package/cjs/maker/index.d.ts +7 -2
  27. package/cjs/maker/index.js +44 -12
  28. package/cjs/markets/index.d.ts +1 -0
  29. package/cjs/markets/index.js +3 -1
  30. package/cjs/markets/maker/index.d.ts +1 -0
  31. package/cjs/markets/maker/index.js +13 -0
  32. package/cjs/moneymarket/moneymarketCommonService.d.ts +9 -0
  33. package/cjs/moneymarket/moneymarketCommonService.js +13 -1
  34. package/cjs/portfolio/index.d.ts +17 -5
  35. package/cjs/portfolio/index.js +583 -394
  36. package/cjs/portfolio/lendingProtocols.d.ts +184 -0
  37. package/cjs/portfolio/lendingProtocols.js +196 -0
  38. package/cjs/savings/index.d.ts +8 -2
  39. package/cjs/savings/index.js +37 -5
  40. package/cjs/savings/morphoVaults/index.d.ts +1 -1
  41. package/cjs/savings/morphoVaults/index.js +56 -18
  42. package/cjs/savings/morphoVaults/options.d.ts +2 -0
  43. package/cjs/savings/morphoVaults/options.js +61 -1
  44. package/cjs/spark/index.js +1 -0
  45. package/cjs/staking/staking.d.ts +20 -0
  46. package/cjs/staking/staking.js +19 -1
  47. package/cjs/types/aave.d.ts +3 -0
  48. package/cjs/types/aaveV4.d.ts +45 -0
  49. package/cjs/types/compound.d.ts +2 -0
  50. package/cjs/types/curveUsd.d.ts +6 -0
  51. package/cjs/types/fluid.d.ts +1 -0
  52. package/cjs/types/liquity.d.ts +4 -0
  53. package/cjs/types/liquityV2.d.ts +2 -0
  54. package/cjs/types/maker.d.ts +4 -0
  55. package/cjs/types/morphoBlue.d.ts +2 -0
  56. package/cjs/types/morphoMidnight.d.ts +1 -0
  57. package/cjs/types/portfolio.d.ts +64 -6
  58. package/cjs/types/savings/index.d.ts +9 -1
  59. package/cjs/types/savings/morphoVaults.d.ts +10 -2
  60. package/cjs/types/savings/morphoVaults.js +9 -1
  61. package/cjs/types/spark.d.ts +2 -0
  62. package/esm/aaveV2/index.js +2 -0
  63. package/esm/aaveV3/index.d.ts +39 -0
  64. package/esm/aaveV3/index.js +231 -2
  65. package/esm/aaveV4/lend.d.ts +2 -43
  66. package/esm/curveUsd/index.d.ts +5 -2
  67. package/esm/curveUsd/index.js +30 -15
  68. package/esm/fluid/index.d.ts +5 -0
  69. package/esm/fluid/index.js +33 -0
  70. package/esm/helpers/aaveHelpers/index.d.ts +9 -1
  71. package/esm/helpers/aaveHelpers/index.js +23 -5
  72. package/esm/helpers/aaveV4Helpers/index.js +1 -0
  73. package/esm/helpers/compoundHelpers/index.js +2 -0
  74. package/esm/helpers/curveUsdHelpers/index.d.ts +3 -1
  75. package/esm/helpers/curveUsdHelpers/index.js +16 -3
  76. package/esm/helpers/fluidHelpers/index.js +1 -0
  77. package/esm/helpers/liquityV2Helpers/index.js +1 -0
  78. package/esm/helpers/llamaLendHelpers/index.js +2 -1
  79. package/esm/helpers/makerHelpers/index.d.ts +1 -1
  80. package/esm/helpers/makerHelpers/index.js +2 -2
  81. package/esm/helpers/morphoBlueHelpers/index.js +2 -0
  82. package/esm/helpers/morphoMidnightHelpers/index.js +2 -0
  83. package/esm/helpers/sparkHelpers/index.js +1 -0
  84. package/esm/liquity/index.js +16 -3
  85. package/esm/liquityV2/index.d.ts +5 -0
  86. package/esm/liquityV2/index.js +35 -18
  87. package/esm/maker/index.d.ts +7 -2
  88. package/esm/maker/index.js +44 -14
  89. package/esm/markets/index.d.ts +1 -0
  90. package/esm/markets/index.js +1 -0
  91. package/esm/markets/maker/index.d.ts +1 -0
  92. package/esm/markets/maker/index.js +10 -0
  93. package/esm/moneymarket/moneymarketCommonService.d.ts +9 -0
  94. package/esm/moneymarket/moneymarketCommonService.js +11 -0
  95. package/esm/portfolio/index.d.ts +17 -5
  96. package/esm/portfolio/index.js +584 -398
  97. package/esm/portfolio/lendingProtocols.d.ts +184 -0
  98. package/esm/portfolio/lendingProtocols.js +189 -0
  99. package/esm/savings/index.d.ts +8 -2
  100. package/esm/savings/index.js +35 -4
  101. package/esm/savings/morphoVaults/index.d.ts +1 -1
  102. package/esm/savings/morphoVaults/index.js +57 -19
  103. package/esm/savings/morphoVaults/options.d.ts +2 -0
  104. package/esm/savings/morphoVaults/options.js +61 -1
  105. package/esm/spark/index.js +1 -0
  106. package/esm/staking/staking.d.ts +20 -0
  107. package/esm/staking/staking.js +17 -0
  108. package/esm/types/aave.d.ts +3 -0
  109. package/esm/types/aaveV4.d.ts +45 -0
  110. package/esm/types/compound.d.ts +2 -0
  111. package/esm/types/curveUsd.d.ts +6 -0
  112. package/esm/types/fluid.d.ts +1 -0
  113. package/esm/types/liquity.d.ts +4 -0
  114. package/esm/types/liquityV2.d.ts +2 -0
  115. package/esm/types/maker.d.ts +4 -0
  116. package/esm/types/morphoBlue.d.ts +2 -0
  117. package/esm/types/morphoMidnight.d.ts +1 -0
  118. package/esm/types/portfolio.d.ts +64 -6
  119. package/esm/types/savings/index.d.ts +9 -1
  120. package/esm/types/savings/morphoVaults.d.ts +10 -2
  121. package/esm/types/savings/morphoVaults.js +8 -0
  122. package/esm/types/spark.d.ts +2 -0
  123. package/package.json +3 -2
  124. package/src/aaveV2/index.ts +2 -0
  125. package/src/aaveV3/index.ts +291 -1
  126. package/src/aaveV4/lend.ts +2 -48
  127. package/src/curveUsd/index.ts +33 -16
  128. package/src/fluid/index.ts +40 -0
  129. package/src/helpers/aaveHelpers/index.ts +27 -7
  130. package/src/helpers/aaveV4Helpers/index.ts +1 -0
  131. package/src/helpers/compoundHelpers/index.ts +2 -0
  132. package/src/helpers/curveUsdHelpers/index.ts +23 -3
  133. package/src/helpers/fluidHelpers/index.ts +1 -0
  134. package/src/helpers/liquityV2Helpers/index.ts +1 -0
  135. package/src/helpers/llamaLendHelpers/index.ts +2 -1
  136. package/src/helpers/makerHelpers/index.ts +2 -1
  137. package/src/helpers/morphoBlueHelpers/index.ts +2 -0
  138. package/src/helpers/morphoMidnightHelpers/index.ts +2 -0
  139. package/src/helpers/sparkHelpers/index.ts +1 -0
  140. package/src/liquity/index.ts +17 -3
  141. package/src/liquityV2/index.ts +45 -19
  142. package/src/maker/index.ts +77 -30
  143. package/src/markets/index.ts +2 -1
  144. package/src/markets/maker/index.ts +10 -0
  145. package/src/moneymarket/moneymarketCommonService.ts +15 -0
  146. package/src/portfolio/index.ts +428 -215
  147. package/src/portfolio/lendingProtocols.ts +281 -0
  148. package/src/savings/index.ts +45 -5
  149. package/src/savings/morphoVaults/index.ts +73 -21
  150. package/src/savings/morphoVaults/options.ts +67 -1
  151. package/src/spark/index.ts +1 -0
  152. package/src/staking/staking.ts +28 -0
  153. package/src/types/aave.ts +4 -0
  154. package/src/types/aaveV4.ts +50 -0
  155. package/src/types/compound.ts +2 -0
  156. package/src/types/curveUsd.ts +7 -0
  157. package/src/types/fluid.ts +1 -0
  158. package/src/types/liquity.ts +6 -0
  159. package/src/types/liquityV2.ts +2 -0
  160. package/src/types/maker.ts +6 -0
  161. package/src/types/morphoBlue.ts +2 -0
  162. package/src/types/morphoMidnight.ts +1 -0
  163. package/src/types/portfolio.ts +71 -6
  164. package/src/types/savings/index.ts +12 -1
  165. package/src/types/savings/morphoVaults.ts +11 -1
  166. package/src/types/spark.ts +2 -0
@@ -167,6 +167,8 @@ export const _getAaveV2AccountData = (provider, network, address, assetsData, ma
167
167
  payload.collRatio = payload.borrowedUsd && payload.borrowedUsd !== '0'
168
168
  ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString()
169
169
  : '0';
170
+ // Aave v2 has no LTV-0 fallback (AaveV3View only), so its safety ratio is the plain ratio.
171
+ payload.safetyRatio = payload.ratio;
170
172
  // Calculate borrow limits per asset
171
173
  Object.values(payload.usedAssets).forEach((item) => {
172
174
  if (item.isBorrowed) {
@@ -32,6 +32,45 @@ export declare const EMPTY_AAVE_DATA: {
32
32
  };
33
33
  export declare const _getAaveV3AccountBalances: (provider: Client, network: NetworkNumber, block: Blockish, addressMapping: boolean, address: EthAddress) => Promise<PositionBalances>;
34
34
  export declare const getAaveV3AccountBalances: (provider: EthereumProvider, network: NetworkNumber, block: Blockish, addressMapping: boolean, address: EthAddress) => Promise<PositionBalances>;
35
+ export interface AaveV3ReserveTokenAddresses {
36
+ [symbol: string]: {
37
+ symbol: string;
38
+ underlyingAddress: EthAddress;
39
+ aTokenAddress: EthAddress;
40
+ stableDebtTokenAddress: EthAddress;
41
+ variableDebtTokenAddress: EthAddress;
42
+ };
43
+ }
44
+ export interface AaveV3HistoricalBalance {
45
+ block: number;
46
+ suppliedUsd: string;
47
+ borrowedUsd: string;
48
+ netUsd: string;
49
+ }
50
+ /**
51
+ * Fetches the aToken / stable-debt / variable-debt token addresses for every asset in the market.
52
+ * These are effectively immutable per reserve, so fetch once and reuse across all history points.
53
+ */
54
+ export declare const _getAaveV3ReserveTokenAddresses: (provider: Client, network: NetworkNumber, market: AaveMarketInfo) => Promise<AaveV3ReserveTokenAddresses>;
55
+ export declare const getAaveV3ReserveTokenAddresses: (provider: EthereumProvider, network: NetworkNumber, market: AaveMarketInfo) => Promise<AaveV3ReserveTokenAddresses>;
56
+ /**
57
+ * Resolves the price oracle the market's addresses provider points at (at `block`, or latest).
58
+ * Aave can rotate the oracle over time, so a caller hoisting one address across many historical
59
+ * points must resolve it at both ends of its block range and only reuse it when the two agree —
60
+ * otherwise leave `oracleAddress` unset on _getAaveV3HistoricalBalance and it resolves per block.
61
+ */
62
+ export declare const _getAaveV3OracleAddress: (provider: Client, network: NetworkNumber, market: AaveMarketInfo, block?: Blockish) => Promise<EthAddress>;
63
+ export declare const getAaveV3OracleAddress: (provider: EthereumProvider, network: NetworkNumber, market: AaveMarketInfo, block?: Blockish) => Promise<EthAddress>;
64
+ /**
65
+ * Computes a user's Aave v3 net USD balance (supplied collateral - borrowed debt) at a historical block,
66
+ * without touching the AaveV3View contract. Pass `reserveTokens` (from getAaveV3ReserveTokenAddresses)
67
+ * to avoid refetching token addresses for every point, and `oracleAddress` (from getAaveV3OracleAddress,
68
+ * verified identical at both ends of the sampled range) to collapse the point into a single multicall —
69
+ * with it the balances and all prices ride one request; without it the oracle is resolved at the block
70
+ * inside the balance multicall and the active assets are priced in a second one.
71
+ */
72
+ export declare const _getAaveV3HistoricalBalance: (provider: Client, network: NetworkNumber, market: AaveMarketInfo, address: EthAddress, block: number, reserveTokens?: AaveV3ReserveTokenAddresses, oracleAddress?: EthAddress) => Promise<AaveV3HistoricalBalance>;
73
+ export declare const getAaveV3HistoricalBalance: (provider: EthereumProvider, network: NetworkNumber, market: AaveMarketInfo, address: EthAddress, block: number, reserveTokens?: AaveV3ReserveTokenAddresses, oracleAddress?: EthAddress) => Promise<AaveV3HistoricalBalance>;
35
74
  export declare const _getAaveV3AccountData: (provider: Client, network: NetworkNumber, address: EthAddress, extractedState: any, blockNumber?: "latest" | number) => Promise<AaveV3PositionData>;
36
75
  export declare const getAaveV3AccountData: (provider: EthereumProvider, network: NetworkNumber, address: EthAddress, extractedState: any, blockNumber?: "latest" | number) => Promise<AaveV3PositionData>;
37
76
  export declare const getAaveV3FullPositionData: (provider: EthereumProvider, network: NetworkNumber, address: EthAddress, market: AaveMarketInfo) => Promise<AaveV3PositionData>;
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import { assetAmountInEth, assetAmountInWei, getAssetInfo } from '@defisaver/tokens';
11
11
  import Dec from 'decimal.js';
12
- import { AaveIncentiveDataProviderV3ContractViem, AaveIncentivesControllerViem, AaveV3ViewContractViem, createViemContractFromConfigFunc, StkAAVEViem, } from '../contracts';
12
+ import { AaveIncentiveDataProviderV3ContractViem, AaveIncentivesControllerViem, AaveV3ViewContractViem, createViemContractFromConfigFunc, getConfigContractAbi, StkAAVEViem, } from '../contracts';
13
13
  import { aaveAnyGetAggregatedPositionData, aaveV3IsInIsolationMode, aaveV3IsInSiloedMode } from '../helpers/aaveHelpers';
14
14
  import { AAVE_V3 } from '../markets/aave';
15
15
  import { aprToApy, calculateBorrowingAssetLimit } from '../moneymarket';
@@ -31,7 +31,10 @@ export const aaveV3EmodeCategoriesMapping = (extractedState, usedAssets) => {
31
31
  : !usedAssetsValues.filter(u => u.isBorrowed && !e.borrowAssets.includes(u.symbol)).length;
32
32
  const afterEnteringCategory = aaveAnyGetAggregatedPositionData(Object.assign(Object.assign({}, extractedState), { usedAssets, eModeCategory: e.id }));
33
33
  const willStayOverCollateralized = new Dec(afterEnteringCategory.ratio === 'NaN' ? '0' : afterEnteringCategory.ratio).eq(0) || new Dec(afterEnteringCategory.ratio).gt(afterEnteringCategory.liqPercent);
34
- const enteringTerms = [borrowingOnlyFromCategory, willStayOverCollateralized];
34
+ const collateralOnlyFromCategory = e.id === 0 || !e.isolated
35
+ ? true
36
+ : !usedAssetsValues.filter(u => u.isSupplied && u.collateral && !e.collateralAssets.includes(u.symbol)).length;
37
+ const enteringTerms = [borrowingOnlyFromCategory, willStayOverCollateralized, collateralOnlyFromCategory];
35
38
  categoriesMapping[e.id] = {
36
39
  enteringTerms,
37
40
  canEnterCategory: !enteringTerms.includes(false),
@@ -48,6 +51,7 @@ export const aaveV3EmodeCategoriesMapping = (extractedState, usedAssets) => {
48
51
  };
49
52
  export function _getAaveV3MarketData(provider_1, network_1, market_1) {
50
53
  return __awaiter(this, arguments, void 0, function* (provider, network, market, blockNumber = 'latest') {
54
+ var _a;
51
55
  const _addresses = market.assets.map(a => getAssetInfo(getWrappedNativeAssetFromUnwrapped(a), network).address);
52
56
  const loanInfoContract = AaveV3ViewContractViem(provider, network);
53
57
  const aaveIncentivesContract = AaveIncentiveDataProviderV3ContractViem(provider, network);
@@ -81,6 +85,7 @@ export function _getAaveV3MarketData(provider_1, network_1, market_1) {
81
85
  borrowableBitmap: eModesInfo[i].borrowableBitmap.toString(),
82
86
  collateralBitmap: eModesInfo[i].collateralBitmap.toString(),
83
87
  ltvzeroBitmap: eModesInfo[i].ltvzeroBitmap.toString(),
88
+ isolated: (_a = eModesInfo[i].isolated) !== null && _a !== void 0 ? _a : false,
84
89
  borrowAssets: [],
85
90
  collateralAssets: [],
86
91
  ltvZeroAssets: [],
@@ -296,6 +301,7 @@ export function _getAaveV3MarketData(provider_1, network_1, market_1) {
296
301
  collateralAssets: assetsData.map((a) => a.symbol),
297
302
  borrowAssets: assetsData.map((a) => a.symbol),
298
303
  ltvZeroAssets: [],
304
+ isolated: false,
299
305
  };
300
306
  return { assetsData: payload, eModeCategoriesData };
301
307
  });
@@ -362,6 +368,229 @@ export const _getAaveV3AccountBalances = (provider, network, block, addressMappi
362
368
  return balances;
363
369
  });
364
370
  export const getAaveV3AccountBalances = (provider, network, block, addressMapping, address) => __awaiter(void 0, void 0, void 0, function* () { return _getAaveV3AccountBalances(getViemProvider(provider, network), network, block, addressMapping, address); });
371
+ /**
372
+ * Historical net-balance helpers that bypass the AaveV3View contract.
373
+ *
374
+ * The View contract (and therefore `getAaveV3AccountData` / `getAaveV3AccountBalances`) can only be
375
+ * queried from its deployment block onwards, so it cannot read balances for positions older than that.
376
+ * The aTokens/debt tokens, the ProtocolDataProvider and the Aave price oracle all exist from Aave v3
377
+ * launch, so reading `balanceOf` on those tokens + the oracle price directly reaches much further back
378
+ * and costs ~1 multicall per point. Used to build a position balance-history chart.
379
+ */
380
+ // matches morphoVaults' batchSize; stays under the 500k portfolio discovery allows on simulation fork RPCs
381
+ const HISTORICAL_MULTICALL_BATCH_SIZE = 250000;
382
+ // Minimal Aave price oracle ABI (getAssetPrice returns the asset price in the market base currency).
383
+ const AAVE_ORACLE_ABI = [
384
+ {
385
+ inputs: [{ internalType: 'address', name: 'asset', type: 'address' }],
386
+ name: 'getAssetPrice',
387
+ outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
388
+ stateMutability: 'view',
389
+ type: 'function',
390
+ },
391
+ ];
392
+ /**
393
+ * Fetches the aToken / stable-debt / variable-debt token addresses for every asset in the market.
394
+ * These are effectively immutable per reserve, so fetch once and reuse across all history points.
395
+ */
396
+ export const _getAaveV3ReserveTokenAddresses = (provider, network, market) => __awaiter(void 0, void 0, void 0, function* () {
397
+ const symbols = market.assets;
398
+ const underlyingAddresses = symbols.map((a) => getAssetInfo(getWrappedNativeAssetFromUnwrapped(a), network).address);
399
+ // @ts-ignore market.protocolData is a valid config key at runtime
400
+ const dataProviderAbi = getConfigContractAbi(market.protocolData, network);
401
+ const contracts = underlyingAddresses.map((underlying) => ({
402
+ address: market.protocolDataAddress,
403
+ abi: dataProviderAbi,
404
+ functionName: 'getReserveTokensAddresses',
405
+ args: [underlying],
406
+ }));
407
+ // @ts-ignore
408
+ const results = yield provider.multicall({ contracts, allowFailure: true, batchSize: HISTORICAL_MULTICALL_BATCH_SIZE });
409
+ const mapping = {};
410
+ results.forEach((res, i) => {
411
+ if (res.status !== 'success' || !res.result)
412
+ return;
413
+ // outputs order: [aTokenAddress, stableDebtTokenAddress, variableDebtTokenAddress]
414
+ const [aTokenAddress, stableDebtTokenAddress, variableDebtTokenAddress] = res.result;
415
+ mapping[symbols[i]] = {
416
+ symbol: symbols[i],
417
+ underlyingAddress: underlyingAddresses[i],
418
+ aTokenAddress,
419
+ stableDebtTokenAddress,
420
+ variableDebtTokenAddress,
421
+ };
422
+ });
423
+ return mapping;
424
+ });
425
+ export const getAaveV3ReserveTokenAddresses = (provider, network, market) => __awaiter(void 0, void 0, void 0, function* () { return _getAaveV3ReserveTokenAddresses(getViemProvider(provider, network, { batch: { multicall: true } }), network, market); });
426
+ /**
427
+ * Resolves the price oracle the market's addresses provider points at (at `block`, or latest).
428
+ * Aave can rotate the oracle over time, so a caller hoisting one address across many historical
429
+ * points must resolve it at both ends of its block range and only reuse it when the two agree —
430
+ * otherwise leave `oracleAddress` unset on _getAaveV3HistoricalBalance and it resolves per block.
431
+ */
432
+ export const _getAaveV3OracleAddress = (provider_1, network_1, market_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, market_1, ...args_1], void 0, function* (provider, network, market, block = 'latest') {
433
+ // @ts-ignore market.provider is a valid config key at runtime
434
+ const providerAbi = getConfigContractAbi(market.provider, network);
435
+ // @ts-ignore readContract exists on the public client returned by getViemProvider
436
+ const oracleAddress = yield provider.readContract(Object.assign({ address: market.providerAddress, abi: providerAbi, functionName: 'getPriceOracle' }, setViemBlockNumber(block)));
437
+ if (!oracleAddress)
438
+ throw new Error(`AaveV3 oracle unavailable at block ${block}`);
439
+ return oracleAddress;
440
+ });
441
+ export const getAaveV3OracleAddress = (provider_1, network_1, market_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, market_1, ...args_1], void 0, function* (provider, network, market, block = 'latest') { return _getAaveV3OracleAddress(getViemProvider(provider, network, { batch: { multicall: true } }), network, market, block); });
442
+ // supply = aToken.balanceOf, debt = variableDebtToken.balanceOf + stableDebtToken.balanceOf — three reads per reserve
443
+ const getHistoricalBalanceContracts = (entries, address) => {
444
+ const erc20Abi = getConfigContractAbi('Erc20');
445
+ return entries.flatMap((e) => ([
446
+ {
447
+ address: e.aTokenAddress, abi: erc20Abi, functionName: 'balanceOf', args: [address],
448
+ },
449
+ {
450
+ address: e.variableDebtTokenAddress, abi: erc20Abi, functionName: 'balanceOf', args: [address],
451
+ },
452
+ {
453
+ address: e.stableDebtTokenAddress, abi: erc20Abi, functionName: 'balanceOf', args: [address],
454
+ },
455
+ ]));
456
+ };
457
+ const getAssetPriceContract = (oracle, underlyingAddress) => ({
458
+ address: oracle,
459
+ abi: AAVE_ORACLE_ABI,
460
+ functionName: 'getAssetPrice',
461
+ args: [underlyingAddress],
462
+ });
463
+ /**
464
+ * Pairs each reserve with its three balance reads and keeps the assets the wallet actually held.
465
+ * Throws when every read failed — a totally failed fetch must not masquerade as a real $0 balance,
466
+ * so the caller can distinguish "fetch failed" (gap) from "position was empty" (genuine 0).
467
+ */
468
+ const toActiveHistoricalAssets = (entries, balanceResults, block) => {
469
+ const anyBalanceRead = balanceResults.some((r) => (r === null || r === void 0 ? void 0 : r.status) === 'success');
470
+ if (!anyBalanceRead)
471
+ throw new Error(`AaveV3 historical balance: all balance reads failed at block ${block}`);
472
+ return entries.map((e, i) => {
473
+ const supplyRes = balanceResults[i * 3];
474
+ const varDebtRes = balanceResults[(i * 3) + 1];
475
+ const stableDebtRes = balanceResults[(i * 3) + 2];
476
+ const supplied = (supplyRes === null || supplyRes === void 0 ? void 0 : supplyRes.status) === 'success' ? supplyRes.result.toString() : '0';
477
+ const varDebt = (varDebtRes === null || varDebtRes === void 0 ? void 0 : varDebtRes.status) === 'success' ? varDebtRes.result.toString() : '0';
478
+ const stableDebt = (stableDebtRes === null || stableDebtRes === void 0 ? void 0 : stableDebtRes.status) === 'success' ? stableDebtRes.result.toString() : '0';
479
+ const debt = new Dec(varDebt).add(stableDebt).toString();
480
+ return Object.assign(Object.assign({}, e), { supplied, debt });
481
+ }).filter((a) => a.supplied !== '0' || a.debt !== '0');
482
+ };
483
+ /**
484
+ * Sums the active assets into the point's USD totals. Throws when every price read failed — the
485
+ * oracle couldn't serve this block (pruned state, or a hoisted oracle that wasn't deployed yet back
486
+ * then), and totalling it up anyway would return a fake near-$0 balance. A single asset's price
487
+ * failure still just skips that asset, matching the live data path.
488
+ */
489
+ const sumHistoricalUsd = (activeAssets, priceResBySymbol, block) => {
490
+ const anyPriceRead = activeAssets.some((a) => { var _a; return ((_a = priceResBySymbol[a.symbol]) === null || _a === void 0 ? void 0 : _a.status) === 'success'; });
491
+ if (!anyPriceRead)
492
+ throw new Error(`AaveV3 historical balance: all price reads failed at block ${block}`);
493
+ let suppliedUsd = new Dec(0);
494
+ let borrowedUsd = new Dec(0);
495
+ activeAssets.forEach((a) => {
496
+ const priceRes = priceResBySymbol[a.symbol];
497
+ if ((priceRes === null || priceRes === void 0 ? void 0 : priceRes.status) !== 'success')
498
+ return;
499
+ const priceUsd = new Dec(priceRes.result.toString()).div(1e8); // Aave v3 base currency is USD with 8 decimals
500
+ if (a.supplied !== '0')
501
+ suppliedUsd = suppliedUsd.add(new Dec(assetAmountInEth(a.supplied, a.symbol)).mul(priceUsd));
502
+ if (a.debt !== '0')
503
+ borrowedUsd = borrowedUsd.add(new Dec(assetAmountInEth(a.debt, a.symbol)).mul(priceUsd));
504
+ });
505
+ return {
506
+ block,
507
+ suppliedUsd: suppliedUsd.toString(),
508
+ borrowedUsd: borrowedUsd.toString(),
509
+ netUsd: suppliedUsd.minus(borrowedUsd).toString(),
510
+ };
511
+ };
512
+ /**
513
+ * Fast path, ONE multicall: balances plus a price read for every reserve through the caller-hoisted
514
+ * oracle. Prices are read for all reserves because which assets are active isn't known until the
515
+ * balances come back — extra reads inside an already-paid multicall are nearly free.
516
+ */
517
+ const fetchHistoricalPointWithOracle = (provider, entries, address, block, oracleAddress) => __awaiter(void 0, void 0, void 0, function* () {
518
+ const balanceContracts = getHistoricalBalanceContracts(entries, address);
519
+ const priceContracts = entries.map((e) => getAssetPriceContract(oracleAddress, e.underlyingAddress));
520
+ // @ts-ignore
521
+ const results = yield provider.multicall({
522
+ contracts: [...balanceContracts, ...priceContracts], allowFailure: true, blockNumber: BigInt(block), batchSize: HISTORICAL_MULTICALL_BATCH_SIZE,
523
+ });
524
+ const activeAssets = toActiveHistoricalAssets(entries, results.slice(0, balanceContracts.length), block);
525
+ const priceResBySymbol = {};
526
+ results.slice(balanceContracts.length).forEach((res, i) => {
527
+ priceResBySymbol[entries[i].symbol] = res;
528
+ });
529
+ return { activeAssets, priceResBySymbol };
530
+ });
531
+ /**
532
+ * Fallback path, TWO multicalls: balances plus getPriceOracle (resolving the oracle that was active
533
+ * AT the block — Aave can rotate it over time), then prices for just the active assets. The oracle
534
+ * read has no fallback: if it fails (bad archive node, rate limit, ...) the failure must surface
535
+ * rather than silently returning $0 — the caller renders a gap instead of a misleading zero.
536
+ */
537
+ const fetchHistoricalPointResolvingOracle = (provider, network, market, entries, address, block) => __awaiter(void 0, void 0, void 0, function* () {
538
+ const balanceContracts = getHistoricalBalanceContracts(entries, address);
539
+ // @ts-ignore market.provider is a valid config key at runtime
540
+ const providerAbi = getConfigContractAbi(market.provider, network);
541
+ const oracleContract = {
542
+ address: market.providerAddress,
543
+ abi: providerAbi,
544
+ functionName: 'getPriceOracle',
545
+ };
546
+ const blockNumber = BigInt(block);
547
+ // @ts-ignore
548
+ const results = yield provider.multicall({
549
+ contracts: [...balanceContracts, oracleContract], allowFailure: true, blockNumber, batchSize: HISTORICAL_MULTICALL_BATCH_SIZE,
550
+ });
551
+ const oracleRes = results[balanceContracts.length];
552
+ if ((oracleRes === null || oracleRes === void 0 ? void 0 : oracleRes.status) !== 'success' || !oracleRes.result)
553
+ throw new Error(`AaveV3 historical balance: oracle unavailable at block ${block}`);
554
+ const activeAssets = toActiveHistoricalAssets(entries, results.slice(0, balanceContracts.length), block);
555
+ if (!activeAssets.length)
556
+ return { activeAssets, priceResBySymbol: {} };
557
+ const priceContracts = activeAssets.map((a) => getAssetPriceContract(oracleRes.result, a.underlyingAddress));
558
+ // @ts-ignore
559
+ const priceResults = yield provider.multicall({
560
+ contracts: priceContracts, allowFailure: true, blockNumber, batchSize: HISTORICAL_MULTICALL_BATCH_SIZE,
561
+ });
562
+ const priceResBySymbol = {};
563
+ priceResults.forEach((res, i) => {
564
+ priceResBySymbol[activeAssets[i].symbol] = res;
565
+ });
566
+ return { activeAssets, priceResBySymbol };
567
+ });
568
+ /**
569
+ * Computes a user's Aave v3 net USD balance (supplied collateral - borrowed debt) at a historical block,
570
+ * without touching the AaveV3View contract. Pass `reserveTokens` (from getAaveV3ReserveTokenAddresses)
571
+ * to avoid refetching token addresses for every point, and `oracleAddress` (from getAaveV3OracleAddress,
572
+ * verified identical at both ends of the sampled range) to collapse the point into a single multicall —
573
+ * with it the balances and all prices ride one request; without it the oracle is resolved at the block
574
+ * inside the balance multicall and the active assets are priced in a second one.
575
+ */
576
+ export const _getAaveV3HistoricalBalance = (provider, network, market, address, block, reserveTokens, oracleAddress) => __awaiter(void 0, void 0, void 0, function* () {
577
+ const empty = {
578
+ block, suppliedUsd: '0', borrowedUsd: '0', netUsd: '0',
579
+ };
580
+ if (!address)
581
+ return empty;
582
+ const tokens = reserveTokens || (yield _getAaveV3ReserveTokenAddresses(provider, network, market));
583
+ const entries = Object.values(tokens);
584
+ if (!entries.length)
585
+ return empty;
586
+ const { activeAssets, priceResBySymbol } = oracleAddress
587
+ ? yield fetchHistoricalPointWithOracle(provider, entries, address, block, oracleAddress)
588
+ : yield fetchHistoricalPointResolvingOracle(provider, network, market, entries, address, block);
589
+ if (!activeAssets.length)
590
+ return empty;
591
+ return sumHistoricalUsd(activeAssets, priceResBySymbol, block);
592
+ });
593
+ export const getAaveV3HistoricalBalance = (provider, network, market, address, block, reserveTokens, oracleAddress) => __awaiter(void 0, void 0, void 0, function* () { return _getAaveV3HistoricalBalance(getViemProvider(provider, network, { batch: { multicall: true } }), network, market, address, block, reserveTokens, oracleAddress); });
365
594
  export const _getAaveV3AccountData = (provider_1, network_1, address_1, extractedState_1, ...args_1) => __awaiter(void 0, [provider_1, network_1, address_1, extractedState_1, ...args_1], void 0, function* (provider, network, address, extractedState, blockNumber = 'latest') {
366
595
  const { selectedMarket: market, assetsData, eModeCategoriesData, } = extractedState;
367
596
  let payload = Object.assign(Object.assign({}, EMPTY_AAVE_DATA), { lastUpdated: Date.now() });
@@ -1,53 +1,12 @@
1
1
  import { EthAddress, EthereumProvider, NetworkNumber } from '../types/common';
2
- export interface AaveV4TokenizationSpokeData {
3
- underlyingAsset: EthAddress;
4
- assetId: string;
5
- decimals: number;
6
- spoke: EthAddress;
7
- spokeActive: boolean;
8
- spokeHalted: boolean;
9
- spokeDepositCap: string;
10
- spokeTotalAssets: string;
11
- spokeTotalShares: string;
12
- hub: EthAddress;
13
- hubLiquidity: string;
14
- hubDrawnRate: string;
15
- convertToShares: string;
16
- convertToAssets: string;
17
- user: EthAddress;
18
- userSuppliedAssets: string;
19
- userSuppliedShares: string;
20
- }
2
+ import { AaveV4TokenizationSpokeDataParsed } from '../types/aaveV4';
3
+ export type { AaveV4TokenizationSpokeData, AaveV4TokenizationSpokeDataParsed } from '../types/aaveV4';
21
4
  export declare const AAVE_V4_TOKENIZED_SPOKES: Record<string, EthAddress>;
22
5
  export declare const AAVE_V4_TOKENIZED_SPOKE_ADDRESSES: Partial<Record<NetworkNumber, EthAddress[]>>;
23
6
  export type AaveV4TokenizedHubKey = 'CORE' | 'PLUS' | 'PRIME' | 'PAXOS';
24
7
  export declare const aaveV4GetTokenizedHubKey: (hubNameOrKey?: string | null) => AaveV4TokenizedHubKey | null;
25
8
  export declare const aaveV4GetTokenizedVaultKey: (symbol: string, hubNameOrKey?: string | null) => string | null;
26
9
  export declare const aaveV4GetTokenizedVaultAddress: (network: NetworkNumber, symbol: string, hubNameOrKey?: string | null) => EthAddress | undefined;
27
- /** Parsed tokenization spoke data with human-readable supplied amounts for display */
28
- export interface AaveV4TokenizationSpokeDataParsed {
29
- vaultAddress: EthAddress;
30
- key: string | null;
31
- symbol: string;
32
- hubKey: string;
33
- spokeActive: boolean;
34
- spokeHalted: boolean;
35
- /** Deposit cap in asset units (wei string) */
36
- spokeDepositCap: string;
37
- /** Total assets currently in spoke in asset units (wei string) */
38
- spokeTotalAssets: string;
39
- /** Available hub liquidity in asset units (wei string) */
40
- hubLiquidity: string;
41
- /** The conversion rate from assets to shares expressed in asset units. */
42
- convertToShares: string;
43
- userSuppliedAssetsEth: string;
44
- userSuppliedSharesEth: string;
45
- userSuppliedAssets: string;
46
- userSuppliedShares: string;
47
- underlyingAsset: EthAddress;
48
- spoke: EthAddress;
49
- decimals: number;
50
- }
51
10
  /**
52
11
  * Fetches tokenization vault data for the given user via getTokenizationSpokesData.
53
12
  * Returns parsed data including userSuppliedAssets in human-readable form for each vault.
@@ -5,6 +5,9 @@ export declare const _getCurveUsdGlobalData: (provider: Client, network: Network
5
5
  export declare const getCurveUsdGlobalData: (provider: EthereumProvider, network: NetworkNumber, selectedMarket: CrvUSDMarketData) => Promise<CrvUSDGlobalMarketData>;
6
6
  export declare const _getCrvUsdAccountBalances: (provider: Client, network: NetworkNumber, block: Blockish, addressMapping: boolean, address: EthAddress, controllerAddress: EthAddress) => Promise<PositionBalances>;
7
7
  export declare const getCrvUsdAccountBalances: (provider: EthereumProvider, network: NetworkNumber, block: Blockish, addressMapping: boolean, address: EthAddress, controllerAddress: EthAddress) => Promise<PositionBalances>;
8
- export declare const _getCurveUsdUserData: (provider: Client, network: NetworkNumber, address: EthAddress, selectedMarket: CrvUSDMarketData, activeBand: string) => Promise<CrvUSDUserData>;
9
- export declare const getCurveUsdUserData: (provider: EthereumProvider, network: NetworkNumber, address: EthAddress, selectedMarket: CrvUSDMarketData, activeBand: string) => Promise<CrvUSDUserData>;
8
+ /**
9
+ * @param borrowRate market borrow APY in % (`CrvUSDGlobalMarketData.borrowRate`); when omitted it is read from the view contract
10
+ */
11
+ export declare const _getCurveUsdUserData: (provider: Client, network: NetworkNumber, address: EthAddress, selectedMarket: CrvUSDMarketData, activeBand: string, borrowRate?: string) => Promise<CrvUSDUserData>;
12
+ export declare const getCurveUsdUserData: (provider: EthereumProvider, network: NetworkNumber, address: EthAddress, selectedMarket: CrvUSDMarketData, activeBand: string, borrowRate?: string) => Promise<CrvUSDUserData>;
10
13
  export declare const getCurveUsdFullPositionData: (provider: EthereumProvider, network: NetworkNumber, address: EthAddress, selectedMarket: CrvUSDMarketData) => Promise<CrvUSDUserData>;
@@ -16,6 +16,12 @@ import { getCrvUsdAggregatedData } from '../helpers/curveUsdHelpers';
16
16
  import { CrvUsdMarkets } from '../markets';
17
17
  import { wethToEth } from '../services/utils';
18
18
  import { getViemProvider, setViemBlockNumber } from '../services/viem';
19
+ import { getStakingApy, STAKING_ASSETS } from '../staking';
20
+ /** Converts a per-second AMM rate (wei, 18 decimals) into a yearly compounded borrow APY in %. */
21
+ const ammRateToBorrowApy = (rateWei) => {
22
+ const exponent = new Dec(assetAmountInEth(rateWei)).mul(365).mul(86400);
23
+ return new Dec(new Dec(2.718281828459).pow(exponent).minus(1)).mul(100).toString();
24
+ };
19
25
  const getAndFormatBands = (provider, network, selectedMarket, _minBand, _maxBand) => __awaiter(void 0, void 0, void 0, function* () {
20
26
  const contract = CrvUSDViewContractViem(provider, network);
21
27
  const minBand = parseInt(_minBand, 10);
@@ -65,14 +71,8 @@ export const _getCurveUsdGlobalData = (provider, network, selectedMarket) => __a
65
71
  // all prices are in 18 decimals
66
72
  const totalDebt = assetAmountInEth(data.totalDebt.toString(), debtAsset);
67
73
  const ammPrice = assetAmountInEth(data.ammPrice.toString(), debtAsset);
68
- const rate = assetAmountInEth(data.ammRate.toString());
69
- const futureRate = assetAmountInEth(data.monetaryPolicyRate.toString());
70
- const exponentRate = new Dec(rate).mul(365).mul(86400);
71
- const exponentFutureRate = new Dec(futureRate).mul(365).mul(86400);
72
- const borrowRate = new Dec(new Dec(2.718281828459).pow(exponentRate).minus(1)).mul(100)
73
- .toString();
74
- const futureBorrowRate = new Dec(new Dec(2.718281828459).pow(exponentFutureRate).minus(1)).mul(100)
75
- .toString();
74
+ const borrowRate = ammRateToBorrowApy(data.ammRate.toString());
75
+ const futureBorrowRate = ammRateToBorrowApy(data.monetaryPolicyRate.toString());
76
76
  const bandsData = yield getAndFormatBands(provider, network, selectedMarket, data.minBand.toString(), data.maxBand.toString());
77
77
  const leftToBorrow = new Dec(debtCeiling.toString()).minus(totalDebt).toString();
78
78
  const loanDiscount = assetAmountInEth(loanDiscountWei.toString(), debtAsset);
@@ -121,11 +121,20 @@ export const _getCrvUsdAccountBalances = (provider, network, block, addressMappi
121
121
  return balances;
122
122
  });
123
123
  export const getCrvUsdAccountBalances = (provider, network, block, addressMapping, address, controllerAddress) => __awaiter(void 0, void 0, void 0, function* () { return _getCrvUsdAccountBalances(getViemProvider(provider, network), network, block, addressMapping, address, controllerAddress); });
124
- export const _getCurveUsdUserData = (provider, network, address, selectedMarket, activeBand) => __awaiter(void 0, void 0, void 0, function* () {
124
+ /**
125
+ * @param borrowRate market borrow APY in % (`CrvUSDGlobalMarketData.borrowRate`); when omitted it is read from the view contract
126
+ */
127
+ export const _getCurveUsdUserData = (provider, network, address, selectedMarket, activeBand, borrowRate) => __awaiter(void 0, void 0, void 0, function* () {
125
128
  const contract = CrvUSDViewContractViem(provider, network);
126
- const data = yield contract.read.userData([selectedMarket.controllerAddress, address]);
127
129
  const collAsset = selectedMarket.collAsset;
128
130
  const debtAsset = selectedMarket.baseAsset;
131
+ const [data, collStakingApy, marketBorrowRate] = yield Promise.all([
132
+ contract.read.userData([selectedMarket.controllerAddress, address]),
133
+ STAKING_ASSETS.includes(collAsset) ? getStakingApy(collAsset) : Promise.resolve('0'),
134
+ borrowRate !== undefined
135
+ ? Promise.resolve(borrowRate)
136
+ : contract.read.globalData([selectedMarket.controllerAddress]).then((globalData) => ammRateToBorrowApy(globalData.ammRate.toString())),
137
+ ]);
129
138
  const health = assetAmountInEth(data.health.toString());
130
139
  const healthPercent = new Dec(health).mul(100).toString();
131
140
  const collPrice = assetAmountInEth(data.collateralPrice.toString(), debtAsset);
@@ -156,7 +165,7 @@ export const _getCurveUsdUserData = (provider, network, address, selectedMarket,
156
165
  isBorrowed: new Dec(debtBorrowed).gt('0'),
157
166
  symbol: 'crvUSD',
158
167
  price: '1',
159
- interestRate: '0',
168
+ interestRate: marketBorrowRate,
160
169
  },
161
170
  } : {};
162
171
  const priceHigh = assetAmountInEth(data.priceHigh.toString());
@@ -168,13 +177,19 @@ export const _getCurveUsdUserData = (provider, network, address, selectedMarket,
168
177
  healthPercent,
169
178
  priceHigh,
170
179
  priceLow, liquidationDiscount: assetAmountInEth(data.liquidationDiscount.toString()), numOfBands: data.N.toString(), usedAssets,
171
- status }), getCrvUsdAggregatedData({
172
- loanExists: data.loanExists, usedAssets, network: NetworkNumber.Eth, selectedMarket, numOfBands: data.N.toString(),
180
+ status, borrowRate: marketBorrowRate }), getCrvUsdAggregatedData({
181
+ loanExists: data.loanExists,
182
+ usedAssets,
183
+ network: NetworkNumber.Eth,
184
+ selectedMarket,
185
+ numOfBands: data.N.toString(),
186
+ borrowRate: marketBorrowRate,
187
+ collStakingApy,
173
188
  })), { userBands });
174
189
  });
175
- export const getCurveUsdUserData = (provider, network, address, selectedMarket, activeBand) => __awaiter(void 0, void 0, void 0, function* () { return _getCurveUsdUserData(getViemProvider(provider, network), network, address, selectedMarket, activeBand); });
190
+ export const getCurveUsdUserData = (provider, network, address, selectedMarket, activeBand, borrowRate) => __awaiter(void 0, void 0, void 0, function* () { return _getCurveUsdUserData(getViemProvider(provider, network), network, address, selectedMarket, activeBand, borrowRate); });
176
191
  export const getCurveUsdFullPositionData = (provider, network, address, selectedMarket) => __awaiter(void 0, void 0, void 0, function* () {
177
192
  const marketData = yield getCurveUsdGlobalData(provider, network, selectedMarket);
178
- const positionData = yield getCurveUsdUserData(provider, network, address, selectedMarket, marketData.activeBand);
193
+ const positionData = yield getCurveUsdUserData(provider, network, address, selectedMarket, marketData.activeBand, marketData.borrowRate);
179
194
  return positionData;
180
195
  });
@@ -89,6 +89,7 @@ export declare const _getUserPositions: (provider: PublicClient, network: Networ
89
89
  merklBorrowIncentives: import("../types").IncentiveData[];
90
90
  ratio: string;
91
91
  collRatio: string;
92
+ safetyRatio: string;
92
93
  minRatio: string;
93
94
  totalInterestUsd: string;
94
95
  leveragedType?: import("../types").LeverageType;
@@ -123,6 +124,7 @@ export declare const getUserPositions: (provider: EthereumProvider, network: Net
123
124
  merklBorrowIncentives: import("../types").IncentiveData[];
124
125
  ratio: string;
125
126
  collRatio: string;
127
+ safetyRatio: string;
126
128
  minRatio: string;
127
129
  totalInterestUsd: string;
128
130
  leveragedType?: import("../types").LeverageType;
@@ -157,6 +159,7 @@ export declare const _getUserPositionsPortfolio: (provider: PublicClient, networ
157
159
  merklBorrowIncentives: import("../types").IncentiveData[];
158
160
  ratio: string;
159
161
  collRatio: string;
162
+ safetyRatio: string;
160
163
  minRatio: string;
161
164
  totalInterestUsd: string;
162
165
  leveragedType?: import("../types").LeverageType;
@@ -177,3 +180,5 @@ export declare const _getUserPositionsPortfolio: (provider: PublicClient, networ
177
180
  nftId: string;
178
181
  } | undefined;
179
182
  }[]>;
183
+ export declare const _getAllFluidMarketDataPortfolio: (provider: PublicClient, network: NetworkNumber) => Promise<Record<string, FluidMarketData>>;
184
+ export declare const getAllFluidMarketDataPortfolio: (provider: EthereumProvider, network: NetworkNumber) => Promise<Record<string, FluidMarketData>>;
@@ -1381,3 +1381,36 @@ export const _getUserPositionsPortfolio = (provider, network, user) => __awaiter
1381
1381
  userData: userData[i],
1382
1382
  })).filter(md => md.marketData !== undefined);
1383
1383
  });
1384
+ export const _getAllFluidMarketDataPortfolio = (provider, network) => __awaiter(void 0, void 0, void 0, function* () {
1385
+ const versions = getFluidVersionsDataForNetwork(network);
1386
+ if (versions.length === 0)
1387
+ return {};
1388
+ const view = FluidViewContractViem(provider, network);
1389
+ const vaultsData = yield Promise.all(versions.map((version) => view.read.getVaultData([version.marketAddress])));
1390
+ const tokens = Array.from(new Set(vaultsData.map((vaultData) => {
1391
+ const vaultTokens = [getAssetInfoByAddress(vaultData.supplyToken0, network).symbol, getAssetInfoByAddress(vaultData.borrowToken0, network).symbol];
1392
+ if (vaultData.supplyToken1 && !compareAddresses(ZERO_ADDRESS, vaultData.supplyToken1))
1393
+ vaultTokens.push(getAssetInfoByAddress(vaultData.supplyToken1, network).symbol);
1394
+ if (vaultData.borrowToken1 && !compareAddresses(ZERO_ADDRESS, vaultData.borrowToken1))
1395
+ vaultTokens.push(getAssetInfoByAddress(vaultData.borrowToken1, network).symbol);
1396
+ return vaultTokens;
1397
+ }).flat()));
1398
+ // ETH and WBTC needed for other tokens prices
1399
+ if (!tokens.includes('ETH'))
1400
+ tokens.push('ETH');
1401
+ if (!tokens.includes('WBTC'))
1402
+ tokens.push('WBTC');
1403
+ const [tokenPrices, merklCampaigns] = yield Promise.all([
1404
+ getTokensPricesForPortfolio(tokens, provider, network),
1405
+ getFluidMerklCampaigns(network),
1406
+ ]);
1407
+ const parsedMarketsData = yield Promise.all(vaultsData.map((vaultData) => __awaiter(void 0, void 0, void 0, function* () { return parseMarketData(provider, vaultData, network, tokenPrices); })));
1408
+ const marketsData = {};
1409
+ parsedMarketsData.forEach((marketData, i) => {
1410
+ if (!marketData)
1411
+ return;
1412
+ marketsData[versions[i].value] = attachFluidMerklIncentives(marketData, merklCampaigns);
1413
+ });
1414
+ return marketsData;
1415
+ });
1416
+ export const getAllFluidMarketDataPortfolio = (provider, network) => __awaiter(void 0, void 0, void 0, function* () { return _getAllFluidMarketDataPortfolio(getViemProvider(provider, network, { batch: { multicall: true } }), network); });
@@ -1,4 +1,4 @@
1
- import { AaveHelperCommon, AaveMarketInfo, AaveV3AggregatedPositionData, AaveV3AssetsData, AaveV3UsedAsset, AaveV3UsedAssets, AaveVersions } from '../../types';
1
+ import { AaveHelperCommon, AaveMarketInfo, AaveV3AggregatedPositionData, AaveV3AssetsData, AaveV3UsedAsset, AaveV3UsedAssets, AaveVersions, EModeCategoriesData } from '../../types';
2
2
  import { EthereumProvider, NetworkNumber } from '../../types/common';
3
3
  export declare const AAVE_V3_MARKETS: AaveVersions[];
4
4
  export declare const isAaveV2: ({ selectedMarket }: {
@@ -15,6 +15,14 @@ export declare const aaveV3IsInSiloedMode: ({ usedAssets, assetsData }: {
15
15
  usedAssets: AaveV3UsedAssets;
16
16
  assetsData: AaveV3AssetsData;
17
17
  }) => boolean;
18
+ export declare const aaveV3IsEmodeIsolated: ({ eModeCategory, eModeCategoriesData }: {
19
+ eModeCategory: number;
20
+ eModeCategoriesData?: EModeCategoriesData;
21
+ }) => boolean;
22
+ export declare const aaveV3CanBeCollateralInEmode: ({ eModeCategory, eModeCategoriesData }: {
23
+ eModeCategory: number;
24
+ eModeCategoriesData?: EModeCategoriesData;
25
+ }, _asset: string) => boolean;
18
26
  export declare const aaveAnyGetCollSuppliedAssets: ({ usedAssets }: {
19
27
  usedAssets: AaveV3UsedAssets;
20
28
  }) => AaveV3UsedAsset[];