@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.
- package/cjs/helpers/compoundHelpers/index.js +2 -0
- package/cjs/helpers/curveUsdHelpers/index.js +1 -0
- package/cjs/helpers/eulerHelpers/index.js +1 -0
- package/cjs/helpers/fluidHelpers/index.js +1 -0
- package/cjs/helpers/llamaLendHelpers/index.js +1 -0
- package/cjs/helpers/morphoBlueHelpers/index.js +2 -0
- package/cjs/helpers/sparkHelpers/index.js +1 -0
- package/cjs/morphoBlue/index.d.ts +8 -6
- package/cjs/morphoBlue/index.js +69 -40
- package/cjs/portfolio/index.js +1 -1
- package/cjs/staking/staking.js +1 -15
- package/cjs/types/morphoBlue.d.ts +9 -0
- package/esm/helpers/compoundHelpers/index.js +2 -0
- package/esm/helpers/curveUsdHelpers/index.js +1 -0
- package/esm/helpers/eulerHelpers/index.js +1 -0
- package/esm/helpers/fluidHelpers/index.js +1 -0
- package/esm/helpers/llamaLendHelpers/index.js +1 -0
- package/esm/helpers/morphoBlueHelpers/index.js +2 -0
- package/esm/helpers/sparkHelpers/index.js +1 -0
- package/esm/morphoBlue/index.d.ts +8 -6
- package/esm/morphoBlue/index.js +62 -39
- package/esm/portfolio/index.js +2 -2
- package/esm/staking/staking.js +1 -15
- package/esm/types/morphoBlue.d.ts +9 -0
- package/package.json +1 -1
- package/src/helpers/compoundHelpers/index.ts +2 -0
- package/src/helpers/curveUsdHelpers/index.ts +1 -0
- package/src/helpers/eulerHelpers/index.ts +1 -0
- package/src/helpers/fluidHelpers/index.ts +1 -0
- package/src/helpers/llamaLendHelpers/index.ts +1 -0
- package/src/helpers/morphoBlueHelpers/index.ts +2 -0
- package/src/helpers/sparkHelpers/index.ts +1 -0
- package/src/morphoBlue/index.ts +101 -44
- package/src/portfolio/index.ts +2 -2
- package/src/staking/staking.ts +1 -14
- 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>;
|
package/cjs/morphoBlue/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
233
|
-
|
|
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
|
}
|
package/cjs/portfolio/index.js
CHANGED
|
@@ -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.
|
|
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* () {
|
package/cjs/staking/staking.js
CHANGED
|
@@ -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
|
|
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>;
|
package/esm/morphoBlue/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
220
|
-
|
|
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
|
}
|
package/esm/portfolio/index.js
CHANGED
|
@@ -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,
|
|
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
|
|
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* () {
|
package/esm/staking/staking.js
CHANGED
|
@@ -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
|
|
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
|
@@ -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??
|
package/src/morphoBlue/index.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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<
|
|
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
|
-
|
|
258
|
-
|
|
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
|
+
}
|
package/src/portfolio/index.ts
CHANGED
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
MorphoBlueMarkets,
|
|
12
12
|
SparkMarkets,
|
|
13
13
|
} from '../markets';
|
|
14
|
-
import { _getMorphoBlueAccountData,
|
|
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
|
|
165
|
+
const marketData = await _getMorphoBluePortfolioMarketData(client, network, market);
|
|
166
166
|
morphoMarketsData[market.value] = marketData;
|
|
167
167
|
}),
|
|
168
168
|
...compoundV3Markets.map(async (market) => {
|
package/src/staking/staking.ts
CHANGED
|
@@ -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
|
|
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');
|
package/src/types/morphoBlue.ts
CHANGED
|
@@ -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
|
}
|