@defisaver/positions-sdk 0.0.166-dev2-liquity-v2 → 0.0.166-dev3

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 (140) hide show
  1. package/.mocharc.json +4 -4
  2. package/.nvmrc +1 -1
  3. package/README.md +69 -69
  4. package/cjs/config/contracts.d.ts +32 -3
  5. package/cjs/config/contracts.js +3 -3
  6. package/cjs/contracts.d.ts +1 -1
  7. package/cjs/contracts.js +2 -2
  8. package/cjs/eulerV2/index.d.ts +41 -0
  9. package/cjs/eulerV2/index.js +214 -0
  10. package/cjs/helpers/eulerHelpers/index.d.ts +27 -0
  11. package/cjs/helpers/eulerHelpers/index.js +232 -0
  12. package/cjs/helpers/index.d.ts +1 -1
  13. package/cjs/helpers/index.js +2 -2
  14. package/cjs/index.d.ts +2 -2
  15. package/cjs/index.js +3 -3
  16. package/cjs/markets/euler/index.d.ts +8 -0
  17. package/cjs/markets/euler/index.js +30 -0
  18. package/cjs/markets/index.d.ts +1 -1
  19. package/cjs/markets/index.js +3 -3
  20. package/cjs/services/utils.d.ts +2 -0
  21. package/cjs/services/utils.js +4 -1
  22. package/cjs/types/contracts/generated/EulerV2View.d.ts +345 -0
  23. package/cjs/types/contracts/generated/index.d.ts +1 -1
  24. package/cjs/types/euler.d.ts +147 -0
  25. package/cjs/types/euler.js +14 -0
  26. package/cjs/types/index.d.ts +1 -1
  27. package/cjs/types/index.js +1 -1
  28. package/esm/config/contracts.d.ts +32 -3
  29. package/esm/config/contracts.js +3 -3
  30. package/esm/contracts.d.ts +1 -1
  31. package/esm/contracts.js +1 -1
  32. package/esm/eulerV2/index.d.ts +41 -0
  33. package/esm/eulerV2/index.js +206 -0
  34. package/esm/helpers/eulerHelpers/index.d.ts +27 -0
  35. package/esm/helpers/eulerHelpers/index.js +219 -0
  36. package/esm/helpers/index.d.ts +1 -1
  37. package/esm/helpers/index.js +1 -1
  38. package/esm/index.d.ts +2 -2
  39. package/esm/index.js +2 -2
  40. package/esm/markets/euler/index.d.ts +8 -0
  41. package/esm/markets/euler/index.js +24 -0
  42. package/esm/markets/index.d.ts +1 -1
  43. package/esm/markets/index.js +1 -1
  44. package/esm/services/utils.d.ts +2 -0
  45. package/esm/services/utils.js +2 -0
  46. package/esm/types/contracts/generated/EulerV2View.d.ts +345 -0
  47. package/esm/types/contracts/generated/index.d.ts +1 -1
  48. package/esm/types/euler.d.ts +147 -0
  49. package/esm/types/euler.js +11 -0
  50. package/esm/types/index.d.ts +1 -1
  51. package/esm/types/index.js +1 -1
  52. package/package.json +49 -49
  53. package/src/aaveV2/index.ts +227 -227
  54. package/src/aaveV3/index.ts +590 -590
  55. package/src/assets/index.ts +60 -60
  56. package/src/chickenBonds/index.ts +123 -123
  57. package/src/compoundV2/index.ts +219 -219
  58. package/src/compoundV3/index.ts +281 -281
  59. package/src/config/contracts.js +1040 -1040
  60. package/src/constants/index.ts +6 -6
  61. package/src/contracts.ts +130 -130
  62. package/src/curveUsd/index.ts +229 -229
  63. package/src/eulerV2/index.ts +297 -0
  64. package/src/exchange/index.ts +17 -17
  65. package/src/helpers/aaveHelpers/index.ts +194 -194
  66. package/src/helpers/chickenBondsHelpers/index.ts +23 -23
  67. package/src/helpers/compoundHelpers/index.ts +246 -246
  68. package/src/helpers/curveUsdHelpers/index.ts +40 -40
  69. package/src/helpers/eulerHelpers/index.ts +231 -0
  70. package/src/helpers/index.ts +9 -9
  71. package/src/helpers/llamaLendHelpers/index.ts +53 -53
  72. package/src/helpers/makerHelpers/index.ts +94 -94
  73. package/src/helpers/morphoBlueHelpers/index.ts +115 -115
  74. package/src/helpers/sparkHelpers/index.ts +150 -150
  75. package/src/index.ts +48 -48
  76. package/src/liquity/index.ts +116 -116
  77. package/src/llamaLend/index.ts +275 -275
  78. package/src/maker/index.ts +117 -117
  79. package/src/markets/aave/index.ts +152 -152
  80. package/src/markets/aave/marketAssets.ts +46 -46
  81. package/src/markets/compound/index.ts +173 -173
  82. package/src/markets/compound/marketsAssets.ts +64 -64
  83. package/src/markets/curveUsd/index.ts +69 -69
  84. package/src/markets/euler/index.ts +27 -0
  85. package/src/markets/index.ts +24 -23
  86. package/src/markets/llamaLend/contractAddresses.ts +141 -141
  87. package/src/markets/llamaLend/index.ts +235 -235
  88. package/src/markets/morphoBlue/index.ts +728 -728
  89. package/src/markets/spark/index.ts +29 -29
  90. package/src/markets/spark/marketAssets.ts +10 -10
  91. package/src/moneymarket/moneymarketCommonService.ts +80 -80
  92. package/src/morphoAaveV2/index.ts +256 -256
  93. package/src/morphoAaveV3/index.ts +630 -630
  94. package/src/morphoBlue/index.ts +171 -171
  95. package/src/multicall/index.ts +22 -22
  96. package/src/services/dsrService.ts +15 -15
  97. package/src/services/priceService.ts +21 -21
  98. package/src/services/utils.ts +57 -54
  99. package/src/setup.ts +8 -8
  100. package/src/spark/index.ts +424 -424
  101. package/src/staking/staking.ts +218 -218
  102. package/src/types/aave.ts +262 -262
  103. package/src/types/chickenBonds.ts +45 -45
  104. package/src/types/common.ts +84 -84
  105. package/src/types/compound.ts +129 -129
  106. package/src/types/contracts/generated/EulerV2View.ts +446 -0
  107. package/src/types/contracts/generated/index.ts +1 -1
  108. package/src/types/curveUsd.ts +118 -118
  109. package/src/types/euler.ts +170 -0
  110. package/src/types/index.ts +10 -10
  111. package/src/types/liquity.ts +30 -30
  112. package/src/types/llamaLend.ts +155 -155
  113. package/src/types/maker.ts +50 -50
  114. package/src/types/morphoBlue.ts +146 -146
  115. package/src/types/spark.ts +127 -127
  116. package/cjs/helpers/liquityV2Helpers/index.d.ts +0 -12
  117. package/cjs/helpers/liquityV2Helpers/index.js +0 -61
  118. package/cjs/liquityV2/index.d.ts +0 -10
  119. package/cjs/liquityV2/index.js +0 -98
  120. package/cjs/markets/liquityV2/index.d.ts +0 -8
  121. package/cjs/markets/liquityV2/index.js +0 -34
  122. package/cjs/types/contracts/generated/LiquityV2View.d.ts +0 -222
  123. package/cjs/types/liquityV2.d.ts +0 -81
  124. package/cjs/types/liquityV2.js +0 -8
  125. package/esm/helpers/liquityV2Helpers/index.d.ts +0 -12
  126. package/esm/helpers/liquityV2Helpers/index.js +0 -53
  127. package/esm/liquityV2/index.d.ts +0 -10
  128. package/esm/liquityV2/index.js +0 -90
  129. package/esm/markets/liquityV2/index.d.ts +0 -8
  130. package/esm/markets/liquityV2/index.js +0 -28
  131. package/esm/types/contracts/generated/LiquityV2View.d.ts +0 -222
  132. package/esm/types/liquityV2.d.ts +0 -81
  133. package/esm/types/liquityV2.js +0 -5
  134. package/src/helpers/liquityV2Helpers/index.ts +0 -78
  135. package/src/liquityV2/index.ts +0 -115
  136. package/src/markets/liquityV2/index.ts +0 -31
  137. package/src/types/contracts/generated/LiquityV2View.ts +0 -280
  138. package/src/types/liquityV2.ts +0 -87
  139. /package/cjs/types/contracts/generated/{LiquityV2View.js → EulerV2View.js} +0 -0
  140. /package/esm/types/contracts/generated/{LiquityV2View.js → EulerV2View.js} +0 -0
@@ -1,116 +1,116 @@
1
- import Dec from 'decimal.js';
2
- import { assetAmountInWei } from '@defisaver/tokens';
3
- import Web3 from 'web3';
4
- import { calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos } from '../../moneymarket';
5
- import { calculateNetApy } from '../../staking';
6
- import { MMUsedAssets, NetworkNumber } from '../../types/common';
7
- import {
8
- MorphoBlueAggregatedPositionData, MorphoBlueAssetsData, MorphoBlueMarketData, MorphoBlueMarketInfo,
9
- } from '../../types';
10
- import { borrowOperations, SECONDS_PER_YEAR, WAD } from '../../constants';
11
- import { MorphoBlueViewContract } from '../../contracts';
12
- import { MarketParamsStruct } from '../../types/contracts/generated/MorphoBlueView';
13
-
14
- export const getMorphoBlueAggregatedPositionData = ({ usedAssets, assetsData, marketInfo }: { usedAssets: MMUsedAssets, assetsData: MorphoBlueAssetsData, marketInfo: MorphoBlueMarketInfo }): MorphoBlueAggregatedPositionData => {
15
- const payload = {} as MorphoBlueAggregatedPositionData;
16
- payload.suppliedUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
17
- payload.suppliedCollateralUsd = getAssetsTotal(usedAssets, ({ isSupplied, collateral }: { isSupplied: boolean, collateral: string }) => isSupplied && collateral, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
18
- payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
19
-
20
- const {
21
- lltv, oracle, collateralToken, loanToken,
22
- } = marketInfo;
23
-
24
- payload.borrowLimitUsd = getAssetsTotal(
25
- usedAssets,
26
- ({ isSupplied, collateral }: { isSupplied: boolean, collateral: string }) => isSupplied && collateral,
27
- ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => {
28
- const suppliedUsdAmount = suppliedUsd;
29
-
30
- return new Dec(suppliedUsdAmount).mul(lltv);
31
- },
32
- );
33
- payload.liquidationLimitUsd = payload.borrowLimitUsd;
34
- const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
35
- payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
36
-
37
- payload.leftToBorrow = new Dec(usedAssets[collateralToken]?.supplied || 0).mul(oracle).mul(lltv).sub(usedAssets[loanToken]?.borrowed || 0)
38
- .toString();
39
-
40
- const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy(usedAssets, assetsData as any);
41
- payload.netApy = netApy;
42
- payload.incentiveUsd = incentiveUsd;
43
- payload.totalInterestUsd = totalInterestUsd;
44
-
45
- payload.ltv = new Dec(payload.borrowedUsd).div(payload.suppliedCollateralUsd).toString();
46
- payload.ltv = new Dec(usedAssets[loanToken]?.borrowed || 0).div(oracle).div(usedAssets[collateralToken]?.supplied || 1).toString(); // default to 1 because can't div 0
47
- payload.ratio = new Dec(usedAssets[collateralToken]?.supplied || 0).mul(oracle).div(usedAssets[loanToken]?.borrowed || 1).mul(100)
48
- .toString();
49
-
50
- const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
51
- payload.leveragedType = leveragedType;
52
- if (leveragedType !== '') {
53
- payload.leveragedAsset = leveragedAsset;
54
- let assetPrice = assetsData[leveragedAsset].price;
55
- if (leveragedType === 'lsd-leverage') {
56
- // Treat ETH like a stablecoin in a long stETH position
57
- payload.leveragedLsdAssetRatio = new Dec(assetsData[leveragedAsset].price).div(assetsData.ETH.price).toDP(18).toString();
58
- assetPrice = new Dec(assetPrice).div(assetsData.ETH.price).toString();
59
- }
60
- payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
61
- }
62
-
63
- return payload;
64
- };
65
-
66
- const compound = (ratePerSeconds: string) => {
67
- const compounding = new Dec(ratePerSeconds).mul(SECONDS_PER_YEAR).toString();
68
- const apyNumber = Math.expm1(new Dec(compounding).div(WAD).toNumber());
69
- return new Dec(apyNumber).mul(WAD).floor().toString();
70
- };
71
-
72
- export const getSupplyRate = (totalSupplyAssets: string, totalBorrowAssets: string, borrowRate: string, fee: string) => {
73
- if (totalBorrowAssets === '0' || totalSupplyAssets === '0') {
74
- return '0';
75
- }
76
- const utillization = new Dec(totalBorrowAssets).mul(WAD).div(totalSupplyAssets).ceil()
77
- .toString();
78
- const supplyRate = new Dec(utillization).mul(borrowRate).div(WAD).ceil()
79
- .toString();
80
- const ratePerSecond = new Dec(supplyRate).mul(new Dec(WAD).minus(fee)).div(WAD).ceil()
81
- .toString();
82
- return new Dec(compound(ratePerSecond)).div(1e18).mul(100).toString();
83
- };
84
-
85
- export const getBorrowRate = (borrowRate: string, totalBorrowShares: string) => {
86
- if (totalBorrowShares === '0') {
87
- return '0';
88
- }
89
- return new Dec(compound(borrowRate)).div(1e18).mul(100).toString();
90
- };
91
-
92
- export const getApyAfterValuesEstimation = async (selectedMarket: MorphoBlueMarketData, action: string, amount: string, asset: string, web3: Web3, network: NetworkNumber) => {
93
- const morphoBlueViewContract = MorphoBlueViewContract(web3, network);
94
- const lltvInWei = assetAmountInWei(selectedMarket.lltv, 'ETH');
95
- const marketData: MarketParamsStruct = [selectedMarket.loanToken, selectedMarket.collateralToken, selectedMarket.oracle, selectedMarket.irm, lltvInWei];
96
- const isBorrowOperation = borrowOperations.includes(action);
97
- const amountInWei = assetAmountInWei(amount, asset);
98
- let liquidityAdded;
99
- let liquidityRemoved;
100
- if (isBorrowOperation) {
101
- liquidityAdded = action === 'payback' ? amountInWei : '0';
102
- liquidityRemoved = action === 'borrow' ? amountInWei : '0';
103
- } else {
104
- liquidityAdded = action === 'collateral' ? amountInWei : '0';
105
- liquidityRemoved = action === 'withdraw' ? amountInWei : '0';
106
- }
107
- const data = await morphoBlueViewContract.methods.getApyAfterValuesEstimation([
108
- marketData,
109
- isBorrowOperation,
110
- liquidityAdded,
111
- liquidityRemoved,
112
- ]).call();
113
- const borrowRate = getBorrowRate(data.borrowRate, data.market.totalBorrowShares);
114
- const supplyRate = getSupplyRate(data.market.totalSupplyAssets, data.market.totalBorrowAssets, data.borrowRate, data.market.fee);
115
- return { borrowRate, supplyRate };
1
+ import Dec from 'decimal.js';
2
+ import { assetAmountInWei } from '@defisaver/tokens';
3
+ import Web3 from 'web3';
4
+ import { calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos } from '../../moneymarket';
5
+ import { calculateNetApy } from '../../staking';
6
+ import { MMUsedAssets, NetworkNumber } from '../../types/common';
7
+ import {
8
+ MorphoBlueAggregatedPositionData, MorphoBlueAssetsData, MorphoBlueMarketData, MorphoBlueMarketInfo,
9
+ } from '../../types';
10
+ import { borrowOperations, SECONDS_PER_YEAR, WAD } from '../../constants';
11
+ import { MorphoBlueViewContract } from '../../contracts';
12
+ import { MarketParamsStruct } from '../../types/contracts/generated/MorphoBlueView';
13
+
14
+ export const getMorphoBlueAggregatedPositionData = ({ usedAssets, assetsData, marketInfo }: { usedAssets: MMUsedAssets, assetsData: MorphoBlueAssetsData, marketInfo: MorphoBlueMarketInfo }): MorphoBlueAggregatedPositionData => {
15
+ const payload = {} as MorphoBlueAggregatedPositionData;
16
+ payload.suppliedUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
17
+ payload.suppliedCollateralUsd = getAssetsTotal(usedAssets, ({ isSupplied, collateral }: { isSupplied: boolean, collateral: string }) => isSupplied && collateral, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
18
+ payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
19
+
20
+ const {
21
+ lltv, oracle, collateralToken, loanToken,
22
+ } = marketInfo;
23
+
24
+ payload.borrowLimitUsd = getAssetsTotal(
25
+ usedAssets,
26
+ ({ isSupplied, collateral }: { isSupplied: boolean, collateral: string }) => isSupplied && collateral,
27
+ ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => {
28
+ const suppliedUsdAmount = suppliedUsd;
29
+
30
+ return new Dec(suppliedUsdAmount).mul(lltv);
31
+ },
32
+ );
33
+ payload.liquidationLimitUsd = payload.borrowLimitUsd;
34
+ const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
35
+ payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
36
+
37
+ payload.leftToBorrow = new Dec(usedAssets[collateralToken]?.supplied || 0).mul(oracle).mul(lltv).sub(usedAssets[loanToken]?.borrowed || 0)
38
+ .toString();
39
+
40
+ const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy(usedAssets, assetsData as any);
41
+ payload.netApy = netApy;
42
+ payload.incentiveUsd = incentiveUsd;
43
+ payload.totalInterestUsd = totalInterestUsd;
44
+
45
+ payload.ltv = new Dec(payload.borrowedUsd).div(payload.suppliedCollateralUsd).toString();
46
+ payload.ltv = new Dec(usedAssets[loanToken]?.borrowed || 0).div(oracle).div(usedAssets[collateralToken]?.supplied || 1).toString(); // default to 1 because can't div 0
47
+ payload.ratio = new Dec(usedAssets[collateralToken]?.supplied || 0).mul(oracle).div(usedAssets[loanToken]?.borrowed || 1).mul(100)
48
+ .toString();
49
+
50
+ const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
51
+ payload.leveragedType = leveragedType;
52
+ if (leveragedType !== '') {
53
+ payload.leveragedAsset = leveragedAsset;
54
+ let assetPrice = assetsData[leveragedAsset].price;
55
+ if (leveragedType === 'lsd-leverage') {
56
+ // Treat ETH like a stablecoin in a long stETH position
57
+ payload.leveragedLsdAssetRatio = new Dec(assetsData[leveragedAsset].price).div(assetsData.ETH.price).toDP(18).toString();
58
+ assetPrice = new Dec(assetPrice).div(assetsData.ETH.price).toString();
59
+ }
60
+ payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
61
+ }
62
+
63
+ return payload;
64
+ };
65
+
66
+ const compound = (ratePerSeconds: string) => {
67
+ const compounding = new Dec(ratePerSeconds).mul(SECONDS_PER_YEAR).toString();
68
+ const apyNumber = Math.expm1(new Dec(compounding).div(WAD).toNumber());
69
+ return new Dec(apyNumber).mul(WAD).floor().toString();
70
+ };
71
+
72
+ export const getSupplyRate = (totalSupplyAssets: string, totalBorrowAssets: string, borrowRate: string, fee: string) => {
73
+ if (totalBorrowAssets === '0' || totalSupplyAssets === '0') {
74
+ return '0';
75
+ }
76
+ const utillization = new Dec(totalBorrowAssets).mul(WAD).div(totalSupplyAssets).ceil()
77
+ .toString();
78
+ const supplyRate = new Dec(utillization).mul(borrowRate).div(WAD).ceil()
79
+ .toString();
80
+ const ratePerSecond = new Dec(supplyRate).mul(new Dec(WAD).minus(fee)).div(WAD).ceil()
81
+ .toString();
82
+ return new Dec(compound(ratePerSecond)).div(1e18).mul(100).toString();
83
+ };
84
+
85
+ export const getBorrowRate = (borrowRate: string, totalBorrowShares: string) => {
86
+ if (totalBorrowShares === '0') {
87
+ return '0';
88
+ }
89
+ return new Dec(compound(borrowRate)).div(1e18).mul(100).toString();
90
+ };
91
+
92
+ export const getApyAfterValuesEstimation = async (selectedMarket: MorphoBlueMarketData, action: string, amount: string, asset: string, web3: Web3, network: NetworkNumber) => {
93
+ const morphoBlueViewContract = MorphoBlueViewContract(web3, network);
94
+ const lltvInWei = assetAmountInWei(selectedMarket.lltv, 'ETH');
95
+ const marketData: MarketParamsStruct = [selectedMarket.loanToken, selectedMarket.collateralToken, selectedMarket.oracle, selectedMarket.irm, lltvInWei];
96
+ const isBorrowOperation = borrowOperations.includes(action);
97
+ const amountInWei = assetAmountInWei(amount, asset);
98
+ let liquidityAdded;
99
+ let liquidityRemoved;
100
+ if (isBorrowOperation) {
101
+ liquidityAdded = action === 'payback' ? amountInWei : '0';
102
+ liquidityRemoved = action === 'borrow' ? amountInWei : '0';
103
+ } else {
104
+ liquidityAdded = action === 'collateral' ? amountInWei : '0';
105
+ liquidityRemoved = action === 'withdraw' ? amountInWei : '0';
106
+ }
107
+ const data = await morphoBlueViewContract.methods.getApyAfterValuesEstimation([
108
+ marketData,
109
+ isBorrowOperation,
110
+ liquidityAdded,
111
+ liquidityRemoved,
112
+ ]).call();
113
+ const borrowRate = getBorrowRate(data.borrowRate, data.market.totalBorrowShares);
114
+ const supplyRate = getSupplyRate(data.market.totalSupplyAssets, data.market.totalBorrowAssets, data.borrowRate, data.market.fee);
115
+ return { borrowRate, supplyRate };
116
116
  };
@@ -1,151 +1,151 @@
1
- import Dec from 'decimal.js';
2
- import Web3 from 'web3';
3
- import { assetAmountInWei, getAssetInfo, getAssetInfoByAddress } from '@defisaver/tokens';
4
- import {
5
- aprToApy, calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos,
6
- } from '../../moneymarket';
7
- import {
8
- SparkAggregatedPositionData,
9
- SparkAssetsData, SparkHelperCommon, SparkMarketData, SparkUsedAssets,
10
- } from '../../types';
11
- import { calculateNetApy } from '../../staking';
12
- import { ethToWeth, wethToEth } from '../../services/utils';
13
- import { SparkViewContract } from '../../contracts';
14
- import { NetworkNumber } from '../../types/common';
15
- import { borrowOperations } from '../../constants';
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,
49
- _asset: string) => {
50
- const asset = wethToEth(_asset);
51
-
52
- const assetData = assetsData[asset];
53
- if (
54
- eModeCategory === 0
55
- || assetData.eModeCategory !== eModeCategory
56
- || new Dec(assetData?.eModeCategoryData?.collateralFactor || 0).eq(0)
57
- ) {
58
- const { liquidationRatio, collateralFactor } = assetData;
59
- return ({ liquidationRatio, collateralFactor });
60
- }
61
- const { liquidationRatio, collateralFactor } = assetData.eModeCategoryData;
62
- return ({ liquidationRatio, collateralFactor });
63
- };
64
-
65
- export const sparkGetAggregatedPositionData = ({
66
- usedAssets,
67
- eModeCategory,
68
- eModeCategories,
69
- assetsData,
70
- selectedMarket,
71
- network,
72
- ...rest
73
- }: SparkHelperCommon): SparkAggregatedPositionData => {
74
- const data = {
75
- usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest,
76
- };
77
- const payload = {} as SparkAggregatedPositionData;
78
- payload.suppliedUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
79
- payload.suppliedCollateralUsd = getAssetsTotal(usedAssets, ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
80
- payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
81
- payload.borrowLimitUsd = getAssetsTotal(
82
- usedAssets,
83
- ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral,
84
- ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(sparkGetEmodeMutableProps(data, symbol).collateralFactor),
85
- );
86
- payload.liquidationLimitUsd = getAssetsTotal(
87
- usedAssets,
88
- ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral,
89
- ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(sparkGetEmodeMutableProps(data, symbol).liquidationRatio),
90
- );
91
- const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
92
- payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
93
- payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
94
- payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
95
- const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy(usedAssets, assetsData);
96
- payload.netApy = netApy;
97
- payload.incentiveUsd = incentiveUsd;
98
- payload.totalInterestUsd = totalInterestUsd;
99
- payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
100
- payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
101
- const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
102
- payload.leveragedType = leveragedType;
103
- if (leveragedType !== '') {
104
- payload.leveragedAsset = leveragedAsset;
105
- let assetPrice = data.assetsData[leveragedAsset].price; // TODO sparkPrice or price??
106
- if (leveragedType === 'lsd-leverage') {
107
- // Treat ETH like a stablecoin in a long stETH position
108
- payload.leveragedLsdAssetRatio = new Dec(assetsData[leveragedAsset].price).div(assetsData.ETH.price).toDP(18).toString();
109
- assetPrice = new Dec(assetPrice).div(assetsData.ETH.price).toString();
110
- }
111
- payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
112
- }
113
- return payload;
114
- };
115
-
116
- export const getApyAfterValuesEstimation = async (selectedMarket: SparkMarketData, actions: [{ action: string, amount: string, asset: string }], web3: Web3) => {
117
- const sparkViewContract = SparkViewContract(web3, NetworkNumber.Eth);
118
- const params = actions.map(({ action, asset, amount }: { action: string, amount: string, asset: string }) => {
119
- const isDebtAsset = borrowOperations.includes(action);
120
- const amountInWei = assetAmountInWei(amount, asset);
121
- const assetInfo = getAssetInfo(ethToWeth(asset));
122
- let liquidityAdded;
123
- let liquidityTaken;
124
- if (isDebtAsset) {
125
- liquidityAdded = action === 'payback' ? amountInWei : '0';
126
- liquidityTaken = action === 'borrow' ? amountInWei : '0';
127
- } else {
128
- liquidityAdded = action === 'collateral' ? amountInWei : '0';
129
- liquidityTaken = action === 'withdraw' ? amountInWei : '0';
130
- }
131
- return {
132
- reserveAddress: assetInfo.address,
133
- liquidityAdded,
134
- liquidityTaken,
135
- isDebtAsset,
136
- };
137
- });
138
- const data = await sparkViewContract.methods.getApyAfterValuesEstimation(
139
- selectedMarket.providerAddress,
140
- params,
141
- ).call();
142
- const rates: { [key: string]: { supplyRate: string, borrowRate: string } } = {};
143
- data.forEach((d) => {
144
- const asset = wethToEth(getAssetInfoByAddress(d.reserveAddress).symbol);
145
- rates[asset] = {
146
- supplyRate: aprToApy(new Dec(d.supplyRate.toString()).div(1e25).toString()),
147
- borrowRate: aprToApy(new Dec(d.variableBorrowRate.toString()).div(1e25).toString()),
148
- };
149
- });
150
- return rates;
1
+ import Dec from 'decimal.js';
2
+ import Web3 from 'web3';
3
+ import { assetAmountInWei, getAssetInfo, getAssetInfoByAddress } from '@defisaver/tokens';
4
+ import {
5
+ aprToApy, calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos,
6
+ } from '../../moneymarket';
7
+ import {
8
+ SparkAggregatedPositionData,
9
+ SparkAssetsData, SparkHelperCommon, SparkMarketData, SparkUsedAssets,
10
+ } from '../../types';
11
+ import { calculateNetApy } from '../../staking';
12
+ import { ethToWeth, wethToEth } from '../../services/utils';
13
+ import { SparkViewContract } from '../../contracts';
14
+ import { NetworkNumber } from '../../types/common';
15
+ import { borrowOperations } from '../../constants';
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,
49
+ _asset: string) => {
50
+ const asset = wethToEth(_asset);
51
+
52
+ const assetData = assetsData[asset];
53
+ if (
54
+ eModeCategory === 0
55
+ || assetData.eModeCategory !== eModeCategory
56
+ || new Dec(assetData?.eModeCategoryData?.collateralFactor || 0).eq(0)
57
+ ) {
58
+ const { liquidationRatio, collateralFactor } = assetData;
59
+ return ({ liquidationRatio, collateralFactor });
60
+ }
61
+ const { liquidationRatio, collateralFactor } = assetData.eModeCategoryData;
62
+ return ({ liquidationRatio, collateralFactor });
63
+ };
64
+
65
+ export const sparkGetAggregatedPositionData = ({
66
+ usedAssets,
67
+ eModeCategory,
68
+ eModeCategories,
69
+ assetsData,
70
+ selectedMarket,
71
+ network,
72
+ ...rest
73
+ }: SparkHelperCommon): SparkAggregatedPositionData => {
74
+ const data = {
75
+ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest,
76
+ };
77
+ const payload = {} as SparkAggregatedPositionData;
78
+ payload.suppliedUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
79
+ payload.suppliedCollateralUsd = getAssetsTotal(usedAssets, ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
80
+ payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
81
+ payload.borrowLimitUsd = getAssetsTotal(
82
+ usedAssets,
83
+ ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral,
84
+ ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(sparkGetEmodeMutableProps(data, symbol).collateralFactor),
85
+ );
86
+ payload.liquidationLimitUsd = getAssetsTotal(
87
+ usedAssets,
88
+ ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral,
89
+ ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(sparkGetEmodeMutableProps(data, symbol).liquidationRatio),
90
+ );
91
+ const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
92
+ payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
93
+ payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
94
+ payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
95
+ const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy(usedAssets, assetsData);
96
+ payload.netApy = netApy;
97
+ payload.incentiveUsd = incentiveUsd;
98
+ payload.totalInterestUsd = totalInterestUsd;
99
+ payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
100
+ payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
101
+ const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
102
+ payload.leveragedType = leveragedType;
103
+ if (leveragedType !== '') {
104
+ payload.leveragedAsset = leveragedAsset;
105
+ let assetPrice = data.assetsData[leveragedAsset].price; // TODO sparkPrice or price??
106
+ if (leveragedType === 'lsd-leverage') {
107
+ // Treat ETH like a stablecoin in a long stETH position
108
+ payload.leveragedLsdAssetRatio = new Dec(assetsData[leveragedAsset].price).div(assetsData.ETH.price).toDP(18).toString();
109
+ assetPrice = new Dec(assetPrice).div(assetsData.ETH.price).toString();
110
+ }
111
+ payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
112
+ }
113
+ return payload;
114
+ };
115
+
116
+ export const getApyAfterValuesEstimation = async (selectedMarket: SparkMarketData, actions: [{ action: string, amount: string, asset: string }], web3: Web3) => {
117
+ const sparkViewContract = SparkViewContract(web3, NetworkNumber.Eth);
118
+ const params = actions.map(({ action, asset, amount }: { action: string, amount: string, asset: string }) => {
119
+ const isDebtAsset = borrowOperations.includes(action);
120
+ const amountInWei = assetAmountInWei(amount, asset);
121
+ const assetInfo = getAssetInfo(ethToWeth(asset));
122
+ let liquidityAdded;
123
+ let liquidityTaken;
124
+ if (isDebtAsset) {
125
+ liquidityAdded = action === 'payback' ? amountInWei : '0';
126
+ liquidityTaken = action === 'borrow' ? amountInWei : '0';
127
+ } else {
128
+ liquidityAdded = action === 'collateral' ? amountInWei : '0';
129
+ liquidityTaken = action === 'withdraw' ? amountInWei : '0';
130
+ }
131
+ return {
132
+ reserveAddress: assetInfo.address,
133
+ liquidityAdded,
134
+ liquidityTaken,
135
+ isDebtAsset,
136
+ };
137
+ });
138
+ const data = await sparkViewContract.methods.getApyAfterValuesEstimation(
139
+ selectedMarket.providerAddress,
140
+ params,
141
+ ).call();
142
+ const rates: { [key: string]: { supplyRate: string, borrowRate: string } } = {};
143
+ data.forEach((d) => {
144
+ const asset = wethToEth(getAssetInfoByAddress(d.reserveAddress).symbol);
145
+ rates[asset] = {
146
+ supplyRate: aprToApy(new Dec(d.supplyRate.toString()).div(1e25).toString()),
147
+ borrowRate: aprToApy(new Dec(d.variableBorrowRate.toString()).div(1e25).toString()),
148
+ };
149
+ });
150
+ return rates;
151
151
  };
package/src/index.ts CHANGED
@@ -1,48 +1,48 @@
1
- import './setup';
2
-
3
- import * as aaveV3 from './aaveV3';
4
- import * as morphoAaveV3 from './morphoAaveV3';
5
- import * as aaveV2 from './aaveV2';
6
- import * as morphoAaveV2 from './morphoAaveV2';
7
- import * as compoundV3 from './compoundV3';
8
- import * as compoundV2 from './compoundV2';
9
- import * as spark from './spark';
10
- import * as curveUsd from './curveUsd';
11
- import * as liquity from './liquity';
12
- import * as liquityV2 from './liquityV2';
13
- import * as maker from './maker';
14
- import * as staking from './staking';
15
- import * as multicall from './multicall';
16
- import * as moneymarket from './moneymarket';
17
- import * as assets from './assets';
18
- import * as markets from './markets';
19
- import * as helpers from './helpers';
20
- import * as chickenBonds from './chickenBonds';
21
- import * as exchange from './exchange';
22
- import * as morphoBlue from './morphoBlue';
23
- import * as llamaLend from './llamaLend';
24
-
25
- export * from './types';
26
-
27
- export {
28
- aaveV2,
29
- aaveV3,
30
- morphoAaveV2,
31
- morphoAaveV3,
32
- compoundV2,
33
- compoundV3,
34
- spark,
35
- curveUsd,
36
- liquity,
37
- liquityV2,
38
- maker,
39
- chickenBonds,
40
- exchange,
41
- staking,
42
- multicall,
43
- moneymarket,
44
- markets,
45
- helpers,
46
- morphoBlue,
47
- llamaLend,
48
- };
1
+ import './setup';
2
+
3
+ import * as aaveV3 from './aaveV3';
4
+ import * as morphoAaveV3 from './morphoAaveV3';
5
+ import * as aaveV2 from './aaveV2';
6
+ import * as morphoAaveV2 from './morphoAaveV2';
7
+ import * as compoundV3 from './compoundV3';
8
+ import * as compoundV2 from './compoundV2';
9
+ import * as spark from './spark';
10
+ import * as curveUsd from './curveUsd';
11
+ import * as liquity from './liquity';
12
+ import * as maker from './maker';
13
+ import * as staking from './staking';
14
+ import * as multicall from './multicall';
15
+ import * as moneymarket from './moneymarket';
16
+ import * as assets from './assets';
17
+ import * as markets from './markets';
18
+ import * as helpers from './helpers';
19
+ import * as chickenBonds from './chickenBonds';
20
+ import * as exchange from './exchange';
21
+ import * as morphoBlue from './morphoBlue';
22
+ import * as llamaLend from './llamaLend';
23
+ import * as eulerV2 from './eulerV2';
24
+
25
+ export * from './types';
26
+
27
+ export {
28
+ aaveV2,
29
+ aaveV3,
30
+ morphoAaveV2,
31
+ morphoAaveV3,
32
+ compoundV2,
33
+ compoundV3,
34
+ spark,
35
+ curveUsd,
36
+ liquity,
37
+ maker,
38
+ chickenBonds,
39
+ exchange,
40
+ staking,
41
+ multicall,
42
+ moneymarket,
43
+ markets,
44
+ helpers,
45
+ morphoBlue,
46
+ llamaLend,
47
+ eulerV2,
48
+ };