@defisaver/positions-sdk 1.0.10 → 1.0.11-fluid-dev

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 (111) 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 +113 -49
  5. package/cjs/config/contracts.js +10 -2
  6. package/cjs/contracts.d.ts +1 -0
  7. package/cjs/contracts.js +2 -1
  8. package/cjs/fluid/index.d.ts +2 -0
  9. package/cjs/fluid/index.js +636 -13
  10. package/cjs/helpers/fluidHelpers/index.d.ts +59 -2
  11. package/cjs/helpers/fluidHelpers/index.js +142 -4
  12. package/cjs/helpers/morphoBlueHelpers/index.js +66 -66
  13. package/cjs/markets/aave/marketAssets.js +3 -1
  14. package/cjs/markets/fluid/index.js +276 -245
  15. package/cjs/services/priceService.d.ts +23 -0
  16. package/cjs/services/priceService.js +44 -5
  17. package/cjs/types/contracts/generated/FluidView.d.ts +220 -3
  18. package/cjs/types/contracts/generated/WeETHPriceFeed.d.ts +135 -0
  19. package/cjs/types/contracts/generated/WeETHPriceFeed.js +5 -0
  20. package/cjs/types/contracts/generated/index.d.ts +1 -0
  21. package/cjs/types/fluid.d.ts +39 -10
  22. package/esm/config/contracts.d.ts +113 -49
  23. package/esm/config/contracts.js +10 -2
  24. package/esm/contracts.d.ts +1 -0
  25. package/esm/contracts.js +1 -0
  26. package/esm/fluid/index.d.ts +2 -0
  27. package/esm/fluid/index.js +639 -16
  28. package/esm/helpers/fluidHelpers/index.d.ts +59 -2
  29. package/esm/helpers/fluidHelpers/index.js +137 -3
  30. package/esm/helpers/morphoBlueHelpers/index.js +66 -66
  31. package/esm/markets/aave/marketAssets.js +3 -1
  32. package/esm/markets/fluid/index.js +276 -245
  33. package/esm/services/priceService.d.ts +23 -0
  34. package/esm/services/priceService.js +40 -5
  35. package/esm/types/contracts/generated/FluidView.d.ts +220 -3
  36. package/esm/types/contracts/generated/WeETHPriceFeed.d.ts +135 -0
  37. package/esm/types/contracts/generated/WeETHPriceFeed.js +4 -0
  38. package/esm/types/contracts/generated/index.d.ts +1 -0
  39. package/esm/types/fluid.d.ts +39 -10
  40. package/package.json +54 -54
  41. package/src/aaveV2/index.ts +227 -227
  42. package/src/aaveV3/index.ts +624 -624
  43. package/src/assets/index.ts +60 -60
  44. package/src/chickenBonds/index.ts +123 -123
  45. package/src/compoundV2/index.ts +220 -220
  46. package/src/compoundV3/index.ts +291 -291
  47. package/src/config/contracts.js +1155 -1147
  48. package/src/constants/index.ts +6 -6
  49. package/src/contracts.ts +135 -134
  50. package/src/curveUsd/index.ts +239 -239
  51. package/src/eulerV2/index.ts +303 -303
  52. package/src/exchange/index.ts +17 -17
  53. package/src/fluid/index.ts +1216 -354
  54. package/src/helpers/aaveHelpers/index.ts +203 -203
  55. package/src/helpers/chickenBondsHelpers/index.ts +23 -23
  56. package/src/helpers/compoundHelpers/index.ts +248 -248
  57. package/src/helpers/curveUsdHelpers/index.ts +40 -40
  58. package/src/helpers/eulerHelpers/index.ts +234 -234
  59. package/src/helpers/fluidHelpers/index.ts +295 -57
  60. package/src/helpers/index.ts +11 -11
  61. package/src/helpers/liquityV2Helpers/index.ts +80 -80
  62. package/src/helpers/llamaLendHelpers/index.ts +53 -53
  63. package/src/helpers/makerHelpers/index.ts +94 -94
  64. package/src/helpers/morphoBlueHelpers/index.ts +367 -367
  65. package/src/helpers/sparkHelpers/index.ts +154 -154
  66. package/src/index.ts +52 -52
  67. package/src/liquity/index.ts +116 -116
  68. package/src/liquityV2/index.ts +295 -295
  69. package/src/llamaLend/index.ts +275 -275
  70. package/src/maker/index.ts +117 -117
  71. package/src/markets/aave/index.ts +152 -152
  72. package/src/markets/aave/marketAssets.ts +46 -44
  73. package/src/markets/compound/index.ts +213 -213
  74. package/src/markets/compound/marketsAssets.ts +82 -82
  75. package/src/markets/curveUsd/index.ts +69 -69
  76. package/src/markets/euler/index.ts +26 -26
  77. package/src/markets/fluid/index.ts +2043 -2012
  78. package/src/markets/index.ts +27 -27
  79. package/src/markets/liquityV2/index.ts +54 -54
  80. package/src/markets/llamaLend/contractAddresses.ts +141 -141
  81. package/src/markets/llamaLend/index.ts +235 -235
  82. package/src/markets/morphoBlue/index.ts +895 -895
  83. package/src/markets/spark/index.ts +29 -29
  84. package/src/markets/spark/marketAssets.ts +10 -10
  85. package/src/moneymarket/moneymarketCommonService.ts +80 -80
  86. package/src/morphoAaveV2/index.ts +256 -256
  87. package/src/morphoAaveV3/index.ts +630 -630
  88. package/src/morphoBlue/index.ts +202 -202
  89. package/src/multicall/index.ts +33 -33
  90. package/src/services/priceService.ts +130 -91
  91. package/src/services/utils.ts +59 -59
  92. package/src/setup.ts +8 -8
  93. package/src/spark/index.ts +460 -460
  94. package/src/staking/staking.ts +217 -217
  95. package/src/types/aave.ts +275 -275
  96. package/src/types/chickenBonds.ts +45 -45
  97. package/src/types/common.ts +84 -84
  98. package/src/types/compound.ts +133 -133
  99. package/src/types/contracts/generated/FluidView.ts +263 -2
  100. package/src/types/contracts/generated/WeETHPriceFeed.ts +202 -0
  101. package/src/types/contracts/generated/index.ts +1 -0
  102. package/src/types/curveUsd.ts +119 -119
  103. package/src/types/euler.ts +173 -173
  104. package/src/types/fluid.ts +299 -268
  105. package/src/types/index.ts +11 -11
  106. package/src/types/liquity.ts +30 -30
  107. package/src/types/liquityV2.ts +119 -119
  108. package/src/types/llamaLend.ts +155 -155
  109. package/src/types/maker.ts +50 -50
  110. package/src/types/morphoBlue.ts +194 -194
  111. package/src/types/spark.ts +135 -135
@@ -1,57 +1,295 @@
1
- import Dec from 'decimal.js';
2
- import {
3
- FluidAggregatedVaultData,
4
- FluidAssetsData,
5
- FluidUsedAssets,
6
- InnerFluidMarketData,
7
- } from '../../types';
8
- import { calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos } from '../../moneymarket';
9
- import { calculateNetApy } from '../../staking';
10
- import { MMAssetsData } from '../../types/common';
11
-
12
- export const getFluidAggregatedData = ({
13
- usedAssets,
14
- assetsData,
15
- marketData,
16
- }: {
17
- usedAssets: FluidUsedAssets,
18
- marketData: InnerFluidMarketData,
19
- assetsData: FluidAssetsData
20
- }): FluidAggregatedVaultData => {
21
- const payload = {} as FluidAggregatedVaultData;
22
- payload.suppliedUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
23
- payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
24
-
25
- const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy({ usedAssets, assetsData: assetsData as unknown as MMAssetsData });
26
- payload.netApy = netApy;
27
- payload.incentiveUsd = incentiveUsd;
28
- payload.totalInterestUsd = totalInterestUsd;
29
- const collFactor = marketData.collFactor;
30
- const liqRatio = marketData.liquidationRatio;
31
-
32
- payload.borrowLimitUsd = new Dec(payload.suppliedUsd).mul(collFactor).toString();
33
- payload.liquidationLimitUsd = new Dec(payload.suppliedUsd).mul(liqRatio).div(100).toString();
34
- const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
35
- payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
36
- payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
37
- payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
38
- payload.minRatio = marketData.minRatio;
39
- const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
40
-
41
- payload.leveragedType = leveragedType;
42
- if (leveragedType !== '') {
43
- payload.leveragedAsset = leveragedAsset;
44
- let assetPrice = assetsData[leveragedAsset].price;
45
- if (leveragedType === 'lsd-leverage') {
46
- // Treat ETH like a stablecoin in a long stETH position
47
- payload.leveragedLsdAssetRatio = new Dec(assetsData[leveragedAsset].price).div(assetsData.ETH.price).toDP(18).toString();
48
- assetPrice = new Dec(assetPrice).div(assetsData.ETH.price).toString();
49
- }
50
- payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
51
- }
52
-
53
- payload.minCollRatio = new Dec(payload.suppliedUsd).div(payload.borrowLimitUsd).mul(100).toString();
54
- payload.collLiquidationRatio = new Dec(payload.suppliedUsd).div(payload.liquidationLimitUsd).mul(100).toString();
55
-
56
- return payload;
57
- };
1
+ import Dec from 'decimal.js';
2
+ import { assetAmountInEth } from '@defisaver/tokens';
3
+ import {
4
+ FluidAggregatedVaultData, FluidAssetData,
5
+ FluidAssetsData, FluidUsedAsset,
6
+ FluidUsedAssets,
7
+ FluidVaultType,
8
+ InnerFluidMarketData,
9
+ } from '../../types';
10
+ import { calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos } from '../../moneymarket';
11
+ import { calculateNetApy } from '../../staking';
12
+ import { MMAssetsData } from '../../types/common';
13
+ import { FluidView } from '../../types/contracts/generated';
14
+ import { getEthAmountForDecimals } from '../../services/utils';
15
+
16
+ export const getFluidAggregatedData = ({
17
+ usedAssets,
18
+ assetsData,
19
+ marketData,
20
+ }: {
21
+ usedAssets: FluidUsedAssets,
22
+ marketData: InnerFluidMarketData,
23
+ assetsData: FluidAssetsData
24
+ },
25
+ supplyShares?: string,
26
+ borrowShares?: string,
27
+ ): FluidAggregatedVaultData => {
28
+ const payload = {} as FluidAggregatedVaultData;
29
+
30
+ payload.suppliedUsd = [FluidVaultType.T1, FluidVaultType.T3].includes(marketData.vaultType)
31
+ ? getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd)
32
+ : new Dec(marketData.collSharePrice!).mul(supplyShares!).toString();
33
+ payload.borrowedUsd = [FluidVaultType.T1, FluidVaultType.T2].includes(marketData.vaultType)
34
+ ? getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd)
35
+ : new Dec(marketData.debtSharePrice!).mul(borrowShares!).toString();
36
+
37
+ const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy({ usedAssets, assetsData: assetsData as unknown as MMAssetsData });
38
+ payload.netApy = netApy;
39
+ payload.incentiveUsd = incentiveUsd;
40
+ payload.totalInterestUsd = totalInterestUsd;
41
+ const collFactor = marketData.collFactor;
42
+ const liqRatio = marketData.liquidationRatio;
43
+
44
+ payload.borrowLimitUsd = new Dec(payload.suppliedUsd).mul(collFactor).toString();
45
+ payload.liquidationLimitUsd = new Dec(payload.suppliedUsd).mul(liqRatio).div(100).toString();
46
+ const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
47
+ payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
48
+ payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
49
+ payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
50
+ payload.minRatio = marketData.minRatio;
51
+ const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
52
+
53
+ payload.leveragedType = leveragedType;
54
+ if (leveragedType !== '') {
55
+ payload.leveragedAsset = leveragedAsset;
56
+ let assetPrice = assetsData[leveragedAsset].price;
57
+ if (leveragedType === 'lsd-leverage') {
58
+ // Treat ETH like a stablecoin in a long stETH position
59
+ payload.leveragedLsdAssetRatio = new Dec(assetsData[leveragedAsset].price).div(assetsData.ETH.price).toDP(18).toString();
60
+ assetPrice = new Dec(assetPrice).div(assetsData.ETH.price).toString();
61
+ }
62
+ payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
63
+ }
64
+
65
+ payload.minCollRatio = new Dec(payload.suppliedUsd).div(payload.borrowLimitUsd).mul(100).toString();
66
+ payload.collLiquidationRatio = new Dec(payload.suppliedUsd).div(payload.liquidationLimitUsd).mul(100).toString();
67
+
68
+ return payload;
69
+ };
70
+
71
+
72
+ interface DexSupplyData {
73
+ maxSupplyShares: string
74
+ supplyDexFee: string
75
+ token0PerSupplyShare: string
76
+ token1PerSupplyShare: string
77
+ withdrawable0: string
78
+ withdrawable1: string
79
+ withdrawableShares: string
80
+ utilizationSupply0: string
81
+ utilizationSupply1: string
82
+ supplyRate0: string
83
+ supplyRate1: string
84
+ totalSupplyShares: string
85
+ withdrawableToken0: string
86
+ withdrawableToken1: string
87
+ totalSupplyToken0: string
88
+ totalSupplyToken1: string
89
+ reservesSupplyToken0: string
90
+ reservesSupplyToken1: string
91
+ }
92
+
93
+ export const parseDexSupplyData = (dexSupplyData: FluidView.DexSupplyDataStructOutput, collAsset0: string, collAsset1: string): DexSupplyData => {
94
+ const {
95
+ dexPool, // address of the dex pool
96
+ dexId, // id of the dex pool
97
+ fee: _fee, // fee of the dex pool TODO videti sa Rajkom
98
+ lastStoredPrice, // last stored price of the dex pool
99
+ centerPrice, // center price of the dex pool
100
+ token0Utilization, // token0 utilization
101
+ token1Utilization, // token1 utilization
102
+ // ONLY FOR SUPPLY
103
+ totalSupplyShares: totalSupplySharesWei, // total supply shares, in 1e18
104
+ maxSupplyShares: maxSupplySharesWei, // max supply shares, in 1e18
105
+ token0Supplied, // token0 supplied, in token0 decimals
106
+ token1Supplied, // token1 supplied, in token1 decimals
107
+ sharesWithdrawable, // shares withdrawable, in 1e18
108
+ token0Withdrawable, // token0 withdrawable, in token0 decimals
109
+ token1Withdrawable, // token1 withdrawable, in token1 decimals
110
+ token0PerSupplyShare: token0PerSupplyShareWei, // token0 amount per 1e18 supply shares
111
+ token1PerSupplyShare: token1PerSupplyShareWei, // token1 amount per 1e18 supply shares
112
+ token0SupplyRate, // token0 supply rate. E.g 320 = 3.2% APR
113
+ token1SupplyRate, // token1 supply rate. E.g 320 = 3.2% APR
114
+ supplyToken0Reserves, // token0 reserves in the dex pool
115
+ supplyToken1Reserves, // token1 reserves in the dex pool
116
+ } = dexSupplyData;
117
+
118
+ const maxSupplyShares = getEthAmountForDecimals(maxSupplySharesWei, 18);
119
+ const fee = new Dec(_fee).div(100).toString();
120
+
121
+ const token0PerSupplyShare = assetAmountInEth(token0PerSupplyShareWei, collAsset0);
122
+ const token1PerSupplyShare = assetAmountInEth(token1PerSupplyShareWei, collAsset1);
123
+
124
+ const withdrawable0 = assetAmountInEth(token0Withdrawable, collAsset0);
125
+ const withdrawable1 = assetAmountInEth(token1Withdrawable, collAsset1);
126
+ const utilizationSupply0 = assetAmountInEth(token0Utilization, collAsset0);
127
+ const utilizationSupply1 = assetAmountInEth(token1Utilization, collAsset1);
128
+
129
+ const supplyRate0 = new Dec(token0SupplyRate).div(100).toString();
130
+ const supplyRate1 = new Dec(token1SupplyRate).div(100).toString();
131
+
132
+ const totalSupplyShares = getEthAmountForDecimals(totalSupplySharesWei, 18); // in shares
133
+
134
+ const withdrawableShares = getEthAmountForDecimals(sharesWithdrawable, 18);
135
+ const withdrawableToken0 = new Dec(withdrawableShares).mul(token0PerSupplyShare).div(1e18).toString();
136
+ const withdrawableToken1 = new Dec(withdrawableShares).mul(token1PerSupplyShare).div(1e18).toString();
137
+
138
+ const totalSupplyToken0 = assetAmountInEth(token0Supplied, collAsset0);
139
+ const totalSupplyToken1 = assetAmountInEth(token1Supplied, collAsset1);
140
+
141
+ const reservesSupplyToken0 = assetAmountInEth(supplyToken0Reserves, collAsset0);
142
+ const reservesSupplyToken1 = assetAmountInEth(supplyToken1Reserves, collAsset1);
143
+
144
+ return {
145
+ maxSupplyShares,
146
+ withdrawableShares,
147
+ supplyDexFee: fee,
148
+ token0PerSupplyShare,
149
+ token1PerSupplyShare,
150
+ withdrawable0,
151
+ withdrawable1,
152
+ utilizationSupply0,
153
+ utilizationSupply1,
154
+ supplyRate0,
155
+ supplyRate1,
156
+ totalSupplyShares,
157
+ withdrawableToken0,
158
+ withdrawableToken1,
159
+ totalSupplyToken0,
160
+ totalSupplyToken1,
161
+ reservesSupplyToken0,
162
+ reservesSupplyToken1,
163
+ };
164
+ };
165
+
166
+ interface DexBorrowData {
167
+ maxBorrowShares: string
168
+ borrowDexFee: string
169
+ token0PerBorrowShare: string
170
+ token1PerBorrowShare: string
171
+ borrowable0: string
172
+ borrowable1: string
173
+ utilizationBorrow0: string
174
+ utilizationBorrow1: string
175
+ borrowRate0: string
176
+ borrowRate1: string
177
+ totalBorrowShares: string
178
+ borrowableToken0: string
179
+ borrowableToken1: string
180
+ totalBorrowToken0: string
181
+ totalBorrowToken1: string
182
+ borrowableShares: string
183
+ quoteTokensPerShare: string
184
+ reservesBorrowToken0: string
185
+ reservesBorrowToken1: string
186
+ }
187
+
188
+ export const parseDexBorrowData = (dexBorrowData: FluidView.DexBorrowDataStructOutput, debtAsset0: string, debtAsset1: string): DexBorrowData => {
189
+ const {
190
+ dexPool,
191
+ dexId,
192
+ fee: _fee,
193
+ lastStoredPrice,
194
+ centerPrice,
195
+ token0Utilization,
196
+ token1Utilization,
197
+ totalBorrowShares: totalBorrowSharesWei,
198
+ maxBorrowShares: maxBorrowSharesWei,
199
+ token0Borrowed,
200
+ token1Borrowed,
201
+ sharesBorrowable,
202
+ token0Borrowable,
203
+ token1Borrowable,
204
+ token0PerBorrowShare: token0PerBorrowShareWei,
205
+ token1PerBorrowShare: token1PerBorrowShareWei,
206
+ token0BorrowRate,
207
+ token1BorrowRate,
208
+ quoteTokensPerShare,
209
+ borrowToken0Reserves,
210
+ borrowToken1Reserves,
211
+ } = dexBorrowData;
212
+
213
+ const maxBorrowShares = getEthAmountForDecimals(maxBorrowSharesWei, 18);
214
+ const fee = new Dec(_fee).div(100).toString();
215
+
216
+ const token0PerBorrowShare = assetAmountInEth(token0PerBorrowShareWei, debtAsset0);
217
+ const token1PerBorrowShare = assetAmountInEth(token1PerBorrowShareWei, debtAsset1);
218
+
219
+ const borrowable0 = assetAmountInEth(token0Borrowable, debtAsset0);
220
+ const borrowable1 = assetAmountInEth(token1Borrowable, debtAsset1);
221
+ const utilizationBorrow0 = assetAmountInEth(token0Utilization, debtAsset0);
222
+ const utilizationBorrow1 = assetAmountInEth(token1Utilization, debtAsset1);
223
+
224
+ const borrowRate0 = new Dec(token0BorrowRate).div(100).toString();
225
+ const borrowRate1 = new Dec(token1BorrowRate).div(100).toString();
226
+
227
+ const totalBorrowShares = getEthAmountForDecimals(totalBorrowSharesWei, 18); // in shares
228
+
229
+ const borrowableShares = getEthAmountForDecimals(sharesBorrowable, 18);
230
+ const borrowableToken0 = new Dec(borrowableShares).mul(token0PerBorrowShare).div(1e18).toString();
231
+ const borrowableToken1 = new Dec(borrowableShares).mul(token1PerBorrowShare).div(1e18).toString();
232
+
233
+ const totalBorrowToken0 = assetAmountInEth(token0Borrowed, debtAsset0);
234
+ const totalBorrowToken1 = assetAmountInEth(token1Borrowed, debtAsset1);
235
+
236
+ const reservesBorrowToken0 = assetAmountInEth(borrowToken0Reserves, debtAsset0);
237
+ const reservesBorrowToken1 = assetAmountInEth(borrowToken1Reserves, debtAsset1);
238
+
239
+ return {
240
+ borrowableShares,
241
+ maxBorrowShares,
242
+ borrowDexFee: fee,
243
+ token0PerBorrowShare,
244
+ token1PerBorrowShare,
245
+ borrowable0,
246
+ borrowable1,
247
+ utilizationBorrow0,
248
+ utilizationBorrow1,
249
+ borrowRate0,
250
+ borrowRate1,
251
+ totalBorrowShares,
252
+ borrowableToken0,
253
+ borrowableToken1,
254
+ totalBorrowToken0,
255
+ totalBorrowToken1,
256
+ quoteTokensPerShare: getEthAmountForDecimals(quoteTokensPerShare, 27),
257
+ reservesBorrowToken0,
258
+ reservesBorrowToken1,
259
+ };
260
+ };
261
+
262
+ const EMPTY_ASSET_DATA = {
263
+ symbol: '',
264
+ address: '',
265
+ price: '0',
266
+ totalSupply: '',
267
+ totalBorrow: '0',
268
+ canBeSupplied: false,
269
+ canBeBorrowed: false,
270
+ supplyRate: '0',
271
+ borrowRate: '0',
272
+ };
273
+
274
+ export const mergeAssetData = (existing: Partial<FluidAssetData> = {}, additional: Partial<FluidAssetData>): FluidAssetData => ({
275
+ ...EMPTY_ASSET_DATA,
276
+ ...existing,
277
+ ...additional,
278
+ });
279
+
280
+ export const EMPTY_USED_ASSET = {
281
+ isSupplied: false,
282
+ isBorrowed: false,
283
+ supplied: '0',
284
+ suppliedUsd: '0',
285
+ borrowed: '0',
286
+ borrowedUsd: '0',
287
+ symbol: '',
288
+ collateral: false,
289
+ };
290
+
291
+ export const mergeUsedAssets = (existing: Partial<FluidUsedAsset> = {}, additional: Partial<FluidUsedAsset>): FluidUsedAsset => ({
292
+ ...EMPTY_USED_ASSET,
293
+ ...existing,
294
+ ...additional,
295
+ });
@@ -1,11 +1,11 @@
1
- export * as aaveHelpers from './aaveHelpers';
2
- export * as compoundHelpers from './compoundHelpers';
3
- export * as sparkHelpers from './sparkHelpers';
4
- export * as curveUsdHelpers from './curveUsdHelpers';
5
- export * as makerHelpers from './makerHelpers';
6
- export * as chickenBondsHelpers from './chickenBondsHelpers';
7
- export * as morphoBlueHelpers from './morphoBlueHelpers';
8
- export * as llamaLendHelpers from './llamaLendHelpers';
9
- export * as liquityV2Helpers from './liquityV2Helpers';
10
- export * as eulerV2Helpers from './eulerHelpers';
11
- export * as fluidHelpers from './fluidHelpers';
1
+ export * as aaveHelpers from './aaveHelpers';
2
+ export * as compoundHelpers from './compoundHelpers';
3
+ export * as sparkHelpers from './sparkHelpers';
4
+ export * as curveUsdHelpers from './curveUsdHelpers';
5
+ export * as makerHelpers from './makerHelpers';
6
+ export * as chickenBondsHelpers from './chickenBondsHelpers';
7
+ export * as morphoBlueHelpers from './morphoBlueHelpers';
8
+ export * as llamaLendHelpers from './llamaLendHelpers';
9
+ export * as liquityV2Helpers from './liquityV2Helpers';
10
+ export * as eulerV2Helpers from './eulerHelpers';
11
+ export * as fluidHelpers from './fluidHelpers';
@@ -1,80 +1,80 @@
1
- import Dec from 'decimal.js';
2
- import { calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos } from '../../moneymarket';
3
- import {
4
- LiquityV2AggregatedTroveData, LiquityV2AssetsData, LiquityV2UsedAsset, LiquityV2UsedAssets,
5
- } from '../../types';
6
- import { calculateInterestEarned } from '../../staking';
7
-
8
- export const calculateNetApyLiquityV2 = (usedAssets: LiquityV2UsedAssets, assetsData: LiquityV2AssetsData, interestRate: string) => {
9
- const sumValues = Object.values(usedAssets).reduce((_acc, usedAsset) => {
10
- const acc = { ..._acc };
11
- const assetData = assetsData[usedAsset.symbol];
12
-
13
- if (usedAsset.suppliedUsd) {
14
- const amount = usedAsset.suppliedUsd;
15
- acc.suppliedUsd = new Dec(acc.suppliedUsd).add(amount).toString();
16
- if (assetData.incentiveSupplyApy) {
17
- const incentiveInterest = calculateInterestEarned(amount, assetData.incentiveSupplyApy, 'year', true);
18
- acc.incentiveUsd = new Dec(acc.incentiveUsd).add(incentiveInterest).toString();
19
- }
20
- }
21
-
22
- if (usedAsset.borrowedUsd) {
23
- const amount = usedAsset.borrowedUsd;
24
- acc.borrowedUsd = new Dec(acc.borrowedUsd).add(amount).toString();
25
- const rate = interestRate;
26
- const borrowInterest = calculateInterestEarned(amount, rate as string, 'year', true);
27
- acc.borrowInterest = new Dec(acc.borrowInterest).sub(borrowInterest.toString()).toString();
28
- }
29
-
30
- return acc;
31
- }, {
32
- borrowInterest: '0', supplyInterest: '0', incentiveUsd: '0', borrowedUsd: '0', suppliedUsd: '0',
33
- });
34
-
35
- const {
36
- borrowedUsd, suppliedUsd, borrowInterest, supplyInterest, incentiveUsd,
37
- } = sumValues;
38
-
39
- const totalInterestUsd = new Dec(borrowInterest).add(supplyInterest).add(incentiveUsd).toString();
40
- const balance = new Dec(suppliedUsd).sub(borrowedUsd);
41
- const netApy = new Dec(totalInterestUsd).div(balance).times(100).toString();
42
-
43
- return { netApy, totalInterestUsd, incentiveUsd };
44
- };
45
-
46
- export const getLiquityV2AggregatedPositionData = ({
47
- usedAssets,
48
- assetsData,
49
- minCollRatio,
50
- interestRate,
51
- }: {
52
- usedAssets: LiquityV2UsedAssets
53
- assetsData: LiquityV2AssetsData
54
- minCollRatio: string
55
- interestRate: string
56
- }): LiquityV2AggregatedTroveData => {
57
- const payload = {} as LiquityV2AggregatedTroveData;
58
- payload.suppliedUsd = getAssetsTotal(usedAssets, (usedAsset: LiquityV2UsedAsset) => usedAsset, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
59
- payload.borrowedUsd = getAssetsTotal(usedAssets, (usedAsset: LiquityV2UsedAsset) => usedAsset, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
60
- payload.borrowLimitUsd = new Dec(payload.suppliedUsd).div(minCollRatio).mul(100).toString();
61
- const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
62
- payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
63
- payload.ratio = (+payload.suppliedUsd && +payload.borrowedUsd) ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
64
- payload.collRatio = (+payload.suppliedUsd && +payload.borrowedUsd) ? new Dec(payload.suppliedUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
65
- const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApyLiquityV2(usedAssets, assetsData, interestRate);
66
- payload.netApy = netApy;
67
- payload.incentiveUsd = incentiveUsd;
68
- payload.totalInterestUsd = totalInterestUsd;
69
-
70
- const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
71
- payload.leveragedType = leveragedType;
72
- payload.leveragedAsset = leveragedAsset;
73
- payload.liquidationPrice = '';
74
- if (leveragedType !== '') {
75
- const assetPrice = assetsData[leveragedAsset].price;
76
- payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.borrowLimitUsd);
77
- }
78
-
79
- return payload;
80
- };
1
+ import Dec from 'decimal.js';
2
+ import { calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos } from '../../moneymarket';
3
+ import {
4
+ LiquityV2AggregatedTroveData, LiquityV2AssetsData, LiquityV2UsedAsset, LiquityV2UsedAssets,
5
+ } from '../../types';
6
+ import { calculateInterestEarned } from '../../staking';
7
+
8
+ export const calculateNetApyLiquityV2 = (usedAssets: LiquityV2UsedAssets, assetsData: LiquityV2AssetsData, interestRate: string) => {
9
+ const sumValues = Object.values(usedAssets).reduce((_acc, usedAsset) => {
10
+ const acc = { ..._acc };
11
+ const assetData = assetsData[usedAsset.symbol];
12
+
13
+ if (usedAsset.suppliedUsd) {
14
+ const amount = usedAsset.suppliedUsd;
15
+ acc.suppliedUsd = new Dec(acc.suppliedUsd).add(amount).toString();
16
+ if (assetData.incentiveSupplyApy) {
17
+ const incentiveInterest = calculateInterestEarned(amount, assetData.incentiveSupplyApy, 'year', true);
18
+ acc.incentiveUsd = new Dec(acc.incentiveUsd).add(incentiveInterest).toString();
19
+ }
20
+ }
21
+
22
+ if (usedAsset.borrowedUsd) {
23
+ const amount = usedAsset.borrowedUsd;
24
+ acc.borrowedUsd = new Dec(acc.borrowedUsd).add(amount).toString();
25
+ const rate = interestRate;
26
+ const borrowInterest = calculateInterestEarned(amount, rate as string, 'year', true);
27
+ acc.borrowInterest = new Dec(acc.borrowInterest).sub(borrowInterest.toString()).toString();
28
+ }
29
+
30
+ return acc;
31
+ }, {
32
+ borrowInterest: '0', supplyInterest: '0', incentiveUsd: '0', borrowedUsd: '0', suppliedUsd: '0',
33
+ });
34
+
35
+ const {
36
+ borrowedUsd, suppliedUsd, borrowInterest, supplyInterest, incentiveUsd,
37
+ } = sumValues;
38
+
39
+ const totalInterestUsd = new Dec(borrowInterest).add(supplyInterest).add(incentiveUsd).toString();
40
+ const balance = new Dec(suppliedUsd).sub(borrowedUsd);
41
+ const netApy = new Dec(totalInterestUsd).div(balance).times(100).toString();
42
+
43
+ return { netApy, totalInterestUsd, incentiveUsd };
44
+ };
45
+
46
+ export const getLiquityV2AggregatedPositionData = ({
47
+ usedAssets,
48
+ assetsData,
49
+ minCollRatio,
50
+ interestRate,
51
+ }: {
52
+ usedAssets: LiquityV2UsedAssets
53
+ assetsData: LiquityV2AssetsData
54
+ minCollRatio: string
55
+ interestRate: string
56
+ }): LiquityV2AggregatedTroveData => {
57
+ const payload = {} as LiquityV2AggregatedTroveData;
58
+ payload.suppliedUsd = getAssetsTotal(usedAssets, (usedAsset: LiquityV2UsedAsset) => usedAsset, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
59
+ payload.borrowedUsd = getAssetsTotal(usedAssets, (usedAsset: LiquityV2UsedAsset) => usedAsset, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
60
+ payload.borrowLimitUsd = new Dec(payload.suppliedUsd).div(minCollRatio).mul(100).toString();
61
+ const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
62
+ payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
63
+ payload.ratio = (+payload.suppliedUsd && +payload.borrowedUsd) ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
64
+ payload.collRatio = (+payload.suppliedUsd && +payload.borrowedUsd) ? new Dec(payload.suppliedUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
65
+ const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApyLiquityV2(usedAssets, assetsData, interestRate);
66
+ payload.netApy = netApy;
67
+ payload.incentiveUsd = incentiveUsd;
68
+ payload.totalInterestUsd = totalInterestUsd;
69
+
70
+ const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
71
+ payload.leveragedType = leveragedType;
72
+ payload.leveragedAsset = leveragedAsset;
73
+ payload.liquidationPrice = '';
74
+ if (leveragedType !== '') {
75
+ const assetPrice = assetsData[leveragedAsset].price;
76
+ payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.borrowLimitUsd);
77
+ }
78
+
79
+ return payload;
80
+ };
@@ -1,53 +1,53 @@
1
- import Dec from 'decimal.js';
2
- import {
3
- LlamaLendAggregatedPositionData, LlamaLendAssetsData, LlamaLendMarketData, LlamaLendUsedAssets,
4
- } from '../../types';
5
- import { MMAssetsData, MMUsedAssets, NetworkNumber } from '../../types/common';
6
- import { calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos } from '../../moneymarket';
7
- import { mapRange } from '../../services/utils';
8
- import { calculateNetApy } from '../../staking';
9
-
10
- export const getLlamaLendAggregatedData = ({
11
- loanExists, usedAssets, network, selectedMarket, numOfBands, assetsData, ...rest
12
- }:{
13
- loanExists: boolean, usedAssets: LlamaLendUsedAssets, network: NetworkNumber, selectedMarket: LlamaLendMarketData, numOfBands: number | string, assetsData: LlamaLendAssetsData,
14
- }): LlamaLendAggregatedPositionData => {
15
- const collAsset = selectedMarket.collAsset;
16
- const debtAsset = selectedMarket.baseAsset;
17
- const payload = {} as LlamaLendAggregatedPositionData;
18
-
19
- // payload.supplied = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ supplied }: { supplied: string }) => supplied);
20
- // payload.borrowed = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowed }: { borrowed: string }) => borrowed);
21
- payload.suppliedUsd = getAssetsTotal(usedAssets, ({ collateral }: { collateral: boolean }) => collateral, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
22
- payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
23
- payload.suppliedForYieldUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedForYield }: { suppliedForYield?: string }) => suppliedForYield || '0');
24
-
25
- const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy({ usedAssets, assetsData: assetsData as unknown as MMAssetsData });
26
- payload.netApy = netApy;
27
- payload.incentiveUsd = incentiveUsd;
28
- payload.totalInterestUsd = totalInterestUsd;
29
-
30
- payload.ratio = loanExists
31
- ? new Dec(payload.suppliedUsd)
32
- .dividedBy(payload.borrowedUsd)
33
- .times(100)
34
- .toString()
35
- : '0';
36
-
37
- // this is all approximation
38
- payload.minAllowedRatio = mapRange(numOfBands, 4, 50, 115, 140); // collateral ratio
39
- payload.collFactor = new Dec(1).div(payload.minAllowedRatio).mul(100).toString(); // collateral factor = 1 / collateral ratio
40
- // only take in consideration collAsset
41
- payload.borrowLimitUsd = usedAssets?.[collAsset]?.isSupplied
42
- ? new Dec(usedAssets[collAsset].suppliedUsd).mul(payload.collFactor).toString()
43
- : '0';
44
-
45
- const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets as unknown as MMUsedAssets);
46
- payload.leveragedType = leveragedType;
47
- if (leveragedType !== '') {
48
- payload.leveragedAsset = leveragedAsset;
49
- payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, usedAssets[collAsset].price, payload.borrowedUsd, payload.borrowLimitUsd);
50
- }
51
-
52
- return payload;
53
- };
1
+ import Dec from 'decimal.js';
2
+ import {
3
+ LlamaLendAggregatedPositionData, LlamaLendAssetsData, LlamaLendMarketData, LlamaLendUsedAssets,
4
+ } from '../../types';
5
+ import { MMAssetsData, MMUsedAssets, NetworkNumber } from '../../types/common';
6
+ import { calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos } from '../../moneymarket';
7
+ import { mapRange } from '../../services/utils';
8
+ import { calculateNetApy } from '../../staking';
9
+
10
+ export const getLlamaLendAggregatedData = ({
11
+ loanExists, usedAssets, network, selectedMarket, numOfBands, assetsData, ...rest
12
+ }:{
13
+ loanExists: boolean, usedAssets: LlamaLendUsedAssets, network: NetworkNumber, selectedMarket: LlamaLendMarketData, numOfBands: number | string, assetsData: LlamaLendAssetsData,
14
+ }): LlamaLendAggregatedPositionData => {
15
+ const collAsset = selectedMarket.collAsset;
16
+ const debtAsset = selectedMarket.baseAsset;
17
+ const payload = {} as LlamaLendAggregatedPositionData;
18
+
19
+ // payload.supplied = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ supplied }: { supplied: string }) => supplied);
20
+ // payload.borrowed = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowed }: { borrowed: string }) => borrowed);
21
+ payload.suppliedUsd = getAssetsTotal(usedAssets, ({ collateral }: { collateral: boolean }) => collateral, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
22
+ payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
23
+ payload.suppliedForYieldUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedForYield }: { suppliedForYield?: string }) => suppliedForYield || '0');
24
+
25
+ const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy({ usedAssets, assetsData: assetsData as unknown as MMAssetsData });
26
+ payload.netApy = netApy;
27
+ payload.incentiveUsd = incentiveUsd;
28
+ payload.totalInterestUsd = totalInterestUsd;
29
+
30
+ payload.ratio = loanExists
31
+ ? new Dec(payload.suppliedUsd)
32
+ .dividedBy(payload.borrowedUsd)
33
+ .times(100)
34
+ .toString()
35
+ : '0';
36
+
37
+ // this is all approximation
38
+ payload.minAllowedRatio = mapRange(numOfBands, 4, 50, 115, 140); // collateral ratio
39
+ payload.collFactor = new Dec(1).div(payload.minAllowedRatio).mul(100).toString(); // collateral factor = 1 / collateral ratio
40
+ // only take in consideration collAsset
41
+ payload.borrowLimitUsd = usedAssets?.[collAsset]?.isSupplied
42
+ ? new Dec(usedAssets[collAsset].suppliedUsd).mul(payload.collFactor).toString()
43
+ : '0';
44
+
45
+ const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets as unknown as MMUsedAssets);
46
+ payload.leveragedType = leveragedType;
47
+ if (leveragedType !== '') {
48
+ payload.leveragedAsset = leveragedAsset;
49
+ payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, usedAssets[collAsset].price, payload.borrowedUsd, payload.borrowLimitUsd);
50
+ }
51
+
52
+ return payload;
53
+ };