@defisaver/positions-sdk 2.1.160-shifter-v2-dev → 2.1.161-aave-3.7-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 (141) hide show
  1. package/cjs/aaveV2/index.js +0 -2
  2. package/cjs/aaveV3/index.js +7 -1
  3. package/cjs/curveUsd/index.d.ts +2 -5
  4. package/cjs/curveUsd/index.js +15 -30
  5. package/cjs/fluid/index.d.ts +0 -5
  6. package/cjs/fluid/index.js +1 -36
  7. package/cjs/helpers/aaveHelpers/index.d.ts +9 -1
  8. package/cjs/helpers/aaveHelpers/index.js +23 -9
  9. package/cjs/helpers/aaveV4Helpers/index.js +0 -1
  10. package/cjs/helpers/compoundHelpers/index.js +0 -2
  11. package/cjs/helpers/curveUsdHelpers/index.d.ts +1 -3
  12. package/cjs/helpers/curveUsdHelpers/index.js +2 -16
  13. package/cjs/helpers/fluidHelpers/index.js +0 -1
  14. package/cjs/helpers/liquityV2Helpers/index.js +0 -1
  15. package/cjs/helpers/llamaLendHelpers/index.js +0 -2
  16. package/cjs/helpers/makerHelpers/index.d.ts +1 -1
  17. package/cjs/helpers/makerHelpers/index.js +2 -2
  18. package/cjs/helpers/morphoBlueHelpers/index.js +0 -2
  19. package/cjs/helpers/morphoMidnightHelpers/index.js +0 -2
  20. package/cjs/helpers/sparkHelpers/index.js +0 -1
  21. package/cjs/liquity/index.js +2 -16
  22. package/cjs/maker/index.d.ts +2 -7
  23. package/cjs/maker/index.js +12 -45
  24. package/cjs/markets/index.d.ts +0 -1
  25. package/cjs/markets/index.js +1 -3
  26. package/cjs/portfolio/index.d.ts +1 -5
  27. package/cjs/portfolio/index.js +2 -274
  28. package/cjs/savings/index.js +5 -2
  29. package/cjs/savings/morphoVaults/index.d.ts +1 -1
  30. package/cjs/savings/morphoVaults/index.js +56 -18
  31. package/cjs/savings/morphoVaults/options.d.ts +2 -0
  32. package/cjs/savings/morphoVaults/options.js +61 -1
  33. package/cjs/spark/index.js +1 -0
  34. package/cjs/staking/staking.d.ts +0 -20
  35. package/cjs/staking/staking.js +1 -19
  36. package/cjs/types/aave.d.ts +1 -2
  37. package/cjs/types/aaveV4.d.ts +0 -1
  38. package/cjs/types/compound.d.ts +0 -2
  39. package/cjs/types/curveUsd.d.ts +0 -6
  40. package/cjs/types/fluid.d.ts +0 -1
  41. package/cjs/types/liquity.d.ts +0 -4
  42. package/cjs/types/liquityV2.d.ts +0 -2
  43. package/cjs/types/maker.d.ts +0 -4
  44. package/cjs/types/morphoBlue.d.ts +0 -2
  45. package/cjs/types/morphoMidnight.d.ts +0 -1
  46. package/cjs/types/portfolio.d.ts +10 -26
  47. package/cjs/types/savings/morphoVaults.d.ts +10 -2
  48. package/cjs/types/savings/morphoVaults.js +9 -1
  49. package/cjs/types/spark.d.ts +0 -2
  50. package/esm/aaveV2/index.js +0 -2
  51. package/esm/aaveV3/index.js +7 -1
  52. package/esm/curveUsd/index.d.ts +2 -5
  53. package/esm/curveUsd/index.js +15 -30
  54. package/esm/fluid/index.d.ts +0 -5
  55. package/esm/fluid/index.js +0 -33
  56. package/esm/helpers/aaveHelpers/index.d.ts +9 -1
  57. package/esm/helpers/aaveHelpers/index.js +20 -8
  58. package/esm/helpers/aaveV4Helpers/index.js +0 -1
  59. package/esm/helpers/compoundHelpers/index.js +0 -2
  60. package/esm/helpers/curveUsdHelpers/index.d.ts +1 -3
  61. package/esm/helpers/curveUsdHelpers/index.js +2 -16
  62. package/esm/helpers/fluidHelpers/index.js +0 -1
  63. package/esm/helpers/liquityV2Helpers/index.js +0 -1
  64. package/esm/helpers/llamaLendHelpers/index.js +0 -2
  65. package/esm/helpers/makerHelpers/index.d.ts +1 -1
  66. package/esm/helpers/makerHelpers/index.js +2 -2
  67. package/esm/helpers/morphoBlueHelpers/index.js +0 -2
  68. package/esm/helpers/morphoMidnightHelpers/index.js +0 -2
  69. package/esm/helpers/sparkHelpers/index.js +0 -1
  70. package/esm/liquity/index.js +2 -16
  71. package/esm/maker/index.d.ts +2 -7
  72. package/esm/maker/index.js +13 -44
  73. package/esm/markets/index.d.ts +0 -1
  74. package/esm/markets/index.js +0 -1
  75. package/esm/portfolio/index.d.ts +1 -5
  76. package/esm/portfolio/index.js +5 -276
  77. package/esm/savings/index.js +5 -2
  78. package/esm/savings/morphoVaults/index.d.ts +1 -1
  79. package/esm/savings/morphoVaults/index.js +57 -19
  80. package/esm/savings/morphoVaults/options.d.ts +2 -0
  81. package/esm/savings/morphoVaults/options.js +61 -1
  82. package/esm/spark/index.js +1 -0
  83. package/esm/staking/staking.d.ts +0 -20
  84. package/esm/staking/staking.js +0 -17
  85. package/esm/types/aave.d.ts +1 -2
  86. package/esm/types/aaveV4.d.ts +0 -1
  87. package/esm/types/compound.d.ts +0 -2
  88. package/esm/types/curveUsd.d.ts +0 -6
  89. package/esm/types/fluid.d.ts +0 -1
  90. package/esm/types/liquity.d.ts +0 -4
  91. package/esm/types/liquityV2.d.ts +0 -2
  92. package/esm/types/maker.d.ts +0 -4
  93. package/esm/types/morphoBlue.d.ts +0 -2
  94. package/esm/types/morphoMidnight.d.ts +0 -1
  95. package/esm/types/portfolio.d.ts +10 -26
  96. package/esm/types/savings/morphoVaults.d.ts +10 -2
  97. package/esm/types/savings/morphoVaults.js +8 -0
  98. package/esm/types/spark.d.ts +0 -2
  99. package/package.json +1 -1
  100. package/src/aaveV2/index.ts +0 -2
  101. package/src/aaveV3/index.ts +6 -1
  102. package/src/curveUsd/index.ts +16 -33
  103. package/src/fluid/index.ts +0 -40
  104. package/src/helpers/aaveHelpers/index.ts +24 -10
  105. package/src/helpers/aaveV4Helpers/index.ts +0 -1
  106. package/src/helpers/compoundHelpers/index.ts +0 -2
  107. package/src/helpers/curveUsdHelpers/index.ts +2 -23
  108. package/src/helpers/fluidHelpers/index.ts +0 -1
  109. package/src/helpers/liquityV2Helpers/index.ts +0 -1
  110. package/src/helpers/llamaLendHelpers/index.ts +0 -2
  111. package/src/helpers/makerHelpers/index.ts +1 -2
  112. package/src/helpers/morphoBlueHelpers/index.ts +0 -2
  113. package/src/helpers/morphoMidnightHelpers/index.ts +0 -2
  114. package/src/helpers/sparkHelpers/index.ts +0 -1
  115. package/src/liquity/index.ts +2 -17
  116. package/src/maker/index.ts +29 -77
  117. package/src/markets/index.ts +1 -2
  118. package/src/portfolio/index.ts +4 -259
  119. package/src/savings/index.ts +5 -2
  120. package/src/savings/morphoVaults/index.ts +73 -21
  121. package/src/savings/morphoVaults/options.ts +67 -1
  122. package/src/spark/index.ts +1 -0
  123. package/src/staking/staking.ts +0 -28
  124. package/src/types/aave.ts +1 -3
  125. package/src/types/aaveV4.ts +0 -1
  126. package/src/types/compound.ts +0 -2
  127. package/src/types/curveUsd.ts +0 -7
  128. package/src/types/fluid.ts +0 -1
  129. package/src/types/liquity.ts +0 -6
  130. package/src/types/liquityV2.ts +0 -2
  131. package/src/types/maker.ts +0 -6
  132. package/src/types/morphoBlue.ts +0 -2
  133. package/src/types/morphoMidnight.ts +0 -1
  134. package/src/types/portfolio.ts +12 -31
  135. package/src/types/savings/morphoVaults.ts +11 -1
  136. package/src/types/spark.ts +0 -2
  137. package/cjs/markets/maker/index.d.ts +0 -1
  138. package/cjs/markets/maker/index.js +0 -13
  139. package/esm/markets/maker/index.d.ts +0 -1
  140. package/esm/markets/maker/index.js +0 -10
  141. package/src/markets/maker/index.ts +0 -10
@@ -1830,43 +1830,3 @@ export const _getUserPositionsPortfolio = async (provider: PublicClient, network
1830
1830
  userData: userData[i],
1831
1831
  })).filter(md => md.marketData !== undefined);
1832
1832
  };
1833
-
1834
-
1835
- export const _getAllFluidMarketDataPortfolio = async (provider: PublicClient, network: NetworkNumber): Promise<Record<string, FluidMarketData>> => {
1836
- const versions = getFluidVersionsDataForNetwork(network);
1837
- if (versions.length === 0) return {};
1838
-
1839
- const view = FluidViewContractViem(provider, network);
1840
- const vaultsData = await Promise.all(versions.map((version) => view.read.getVaultData([version.marketAddress])));
1841
-
1842
- const tokens = Array.from(new Set(vaultsData.map((vaultData) => {
1843
- const vaultTokens = [getAssetInfoByAddress(vaultData.supplyToken0, network).symbol, getAssetInfoByAddress(vaultData.borrowToken0, network).symbol];
1844
- if (vaultData.supplyToken1 && !compareAddresses(ZERO_ADDRESS, vaultData.supplyToken1)) vaultTokens.push(getAssetInfoByAddress(vaultData.supplyToken1, network).symbol);
1845
- if (vaultData.borrowToken1 && !compareAddresses(ZERO_ADDRESS, vaultData.borrowToken1)) vaultTokens.push(getAssetInfoByAddress(vaultData.borrowToken1, network).symbol);
1846
- return vaultTokens;
1847
- }).flat()));
1848
-
1849
- // ETH and WBTC needed for other tokens prices
1850
- if (!tokens.includes('ETH')) tokens.push('ETH');
1851
- if (!tokens.includes('WBTC')) tokens.push('WBTC');
1852
-
1853
- const [tokenPrices, merklCampaigns] = await Promise.all([
1854
- getTokensPricesForPortfolio(tokens, provider, network),
1855
- getFluidMerklCampaigns(network),
1856
- ]);
1857
-
1858
- const parsedMarketsData = await Promise.all(vaultsData.map(async (vaultData) => parseMarketData(provider, vaultData, network, tokenPrices)));
1859
-
1860
- const marketsData: Record<string, FluidMarketData> = {};
1861
- parsedMarketsData.forEach((marketData, i) => {
1862
- if (!marketData) return;
1863
- marketsData[versions[i].value] = attachFluidMerklIncentives(marketData, merklCampaigns);
1864
- });
1865
-
1866
- return marketsData;
1867
- };
1868
-
1869
- export const getAllFluidMarketDataPortfolio = async (
1870
- provider: EthereumProvider,
1871
- network: NetworkNumber,
1872
- ): Promise<Record<string, FluidMarketData>> => _getAllFluidMarketDataPortfolio(getViemProvider(provider, network, { batch: { multicall: true } }), network);
@@ -2,7 +2,7 @@ import Dec from 'decimal.js';
2
2
  import { assetAmountInWei, getAssetInfo, getAssetInfoByAddress } from '@defisaver/tokens';
3
3
  import { Client } from 'viem';
4
4
  import {
5
- AaveAssetData, AaveHelperCommon, AaveMarketInfo, AaveV3AggregatedPositionData, AaveV3AssetsData, AaveV3UsedAsset, AaveV3UsedAssets, AaveVersions,
5
+ AaveAssetData, AaveHelperCommon, AaveMarketInfo, AaveV3AggregatedPositionData, AaveV3AssetsData, AaveV3UsedAsset, AaveV3UsedAssets, AaveVersions, EModeCategoriesData,
6
6
  } from '../../types';
7
7
  import { getNativeAssetFromWrapped, getWrappedNativeAssetFromUnwrapped } from '../../services/utils';
8
8
  import {
@@ -24,6 +24,13 @@ export const isAaveV3 = ({ selectedMarket }: { selectedMarket: Partial<AaveMarke
24
24
  export const aaveV3IsInIsolationMode = ({ usedAssets, assetsData }: { usedAssets: AaveV3UsedAssets, assetsData: AaveV3AssetsData }) => Object.values(usedAssets).some(({ symbol, collateral }) => collateral && assetsData[symbol].isIsolated);
25
25
  export const aaveV3IsInSiloedMode = ({ usedAssets, assetsData }: { usedAssets: AaveV3UsedAssets, assetsData: AaveV3AssetsData }) => Object.values(usedAssets).some(({ symbol, debt }) => debt && assetsData[symbol].isSiloed);
26
26
 
27
+ export const aaveV3IsEmodeIsolated = ({ eModeCategory, eModeCategoriesData }: { eModeCategory: number, eModeCategoriesData?: EModeCategoriesData }) => eModeCategory !== 0 && !!eModeCategoriesData?.[eModeCategory]?.isolated;
28
+
29
+ export const aaveV3CanBeCollateralInEmode = ({ eModeCategory, eModeCategoriesData }: { eModeCategory: number, eModeCategoriesData?: EModeCategoriesData }, _asset: string) => {
30
+ if (!aaveV3IsEmodeIsolated({ eModeCategory, eModeCategoriesData })) return true;
31
+ return eModeCategoriesData![eModeCategory].collateralAssets.includes(getNativeAssetFromWrapped(_asset));
32
+ };
33
+
27
34
  export const aaveAnyGetCollSuppliedAssets = ({ usedAssets }: { usedAssets: AaveV3UsedAssets }) => Object.values(usedAssets)
28
35
  .filter(({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral);
29
36
 
@@ -37,14 +44,18 @@ export const aaveAnyGetSuppliableAssets = ({
37
44
  const collAccountAssets = aaveAnyGetCollSuppliedAssets(data);
38
45
  const marketAssets = Object.values(assetsData) as AaveAssetData[];
39
46
 
40
- if (collAccountAssets.length === 0 || !isAaveV3(data)) return marketAssets.filter(({ canBeSupplied }) => canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: true }));
47
+ if (!isAaveV3(data)) return marketAssets.filter(({ canBeSupplied }) => canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: true }));
48
+
49
+ const canBeCollateralInEmode = (symbol: string) => aaveV3CanBeCollateralInEmode(data, symbol);
50
+
51
+ if (collAccountAssets.length === 0) return marketAssets.filter(({ canBeSupplied }) => canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: canBeCollateralInEmode(symbol) }));
41
52
 
42
53
  if (aaveV3IsInIsolationMode(data)) {
43
54
  const collAsset = collAccountAssets[0].symbol;
44
- return marketAssets.filter(d => d.canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: symbol === collAsset }));
55
+ return marketAssets.filter(d => d.canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: symbol === collAsset && canBeCollateralInEmode(symbol) }));
45
56
  }
46
57
 
47
- return marketAssets.filter(d => d.canBeSupplied).map(({ symbol, isIsolated }) => ({ symbol, canBeCollateral: !isIsolated }));
58
+ return marketAssets.filter(d => d.canBeSupplied).map(({ symbol, isIsolated }) => ({ symbol, canBeCollateral: !isIsolated && canBeCollateralInEmode(symbol) }));
48
59
  };
49
60
 
50
61
  export const aaveAnyGetSuppliableAsCollAssets = ({
@@ -62,8 +73,8 @@ export const aaveAnyGetEmodeMutableProps = (
62
73
  const asset = getNativeAssetFromWrapped(_asset);
63
74
 
64
75
  const assetData = assetsData[asset];
65
- const eModeCategoryData: { collateralAssets: string[], collateralFactor: string, liquidationRatio: string, ltvZeroAssets: string[] } = eModeCategoriesData?.[eModeCategory] || {
66
- collateralAssets: [], ltvZeroAssets: [], collateralFactor: '0', liquidationRatio: '0',
76
+ const eModeCategoryData: { collateralAssets: string[], collateralFactor: string, liquidationRatio: string, ltvZeroAssets: string[], isolated?: boolean } = eModeCategoriesData?.[eModeCategory] || {
77
+ collateralAssets: [], ltvZeroAssets: [], collateralFactor: '0', liquidationRatio: '0', isolated: false,
67
78
  };
68
79
 
69
80
  if (
@@ -72,6 +83,9 @@ export const aaveAnyGetEmodeMutableProps = (
72
83
  || new Dec(eModeCategoryData.collateralFactor || 0).eq(0)
73
84
  ) {
74
85
  const { liquidationRatio, collateralFactor } = assetData;
86
+ if (eModeCategory !== 0 && eModeCategoryData.isolated && !eModeCategoryData.collateralAssets.includes(asset)) {
87
+ return ({ liquidationRatio, collateralFactor: '0' });
88
+ }
75
89
  return ({ liquidationRatio, collateralFactor });
76
90
  }
77
91
  if (eModeCategoryData.ltvZeroAssets.includes(asset)) return ({ liquidationRatio: '0', collateralFactor: '0' });
@@ -118,7 +132,10 @@ export const aaveAnyGetUserReserveLtvAndLltv = (
118
132
  || !eModeCategoryData.collateralAssets.includes(asset)
119
133
  || new Dec(eModeCategoryData.collateralFactor || 0).eq(0)
120
134
  ) {
121
- return { ltv: assetData.collateralFactor, lltv: assetData.liquidationRatio };
135
+ const ltv = eModeCategory !== 0 && eModeCategoryData?.isolated && !eModeCategoryData.collateralAssets.includes(asset)
136
+ ? '0'
137
+ : assetData.collateralFactor;
138
+ return { ltv, lltv: assetData.liquidationRatio };
122
139
  }
123
140
 
124
141
  const ltv = eModeCategoryData.ltvZeroAssets.includes(asset) ? '0' : eModeCategoryData.collateralFactor;
@@ -169,9 +186,6 @@ export const aaveAnyGetAggregatedPositionData = ({
169
186
  },
170
187
  );
171
188
  payload.safetyRatioWithLtvZeroFallback = +payload.suppliedUsd ? new Dec(payload.borrowLimitWithLtvZeroFallbackUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
172
- // Normalised safety ratio (100 = liquidation on every protocol): the automation ratio above, falling back
173
- // to the regular ratio when the fallback carries its '0' placeholder.
174
- payload.safetyRatio = +payload.safetyRatioWithLtvZeroFallback ? payload.safetyRatioWithLtvZeroFallback : payload.ratio;
175
189
  payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
176
190
  payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
177
191
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
@@ -270,7 +270,6 @@ export const aaveV4GetAggregatedPositionData = ({
270
270
  payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
271
271
  payload.minRatio = '100';
272
272
  payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
273
- payload.safetyRatio = payload.ratio;
274
273
  payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
275
274
  payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
276
275
  const { leveragedType, leveragedAsset } = isLeveragedPosAaveV4(usedAssets);
@@ -139,7 +139,6 @@ export const getCompoundV2AggregatedData = ({
139
139
  payload.collRatio = payload.borrowedUsd && payload.borrowedUsd !== '0'
140
140
  ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString()
141
141
  : '0';
142
- payload.safetyRatio = payload.ratio;
143
142
 
144
143
  // Calculate borrow limits per asset
145
144
  Object.values(usedAssets).forEach((item) => {
@@ -186,7 +185,6 @@ export const getCompoundV3AggregatedData = ({
186
185
  payload.incentiveUsd = incentiveUsd;
187
186
  payload.totalInterestUsd = totalInterestUsd;
188
187
  payload.minRatio = '100';
189
- payload.safetyRatio = payload.ratio;
190
188
  payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
191
189
  payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
192
190
  payload.minDebt = assetsData[selectedMarket.baseAsset].minDebt;
@@ -5,18 +5,11 @@ import {
5
5
  calcLeverageLiqPrice, getAssetsTotal, getExposure, isLeveragedPos,
6
6
  } from '../../moneymarket';
7
7
  import { mapRange } from '../../services/utils';
8
- import { calculateNetApyFromRates } from '../../staking';
9
8
 
10
9
  export const getCrvUsdAggregatedData = ({
11
- loanExists, usedAssets, network, selectedMarket, numOfBands, borrowRate = '0', collStakingApy = '0', ...rest
10
+ loanExists, usedAssets, network, selectedMarket, numOfBands, ...rest
12
11
  }:{
13
- loanExists: boolean,
14
- usedAssets: CrvUSDUsedAssets,
15
- network: NetworkNumber,
16
- selectedMarket: CrvUSDMarketData,
17
- numOfBands: number | string,
18
- borrowRate?: string, // market borrow APY in %, see `CrvUSDGlobalMarketData.borrowRate`
19
- collStakingApy?: string, // native yield APY in % of the collateral asset, if it is a staked asset
12
+ loanExists: boolean, usedAssets: CrvUSDUsedAssets, network: NetworkNumber, selectedMarket: CrvUSDMarketData, numOfBands: number | string
20
13
  }): CrvUSDAggregatedPositionData => {
21
14
  const payload = {} as CrvUSDAggregatedPositionData;
22
15
  payload.supplied = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ supplied }: { supplied: string }) => supplied); // this is wrong if we are in soft-liquidations
@@ -33,8 +26,6 @@ export const getCrvUsdAggregatedData = ({
33
26
 
34
27
  // this is all approximation
35
28
  payload.minAllowedRatio = mapRange(numOfBands, 4, 50, 115, 140); // collateral ratio
36
- // Collateral ratio rebased so 100 sits on the band-derived minimum (normalised safety ratio, same scale as the other protocols).
37
- payload.safetyRatio = loanExists && payload.minAllowedRatio ? new Dec(payload.ratio).div(payload.minAllowedRatio).mul(100).toString() : '0';
38
29
  payload.collFactor = new Dec(1).div(payload.minAllowedRatio).mul(100).toString(); // collateral factor = 1 / collateral ratio
39
30
  // only take in consideration collAsset
40
31
  payload.borrowLimitUsd = usedAssets?.[selectedMarket.collAsset]?.isSupplied
@@ -51,17 +42,5 @@ export const getCrvUsdAggregatedData = ({
51
42
 
52
43
  payload.exposure = getExposure(payload.borrowedUsd, payload.suppliedUsd);
53
44
 
54
- // crvUSD debt accrues the market borrow rate. Collateral (including crvUSD held during soft liquidation) earns
55
- // nothing from the protocol itself; only the native yield of staked collateral is counted, as an incentive.
56
- const { netApy, totalInterestUsd, incentiveUsd } = calculateNetApyFromRates({
57
- suppliedUsd: payload.suppliedUsd,
58
- borrowedUsd: payload.borrowedUsd,
59
- borrowRate,
60
- incentives: [{ apy: collStakingApy, amountUsd: usedAssets?.[selectedMarket.collAsset]?.suppliedUsd || '0' }],
61
- });
62
- payload.netApy = netApy;
63
- payload.totalInterestUsd = totalInterestUsd;
64
- payload.incentiveUsd = incentiveUsd;
65
-
66
45
  return payload;
67
46
  };
@@ -143,7 +143,6 @@ borrowShares?: string,
143
143
  payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
144
144
  payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
145
145
  payload.minRatio = marketData.minRatio;
146
- payload.safetyRatio = payload.ratio;
147
146
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
148
147
 
149
148
  payload.leveragedType = leveragedType;
@@ -69,7 +69,6 @@ export const getLiquityV2AggregatedPositionData = ({
69
69
  payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
70
70
  payload.ratio = (+payload.suppliedUsd && +payload.borrowedUsd) ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
71
71
  payload.collRatio = (+payload.suppliedUsd && +payload.borrowedUsd) ? new Dec(payload.suppliedUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
72
- payload.safetyRatio = payload.ratio;
73
72
  const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApyLiquityV2(usedAssets, assetsData, interestRate);
74
73
  payload.netApy = netApy;
75
74
  payload.incentiveUsd = incentiveUsd;
@@ -38,8 +38,6 @@ export const getLlamaLendAggregatedData = ({
38
38
 
39
39
  // this is all approximation
40
40
  payload.minAllowedRatio = mapRange(numOfBands, 4, 50, 115, 140); // collateral ratio
41
- // Collateral ratio rebased so 100 sits on the band-derived minimum (normalised safety ratio, same scale as the other protocols).
42
- payload.safetyRatio = loanExists && payload.minAllowedRatio ? new Dec(payload.ratio).div(payload.minAllowedRatio).mul(100).toString() : '0';
43
41
  payload.collFactor = new Dec(1).div(payload.minAllowedRatio).mul(100).toString(); // collateral factor = 1 / collateral ratio
44
42
  // only take in consideration collAsset
45
43
  payload.borrowLimitUsd = usedAssets?.[collAsset]?.isSupplied
@@ -10,7 +10,6 @@ export const parseCollateralInfo = (
10
10
  _rate: string,
11
11
  _spot: string,
12
12
  _line: string,
13
- _dust: string,
14
13
  _duty: string,
15
14
  _futureRate: string,
16
15
  _chop: string,
@@ -21,7 +20,7 @@ export const parseCollateralInfo = (
21
20
  const rate = new Dec(_rate).toString();
22
21
  const spot = new Dec(_spot).div(1e27).toString();
23
22
  const line = new Dec(_line).div(1e45).toString();
24
- const dust = new Dec(_dust).div(1e45).toString(); // Vat.ilks.dust, rad (1e45) -> DAI
23
+ const dust = new Dec(_rate).div(1e45).toString();
25
24
  const duty = new Dec(_duty).toString();
26
25
  const futureRate = new Dec(_futureRate).toString();
27
26
  const chop = new Dec(_chop).div(1e18).toString();
@@ -54,8 +54,6 @@ export const getMorphoBlueAggregatedPositionData = ({ usedAssets, assetsData, ma
54
54
  payload.ltv = new Dec(usedAssets[loanToken]?.borrowed || 0).div(oracle).div(usedAssets[collateralToken]?.supplied || 1).toString(); // default to 1 because can't div 0
55
55
  payload.ratio = new Dec(usedAssets[collateralToken]?.supplied || 0).mul(oracle).div(usedAssets[loanToken]?.borrowed || 1).mul(100)
56
56
  .toString();
57
- // Borrow limit over debt, so 100 sits on the market's LLTV however low it is (`ratio` is the raw collateral ratio).
58
- payload.safetyRatio = +payload.borrowedUsd > 0 ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
59
57
 
60
58
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
61
59
  payload.leveragedType = leveragedType;
@@ -102,8 +102,6 @@ export const getMorphoMidnightAggregatedPositionData = ({
102
102
  payload.ltv = new Dec(payload.suppliedCollateralUsd).eq(0) ? '0' : new Dec(payload.borrowedUsd).div(payload.suppliedCollateralUsd).toString();
103
103
  payload.ratio = new Dec(payload.borrowedUsd).eq(0) ? '0' : new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString();
104
104
  payload.healthRatio = new Dec(payload.borrowedUsd).eq(0) ? 'Infinity' : new Dec(payload.liquidationLimitUsd).div(payload.borrowedUsd).toDP(4).toString();
105
- // Borrow limit over debt, so 100 sits on the market's LLTV however low it is (`ratio` is the raw collateral ratio).
106
- payload.safetyRatio = +payload.borrowedUsd > 0 ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
107
105
 
108
106
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
109
107
  payload.leveragedType = leveragedType;
@@ -96,7 +96,6 @@ export const sparkGetAggregatedPositionData = ({
96
96
  payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
97
97
  payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
98
98
  payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
99
- payload.safetyRatio = payload.ratio;
100
99
  const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy({ usedAssets, assetsData });
101
100
  payload.netApy = netApy;
102
101
  payload.incentiveUsd = incentiveUsd;
@@ -18,7 +18,6 @@ import { ZERO_ADDRESS } from '../constants';
18
18
  import { getViemProvider, setViemBlockNumber } from '../services/viem';
19
19
  import { getEthAmountForDecimals } from '../services/utils';
20
20
  import { getExposure } from '../moneymarket';
21
- import { calculateNetApyFromRates } from '../staking';
22
21
 
23
22
  export const LIQUITY_NORMAL_MODE_RATIO = 110; // MCR
24
23
  export const LIQUITY_RECOVERY_MODE_RATIO = 150; // CCR
@@ -90,15 +89,6 @@ export const _getLiquityTroveInfo = async (provider: Client, network: NetworkNum
90
89
  ]);
91
90
 
92
91
  const recoveryMode = troveInfo[6];
93
- const minCollateralRatio = recoveryMode ? LIQUITY_RECOVERY_MODE_RATIO : LIQUITY_NORMAL_MODE_RATIO;
94
- const collateral = assetAmountInEth(troveInfo[1].toString());
95
- const debtInAsset = assetAmountInEth(troveInfo[2].toString());
96
- const collateralUsd = new Dec(collateral).mul(assetAmountInEth(assetPrice.toString())).toString();
97
- const collRatio = +debtInAsset ? new Dec(collateralUsd).div(debtInAsset).mul(100).toString() : '0';
98
-
99
- // LUSD debt is interest free (only a one-off borrowing fee on issuance) and ETH collateral earns no yield,
100
- // so a trove's net APY is always 0. It is exposed for parity with the other protocols.
101
- const { netApy, totalInterestUsd, incentiveUsd } = calculateNetApyFromRates({ suppliedUsd: collateralUsd, borrowedUsd: debtInAsset });
102
92
 
103
93
  const payload = {
104
94
  troveStatus: LIQUITY_TROVE_STATUS_ENUM[+(troveInfo[0].toString())],
@@ -112,15 +102,10 @@ export const _getLiquityTroveInfo = async (provider: Client, network: NetworkNum
112
102
  totalETH: totalETH.toString(),
113
103
  totalLUSD: totalLUSD.toString(),
114
104
  debtInFront: debtInFront.toString(),
115
- minCollateralRatio,
116
- // Collateral ratio rebased so 100 sits on the trove's minimum collateral ratio (normalised safety ratio).
117
- safetyRatio: +minCollateralRatio > 0 ? new Dec(collRatio).div(minCollateralRatio).mul(100).toString() : '0',
105
+ minCollateralRatio: recoveryMode ? LIQUITY_RECOVERY_MODE_RATIO : LIQUITY_NORMAL_MODE_RATIO,
118
106
  priceForRecovery: new Dec(recoveryMode ? LIQUITY_RECOVERY_MODE_RATIO : LIQUITY_NORMAL_MODE_RATIO).mul(totalLUSD).div(totalETH).div(100)
119
107
  .toString(),
120
- exposure: getExposure(debtInAsset, collateralUsd),
121
- netApy,
122
- totalInterestUsd,
123
- incentiveUsd,
108
+ exposure: getExposure(assetAmountInEth(troveInfo[2].toString()), new Dec(assetAmountInEth(troveInfo[1].toString())).mul(assetPrice).toString()),
124
109
  };
125
110
 
126
111
  return payload;
@@ -1,22 +1,19 @@
1
1
  import Dec from 'decimal.js';
2
2
  import {
3
- assetAmountInEth, bytesToString, getAssetInfo, ilkToAsset, stringToBytes,
3
+ assetAmountInEth, bytesToString, getAssetInfo, ilkToAsset,
4
4
  } from '@defisaver/tokens';
5
5
  import { Client, PublicClient } from 'viem';
6
6
  import {
7
- Blockish, EthAddress, EthereumProvider, HexString, NetworkNumber, PositionBalances,
7
+ Blockish, EthAddress, EthereumProvider, NetworkNumber, PositionBalances,
8
8
  } from '../types/common';
9
9
  import {
10
10
  getConfigContractAddress, McdDogContractViem, McdGetCdpsContractViem, McdJugContractViem, McdSpotterContractViem, McdVatContractViem, McdViewContractViem,
11
11
  } from '../contracts';
12
- import {
13
- CdpData, CdpInfo, CdpType, IlkInfo,
14
- } from '../types';
12
+ import { CdpData, CdpInfo, CdpType } from '../types';
15
13
  import { wethToEth } from '../services/utils';
16
14
  import { parseCollateralInfo } from '../helpers/makerHelpers';
17
15
  import { getViemProvider, setViemBlockNumber } from '../services/viem';
18
16
  import { getExposure } from '../moneymarket';
19
- import { calculateNetApyFromRates, getStakingApy, STAKING_ASSETS } from '../staking';
20
17
 
21
18
  export const _getMakerAccountBalances = async (provider: PublicClient, network: NetworkNumber, block: Blockish, addressMapping: boolean, cdpId: string, _managerAddress?: EthAddress): Promise<PositionBalances> => {
22
19
  let balances: PositionBalances = {
@@ -51,7 +48,7 @@ export const _getMakerAccountBalances = async (provider: PublicClient, network:
51
48
  const [
52
49
  par,
53
50
  [_, mat],
54
- [artGlobal, rate, spot, line, dust],
51
+ [artGlobal, rate, spot, line],
55
52
  [duty],
56
53
  futureRate,
57
54
  chop,
@@ -72,7 +69,6 @@ export const _getMakerAccountBalances = async (provider: PublicClient, network:
72
69
  rate.toString(),
73
70
  spot.toString(),
74
71
  line.toString(),
75
- dust.toString(),
76
72
  duty.toString(),
77
73
  futureRate.toString(),
78
74
  chop.toString(),
@@ -133,73 +129,44 @@ export const getUserCdps = async (
133
129
  userAddress: EthAddress,
134
130
  ): Promise<CdpInfo[]> => _getUserCdps(getViemProvider(provider, network), network, userAddress);
135
131
 
136
- export const _getMakerIlksData = async (provider: Client, network: NetworkNumber, ilkLabels: string[]): Promise<Record<string, IlkInfo>> => {
132
+ export const _getMakerCdpData = async (provider: Client, network: NetworkNumber, cdp: CdpInfo): Promise<CdpData> => {
137
133
  const vatContract = McdVatContractViem(provider, network);
138
134
  const spotterContract = McdSpotterContractViem(provider, network);
139
135
  const dogContract = McdDogContractViem(provider, network);
140
136
  const jugContract = McdJugContractViem(provider, network);
141
137
 
142
- const par = await spotterContract.read.par();
143
-
144
- const ilksInfo = await Promise.all(ilkLabels.map(async (ilkLabel) => {
145
- const ilk = stringToBytes(ilkLabel) as HexString;
146
- const [
147
- [_, mat],
148
- [artGlobal, rate, spot, line, dust],
149
- [duty],
150
- futureRate,
151
- chop,
152
- ] = await Promise.all([
153
- spotterContract.read.ilks([ilk]),
154
- vatContract.read.ilks([ilk]),
155
- jugContract.read.ilks([ilk]),
156
- jugContract.read.drip([ilk]),
157
- dogContract.read.chop([ilk]),
158
- ]);
159
-
160
- return parseCollateralInfo(
161
- ilk,
162
- par.toString(),
163
- mat.toString(),
164
- artGlobal.toString(),
165
- rate.toString(),
166
- spot.toString(),
167
- line.toString(),
168
- dust.toString(),
169
- duty.toString(),
170
- futureRate.toString(),
171
- chop.toString(),
172
- );
173
- }));
174
-
175
- return Object.fromEntries(ilksInfo.map((ilkInfo) => [ilkInfo.ilkLabel, ilkInfo]));
176
- };
177
-
178
- export const getMakerIlksData = async (
179
- provider: EthereumProvider,
180
- network: NetworkNumber,
181
- ilkLabels: string[],
182
- ): Promise<Record<string, IlkInfo>> => _getMakerIlksData(getViemProvider(provider, network, { batch: { multicall: true } }), network, ilkLabels);
183
-
184
- /**
185
- * @param ilkInfo optional precomputed ilk data (from `_getMakerIlksData`); when provided the per-ilk reads are skipped
186
- */
187
- export const _getMakerCdpData = async (provider: Client, network: NetworkNumber, cdp: CdpInfo, ilkInfo?: IlkInfo): Promise<CdpData> => {
188
- const vatContract = McdVatContractViem(provider, network);
189
-
190
138
  const [
191
139
  [ink, art],
192
140
  coll,
193
- fetchedIlkInfo,
194
- collStakingApy,
141
+ par,
142
+ [_, mat],
143
+ [artGlobal, rate, spot, line],
144
+ [duty],
145
+ futureRate,
146
+ chop,
195
147
  ] = await Promise.all([
196
148
  vatContract.read.urns([cdp.ilk, cdp.urn]),
197
149
  vatContract.read.gem([cdp.ilk, cdp.urn]),
198
- ilkInfo || _getMakerIlksData(provider, network, [cdp.ilkLabel]).then((ilks) => ilks[cdp.ilkLabel]),
199
- STAKING_ASSETS.includes(cdp.asset) ? getStakingApy(cdp.asset) : Promise.resolve('0'),
150
+ spotterContract.read.par(),
151
+ spotterContract.read.ilks([cdp.ilk]),
152
+ vatContract.read.ilks([cdp.ilk]),
153
+ jugContract.read.ilks([cdp.ilk]),
154
+ jugContract.read.drip([cdp.ilk]),
155
+ dogContract.read.chop([cdp.ilk]),
200
156
  ]);
201
157
 
202
- const collInfo = fetchedIlkInfo;
158
+ const collInfo = parseCollateralInfo(
159
+ cdp.ilk,
160
+ par.toString(),
161
+ mat.toString(),
162
+ artGlobal.toString(),
163
+ rate.toString(),
164
+ spot.toString(),
165
+ line.toString(),
166
+ duty.toString(),
167
+ futureRate.toString(),
168
+ chop.toString(),
169
+ );
203
170
 
204
171
  const collateral = assetAmountInEth(ink.toString(), `MCD-${cdp.asset}`);
205
172
 
@@ -213,20 +180,9 @@ export const _getMakerCdpData = async (provider: Client, network: NetworkNumber,
213
180
  let ratio = new Dec(ink).times(collInfo.assetPrice).div(debt).times(100)
214
181
  .toString();
215
182
  if (new Dec(debt).eq(0)) ratio = '0';
216
- // Collateral ratio rebased so 100 sits on the ilk's liquidation ratio (normalised safety ratio).
217
- const safetyRatio = +collInfo.liqPercent > 0 ? new Dec(ratio).div(collInfo.liqPercent).mul(100).toString() : '0';
218
183
 
219
184
  const debtTooLow = new Dec(debt).gt(0) && new Dec(assetAmountInEth(debt, 'DAI')).lt(collInfo.minDebt);
220
185
 
221
- // DAI debt accrues the ilk's stability fee. Collateral earns nothing inside the vault, except for the
222
- // native yield of staked collateral (e.g. wstETH), which is tracked as an incentive.
223
- const { netApy, totalInterestUsd, incentiveUsd } = calculateNetApyFromRates({
224
- suppliedUsd: collateralUsd,
225
- borrowedUsd: assetAmountInEth(debt, 'DAI'),
226
- borrowRate: collInfo.stabilityFee.toString(),
227
- incentives: [{ apy: collStakingApy, amountUsd: collateralUsd }],
228
- });
229
-
230
186
  return {
231
187
  owner: cdp.owner,
232
188
  id: cdp.id.toString(),
@@ -245,7 +201,6 @@ export const _getMakerCdpData = async (provider: Client, network: NetworkNumber,
245
201
  debtAssetMarketPrice: '1',
246
202
  liquidationPrice,
247
203
  ratio,
248
- safetyRatio,
249
204
  liqRatio: collInfo.liqRatio.toString(),
250
205
  liqPercent: parseFloat(collInfo.liqPercent.toString()),
251
206
  assetPrice: collInfo.assetPrice,
@@ -261,9 +216,6 @@ export const _getMakerCdpData = async (provider: Client, network: NetworkNumber,
261
216
  liquidationFee: collInfo.liquidationFee,
262
217
  lastUpdated: Date.now(),
263
218
  exposure: getExposure(assetAmountInEth(debt, 'DAI'), collateralUsd),
264
- netApy,
265
- totalInterestUsd,
266
- incentiveUsd,
267
219
  };
268
220
  };
269
221
 
@@ -30,5 +30,4 @@ export {
30
30
  getFTokenAddress,
31
31
  getFluidMarketInfoByAddress,
32
32
  } from './fluid';
33
- export { AaveV4Spokes, findAaveV4SpokeByAddress } from './aaveV4';
34
- export { MakerActiveIlks } from './maker';
33
+ export { AaveV4Spokes, findAaveV4SpokeByAddress } from './aaveV4';