@defisaver/positions-sdk 2.1.2 → 2.1.3

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 (100) hide show
  1. package/.mocharc.json +4 -4
  2. package/.nvmrc +1 -1
  3. package/README.md +64 -64
  4. package/cjs/helpers/aaveHelpers/index.js +8 -7
  5. package/cjs/helpers/morphoBlueHelpers/index.js +66 -66
  6. package/cjs/staking/eligibility.d.ts +4 -2
  7. package/cjs/staking/eligibility.js +3 -4
  8. package/cjs/staking/staking.d.ts +2 -1
  9. package/cjs/staking/staking.js +3 -3
  10. package/cjs/types/common.d.ts +1 -1
  11. package/cjs/types/common.js +1 -1
  12. package/esm/helpers/aaveHelpers/index.js +8 -7
  13. package/esm/helpers/morphoBlueHelpers/index.js +66 -66
  14. package/esm/staking/eligibility.d.ts +4 -2
  15. package/esm/staking/eligibility.js +3 -4
  16. package/esm/staking/staking.d.ts +2 -1
  17. package/esm/staking/staking.js +3 -3
  18. package/esm/types/common.d.ts +1 -1
  19. package/esm/types/common.js +1 -1
  20. package/package.json +47 -47
  21. package/src/aaveV2/index.ts +240 -240
  22. package/src/aaveV3/index.ts +614 -614
  23. package/src/aaveV3/merit.ts +94 -94
  24. package/src/aaveV3/merkl.ts +74 -74
  25. package/src/claiming/aaveV3.ts +154 -154
  26. package/src/claiming/compV3.ts +22 -22
  27. package/src/claiming/index.ts +12 -12
  28. package/src/claiming/king.ts +66 -66
  29. package/src/claiming/morphoBlue.ts +118 -118
  30. package/src/claiming/spark.ts +225 -225
  31. package/src/compoundV2/index.ts +244 -244
  32. package/src/compoundV3/index.ts +274 -274
  33. package/src/config/contracts.ts +1228 -1228
  34. package/src/constants/index.ts +10 -10
  35. package/src/contracts.ts +120 -120
  36. package/src/curveUsd/index.ts +250 -250
  37. package/src/eulerV2/index.ts +324 -324
  38. package/src/exchange/index.ts +25 -25
  39. package/src/fluid/index.ts +1638 -1638
  40. package/src/helpers/aaveHelpers/index.ts +185 -183
  41. package/src/helpers/compoundHelpers/index.ts +283 -283
  42. package/src/helpers/curveUsdHelpers/index.ts +40 -40
  43. package/src/helpers/eulerHelpers/index.ts +222 -222
  44. package/src/helpers/fluidHelpers/index.ts +326 -326
  45. package/src/helpers/index.ts +10 -10
  46. package/src/helpers/liquityV2Helpers/index.ts +82 -82
  47. package/src/helpers/llamaLendHelpers/index.ts +53 -53
  48. package/src/helpers/makerHelpers/index.ts +52 -52
  49. package/src/helpers/morphoBlueHelpers/index.ts +396 -396
  50. package/src/helpers/sparkHelpers/index.ts +155 -155
  51. package/src/index.ts +47 -47
  52. package/src/liquity/index.ts +159 -159
  53. package/src/liquityV2/index.ts +657 -657
  54. package/src/llamaLend/index.ts +305 -305
  55. package/src/maker/index.ts +223 -223
  56. package/src/markets/aave/index.ts +116 -116
  57. package/src/markets/aave/marketAssets.ts +49 -49
  58. package/src/markets/compound/index.ts +227 -227
  59. package/src/markets/compound/marketsAssets.ts +90 -90
  60. package/src/markets/curveUsd/index.ts +69 -69
  61. package/src/markets/euler/index.ts +26 -26
  62. package/src/markets/fluid/index.ts +2456 -2456
  63. package/src/markets/index.ts +25 -25
  64. package/src/markets/liquityV2/index.ts +102 -102
  65. package/src/markets/llamaLend/contractAddresses.ts +141 -141
  66. package/src/markets/llamaLend/index.ts +235 -235
  67. package/src/markets/morphoBlue/index.ts +895 -895
  68. package/src/markets/spark/index.ts +29 -29
  69. package/src/markets/spark/marketAssets.ts +11 -11
  70. package/src/moneymarket/moneymarketCommonService.ts +80 -80
  71. package/src/morphoBlue/index.ts +274 -274
  72. package/src/portfolio/index.ts +570 -570
  73. package/src/services/priceService.ts +159 -159
  74. package/src/services/utils.ts +99 -99
  75. package/src/services/viem.ts +32 -32
  76. package/src/setup.ts +8 -8
  77. package/src/spark/index.ts +445 -445
  78. package/src/staking/eligibility.ts +59 -60
  79. package/src/staking/index.ts +1 -1
  80. package/src/staking/staking.ts +170 -170
  81. package/src/types/aave.ts +189 -189
  82. package/src/types/claiming.ts +109 -109
  83. package/src/types/common.ts +105 -105
  84. package/src/types/compound.ts +136 -136
  85. package/src/types/curveUsd.ts +121 -121
  86. package/src/types/euler.ts +175 -175
  87. package/src/types/fluid.ts +448 -448
  88. package/src/types/index.ts +13 -13
  89. package/src/types/liquity.ts +30 -30
  90. package/src/types/liquityV2.ts +126 -126
  91. package/src/types/llamaLend.ts +159 -159
  92. package/src/types/maker.ts +63 -63
  93. package/src/types/merit.ts +1 -1
  94. package/src/types/merkl.ts +70 -70
  95. package/src/types/morphoBlue.ts +194 -194
  96. package/src/types/portfolio.ts +60 -60
  97. package/src/types/spark.ts +135 -135
  98. package/src/umbrella/index.ts +69 -69
  99. package/src/umbrella/umbrellaUtils.ts +29 -29
  100. package/CLAUDE.md +0 -32
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
@@ -91,13 +91,6 @@ const aaveAnyGetAggregatedPositionData = (_a) => {
91
91
  payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
92
92
  payload.ratio = +payload.suppliedUsd ? new decimal_js_1.default(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
93
93
  payload.collRatio = +payload.suppliedUsd ? new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
94
- const { netApy, incentiveUsd, totalInterestUsd } = (0, staking_1.calculateNetApy)({
95
- usedAssets,
96
- assetsData,
97
- });
98
- payload.netApy = netApy;
99
- payload.incentiveUsd = incentiveUsd;
100
- payload.totalInterestUsd = totalInterestUsd;
101
94
  payload.liqRatio = new decimal_js_1.default(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
102
95
  payload.liqPercent = new decimal_js_1.default(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
103
96
  const { leveragedType, leveragedAsset } = (0, moneymarket_1.isLeveragedPos)(usedAssets);
@@ -117,6 +110,14 @@ const aaveAnyGetAggregatedPositionData = (_a) => {
117
110
  payload.collLiquidationRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
118
111
  payload.healthRatio = new decimal_js_1.default(payload.liquidationLimitUsd).div(payload.borrowedUsd).toDP(4).toString();
119
112
  payload.minHealthRatio = new decimal_js_1.default(payload.liquidationLimitUsd).div(payload.borrowLimitUsd).toDP(4).toString();
113
+ const { netApy, incentiveUsd, totalInterestUsd } = (0, staking_1.calculateNetApy)({
114
+ usedAssets,
115
+ assetsData,
116
+ optionalData: { healthRatio: payload.healthRatio },
117
+ });
118
+ payload.netApy = netApy;
119
+ payload.incentiveUsd = incentiveUsd;
120
+ payload.totalInterestUsd = totalInterestUsd;
120
121
  return payload;
121
122
  };
122
123
  exports.aaveAnyGetAggregatedPositionData = aaveAnyGetAggregatedPositionData;
@@ -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
@@ -1,5 +1,7 @@
1
1
  import { IncentiveEligibilityId, MMUsedAssets } from '../types/common';
2
- export declare const isEligibleForEthenaUSDeRewards: (usedAssets: MMUsedAssets) => {
2
+ export declare const isEligibleForEthenaUSDeRewards: (usedAssets: MMUsedAssets, { healthRatio }: {
3
+ healthRatio: string;
4
+ }) => {
3
5
  isEligible: boolean;
4
6
  eligibleUSDAmount: string;
5
7
  };
@@ -12,7 +14,7 @@ export declare const isEligibleForAaveV3ArbitrumETHLSBorrow: (usedAssets: MMUsed
12
14
  eligibleUSDAmount: string;
13
15
  };
14
16
  export declare const EligibilityMapping: {
15
- [key in IncentiveEligibilityId]: (usedAssets: MMUsedAssets) => {
17
+ [key in IncentiveEligibilityId]: (usedAssets: MMUsedAssets, optionalData: any) => {
16
18
  isEligible: boolean;
17
19
  eligibleUSDAmount: string;
18
20
  };
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.EligibilityMapping = exports.isEligibleForAaveV3ArbitrumETHLSBorrow = exports.isEligibleForAaveV3ArbitrumEthSupply = exports.isEligibleForEthenaUSDeRewards = void 0;
7
7
  const decimal_js_1 = __importDefault(require("decimal.js"));
8
8
  const common_1 = require("../types/common");
9
- const isEligibleForEthenaUSDeRewards = (usedAssets) => {
9
+ const isEligibleForEthenaUSDeRewards = (usedAssets, { healthRatio }) => {
10
10
  var _a, _b;
11
11
  const USDeUSDAmountSupplied = ((_a = usedAssets.USDe) === null || _a === void 0 ? void 0 : _a.suppliedUsd) || '0';
12
12
  const sUSDeUSDAmountSupplied = ((_b = usedAssets.sUSDe) === null || _b === void 0 ? void 0 : _b.suppliedUsd) || '0';
@@ -30,9 +30,8 @@ const isEligibleForEthenaUSDeRewards = (usedAssets) => {
30
30
  }
31
31
  return acc;
32
32
  }, new decimal_js_1.default(0)).toString();
33
- const borrowPercentage = new decimal_js_1.default(totalAmountBorrowed).div(totalAmountSupplied).toNumber();
34
- if (borrowPercentage < 0.5)
35
- return { isEligible: false, eligibleUSDAmount: '0' }; // must be looped at least once
33
+ if (new decimal_js_1.default(healthRatio).gte(2.5))
34
+ return { isEligible: false, eligibleUSDAmount: '0' }; // health ratio must be below 2.5
36
35
  const halfAmountSupplied = new decimal_js_1.default(totalAmountSupplied).div(2).toString();
37
36
  const USDeAmountEligibleForRewards = decimal_js_1.default.min(USDeUSDAmountSupplied, halfAmountSupplied).toString(); // rewards are given to amount of USDe supplied up to half of total amount supplied
38
37
  return { isEligible: true, eligibleUSDAmount: USDeAmountEligibleForRewards };
@@ -3,9 +3,10 @@ import { MMAssetsData, MMUsedAssets } from '../types/common';
3
3
  export declare const STAKING_ASSETS: string[];
4
4
  export declare const getStakingApy: ((asset: string) => Promise<string>) & memoize.Memoized<(asset: string) => Promise<string>>;
5
5
  export declare const calculateInterestEarned: (principal: string, interest: string, type: string, apy?: boolean) => number;
6
- export declare const calculateNetApy: ({ usedAssets, assetsData, }: {
6
+ export declare const calculateNetApy: ({ usedAssets, assetsData, optionalData, }: {
7
7
  usedAssets: MMUsedAssets;
8
8
  assetsData: MMAssetsData;
9
+ optionalData?: any;
9
10
  }) => {
10
11
  netApy: string;
11
12
  totalInterestUsd: string;
@@ -136,7 +136,7 @@ const calculateInterestEarned = (principal, interest, type, apy = false) => {
136
136
  return (+principal * (Math.pow(((1 + (+interest / 100) / constants_1.BLOCKS_IN_A_YEAR)), (constants_1.BLOCKS_IN_A_YEAR * interval)))) - +principal; // eslint-disable-line
137
137
  };
138
138
  exports.calculateInterestEarned = calculateInterestEarned;
139
- const calculateNetApy = ({ usedAssets, assetsData, }) => {
139
+ const calculateNetApy = ({ usedAssets, assetsData, optionalData, }) => {
140
140
  const sumValues = Object.values(usedAssets).reduce((_acc, usedAsset) => {
141
141
  var _a;
142
142
  const acc = Object.assign({}, _acc);
@@ -151,7 +151,7 @@ const calculateNetApy = ({ usedAssets, assetsData, }) => {
151
151
  const { apy, eligibilityId } = supplyIncentive;
152
152
  const eligibilityCheck = eligibilityId ? eligibility_1.EligibilityMapping[eligibilityId] : null;
153
153
  if (eligibilityCheck) {
154
- const { isEligible, eligibleUSDAmount } = eligibilityCheck(usedAssets);
154
+ const { isEligible, eligibleUSDAmount } = eligibilityCheck(usedAssets, optionalData);
155
155
  const incentiveInterest = isEligible ? (0, exports.calculateInterestEarned)(eligibleUSDAmount, apy, 'year', true) : '0';
156
156
  acc.incentiveUsd = new decimal_js_1.default(acc.incentiveUsd).add(incentiveInterest).toString();
157
157
  }
@@ -171,7 +171,7 @@ const calculateNetApy = ({ usedAssets, assetsData, }) => {
171
171
  const { apy, eligibilityId } = borrowIncentive;
172
172
  const eligibilityCheck = eligibilityId ? eligibility_1.EligibilityMapping[eligibilityId] : null;
173
173
  if (eligibilityCheck) {
174
- const { isEligible, eligibleUSDAmount } = eligibilityCheck(usedAssets);
174
+ const { isEligible, eligibleUSDAmount } = eligibilityCheck(usedAssets, optionalData);
175
175
  const incentiveInterest = isEligible ? (0, exports.calculateInterestEarned)(eligibleUSDAmount, apy, 'year', true) : '0';
176
176
  acc.incentiveUsd = new decimal_js_1.default(acc.incentiveUsd).add(incentiveInterest).toString();
177
177
  }
@@ -3,7 +3,7 @@ export declare enum IncentiveKind {
3
3
  Reward = "reward"
4
4
  }
5
5
  export declare enum IncentiveEligibilityId {
6
- AaveV3EthenaLiquidLeverage = "0x8772bb231f3af13ead41d7ecf6abd60f5f716ec8BORROW_BL",
6
+ AaveV3EthenaLiquidLeverage = "0x7361e6f04060154e0268a8402b073cbf97e11ae3BORROW_BL",
7
7
  AaveV3ArbitrumEthSupply = "0x5d16261c6715a653248269861bbacf68a9774cde",
8
8
  AaveV3ArbitrumETHLSBorrow = "0x0c84331e39d6658Cd6e6b9ba04736cC4c4734351"
9
9
  }
@@ -8,7 +8,7 @@ var IncentiveKind;
8
8
  })(IncentiveKind || (exports.IncentiveKind = IncentiveKind = {}));
9
9
  var IncentiveEligibilityId;
10
10
  (function (IncentiveEligibilityId) {
11
- IncentiveEligibilityId["AaveV3EthenaLiquidLeverage"] = "0x8772bb231f3af13ead41d7ecf6abd60f5f716ec8BORROW_BL";
11
+ IncentiveEligibilityId["AaveV3EthenaLiquidLeverage"] = "0x7361e6f04060154e0268a8402b073cbf97e11ae3BORROW_BL";
12
12
  IncentiveEligibilityId["AaveV3ArbitrumEthSupply"] = "0x5d16261c6715a653248269861bbacf68a9774cde";
13
13
  IncentiveEligibilityId["AaveV3ArbitrumETHLSBorrow"] = "0x0c84331e39d6658Cd6e6b9ba04736cC4c4734351";
14
14
  })(IncentiveEligibilityId || (exports.IncentiveEligibilityId = IncentiveEligibilityId = {}));
@@ -77,13 +77,6 @@ export const aaveAnyGetAggregatedPositionData = (_a) => {
77
77
  payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
78
78
  payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
79
79
  payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
80
- const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy({
81
- usedAssets,
82
- assetsData,
83
- });
84
- payload.netApy = netApy;
85
- payload.incentiveUsd = incentiveUsd;
86
- payload.totalInterestUsd = totalInterestUsd;
87
80
  payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
88
81
  payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
89
82
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
@@ -103,6 +96,14 @@ export const aaveAnyGetAggregatedPositionData = (_a) => {
103
96
  payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
104
97
  payload.healthRatio = new Dec(payload.liquidationLimitUsd).div(payload.borrowedUsd).toDP(4).toString();
105
98
  payload.minHealthRatio = new Dec(payload.liquidationLimitUsd).div(payload.borrowLimitUsd).toDP(4).toString();
99
+ const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy({
100
+ usedAssets,
101
+ assetsData,
102
+ optionalData: { healthRatio: payload.healthRatio },
103
+ });
104
+ payload.netApy = netApy;
105
+ payload.incentiveUsd = incentiveUsd;
106
+ payload.totalInterestUsd = totalInterestUsd;
106
107
  return payload;
107
108
  };
108
109
  const getApyAfterValuesEstimationInner = (selectedMarket, actions, client, network) => __awaiter(void 0, void 0, void 0, function* () {
@@ -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
@@ -1,5 +1,7 @@
1
1
  import { IncentiveEligibilityId, MMUsedAssets } from '../types/common';
2
- export declare const isEligibleForEthenaUSDeRewards: (usedAssets: MMUsedAssets) => {
2
+ export declare const isEligibleForEthenaUSDeRewards: (usedAssets: MMUsedAssets, { healthRatio }: {
3
+ healthRatio: string;
4
+ }) => {
3
5
  isEligible: boolean;
4
6
  eligibleUSDAmount: string;
5
7
  };
@@ -12,7 +14,7 @@ export declare const isEligibleForAaveV3ArbitrumETHLSBorrow: (usedAssets: MMUsed
12
14
  eligibleUSDAmount: string;
13
15
  };
14
16
  export declare const EligibilityMapping: {
15
- [key in IncentiveEligibilityId]: (usedAssets: MMUsedAssets) => {
17
+ [key in IncentiveEligibilityId]: (usedAssets: MMUsedAssets, optionalData: any) => {
16
18
  isEligible: boolean;
17
19
  eligibleUSDAmount: string;
18
20
  };
@@ -1,6 +1,6 @@
1
1
  import Dec from 'decimal.js';
2
2
  import { IncentiveEligibilityId } from '../types/common';
3
- export const isEligibleForEthenaUSDeRewards = (usedAssets) => {
3
+ export const isEligibleForEthenaUSDeRewards = (usedAssets, { healthRatio }) => {
4
4
  var _a, _b;
5
5
  const USDeUSDAmountSupplied = ((_a = usedAssets.USDe) === null || _a === void 0 ? void 0 : _a.suppliedUsd) || '0';
6
6
  const sUSDeUSDAmountSupplied = ((_b = usedAssets.sUSDe) === null || _b === void 0 ? void 0 : _b.suppliedUsd) || '0';
@@ -24,9 +24,8 @@ export const isEligibleForEthenaUSDeRewards = (usedAssets) => {
24
24
  }
25
25
  return acc;
26
26
  }, new Dec(0)).toString();
27
- const borrowPercentage = new Dec(totalAmountBorrowed).div(totalAmountSupplied).toNumber();
28
- if (borrowPercentage < 0.5)
29
- return { isEligible: false, eligibleUSDAmount: '0' }; // must be looped at least once
27
+ if (new Dec(healthRatio).gte(2.5))
28
+ return { isEligible: false, eligibleUSDAmount: '0' }; // health ratio must be below 2.5
30
29
  const halfAmountSupplied = new Dec(totalAmountSupplied).div(2).toString();
31
30
  const USDeAmountEligibleForRewards = Dec.min(USDeUSDAmountSupplied, halfAmountSupplied).toString(); // rewards are given to amount of USDe supplied up to half of total amount supplied
32
31
  return { isEligible: true, eligibleUSDAmount: USDeAmountEligibleForRewards };
@@ -3,9 +3,10 @@ import { MMAssetsData, MMUsedAssets } from '../types/common';
3
3
  export declare const STAKING_ASSETS: string[];
4
4
  export declare const getStakingApy: ((asset: string) => Promise<string>) & memoize.Memoized<(asset: string) => Promise<string>>;
5
5
  export declare const calculateInterestEarned: (principal: string, interest: string, type: string, apy?: boolean) => number;
6
- export declare const calculateNetApy: ({ usedAssets, assetsData, }: {
6
+ export declare const calculateNetApy: ({ usedAssets, assetsData, optionalData, }: {
7
7
  usedAssets: MMUsedAssets;
8
8
  assetsData: MMAssetsData;
9
+ optionalData?: any;
9
10
  }) => {
10
11
  netApy: string;
11
12
  totalInterestUsd: string;