@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,155 +1,155 @@
1
- import Dec from 'decimal.js';
2
- import { assetAmountInWei, getAssetInfo, getAssetInfoByAddress } from '@defisaver/tokens';
3
- import {
4
- aprToApy, calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos,
5
- } from '../../moneymarket';
6
- import {
7
- SparkAggregatedPositionData,
8
- SparkAssetsData, SparkHelperCommon, SparkMarketData, SparkUsedAssets,
9
- } from '../../types';
10
- import { calculateNetApy } from '../../staking';
11
- import { ethToWeth, wethToEth } from '../../services/utils';
12
- import { SparkViewContractViem } from '../../contracts';
13
- import { EthAddress, EthereumProvider, NetworkNumber } from '../../types/common';
14
- import { borrowOperations } from '../../constants';
15
- import { getViemProvider } from '../../services/viem';
16
-
17
- export const sparkIsInIsolationMode = ({ usedAssets, assetsData }: { usedAssets: SparkUsedAssets, assetsData: SparkAssetsData }) => Object.values(usedAssets).some(({ symbol, collateral }) => collateral && assetsData[symbol].isIsolated);
18
-
19
- export const sparkGetCollSuppliedAssets = ({ usedAssets }: { usedAssets: SparkUsedAssets }) => Object.values(usedAssets).filter(({ isSupplied, collateral }) => isSupplied && collateral);
20
-
21
- export const sparkGetSuppliableAssets = ({
22
- usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest
23
- }: SparkHelperCommon) => {
24
- const data = {
25
- usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest,
26
- };
27
-
28
- const collAccountAssets = sparkGetCollSuppliedAssets(data);
29
- const marketAssets = Object.values(assetsData);
30
-
31
- if (sparkIsInIsolationMode(data)) {
32
- const collAsset = collAccountAssets[0].symbol;
33
- return marketAssets.filter(d => d.canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: symbol === collAsset }));
34
- }
35
-
36
- return marketAssets.filter(d => d.canBeSupplied).map(({ symbol, isIsolated }) => ({ symbol, canBeCollateral: !isIsolated }));
37
- };
38
-
39
- export const sparkGetSuppliableAsCollAssets = ({
40
- usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest
41
- }: SparkHelperCommon) => sparkGetSuppliableAssets({
42
- usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest,
43
- }).filter(({ canBeCollateral }) => canBeCollateral);
44
-
45
- export const sparkGetEmodeMutableProps = ({
46
- eModeCategory,
47
- assetsData,
48
- }: SparkHelperCommon, _asset: string) => {
49
- const asset = wethToEth(_asset);
50
-
51
- const assetData = assetsData[asset];
52
- if (
53
- eModeCategory === 0
54
- || assetData.eModeCategory !== eModeCategory
55
- || new Dec(assetData?.eModeCategoryData?.collateralFactor || 0).eq(0)
56
- ) {
57
- const { liquidationRatio, collateralFactor } = assetData;
58
- return ({ liquidationRatio, collateralFactor });
59
- }
60
- const { liquidationRatio, collateralFactor } = assetData.eModeCategoryData;
61
- return ({ liquidationRatio, collateralFactor });
62
- };
63
-
64
- export const sparkGetAggregatedPositionData = ({
65
- usedAssets,
66
- eModeCategory,
67
- eModeCategories,
68
- assetsData,
69
- selectedMarket,
70
- network,
71
- ...rest
72
- }: SparkHelperCommon): SparkAggregatedPositionData => {
73
- const data = {
74
- usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest,
75
- };
76
- const payload = {} as SparkAggregatedPositionData;
77
- payload.suppliedUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
78
- payload.suppliedCollateralUsd = getAssetsTotal(usedAssets, ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
79
- payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
80
- payload.borrowLimitUsd = getAssetsTotal(
81
- usedAssets,
82
- ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral,
83
- ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(sparkGetEmodeMutableProps(data, symbol).collateralFactor),
84
- );
85
- payload.liquidationLimitUsd = getAssetsTotal(
86
- usedAssets,
87
- ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral,
88
- ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(sparkGetEmodeMutableProps(data, symbol).liquidationRatio),
89
- );
90
- const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
91
- payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
92
- payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
93
- payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
94
- const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy({ usedAssets, assetsData });
95
- payload.netApy = netApy;
96
- payload.incentiveUsd = incentiveUsd;
97
- payload.totalInterestUsd = totalInterestUsd;
98
- payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
99
- payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
100
- const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
101
- payload.leveragedType = leveragedType;
102
- if (leveragedType !== '') {
103
- payload.leveragedAsset = leveragedAsset;
104
- let assetPrice = data.assetsData[leveragedAsset].price; // TODO sparkPrice or price??
105
- if (leveragedType === 'lsd-leverage') {
106
- // Treat ETH like a stablecoin in a long stETH position
107
- payload.leveragedLsdAssetRatio = new Dec(assetsData[leveragedAsset].price).div(assetsData.ETH.price).toDP(18).toString();
108
- assetPrice = new Dec(assetPrice).div(assetsData.ETH.price).toString();
109
- }
110
- payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
111
- }
112
- payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
113
- payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
114
- payload.healthRatio = new Dec(payload.liquidationLimitUsd).div(payload.borrowedUsd).toDP(4).toString();
115
- payload.minHealthRatio = new Dec(payload.liquidationLimitUsd).div(payload.borrowLimitUsd).toDP(4).toString();
116
- return payload;
117
- };
118
-
119
- export const getApyAfterValuesEstimation = async (selectedMarket: SparkMarketData, actions: [{ action: string, amount: string, asset: string }], provider: EthereumProvider) => {
120
- const client = getViemProvider(provider, NetworkNumber.Eth);
121
- const sparkViewContract = SparkViewContractViem(client, NetworkNumber.Eth);
122
- const params = actions.map(({ action, asset, amount }: { action: string, amount: string, asset: string }) => {
123
- const isDebtAsset = borrowOperations.includes(action);
124
- const amountInWei = assetAmountInWei(amount, asset);
125
- const assetInfo = getAssetInfo(ethToWeth(asset));
126
- let liquidityAdded;
127
- let liquidityTaken;
128
- if (isDebtAsset) {
129
- liquidityAdded = action === 'payback' ? amountInWei : '0';
130
- liquidityTaken = action === 'borrow' ? amountInWei : '0';
131
- } else {
132
- liquidityAdded = action === 'collateral' ? amountInWei : '0';
133
- liquidityTaken = action === 'withdraw' ? amountInWei : '0';
134
- }
135
- return {
136
- reserveAddress: assetInfo.address as EthAddress,
137
- liquidityAdded: BigInt(liquidityAdded),
138
- liquidityTaken: BigInt(liquidityTaken),
139
- isDebtAsset,
140
- };
141
- });
142
- const data = await sparkViewContract.read.getApyAfterValuesEstimation([
143
- selectedMarket.providerAddress,
144
- params,
145
- ]);
146
- const rates: { [key: string]: { supplyRate: string, borrowRate: string } } = {};
147
- data.forEach((d) => {
148
- const asset = wethToEth(getAssetInfoByAddress(d.reserveAddress).symbol);
149
- rates[asset] = {
150
- supplyRate: aprToApy(new Dec(d.supplyRate.toString()).div(1e25).toString()),
151
- borrowRate: aprToApy(new Dec(d.variableBorrowRate.toString()).div(1e25).toString()),
152
- };
153
- });
154
- return rates;
155
- };
1
+ import Dec from 'decimal.js';
2
+ import { assetAmountInWei, getAssetInfo, getAssetInfoByAddress } from '@defisaver/tokens';
3
+ import {
4
+ aprToApy, calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos,
5
+ } from '../../moneymarket';
6
+ import {
7
+ SparkAggregatedPositionData,
8
+ SparkAssetsData, SparkHelperCommon, SparkMarketData, SparkUsedAssets,
9
+ } from '../../types';
10
+ import { calculateNetApy } from '../../staking';
11
+ import { ethToWeth, wethToEth } from '../../services/utils';
12
+ import { SparkViewContractViem } from '../../contracts';
13
+ import { EthAddress, EthereumProvider, NetworkNumber } from '../../types/common';
14
+ import { borrowOperations } from '../../constants';
15
+ import { getViemProvider } from '../../services/viem';
16
+
17
+ export const sparkIsInIsolationMode = ({ usedAssets, assetsData }: { usedAssets: SparkUsedAssets, assetsData: SparkAssetsData }) => Object.values(usedAssets).some(({ symbol, collateral }) => collateral && assetsData[symbol].isIsolated);
18
+
19
+ export const sparkGetCollSuppliedAssets = ({ usedAssets }: { usedAssets: SparkUsedAssets }) => Object.values(usedAssets).filter(({ isSupplied, collateral }) => isSupplied && collateral);
20
+
21
+ export const sparkGetSuppliableAssets = ({
22
+ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest
23
+ }: SparkHelperCommon) => {
24
+ const data = {
25
+ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest,
26
+ };
27
+
28
+ const collAccountAssets = sparkGetCollSuppliedAssets(data);
29
+ const marketAssets = Object.values(assetsData);
30
+
31
+ if (sparkIsInIsolationMode(data)) {
32
+ const collAsset = collAccountAssets[0].symbol;
33
+ return marketAssets.filter(d => d.canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: symbol === collAsset }));
34
+ }
35
+
36
+ return marketAssets.filter(d => d.canBeSupplied).map(({ symbol, isIsolated }) => ({ symbol, canBeCollateral: !isIsolated }));
37
+ };
38
+
39
+ export const sparkGetSuppliableAsCollAssets = ({
40
+ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest
41
+ }: SparkHelperCommon) => sparkGetSuppliableAssets({
42
+ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest,
43
+ }).filter(({ canBeCollateral }) => canBeCollateral);
44
+
45
+ export const sparkGetEmodeMutableProps = ({
46
+ eModeCategory,
47
+ assetsData,
48
+ }: SparkHelperCommon, _asset: string) => {
49
+ const asset = wethToEth(_asset);
50
+
51
+ const assetData = assetsData[asset];
52
+ if (
53
+ eModeCategory === 0
54
+ || assetData.eModeCategory !== eModeCategory
55
+ || new Dec(assetData?.eModeCategoryData?.collateralFactor || 0).eq(0)
56
+ ) {
57
+ const { liquidationRatio, collateralFactor } = assetData;
58
+ return ({ liquidationRatio, collateralFactor });
59
+ }
60
+ const { liquidationRatio, collateralFactor } = assetData.eModeCategoryData;
61
+ return ({ liquidationRatio, collateralFactor });
62
+ };
63
+
64
+ export const sparkGetAggregatedPositionData = ({
65
+ usedAssets,
66
+ eModeCategory,
67
+ eModeCategories,
68
+ assetsData,
69
+ selectedMarket,
70
+ network,
71
+ ...rest
72
+ }: SparkHelperCommon): SparkAggregatedPositionData => {
73
+ const data = {
74
+ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest,
75
+ };
76
+ const payload = {} as SparkAggregatedPositionData;
77
+ payload.suppliedUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
78
+ payload.suppliedCollateralUsd = getAssetsTotal(usedAssets, ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
79
+ payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
80
+ payload.borrowLimitUsd = getAssetsTotal(
81
+ usedAssets,
82
+ ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral,
83
+ ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(sparkGetEmodeMutableProps(data, symbol).collateralFactor),
84
+ );
85
+ payload.liquidationLimitUsd = getAssetsTotal(
86
+ usedAssets,
87
+ ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral,
88
+ ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(sparkGetEmodeMutableProps(data, symbol).liquidationRatio),
89
+ );
90
+ const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
91
+ payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
92
+ payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
93
+ payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
94
+ const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy({ usedAssets, assetsData });
95
+ payload.netApy = netApy;
96
+ payload.incentiveUsd = incentiveUsd;
97
+ payload.totalInterestUsd = totalInterestUsd;
98
+ payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
99
+ payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
100
+ const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
101
+ payload.leveragedType = leveragedType;
102
+ if (leveragedType !== '') {
103
+ payload.leveragedAsset = leveragedAsset;
104
+ let assetPrice = data.assetsData[leveragedAsset].price; // TODO sparkPrice or price??
105
+ if (leveragedType === 'lsd-leverage') {
106
+ // Treat ETH like a stablecoin in a long stETH position
107
+ payload.leveragedLsdAssetRatio = new Dec(assetsData[leveragedAsset].price).div(assetsData.ETH.price).toDP(18).toString();
108
+ assetPrice = new Dec(assetPrice).div(assetsData.ETH.price).toString();
109
+ }
110
+ payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
111
+ }
112
+ payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
113
+ payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
114
+ payload.healthRatio = new Dec(payload.liquidationLimitUsd).div(payload.borrowedUsd).toDP(4).toString();
115
+ payload.minHealthRatio = new Dec(payload.liquidationLimitUsd).div(payload.borrowLimitUsd).toDP(4).toString();
116
+ return payload;
117
+ };
118
+
119
+ export const getApyAfterValuesEstimation = async (selectedMarket: SparkMarketData, actions: [{ action: string, amount: string, asset: string }], provider: EthereumProvider) => {
120
+ const client = getViemProvider(provider, NetworkNumber.Eth);
121
+ const sparkViewContract = SparkViewContractViem(client, NetworkNumber.Eth);
122
+ const params = actions.map(({ action, asset, amount }: { action: string, amount: string, asset: string }) => {
123
+ const isDebtAsset = borrowOperations.includes(action);
124
+ const amountInWei = assetAmountInWei(amount, asset);
125
+ const assetInfo = getAssetInfo(ethToWeth(asset));
126
+ let liquidityAdded;
127
+ let liquidityTaken;
128
+ if (isDebtAsset) {
129
+ liquidityAdded = action === 'payback' ? amountInWei : '0';
130
+ liquidityTaken = action === 'borrow' ? amountInWei : '0';
131
+ } else {
132
+ liquidityAdded = action === 'collateral' ? amountInWei : '0';
133
+ liquidityTaken = action === 'withdraw' ? amountInWei : '0';
134
+ }
135
+ return {
136
+ reserveAddress: assetInfo.address as EthAddress,
137
+ liquidityAdded: BigInt(liquidityAdded),
138
+ liquidityTaken: BigInt(liquidityTaken),
139
+ isDebtAsset,
140
+ };
141
+ });
142
+ const data = await sparkViewContract.read.getApyAfterValuesEstimation([
143
+ selectedMarket.providerAddress,
144
+ params,
145
+ ]);
146
+ const rates: { [key: string]: { supplyRate: string, borrowRate: string } } = {};
147
+ data.forEach((d) => {
148
+ const asset = wethToEth(getAssetInfoByAddress(d.reserveAddress).symbol);
149
+ rates[asset] = {
150
+ supplyRate: aprToApy(new Dec(d.supplyRate.toString()).div(1e25).toString()),
151
+ borrowRate: aprToApy(new Dec(d.variableBorrowRate.toString()).div(1e25).toString()),
152
+ };
153
+ });
154
+ return rates;
155
+ };
package/src/index.ts CHANGED
@@ -1,47 +1,47 @@
1
- import './setup';
2
-
3
- import * as fluid from './fluid';
4
- import * as aaveV3 from './aaveV3';
5
- import * as aaveV2 from './aaveV2';
6
- import * as compoundV3 from './compoundV3';
7
- import * as compoundV2 from './compoundV2';
8
- import * as spark from './spark';
9
- import * as curveUsd from './curveUsd';
10
- import * as liquity from './liquity';
11
- import * as liquityV2 from './liquityV2';
12
- import * as maker from './maker';
13
- import * as staking from './staking';
14
- import * as moneymarket from './moneymarket';
15
- import * as markets from './markets';
16
- import * as helpers from './helpers';
17
- import * as exchange from './exchange';
18
- import * as morphoBlue from './morphoBlue';
19
- import * as llamaLend from './llamaLend';
20
- import * as eulerV2 from './eulerV2';
21
- import * as portfolio from './portfolio';
22
- import * as claiming from './claiming';
23
-
24
- export * from './types';
25
-
26
- export {
27
- aaveV2,
28
- aaveV3,
29
- compoundV2,
30
- compoundV3,
31
- spark,
32
- curveUsd,
33
- liquity,
34
- liquityV2,
35
- maker,
36
- exchange,
37
- staking,
38
- moneymarket,
39
- markets,
40
- helpers,
41
- morphoBlue,
42
- llamaLend,
43
- eulerV2,
44
- fluid,
45
- portfolio,
46
- claiming,
47
- };
1
+ import './setup';
2
+
3
+ import * as fluid from './fluid';
4
+ import * as aaveV3 from './aaveV3';
5
+ import * as aaveV2 from './aaveV2';
6
+ import * as compoundV3 from './compoundV3';
7
+ import * as compoundV2 from './compoundV2';
8
+ import * as spark from './spark';
9
+ import * as curveUsd from './curveUsd';
10
+ import * as liquity from './liquity';
11
+ import * as liquityV2 from './liquityV2';
12
+ import * as maker from './maker';
13
+ import * as staking from './staking';
14
+ import * as moneymarket from './moneymarket';
15
+ import * as markets from './markets';
16
+ import * as helpers from './helpers';
17
+ import * as exchange from './exchange';
18
+ import * as morphoBlue from './morphoBlue';
19
+ import * as llamaLend from './llamaLend';
20
+ import * as eulerV2 from './eulerV2';
21
+ import * as portfolio from './portfolio';
22
+ import * as claiming from './claiming';
23
+
24
+ export * from './types';
25
+
26
+ export {
27
+ aaveV2,
28
+ aaveV3,
29
+ compoundV2,
30
+ compoundV3,
31
+ spark,
32
+ curveUsd,
33
+ liquity,
34
+ liquityV2,
35
+ maker,
36
+ exchange,
37
+ staking,
38
+ moneymarket,
39
+ markets,
40
+ helpers,
41
+ morphoBlue,
42
+ llamaLend,
43
+ eulerV2,
44
+ fluid,
45
+ portfolio,
46
+ claiming,
47
+ };