@defisaver/positions-sdk 0.0.198 → 0.0.199-dev-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) 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 +126 -4
  5. package/cjs/config/contracts.js +14 -0
  6. package/cjs/contracts.d.ts +1 -0
  7. package/cjs/contracts.js +2 -1
  8. package/cjs/helpers/index.d.ts +1 -0
  9. package/cjs/helpers/index.js +2 -1
  10. package/cjs/helpers/liquityV2Helpers/index.d.ts +12 -0
  11. package/cjs/helpers/liquityV2Helpers/index.js +63 -0
  12. package/cjs/helpers/morphoBlueHelpers/index.js +66 -66
  13. package/cjs/index.d.ts +2 -1
  14. package/cjs/index.js +3 -1
  15. package/cjs/liquityV2/index.d.ts +18 -0
  16. package/cjs/liquityV2/index.js +186 -0
  17. package/cjs/markets/aave/marketAssets.js +2 -4
  18. package/cjs/markets/index.d.ts +1 -0
  19. package/cjs/markets/index.js +3 -1
  20. package/cjs/markets/liquityV2/index.d.ts +10 -0
  21. package/cjs/markets/liquityV2/index.js +47 -0
  22. package/cjs/moneymarket/moneymarketCommonService.js +1 -1
  23. package/cjs/types/contracts/generated/LiquityV2CollSurplusPool.d.ts +64 -0
  24. package/cjs/types/contracts/generated/LiquityV2CollSurplusPool.js +5 -0
  25. package/cjs/types/contracts/generated/LiquityV2TroveNFT.d.ts +73 -0
  26. package/cjs/types/contracts/generated/LiquityV2TroveNFT.js +5 -0
  27. package/cjs/types/contracts/generated/LiquityV2View.d.ts +244 -0
  28. package/cjs/types/contracts/generated/LiquityV2View.js +5 -0
  29. package/cjs/types/contracts/generated/index.d.ts +3 -0
  30. package/cjs/types/index.d.ts +1 -0
  31. package/cjs/types/index.js +1 -0
  32. package/cjs/types/liquityV2.d.ts +111 -0
  33. package/cjs/types/liquityV2.js +24 -0
  34. package/esm/config/contracts.d.ts +126 -4
  35. package/esm/config/contracts.js +14 -0
  36. package/esm/contracts.d.ts +1 -0
  37. package/esm/contracts.js +1 -0
  38. package/esm/helpers/index.d.ts +1 -0
  39. package/esm/helpers/index.js +1 -0
  40. package/esm/helpers/liquityV2Helpers/index.d.ts +12 -0
  41. package/esm/helpers/liquityV2Helpers/index.js +55 -0
  42. package/esm/helpers/morphoBlueHelpers/index.js +66 -66
  43. package/esm/index.d.ts +2 -1
  44. package/esm/index.js +2 -1
  45. package/esm/liquityV2/index.d.ts +18 -0
  46. package/esm/liquityV2/index.js +175 -0
  47. package/esm/markets/aave/marketAssets.js +2 -4
  48. package/esm/markets/index.d.ts +1 -0
  49. package/esm/markets/index.js +1 -0
  50. package/esm/markets/liquityV2/index.d.ts +10 -0
  51. package/esm/markets/liquityV2/index.js +40 -0
  52. package/esm/moneymarket/moneymarketCommonService.js +1 -1
  53. package/esm/types/contracts/generated/LiquityV2CollSurplusPool.d.ts +64 -0
  54. package/esm/types/contracts/generated/LiquityV2CollSurplusPool.js +4 -0
  55. package/esm/types/contracts/generated/LiquityV2TroveNFT.d.ts +73 -0
  56. package/esm/types/contracts/generated/LiquityV2TroveNFT.js +4 -0
  57. package/esm/types/contracts/generated/LiquityV2View.d.ts +244 -0
  58. package/esm/types/contracts/generated/LiquityV2View.js +4 -0
  59. package/esm/types/contracts/generated/index.d.ts +3 -0
  60. package/esm/types/index.d.ts +1 -0
  61. package/esm/types/index.js +1 -0
  62. package/esm/types/liquityV2.d.ts +111 -0
  63. package/esm/types/liquityV2.js +21 -0
  64. package/package.json +49 -49
  65. package/src/aaveV2/index.ts +227 -227
  66. package/src/aaveV3/index.ts +625 -625
  67. package/src/assets/index.ts +60 -60
  68. package/src/chickenBonds/index.ts +123 -123
  69. package/src/compoundV2/index.ts +220 -220
  70. package/src/compoundV3/index.ts +291 -291
  71. package/src/config/contracts.js +1109 -1095
  72. package/src/constants/index.ts +6 -6
  73. package/src/contracts.ts +133 -132
  74. package/src/curveUsd/index.ts +229 -229
  75. package/src/eulerV2/index.ts +303 -303
  76. package/src/exchange/index.ts +17 -17
  77. package/src/helpers/aaveHelpers/index.ts +198 -198
  78. package/src/helpers/chickenBondsHelpers/index.ts +23 -23
  79. package/src/helpers/compoundHelpers/index.ts +246 -246
  80. package/src/helpers/curveUsdHelpers/index.ts +40 -40
  81. package/src/helpers/eulerHelpers/index.ts +232 -232
  82. package/src/helpers/index.ts +10 -9
  83. package/src/helpers/liquityV2Helpers/index.ts +80 -0
  84. package/src/helpers/llamaLendHelpers/index.ts +53 -53
  85. package/src/helpers/makerHelpers/index.ts +94 -94
  86. package/src/helpers/morphoBlueHelpers/index.ts +365 -365
  87. package/src/helpers/sparkHelpers/index.ts +150 -150
  88. package/src/index.ts +50 -48
  89. package/src/liquity/index.ts +116 -116
  90. package/src/liquityV2/index.ts +219 -0
  91. package/src/llamaLend/index.ts +275 -275
  92. package/src/maker/index.ts +117 -117
  93. package/src/markets/aave/index.ts +152 -152
  94. package/src/markets/aave/marketAssets.ts +44 -46
  95. package/src/markets/compound/index.ts +213 -213
  96. package/src/markets/compound/marketsAssets.ts +82 -82
  97. package/src/markets/curveUsd/index.ts +69 -69
  98. package/src/markets/euler/index.ts +26 -26
  99. package/src/markets/index.ts +24 -24
  100. package/src/markets/liquityV2/index.ts +44 -0
  101. package/src/markets/llamaLend/contractAddresses.ts +141 -141
  102. package/src/markets/llamaLend/index.ts +235 -235
  103. package/src/markets/morphoBlue/index.ts +895 -895
  104. package/src/markets/spark/index.ts +29 -29
  105. package/src/markets/spark/marketAssets.ts +10 -10
  106. package/src/moneymarket/moneymarketCommonService.ts +80 -80
  107. package/src/morphoAaveV2/index.ts +256 -256
  108. package/src/morphoAaveV3/index.ts +631 -631
  109. package/src/morphoBlue/index.ts +204 -204
  110. package/src/multicall/index.ts +22 -22
  111. package/src/services/dsrService.ts +15 -15
  112. package/src/services/priceService.ts +62 -62
  113. package/src/services/utils.ts +56 -56
  114. package/src/setup.ts +8 -8
  115. package/src/spark/index.ts +461 -461
  116. package/src/staking/staking.ts +220 -220
  117. package/src/types/aave.ts +271 -271
  118. package/src/types/chickenBonds.ts +45 -45
  119. package/src/types/common.ts +84 -84
  120. package/src/types/compound.ts +131 -131
  121. package/src/types/contracts/generated/LiquityV2CollSurplusPool.ts +130 -0
  122. package/src/types/contracts/generated/LiquityV2TroveNFT.ts +150 -0
  123. package/src/types/contracts/generated/LiquityV2View.ts +315 -0
  124. package/src/types/contracts/generated/index.ts +3 -0
  125. package/src/types/curveUsd.ts +118 -118
  126. package/src/types/euler.ts +171 -171
  127. package/src/types/index.ts +10 -9
  128. package/src/types/liquity.ts +30 -30
  129. package/src/types/liquityV2.ts +119 -0
  130. package/src/types/llamaLend.ts +155 -155
  131. package/src/types/maker.ts +50 -50
  132. package/src/types/morphoBlue.ts +192 -192
  133. package/src/types/spark.ts +131 -131
@@ -0,0 +1,219 @@
1
+ import Web3 from 'web3';
2
+ import Dec from 'decimal.js';
3
+ import { assetAmountInEth, getAssetInfo } from '@defisaver/tokens';
4
+ import { createContractWrapper, LiquityV2ViewContract } from '../contracts';
5
+ import { EthAddress, NetworkNumber } from '../types/common';
6
+ import {
7
+ InnerLiquityV2MarketData,
8
+ LIQUITY_V2_TROVE_STATUS_ENUM,
9
+ LiquityV2AssetsData, LiquityV2MarketData, LiquityV2MarketInfo, LiquityV2TroveData, LiquityV2UsedAssets,
10
+ } from '../types';
11
+ import { getStakingApy, STAKING_ASSETS } from '../staking';
12
+ import { getLiquityV2AggregatedPositionData } from '../helpers/liquityV2Helpers';
13
+ import { compareAddresses, ethToWeth } from '../services/utils';
14
+ import { LiquityV2View } from '../types/contracts/generated';
15
+ import { ZERO_ADDRESS } from '../constants';
16
+
17
+
18
+ export const getLiquityV2MarketData = async (web3: Web3, network: NetworkNumber, selectedMarket: LiquityV2MarketInfo, mainnetWeb3: Web3): Promise<LiquityV2MarketData> => {
19
+ const viewContract = LiquityV2ViewContract(web3, network);
20
+ const { marketAddress, debtToken, collateralToken } = selectedMarket;
21
+ const data = await viewContract.methods.getMarketData(marketAddress).call();
22
+ const hintHelperAddress = data.hintHelpers;
23
+ const troveNFTAddress = data.troveNFT;
24
+ const borrowerOperationsAddress = data.borrowerOperations;
25
+ const troveManagerAddress = data.troveManager;
26
+ const stabilityPoolAddress = data.stabilityPool;
27
+ const collSurplusPoolAddress = data.collSurplusPool;
28
+ const activePoolAddress = data.activePool;
29
+
30
+ const minCollRatio = new Dec(data.MCR).div(1e16).toString();
31
+ const criticalCollRatio = new Dec(data.CCR).div(1e18).toString();
32
+
33
+ const totalMarketBorrow = assetAmountInEth(data.entireSystemDebt);
34
+ const totalMarketSupply = assetAmountInEth(data.entireSystemColl);
35
+ const collPrice = assetAmountInEth(data.collPrice);
36
+
37
+ const totalCollRatio = new Dec(totalMarketSupply).mul(collPrice).div(totalMarketBorrow).toString();
38
+ const leftToBorrowGlobal = new Dec(totalMarketSupply).mul(collPrice).div(criticalCollRatio).sub(totalMarketBorrow)
39
+ .toString();
40
+ const minCollAmountForCurrentBorrow = new Dec(totalMarketBorrow).mul(criticalCollRatio).div(collPrice).toString();
41
+ const leftToWithdrawGlobal = new Dec(totalMarketSupply).sub(minCollAmountForCurrentBorrow).toString();
42
+
43
+ const assetsData: LiquityV2AssetsData = {};
44
+ assetsData[debtToken] = {
45
+ symbol: debtToken,
46
+ address: getAssetInfo(debtToken, network).address,
47
+ price: '1',
48
+ totalSupply: '0',
49
+ totalBorrow: totalMarketBorrow,
50
+ canBeSupplied: false,
51
+ canBeBorrowed: true,
52
+ leftToBorrowGlobal,
53
+ leftToWithdrawGlobal: '0',
54
+ };
55
+ assetsData[collateralToken] = {
56
+ symbol: collateralToken,
57
+ address: getAssetInfo(ethToWeth(collateralToken), network).address,
58
+ price: collPrice,
59
+ totalSupply: totalMarketSupply,
60
+ totalBorrow: '0',
61
+ canBeSupplied: true,
62
+ canBeBorrowed: false,
63
+ leftToBorrowGlobal: '0',
64
+ leftToWithdrawGlobal,
65
+ };
66
+ if (STAKING_ASSETS.includes(collateralToken)) {
67
+ assetsData[collateralToken].incentiveSupplyApy = await getStakingApy(collateralToken, mainnetWeb3);
68
+ assetsData[collateralToken].incentiveSupplyToken = collateralToken;
69
+ }
70
+
71
+ return {
72
+ assetsData,
73
+ marketData: {
74
+ minCollRatio,
75
+ totalCollRatio: new Dec(totalCollRatio).mul(100).toString(),
76
+ criticalCollRatio: new Dec(criticalCollRatio).mul(100).toString(),
77
+ isUnderCollateralized: new Dec(totalCollRatio).lt(criticalCollRatio),
78
+ hintHelperAddress,
79
+ troveNFTAddress,
80
+ borrowerOperationsAddress,
81
+ troveManagerAddress,
82
+ stabilityPoolAddress,
83
+ collSurplusPoolAddress,
84
+ activePoolAddress,
85
+ },
86
+ };
87
+ };
88
+
89
+ const _getUserTroves = async (viewContract: any, account: EthAddress, marketAddress: EthAddress, startIndex = 0, endIndex = 100) => viewContract.methods.getUserTroves(account, marketAddress, startIndex, endIndex).call();
90
+
91
+ const getUserTroves = async (viewContract: any, account: EthAddress, marketAddress: EthAddress, startIndex = 0, endIndex = 100, troves: LiquityV2View.ExistingTroveStructOutput[] = []): Promise<{ troves: LiquityV2View.ExistingTroveStructOutput[], nextFreeTroveIndex: string }> => {
92
+ const result = await _getUserTroves(viewContract, account, marketAddress, startIndex, endIndex);
93
+ const newStartIndex = endIndex + 1;
94
+ const nextFreeTroveIndex = result.nextFreeTroveIndex;
95
+ const existingTroves = [...troves, ...result.troves];
96
+ if (nextFreeTroveIndex !== '-1') return { troves: existingTroves.filter((trove) => trove.ownedByUser), nextFreeTroveIndex };
97
+ return getUserTroves(viewContract, account, marketAddress, newStartIndex, newStartIndex + 100, existingTroves);
98
+ };
99
+
100
+ const TransferEventSig = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
101
+
102
+ const getTransferredTroves = async (web3: Web3, network: NetworkNumber, troveNFTAddress: EthAddress, account: EthAddress): Promise<{ troveId: string }[]> => {
103
+ const nftContract = createContractWrapper(web3, network, 'LiquityV2TroveNFT', troveNFTAddress);
104
+ const currentBlock = await web3.eth.getBlockNumber();
105
+ const events = await nftContract.getPastEvents(
106
+ TransferEventSig,
107
+ {
108
+ fromBlock: currentBlock - 1000,
109
+ },
110
+ );
111
+ const userTransferredTroves = events.filter((event) => !compareAddresses(event.returnValues.from, ZERO_ADDRESS) && compareAddresses(event.returnValues.to, account));
112
+
113
+ // check if the last know transfer address is the user
114
+ userTransferredTroves.forEach((event, index) => {
115
+ const otherTransfers = events.filter((e) => event.blockNumber < e.blockNumber && e.returnValues.tokenId === event.returnValues.tokenId);
116
+ // @ts-ignore
117
+ userTransferredTroves[index].invalid = !!otherTransfers.length;
118
+ });
119
+ // @ts-ignore
120
+ return userTransferredTroves.filter((event) => !event.invalid).map((event) => ({ troveId: event.returnValues.tokenId }));
121
+ };
122
+
123
+ export const getLiquityV2UserTroveIds = async (web3: Web3, network: NetworkNumber, selectedMarket: LiquityV2MarketInfo, troveNFTAddress: EthAddress, account: EthAddress): Promise<{ troves: { troveId: string }[], nextFreeTroveIndex: string }> => {
124
+ const viewContract = LiquityV2ViewContract(web3, network);
125
+ const [{ troves: userTroves, nextFreeTroveIndex }, userTransferredTroves] = await Promise.all([
126
+ getUserTroves(viewContract, account, selectedMarket.marketAddress),
127
+ getTransferredTroves(web3, network, troveNFTAddress, account),
128
+ ]);
129
+ const troves = [...userTroves.map(({ troveId }) => ({ troveId })), ...userTransferredTroves];
130
+ const filteredTroves = troves.filter((value, index, self) => index === self.findIndex((t) => (
131
+ t.troveId === value.troveId
132
+ )),
133
+ );
134
+ return { troves: filteredTroves, nextFreeTroveIndex };
135
+ };
136
+
137
+ const _getDebtInFront = async (viewContract: any, marketAddress: EthAddress, troveId: string, accumulatedSum = '0', iterations = 2000) => viewContract.methods.getDebtInFront(marketAddress, troveId, accumulatedSum, iterations).call();
138
+
139
+ export const getDebtInFrontLiquityV2 = async (viewContract: any, marketAddress: EthAddress, troveId: string, accumulatedSum = '0', iterations = 2000): Promise<string> => {
140
+ const { debt, next } = await _getDebtInFront(viewContract, marketAddress, troveId, accumulatedSum, iterations);
141
+ if (next === '0') return assetAmountInEth(debt);
142
+ return getDebtInFrontLiquityV2(viewContract, marketAddress, next, debt, iterations);
143
+ };
144
+
145
+ export const getLiquityV2TroveData = async (
146
+ web3: Web3,
147
+ network: NetworkNumber,
148
+ {
149
+ selectedMarket,
150
+ assetsData,
151
+ marketData,
152
+ troveId,
153
+ }:
154
+ {
155
+ selectedMarket: LiquityV2MarketInfo,
156
+ assetsData: LiquityV2AssetsData,
157
+ marketData: InnerLiquityV2MarketData,
158
+ troveId: string
159
+ },
160
+ ): Promise<LiquityV2TroveData> => {
161
+ const viewContract = LiquityV2ViewContract(web3, network);
162
+ const { minCollRatio } = marketData;
163
+ const { collateralToken, marketAddress, debtToken } = selectedMarket;
164
+ const [data, debtInFront] = await Promise.all([
165
+ viewContract.methods.getTroveInfo(marketAddress, troveId).call(),
166
+ getDebtInFrontLiquityV2(viewContract, marketAddress, troveId),
167
+ ]);
168
+ const usedAssets: LiquityV2UsedAssets = {};
169
+
170
+ const debtAssetData = assetsData[debtToken];
171
+ const borrowed = assetAmountInEth(data.debtAmount);
172
+ usedAssets[debtToken] = {
173
+ symbol: debtToken,
174
+ supplied: '0',
175
+ suppliedUsd: '0',
176
+ borrowed,
177
+ borrowedUsd: new Dec(borrowed).mul(debtAssetData.price).toString(),
178
+ isBorrowed: true,
179
+ isSupplied: false,
180
+ };
181
+
182
+ const collAssetData = assetsData[collateralToken];
183
+ const suppliedColl = assetAmountInEth(data.collAmount);
184
+ usedAssets[collateralToken] = {
185
+ symbol: collateralToken,
186
+ supplied: suppliedColl,
187
+ suppliedUsd: new Dec(suppliedColl).mul(collAssetData.price).toString(),
188
+ borrowed: '0',
189
+ borrowedUsd: '0',
190
+ isBorrowed: false,
191
+ isSupplied: true,
192
+ collateral: true,
193
+ };
194
+
195
+ const collRatio = new Dec(data.TCRatio).div(1e16).toString();
196
+ const interestRate = new Dec(data.annualInterestRate).div(1e16).toString();
197
+ const interestBatchManager = data.interestBatchManager;
198
+
199
+ const payload: LiquityV2TroveData = {
200
+ usedAssets,
201
+ troveId,
202
+ interestRate,
203
+ interestBatchManager,
204
+ debtInFront,
205
+ troveStatus: LIQUITY_V2_TROVE_STATUS_ENUM[parseInt(data.status, 10)],
206
+ ...getLiquityV2AggregatedPositionData({
207
+ usedAssets, assetsData, minCollRatio, interestRate,
208
+ }),
209
+ collRatio,
210
+ };
211
+
212
+ return payload;
213
+ };
214
+
215
+ export const getLiquityV2ClaimableCollateral = async (collSurplusPoolAddress: EthAddress, account: EthAddress, web3: Web3, network: NetworkNumber): Promise<string> => {
216
+ const collSurplusPoolContract = createContractWrapper(web3, network, 'LiquityV2CollSurplusPool', collSurplusPoolAddress);
217
+ const claimableCollateral = await collSurplusPoolContract.methods.getCollateral(account).call();
218
+ return claimableCollateral;
219
+ };