@defisaver/positions-sdk 2.1.42 → 2.1.43-aave-v4-dev-2

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 (60) hide show
  1. package/cjs/aaveV4/index.d.ts +7 -0
  2. package/cjs/aaveV4/index.js +156 -0
  3. package/cjs/config/contracts.d.ts +1069 -0
  4. package/cjs/config/contracts.js +9 -0
  5. package/cjs/contracts.d.ts +18265 -0
  6. package/cjs/contracts.js +2 -1
  7. package/cjs/helpers/aaveV4Helpers/index.d.ts +7 -0
  8. package/cjs/helpers/aaveV4Helpers/index.js +54 -0
  9. package/cjs/helpers/index.d.ts +1 -0
  10. package/cjs/helpers/index.js +2 -1
  11. package/cjs/index.d.ts +2 -1
  12. package/cjs/index.js +3 -1
  13. package/cjs/markets/aaveV4/index.d.ts +6 -0
  14. package/cjs/markets/aaveV4/index.js +20 -0
  15. package/cjs/markets/index.d.ts +1 -0
  16. package/cjs/markets/index.js +3 -1
  17. package/cjs/portfolio/index.js +20 -0
  18. package/cjs/savings/morphoVaults/options.js +1 -1
  19. package/cjs/types/aaveV4.d.ts +120 -0
  20. package/cjs/types/aaveV4.js +11 -0
  21. package/cjs/types/index.d.ts +1 -0
  22. package/cjs/types/index.js +1 -0
  23. package/cjs/types/portfolio.d.ts +4 -0
  24. package/esm/aaveV4/index.d.ts +7 -0
  25. package/esm/aaveV4/index.js +147 -0
  26. package/esm/config/contracts.d.ts +1069 -0
  27. package/esm/config/contracts.js +8 -0
  28. package/esm/contracts.d.ts +18265 -0
  29. package/esm/contracts.js +1 -0
  30. package/esm/helpers/aaveV4Helpers/index.d.ts +7 -0
  31. package/esm/helpers/aaveV4Helpers/index.js +47 -0
  32. package/esm/helpers/index.d.ts +1 -0
  33. package/esm/helpers/index.js +1 -0
  34. package/esm/index.d.ts +2 -1
  35. package/esm/index.js +2 -1
  36. package/esm/markets/aaveV4/index.d.ts +6 -0
  37. package/esm/markets/aaveV4/index.js +15 -0
  38. package/esm/markets/index.d.ts +1 -0
  39. package/esm/markets/index.js +1 -0
  40. package/esm/portfolio/index.js +21 -1
  41. package/esm/savings/morphoVaults/options.js +1 -1
  42. package/esm/types/aaveV4.d.ts +120 -0
  43. package/esm/types/aaveV4.js +8 -0
  44. package/esm/types/index.d.ts +1 -0
  45. package/esm/types/index.js +1 -0
  46. package/esm/types/portfolio.d.ts +4 -0
  47. package/package.json +2 -2
  48. package/src/aaveV4/index.ts +159 -0
  49. package/src/config/contracts.ts +8 -0
  50. package/src/contracts.ts +3 -1
  51. package/src/helpers/aaveV4Helpers/index.ts +66 -0
  52. package/src/helpers/index.ts +1 -0
  53. package/src/index.ts +2 -0
  54. package/src/markets/aaveV4/index.ts +17 -0
  55. package/src/markets/index.ts +1 -0
  56. package/src/portfolio/index.ts +20 -0
  57. package/src/savings/morphoVaults/options.ts +1 -1
  58. package/src/types/aaveV4.ts +133 -0
  59. package/src/types/index.ts +2 -1
  60. package/src/types/portfolio.ts +4 -0
@@ -1293,4 +1293,12 @@ export const SkySavings = {
1293
1293
  } as const;
1294
1294
  export const YearnV3Vault = {
1295
1295
  "abi": [{"stateMutability":"view","type":"function","name":"balanceOf","inputs":[{"name":"addr","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"totalAssets","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"totalDebt","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256"}]}]
1296
+ } as const;
1297
+ export const AaveV4View = {
1298
+ "abi": [{"inputs":[{"internalType":"address","name":"_spoke","type":"address"},{"internalType":"address","name":"_user","type":"address"}],"name":"getHealthFactor","outputs":[{"internalType":"uint256","name":"healthFactor","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hub","type":"address"}],"name":"getHubAllAssetsData","outputs":[{"components":[{"internalType":"uint16","name":"assetId","type":"uint16"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"totalSupplied","type":"uint256"},{"internalType":"uint256","name":"totalDrawn","type":"uint256"},{"internalType":"uint256","name":"totalPremium","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"swept","type":"uint256"},{"internalType":"uint16","name":"liquidityFee","type":"uint16"},{"internalType":"uint120","name":"drawnIndex","type":"uint120"},{"internalType":"uint96","name":"drawnRate","type":"uint96"},{"internalType":"uint40","name":"lastUpdateTimestamp","type":"uint40"},{"internalType":"address","name":"irStrategy","type":"address"},{"internalType":"address","name":"reinvestmentController","type":"address"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"uint256","name":"deficitRay","type":"uint256"}],"internalType":"structAaveV4View.HubAssetData[]","name":"hubAssetData","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hub","type":"address"},{"internalType":"uint256","name":"_assetId","type":"uint256"}],"name":"getHubAssetData","outputs":[{"components":[{"internalType":"uint16","name":"assetId","type":"uint16"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"totalSupplied","type":"uint256"},{"internalType":"uint256","name":"totalDrawn","type":"uint256"},{"internalType":"uint256","name":"totalPremium","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"swept","type":"uint256"},{"internalType":"uint16","name":"liquidityFee","type":"uint16"},{"internalType":"uint120","name":"drawnIndex","type":"uint120"},{"internalType":"uint96","name":"drawnRate","type":"uint96"},{"internalType":"uint40","name":"lastUpdateTimestamp","type":"uint40"},{"internalType":"address","name":"irStrategy","type":"address"},{"internalType":"address","name":"reinvestmentController","type":"address"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"uint256","name":"deficitRay","type":"uint256"}],"internalType":"structAaveV4View.HubAssetData","name":"hubAssetData","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spoke","type":"address"},{"internalType":"address","name":"_user","type":"address"}],"name":"getLoanData","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"riskPremium","type":"uint256"},{"internalType":"uint256","name":"avgCollateralFactor","type":"uint256"},{"internalType":"uint256","name":"healthFactor","type":"uint256"},{"internalType":"uint256","name":"totalCollateralInUsd","type":"uint256"},{"internalType":"uint256","name":"totalDebtInUsd","type":"uint256"},{"internalType":"uint256","name":"activeCollateralCount","type":"uint256"},{"internalType":"uint256","name":"borrowedCount","type":"uint256"},{"components":[{"internalType":"uint256","name":"reserveId","type":"uint256"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint256","name":"supplied","type":"uint256"},{"internalType":"uint256","name":"drawn","type":"uint256"},{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint16","name":"collateralFactor","type":"uint16"},{"internalType":"uint32","name":"maxLiquidationBonus","type":"uint32"},{"internalType":"uint16","name":"liquidationFee","type":"uint16"},{"internalType":"bool","name":"isUsingAsCollateral","type":"bool"},{"internalType":"bool","name":"isBorrowing","type":"bool"}],"internalType":"structAaveV4View.UserReserveData[]","name":"reserves","type":"tuple[]"}],"internalType":"structAaveV4View.LoanData","name":"loanData","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address[]","name":"_spokes","type":"address[]"}],"name":"getLoanDataForMultipleSpokes","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"riskPremium","type":"uint256"},{"internalType":"uint256","name":"avgCollateralFactor","type":"uint256"},{"internalType":"uint256","name":"healthFactor","type":"uint256"},{"internalType":"uint256","name":"totalCollateralInUsd","type":"uint256"},{"internalType":"uint256","name":"totalDebtInUsd","type":"uint256"},{"internalType":"uint256","name":"activeCollateralCount","type":"uint256"},{"internalType":"uint256","name":"borrowedCount","type":"uint256"},{"components":[{"internalType":"uint256","name":"reserveId","type":"uint256"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint256","name":"supplied","type":"uint256"},{"internalType":"uint256","name":"drawn","type":"uint256"},{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint16","name":"collateralFactor","type":"uint16"},{"internalType":"uint32","name":"maxLiquidationBonus","type":"uint32"},{"internalType":"uint16","name":"liquidationFee","type":"uint16"},{"internalType":"bool","name":"isUsingAsCollateral","type":"bool"},{"internalType":"bool","name":"isBorrowing","type":"bool"}],"internalType":"structAaveV4View.UserReserveData[]","name":"reserves","type":"tuple[]"}],"internalType":"structAaveV4View.LoanData[]","name":"loans","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spoke","type":"address"},{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"getLoanDataForMultipleUsers","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"riskPremium","type":"uint256"},{"internalType":"uint256","name":"avgCollateralFactor","type":"uint256"},{"internalType":"uint256","name":"healthFactor","type":"uint256"},{"internalType":"uint256","name":"totalCollateralInUsd","type":"uint256"},{"internalType":"uint256","name":"totalDebtInUsd","type":"uint256"},{"internalType":"uint256","name":"activeCollateralCount","type":"uint256"},{"internalType":"uint256","name":"borrowedCount","type":"uint256"},{"components":[{"internalType":"uint256","name":"reserveId","type":"uint256"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint256","name":"supplied","type":"uint256"},{"internalType":"uint256","name":"drawn","type":"uint256"},{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint16","name":"collateralFactor","type":"uint16"},{"internalType":"uint32","name":"maxLiquidationBonus","type":"uint32"},{"internalType":"uint16","name":"liquidationFee","type":"uint16"},{"internalType":"bool","name":"isUsingAsCollateral","type":"bool"},{"internalType":"bool","name":"isBorrowing","type":"bool"}],"internalType":"structAaveV4View.UserReserveData[]","name":"reserves","type":"tuple[]"}],"internalType":"structAaveV4View.LoanData[]","name":"loans","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spoke","type":"address"},{"internalType":"uint256","name":"_reserveId","type":"uint256"}],"name":"getReserveData","outputs":[{"components":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint16","name":"collateralFactor","type":"uint16"},{"internalType":"uint256","name":"price","type":"uint256"}],"internalType":"structAaveV4View.ReserveData","name":"reserveData","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spoke","type":"address"},{"internalType":"uint256","name":"_reserveId","type":"uint256"}],"name":"getReserveDataFull","outputs":[{"components":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"address","name":"hub","type":"address"},{"internalType":"uint16","name":"assetId","type":"uint16"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"bool","name":"frozen","type":"bool"},{"internalType":"bool","name":"borrowable","type":"bool"},{"internalType":"uint24","name":"collateralRisk","type":"uint24"},{"internalType":"uint16","name":"collateralFactor","type":"uint16"},{"internalType":"uint32","name":"maxLiquidationBonus","type":"uint32"},{"internalType":"uint16","name":"liquidationFee","type":"uint16"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"totalSupplied","type":"uint256"},{"internalType":"uint256","name":"totalDrawn","type":"uint256"},{"internalType":"uint256","name":"totalPremium","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"internalType":"uint256","name":"deficitRay","type":"uint256"},{"internalType":"bool","name":"spokeActive","type":"bool"},{"internalType":"bool","name":"spokePaused","type":"bool"}],"internalType":"structAaveV4View.ReserveDataFull","name":"reserveData","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spoke","type":"address"},{"internalType":"uint256","name":"_reserveId","type":"uint256"}],"name":"getReservePrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spoke","type":"address"},{"internalType":"uint256[]","name":"_reserveIds","type":"uint256[]"}],"name":"getReservePrices","outputs":[{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spoke","type":"address"},{"internalType":"uint256[]","name":"_reserveIds","type":"uint256[]"}],"name":"getReservesData","outputs":[{"components":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint16","name":"collateralFactor","type":"uint16"},{"internalType":"uint256","name":"price","type":"uint256"}],"internalType":"structAaveV4View.ReserveData[]","name":"reserveData","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spoke","type":"address"},{"internalType":"uint256[]","name":"_reserveIds","type":"uint256[]"}],"name":"getReservesDataFull","outputs":[{"components":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"address","name":"hub","type":"address"},{"internalType":"uint16","name":"assetId","type":"uint16"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"bool","name":"frozen","type":"bool"},{"internalType":"bool","name":"borrowable","type":"bool"},{"internalType":"uint24","name":"collateralRisk","type":"uint24"},{"internalType":"uint16","name":"collateralFactor","type":"uint16"},{"internalType":"uint32","name":"maxLiquidationBonus","type":"uint32"},{"internalType":"uint16","name":"liquidationFee","type":"uint16"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"totalSupplied","type":"uint256"},{"internalType":"uint256","name":"totalDrawn","type":"uint256"},{"internalType":"uint256","name":"totalPremium","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"internalType":"uint256","name":"deficitRay","type":"uint256"},{"internalType":"bool","name":"spokeActive","type":"bool"},{"internalType":"bool","name":"spokePaused","type":"bool"}],"internalType":"structAaveV4View.ReserveDataFull[]","name":"reserveData","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spoke","type":"address"}],"name":"getSpokeData","outputs":[{"components":[{"internalType":"uint128","name":"targetHealthFactor","type":"uint128"},{"internalType":"uint64","name":"healthFactorForMaxBonus","type":"uint64"},{"internalType":"uint16","name":"liquidationBonusFactor","type":"uint16"},{"internalType":"address","name":"oracle","type":"address"},{"internalType":"uint256","name":"oracleDecimals","type":"uint256"},{"internalType":"uint256","name":"reserveCount","type":"uint256"}],"internalType":"structAaveV4View.SpokeData","name":"spokeData","type":"tuple"},{"components":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint16","name":"collateralFactor","type":"uint16"},{"internalType":"uint256","name":"price","type":"uint256"}],"internalType":"structAaveV4View.ReserveData[]","name":"reserves","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spoke","type":"address"}],"name":"getSpokeDataFull","outputs":[{"components":[{"internalType":"uint128","name":"targetHealthFactor","type":"uint128"},{"internalType":"uint64","name":"healthFactorForMaxBonus","type":"uint64"},{"internalType":"uint16","name":"liquidationBonusFactor","type":"uint16"},{"internalType":"address","name":"oracle","type":"address"},{"internalType":"uint256","name":"oracleDecimals","type":"uint256"},{"internalType":"uint256","name":"reserveCount","type":"uint256"}],"internalType":"structAaveV4View.SpokeData","name":"spokeData","type":"tuple"},{"components":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"address","name":"hub","type":"address"},{"internalType":"uint16","name":"assetId","type":"uint16"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"bool","name":"frozen","type":"bool"},{"internalType":"bool","name":"borrowable","type":"bool"},{"internalType":"uint24","name":"collateralRisk","type":"uint24"},{"internalType":"uint16","name":"collateralFactor","type":"uint16"},{"internalType":"uint32","name":"maxLiquidationBonus","type":"uint32"},{"internalType":"uint16","name":"liquidationFee","type":"uint16"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"totalSupplied","type":"uint256"},{"internalType":"uint256","name":"totalDrawn","type":"uint256"},{"internalType":"uint256","name":"totalPremium","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"internalType":"uint256","name":"deficitRay","type":"uint256"},{"internalType":"bool","name":"spokeActive","type":"bool"},{"internalType":"bool","name":"spokePaused","type":"bool"}],"internalType":"structAaveV4View.ReserveDataFull[]","name":"reserves","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hub","type":"address"},{"internalType":"uint256","name":"_assetId","type":"uint256"}],"name":"getSpokesForAsset","outputs":[{"internalType":"address[]","name":"spokes","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spoke","type":"address"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256[]","name":"_reserveIds","type":"uint256[]"}],"name":"getUserReserveData","outputs":[{"components":[{"internalType":"uint256","name":"reserveId","type":"uint256"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint256","name":"supplied","type":"uint256"},{"internalType":"uint256","name":"drawn","type":"uint256"},{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint16","name":"collateralFactor","type":"uint16"},{"internalType":"uint32","name":"maxLiquidationBonus","type":"uint32"},{"internalType":"uint16","name":"liquidationFee","type":"uint16"},{"internalType":"bool","name":"isUsingAsCollateral","type":"bool"},{"internalType":"bool","name":"isBorrowing","type":"bool"}],"internalType":"structAaveV4View.UserReserveData[]","name":"_userReserves","type":"tuple[]"}],"stateMutability":"view","type":"function"}],
1299
+ "networks": {
1300
+ "1": {
1301
+ "address": "0xBFB1DD9f9609CDeD2E2FdA78611512783A113079",
1302
+ }
1303
+ }
1296
1304
  } as const;
package/src/contracts.ts CHANGED
@@ -169,4 +169,6 @@ export const YearnViewContractViem = createViemContractFromConfigFunc('YearnView
169
169
 
170
170
  export const MakerDsrContractViem = createViemContractFromConfigFunc('MakerDsr');
171
171
 
172
- export const SkySavingsContractView = createViemContractFromConfigFunc('SkySavings');
172
+ export const SkySavingsContractView = createViemContractFromConfigFunc('SkySavings');
173
+
174
+ export const AaveV4ViewContractViem = createViemContractFromConfigFunc('AaveV4View');
@@ -0,0 +1,66 @@
1
+ import Dec from 'decimal.js';
2
+ import { calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos } from '../../moneymarket';
3
+ import { AaveV4AggregatedPositionData, AaveV4AssetsData, AaveV4UsedReserveAssets } from '../../types';
4
+ import { NetworkNumber } from '../../types/common';
5
+
6
+ export const aaveV4GetAggregatedPositionData = ({
7
+ usedAssets,
8
+ assetsData,
9
+ network,
10
+ }: {
11
+ usedAssets: AaveV4UsedReserveAssets,
12
+ assetsData: AaveV4AssetsData,
13
+ network: NetworkNumber,
14
+ }): AaveV4AggregatedPositionData => {
15
+ const payload = {} as AaveV4AggregatedPositionData;
16
+ payload.suppliedUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
17
+ payload.suppliedCollateralUsd = getAssetsTotal(usedAssets, ({ isSupplied, collateral }: { isSupplied: boolean, collateral: string }) => isSupplied && collateral, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
18
+ payload.borrowLimitUsd = getAssetsTotal(
19
+ usedAssets,
20
+ ({ isSupplied, collateral }: { isSupplied: boolean, collateral: string }) => isSupplied && collateral,
21
+ ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(assetsData[symbol].collateralFactor),
22
+ );
23
+ payload.liquidationLimitUsd = getAssetsTotal(
24
+ usedAssets,
25
+ ({ isSupplied, collateral }: { isSupplied: boolean, collateral: string }) => isSupplied && collateral,
26
+ // TODO: Verify if liquidation factor is available in Aave V4, currently using collateralFactor as placeholder
27
+ ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(assetsData[symbol].collateralFactor),
28
+ );
29
+ payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
30
+ payload.drawnUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ drawnUsd }: { drawnUsd: string }) => drawnUsd);
31
+ payload.premiumUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ premiumUsd }: { premiumUsd: string }) => premiumUsd);
32
+ const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
33
+ payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
34
+ payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
35
+ payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
36
+ payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
37
+ payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
38
+ const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
39
+ payload.leveragedType = leveragedType;
40
+ payload.leveragedAsset = leveragedAsset;
41
+ payload.liquidationPrice = '';
42
+ if (leveragedType !== '') {
43
+ let assetPrice = assetsData[leveragedAsset].price;
44
+ if (leveragedType === 'lsd-leverage') {
45
+ // Treat ETH like a stablecoin in a long stETH position
46
+ payload.leveragedLsdAssetRatio = new Dec(assetsData[leveragedAsset].price).div(assetsData.ETH.price).toDP(18).toString();
47
+ assetPrice = new Dec(assetPrice).div(assetsData.ETH.price).toString();
48
+ }
49
+ payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
50
+ }
51
+ payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
52
+ payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
53
+ // payload.healthRatio = new Dec(payload.liquidationLimitUsd).div(payload.borrowedUsd).toDP(4).toString();
54
+ payload.minHealthRatio = new Dec(payload.liquidationLimitUsd).div(payload.borrowLimitUsd).toDP(4).toString();
55
+
56
+ // TODO: Re-implement netApy calculation
57
+ // const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy({
58
+ // usedAssets,
59
+ // assetsData,
60
+ // optionalData: { healthRatio: payload.healthRatio },
61
+ // });
62
+ payload.netApy = '0';
63
+ payload.incentiveUsd = '0';
64
+ payload.totalInterestUsd = '0';
65
+ return payload;
66
+ };
@@ -8,3 +8,4 @@ export * as llamaLendHelpers from './llamaLendHelpers';
8
8
  export * as liquityV2Helpers from './liquityV2Helpers';
9
9
  export * as eulerV2Helpers from './eulerHelpers';
10
10
  export * as fluidHelpers from './fluidHelpers';
11
+ export * as aaveV4Helpers from './aaveV4Helpers';
package/src/index.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import './setup';
2
2
 
3
3
  import * as fluid from './fluid';
4
+ import * as aaveV4 from './aaveV4';
4
5
  import * as aaveV3 from './aaveV3';
5
6
  import * as aaveV2 from './aaveV2';
6
7
  import * as compoundV3 from './compoundV3';
@@ -27,6 +28,7 @@ export * from './types';
27
28
  export {
28
29
  aaveV2,
29
30
  aaveV3,
31
+ aaveV4,
30
32
  compoundV2,
31
33
  compoundV3,
32
34
  spark,
@@ -0,0 +1,17 @@
1
+ import { AaveV4SpokeInfo, AaveV4SpokesType } from '../../types';
2
+ import { NetworkNumber } from '../../types/common';
3
+
4
+ export const AAVE_V4_CORE_SPOKE = (networkId: NetworkNumber): AaveV4SpokeInfo => ({
5
+ chainIds: [NetworkNumber.Eth],
6
+ label: 'Core Spoke',
7
+ value: AaveV4SpokesType.AaveV4CoreSpoke,
8
+ url: 'core',
9
+ address: '0xBa97c5E52cd5BC3D7950Ae70779F8FfE92d40CdC',
10
+ hubs: [
11
+ '0xaD905aD5EA5B98cD50AE40Cfe368344686a21366',
12
+ ],
13
+ });
14
+
15
+ export const AaveV4Spokes = (networkId: NetworkNumber) => ({
16
+ [AaveV4SpokesType.AaveV4CoreSpoke]: AAVE_V4_CORE_SPOKE(networkId),
17
+ }) as const;
@@ -23,3 +23,4 @@ export { EulerV2Markets } from './euler';
23
23
  export {
24
24
  FluidMarkets, getFluidVersionsDataForNetwork, getFluidMarketInfoById, getFTokenAddress, getFluidMarketInfoByAddress,
25
25
  } from './fluid';
26
+ export { AaveV4Spokes } from './aaveV4';
@@ -2,6 +2,7 @@ import Dec from 'decimal.js';
2
2
  import { EthAddress, EthereumProvider, NetworkNumber } from '../types/common';
3
3
  import {
4
4
  AaveMarkets,
5
+ AaveV4Spokes,
5
6
  CompoundMarkets,
6
7
  CrvUsdMarkets,
7
8
  EulerV2Markets,
@@ -14,6 +15,7 @@ import { _getMorphoBlueAccountData, _getMorphoBlueMarketData, getMorphoEarn } fr
14
15
  import {
15
16
  AaveV2MarketData,
16
17
  AaveV3MarketData,
18
+ AaveV4SpokeData,
17
19
  AaveVersions,
18
20
  CdpInfo,
19
21
  CompoundV2MarketsData,
@@ -49,6 +51,7 @@ import { fetchSparkAirdropRewards, fetchSparkRewards } from '../claiming/spark';
49
51
  import { fetchMorphoBlueRewards } from '../claiming/morphoBlue';
50
52
  import { getKingRewards } from '../claiming/king';
51
53
  import { fetchEthenaAirdropRewards } from '../claiming/ethena';
54
+ import { _getAaveV4AccountData, _getAaveV4SpokeData } from '../aaveV4';
52
55
 
53
56
  export async function getPortfolioData(provider: EthereumProvider, network: NetworkNumber, defaultProvider: EthereumProvider, addresses: EthAddress[], summerFiAddresses: EthAddress[]): Promise<{
54
57
  positions: PortfolioPositionsData;
@@ -71,6 +74,7 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
71
74
  const llamaLendMarkets = [NetworkNumber.Eth, NetworkNumber.Arb].includes(network) ? Object.values(LlamaLendMarkets(network)).filter((market) => market.chainIds.includes(network)) : [];
72
75
  const liquityV2Markets = [NetworkNumber.Eth].includes(network) ? Object.values(LiquityV2Markets(network)) : [];
73
76
  const liquityV2MarketsStaking = [NetworkNumber.Eth].includes(network) ? Object.values(LiquityV2Markets(network)).filter(market => !market.isLegacy) : [];
77
+ const aaveV4Spokes = Object.values(AaveV4Spokes(network)).filter((market) => market.chainIds.includes(network));
74
78
 
75
79
  const client = getViemProvider(provider, network, {
76
80
  batch: {
@@ -98,6 +102,7 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
98
102
  const crvUsdMarketsData: Record<string, CrvUSDGlobalMarketData> = {};
99
103
  const llamaLendMarketsData: Record<string, LlamaLendGlobalMarketData> = {};
100
104
  const liquityV2MarketsData: Record<string, LiquityV2MarketData> = {};
105
+ const aaveV4SpokesData: Record<string, AaveV4SpokeData> = {};
101
106
 
102
107
  const markets = {
103
108
  morphoMarketsData,
@@ -110,6 +115,7 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
110
115
  crvUsdMarketsData,
111
116
  llamaLendMarketsData,
112
117
  liquityV2MarketsData,
118
+ aaveV4SpokesData,
113
119
  };
114
120
 
115
121
  const positions: PortfolioPositionsData = {};
@@ -120,6 +126,7 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
120
126
  for (const address of allAddresses) {
121
127
  positions[address.toLowerCase() as EthAddress] = {
122
128
  aaveV3: {},
129
+ aaveV4: {},
123
130
  morphoBlue: {},
124
131
  compoundV3: {},
125
132
  spark: {},
@@ -188,6 +195,10 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
188
195
  const marketData = await _getAaveV3MarketData(client, network, market);
189
196
  aaveV3MarketsData[market.value] = marketData;
190
197
  }),
198
+ ...aaveV4Spokes.map(async (spoke) => {
199
+ const spokeData = await _getAaveV4SpokeData(client, network, spoke);
200
+ aaveV4SpokesData[spoke.value] = spokeData;
201
+ }),
191
202
  ...aaveV2Markets.map(async (market) => {
192
203
  const marketData = await _getAaveV2MarketsData(client, network, market);
193
204
  aaveV2MarketsData[market.value] = marketData;
@@ -441,6 +452,15 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
441
452
  positions[address.toLowerCase() as EthAddress].aaveV3[market.value] = { error: `Error fetching AaveV3 account data for address ${address} on market ${market.value}`, data: null };
442
453
  }
443
454
  })).flat(),
455
+ ...aaveV4Spokes.map((spoke) => allAddresses.map(async (address) => {
456
+ try {
457
+ const accData = await _getAaveV4AccountData(client, network, aaveV4SpokesData[spoke.value], address);
458
+ if (new Dec(accData.suppliedUsd).gt(0)) positions[address.toLowerCase() as EthAddress].aaveV4[spoke.value] = { error: '', data: accData };
459
+ } catch (error) {
460
+ console.error(`Error fetching AaveV4 account data for address ${address} on spoke ${spoke.value}:`, error);
461
+ positions[address.toLowerCase() as EthAddress].aaveV4[spoke.value] = { error: `Error fetching AaveV4 account data for address ${address} on spoke ${spoke.value}`, data: null };
462
+ }
463
+ })).flat(),
444
464
  ...morphoMarkets.map((market) => addresses.map(async (address) => {
445
465
  try {
446
466
  const [accDataPromise, earnDataPromise] = await Promise.allSettled([
@@ -131,7 +131,7 @@ export const MORPHO_VAULT_STEAKHOUSE_ETH: MorphoVault = {
131
131
  export const MORPHO_VAULT_STEAKHOUSE_PYUSD: MorphoVault = {
132
132
  type: MorphoVaultType.MorphoVaultSteakhousePYUSD,
133
133
  name: 'Steakhouse PYUSD',
134
- address: '0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB',
134
+ address: '0xbEEF02e5E13584ab96848af90261f0C8Ee04722a',
135
135
  asset: 'PYUSD',
136
136
  deploymentBlock: 19043398,
137
137
  isLegacy: false,
@@ -0,0 +1,133 @@
1
+ import { EthAddress, IncentiveData, NetworkNumber } from './common';
2
+
3
+ export enum AaveV4SpokesType {
4
+ AaveV4CoreSpoke = 'aave_v4_core_spoke',
5
+ }
6
+
7
+ export enum AaveV4HubsType {
8
+ AaveV4CoreHub = 'aave_v4_core_hub',
9
+ }
10
+
11
+ export interface AaveV4SpokeInfo {
12
+ chainIds: NetworkNumber[],
13
+ label: string,
14
+ value: AaveV4SpokesType,
15
+ url: string,
16
+ address: EthAddress,
17
+ hubs: EthAddress[],
18
+ }
19
+
20
+ export interface AaveV4HubAssetOnChainData {
21
+ assetId: number,
22
+ drawnRate: bigint,
23
+ }
24
+
25
+ export interface AaveV4HubOnChainData {
26
+ assets: Record<number, AaveV4HubAssetOnChainData>,
27
+ }
28
+
29
+ export interface AaveV4ReserveAssetOnChain {
30
+ underlying: EthAddress,
31
+ hub: EthAddress,
32
+ assetId: number,
33
+ decimals: number,
34
+ paused: boolean,
35
+ frozen: boolean,
36
+ borrowable: boolean,
37
+ collateralRisk: number,
38
+ collateralFactor: number,
39
+ maxLiquidationBonus: number,
40
+ liquidationFee: number,
41
+ price: bigint,
42
+ totalSupplied: bigint,
43
+ totalDrawn: bigint,
44
+ totalPremium: bigint,
45
+ totalDebt: bigint,
46
+ supplyCap: bigint,
47
+ borrowCap: bigint,
48
+ deficitRay: bigint,
49
+ spokeActive: boolean,
50
+ spokePaused: boolean
51
+ }
52
+
53
+ export interface AaveV4ReserveAssetData {
54
+ symbol: string,
55
+ underlying: EthAddress,
56
+ hub: EthAddress,
57
+ assetId: number,
58
+ paused: boolean,
59
+ frozen: boolean,
60
+ borrowable: boolean,
61
+ collateralRisk: number,
62
+ collateralFactor: number,
63
+ liquidationFee: number,
64
+ price: string,
65
+ totalSupplied: string,
66
+ totalDrawn: string,
67
+ totalPremium: string,
68
+ totalDebt: string,
69
+ supplyCap: string,
70
+ borrowCap: string,
71
+ spokeActive: boolean,
72
+ spokePaused: boolean,
73
+ drawnRate: string,
74
+ supplyRate: string,
75
+ supplyIncentives: IncentiveData[];
76
+ borrowIncentives: IncentiveData[];
77
+ }
78
+
79
+ export type AaveV4AssetsData = Record<string, AaveV4ReserveAssetData>;
80
+
81
+ export interface AaveV4SpokeData {
82
+ assetsData: AaveV4AssetsData,
83
+ oracle: EthAddress,
84
+ oracleDecimals: number,
85
+ address: EthAddress,
86
+ }
87
+
88
+ export interface AaveV4UsedReserveAsset {
89
+ symbol: string,
90
+ supplied: string,
91
+ suppliedUsd: string,
92
+ drawn: string,
93
+ drawnUsd: string,
94
+ premium: string,
95
+ premiumUsd: string,
96
+ borrowed: string,
97
+ borrowedUsd: string,
98
+ isSupplied: boolean,
99
+ isBorrowed: boolean,
100
+ collateral: boolean,
101
+ }
102
+
103
+ export interface AaveV4AggregatedPositionData {
104
+ suppliedUsd: string,
105
+ suppliedCollateralUsd: string,
106
+ borrowLimitUsd: string,
107
+ liquidationLimitUsd: string,
108
+ borrowedUsd: string,
109
+ drawnUsd: string,
110
+ premiumUsd: string,
111
+ leftToBorrowUsd: string,
112
+ ratio: string,
113
+ collRatio: string,
114
+ liqRatio: string,
115
+ liqPercent: string,
116
+ leveragedType: string,
117
+ leveragedAsset: string,
118
+ liquidationPrice: string,
119
+ leveragedLsdAssetRatio?: string,
120
+ minCollRatio: string,
121
+ collLiquidationRatio: string,
122
+ minHealthRatio: string,
123
+ netApy: string,
124
+ incentiveUsd: string,
125
+ totalInterestUsd: string,
126
+ }
127
+
128
+ export type AaveV4UsedReserveAssets = Record<string, AaveV4UsedReserveAsset>;
129
+
130
+ export interface AaveV4AccountData extends AaveV4AggregatedPositionData {
131
+ usedAssets: AaveV4UsedReserveAssets,
132
+ healthFactor: string,
133
+ }
@@ -12,4 +12,5 @@ export * from './fluid';
12
12
  export * from './portfolio';
13
13
  export * from './merit';
14
14
  export * from './merkl';
15
- export * from './savings';
15
+ export * from './savings';
16
+ export * from './aaveV4';
@@ -1,4 +1,5 @@
1
1
  import { AaveV2PositionData, AaveV3PositionData, AaveVersions } from './aave';
2
+ import { AaveV4AccountData, AaveV4SpokesType } from './aaveV4';
2
3
  import { EthAddress } from './common';
3
4
  import { CompoundV2PositionData, CompoundV3PositionData, CompoundVersions } from './compound';
4
5
  import { CrvUSDUserData, CrvUSDVersions } from './curveUsd';
@@ -54,6 +55,9 @@ export interface PortfolioPositionsDataForAddress {
54
55
  [key: string]: FluidVaultData;
55
56
  };
56
57
  };
58
+ aaveV4: {
59
+ [key in AaveV4SpokesType]?: PortfolioProtocolData<AaveV4AccountData>;
60
+ };
57
61
  }
58
62
 
59
63
  export interface PortfolioPositionsData {