@defisaver/positions-sdk 2.1.126-dev → 2.1.127-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 (36) hide show
  1. package/cjs/helpers/compoundHelpers/index.js +2 -0
  2. package/cjs/helpers/curveUsdHelpers/index.js +1 -0
  3. package/cjs/helpers/eulerHelpers/index.js +1 -0
  4. package/cjs/helpers/fluidHelpers/index.js +1 -0
  5. package/cjs/helpers/llamaLendHelpers/index.js +1 -0
  6. package/cjs/helpers/morphoBlueHelpers/index.js +2 -0
  7. package/cjs/helpers/sparkHelpers/index.js +1 -0
  8. package/cjs/morphoBlue/index.d.ts +8 -6
  9. package/cjs/morphoBlue/index.js +69 -40
  10. package/cjs/portfolio/index.js +1 -1
  11. package/cjs/staking/staking.js +1 -15
  12. package/cjs/types/morphoBlue.d.ts +9 -0
  13. package/esm/helpers/compoundHelpers/index.js +2 -0
  14. package/esm/helpers/curveUsdHelpers/index.js +1 -0
  15. package/esm/helpers/eulerHelpers/index.js +1 -0
  16. package/esm/helpers/fluidHelpers/index.js +1 -0
  17. package/esm/helpers/llamaLendHelpers/index.js +1 -0
  18. package/esm/helpers/morphoBlueHelpers/index.js +2 -0
  19. package/esm/helpers/sparkHelpers/index.js +1 -0
  20. package/esm/morphoBlue/index.d.ts +8 -6
  21. package/esm/morphoBlue/index.js +62 -39
  22. package/esm/portfolio/index.js +2 -2
  23. package/esm/staking/staking.js +1 -15
  24. package/esm/types/morphoBlue.d.ts +9 -0
  25. package/package.json +1 -1
  26. package/src/helpers/compoundHelpers/index.ts +2 -0
  27. package/src/helpers/curveUsdHelpers/index.ts +1 -0
  28. package/src/helpers/eulerHelpers/index.ts +1 -0
  29. package/src/helpers/fluidHelpers/index.ts +1 -0
  30. package/src/helpers/llamaLendHelpers/index.ts +1 -0
  31. package/src/helpers/morphoBlueHelpers/index.ts +2 -0
  32. package/src/helpers/sparkHelpers/index.ts +1 -0
  33. package/src/morphoBlue/index.ts +101 -44
  34. package/src/portfolio/index.ts +2 -2
  35. package/src/staking/staking.ts +1 -14
  36. package/src/types/morphoBlue.ts +11 -0
@@ -115,6 +115,7 @@ const getCompoundV2AggregatedData = (_a) => {
115
115
  payload.totalInterestUsd = totalInterestUsd;
116
116
  const { leveragedType, leveragedAsset } = (0, moneymarket_1.isLeveragedPos)(usedAssets);
117
117
  payload.leveragedType = leveragedType;
118
+ payload.liquidationPrice = '';
118
119
  if (leveragedType !== '') {
119
120
  payload.leveragedAsset = leveragedAsset;
120
121
  const assetPrice = assetsData[(0, utils_1.handleWbtcLegacy)(leveragedAsset)].price;
@@ -148,6 +149,7 @@ const getCompoundV3AggregatedData = (_a) => {
148
149
  payload.minDebt = assetsData[selectedMarket.baseAsset].minDebt;
149
150
  const { leveragedType, leveragedAsset } = (0, moneymarket_1.isLeveragedPos)(usedAssets, selectedMarket.value === types_1.CompoundVersions.CompoundV3ETH ? 0.001 : 5);
150
151
  payload.leveragedType = leveragedType;
152
+ payload.liquidationPrice = '';
151
153
  if (leveragedType !== '') {
152
154
  payload.leveragedAsset = leveragedAsset;
153
155
  let assetPrice = assetsData[leveragedAsset].price;
@@ -41,6 +41,7 @@ const getCrvUsdAggregatedData = (_a) => {
41
41
  : '0';
42
42
  const { leveragedType, leveragedAsset } = (0, moneymarket_1.isLeveragedPos)(usedAssets);
43
43
  payload.leveragedType = leveragedType;
44
+ payload.liquidationPrice = '';
44
45
  if (leveragedType !== '') {
45
46
  payload.leveragedAsset = leveragedAsset;
46
47
  payload.liquidationPrice = (0, moneymarket_1.calcLeverageLiqPrice)(leveragedType, usedAssets[selectedMarket.collAsset].price, payload.borrowedUsd, payload.borrowLimitUsd);
@@ -110,6 +110,7 @@ const getEulerV2AggregatedData = (_a) => {
110
110
  payload.liqPercent = new decimal_js_1.default(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
111
111
  const { leveragedType, leveragedAsset, leveragedVault } = (0, exports.isLeveragedPos)(usedAssets);
112
112
  payload.leveragedType = leveragedType;
113
+ payload.liquidationPrice = '';
113
114
  if (leveragedType !== '') {
114
115
  payload.leveragedAsset = leveragedAsset;
115
116
  let assetPrice = assetsData[leveragedVault.toLowerCase()].price;
@@ -53,6 +53,7 @@ const getFluidAggregatedData = ({ usedAssets, assetsData, marketData, }, supplyS
53
53
  payload.minRatio = marketData.minRatio;
54
54
  const { leveragedType, leveragedAsset } = (0, moneymarket_1.isLeveragedPos)(usedAssets);
55
55
  payload.leveragedType = leveragedType;
56
+ payload.liquidationPrice = '';
56
57
  if (leveragedType !== '') {
57
58
  payload.leveragedAsset = leveragedAsset;
58
59
  let assetPrice = assetsData[leveragedAsset].price;
@@ -49,6 +49,7 @@ const getLlamaLendAggregatedData = (_a) => {
49
49
  : '0';
50
50
  const { leveragedType, leveragedAsset } = (0, moneymarket_1.isLeveragedPos)(usedAssets);
51
51
  payload.leveragedType = leveragedType;
52
+ payload.liquidationPrice = '';
52
53
  if (leveragedType !== '') {
53
54
  payload.leveragedAsset = leveragedAsset;
54
55
  payload.liquidationPrice = (0, moneymarket_1.calcLeverageLiqPrice)(leveragedType, usedAssets[collAsset].price, payload.borrowedUsd, payload.borrowLimitUsd);
@@ -48,6 +48,7 @@ const getMorphoBlueAggregatedPositionData = ({ usedAssets, assetsData, marketInf
48
48
  .toString();
49
49
  const { leveragedType, leveragedAsset } = (0, moneymarket_1.isLeveragedPos)(usedAssets);
50
50
  payload.leveragedType = leveragedType;
51
+ payload.liquidationPrice = '';
51
52
  if (leveragedType !== '') {
52
53
  payload.leveragedAsset = leveragedAsset;
53
54
  let assetPrice = assetsData[leveragedAsset].price;
@@ -360,6 +361,7 @@ const getRewardsForMarket = (marketId_1, ...args_1) => __awaiter(void 0, [market
360
361
  query: REWARDS_QUERY,
361
362
  variables: { marketId, chainId: network },
362
363
  }),
364
+ signal: AbortSignal.timeout(utils_1.LONGER_TIMEOUT),
363
365
  });
364
366
  const data = yield response.json();
365
367
  const marketData = (_a = data === null || data === void 0 ? void 0 : data.data) === null || _a === void 0 ? void 0 : _a.marketById;
@@ -89,6 +89,7 @@ const sparkGetAggregatedPositionData = (_a) => {
89
89
  payload.liqPercent = new decimal_js_1.default(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
90
90
  const { leveragedType, leveragedAsset } = (0, moneymarket_1.isLeveragedPos)(usedAssets);
91
91
  payload.leveragedType = leveragedType;
92
+ payload.liquidationPrice = '';
92
93
  if (leveragedType !== '') {
93
94
  payload.leveragedAsset = leveragedAsset;
94
95
  let assetPrice = data.assetsData[leveragedAsset].price; // TODO sparkPrice or price??
@@ -1,14 +1,16 @@
1
1
  import { Client } from 'viem';
2
2
  import { Blockish, EthAddress, EthereumProvider, NetworkNumber, PositionBalances } from '../types/common';
3
- import { MorphoBlueMarketData, MorphoBlueMarketInfo, MorphoBluePositionData } from '../types';
3
+ import { MorphoBlueEarnData, MorphoBlueMarketData, MorphoBlueMarketInfo, MorphoBlueMarketRewards, MorphoBluePositionData } from '../types';
4
+ export declare const addMorphoBlueRewardsToMarketInfo: (marketInfo: MorphoBlueMarketInfo, rewards: MorphoBlueMarketRewards) => MorphoBlueMarketInfo;
4
5
  export declare function _getMorphoBlueMarketData(provider: Client, network: NetworkNumber, selectedMarket: MorphoBlueMarketData): Promise<MorphoBlueMarketInfo>;
6
+ export declare function _getMorphoBluePortfolioMarketData(provider: Client, network: NetworkNumber, selectedMarket: MorphoBlueMarketData): Promise<MorphoBlueMarketInfo>;
5
7
  export declare function getMorphoBlueMarketData(provider: EthereumProvider, network: NetworkNumber, selectedMarket: MorphoBlueMarketData): Promise<MorphoBlueMarketInfo>;
8
+ export declare function getMorphoBluePortfolioMarketData(provider: EthereumProvider, network: NetworkNumber, selectedMarket: MorphoBlueMarketData): Promise<MorphoBlueMarketInfo>;
9
+ export declare const getMorphoBluePositionDataWithMarketInfo: (data: MorphoBluePositionData, marketInfo: MorphoBlueMarketInfo) => MorphoBluePositionData;
10
+ export declare const getMorphoEarnDataWithMarketInfo: (data: MorphoBlueEarnData, marketInfo: MorphoBlueMarketInfo) => MorphoBlueEarnData;
11
+ export declare function getMorphoBlueMarketRewards(network: NetworkNumber, selectedMarket: MorphoBlueMarketData): Promise<MorphoBlueMarketRewards>;
6
12
  export declare const _getMorphoBlueAccountBalances: (provider: Client, network: NetworkNumber, block: Blockish, addressMapping: boolean, address: EthAddress, selectedMarket: MorphoBlueMarketData) => Promise<PositionBalances>;
7
13
  export declare const getMorphoBlueAccountBalances: (provider: EthereumProvider, network: NetworkNumber, block: Blockish, addressMapping: boolean, address: EthAddress, selectedMarket: MorphoBlueMarketData) => Promise<PositionBalances>;
8
14
  export declare function _getMorphoBlueAccountData(provider: Client, network: NetworkNumber, account: EthAddress, selectedMarket: MorphoBlueMarketData, marketInfo: MorphoBlueMarketInfo): Promise<MorphoBluePositionData>;
9
15
  export declare function getMorphoBlueAccountData(provider: EthereumProvider, network: NetworkNumber, account: EthAddress, selectedMarket: MorphoBlueMarketData, marketInfo: MorphoBlueMarketInfo): Promise<MorphoBluePositionData>;
10
- export declare function getMorphoEarn(provider: Client, network: NetworkNumber, account: EthAddress, selectedMarket: MorphoBlueMarketData, marketInfo: MorphoBlueMarketInfo): Promise<{
11
- apy: string;
12
- amount: string;
13
- amountUsd: string;
14
- }>;
16
+ export declare function getMorphoEarn(provider: Client, network: NetworkNumber, account: EthAddress, selectedMarket: MorphoBlueMarketData, marketInfo: MorphoBlueMarketInfo): Promise<MorphoBlueEarnData>;
@@ -12,9 +12,12 @@ 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.getMorphoBlueAccountBalances = exports._getMorphoBlueAccountBalances = void 0;
15
+ exports.getMorphoBlueAccountBalances = exports._getMorphoBlueAccountBalances = exports.getMorphoEarnDataWithMarketInfo = exports.getMorphoBluePositionDataWithMarketInfo = exports.addMorphoBlueRewardsToMarketInfo = void 0;
16
16
  exports._getMorphoBlueMarketData = _getMorphoBlueMarketData;
17
+ exports._getMorphoBluePortfolioMarketData = _getMorphoBluePortfolioMarketData;
17
18
  exports.getMorphoBlueMarketData = getMorphoBlueMarketData;
19
+ exports.getMorphoBluePortfolioMarketData = getMorphoBluePortfolioMarketData;
20
+ exports.getMorphoBlueMarketRewards = getMorphoBlueMarketRewards;
18
21
  exports._getMorphoBlueAccountData = _getMorphoBlueAccountData;
19
22
  exports.getMorphoBlueAccountData = getMorphoBlueAccountData;
20
23
  exports.getMorphoEarn = getMorphoEarn;
@@ -29,7 +32,21 @@ const morphoBlueHelpers_1 = require("../helpers/morphoBlueHelpers");
29
32
  const priceService_1 = require("../services/priceService");
30
33
  const viem_1 = require("../services/viem");
31
34
  const HARDCODED_USD_STABLE_PRICE = '100000000'; // $1 with 8 decimals
32
- function _getMorphoBlueMarketData(provider, network, selectedMarket) {
35
+ const getMorphoRewardIncentives = (apy) => [{
36
+ token: 'MORPHO',
37
+ apy,
38
+ incentiveKind: common_1.IncentiveKind.Reward,
39
+ description: 'Eligible for protocol-level MORPHO incentives.',
40
+ }];
41
+ const addMorphoBlueRewardsToMarketInfo = (marketInfo, rewards) => (Object.assign(Object.assign({}, marketInfo), { assetsData: Object.assign(Object.assign({}, marketInfo.assetsData), { [marketInfo.loanToken]: Object.assign(Object.assign({}, marketInfo.assetsData[marketInfo.loanToken]), { supplyIncentives: [
42
+ ...marketInfo.assetsData[marketInfo.loanToken].supplyIncentives.filter(({ token }) => token !== 'MORPHO'),
43
+ ...getMorphoRewardIncentives(rewards.supplyApy),
44
+ ], borrowIncentives: [
45
+ ...marketInfo.assetsData[marketInfo.loanToken].borrowIncentives.filter(({ token }) => token !== 'MORPHO'),
46
+ ...getMorphoRewardIncentives(rewards.borrowApy),
47
+ ] }) }) }));
48
+ exports.addMorphoBlueRewardsToMarketInfo = addMorphoBlueRewardsToMarketInfo;
49
+ function getMorphoBlueMarketDataInternal(provider, network, selectedMarket) {
33
50
  return __awaiter(this, void 0, void 0, function* () {
34
51
  const { loanToken, collateralToken, oracle, irm, lltv, oracleType, } = selectedMarket;
35
52
  const lltvInWei = new decimal_js_1.default(lltv).mul(constants_1.WAD).toString();
@@ -61,16 +78,6 @@ function _getMorphoBlueMarketData(provider, network, selectedMarket) {
61
78
  marketInfo = _marketInfo;
62
79
  loanTokenPrice = loanTokenPriceRound[1].toString();
63
80
  }
64
- let morphoSupplyApy = '0';
65
- let morphoBorrowApy = '0';
66
- try {
67
- const { supplyApy: _morphoSupplyApy, borrowApy: _morphoBorrowApy } = yield (0, morphoBlueHelpers_1.getRewardsForMarket)(selectedMarket.marketId, network);
68
- morphoSupplyApy = _morphoSupplyApy;
69
- morphoBorrowApy = _morphoBorrowApy;
70
- }
71
- catch (e) {
72
- console.error(e);
73
- }
74
81
  const supplyRate = (0, morphoBlueHelpers_1.getSupplyRate)(marketInfo.totalSupplyAssets.toString(), marketInfo.totalBorrowAssets.toString(), marketInfo.borrowRate.toString(), marketInfo.fee.toString());
75
82
  const compoundedBorrowRate = (0, morphoBlueHelpers_1.getBorrowRate)(marketInfo.borrowRate.toString(), marketInfo.totalBorrowShares.toString());
76
83
  const utillization = new decimal_js_1.default(marketInfo.totalBorrowAssets.toString()).div(marketInfo.totalSupplyAssets.toString()).mul(100).toString();
@@ -89,18 +96,8 @@ function _getMorphoBlueMarketData(provider, network, selectedMarket) {
89
96
  totalBorrow: new decimal_js_1.default(marketInfo.totalBorrowAssets.toString()).div(scale).toString(),
90
97
  canBeSupplied: true,
91
98
  canBeBorrowed: true,
92
- supplyIncentives: [{
93
- token: 'MORPHO',
94
- apy: morphoSupplyApy,
95
- incentiveKind: common_1.IncentiveKind.Reward,
96
- description: 'Eligible for protocol-level MORPHO incentives.',
97
- }],
98
- borrowIncentives: [{
99
- token: 'MORPHO',
100
- apy: morphoBorrowApy,
101
- incentiveKind: common_1.IncentiveKind.Reward,
102
- description: 'Eligible for protocol-level MORPHO incentives.',
103
- }],
99
+ supplyIncentives: [],
100
+ borrowIncentives: [],
104
101
  };
105
102
  assetsData[(0, utils_1.wethToEth)(collateralTokenInfo.symbol)] = {
106
103
  symbol: (0, utils_1.wethToEth)(collateralTokenInfo.symbol),
@@ -135,11 +132,56 @@ function _getMorphoBlueMarketData(provider, network, selectedMarket) {
135
132
  };
136
133
  });
137
134
  }
135
+ function _getMorphoBlueMarketData(provider, network, selectedMarket) {
136
+ return __awaiter(this, void 0, void 0, function* () {
137
+ const marketInfo = yield getMorphoBlueMarketDataInternal(provider, network, selectedMarket);
138
+ try {
139
+ const rewards = yield (0, morphoBlueHelpers_1.getRewardsForMarket)(selectedMarket.marketId, network);
140
+ return (0, exports.addMorphoBlueRewardsToMarketInfo)(marketInfo, rewards);
141
+ }
142
+ catch (error) {
143
+ console.error(error);
144
+ return (0, exports.addMorphoBlueRewardsToMarketInfo)(marketInfo, { supplyApy: '0', borrowApy: '0' });
145
+ }
146
+ });
147
+ }
148
+ function _getMorphoBluePortfolioMarketData(provider, network, selectedMarket) {
149
+ return getMorphoBlueMarketDataInternal(provider, network, selectedMarket);
150
+ }
138
151
  function getMorphoBlueMarketData(provider, network, selectedMarket) {
139
152
  return __awaiter(this, void 0, void 0, function* () {
140
153
  return _getMorphoBlueMarketData((0, viem_1.getViemProvider)(provider, network), network, selectedMarket);
141
154
  });
142
155
  }
156
+ function getMorphoBluePortfolioMarketData(provider, network, selectedMarket) {
157
+ return _getMorphoBluePortfolioMarketData((0, viem_1.getViemProvider)(provider, network), network, selectedMarket);
158
+ }
159
+ const getMorphoBluePositionDataWithMarketInfo = (data, marketInfo) => (Object.assign(Object.assign({}, data), (0, morphoBlueHelpers_1.getMorphoBlueAggregatedPositionData)({
160
+ usedAssets: data.usedAssets,
161
+ assetsData: marketInfo.assetsData,
162
+ marketInfo,
163
+ })));
164
+ exports.getMorphoBluePositionDataWithMarketInfo = getMorphoBluePositionDataWithMarketInfo;
165
+ const getMorphoEarnDataWithMarketInfo = (data, marketInfo) => {
166
+ const loanTokenInfo = marketInfo.assetsData[marketInfo.loanToken];
167
+ const usedAssets = {
168
+ [marketInfo.loanToken]: {
169
+ symbol: loanTokenInfo.symbol,
170
+ supplied: data.amount,
171
+ borrowed: '0',
172
+ isSupplied: new decimal_js_1.default(data.amount).gt(0),
173
+ isBorrowed: false,
174
+ collateral: false,
175
+ suppliedUsd: data.amountUsd,
176
+ borrowedUsd: '0',
177
+ },
178
+ };
179
+ return Object.assign(Object.assign({}, data), { apy: (0, staking_1.calculateNetApy)({ usedAssets, assetsData: marketInfo.assetsData }).netApy });
180
+ };
181
+ exports.getMorphoEarnDataWithMarketInfo = getMorphoEarnDataWithMarketInfo;
182
+ function getMorphoBlueMarketRewards(network, selectedMarket) {
183
+ return (0, morphoBlueHelpers_1.getRewardsForMarket)(selectedMarket.marketId, network);
184
+ }
143
185
  const _getMorphoBlueAccountBalances = (provider, network, block, addressMapping, address, selectedMarket) => __awaiter(void 0, void 0, void 0, function* () {
144
186
  let balances = {
145
187
  collateral: {},
@@ -229,23 +271,10 @@ function getMorphoEarn(provider, network, account, selectedMarket, marketInfo) {
229
271
  const loanTokenInfo = marketInfo.assetsData[marketInfo.loanToken];
230
272
  const loanTokenSupplied = (0, tokens_1.assetAmountInEth)(loanInfo.suppliedInAssets.toString(), marketInfo.loanToken);
231
273
  const loanTokenSuppliedUsd = new decimal_js_1.default(loanTokenSupplied).mul(loanTokenInfo.price).toString();
232
- const usedAssets = {
233
- [marketInfo.loanToken]: {
234
- symbol: loanTokenInfo.symbol,
235
- supplied: loanTokenSupplied,
236
- borrowed: '0',
237
- isSupplied: new decimal_js_1.default(loanInfo.suppliedInAssets.toString()).gt(0),
238
- isBorrowed: false,
239
- collateral: false,
240
- suppliedUsd: loanTokenSuppliedUsd,
241
- borrowedUsd: '0',
242
- },
243
- };
244
- const { netApy } = (0, staking_1.calculateNetApy)({ usedAssets, assetsData: marketInfo.assetsData });
245
- return {
246
- apy: netApy,
274
+ return (0, exports.getMorphoEarnDataWithMarketInfo)({
275
+ apy: '0',
247
276
  amount: loanTokenSupplied,
248
277
  amountUsd: loanTokenSuppliedUsd,
249
- };
278
+ }, marketInfo);
250
279
  });
251
280
  }
@@ -151,7 +151,7 @@ function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1)
151
151
  yield Promise.allSettled([
152
152
  // === MARKET DATA (needs to be fetched first) ===
153
153
  ...morphoMarkets.map((market) => __awaiter(this, void 0, void 0, function* () {
154
- const marketData = yield (0, morphoBlue_1._getMorphoBlueMarketData)(client, network, market);
154
+ const marketData = yield (0, morphoBlue_1._getMorphoBluePortfolioMarketData)(client, network, market);
155
155
  morphoMarketsData[market.value] = marketData;
156
156
  })),
157
157
  ...compoundV3Markets.map((market) => __awaiter(this, void 0, void 0, function* () {
@@ -68,20 +68,6 @@ const getApyFromDfsApi = (asset_1, ...args_1) => __awaiter(void 0, [asset_1, ...
68
68
  return '0';
69
69
  }
70
70
  });
71
- const getWeEthApy = () => __awaiter(void 0, void 0, void 0, function* () {
72
- var _a, _b, _c;
73
- try {
74
- const res = yield fetch('https://www.ether.fi/app/cash/api/stake/weeth', { signal: AbortSignal.timeout(utils_1.DEFAULT_TIMEOUT) });
75
- if (!res.ok)
76
- throw new Error('Failed to fetch APY for weETH');
77
- const data = yield res.json();
78
- return String((_c = (_b = (_a = data.data) === null || _a === void 0 ? void 0 : _a.apy) === null || _b === void 0 ? void 0 : _b.avg30d) !== null && _c !== void 0 ? _c : '0');
79
- }
80
- catch (e) {
81
- console.error('External API Failure: Failed to fetch APY for weETH from ether.fi API', e);
82
- return '0';
83
- }
84
- });
85
71
  exports.STAKING_ASSETS = [
86
72
  'cbETH', 'wstETH', 'cbETH', 'rETH', 'sDAI', 'weETH', 'sUSDe', 'osETH',
87
73
  'ezETH', 'ETHx', 'rsETH', 'pufETH', 'wrsETH', 'wsuperOETHb', 'sUSDS', 'tETH', 'PT sUSDe Sep', 'PT USDe Sep',
@@ -102,7 +88,7 @@ exports.getStakingApy = (0, memoizee_1.default)((asset_1, ...args_1) => __awaite
102
88
  if (asset === 'sUSDe')
103
89
  return yield getApyFromDfsApi('sUSDe');
104
90
  if (asset === 'weETH')
105
- return yield getWeEthApy();
91
+ return yield getApyFromDfsApi('weETH');
106
92
  if (asset === 'ezETH')
107
93
  return yield getApyFromDfsApi('ezETH');
108
94
  if (asset === 'osETH')
@@ -212,6 +212,15 @@ export interface MorphoBluePositionData {
212
212
  borrowShares: string;
213
213
  exposure: string;
214
214
  }
215
+ export interface MorphoBlueEarnData {
216
+ apy: string;
217
+ amount: string;
218
+ amountUsd: string;
219
+ }
220
+ export interface MorphoBlueMarketRewards {
221
+ supplyApy: string;
222
+ borrowApy: string;
223
+ }
215
224
  export interface MorphoBlueVault {
216
225
  address: string;
217
226
  }
@@ -106,6 +106,7 @@ export const getCompoundV2AggregatedData = (_a) => {
106
106
  payload.totalInterestUsd = totalInterestUsd;
107
107
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
108
108
  payload.leveragedType = leveragedType;
109
+ payload.liquidationPrice = '';
109
110
  if (leveragedType !== '') {
110
111
  payload.leveragedAsset = leveragedAsset;
111
112
  const assetPrice = assetsData[handleWbtcLegacy(leveragedAsset)].price;
@@ -138,6 +139,7 @@ export const getCompoundV3AggregatedData = (_a) => {
138
139
  payload.minDebt = assetsData[selectedMarket.baseAsset].minDebt;
139
140
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets, selectedMarket.value === CompoundVersions.CompoundV3ETH ? 0.001 : 5);
140
141
  payload.leveragedType = leveragedType;
142
+ payload.liquidationPrice = '';
141
143
  if (leveragedType !== '') {
142
144
  payload.leveragedAsset = leveragedAsset;
143
145
  let assetPrice = assetsData[leveragedAsset].price;
@@ -35,6 +35,7 @@ export const getCrvUsdAggregatedData = (_a) => {
35
35
  : '0';
36
36
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
37
37
  payload.leveragedType = leveragedType;
38
+ payload.liquidationPrice = '';
38
39
  if (leveragedType !== '') {
39
40
  payload.leveragedAsset = leveragedAsset;
40
41
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, usedAssets[selectedMarket.collAsset].price, payload.borrowedUsd, payload.borrowLimitUsd);
@@ -103,6 +103,7 @@ export const getEulerV2AggregatedData = (_a) => {
103
103
  payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
104
104
  const { leveragedType, leveragedAsset, leveragedVault } = isLeveragedPos(usedAssets);
105
105
  payload.leveragedType = leveragedType;
106
+ payload.liquidationPrice = '';
106
107
  if (leveragedType !== '') {
107
108
  payload.leveragedAsset = leveragedAsset;
108
109
  let assetPrice = assetsData[leveragedVault.toLowerCase()].price;
@@ -47,6 +47,7 @@ export const getFluidAggregatedData = ({ usedAssets, assetsData, marketData, },
47
47
  payload.minRatio = marketData.minRatio;
48
48
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
49
49
  payload.leveragedType = leveragedType;
50
+ payload.liquidationPrice = '';
50
51
  if (leveragedType !== '') {
51
52
  payload.leveragedAsset = leveragedAsset;
52
53
  let assetPrice = assetsData[leveragedAsset].price;
@@ -43,6 +43,7 @@ export const getLlamaLendAggregatedData = (_a) => {
43
43
  : '0';
44
44
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
45
45
  payload.leveragedType = leveragedType;
46
+ payload.liquidationPrice = '';
46
47
  if (leveragedType !== '') {
47
48
  payload.leveragedAsset = leveragedAsset;
48
49
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, usedAssets[collAsset].price, payload.borrowedUsd, payload.borrowLimitUsd);
@@ -42,6 +42,7 @@ export const getMorphoBlueAggregatedPositionData = ({ usedAssets, assetsData, ma
42
42
  .toString();
43
43
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
44
44
  payload.leveragedType = leveragedType;
45
+ payload.liquidationPrice = '';
45
46
  if (leveragedType !== '') {
46
47
  payload.leveragedAsset = leveragedAsset;
47
48
  let assetPrice = assetsData[leveragedAsset].price;
@@ -347,6 +348,7 @@ export const getRewardsForMarket = (marketId_1, ...args_1) => __awaiter(void 0,
347
348
  query: REWARDS_QUERY,
348
349
  variables: { marketId, chainId: network },
349
350
  }),
351
+ signal: AbortSignal.timeout(LONGER_TIMEOUT),
350
352
  });
351
353
  const data = yield response.json();
352
354
  const marketData = (_a = data === null || data === void 0 ? void 0 : data.data) === null || _a === void 0 ? void 0 : _a.marketById;
@@ -78,6 +78,7 @@ export const sparkGetAggregatedPositionData = (_a) => {
78
78
  payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
79
79
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
80
80
  payload.leveragedType = leveragedType;
81
+ payload.liquidationPrice = '';
81
82
  if (leveragedType !== '') {
82
83
  payload.leveragedAsset = leveragedAsset;
83
84
  let assetPrice = data.assetsData[leveragedAsset].price; // TODO sparkPrice or price??
@@ -1,14 +1,16 @@
1
1
  import { Client } from 'viem';
2
2
  import { Blockish, EthAddress, EthereumProvider, NetworkNumber, PositionBalances } from '../types/common';
3
- import { MorphoBlueMarketData, MorphoBlueMarketInfo, MorphoBluePositionData } from '../types';
3
+ import { MorphoBlueEarnData, MorphoBlueMarketData, MorphoBlueMarketInfo, MorphoBlueMarketRewards, MorphoBluePositionData } from '../types';
4
+ export declare const addMorphoBlueRewardsToMarketInfo: (marketInfo: MorphoBlueMarketInfo, rewards: MorphoBlueMarketRewards) => MorphoBlueMarketInfo;
4
5
  export declare function _getMorphoBlueMarketData(provider: Client, network: NetworkNumber, selectedMarket: MorphoBlueMarketData): Promise<MorphoBlueMarketInfo>;
6
+ export declare function _getMorphoBluePortfolioMarketData(provider: Client, network: NetworkNumber, selectedMarket: MorphoBlueMarketData): Promise<MorphoBlueMarketInfo>;
5
7
  export declare function getMorphoBlueMarketData(provider: EthereumProvider, network: NetworkNumber, selectedMarket: MorphoBlueMarketData): Promise<MorphoBlueMarketInfo>;
8
+ export declare function getMorphoBluePortfolioMarketData(provider: EthereumProvider, network: NetworkNumber, selectedMarket: MorphoBlueMarketData): Promise<MorphoBlueMarketInfo>;
9
+ export declare const getMorphoBluePositionDataWithMarketInfo: (data: MorphoBluePositionData, marketInfo: MorphoBlueMarketInfo) => MorphoBluePositionData;
10
+ export declare const getMorphoEarnDataWithMarketInfo: (data: MorphoBlueEarnData, marketInfo: MorphoBlueMarketInfo) => MorphoBlueEarnData;
11
+ export declare function getMorphoBlueMarketRewards(network: NetworkNumber, selectedMarket: MorphoBlueMarketData): Promise<MorphoBlueMarketRewards>;
6
12
  export declare const _getMorphoBlueAccountBalances: (provider: Client, network: NetworkNumber, block: Blockish, addressMapping: boolean, address: EthAddress, selectedMarket: MorphoBlueMarketData) => Promise<PositionBalances>;
7
13
  export declare const getMorphoBlueAccountBalances: (provider: EthereumProvider, network: NetworkNumber, block: Blockish, addressMapping: boolean, address: EthAddress, selectedMarket: MorphoBlueMarketData) => Promise<PositionBalances>;
8
14
  export declare function _getMorphoBlueAccountData(provider: Client, network: NetworkNumber, account: EthAddress, selectedMarket: MorphoBlueMarketData, marketInfo: MorphoBlueMarketInfo): Promise<MorphoBluePositionData>;
9
15
  export declare function getMorphoBlueAccountData(provider: EthereumProvider, network: NetworkNumber, account: EthAddress, selectedMarket: MorphoBlueMarketData, marketInfo: MorphoBlueMarketInfo): Promise<MorphoBluePositionData>;
10
- export declare function getMorphoEarn(provider: Client, network: NetworkNumber, account: EthAddress, selectedMarket: MorphoBlueMarketData, marketInfo: MorphoBlueMarketInfo): Promise<{
11
- apy: string;
12
- amount: string;
13
- amountUsd: string;
14
- }>;
16
+ export declare function getMorphoEarn(provider: Client, network: NetworkNumber, account: EthAddress, selectedMarket: MorphoBlueMarketData, marketInfo: MorphoBlueMarketInfo): Promise<MorphoBlueEarnData>;
@@ -18,7 +18,20 @@ import { getBorrowRate, getMorphoBlueAggregatedPositionData, getRewardsForMarket
18
18
  import { getChainlinkAssetAddress } from '../services/priceService';
19
19
  import { getViemProvider, setViemBlockNumber } from '../services/viem';
20
20
  const HARDCODED_USD_STABLE_PRICE = '100000000'; // $1 with 8 decimals
21
- export function _getMorphoBlueMarketData(provider, network, selectedMarket) {
21
+ const getMorphoRewardIncentives = (apy) => [{
22
+ token: 'MORPHO',
23
+ apy,
24
+ incentiveKind: IncentiveKind.Reward,
25
+ description: 'Eligible for protocol-level MORPHO incentives.',
26
+ }];
27
+ export const addMorphoBlueRewardsToMarketInfo = (marketInfo, rewards) => (Object.assign(Object.assign({}, marketInfo), { assetsData: Object.assign(Object.assign({}, marketInfo.assetsData), { [marketInfo.loanToken]: Object.assign(Object.assign({}, marketInfo.assetsData[marketInfo.loanToken]), { supplyIncentives: [
28
+ ...marketInfo.assetsData[marketInfo.loanToken].supplyIncentives.filter(({ token }) => token !== 'MORPHO'),
29
+ ...getMorphoRewardIncentives(rewards.supplyApy),
30
+ ], borrowIncentives: [
31
+ ...marketInfo.assetsData[marketInfo.loanToken].borrowIncentives.filter(({ token }) => token !== 'MORPHO'),
32
+ ...getMorphoRewardIncentives(rewards.borrowApy),
33
+ ] }) }) }));
34
+ function getMorphoBlueMarketDataInternal(provider, network, selectedMarket) {
22
35
  return __awaiter(this, void 0, void 0, function* () {
23
36
  const { loanToken, collateralToken, oracle, irm, lltv, oracleType, } = selectedMarket;
24
37
  const lltvInWei = new Dec(lltv).mul(WAD).toString();
@@ -50,16 +63,6 @@ export function _getMorphoBlueMarketData(provider, network, selectedMarket) {
50
63
  marketInfo = _marketInfo;
51
64
  loanTokenPrice = loanTokenPriceRound[1].toString();
52
65
  }
53
- let morphoSupplyApy = '0';
54
- let morphoBorrowApy = '0';
55
- try {
56
- const { supplyApy: _morphoSupplyApy, borrowApy: _morphoBorrowApy } = yield getRewardsForMarket(selectedMarket.marketId, network);
57
- morphoSupplyApy = _morphoSupplyApy;
58
- morphoBorrowApy = _morphoBorrowApy;
59
- }
60
- catch (e) {
61
- console.error(e);
62
- }
63
66
  const supplyRate = getSupplyRate(marketInfo.totalSupplyAssets.toString(), marketInfo.totalBorrowAssets.toString(), marketInfo.borrowRate.toString(), marketInfo.fee.toString());
64
67
  const compoundedBorrowRate = getBorrowRate(marketInfo.borrowRate.toString(), marketInfo.totalBorrowShares.toString());
65
68
  const utillization = new Dec(marketInfo.totalBorrowAssets.toString()).div(marketInfo.totalSupplyAssets.toString()).mul(100).toString();
@@ -78,18 +81,8 @@ export function _getMorphoBlueMarketData(provider, network, selectedMarket) {
78
81
  totalBorrow: new Dec(marketInfo.totalBorrowAssets.toString()).div(scale).toString(),
79
82
  canBeSupplied: true,
80
83
  canBeBorrowed: true,
81
- supplyIncentives: [{
82
- token: 'MORPHO',
83
- apy: morphoSupplyApy,
84
- incentiveKind: IncentiveKind.Reward,
85
- description: 'Eligible for protocol-level MORPHO incentives.',
86
- }],
87
- borrowIncentives: [{
88
- token: 'MORPHO',
89
- apy: morphoBorrowApy,
90
- incentiveKind: IncentiveKind.Reward,
91
- description: 'Eligible for protocol-level MORPHO incentives.',
92
- }],
84
+ supplyIncentives: [],
85
+ borrowIncentives: [],
93
86
  };
94
87
  assetsData[wethToEth(collateralTokenInfo.symbol)] = {
95
88
  symbol: wethToEth(collateralTokenInfo.symbol),
@@ -124,11 +117,54 @@ export function _getMorphoBlueMarketData(provider, network, selectedMarket) {
124
117
  };
125
118
  });
126
119
  }
120
+ export function _getMorphoBlueMarketData(provider, network, selectedMarket) {
121
+ return __awaiter(this, void 0, void 0, function* () {
122
+ const marketInfo = yield getMorphoBlueMarketDataInternal(provider, network, selectedMarket);
123
+ try {
124
+ const rewards = yield getRewardsForMarket(selectedMarket.marketId, network);
125
+ return addMorphoBlueRewardsToMarketInfo(marketInfo, rewards);
126
+ }
127
+ catch (error) {
128
+ console.error(error);
129
+ return addMorphoBlueRewardsToMarketInfo(marketInfo, { supplyApy: '0', borrowApy: '0' });
130
+ }
131
+ });
132
+ }
133
+ export function _getMorphoBluePortfolioMarketData(provider, network, selectedMarket) {
134
+ return getMorphoBlueMarketDataInternal(provider, network, selectedMarket);
135
+ }
127
136
  export function getMorphoBlueMarketData(provider, network, selectedMarket) {
128
137
  return __awaiter(this, void 0, void 0, function* () {
129
138
  return _getMorphoBlueMarketData(getViemProvider(provider, network), network, selectedMarket);
130
139
  });
131
140
  }
141
+ export function getMorphoBluePortfolioMarketData(provider, network, selectedMarket) {
142
+ return _getMorphoBluePortfolioMarketData(getViemProvider(provider, network), network, selectedMarket);
143
+ }
144
+ export const getMorphoBluePositionDataWithMarketInfo = (data, marketInfo) => (Object.assign(Object.assign({}, data), getMorphoBlueAggregatedPositionData({
145
+ usedAssets: data.usedAssets,
146
+ assetsData: marketInfo.assetsData,
147
+ marketInfo,
148
+ })));
149
+ export const getMorphoEarnDataWithMarketInfo = (data, marketInfo) => {
150
+ const loanTokenInfo = marketInfo.assetsData[marketInfo.loanToken];
151
+ const usedAssets = {
152
+ [marketInfo.loanToken]: {
153
+ symbol: loanTokenInfo.symbol,
154
+ supplied: data.amount,
155
+ borrowed: '0',
156
+ isSupplied: new Dec(data.amount).gt(0),
157
+ isBorrowed: false,
158
+ collateral: false,
159
+ suppliedUsd: data.amountUsd,
160
+ borrowedUsd: '0',
161
+ },
162
+ };
163
+ return Object.assign(Object.assign({}, data), { apy: calculateNetApy({ usedAssets, assetsData: marketInfo.assetsData }).netApy });
164
+ };
165
+ export function getMorphoBlueMarketRewards(network, selectedMarket) {
166
+ return getRewardsForMarket(selectedMarket.marketId, network);
167
+ }
132
168
  export const _getMorphoBlueAccountBalances = (provider, network, block, addressMapping, address, selectedMarket) => __awaiter(void 0, void 0, void 0, function* () {
133
169
  let balances = {
134
170
  collateral: {},
@@ -216,23 +252,10 @@ export function getMorphoEarn(provider, network, account, selectedMarket, market
216
252
  const loanTokenInfo = marketInfo.assetsData[marketInfo.loanToken];
217
253
  const loanTokenSupplied = assetAmountInEth(loanInfo.suppliedInAssets.toString(), marketInfo.loanToken);
218
254
  const loanTokenSuppliedUsd = new Dec(loanTokenSupplied).mul(loanTokenInfo.price).toString();
219
- const usedAssets = {
220
- [marketInfo.loanToken]: {
221
- symbol: loanTokenInfo.symbol,
222
- supplied: loanTokenSupplied,
223
- borrowed: '0',
224
- isSupplied: new Dec(loanInfo.suppliedInAssets.toString()).gt(0),
225
- isBorrowed: false,
226
- collateral: false,
227
- suppliedUsd: loanTokenSuppliedUsd,
228
- borrowedUsd: '0',
229
- },
230
- };
231
- const { netApy } = calculateNetApy({ usedAssets, assetsData: marketInfo.assetsData });
232
- return {
233
- apy: netApy,
255
+ return getMorphoEarnDataWithMarketInfo({
256
+ apy: '0',
234
257
  amount: loanTokenSupplied,
235
258
  amountUsd: loanTokenSuppliedUsd,
236
- };
259
+ }, marketInfo);
237
260
  });
238
261
  }
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  import Dec from 'decimal.js';
11
11
  import { NetworkNumber } from '../types/common';
12
12
  import { AaveMarkets, AaveV4Spokes, CompoundMarkets, CrvUsdMarkets, EulerV2Markets, LiquityV2Markets, LlamaLendMarkets, MorphoBlueMarkets, SparkMarkets, } from '../markets';
13
- import { _getMorphoBlueAccountData, _getMorphoBlueMarketData, getMorphoEarn } from '../morphoBlue';
13
+ import { _getMorphoBlueAccountData, _getMorphoBluePortfolioMarketData, getMorphoEarn } from '../morphoBlue';
14
14
  import { AaveVersions, CompoundVersions, } from '../types';
15
15
  import { _getCompoundV3AccountData, _getCompoundV3MarketsData } from '../compoundV3';
16
16
  import { _getSparkAccountData, _getSparkMarketsData } from '../spark';
@@ -131,7 +131,7 @@ export function getPortfolioData(provider_1, network_1, defaultProvider_1, addre
131
131
  yield Promise.allSettled([
132
132
  // === MARKET DATA (needs to be fetched first) ===
133
133
  ...morphoMarkets.map((market) => __awaiter(this, void 0, void 0, function* () {
134
- const marketData = yield _getMorphoBlueMarketData(client, network, market);
134
+ const marketData = yield _getMorphoBluePortfolioMarketData(client, network, market);
135
135
  morphoMarketsData[market.value] = marketData;
136
136
  })),
137
137
  ...compoundV3Markets.map((market) => __awaiter(this, void 0, void 0, function* () {
@@ -62,20 +62,6 @@ const getApyFromDfsApi = (asset_1, ...args_1) => __awaiter(void 0, [asset_1, ...
62
62
  return '0';
63
63
  }
64
64
  });
65
- const getWeEthApy = () => __awaiter(void 0, void 0, void 0, function* () {
66
- var _a, _b, _c;
67
- try {
68
- const res = yield fetch('https://www.ether.fi/app/cash/api/stake/weeth', { signal: AbortSignal.timeout(DEFAULT_TIMEOUT) });
69
- if (!res.ok)
70
- throw new Error('Failed to fetch APY for weETH');
71
- const data = yield res.json();
72
- return String((_c = (_b = (_a = data.data) === null || _a === void 0 ? void 0 : _a.apy) === null || _b === void 0 ? void 0 : _b.avg30d) !== null && _c !== void 0 ? _c : '0');
73
- }
74
- catch (e) {
75
- console.error('External API Failure: Failed to fetch APY for weETH from ether.fi API', e);
76
- return '0';
77
- }
78
- });
79
65
  export const STAKING_ASSETS = [
80
66
  'cbETH', 'wstETH', 'cbETH', 'rETH', 'sDAI', 'weETH', 'sUSDe', 'osETH',
81
67
  'ezETH', 'ETHx', 'rsETH', 'pufETH', 'wrsETH', 'wsuperOETHb', 'sUSDS', 'tETH', 'PT sUSDe Sep', 'PT USDe Sep',
@@ -96,7 +82,7 @@ export const getStakingApy = memoize((asset_1, ...args_1) => __awaiter(void 0, [
96
82
  if (asset === 'sUSDe')
97
83
  return yield getApyFromDfsApi('sUSDe');
98
84
  if (asset === 'weETH')
99
- return yield getWeEthApy();
85
+ return yield getApyFromDfsApi('weETH');
100
86
  if (asset === 'ezETH')
101
87
  return yield getApyFromDfsApi('ezETH');
102
88
  if (asset === 'osETH')
@@ -212,6 +212,15 @@ export interface MorphoBluePositionData {
212
212
  borrowShares: string;
213
213
  exposure: string;
214
214
  }
215
+ export interface MorphoBlueEarnData {
216
+ apy: string;
217
+ amount: string;
218
+ amountUsd: string;
219
+ }
220
+ export interface MorphoBlueMarketRewards {
221
+ supplyApy: string;
222
+ borrowApy: string;
223
+ }
215
224
  export interface MorphoBlueVault {
216
225
  address: string;
217
226
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defisaver/positions-sdk",
3
- "version": "2.1.126-dev",
3
+ "version": "2.1.127-dev",
4
4
  "description": "",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./esm/index.js",
@@ -155,6 +155,7 @@ export const getCompoundV2AggregatedData = ({
155
155
 
156
156
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
157
157
  payload.leveragedType = leveragedType;
158
+ payload.liquidationPrice = '';
158
159
  if (leveragedType !== '') {
159
160
  payload.leveragedAsset = leveragedAsset;
160
161
  const assetPrice = assetsData[handleWbtcLegacy(leveragedAsset)].price;
@@ -189,6 +190,7 @@ export const getCompoundV3AggregatedData = ({
189
190
  payload.minDebt = assetsData[selectedMarket.baseAsset].minDebt;
190
191
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets, selectedMarket.value === CompoundVersions.CompoundV3ETH ? 0.001 : 5);
191
192
  payload.leveragedType = leveragedType;
193
+ payload.liquidationPrice = '';
192
194
  if (leveragedType !== '') {
193
195
  payload.leveragedAsset = leveragedAsset;
194
196
  let assetPrice = assetsData[leveragedAsset].price;
@@ -34,6 +34,7 @@ export const getCrvUsdAggregatedData = ({
34
34
 
35
35
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets as unknown as MMUsedAssets);
36
36
  payload.leveragedType = leveragedType;
37
+ payload.liquidationPrice = '';
37
38
  if (leveragedType !== '') {
38
39
  payload.leveragedAsset = leveragedAsset;
39
40
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, usedAssets[selectedMarket.collAsset].price, payload.borrowedUsd, payload.borrowLimitUsd);
@@ -96,6 +96,7 @@ export const getEulerV2AggregatedData = ({
96
96
  payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
97
97
  const { leveragedType, leveragedAsset, leveragedVault } = isLeveragedPos(usedAssets);
98
98
  payload.leveragedType = leveragedType;
99
+ payload.liquidationPrice = '';
99
100
  if (leveragedType !== '') {
100
101
  payload.leveragedAsset = leveragedAsset;
101
102
  let assetPrice = assetsData[leveragedVault.toLowerCase()].price;
@@ -83,6 +83,7 @@ borrowShares?: string,
83
83
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
84
84
 
85
85
  payload.leveragedType = leveragedType;
86
+ payload.liquidationPrice = '';
86
87
  if (leveragedType !== '') {
87
88
  payload.leveragedAsset = leveragedAsset;
88
89
  let assetPrice = assetsData[leveragedAsset].price;
@@ -46,6 +46,7 @@ export const getLlamaLendAggregatedData = ({
46
46
 
47
47
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets as unknown as MMUsedAssets);
48
48
  payload.leveragedType = leveragedType;
49
+ payload.liquidationPrice = '';
49
50
  if (leveragedType !== '') {
50
51
  payload.leveragedAsset = leveragedAsset;
51
52
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, usedAssets[collAsset].price, payload.borrowedUsd, payload.borrowLimitUsd);
@@ -55,6 +55,7 @@ export const getMorphoBlueAggregatedPositionData = ({ usedAssets, assetsData, ma
55
55
 
56
56
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
57
57
  payload.leveragedType = leveragedType;
58
+ payload.liquidationPrice = '';
58
59
  if (leveragedType !== '') {
59
60
  payload.leveragedAsset = leveragedAsset;
60
61
  let assetPrice = assetsData[leveragedAsset].price;
@@ -388,6 +389,7 @@ export const getRewardsForMarket = async (marketId: string, network: NetworkNumb
388
389
  query: REWARDS_QUERY,
389
390
  variables: { marketId, chainId: network },
390
391
  }),
392
+ signal: AbortSignal.timeout(LONGER_TIMEOUT),
391
393
  });
392
394
 
393
395
  const data = await response.json();
@@ -104,6 +104,7 @@ export const sparkGetAggregatedPositionData = ({
104
104
  payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
105
105
  const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
106
106
  payload.leveragedType = leveragedType;
107
+ payload.liquidationPrice = '';
107
108
  if (leveragedType !== '') {
108
109
  payload.leveragedAsset = leveragedAsset;
109
110
  let assetPrice = data.assetsData[leveragedAsset].price; // TODO sparkPrice or price??
@@ -8,7 +8,7 @@ import {
8
8
  DFSFeedRegistryContractViem, FeedRegistryContractViem, MorphoBlueViewContractViem,
9
9
  } from '../contracts';
10
10
  import {
11
- MorphoBlueAssetsData, MorphoBlueMarketData, MorphoBlueMarketInfo, MorphoBluePositionData,
11
+ MorphoBlueAssetsData, MorphoBlueEarnData, MorphoBlueMarketData, MorphoBlueMarketInfo, MorphoBlueMarketRewards, MorphoBluePositionData,
12
12
  } from '../types';
13
13
  import { USD_QUOTE, WAD } from '../constants';
14
14
  import { calculateNetApy, getStakingApy, STAKING_ASSETS } from '../staking';
@@ -21,7 +21,39 @@ import { getViemProvider, setViemBlockNumber } from '../services/viem';
21
21
 
22
22
  const HARDCODED_USD_STABLE_PRICE = '100000000'; // $1 with 8 decimals
23
23
 
24
- export async function _getMorphoBlueMarketData(provider: Client, network: NetworkNumber, selectedMarket: MorphoBlueMarketData): Promise<MorphoBlueMarketInfo> {
24
+ const getMorphoRewardIncentives = (apy: string) => [{
25
+ token: 'MORPHO',
26
+ apy,
27
+ incentiveKind: IncentiveKind.Reward,
28
+ description: 'Eligible for protocol-level MORPHO incentives.',
29
+ }];
30
+
31
+ export const addMorphoBlueRewardsToMarketInfo = (
32
+ marketInfo: MorphoBlueMarketInfo,
33
+ rewards: MorphoBlueMarketRewards,
34
+ ): MorphoBlueMarketInfo => ({
35
+ ...marketInfo,
36
+ assetsData: {
37
+ ...marketInfo.assetsData,
38
+ [marketInfo.loanToken]: {
39
+ ...marketInfo.assetsData[marketInfo.loanToken],
40
+ supplyIncentives: [
41
+ ...marketInfo.assetsData[marketInfo.loanToken].supplyIncentives.filter(({ token }) => token !== 'MORPHO'),
42
+ ...getMorphoRewardIncentives(rewards.supplyApy),
43
+ ],
44
+ borrowIncentives: [
45
+ ...marketInfo.assetsData[marketInfo.loanToken].borrowIncentives.filter(({ token }) => token !== 'MORPHO'),
46
+ ...getMorphoRewardIncentives(rewards.borrowApy),
47
+ ],
48
+ },
49
+ },
50
+ });
51
+
52
+ async function getMorphoBlueMarketDataInternal(
53
+ provider: Client,
54
+ network: NetworkNumber,
55
+ selectedMarket: MorphoBlueMarketData,
56
+ ): Promise<MorphoBlueMarketInfo> {
25
57
  const {
26
58
  loanToken, collateralToken, oracle, irm, lltv, oracleType,
27
59
  } = selectedMarket;
@@ -59,16 +91,6 @@ export async function _getMorphoBlueMarketData(provider: Client, network: Networ
59
91
  loanTokenPrice = loanTokenPriceRound[1].toString();
60
92
  }
61
93
 
62
- let morphoSupplyApy = '0';
63
- let morphoBorrowApy = '0';
64
- try {
65
- const { supplyApy: _morphoSupplyApy, borrowApy: _morphoBorrowApy } = await getRewardsForMarket(selectedMarket.marketId, network);
66
- morphoSupplyApy = _morphoSupplyApy;
67
- morphoBorrowApy = _morphoBorrowApy;
68
- } catch (e) {
69
- console.error(e);
70
- }
71
-
72
94
  const supplyRate = getSupplyRate(marketInfo.totalSupplyAssets.toString(), marketInfo.totalBorrowAssets.toString(), marketInfo.borrowRate.toString(), marketInfo.fee.toString());
73
95
  const compoundedBorrowRate = getBorrowRate(marketInfo.borrowRate.toString(), marketInfo.totalBorrowShares.toString());
74
96
  const utillization = new Dec(marketInfo.totalBorrowAssets.toString()).div(marketInfo.totalSupplyAssets.toString()).mul(100).toString();
@@ -90,18 +112,8 @@ export async function _getMorphoBlueMarketData(provider: Client, network: Networ
90
112
  totalBorrow: new Dec(marketInfo.totalBorrowAssets.toString()).div(scale).toString(),
91
113
  canBeSupplied: true,
92
114
  canBeBorrowed: true,
93
- supplyIncentives: [{
94
- token: 'MORPHO',
95
- apy: morphoSupplyApy,
96
- incentiveKind: IncentiveKind.Reward,
97
- description: 'Eligible for protocol-level MORPHO incentives.',
98
- }],
99
- borrowIncentives: [{
100
- token: 'MORPHO',
101
- apy: morphoBorrowApy,
102
- incentiveKind: IncentiveKind.Reward,
103
- description: 'Eligible for protocol-level MORPHO incentives.',
104
- }],
115
+ supplyIncentives: [],
116
+ borrowIncentives: [],
105
117
  };
106
118
 
107
119
  assetsData[wethToEth(collateralTokenInfo.symbol)] = {
@@ -138,10 +150,70 @@ export async function _getMorphoBlueMarketData(provider: Client, network: Networ
138
150
  };
139
151
  }
140
152
 
153
+ export async function _getMorphoBlueMarketData(provider: Client, network: NetworkNumber, selectedMarket: MorphoBlueMarketData): Promise<MorphoBlueMarketInfo> {
154
+ const marketInfo = await getMorphoBlueMarketDataInternal(provider, network, selectedMarket);
155
+
156
+ try {
157
+ const rewards = await getRewardsForMarket(selectedMarket.marketId, network);
158
+ return addMorphoBlueRewardsToMarketInfo(marketInfo, rewards);
159
+ } catch (error) {
160
+ console.error(error);
161
+ return addMorphoBlueRewardsToMarketInfo(marketInfo, { supplyApy: '0', borrowApy: '0' });
162
+ }
163
+ }
164
+
165
+ export function _getMorphoBluePortfolioMarketData(provider: Client, network: NetworkNumber, selectedMarket: MorphoBlueMarketData): Promise<MorphoBlueMarketInfo> {
166
+ return getMorphoBlueMarketDataInternal(provider, network, selectedMarket);
167
+ }
168
+
141
169
  export async function getMorphoBlueMarketData(provider: EthereumProvider, network: NetworkNumber, selectedMarket: MorphoBlueMarketData): Promise<MorphoBlueMarketInfo> {
142
170
  return _getMorphoBlueMarketData(getViemProvider(provider, network), network, selectedMarket);
143
171
  }
144
172
 
173
+ export function getMorphoBluePortfolioMarketData(provider: EthereumProvider, network: NetworkNumber, selectedMarket: MorphoBlueMarketData): Promise<MorphoBlueMarketInfo> {
174
+ return _getMorphoBluePortfolioMarketData(getViemProvider(provider, network), network, selectedMarket);
175
+ }
176
+
177
+ export const getMorphoBluePositionDataWithMarketInfo = (
178
+ data: MorphoBluePositionData,
179
+ marketInfo: MorphoBlueMarketInfo,
180
+ ): MorphoBluePositionData => ({
181
+ ...data,
182
+ ...getMorphoBlueAggregatedPositionData({
183
+ usedAssets: data.usedAssets,
184
+ assetsData: marketInfo.assetsData,
185
+ marketInfo,
186
+ }),
187
+ });
188
+
189
+ export const getMorphoEarnDataWithMarketInfo = (data: MorphoBlueEarnData, marketInfo: MorphoBlueMarketInfo): MorphoBlueEarnData => {
190
+ const loanTokenInfo = marketInfo.assetsData[marketInfo.loanToken];
191
+ const usedAssets: MMUsedAssets = {
192
+ [marketInfo.loanToken]: {
193
+ symbol: loanTokenInfo.symbol,
194
+ supplied: data.amount,
195
+ borrowed: '0',
196
+ isSupplied: new Dec(data.amount).gt(0),
197
+ isBorrowed: false,
198
+ collateral: false,
199
+ suppliedUsd: data.amountUsd,
200
+ borrowedUsd: '0',
201
+ },
202
+ };
203
+
204
+ return {
205
+ ...data,
206
+ apy: calculateNetApy({ usedAssets, assetsData: marketInfo.assetsData as unknown as MMAssetsData }).netApy,
207
+ };
208
+ };
209
+
210
+ export function getMorphoBlueMarketRewards(
211
+ network: NetworkNumber,
212
+ selectedMarket: MorphoBlueMarketData,
213
+ ): Promise<MorphoBlueMarketRewards> {
214
+ return getRewardsForMarket(selectedMarket.marketId, network);
215
+ }
216
+
145
217
  export const _getMorphoBlueAccountBalances = async (provider: Client, network: NetworkNumber, block: Blockish, addressMapping: boolean, address: EthAddress, selectedMarket: MorphoBlueMarketData): Promise<PositionBalances> => {
146
218
  let balances: PositionBalances = {
147
219
  collateral: {},
@@ -238,7 +310,7 @@ export async function getMorphoBlueAccountData(provider: EthereumProvider, netwo
238
310
  return _getMorphoBlueAccountData(getViemProvider(provider, network), network, account, selectedMarket, marketInfo);
239
311
  }
240
312
 
241
- export async function getMorphoEarn(provider: Client, network: NetworkNumber, account: EthAddress, selectedMarket: MorphoBlueMarketData, marketInfo: MorphoBlueMarketInfo): Promise<{ apy: string, amount: string, amountUsd: string }> {
313
+ export async function getMorphoEarn(provider: Client, network: NetworkNumber, account: EthAddress, selectedMarket: MorphoBlueMarketData, marketInfo: MorphoBlueMarketInfo): Promise<MorphoBlueEarnData> {
242
314
  const {
243
315
  loanToken, collateralToken, oracle, irm, lltv,
244
316
  } = selectedMarket;
@@ -254,24 +326,9 @@ export async function getMorphoEarn(provider: Client, network: NetworkNumber, ac
254
326
  const loanTokenInfo = marketInfo.assetsData[marketInfo.loanToken];
255
327
  const loanTokenSupplied = assetAmountInEth(loanInfo.suppliedInAssets.toString(), marketInfo.loanToken);
256
328
  const loanTokenSuppliedUsd = new Dec(loanTokenSupplied).mul(loanTokenInfo.price).toString();
257
- const usedAssets: MMUsedAssets = {
258
- [marketInfo.loanToken]: {
259
- symbol: loanTokenInfo.symbol,
260
- supplied: loanTokenSupplied,
261
- borrowed: '0',
262
- isSupplied: new Dec(loanInfo.suppliedInAssets.toString()).gt(0),
263
- isBorrowed: false,
264
- collateral: false,
265
- suppliedUsd: loanTokenSuppliedUsd,
266
- borrowedUsd: '0',
267
- },
268
- };
269
-
270
- const { netApy } = calculateNetApy({ usedAssets, assetsData: marketInfo.assetsData as unknown as MMAssetsData });
271
-
272
- return {
273
- apy: netApy,
329
+ return getMorphoEarnDataWithMarketInfo({
330
+ apy: '0',
274
331
  amount: loanTokenSupplied,
275
332
  amountUsd: loanTokenSuppliedUsd,
276
- };
277
- }
333
+ }, marketInfo);
334
+ }
@@ -11,7 +11,7 @@ import {
11
11
  MorphoBlueMarkets,
12
12
  SparkMarkets,
13
13
  } from '../markets';
14
- import { _getMorphoBlueAccountData, _getMorphoBlueMarketData, getMorphoEarn } from '../morphoBlue';
14
+ import { _getMorphoBlueAccountData, _getMorphoBluePortfolioMarketData, getMorphoEarn } from '../morphoBlue';
15
15
  import {
16
16
  AaveV2MarketData,
17
17
  AaveV3MarketData,
@@ -162,7 +162,7 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
162
162
  await Promise.allSettled([
163
163
  // === MARKET DATA (needs to be fetched first) ===
164
164
  ...morphoMarkets.map(async (market) => {
165
- const marketData = await _getMorphoBlueMarketData(client, network, market);
165
+ const marketData = await _getMorphoBluePortfolioMarketData(client, network, market);
166
166
  morphoMarketsData[market.value] = marketData;
167
167
  }),
168
168
  ...compoundV3Markets.map(async (market) => {
@@ -60,19 +60,6 @@ const getApyFromDfsApi = async (asset: string, network: number = NetworkNumber.E
60
60
  }
61
61
  };
62
62
 
63
- const getWeEthApy = async () => {
64
- try {
65
- const res = await fetch('https://www.ether.fi/app/cash/api/stake/weeth',
66
- { signal: AbortSignal.timeout(DEFAULT_TIMEOUT) });
67
- if (!res.ok) throw new Error('Failed to fetch APY for weETH');
68
- const data = await res.json();
69
- return String(data.data?.apy?.avg30d ?? '0');
70
- } catch (e) {
71
- console.error('External API Failure: Failed to fetch APY for weETH from ether.fi API', e);
72
- return '0';
73
- }
74
- };
75
-
76
63
  export const STAKING_ASSETS = [
77
64
  'cbETH', 'wstETH', 'cbETH', 'rETH', 'sDAI', 'weETH', 'sUSDe', 'osETH',
78
65
  'ezETH', 'ETHx', 'rsETH', 'pufETH', 'wrsETH', 'wsuperOETHb', 'sUSDS', 'tETH', 'PT sUSDe Sep', 'PT USDe Sep',
@@ -88,7 +75,7 @@ export const getStakingApy = memoize(async (asset: string, network: number = Net
88
75
  if (asset === 'rETH') return await getApyFromDfsApi('rETH');
89
76
  if (asset === 'sDAI') return await getApyFromDfsApi('sDAI');
90
77
  if (asset === 'sUSDe') return await getApyFromDfsApi('sUSDe');
91
- if (asset === 'weETH') return await getWeEthApy();
78
+ if (asset === 'weETH') return await getApyFromDfsApi('weETH');
92
79
  if (asset === 'ezETH') return await getApyFromDfsApi('ezETH');
93
80
  if (asset === 'osETH') return await getApyFromDfsApi('osETH');
94
81
  if (asset === 'ETHx') return await getApyFromDfsApi('ETHx');
@@ -235,6 +235,17 @@ export interface MorphoBluePositionData {
235
235
  exposure: string,
236
236
  }
237
237
 
238
+ export interface MorphoBlueEarnData {
239
+ apy: string,
240
+ amount: string,
241
+ amountUsd: string,
242
+ }
243
+
244
+ export interface MorphoBlueMarketRewards {
245
+ supplyApy: string,
246
+ borrowApy: string,
247
+ }
248
+
238
249
  export interface MorphoBlueVault {
239
250
  address: string,
240
251
  }