@defisaver/positions-sdk 2.1.2 → 2.1.4-dev-plasma-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 (130) hide show
  1. package/.mocharc.json +4 -4
  2. package/.nvmrc +1 -1
  3. package/README.md +64 -64
  4. package/cjs/aaveV3/index.js +1 -1
  5. package/cjs/aaveV3/merit.js +3 -0
  6. package/cjs/config/contracts.d.ts +17 -0
  7. package/cjs/config/contracts.js +17 -0
  8. package/cjs/helpers/aaveHelpers/index.js +8 -7
  9. package/cjs/helpers/morphoBlueHelpers/index.js +66 -66
  10. package/cjs/markets/aave/index.js +1 -1
  11. package/cjs/markets/aave/marketAssets.d.ts +4 -0
  12. package/cjs/markets/aave/marketAssets.js +5 -1
  13. package/cjs/markets/compound/index.js +11 -0
  14. package/cjs/markets/compound/marketsAssets.d.ts +7 -0
  15. package/cjs/markets/compound/marketsAssets.js +7 -0
  16. package/cjs/markets/spark/marketAssets.d.ts +1 -0
  17. package/cjs/markets/spark/marketAssets.js +1 -0
  18. package/cjs/services/utils.js +1 -1
  19. package/cjs/services/viem.d.ts +54 -15
  20. package/cjs/services/viem.js +2 -0
  21. package/cjs/staking/eligibility.d.ts +4 -2
  22. package/cjs/staking/eligibility.js +3 -4
  23. package/cjs/staking/staking.d.ts +2 -1
  24. package/cjs/staking/staking.js +5 -4
  25. package/cjs/types/common.d.ts +3 -2
  26. package/cjs/types/common.js +2 -1
  27. package/esm/aaveV3/index.js +1 -1
  28. package/esm/aaveV3/merit.js +3 -0
  29. package/esm/config/contracts.d.ts +17 -0
  30. package/esm/config/contracts.js +17 -0
  31. package/esm/helpers/aaveHelpers/index.js +8 -7
  32. package/esm/helpers/morphoBlueHelpers/index.js +66 -66
  33. package/esm/markets/aave/index.js +1 -1
  34. package/esm/markets/aave/marketAssets.d.ts +4 -0
  35. package/esm/markets/aave/marketAssets.js +4 -0
  36. package/esm/markets/compound/index.js +11 -0
  37. package/esm/markets/compound/marketsAssets.d.ts +7 -0
  38. package/esm/markets/compound/marketsAssets.js +7 -0
  39. package/esm/markets/spark/marketAssets.d.ts +1 -0
  40. package/esm/markets/spark/marketAssets.js +1 -0
  41. package/esm/services/utils.js +1 -1
  42. package/esm/services/viem.d.ts +54 -15
  43. package/esm/services/viem.js +3 -1
  44. package/esm/staking/eligibility.d.ts +4 -2
  45. package/esm/staking/eligibility.js +3 -4
  46. package/esm/staking/staking.d.ts +2 -1
  47. package/esm/staking/staking.js +5 -4
  48. package/esm/types/common.d.ts +3 -2
  49. package/esm/types/common.js +2 -1
  50. package/package.json +47 -47
  51. package/src/aaveV2/index.ts +240 -240
  52. package/src/aaveV3/index.ts +614 -614
  53. package/src/aaveV3/merit.ts +97 -94
  54. package/src/aaveV3/merkl.ts +74 -74
  55. package/src/claiming/aaveV3.ts +154 -154
  56. package/src/claiming/compV3.ts +22 -22
  57. package/src/claiming/index.ts +12 -12
  58. package/src/claiming/king.ts +66 -66
  59. package/src/claiming/morphoBlue.ts +118 -118
  60. package/src/claiming/spark.ts +225 -225
  61. package/src/compoundV2/index.ts +244 -244
  62. package/src/compoundV3/index.ts +274 -274
  63. package/src/config/contracts.ts +1245 -1228
  64. package/src/constants/index.ts +10 -10
  65. package/src/contracts.ts +120 -120
  66. package/src/curveUsd/index.ts +250 -250
  67. package/src/eulerV2/index.ts +324 -324
  68. package/src/exchange/index.ts +25 -25
  69. package/src/fluid/index.ts +1638 -1638
  70. package/src/helpers/aaveHelpers/index.ts +185 -183
  71. package/src/helpers/compoundHelpers/index.ts +283 -283
  72. package/src/helpers/curveUsdHelpers/index.ts +40 -40
  73. package/src/helpers/eulerHelpers/index.ts +222 -222
  74. package/src/helpers/fluidHelpers/index.ts +326 -326
  75. package/src/helpers/index.ts +10 -10
  76. package/src/helpers/liquityV2Helpers/index.ts +82 -82
  77. package/src/helpers/llamaLendHelpers/index.ts +53 -53
  78. package/src/helpers/makerHelpers/index.ts +52 -52
  79. package/src/helpers/morphoBlueHelpers/index.ts +396 -396
  80. package/src/helpers/sparkHelpers/index.ts +155 -155
  81. package/src/index.ts +47 -47
  82. package/src/liquity/index.ts +159 -159
  83. package/src/liquityV2/index.ts +657 -657
  84. package/src/llamaLend/index.ts +305 -305
  85. package/src/maker/index.ts +223 -223
  86. package/src/markets/aave/index.ts +116 -116
  87. package/src/markets/aave/marketAssets.ts +54 -49
  88. package/src/markets/compound/index.ts +238 -227
  89. package/src/markets/compound/marketsAssets.ts +97 -90
  90. package/src/markets/curveUsd/index.ts +69 -69
  91. package/src/markets/euler/index.ts +26 -26
  92. package/src/markets/fluid/index.ts +2456 -2456
  93. package/src/markets/index.ts +25 -25
  94. package/src/markets/liquityV2/index.ts +102 -102
  95. package/src/markets/llamaLend/contractAddresses.ts +141 -141
  96. package/src/markets/llamaLend/index.ts +235 -235
  97. package/src/markets/morphoBlue/index.ts +895 -895
  98. package/src/markets/spark/index.ts +29 -29
  99. package/src/markets/spark/marketAssets.ts +12 -11
  100. package/src/moneymarket/moneymarketCommonService.ts +80 -80
  101. package/src/morphoBlue/index.ts +274 -274
  102. package/src/portfolio/index.ts +570 -570
  103. package/src/services/priceService.ts +159 -159
  104. package/src/services/utils.ts +99 -99
  105. package/src/services/viem.ts +34 -32
  106. package/src/setup.ts +8 -8
  107. package/src/spark/index.ts +445 -445
  108. package/src/staking/eligibility.ts +59 -60
  109. package/src/staking/index.ts +1 -1
  110. package/src/staking/staking.ts +170 -170
  111. package/src/types/aave.ts +189 -189
  112. package/src/types/claiming.ts +109 -109
  113. package/src/types/common.ts +106 -105
  114. package/src/types/compound.ts +136 -136
  115. package/src/types/curveUsd.ts +121 -121
  116. package/src/types/euler.ts +175 -175
  117. package/src/types/fluid.ts +448 -448
  118. package/src/types/index.ts +13 -13
  119. package/src/types/liquity.ts +30 -30
  120. package/src/types/liquityV2.ts +126 -126
  121. package/src/types/llamaLend.ts +159 -159
  122. package/src/types/maker.ts +63 -63
  123. package/src/types/merit.ts +1 -1
  124. package/src/types/merkl.ts +70 -70
  125. package/src/types/morphoBlue.ts +194 -194
  126. package/src/types/portfolio.ts +60 -60
  127. package/src/types/spark.ts +135 -135
  128. package/src/umbrella/index.ts +69 -69
  129. package/src/umbrella/umbrellaUtils.ts +29 -29
  130. package/CLAUDE.md +0 -32
@@ -1,184 +1,186 @@
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);
170
-
171
- /**
172
- * won't cover all cases
173
- */
174
- export const getAaveUnderlyingSymbol = (_symbol = '') => {
175
- let symbol = _symbol
176
- .replace(/^aEthLido/, '')
177
- .replace(/^aEthEtherFi/, '')
178
- .replace(/^aEth/, '')
179
- .replace(/^aArb/, '')
180
- .replace(/^aOpt/, '')
181
- .replace(/^aBas/, '');
182
- if (symbol.startsWith('a')) symbol = symbol.slice(1);
183
- return wethToEth(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 { 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
+ 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(ethToWeth(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 = wethToEth(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(/^aBas/, '');
184
+ if (symbol.startsWith('a')) symbol = symbol.slice(1);
185
+ return wethToEth(symbol);
184
186
  };