@defisaver/positions-sdk 2.1.1-dev.0 → 2.1.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 (82) hide show
  1. package/.mocharc.json +4 -4
  2. package/.nvmrc +1 -1
  3. package/README.md +64 -64
  4. package/cjs/helpers/morphoBlueHelpers/index.js +66 -66
  5. package/cjs/liquityV2/index.d.ts +0 -2
  6. package/cjs/liquityV2/index.js +9 -52
  7. package/cjs/staking/staking.js +2 -1
  8. package/esm/helpers/morphoBlueHelpers/index.js +66 -66
  9. package/esm/liquityV2/index.d.ts +0 -2
  10. package/esm/liquityV2/index.js +7 -48
  11. package/esm/staking/staking.js +2 -1
  12. package/package.json +47 -47
  13. package/src/aaveV2/index.ts +239 -239
  14. package/src/aaveV3/index.ts +516 -516
  15. package/src/aaveV3/merit.ts +94 -94
  16. package/src/aaveV3/merkl.ts +74 -74
  17. package/src/compoundV2/index.ts +244 -244
  18. package/src/compoundV3/index.ts +274 -274
  19. package/src/config/contracts.ts +1129 -1129
  20. package/src/constants/index.ts +6 -6
  21. package/src/contracts.ts +107 -107
  22. package/src/curveUsd/index.ts +250 -250
  23. package/src/eulerV2/index.ts +324 -324
  24. package/src/exchange/index.ts +25 -25
  25. package/src/fluid/index.ts +1638 -1638
  26. package/src/helpers/aaveHelpers/index.ts +169 -169
  27. package/src/helpers/compoundHelpers/index.ts +283 -283
  28. package/src/helpers/curveUsdHelpers/index.ts +40 -40
  29. package/src/helpers/eulerHelpers/index.ts +222 -222
  30. package/src/helpers/fluidHelpers/index.ts +326 -326
  31. package/src/helpers/index.ts +10 -10
  32. package/src/helpers/liquityV2Helpers/index.ts +82 -82
  33. package/src/helpers/llamaLendHelpers/index.ts +53 -53
  34. package/src/helpers/makerHelpers/index.ts +52 -52
  35. package/src/helpers/morphoBlueHelpers/index.ts +390 -390
  36. package/src/helpers/sparkHelpers/index.ts +155 -155
  37. package/src/index.ts +45 -45
  38. package/src/liquity/index.ts +104 -104
  39. package/src/liquityV2/index.ts +418 -464
  40. package/src/llamaLend/index.ts +305 -305
  41. package/src/maker/index.ts +223 -223
  42. package/src/markets/aave/index.ts +116 -116
  43. package/src/markets/aave/marketAssets.ts +49 -49
  44. package/src/markets/compound/index.ts +227 -227
  45. package/src/markets/compound/marketsAssets.ts +90 -90
  46. package/src/markets/curveUsd/index.ts +69 -69
  47. package/src/markets/euler/index.ts +26 -26
  48. package/src/markets/fluid/index.ts +2456 -2456
  49. package/src/markets/index.ts +25 -25
  50. package/src/markets/liquityV2/index.ts +102 -102
  51. package/src/markets/llamaLend/contractAddresses.ts +141 -141
  52. package/src/markets/llamaLend/index.ts +235 -235
  53. package/src/markets/morphoBlue/index.ts +895 -895
  54. package/src/markets/spark/index.ts +29 -29
  55. package/src/markets/spark/marketAssets.ts +11 -11
  56. package/src/moneymarket/moneymarketCommonService.ts +80 -80
  57. package/src/morphoBlue/index.ts +236 -236
  58. package/src/portfolio/index.ts +285 -285
  59. package/src/services/priceService.ts +159 -159
  60. package/src/services/utils.ts +63 -63
  61. package/src/services/viem.ts +32 -32
  62. package/src/setup.ts +8 -8
  63. package/src/spark/index.ts +444 -444
  64. package/src/staking/eligibility.ts +60 -60
  65. package/src/staking/index.ts +1 -1
  66. package/src/staking/staking.ts +170 -169
  67. package/src/types/aave.ts +189 -189
  68. package/src/types/common.ts +105 -105
  69. package/src/types/compound.ts +136 -136
  70. package/src/types/curveUsd.ts +121 -121
  71. package/src/types/euler.ts +175 -175
  72. package/src/types/fluid.ts +448 -448
  73. package/src/types/index.ts +13 -13
  74. package/src/types/liquity.ts +30 -30
  75. package/src/types/liquityV2.ts +126 -126
  76. package/src/types/llamaLend.ts +159 -159
  77. package/src/types/maker.ts +63 -63
  78. package/src/types/merit.ts +1 -1
  79. package/src/types/merkl.ts +70 -70
  80. package/src/types/morphoBlue.ts +194 -194
  81. package/src/types/portfolio.ts +60 -60
  82. package/src/types/spark.ts +135 -135
package/.mocharc.json CHANGED
@@ -1,4 +1,4 @@
1
- {
2
- "require": "ts-node/register",
3
- "extension": ["ts"]
4
- }
1
+ {
2
+ "require": "ts-node/register",
3
+ "extension": ["ts"]
4
+ }
package/.nvmrc CHANGED
@@ -1 +1 @@
1
- v20.17.0
1
+ v20.17.0
package/README.md CHANGED
@@ -1,64 +1,64 @@
1
- # DeFi Saver Positions SDK
2
-
3
- Supported protocols:
4
- - [Maker](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/maker)
5
- - [Spark](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/spark)
6
- - [CrvUSD](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/curveUsd)
7
- - [Aave V2](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/aaveV2)
8
- - [Aave V3](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/aaveV3)
9
- - [Compound V2](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/compoundV2)
10
- - [Compound V3](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/compoundV3)
11
- - [Liquity](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/liquity)
12
-
13
- ## Setup
14
- Supported Node version is v10.
15
-
16
- - run `npm install` (first time)
17
- - run `npm run build`
18
-
19
- `build` command will generate contracts and build ejs and esm folders
20
-
21
- ## How to use
22
- [All available imports](https://github.com/defisaver/defisaver-positions-sdk/blob/main/src/index.ts)
23
-
24
- This is a Compound V3 example, and every other protocol is similar
25
- ```js
26
- import { compoundV3 } from '@defisaver/positions-sdk';
27
-
28
-
29
- // every protocol has market data and user data getters
30
- const {
31
- getCompoundV3MarketsData,
32
- getCompoundV3AccountData,
33
- } = compoundV3;
34
-
35
- const provider = 'Your RPC provider';
36
-
37
- const user = '0x123...';
38
-
39
- const { assetsData } = await getCompoundV3MarketsData(
40
- provider, // rpc for the network you are using (note: can be tenderly or any other testnet rpc)
41
- 1, // network
42
- selectedMarket, // market object like in /src/markets/compound/index.ts
43
- provider, // this must be mainnet rpc - used for getting prices onchain and calculating apys
44
- );
45
-
46
- const userData = await getCompoundV3AccountData(
47
- provider,
48
- 1, // network
49
- userAddress, // EOA or DSProxy
50
- '', // proxy address of the user, or just empty string if checking for EOA
51
- {
52
- selectedMarket, // market object as in /src/markets/compound/index.ts
53
- assetsData,
54
- }
55
- );
56
- ```
57
-
58
- More examples found [here](https://github.com/defisaver/defisaver-positions-sdk/tree/main/tests)
59
-
60
- ## Testing
61
-
62
- `npm run test` - Run all tests
63
-
64
- `npm run test-single --name=your_test_name` - Run single test for specified name e.g. for MyTest.js test name is MyTest
1
+ # DeFi Saver Positions SDK
2
+
3
+ Supported protocols:
4
+ - [Maker](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/maker)
5
+ - [Spark](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/spark)
6
+ - [CrvUSD](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/curveUsd)
7
+ - [Aave V2](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/aaveV2)
8
+ - [Aave V3](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/aaveV3)
9
+ - [Compound V2](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/compoundV2)
10
+ - [Compound V3](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/compoundV3)
11
+ - [Liquity](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/liquity)
12
+
13
+ ## Setup
14
+ Supported Node version is v10.
15
+
16
+ - run `npm install` (first time)
17
+ - run `npm run build`
18
+
19
+ `build` command will generate contracts and build ejs and esm folders
20
+
21
+ ## How to use
22
+ [All available imports](https://github.com/defisaver/defisaver-positions-sdk/blob/main/src/index.ts)
23
+
24
+ This is a Compound V3 example, and every other protocol is similar
25
+ ```js
26
+ import { compoundV3 } from '@defisaver/positions-sdk';
27
+
28
+
29
+ // every protocol has market data and user data getters
30
+ const {
31
+ getCompoundV3MarketsData,
32
+ getCompoundV3AccountData,
33
+ } = compoundV3;
34
+
35
+ const provider = 'Your RPC provider';
36
+
37
+ const user = '0x123...';
38
+
39
+ const { assetsData } = await getCompoundV3MarketsData(
40
+ provider, // rpc for the network you are using (note: can be tenderly or any other testnet rpc)
41
+ 1, // network
42
+ selectedMarket, // market object like in /src/markets/compound/index.ts
43
+ provider, // this must be mainnet rpc - used for getting prices onchain and calculating apys
44
+ );
45
+
46
+ const userData = await getCompoundV3AccountData(
47
+ provider,
48
+ 1, // network
49
+ userAddress, // EOA or DSProxy
50
+ '', // proxy address of the user, or just empty string if checking for EOA
51
+ {
52
+ selectedMarket, // market object as in /src/markets/compound/index.ts
53
+ assetsData,
54
+ }
55
+ );
56
+ ```
57
+
58
+ More examples found [here](https://github.com/defisaver/defisaver-positions-sdk/tree/main/tests)
59
+
60
+ ## Testing
61
+
62
+ `npm run test` - Run all tests
63
+
64
+ `npm run test-single --name=your_test_name` - Run single test for specified name e.g. for MyTest.js test name is MyTest
@@ -128,73 +128,73 @@ const getApyAfterValuesEstimation = (selectedMarket, actions, provider, network)
128
128
  });
129
129
  exports.getApyAfterValuesEstimation = getApyAfterValuesEstimation;
130
130
  const API_URL = 'https://blue-api.morpho.org/graphql';
131
- const MARKET_QUERY = `
132
- query MarketByUniqueKey($uniqueKey: String!, $chainId: Int!) {
133
- marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) {
134
- reallocatableLiquidityAssets
135
- targetBorrowUtilization
136
- loanAsset {
137
- address
138
- decimals
139
- priceUsd
140
- }
141
- state {
142
- liquidityAssets
143
- borrowAssets
144
- supplyAssets
145
- }
146
- publicAllocatorSharedLiquidity {
147
- assets
148
- vault {
149
- address
150
- name
151
- }
152
- allocationMarket {
153
- uniqueKey
154
- loanAsset {
155
- address
156
- }
157
- collateralAsset {
158
- address
159
- }
160
- irmAddress
161
- oracle {
162
- address
163
- }
164
- lltv
165
- }
166
- }
167
- loanAsset {
168
- address
169
- }
170
- collateralAsset {
171
- address
172
- }
173
- oracle {
174
- address
175
- }
176
- irmAddress
177
- lltv
178
- }
179
- }
131
+ const MARKET_QUERY = `
132
+ query MarketByUniqueKey($uniqueKey: String!, $chainId: Int!) {
133
+ marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) {
134
+ reallocatableLiquidityAssets
135
+ targetBorrowUtilization
136
+ loanAsset {
137
+ address
138
+ decimals
139
+ priceUsd
140
+ }
141
+ state {
142
+ liquidityAssets
143
+ borrowAssets
144
+ supplyAssets
145
+ }
146
+ publicAllocatorSharedLiquidity {
147
+ assets
148
+ vault {
149
+ address
150
+ name
151
+ }
152
+ allocationMarket {
153
+ uniqueKey
154
+ loanAsset {
155
+ address
156
+ }
157
+ collateralAsset {
158
+ address
159
+ }
160
+ irmAddress
161
+ oracle {
162
+ address
163
+ }
164
+ lltv
165
+ }
166
+ }
167
+ loanAsset {
168
+ address
169
+ }
170
+ collateralAsset {
171
+ address
172
+ }
173
+ oracle {
174
+ address
175
+ }
176
+ irmAddress
177
+ lltv
178
+ }
179
+ }
180
180
  `;
181
- const REWARDS_QUERY = `
182
- query MarketByUniqueKey($uniqueKey: String!, $chainId: Int!) {
183
- marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) {
184
- uniqueKey
185
- state {
186
- rewards {
187
- amountPerSuppliedToken
188
- supplyApr
189
- amountPerBorrowedToken
190
- borrowApr
191
- asset {
192
- address
193
- }
194
- }
195
- }
196
- }
197
- }
181
+ const REWARDS_QUERY = `
182
+ query MarketByUniqueKey($uniqueKey: String!, $chainId: Int!) {
183
+ marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) {
184
+ uniqueKey
185
+ state {
186
+ rewards {
187
+ amountPerSuppliedToken
188
+ supplyApr
189
+ amountPerBorrowedToken
190
+ borrowApr
191
+ asset {
192
+ address
193
+ }
194
+ }
195
+ }
196
+ }
197
+ }
198
198
  `;
199
199
  /**
200
200
  * Get reallocatable liquidity to a given market and target borrow utilization
@@ -15,8 +15,6 @@ export declare const getLiquityV2UserTroveIds: (provider: EthereumProvider, netw
15
15
  }[];
16
16
  nextFreeTroveIndex: string;
17
17
  }>;
18
- export declare const calculateDebtInFrontLiquityV2: (markets: Record<LiquityV2Versions, LiquityV2MarketData>, selectedMarket: LiquityV2Versions, allMarketsUnbackedDebts: Record<LiquityV2Versions, string>, interestRateDebtInFront: string) => string;
19
- export declare const getDebtInFrontForInterestRateIncludingNewDebtLiquityV2: (newDebt: string, markets: Record<LiquityV2Versions, LiquityV2MarketData>, selectedMarket: LiquityV2Versions, provider: Client, network: NetworkNumber, interestRate: string) => Promise<string>;
20
18
  export declare const getDebtInFrontForInterestRateLiquityV2: (markets: Record<LiquityV2Versions, LiquityV2MarketData>, selectedMarket: LiquityV2Versions, provider: EthereumProvider, network: NetworkNumber, isLegacy: boolean, interestRate: string, debtInFrontBeingMoved?: string) => Promise<string>;
21
19
  export declare const _getLiquityV2TroveData: (provider: Client, network: NetworkNumber, { selectedMarket, assetsData, troveId, allMarketsData, }: {
22
20
  selectedMarket: LiquityV2MarketInfo;
@@ -12,7 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.getLiquityV2ClaimableCollateral = exports.getLiquityV2TroveData = exports._getLiquityV2TroveData = exports.getDebtInFrontForInterestRateLiquityV2 = exports.getDebtInFrontForInterestRateIncludingNewDebtLiquityV2 = exports.calculateDebtInFrontLiquityV2 = exports.getLiquityV2UserTroveIds = exports._getLiquityV2UserTroveIds = exports.getLiquityV2MarketData = exports._getLiquityV2MarketData = void 0;
15
+ exports.getLiquityV2ClaimableCollateral = exports.getLiquityV2TroveData = exports._getLiquityV2TroveData = exports.getDebtInFrontForInterestRateLiquityV2 = exports.getLiquityV2UserTroveIds = exports._getLiquityV2UserTroveIds = exports.getLiquityV2MarketData = exports._getLiquityV2MarketData = void 0;
16
16
  const decimal_js_1 = __importDefault(require("decimal.js"));
17
17
  const tokens_1 = require("@defisaver/tokens");
18
18
  const contracts_1 = require("../contracts");
@@ -201,39 +201,11 @@ const getAllMarketsUnbackedDebts = (markets, isLegacy, provider, network) => __a
201
201
  return Object.fromEntries(allMarketsUnbackedDebt);
202
202
  });
203
203
  const calculateDebtInFrontLiquityV2 = (markets, selectedMarket, allMarketsUnbackedDebts, interestRateDebtInFront) => {
204
- // Sanity check to avoid division by 0. Very unlikely to ever happen.
205
- const selectedMarketTotalBorrow = new decimal_js_1.default(markets[selectedMarket].assetsData[(0, markets_1.LiquityV2Markets)(common_1.NetworkNumber.Eth)[selectedMarket].debtToken].totalBorrow);
206
- if (selectedMarketTotalBorrow.eq(0))
207
- return new decimal_js_1.default(0).toString();
208
204
  const selectedMarketUnbackedDebt = new decimal_js_1.default(allMarketsUnbackedDebts[selectedMarket]);
209
205
  const { isLegacy } = (0, markets_1.LiquityV2Markets)(common_1.NetworkNumber.Eth)[selectedMarket];
210
- const totalUnbackedDebt = Object.values(allMarketsUnbackedDebts).reduce((acc, val) => acc.plus(new decimal_js_1.default(val)), new decimal_js_1.default(0));
211
- // When totalUnbackedDebt is 0, redemptions will be proportional with the branch size and not to unbacked debt.
212
- // When unbacked debt is 0 for branch, next redemption call won't touch that branch, so in order to estimate total debt in front we will:
213
- // - First add up all the unbacked debt from other branches, as that will be the only debt that will be redeemed on the fist redemption call
214
- // - Perform split the same way as we would do when totalUnbackedDebt == 0, this would represent the second call to the redemption function
215
- if (selectedMarketUnbackedDebt.eq(0)) {
216
- // Special case if the branch debt in front is 0, it means that all debt in front is unbacked debt from other branches.
217
- if (new decimal_js_1.default(interestRateDebtInFront).eq(0))
218
- return totalUnbackedDebt.toString();
219
- // Then calculate how much of that estimated amount would go to each branch
220
- // Second redemption call - calculate proportional redemption based on updated total debt
221
- const amountBeingRedeemedOnEachMarketByTotalBorrow = Object.entries(markets).map(([version, market]) => {
222
- const { isLegacy: isLegacyMarket } = (0, markets_1.LiquityV2Markets)(common_1.NetworkNumber.Eth)[version];
223
- if (version === selectedMarket && isLegacyMarket !== isLegacy)
224
- return new decimal_js_1.default(interestRateDebtInFront);
225
- const { assetsData } = market;
226
- const { debtToken } = (0, markets_1.LiquityV2Markets)(common_1.NetworkNumber.Eth)[version];
227
- // For other markets, subtract their unbacked debt as it will be cleared in first redemption call
228
- const marketUnbackedDebt = new decimal_js_1.default(allMarketsUnbackedDebts[version]);
229
- const totalBorrow = new decimal_js_1.default(assetsData[debtToken].totalBorrow).sub(marketUnbackedDebt);
230
- const amountToRedeem = new decimal_js_1.default(interestRateDebtInFront).mul(totalBorrow).div(selectedMarketTotalBorrow);
231
- return decimal_js_1.default.min(amountToRedeem, totalBorrow);
232
- });
233
- const redemptionAmount = amountBeingRedeemedOnEachMarketByTotalBorrow.reduce((acc, val) => acc.plus(val), new decimal_js_1.default(0));
234
- return totalUnbackedDebt.plus(redemptionAmount).toString();
235
- }
236
- const amountBeingRedeemedOnEachMarketByUnbackedDebt = Object.entries(markets).map(([version, market]) => {
206
+ if (selectedMarketUnbackedDebt.eq(0))
207
+ return interestRateDebtInFront;
208
+ const amountBeingReedemedOnEachMarket = Object.entries(markets).map(([version, market]) => {
237
209
  const { isLegacy: isLegacyMarket } = (0, markets_1.LiquityV2Markets)(common_1.NetworkNumber.Eth)[version];
238
210
  if (version === selectedMarket && isLegacyMarket !== isLegacy)
239
211
  return new decimal_js_1.default(interestRateDebtInFront);
@@ -241,31 +213,16 @@ const calculateDebtInFrontLiquityV2 = (markets, selectedMarket, allMarketsUnback
241
213
  const { debtToken } = (0, markets_1.LiquityV2Markets)(common_1.NetworkNumber.Eth)[version];
242
214
  const unbackedDebt = new decimal_js_1.default(allMarketsUnbackedDebts[version]);
243
215
  const totalBorrow = new decimal_js_1.default(assetsData[debtToken].totalBorrow);
244
- const amountToRedeem = new decimal_js_1.default(interestRateDebtInFront).mul(unbackedDebt).div(selectedMarketUnbackedDebt);
245
- return decimal_js_1.default.min(amountToRedeem, totalBorrow);
216
+ const amountToReedem = new decimal_js_1.default(interestRateDebtInFront).mul(unbackedDebt).div(selectedMarketUnbackedDebt);
217
+ return decimal_js_1.default.min(amountToReedem, totalBorrow);
246
218
  });
247
- return amountBeingRedeemedOnEachMarketByUnbackedDebt.reduce((acc, val) => acc.plus(val), new decimal_js_1.default(0)).toString();
219
+ return amountBeingReedemedOnEachMarket.reduce((acc, val) => acc.plus(val), new decimal_js_1.default(0)).toString();
248
220
  };
249
- exports.calculateDebtInFrontLiquityV2 = calculateDebtInFrontLiquityV2;
250
- // @dev The amount redeemed on each branch depends on the unbacked debt of every branch (the difference between total borrow and stability pool deposits).
251
- // When new debt is generated on the selected market, the unbacked debt will increase, resulting in a higher redemption amount on that branch.
252
- // This function accepts the new debt that's about to be generated (e.g., trove creation) and estimates the debt in front based on the new state.
253
- const getDebtInFrontForInterestRateIncludingNewDebtLiquityV2 = (newDebt, markets, selectedMarket, provider, network, interestRate) => __awaiter(void 0, void 0, void 0, function* () {
254
- const marketsWithNewDebt = structuredClone(markets);
255
- const selectedMarketDebtToken = (0, markets_1.LiquityV2Markets)(network)[selectedMarket].debtToken;
256
- const currentTotalBorrow = new decimal_js_1.default(marketsWithNewDebt[selectedMarket].assetsData[selectedMarketDebtToken].totalBorrow);
257
- marketsWithNewDebt[selectedMarket].assetsData[selectedMarketDebtToken].totalBorrow = currentTotalBorrow.add(newDebt).toString();
258
- const { isLegacy } = (0, markets_1.LiquityV2Markets)(common_1.NetworkNumber.Eth)[selectedMarket];
259
- const allMarketsUnbackedDebts = yield getAllMarketsUnbackedDebts(marketsWithNewDebt, isLegacy, provider, network);
260
- const interestRateDebtInFront = new decimal_js_1.default(yield getDebtInFrontForInterestRateSingleMarketLiquityV2(provider, network, isLegacy, (0, markets_1.LiquityV2Markets)(network)[selectedMarket].marketAddress, interestRate));
261
- return (0, exports.calculateDebtInFrontLiquityV2)(marketsWithNewDebt, selectedMarket, allMarketsUnbackedDebts, interestRateDebtInFront.toString());
262
- });
263
- exports.getDebtInFrontForInterestRateIncludingNewDebtLiquityV2 = getDebtInFrontForInterestRateIncludingNewDebtLiquityV2;
264
221
  const getDebtInFrontLiquityV2 = (markets, selectedMarket, provider, network, viewContract, troveId) => __awaiter(void 0, void 0, void 0, function* () {
265
222
  const { isLegacy } = (0, markets_1.LiquityV2Markets)(common_1.NetworkNumber.Eth)[selectedMarket];
266
223
  const allMarketsUnbackedDebts = yield getAllMarketsUnbackedDebts(markets, isLegacy, provider, network);
267
224
  const interestRateDebtInFront = yield getDebtInFrontForSingleMarketLiquityV2(provider, network, isLegacy, (0, markets_1.LiquityV2Markets)(network)[selectedMarket].marketAddress, troveId);
268
- return (0, exports.calculateDebtInFrontLiquityV2)(markets, selectedMarket, allMarketsUnbackedDebts, interestRateDebtInFront.toString());
225
+ return calculateDebtInFrontLiquityV2(markets, selectedMarket, allMarketsUnbackedDebts, interestRateDebtInFront.toString());
269
226
  });
270
227
  /**
271
228
  * @param markets
@@ -280,7 +237,7 @@ const _getDebtInFrontForInterestRateLiquityV2 = (markets_2, selectedMarket_1, pr
280
237
  const allMarketsUnbackedDebts = yield getAllMarketsUnbackedDebts(markets, isLegacy, provider, network);
281
238
  const interestRateDebtInFront = new decimal_js_1.default(yield getDebtInFrontForInterestRateSingleMarketLiquityV2(provider, network, isLegacy, (0, markets_1.LiquityV2Markets)(network)[selectedMarket].marketAddress, interestRate))
282
239
  .sub(debtInFrontBeingMoved);
283
- return (0, exports.calculateDebtInFrontLiquityV2)(markets, selectedMarket, allMarketsUnbackedDebts, interestRateDebtInFront.toString());
240
+ return calculateDebtInFrontLiquityV2(markets, selectedMarket, allMarketsUnbackedDebts, interestRateDebtInFront.toString());
284
241
  });
285
242
  const getDebtInFrontForInterestRateLiquityV2 = (markets_2, selectedMarket_1, provider_1, network_1, isLegacy_1, interestRate_1, ...args_1) => __awaiter(void 0, [markets_2, selectedMarket_1, provider_1, network_1, isLegacy_1, interestRate_1, ...args_1], void 0, function* (markets, selectedMarket, provider, network, isLegacy, interestRate, debtInFrontBeingMoved = '0') { return _getDebtInFrontForInterestRateLiquityV2(markets, selectedMarket, (0, viem_1.getViemProvider)(provider, network), network, isLegacy, interestRate, debtInFrontBeingMoved); });
286
243
  exports.getDebtInFrontForInterestRateLiquityV2 = getDebtInFrontForInterestRateLiquityV2;
@@ -138,8 +138,9 @@ const calculateInterestEarned = (principal, interest, type, apy = false) => {
138
138
  exports.calculateInterestEarned = calculateInterestEarned;
139
139
  const calculateNetApy = ({ usedAssets, assetsData, }) => {
140
140
  const sumValues = Object.values(usedAssets).reduce((_acc, usedAsset) => {
141
+ var _a;
141
142
  const acc = Object.assign({}, _acc);
142
- const assetData = assetsData[usedAsset.symbol];
143
+ const assetData = assetsData[usedAsset.symbol] || assetsData[((_a = usedAsset.vaultAddress) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || ''];
143
144
  if (usedAsset.isSupplied) {
144
145
  const amount = usedAsset.suppliedUsd;
145
146
  acc.suppliedUsd = new decimal_js_1.default(acc.suppliedUsd).add(amount).toString();
@@ -118,73 +118,73 @@ export const getApyAfterValuesEstimation = (selectedMarket, actions, provider, n
118
118
  return { borrowRate, supplyRate };
119
119
  });
120
120
  const API_URL = 'https://blue-api.morpho.org/graphql';
121
- const MARKET_QUERY = `
122
- query MarketByUniqueKey($uniqueKey: String!, $chainId: Int!) {
123
- marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) {
124
- reallocatableLiquidityAssets
125
- targetBorrowUtilization
126
- loanAsset {
127
- address
128
- decimals
129
- priceUsd
130
- }
131
- state {
132
- liquidityAssets
133
- borrowAssets
134
- supplyAssets
135
- }
136
- publicAllocatorSharedLiquidity {
137
- assets
138
- vault {
139
- address
140
- name
141
- }
142
- allocationMarket {
143
- uniqueKey
144
- loanAsset {
145
- address
146
- }
147
- collateralAsset {
148
- address
149
- }
150
- irmAddress
151
- oracle {
152
- address
153
- }
154
- lltv
155
- }
156
- }
157
- loanAsset {
158
- address
159
- }
160
- collateralAsset {
161
- address
162
- }
163
- oracle {
164
- address
165
- }
166
- irmAddress
167
- lltv
168
- }
169
- }
121
+ const MARKET_QUERY = `
122
+ query MarketByUniqueKey($uniqueKey: String!, $chainId: Int!) {
123
+ marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) {
124
+ reallocatableLiquidityAssets
125
+ targetBorrowUtilization
126
+ loanAsset {
127
+ address
128
+ decimals
129
+ priceUsd
130
+ }
131
+ state {
132
+ liquidityAssets
133
+ borrowAssets
134
+ supplyAssets
135
+ }
136
+ publicAllocatorSharedLiquidity {
137
+ assets
138
+ vault {
139
+ address
140
+ name
141
+ }
142
+ allocationMarket {
143
+ uniqueKey
144
+ loanAsset {
145
+ address
146
+ }
147
+ collateralAsset {
148
+ address
149
+ }
150
+ irmAddress
151
+ oracle {
152
+ address
153
+ }
154
+ lltv
155
+ }
156
+ }
157
+ loanAsset {
158
+ address
159
+ }
160
+ collateralAsset {
161
+ address
162
+ }
163
+ oracle {
164
+ address
165
+ }
166
+ irmAddress
167
+ lltv
168
+ }
169
+ }
170
170
  `;
171
- const REWARDS_QUERY = `
172
- query MarketByUniqueKey($uniqueKey: String!, $chainId: Int!) {
173
- marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) {
174
- uniqueKey
175
- state {
176
- rewards {
177
- amountPerSuppliedToken
178
- supplyApr
179
- amountPerBorrowedToken
180
- borrowApr
181
- asset {
182
- address
183
- }
184
- }
185
- }
186
- }
187
- }
171
+ const REWARDS_QUERY = `
172
+ query MarketByUniqueKey($uniqueKey: String!, $chainId: Int!) {
173
+ marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) {
174
+ uniqueKey
175
+ state {
176
+ rewards {
177
+ amountPerSuppliedToken
178
+ supplyApr
179
+ amountPerBorrowedToken
180
+ borrowApr
181
+ asset {
182
+ address
183
+ }
184
+ }
185
+ }
186
+ }
187
+ }
188
188
  `;
189
189
  /**
190
190
  * Get reallocatable liquidity to a given market and target borrow utilization
@@ -15,8 +15,6 @@ export declare const getLiquityV2UserTroveIds: (provider: EthereumProvider, netw
15
15
  }[];
16
16
  nextFreeTroveIndex: string;
17
17
  }>;
18
- export declare const calculateDebtInFrontLiquityV2: (markets: Record<LiquityV2Versions, LiquityV2MarketData>, selectedMarket: LiquityV2Versions, allMarketsUnbackedDebts: Record<LiquityV2Versions, string>, interestRateDebtInFront: string) => string;
19
- export declare const getDebtInFrontForInterestRateIncludingNewDebtLiquityV2: (newDebt: string, markets: Record<LiquityV2Versions, LiquityV2MarketData>, selectedMarket: LiquityV2Versions, provider: Client, network: NetworkNumber, interestRate: string) => Promise<string>;
20
18
  export declare const getDebtInFrontForInterestRateLiquityV2: (markets: Record<LiquityV2Versions, LiquityV2MarketData>, selectedMarket: LiquityV2Versions, provider: EthereumProvider, network: NetworkNumber, isLegacy: boolean, interestRate: string, debtInFrontBeingMoved?: string) => Promise<string>;
21
19
  export declare const _getLiquityV2TroveData: (provider: Client, network: NetworkNumber, { selectedMarket, assetsData, troveId, allMarketsData, }: {
22
20
  selectedMarket: LiquityV2MarketInfo;
@@ -190,40 +190,12 @@ const getAllMarketsUnbackedDebts = (markets, isLegacy, provider, network) => __a
190
190
  })));
191
191
  return Object.fromEntries(allMarketsUnbackedDebt);
192
192
  });
193
- export const calculateDebtInFrontLiquityV2 = (markets, selectedMarket, allMarketsUnbackedDebts, interestRateDebtInFront) => {
194
- // Sanity check to avoid division by 0. Very unlikely to ever happen.
195
- const selectedMarketTotalBorrow = new Dec(markets[selectedMarket].assetsData[LiquityV2Markets(NetworkNumber.Eth)[selectedMarket].debtToken].totalBorrow);
196
- if (selectedMarketTotalBorrow.eq(0))
197
- return new Dec(0).toString();
193
+ const calculateDebtInFrontLiquityV2 = (markets, selectedMarket, allMarketsUnbackedDebts, interestRateDebtInFront) => {
198
194
  const selectedMarketUnbackedDebt = new Dec(allMarketsUnbackedDebts[selectedMarket]);
199
195
  const { isLegacy } = LiquityV2Markets(NetworkNumber.Eth)[selectedMarket];
200
- const totalUnbackedDebt = Object.values(allMarketsUnbackedDebts).reduce((acc, val) => acc.plus(new Dec(val)), new Dec(0));
201
- // When totalUnbackedDebt is 0, redemptions will be proportional with the branch size and not to unbacked debt.
202
- // When unbacked debt is 0 for branch, next redemption call won't touch that branch, so in order to estimate total debt in front we will:
203
- // - First add up all the unbacked debt from other branches, as that will be the only debt that will be redeemed on the fist redemption call
204
- // - Perform split the same way as we would do when totalUnbackedDebt == 0, this would represent the second call to the redemption function
205
- if (selectedMarketUnbackedDebt.eq(0)) {
206
- // Special case if the branch debt in front is 0, it means that all debt in front is unbacked debt from other branches.
207
- if (new Dec(interestRateDebtInFront).eq(0))
208
- return totalUnbackedDebt.toString();
209
- // Then calculate how much of that estimated amount would go to each branch
210
- // Second redemption call - calculate proportional redemption based on updated total debt
211
- const amountBeingRedeemedOnEachMarketByTotalBorrow = Object.entries(markets).map(([version, market]) => {
212
- const { isLegacy: isLegacyMarket } = LiquityV2Markets(NetworkNumber.Eth)[version];
213
- if (version === selectedMarket && isLegacyMarket !== isLegacy)
214
- return new Dec(interestRateDebtInFront);
215
- const { assetsData } = market;
216
- const { debtToken } = LiquityV2Markets(NetworkNumber.Eth)[version];
217
- // For other markets, subtract their unbacked debt as it will be cleared in first redemption call
218
- const marketUnbackedDebt = new Dec(allMarketsUnbackedDebts[version]);
219
- const totalBorrow = new Dec(assetsData[debtToken].totalBorrow).sub(marketUnbackedDebt);
220
- const amountToRedeem = new Dec(interestRateDebtInFront).mul(totalBorrow).div(selectedMarketTotalBorrow);
221
- return Dec.min(amountToRedeem, totalBorrow);
222
- });
223
- const redemptionAmount = amountBeingRedeemedOnEachMarketByTotalBorrow.reduce((acc, val) => acc.plus(val), new Dec(0));
224
- return totalUnbackedDebt.plus(redemptionAmount).toString();
225
- }
226
- const amountBeingRedeemedOnEachMarketByUnbackedDebt = Object.entries(markets).map(([version, market]) => {
196
+ if (selectedMarketUnbackedDebt.eq(0))
197
+ return interestRateDebtInFront;
198
+ const amountBeingReedemedOnEachMarket = Object.entries(markets).map(([version, market]) => {
227
199
  const { isLegacy: isLegacyMarket } = LiquityV2Markets(NetworkNumber.Eth)[version];
228
200
  if (version === selectedMarket && isLegacyMarket !== isLegacy)
229
201
  return new Dec(interestRateDebtInFront);
@@ -231,24 +203,11 @@ export const calculateDebtInFrontLiquityV2 = (markets, selectedMarket, allMarket
231
203
  const { debtToken } = LiquityV2Markets(NetworkNumber.Eth)[version];
232
204
  const unbackedDebt = new Dec(allMarketsUnbackedDebts[version]);
233
205
  const totalBorrow = new Dec(assetsData[debtToken].totalBorrow);
234
- const amountToRedeem = new Dec(interestRateDebtInFront).mul(unbackedDebt).div(selectedMarketUnbackedDebt);
235
- return Dec.min(amountToRedeem, totalBorrow);
206
+ const amountToReedem = new Dec(interestRateDebtInFront).mul(unbackedDebt).div(selectedMarketUnbackedDebt);
207
+ return Dec.min(amountToReedem, totalBorrow);
236
208
  });
237
- return amountBeingRedeemedOnEachMarketByUnbackedDebt.reduce((acc, val) => acc.plus(val), new Dec(0)).toString();
209
+ return amountBeingReedemedOnEachMarket.reduce((acc, val) => acc.plus(val), new Dec(0)).toString();
238
210
  };
239
- // @dev The amount redeemed on each branch depends on the unbacked debt of every branch (the difference between total borrow and stability pool deposits).
240
- // When new debt is generated on the selected market, the unbacked debt will increase, resulting in a higher redemption amount on that branch.
241
- // This function accepts the new debt that's about to be generated (e.g., trove creation) and estimates the debt in front based on the new state.
242
- export const getDebtInFrontForInterestRateIncludingNewDebtLiquityV2 = (newDebt, markets, selectedMarket, provider, network, interestRate) => __awaiter(void 0, void 0, void 0, function* () {
243
- const marketsWithNewDebt = structuredClone(markets);
244
- const selectedMarketDebtToken = LiquityV2Markets(network)[selectedMarket].debtToken;
245
- const currentTotalBorrow = new Dec(marketsWithNewDebt[selectedMarket].assetsData[selectedMarketDebtToken].totalBorrow);
246
- marketsWithNewDebt[selectedMarket].assetsData[selectedMarketDebtToken].totalBorrow = currentTotalBorrow.add(newDebt).toString();
247
- const { isLegacy } = LiquityV2Markets(NetworkNumber.Eth)[selectedMarket];
248
- const allMarketsUnbackedDebts = yield getAllMarketsUnbackedDebts(marketsWithNewDebt, isLegacy, provider, network);
249
- const interestRateDebtInFront = new Dec(yield getDebtInFrontForInterestRateSingleMarketLiquityV2(provider, network, isLegacy, LiquityV2Markets(network)[selectedMarket].marketAddress, interestRate));
250
- return calculateDebtInFrontLiquityV2(marketsWithNewDebt, selectedMarket, allMarketsUnbackedDebts, interestRateDebtInFront.toString());
251
- });
252
211
  const getDebtInFrontLiquityV2 = (markets, selectedMarket, provider, network, viewContract, troveId) => __awaiter(void 0, void 0, void 0, function* () {
253
212
  const { isLegacy } = LiquityV2Markets(NetworkNumber.Eth)[selectedMarket];
254
213
  const allMarketsUnbackedDebts = yield getAllMarketsUnbackedDebts(markets, isLegacy, provider, network);
@@ -131,8 +131,9 @@ export const calculateInterestEarned = (principal, interest, type, apy = false)
131
131
  };
132
132
  export const calculateNetApy = ({ usedAssets, assetsData, }) => {
133
133
  const sumValues = Object.values(usedAssets).reduce((_acc, usedAsset) => {
134
+ var _a;
134
135
  const acc = Object.assign({}, _acc);
135
- const assetData = assetsData[usedAsset.symbol];
136
+ const assetData = assetsData[usedAsset.symbol] || assetsData[((_a = usedAsset.vaultAddress) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || ''];
136
137
  if (usedAsset.isSupplied) {
137
138
  const amount = usedAsset.suppliedUsd;
138
139
  acc.suppliedUsd = new Dec(acc.suppliedUsd).add(amount).toString();