@defisaver/positions-sdk 2.1.0 → 2.1.1-dev.0

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 (80) hide show
  1. package/.mocharc.json +4 -4
  2. package/.nvmrc +1 -1
  3. package/README.md +64 -64
  4. package/cjs/helpers/morphoBlueHelpers/index.js +66 -66
  5. package/cjs/liquityV2/index.d.ts +2 -0
  6. package/cjs/liquityV2/index.js +52 -9
  7. package/esm/helpers/morphoBlueHelpers/index.js +66 -66
  8. package/esm/liquityV2/index.d.ts +2 -0
  9. package/esm/liquityV2/index.js +48 -7
  10. package/package.json +47 -47
  11. package/src/aaveV2/index.ts +239 -239
  12. package/src/aaveV3/index.ts +516 -516
  13. package/src/aaveV3/merit.ts +94 -94
  14. package/src/aaveV3/merkl.ts +74 -74
  15. package/src/compoundV2/index.ts +244 -244
  16. package/src/compoundV3/index.ts +274 -274
  17. package/src/config/contracts.ts +1129 -1129
  18. package/src/constants/index.ts +6 -6
  19. package/src/contracts.ts +107 -107
  20. package/src/curveUsd/index.ts +250 -250
  21. package/src/eulerV2/index.ts +324 -324
  22. package/src/exchange/index.ts +25 -25
  23. package/src/fluid/index.ts +1638 -1638
  24. package/src/helpers/aaveHelpers/index.ts +169 -169
  25. package/src/helpers/compoundHelpers/index.ts +283 -283
  26. package/src/helpers/curveUsdHelpers/index.ts +40 -40
  27. package/src/helpers/eulerHelpers/index.ts +222 -222
  28. package/src/helpers/fluidHelpers/index.ts +326 -326
  29. package/src/helpers/index.ts +10 -10
  30. package/src/helpers/liquityV2Helpers/index.ts +82 -82
  31. package/src/helpers/llamaLendHelpers/index.ts +53 -53
  32. package/src/helpers/makerHelpers/index.ts +52 -52
  33. package/src/helpers/morphoBlueHelpers/index.ts +390 -390
  34. package/src/helpers/sparkHelpers/index.ts +155 -155
  35. package/src/index.ts +45 -45
  36. package/src/liquity/index.ts +104 -104
  37. package/src/liquityV2/index.ts +464 -418
  38. package/src/llamaLend/index.ts +305 -305
  39. package/src/maker/index.ts +223 -223
  40. package/src/markets/aave/index.ts +116 -116
  41. package/src/markets/aave/marketAssets.ts +49 -49
  42. package/src/markets/compound/index.ts +227 -227
  43. package/src/markets/compound/marketsAssets.ts +90 -90
  44. package/src/markets/curveUsd/index.ts +69 -69
  45. package/src/markets/euler/index.ts +26 -26
  46. package/src/markets/fluid/index.ts +2456 -2456
  47. package/src/markets/index.ts +25 -25
  48. package/src/markets/liquityV2/index.ts +102 -102
  49. package/src/markets/llamaLend/contractAddresses.ts +141 -141
  50. package/src/markets/llamaLend/index.ts +235 -235
  51. package/src/markets/morphoBlue/index.ts +895 -895
  52. package/src/markets/spark/index.ts +29 -29
  53. package/src/markets/spark/marketAssets.ts +11 -11
  54. package/src/moneymarket/moneymarketCommonService.ts +80 -80
  55. package/src/morphoBlue/index.ts +236 -236
  56. package/src/portfolio/index.ts +285 -285
  57. package/src/services/priceService.ts +159 -159
  58. package/src/services/utils.ts +63 -63
  59. package/src/services/viem.ts +32 -32
  60. package/src/setup.ts +8 -8
  61. package/src/spark/index.ts +444 -444
  62. package/src/staking/eligibility.ts +60 -60
  63. package/src/staking/index.ts +1 -1
  64. package/src/staking/staking.ts +169 -169
  65. package/src/types/aave.ts +189 -189
  66. package/src/types/common.ts +105 -105
  67. package/src/types/compound.ts +136 -136
  68. package/src/types/curveUsd.ts +121 -121
  69. package/src/types/euler.ts +175 -175
  70. package/src/types/fluid.ts +448 -448
  71. package/src/types/index.ts +13 -13
  72. package/src/types/liquity.ts +30 -30
  73. package/src/types/liquityV2.ts +126 -126
  74. package/src/types/llamaLend.ts +159 -159
  75. package/src/types/maker.ts +63 -63
  76. package/src/types/merit.ts +1 -1
  77. package/src/types/merkl.ts +70 -70
  78. package/src/types/morphoBlue.ts +194 -194
  79. package/src/types/portfolio.ts +60 -60
  80. package/src/types/spark.ts +135 -135
@@ -1,169 +1,169 @@
1
- import Dec from 'decimal.js';
2
- import { assetAmountInWei, getAssetInfo, getAssetInfoByAddress } from '@defisaver/tokens';
3
- import { Client } from 'viem';
4
- import {
5
- AaveAssetData, AaveHelperCommon, AaveMarketInfo, AaveV3AggregatedPositionData, AaveV3AssetsData, AaveV3UsedAssets, AaveVersions,
6
- } from '../../types';
7
- import { ethToWeth, wethToEth } from '../../services/utils';
8
- import {
9
- aprToApy, calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos,
10
- } from '../../moneymarket';
11
- import { calculateNetApy } from '../../staking';
12
- import { borrowOperations } from '../../constants';
13
- import { EthAddress, EthereumProvider, NetworkNumber } from '../../types/common';
14
- import { AaveLoanInfoV2ContractViem, AaveV3ViewContractViem } from '../../contracts';
15
- import { getViemProvider } from '../../services/viem';
16
-
17
- export const AAVE_V3_MARKETS = [AaveVersions.AaveV3, AaveVersions.AaveV3Lido, AaveVersions.AaveV3Etherfi];
18
-
19
- export const isAaveV2 = ({ selectedMarket }: { selectedMarket: Partial<AaveMarketInfo> }) => selectedMarket.value === AaveVersions.AaveV2;
20
- export const isAaveV3 = ({ selectedMarket }: { selectedMarket: Partial<AaveMarketInfo> }) => AAVE_V3_MARKETS.includes(selectedMarket.value as AaveVersions);
21
-
22
- export const aaveV3IsInIsolationMode = ({ usedAssets, assetsData }: { usedAssets: AaveV3UsedAssets, assetsData: AaveV3AssetsData }) => Object.values(usedAssets).some(({ symbol, collateral }) => collateral && assetsData[symbol].isIsolated);
23
- export const aaveV3IsInSiloedMode = ({ usedAssets, assetsData }: { usedAssets: AaveV3UsedAssets, assetsData: AaveV3AssetsData }) => Object.values(usedAssets).some(({ symbol, debt }) => debt && assetsData[symbol].isSiloed);
24
-
25
- export const aaveAnyGetCollSuppliedAssets = ({ usedAssets }: { usedAssets: AaveV3UsedAssets }) => Object.values(usedAssets)
26
- .filter(({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral);
27
-
28
- export const aaveAnyGetSuppliableAssets = ({
29
- usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest
30
- }: AaveHelperCommon) => {
31
- const data = {
32
- usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest,
33
- };
34
-
35
- const collAccountAssets = aaveAnyGetCollSuppliedAssets(data);
36
- const marketAssets = Object.values(assetsData) as AaveAssetData[];
37
-
38
- if (collAccountAssets.length === 0 || !isAaveV3(data)) return marketAssets.filter(({ canBeSupplied }) => canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: true }));
39
-
40
- if (aaveV3IsInIsolationMode(data)) {
41
- const collAsset = collAccountAssets[0].symbol;
42
- return marketAssets.filter(d => d.canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: symbol === collAsset }));
43
- }
44
-
45
- return marketAssets.filter(d => d.canBeSupplied).map(({ symbol, isIsolated }) => ({ symbol, canBeCollateral: !isIsolated }));
46
- };
47
-
48
- export const aaveAnyGetSuppliableAsCollAssets = ({
49
- usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest
50
- }: AaveHelperCommon) => aaveAnyGetSuppliableAssets({
51
- usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest,
52
- }).filter(({ canBeCollateral }) => canBeCollateral);
53
-
54
- export const aaveAnyGetEmodeMutableProps = (
55
- {
56
- eModeCategory,
57
- eModeCategoriesData,
58
- assetsData,
59
- }: AaveHelperCommon, _asset: string) => {
60
- const asset = wethToEth(_asset);
61
-
62
- const assetData = assetsData[asset];
63
- const eModeCategoryData: { collateralAssets: string[], collateralFactor: string, liquidationRatio: string } = eModeCategoriesData?.[eModeCategory] || { collateralAssets: [], collateralFactor: '0', liquidationRatio: '0' };
64
-
65
- if (
66
- eModeCategory === 0
67
- || !eModeCategoryData.collateralAssets.includes(asset)
68
- || new Dec(eModeCategoryData.collateralFactor || 0).eq(0)
69
- ) {
70
- const { liquidationRatio, collateralFactor } = assetData;
71
- return ({ liquidationRatio, collateralFactor });
72
- }
73
- const { liquidationRatio, collateralFactor } = eModeCategoryData;
74
- return ({ liquidationRatio, collateralFactor });
75
- };
76
-
77
- export const aaveAnyGetAggregatedPositionData = ({
78
- usedAssets,
79
- eModeCategory,
80
- assetsData,
81
- selectedMarket,
82
- network,
83
- ...rest
84
- }: AaveHelperCommon): AaveV3AggregatedPositionData => {
85
- const data = {
86
- usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest,
87
- };
88
- const payload = {} as AaveV3AggregatedPositionData;
89
- payload.suppliedUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
90
- payload.suppliedCollateralUsd = getAssetsTotal(usedAssets, ({ isSupplied, collateral }: { isSupplied: boolean, collateral: string }) => isSupplied && collateral, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
91
- payload.borrowLimitUsd = getAssetsTotal(
92
- usedAssets,
93
- ({ isSupplied, collateral }: { isSupplied: boolean, collateral: string }) => isSupplied && collateral,
94
- ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(aaveAnyGetEmodeMutableProps(data, symbol).collateralFactor),
95
- );
96
- payload.liquidationLimitUsd = getAssetsTotal(
97
- usedAssets,
98
- ({ isSupplied, collateral }: { isSupplied: boolean, collateral: string }) => isSupplied && collateral,
99
- ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(aaveAnyGetEmodeMutableProps(data, symbol).liquidationRatio),
100
- );
101
- payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
102
- const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
103
- payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
104
- payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
105
- payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
106
- const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy({
107
- usedAssets,
108
- assetsData,
109
- });
110
- payload.netApy = netApy;
111
- payload.incentiveUsd = incentiveUsd;
112
- payload.totalInterestUsd = totalInterestUsd;
113
- payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
114
- payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
115
- const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
116
- payload.leveragedType = leveragedType;
117
- payload.leveragedAsset = leveragedAsset;
118
- payload.liquidationPrice = '';
119
- if (leveragedType !== '') {
120
- let assetPrice = data.assetsData[leveragedAsset].price;
121
- if (leveragedType === 'lsd-leverage') {
122
- // Treat ETH like a stablecoin in a long stETH position
123
- payload.leveragedLsdAssetRatio = new Dec(assetsData[leveragedAsset].price).div(assetsData.ETH.price).toDP(18).toString();
124
- assetPrice = new Dec(assetPrice).div(assetsData.ETH.price).toString();
125
- }
126
- payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
127
- }
128
- payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
129
- payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
130
- payload.healthRatio = new Dec(payload.liquidationLimitUsd).div(payload.borrowedUsd).toDP(4).toString();
131
- payload.minHealthRatio = new Dec(payload.liquidationLimitUsd).div(payload.borrowLimitUsd).toDP(4).toString();
132
- return payload;
133
- };
134
-
135
- const getApyAfterValuesEstimationInner = async (selectedMarket: AaveMarketInfo, actions: [{ action: string, amount: string, asset: string }], client: Client, network: NetworkNumber) => {
136
- const params = actions.map(({ action, asset, amount }) => {
137
- const isDebtAsset = borrowOperations.includes(action);
138
- const amountInWei = assetAmountInWei(amount, asset);
139
- const assetInfo = getAssetInfo(ethToWeth(asset), network);
140
- let liquidityAdded;
141
- let liquidityTaken;
142
- if (isDebtAsset) {
143
- liquidityAdded = action === 'payback' ? amountInWei : '0';
144
- liquidityTaken = action === 'borrow' ? amountInWei : '0';
145
- } else {
146
- liquidityAdded = action === 'collateral' ? amountInWei : '0';
147
- liquidityTaken = action === 'withdraw' ? amountInWei : '0';
148
- }
149
- return {
150
- reserveAddress: assetInfo.address as EthAddress,
151
- liquidityAdded: BigInt(liquidityAdded),
152
- liquidityTaken: BigInt(liquidityTaken),
153
- isDebtAsset,
154
- };
155
- });
156
- const viewContract = isAaveV2({ selectedMarket }) ? AaveLoanInfoV2ContractViem(client, network) : AaveV3ViewContractViem(client, network);
157
- const data = await viewContract.read.getApyAfterValuesEstimation([selectedMarket.providerAddress, params]);
158
- const rates: { [key: string]: { supplyRate: string, borrowRate: string } } = {};
159
- data.forEach((d: { reserveAddress: EthAddress, supplyRate: BigInt, variableBorrowRate: BigInt }) => {
160
- const asset = wethToEth(getAssetInfoByAddress(d.reserveAddress, network).symbol);
161
- rates[asset] = {
162
- supplyRate: aprToApy(new Dec(d.supplyRate.toString()).div(1e25).toString()),
163
- borrowRate: aprToApy(new Dec(d.variableBorrowRate.toString()).div(1e25).toString()),
164
- };
165
- });
166
- return rates;
167
- };
168
-
169
- export const getApyAfterValuesEstimation = async (selectedMarket: AaveMarketInfo, actions: [{ action: string, amount: string, asset: string }], provider: EthereumProvider, network: NetworkNumber) => getApyAfterValuesEstimationInner(selectedMarket, actions, getViemProvider(provider, network), network);
1
+ import Dec from 'decimal.js';
2
+ import { assetAmountInWei, getAssetInfo, getAssetInfoByAddress } from '@defisaver/tokens';
3
+ import { Client } from 'viem';
4
+ import {
5
+ AaveAssetData, AaveHelperCommon, AaveMarketInfo, AaveV3AggregatedPositionData, AaveV3AssetsData, AaveV3UsedAssets, AaveVersions,
6
+ } from '../../types';
7
+ import { ethToWeth, wethToEth } from '../../services/utils';
8
+ import {
9
+ aprToApy, calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos,
10
+ } from '../../moneymarket';
11
+ import { calculateNetApy } from '../../staking';
12
+ import { borrowOperations } from '../../constants';
13
+ import { EthAddress, EthereumProvider, NetworkNumber } from '../../types/common';
14
+ import { AaveLoanInfoV2ContractViem, AaveV3ViewContractViem } from '../../contracts';
15
+ import { getViemProvider } from '../../services/viem';
16
+
17
+ export const AAVE_V3_MARKETS = [AaveVersions.AaveV3, AaveVersions.AaveV3Lido, AaveVersions.AaveV3Etherfi];
18
+
19
+ export const isAaveV2 = ({ selectedMarket }: { selectedMarket: Partial<AaveMarketInfo> }) => selectedMarket.value === AaveVersions.AaveV2;
20
+ export const isAaveV3 = ({ selectedMarket }: { selectedMarket: Partial<AaveMarketInfo> }) => AAVE_V3_MARKETS.includes(selectedMarket.value as AaveVersions);
21
+
22
+ export const aaveV3IsInIsolationMode = ({ usedAssets, assetsData }: { usedAssets: AaveV3UsedAssets, assetsData: AaveV3AssetsData }) => Object.values(usedAssets).some(({ symbol, collateral }) => collateral && assetsData[symbol].isIsolated);
23
+ export const aaveV3IsInSiloedMode = ({ usedAssets, assetsData }: { usedAssets: AaveV3UsedAssets, assetsData: AaveV3AssetsData }) => Object.values(usedAssets).some(({ symbol, debt }) => debt && assetsData[symbol].isSiloed);
24
+
25
+ export const aaveAnyGetCollSuppliedAssets = ({ usedAssets }: { usedAssets: AaveV3UsedAssets }) => Object.values(usedAssets)
26
+ .filter(({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral);
27
+
28
+ export const aaveAnyGetSuppliableAssets = ({
29
+ usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest
30
+ }: AaveHelperCommon) => {
31
+ const data = {
32
+ usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest,
33
+ };
34
+
35
+ const collAccountAssets = aaveAnyGetCollSuppliedAssets(data);
36
+ const marketAssets = Object.values(assetsData) as AaveAssetData[];
37
+
38
+ if (collAccountAssets.length === 0 || !isAaveV3(data)) return marketAssets.filter(({ canBeSupplied }) => canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: true }));
39
+
40
+ if (aaveV3IsInIsolationMode(data)) {
41
+ const collAsset = collAccountAssets[0].symbol;
42
+ return marketAssets.filter(d => d.canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: symbol === collAsset }));
43
+ }
44
+
45
+ return marketAssets.filter(d => d.canBeSupplied).map(({ symbol, isIsolated }) => ({ symbol, canBeCollateral: !isIsolated }));
46
+ };
47
+
48
+ export const aaveAnyGetSuppliableAsCollAssets = ({
49
+ usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest
50
+ }: AaveHelperCommon) => aaveAnyGetSuppliableAssets({
51
+ usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest,
52
+ }).filter(({ canBeCollateral }) => canBeCollateral);
53
+
54
+ export const aaveAnyGetEmodeMutableProps = (
55
+ {
56
+ eModeCategory,
57
+ eModeCategoriesData,
58
+ assetsData,
59
+ }: AaveHelperCommon, _asset: string) => {
60
+ const asset = wethToEth(_asset);
61
+
62
+ const assetData = assetsData[asset];
63
+ const eModeCategoryData: { collateralAssets: string[], collateralFactor: string, liquidationRatio: string } = eModeCategoriesData?.[eModeCategory] || { collateralAssets: [], collateralFactor: '0', liquidationRatio: '0' };
64
+
65
+ if (
66
+ eModeCategory === 0
67
+ || !eModeCategoryData.collateralAssets.includes(asset)
68
+ || new Dec(eModeCategoryData.collateralFactor || 0).eq(0)
69
+ ) {
70
+ const { liquidationRatio, collateralFactor } = assetData;
71
+ return ({ liquidationRatio, collateralFactor });
72
+ }
73
+ const { liquidationRatio, collateralFactor } = eModeCategoryData;
74
+ return ({ liquidationRatio, collateralFactor });
75
+ };
76
+
77
+ export const aaveAnyGetAggregatedPositionData = ({
78
+ usedAssets,
79
+ eModeCategory,
80
+ assetsData,
81
+ selectedMarket,
82
+ network,
83
+ ...rest
84
+ }: AaveHelperCommon): AaveV3AggregatedPositionData => {
85
+ const data = {
86
+ usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest,
87
+ };
88
+ const payload = {} as AaveV3AggregatedPositionData;
89
+ payload.suppliedUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
90
+ payload.suppliedCollateralUsd = getAssetsTotal(usedAssets, ({ isSupplied, collateral }: { isSupplied: boolean, collateral: string }) => isSupplied && collateral, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
91
+ payload.borrowLimitUsd = getAssetsTotal(
92
+ usedAssets,
93
+ ({ isSupplied, collateral }: { isSupplied: boolean, collateral: string }) => isSupplied && collateral,
94
+ ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(aaveAnyGetEmodeMutableProps(data, symbol).collateralFactor),
95
+ );
96
+ payload.liquidationLimitUsd = getAssetsTotal(
97
+ usedAssets,
98
+ ({ isSupplied, collateral }: { isSupplied: boolean, collateral: string }) => isSupplied && collateral,
99
+ ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(aaveAnyGetEmodeMutableProps(data, symbol).liquidationRatio),
100
+ );
101
+ payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
102
+ const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
103
+ payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
104
+ payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
105
+ payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
106
+ const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy({
107
+ usedAssets,
108
+ assetsData,
109
+ });
110
+ payload.netApy = netApy;
111
+ payload.incentiveUsd = incentiveUsd;
112
+ payload.totalInterestUsd = totalInterestUsd;
113
+ payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
114
+ payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
115
+ const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
116
+ payload.leveragedType = leveragedType;
117
+ payload.leveragedAsset = leveragedAsset;
118
+ payload.liquidationPrice = '';
119
+ if (leveragedType !== '') {
120
+ let assetPrice = data.assetsData[leveragedAsset].price;
121
+ if (leveragedType === 'lsd-leverage') {
122
+ // Treat ETH like a stablecoin in a long stETH position
123
+ payload.leveragedLsdAssetRatio = new Dec(assetsData[leveragedAsset].price).div(assetsData.ETH.price).toDP(18).toString();
124
+ assetPrice = new Dec(assetPrice).div(assetsData.ETH.price).toString();
125
+ }
126
+ payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
127
+ }
128
+ payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
129
+ payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
130
+ payload.healthRatio = new Dec(payload.liquidationLimitUsd).div(payload.borrowedUsd).toDP(4).toString();
131
+ payload.minHealthRatio = new Dec(payload.liquidationLimitUsd).div(payload.borrowLimitUsd).toDP(4).toString();
132
+ return payload;
133
+ };
134
+
135
+ const getApyAfterValuesEstimationInner = async (selectedMarket: AaveMarketInfo, actions: [{ action: string, amount: string, asset: string }], client: Client, network: NetworkNumber) => {
136
+ const params = actions.map(({ action, asset, amount }) => {
137
+ const isDebtAsset = borrowOperations.includes(action);
138
+ const amountInWei = assetAmountInWei(amount, asset);
139
+ const assetInfo = getAssetInfo(ethToWeth(asset), network);
140
+ let liquidityAdded;
141
+ let liquidityTaken;
142
+ if (isDebtAsset) {
143
+ liquidityAdded = action === 'payback' ? amountInWei : '0';
144
+ liquidityTaken = action === 'borrow' ? amountInWei : '0';
145
+ } else {
146
+ liquidityAdded = action === 'collateral' ? amountInWei : '0';
147
+ liquidityTaken = action === 'withdraw' ? amountInWei : '0';
148
+ }
149
+ return {
150
+ reserveAddress: assetInfo.address as EthAddress,
151
+ liquidityAdded: BigInt(liquidityAdded),
152
+ liquidityTaken: BigInt(liquidityTaken),
153
+ isDebtAsset,
154
+ };
155
+ });
156
+ const viewContract = isAaveV2({ selectedMarket }) ? AaveLoanInfoV2ContractViem(client, network) : AaveV3ViewContractViem(client, network);
157
+ const data = await viewContract.read.getApyAfterValuesEstimation([selectedMarket.providerAddress, params]);
158
+ const rates: { [key: string]: { supplyRate: string, borrowRate: string } } = {};
159
+ data.forEach((d: { reserveAddress: EthAddress, supplyRate: BigInt, variableBorrowRate: BigInt }) => {
160
+ const asset = wethToEth(getAssetInfoByAddress(d.reserveAddress, network).symbol);
161
+ rates[asset] = {
162
+ supplyRate: aprToApy(new Dec(d.supplyRate.toString()).div(1e25).toString()),
163
+ borrowRate: aprToApy(new Dec(d.variableBorrowRate.toString()).div(1e25).toString()),
164
+ };
165
+ });
166
+ return rates;
167
+ };
168
+
169
+ export const getApyAfterValuesEstimation = async (selectedMarket: AaveMarketInfo, actions: [{ action: string, amount: string, asset: string }], provider: EthereumProvider, network: NetworkNumber) => getApyAfterValuesEstimationInner(selectedMarket, actions, getViemProvider(provider, network), network);