@defisaver/positions-sdk 2.1.41 → 2.1.43-aave-v4-dev-1

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 (145) hide show
  1. package/.mocharc.json +4 -4
  2. package/.nvmrc +1 -1
  3. package/README.md +64 -64
  4. package/cjs/aaveV4/index.d.ts +7 -0
  5. package/cjs/aaveV4/index.js +99 -0
  6. package/cjs/config/contracts.d.ts +1069 -0
  7. package/cjs/config/contracts.js +9 -0
  8. package/cjs/contracts.d.ts +18265 -0
  9. package/cjs/contracts.js +2 -1
  10. package/cjs/helpers/morphoBlueHelpers/index.js +66 -66
  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/savings/morphoVaults/index.js +17 -17
  18. package/cjs/savings/morphoVaults/options.js +2 -2
  19. package/cjs/types/aaveV4.d.ts +73 -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/esm/aaveV4/index.d.ts +7 -0
  24. package/esm/aaveV4/index.js +90 -0
  25. package/esm/config/contracts.d.ts +1069 -0
  26. package/esm/config/contracts.js +8 -0
  27. package/esm/contracts.d.ts +18265 -0
  28. package/esm/contracts.js +1 -0
  29. package/esm/helpers/morphoBlueHelpers/index.js +66 -66
  30. package/esm/index.d.ts +2 -1
  31. package/esm/index.js +2 -1
  32. package/esm/markets/aaveV4/index.d.ts +6 -0
  33. package/esm/markets/aaveV4/index.js +15 -0
  34. package/esm/markets/index.d.ts +1 -0
  35. package/esm/markets/index.js +1 -0
  36. package/esm/savings/morphoVaults/index.js +17 -17
  37. package/esm/savings/morphoVaults/options.js +2 -2
  38. package/esm/types/aaveV4.d.ts +73 -0
  39. package/esm/types/aaveV4.js +8 -0
  40. package/esm/types/index.d.ts +1 -0
  41. package/esm/types/index.js +1 -0
  42. package/package.json +48 -48
  43. package/src/aaveV2/index.ts +240 -240
  44. package/src/aaveV3/index.ts +625 -625
  45. package/src/aaveV3/merit.ts +97 -97
  46. package/src/aaveV3/merkl.ts +74 -74
  47. package/src/aaveV4/index.ts +90 -0
  48. package/src/claiming/aaveV3.ts +154 -154
  49. package/src/claiming/compV3.ts +22 -22
  50. package/src/claiming/ethena.ts +61 -61
  51. package/src/claiming/index.ts +12 -12
  52. package/src/claiming/king.ts +66 -66
  53. package/src/claiming/morphoBlue.ts +118 -118
  54. package/src/claiming/spark.ts +225 -225
  55. package/src/compoundV2/index.ts +244 -244
  56. package/src/compoundV3/index.ts +274 -274
  57. package/src/config/contracts.ts +1303 -1295
  58. package/src/constants/index.ts +10 -10
  59. package/src/contracts.ts +174 -172
  60. package/src/curveUsd/index.ts +254 -254
  61. package/src/eulerV2/index.ts +324 -324
  62. package/src/exchange/index.ts +25 -25
  63. package/src/fluid/index.ts +1800 -1800
  64. package/src/helpers/aaveHelpers/index.ts +187 -187
  65. package/src/helpers/compoundHelpers/index.ts +283 -283
  66. package/src/helpers/curveUsdHelpers/index.ts +40 -40
  67. package/src/helpers/eulerHelpers/index.ts +222 -222
  68. package/src/helpers/fluidHelpers/index.ts +326 -326
  69. package/src/helpers/index.ts +10 -10
  70. package/src/helpers/liquityV2Helpers/index.ts +82 -82
  71. package/src/helpers/llamaLendHelpers/index.ts +53 -53
  72. package/src/helpers/makerHelpers/index.ts +52 -52
  73. package/src/helpers/morphoBlueHelpers/index.ts +396 -396
  74. package/src/helpers/sparkHelpers/index.ts +158 -158
  75. package/src/index.ts +51 -49
  76. package/src/liquity/index.ts +159 -159
  77. package/src/liquityV2/index.ts +703 -703
  78. package/src/llamaLend/index.ts +305 -305
  79. package/src/maker/index.ts +223 -223
  80. package/src/markets/aave/index.ts +118 -118
  81. package/src/markets/aave/marketAssets.ts +54 -54
  82. package/src/markets/aaveV4/index.ts +17 -0
  83. package/src/markets/compound/index.ts +243 -243
  84. package/src/markets/compound/marketsAssets.ts +97 -97
  85. package/src/markets/curveUsd/index.ts +69 -69
  86. package/src/markets/euler/index.ts +26 -26
  87. package/src/markets/fluid/index.ts +2900 -2900
  88. package/src/markets/index.ts +26 -25
  89. package/src/markets/liquityV2/index.ts +102 -102
  90. package/src/markets/llamaLend/contractAddresses.ts +141 -141
  91. package/src/markets/llamaLend/index.ts +235 -235
  92. package/src/markets/morphoBlue/index.ts +971 -971
  93. package/src/markets/spark/index.ts +29 -29
  94. package/src/markets/spark/marketAssets.ts +12 -12
  95. package/src/moneymarket/moneymarketCommonService.ts +85 -85
  96. package/src/morphoBlue/index.ts +274 -274
  97. package/src/portfolio/index.ts +598 -598
  98. package/src/savings/index.ts +95 -95
  99. package/src/savings/makerDsr/index.ts +53 -53
  100. package/src/savings/makerDsr/options.ts +9 -9
  101. package/src/savings/morphoVaults/index.ts +80 -80
  102. package/src/savings/morphoVaults/options.ts +193 -193
  103. package/src/savings/skyOptions/index.ts +95 -95
  104. package/src/savings/skyOptions/options.ts +10 -10
  105. package/src/savings/sparkSavingsVaults/index.ts +60 -60
  106. package/src/savings/sparkSavingsVaults/options.ts +35 -35
  107. package/src/savings/yearnV3Vaults/index.ts +61 -61
  108. package/src/savings/yearnV3Vaults/options.ts +55 -55
  109. package/src/savings/yearnVaults/index.ts +73 -73
  110. package/src/savings/yearnVaults/options.ts +32 -32
  111. package/src/services/priceService.ts +278 -278
  112. package/src/services/utils.ts +115 -115
  113. package/src/services/viem.ts +34 -34
  114. package/src/setup.ts +8 -8
  115. package/src/spark/index.ts +458 -458
  116. package/src/staking/eligibility.ts +53 -53
  117. package/src/staking/index.ts +1 -1
  118. package/src/staking/staking.ts +186 -186
  119. package/src/types/aave.ts +196 -196
  120. package/src/types/aaveV4.ts +81 -0
  121. package/src/types/claiming.ts +114 -114
  122. package/src/types/common.ts +107 -107
  123. package/src/types/compound.ts +144 -144
  124. package/src/types/curveUsd.ts +123 -123
  125. package/src/types/euler.ts +175 -175
  126. package/src/types/fluid.ts +483 -483
  127. package/src/types/index.ts +16 -15
  128. package/src/types/liquity.ts +30 -30
  129. package/src/types/liquityV2.ts +126 -126
  130. package/src/types/llamaLend.ts +159 -159
  131. package/src/types/maker.ts +63 -63
  132. package/src/types/merit.ts +1 -1
  133. package/src/types/merkl.ts +70 -70
  134. package/src/types/morphoBlue.ts +200 -200
  135. package/src/types/portfolio.ts +60 -60
  136. package/src/types/savings/index.ts +23 -23
  137. package/src/types/savings/makerDsr.ts +13 -13
  138. package/src/types/savings/morphoVaults.ts +32 -32
  139. package/src/types/savings/sky.ts +14 -14
  140. package/src/types/savings/sparkSavingsVaults.ts +15 -15
  141. package/src/types/savings/yearnV3Vaults.ts +17 -17
  142. package/src/types/savings/yearnVaults.ts +14 -14
  143. package/src/types/spark.ts +134 -134
  144. package/src/umbrella/index.ts +69 -69
  145. package/src/umbrella/umbrellaUtils.ts +29 -29
@@ -1,188 +1,188 @@
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 { getNativeAssetFromWrapped, getWrappedNativeAssetFromUnwrapped } 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 = getNativeAssetFromWrapped(_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
- payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
107
- payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
108
- const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
109
- payload.leveragedType = leveragedType;
110
- payload.leveragedAsset = leveragedAsset;
111
- payload.liquidationPrice = '';
112
- if (leveragedType !== '') {
113
- let assetPrice = data.assetsData[leveragedAsset].price;
114
- if (leveragedType === 'lsd-leverage') {
115
- // Treat ETH like a stablecoin in a long stETH position
116
- payload.leveragedLsdAssetRatio = new Dec(assetsData[leveragedAsset].price).div(assetsData.ETH.price).toDP(18).toString();
117
- assetPrice = new Dec(assetPrice).div(assetsData.ETH.price).toString();
118
- }
119
- payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
120
- }
121
- payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
122
- payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
123
- payload.healthRatio = new Dec(payload.liquidationLimitUsd).div(payload.borrowedUsd).toDP(4).toString();
124
- payload.minHealthRatio = new Dec(payload.liquidationLimitUsd).div(payload.borrowLimitUsd).toDP(4).toString();
125
-
126
- const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy({
127
- usedAssets,
128
- assetsData,
129
- optionalData: { healthRatio: payload.healthRatio },
130
- });
131
- payload.netApy = netApy;
132
- payload.incentiveUsd = incentiveUsd;
133
- payload.totalInterestUsd = totalInterestUsd;
134
- return payload;
135
- };
136
-
137
- const getApyAfterValuesEstimationInner = async (selectedMarket: AaveMarketInfo, actions: [{ action: string, amount: string, asset: string }], client: Client, network: NetworkNumber) => {
138
- const params = actions.map(({ action, asset, amount }) => {
139
- const isDebtAsset = borrowOperations.includes(action);
140
- const amountInWei = assetAmountInWei(amount, asset);
141
- const assetInfo = getAssetInfo(getWrappedNativeAssetFromUnwrapped(asset), network);
142
- let liquidityAdded;
143
- let liquidityTaken;
144
- if (isDebtAsset) {
145
- liquidityAdded = action === 'payback' ? amountInWei : '0';
146
- liquidityTaken = action === 'borrow' ? amountInWei : '0';
147
- } else {
148
- liquidityAdded = action === 'collateral' ? amountInWei : '0';
149
- liquidityTaken = action === 'withdraw' ? amountInWei : '0';
150
- }
151
- return {
152
- reserveAddress: assetInfo.address as EthAddress,
153
- liquidityAdded: BigInt(liquidityAdded),
154
- liquidityTaken: BigInt(liquidityTaken),
155
- isDebtAsset,
156
- };
157
- });
158
- const viewContract = isAaveV2({ selectedMarket }) ? AaveLoanInfoV2ContractViem(client, network) : AaveV3ViewContractViem(client, network);
159
- const data = await viewContract.read.getApyAfterValuesEstimation([selectedMarket.providerAddress, params]);
160
- const rates: { [key: string]: { supplyRate: string, borrowRate: string } } = {};
161
- data.forEach((d: { reserveAddress: EthAddress, supplyRate: BigInt, variableBorrowRate: BigInt }) => {
162
- const asset = getNativeAssetFromWrapped(getAssetInfoByAddress(d.reserveAddress, network).symbol);
163
- rates[asset] = {
164
- supplyRate: aprToApy(new Dec(d.supplyRate.toString()).div(1e25).toString()),
165
- borrowRate: aprToApy(new Dec(d.variableBorrowRate.toString()).div(1e25).toString()),
166
- };
167
- });
168
- return rates;
169
- };
170
-
171
- export const getApyAfterValuesEstimation = async (selectedMarket: AaveMarketInfo, actions: [{ action: string, amount: string, asset: string }], provider: EthereumProvider, network: NetworkNumber) => getApyAfterValuesEstimationInner(selectedMarket, actions, getViemProvider(provider, network), network);
172
-
173
- /**
174
- * won't cover all cases
175
- */
176
- export const getAaveUnderlyingSymbol = (_symbol = '') => {
177
- let symbol = _symbol
178
- .replace(/^aEthLido/, '')
179
- .replace(/^aEthEtherFi/, '')
180
- .replace(/^aEth/, '')
181
- .replace(/^aArb/, '')
182
- .replace(/^aOpt/, '')
183
- .replace(/^aLin/, '')
184
- .replace(/^aPla/, '')
185
- .replace(/^aBas/, '');
186
- if (symbol.startsWith('a')) symbol = symbol.slice(1);
187
- return getNativeAssetFromWrapped(symbol);
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 { getNativeAssetFromWrapped, getWrappedNativeAssetFromUnwrapped } 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 = getNativeAssetFromWrapped(_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
+ payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
107
+ payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
108
+ const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
109
+ payload.leveragedType = leveragedType;
110
+ payload.leveragedAsset = leveragedAsset;
111
+ payload.liquidationPrice = '';
112
+ if (leveragedType !== '') {
113
+ let assetPrice = data.assetsData[leveragedAsset].price;
114
+ if (leveragedType === 'lsd-leverage') {
115
+ // Treat ETH like a stablecoin in a long stETH position
116
+ payload.leveragedLsdAssetRatio = new Dec(assetsData[leveragedAsset].price).div(assetsData.ETH.price).toDP(18).toString();
117
+ assetPrice = new Dec(assetPrice).div(assetsData.ETH.price).toString();
118
+ }
119
+ payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
120
+ }
121
+ payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
122
+ payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
123
+ payload.healthRatio = new Dec(payload.liquidationLimitUsd).div(payload.borrowedUsd).toDP(4).toString();
124
+ payload.minHealthRatio = new Dec(payload.liquidationLimitUsd).div(payload.borrowLimitUsd).toDP(4).toString();
125
+
126
+ const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy({
127
+ usedAssets,
128
+ assetsData,
129
+ optionalData: { healthRatio: payload.healthRatio },
130
+ });
131
+ payload.netApy = netApy;
132
+ payload.incentiveUsd = incentiveUsd;
133
+ payload.totalInterestUsd = totalInterestUsd;
134
+ return payload;
135
+ };
136
+
137
+ const getApyAfterValuesEstimationInner = async (selectedMarket: AaveMarketInfo, actions: [{ action: string, amount: string, asset: string }], client: Client, network: NetworkNumber) => {
138
+ const params = actions.map(({ action, asset, amount }) => {
139
+ const isDebtAsset = borrowOperations.includes(action);
140
+ const amountInWei = assetAmountInWei(amount, asset);
141
+ const assetInfo = getAssetInfo(getWrappedNativeAssetFromUnwrapped(asset), network);
142
+ let liquidityAdded;
143
+ let liquidityTaken;
144
+ if (isDebtAsset) {
145
+ liquidityAdded = action === 'payback' ? amountInWei : '0';
146
+ liquidityTaken = action === 'borrow' ? amountInWei : '0';
147
+ } else {
148
+ liquidityAdded = action === 'collateral' ? amountInWei : '0';
149
+ liquidityTaken = action === 'withdraw' ? amountInWei : '0';
150
+ }
151
+ return {
152
+ reserveAddress: assetInfo.address as EthAddress,
153
+ liquidityAdded: BigInt(liquidityAdded),
154
+ liquidityTaken: BigInt(liquidityTaken),
155
+ isDebtAsset,
156
+ };
157
+ });
158
+ const viewContract = isAaveV2({ selectedMarket }) ? AaveLoanInfoV2ContractViem(client, network) : AaveV3ViewContractViem(client, network);
159
+ const data = await viewContract.read.getApyAfterValuesEstimation([selectedMarket.providerAddress, params]);
160
+ const rates: { [key: string]: { supplyRate: string, borrowRate: string } } = {};
161
+ data.forEach((d: { reserveAddress: EthAddress, supplyRate: BigInt, variableBorrowRate: BigInt }) => {
162
+ const asset = getNativeAssetFromWrapped(getAssetInfoByAddress(d.reserveAddress, network).symbol);
163
+ rates[asset] = {
164
+ supplyRate: aprToApy(new Dec(d.supplyRate.toString()).div(1e25).toString()),
165
+ borrowRate: aprToApy(new Dec(d.variableBorrowRate.toString()).div(1e25).toString()),
166
+ };
167
+ });
168
+ return rates;
169
+ };
170
+
171
+ export const getApyAfterValuesEstimation = async (selectedMarket: AaveMarketInfo, actions: [{ action: string, amount: string, asset: string }], provider: EthereumProvider, network: NetworkNumber) => getApyAfterValuesEstimationInner(selectedMarket, actions, getViemProvider(provider, network), network);
172
+
173
+ /**
174
+ * won't cover all cases
175
+ */
176
+ export const getAaveUnderlyingSymbol = (_symbol = '') => {
177
+ let symbol = _symbol
178
+ .replace(/^aEthLido/, '')
179
+ .replace(/^aEthEtherFi/, '')
180
+ .replace(/^aEth/, '')
181
+ .replace(/^aArb/, '')
182
+ .replace(/^aOpt/, '')
183
+ .replace(/^aLin/, '')
184
+ .replace(/^aPla/, '')
185
+ .replace(/^aBas/, '');
186
+ if (symbol.startsWith('a')) symbol = symbol.slice(1);
187
+ return getNativeAssetFromWrapped(symbol);
188
188
  };