@defisaver/positions-sdk 2.1.127-dev → 2.1.127-midnight-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/config/contracts.d.ts +249 -0
- package/cjs/config/contracts.js +11 -1
- package/cjs/contracts.d.ts +1510 -0
- package/cjs/contracts.js +3 -2
- package/cjs/helpers/index.d.ts +1 -0
- package/cjs/helpers/index.js +2 -1
- package/cjs/helpers/morphoBlueHelpers/index.js +0 -1
- package/cjs/helpers/morphoMidnightHelpers/index.d.ts +16 -0
- package/cjs/helpers/morphoMidnightHelpers/index.js +68 -0
- package/cjs/index.d.ts +2 -1
- package/cjs/index.js +3 -1
- package/cjs/markets/index.d.ts +1 -0
- package/cjs/markets/index.js +4 -1
- package/cjs/markets/morphoMidnight/index.d.ts +16 -0
- package/cjs/markets/morphoMidnight/index.js +159 -0
- package/cjs/morphoBlue/index.d.ts +6 -8
- package/cjs/morphoBlue/index.js +40 -69
- package/cjs/morphoMidnight/index.d.ts +14 -0
- package/cjs/morphoMidnight/index.js +220 -0
- package/cjs/portfolio/discovery.js +4 -0
- package/cjs/portfolio/index.js +45 -1
- package/cjs/services/viem.d.ts +11 -11
- package/cjs/types/index.d.ts +1 -0
- package/cjs/types/index.js +1 -0
- package/cjs/types/morphoBlue.d.ts +0 -9
- package/cjs/types/morphoMidnight.d.ts +91 -0
- package/cjs/types/morphoMidnight.js +15 -0
- package/cjs/types/portfolio.d.ts +4 -0
- package/esm/config/contracts.d.ts +249 -0
- package/esm/config/contracts.js +9 -0
- package/esm/contracts.d.ts +1510 -0
- package/esm/contracts.js +1 -0
- package/esm/helpers/index.d.ts +1 -0
- package/esm/helpers/index.js +1 -0
- package/esm/helpers/morphoBlueHelpers/index.js +0 -1
- package/esm/helpers/morphoMidnightHelpers/index.d.ts +16 -0
- package/esm/helpers/morphoMidnightHelpers/index.js +61 -0
- package/esm/index.d.ts +2 -1
- package/esm/index.js +2 -1
- package/esm/markets/index.d.ts +1 -0
- package/esm/markets/index.js +1 -0
- package/esm/markets/morphoMidnight/index.d.ts +16 -0
- package/esm/markets/morphoMidnight/index.js +148 -0
- package/esm/morphoBlue/index.d.ts +6 -8
- package/esm/morphoBlue/index.js +39 -62
- package/esm/morphoMidnight/index.d.ts +14 -0
- package/esm/morphoMidnight/index.js +207 -0
- package/esm/portfolio/discovery.js +5 -1
- package/esm/portfolio/index.js +47 -3
- package/esm/services/viem.d.ts +11 -11
- package/esm/types/index.d.ts +1 -0
- package/esm/types/index.js +1 -0
- package/esm/types/morphoBlue.d.ts +0 -9
- package/esm/types/morphoMidnight.d.ts +91 -0
- package/esm/types/morphoMidnight.js +12 -0
- package/esm/types/portfolio.d.ts +4 -0
- package/package.json +1 -1
- package/src/config/contracts.ts +9 -0
- package/src/contracts.ts +1 -0
- package/src/helpers/index.ts +1 -0
- package/src/helpers/morphoBlueHelpers/index.ts +0 -1
- package/src/helpers/morphoMidnightHelpers/index.ts +86 -0
- package/src/index.ts +2 -0
- package/src/markets/index.ts +1 -0
- package/src/markets/morphoMidnight/index.ts +161 -0
- package/src/morphoBlue/index.ts +44 -101
- package/src/morphoMidnight/index.ts +234 -0
- package/src/portfolio/discovery.ts +6 -0
- package/src/portfolio/index.ts +46 -2
- package/src/types/index.ts +1 -0
- package/src/types/morphoBlue.ts +0 -11
- package/src/types/morphoMidnight.ts +104 -0
- package/src/types/portfolio.ts +4 -0
package/esm/types/portfolio.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { LiquityTroveInfo } from './liquity';
|
|
|
9
9
|
import { LlamaLendUserData, LlamaLendVersionsType } from './llamaLend';
|
|
10
10
|
import { CdpData } from './maker';
|
|
11
11
|
import { MorphoBluePositionData, MorphoBlueVersions } from './morphoBlue';
|
|
12
|
+
import { MorphoMidnightPositionData, MorphoMidnightVersions } from './morphoMidnight';
|
|
12
13
|
import { SparkPositionData, SparkVersions } from './spark';
|
|
13
14
|
export interface PortfolioProtocolData<T> {
|
|
14
15
|
error: string;
|
|
@@ -21,6 +22,9 @@ export interface PortfolioPositionsDataForAddress {
|
|
|
21
22
|
morphoBlue: {
|
|
22
23
|
[key in MorphoBlueVersions]?: PortfolioProtocolData<MorphoBluePositionData>;
|
|
23
24
|
};
|
|
25
|
+
morphoMidnight: {
|
|
26
|
+
[key in MorphoMidnightVersions]?: PortfolioProtocolData<MorphoMidnightPositionData>;
|
|
27
|
+
};
|
|
24
28
|
compoundV3: {
|
|
25
29
|
[key in CompoundVersions]?: PortfolioProtocolData<CompoundV3PositionData>;
|
|
26
30
|
};
|
package/package.json
CHANGED
package/src/config/contracts.ts
CHANGED
|
@@ -1113,6 +1113,15 @@ export const MorphoBlueView = {
|
|
|
1113
1113
|
}
|
|
1114
1114
|
},
|
|
1115
1115
|
} as const;
|
|
1116
|
+
export const MidnightView = {
|
|
1117
|
+
"abi": [{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"getMarketInfo","outputs":[{"components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint128","name":"totalUnits","type":"uint128"},{"internalType":"uint128","name":"lossFactor","type":"uint128"},{"internalType":"uint128","name":"withdrawable","type":"uint128"},{"internalType":"uint128","name":"continuousFeeCredit","type":"uint128"},{"internalType":"uint16[7]","name":"settlementFees","type":"uint16[7]"},{"internalType":"uint32","name":"continuousFee","type":"uint32"},{"internalType":"uint8","name":"tickSpacing","type":"uint8"},{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"internalType":"struct MidnightView.MarketInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"address","name":"_user","type":"address"}],"name":"getPositionInfo","outputs":[{"components":[{"internalType":"uint128","name":"credit","type":"uint128"},{"internalType":"uint128","name":"pendingFee","type":"uint128"},{"internalType":"uint128","name":"debt","type":"uint128"},{"internalType":"uint128","name":"collateralBitmap","type":"uint128"},{"internalType":"uint128[]","name":"collateral","type":"uint128[]"},{"internalType":"uint256","name":"ratio","type":"uint256"}],"internalType":"struct MidnightView.PositionInfo","name":"pos","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"address","name":"_user","type":"address"}],"name":"getRatio","outputs":[{"internalType":"uint256","name":"ratio","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"midnight","type":"address"},{"internalType":"address","name":"loanToken","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"lltv","type":"uint256"},{"internalType":"uint256","name":"liquidationCursor","type":"uint256"},{"internalType":"address","name":"oracle","type":"address"}],"internalType":"struct CollateralParams[]","name":"collateralParams","type":"tuple[]"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"rcfThreshold","type":"uint256"},{"internalType":"address","name":"enterGate","type":"address"},{"internalType":"address","name":"liquidatorGate","type":"address"}],"internalType":"struct Market","name":"_market","type":"tuple"}],"name":"toId","outputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"toMarket","outputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"midnight","type":"address"},{"internalType":"address","name":"loanToken","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"lltv","type":"uint256"},{"internalType":"uint256","name":"liquidationCursor","type":"uint256"},{"internalType":"address","name":"oracle","type":"address"}],"internalType":"struct CollateralParams[]","name":"collateralParams","type":"tuple[]"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"rcfThreshold","type":"uint256"},{"internalType":"address","name":"enterGate","type":"address"},{"internalType":"address","name":"liquidatorGate","type":"address"}],"internalType":"struct Market","name":"market","type":"tuple"}],"stateMutability":"view","type":"function"}],
|
|
1118
|
+
"networks": {
|
|
1119
|
+
"8453": {
|
|
1120
|
+
"address": "0x3aa272f329E8B562A3bA56Bb6979a44D23A28839",
|
|
1121
|
+
"createdBlock": 48932293,
|
|
1122
|
+
}
|
|
1123
|
+
},
|
|
1124
|
+
} as const;
|
|
1116
1125
|
export const FeedRegistry = {
|
|
1117
1126
|
"abi": [{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"address","name":"aggregator","type":"address"}],"name":"confirmFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAccessController","outputs":[{"internalType":"contract AccessControllerInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint256","name":"roundId","type":"uint256"}],"name":"getAnswer","outputs":[{"internalType":"int256","name":"answer","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"getCurrentPhaseId","outputs":[{"internalType":"uint16","name":"currentPhaseId","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"getFeed","outputs":[{"internalType":"contract AggregatorV2V3Interface","name":"aggregator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint80","name":"roundId","type":"uint80"}],"name":"getNextRoundId","outputs":[{"internalType":"uint80","name":"nextRoundId","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint16","name":"phaseId","type":"uint16"}],"name":"getPhase","outputs":[{"components":[{"internalType":"uint16","name":"phaseId","type":"uint16"},{"internalType":"uint80","name":"startingAggregatorRoundId","type":"uint80"},{"internalType":"uint80","name":"endingAggregatorRoundId","type":"uint80"}],"internalType":"struct FeedRegistryInterface.Phase","name":"phase","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint16","name":"phaseId","type":"uint16"}],"name":"getPhaseFeed","outputs":[{"internalType":"contract AggregatorV2V3Interface","name":"aggregator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint16","name":"phaseId","type":"uint16"}],"name":"getPhaseRange","outputs":[{"internalType":"uint80","name":"startingRoundId","type":"uint80"},{"internalType":"uint80","name":"endingRoundId","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint80","name":"roundId","type":"uint80"}],"name":"getPreviousRoundId","outputs":[{"internalType":"uint80","name":"previousRoundId","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"getProposedFeed","outputs":[{"internalType":"contract AggregatorV2V3Interface","name":"proposedAggregator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint80","name":"roundId","type":"uint80"}],"name":"getRoundFeed","outputs":[{"internalType":"contract AggregatorV2V3Interface","name":"aggregator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint256","name":"roundId","type":"uint256"}],"name":"getTimestamp","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"aggregator","type":"address"}],"name":"isFeedEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"answer","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"latestRound","outputs":[{"internalType":"uint256","name":"roundId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"latestTimestamp","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"address","name":"aggregator","type":"address"}],"name":"proposeFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint80","name":"roundId","type":"uint80"}],"name":"proposedGetRoundData","outputs":[{"internalType":"uint80","name":"id","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"proposedLatestRoundData","outputs":[{"internalType":"uint80","name":"id","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract AccessControllerInterface","name":"_accessController","type":"address"}],"name":"setAccessController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"typeAndVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],
|
|
1118
1127
|
"networks": {
|
package/src/contracts.ts
CHANGED
|
@@ -122,6 +122,7 @@ export const getYearnV3VaultContractViem = (client: Client, address: HexString)
|
|
|
122
122
|
};
|
|
123
123
|
|
|
124
124
|
export const MorphoBlueViewContractViem = createViemContractFromConfigFunc('MorphoBlueView');
|
|
125
|
+
export const MorphoMidnightViewContractViem = createViemContractFromConfigFunc('MidnightView');
|
|
125
126
|
export const AaveLoanInfoV2ContractViem = createViemContractFromConfigFunc('AaveLoanInfoV2');
|
|
126
127
|
export const AaveV3ViewContractViem = createViemContractFromConfigFunc('AaveV3View');
|
|
127
128
|
export const AaveIncentiveDataProviderV3ContractViem = createViemContractFromConfigFunc('AaveUiIncentiveDataProviderV3');
|
package/src/helpers/index.ts
CHANGED
|
@@ -4,6 +4,7 @@ export * as sparkHelpers from './sparkHelpers';
|
|
|
4
4
|
export * as curveUsdHelpers from './curveUsdHelpers';
|
|
5
5
|
export * as makerHelpers from './makerHelpers';
|
|
6
6
|
export * as morphoBlueHelpers from './morphoBlueHelpers';
|
|
7
|
+
export * as morphoMidnightHelpers from './morphoMidnightHelpers';
|
|
7
8
|
export * as llamaLendHelpers from './llamaLendHelpers';
|
|
8
9
|
export * as liquityV2Helpers from './liquityV2Helpers';
|
|
9
10
|
export * as eulerV2Helpers from './eulerHelpers';
|
|
@@ -389,7 +389,6 @@ export const getRewardsForMarket = async (marketId: string, network: NetworkNumb
|
|
|
389
389
|
query: REWARDS_QUERY,
|
|
390
390
|
variables: { marketId, chainId: network },
|
|
391
391
|
}),
|
|
392
|
-
signal: AbortSignal.timeout(LONGER_TIMEOUT),
|
|
393
392
|
});
|
|
394
393
|
|
|
395
394
|
const data = await response.json();
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import Dec from 'decimal.js';
|
|
2
|
+
import {
|
|
3
|
+
calcLeverageLiqPrice, getAssetsTotal, getExposure, isLeveragedPos,
|
|
4
|
+
} from '../../moneymarket';
|
|
5
|
+
import { calculateNetApy } from '../../staking';
|
|
6
|
+
import {
|
|
7
|
+
LeverageType, MMAssetsData, MMUsedAsset, MMUsedAssets,
|
|
8
|
+
} from '../../types/common';
|
|
9
|
+
import { MorphoMidnightAggregatedPositionData, MorphoMidnightAssetsData, MorphoMidnightMarketInfo } from '../../types';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Aggregate a Morpho Midnight position. Midnight markets are multi-collateral, so the borrow limit is
|
|
13
|
+
* the sum of each collateral's USD value times its own lltv (Aave-v4 style), rather than a single pair.
|
|
14
|
+
*
|
|
15
|
+
* Note on amounts: `borrowedUsd` is derived from the position's `debt`, which is the face value owed at
|
|
16
|
+
* maturity (principal + fixed interest). Health is therefore measured against the full maturity debt,
|
|
17
|
+
* matching how MidnightView computes `ratio`. Fixed-rate APY is not derived on-chain in MVP, so
|
|
18
|
+
* `netApy` reflects the `'0'` rates in `assetsData` (see the module getter).
|
|
19
|
+
*/
|
|
20
|
+
export const getMorphoMidnightAggregatedPositionData = ({
|
|
21
|
+
usedAssets,
|
|
22
|
+
assetsData,
|
|
23
|
+
marketInfo,
|
|
24
|
+
}: {
|
|
25
|
+
usedAssets: MMUsedAssets,
|
|
26
|
+
assetsData: MorphoMidnightAssetsData,
|
|
27
|
+
marketInfo: MorphoMidnightMarketInfo,
|
|
28
|
+
}): MorphoMidnightAggregatedPositionData => {
|
|
29
|
+
const payload = {} as MorphoMidnightAggregatedPositionData;
|
|
30
|
+
|
|
31
|
+
payload.suppliedUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
|
|
32
|
+
payload.suppliedCollateralUsd = getAssetsTotal(usedAssets, ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
|
|
33
|
+
payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
|
|
34
|
+
|
|
35
|
+
// borrowLimit = Σ collateralUsd_i * lltv_i (per-collateral lltv carried on assetsData)
|
|
36
|
+
payload.borrowLimitUsd = getAssetsTotal(
|
|
37
|
+
usedAssets,
|
|
38
|
+
({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral,
|
|
39
|
+
({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(assetsData[symbol]?.lltv || 0),
|
|
40
|
+
);
|
|
41
|
+
payload.liquidationLimitUsd = payload.borrowLimitUsd;
|
|
42
|
+
|
|
43
|
+
const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
|
|
44
|
+
payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
|
|
45
|
+
|
|
46
|
+
const loanTokenPrice = assetsData[marketInfo.loanToken]?.price || '0';
|
|
47
|
+
payload.leftToBorrow = new Dec(loanTokenPrice).eq(0) ? '0' : new Dec(payload.leftToBorrowUsd).div(loanTokenPrice).toString();
|
|
48
|
+
|
|
49
|
+
const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy({ usedAssets, assetsData: assetsData as unknown as MMAssetsData });
|
|
50
|
+
payload.netApy = netApy;
|
|
51
|
+
payload.incentiveUsd = incentiveUsd;
|
|
52
|
+
payload.totalInterestUsd = totalInterestUsd;
|
|
53
|
+
|
|
54
|
+
payload.ltv = new Dec(payload.suppliedCollateralUsd).eq(0) ? '0' : new Dec(payload.borrowedUsd).div(payload.suppliedCollateralUsd).toString();
|
|
55
|
+
payload.ratio = new Dec(payload.borrowedUsd).eq(0) ? '0' : new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString();
|
|
56
|
+
payload.healthRatio = new Dec(payload.borrowedUsd).eq(0) ? 'Infinity' : new Dec(payload.liquidationLimitUsd).div(payload.borrowedUsd).toDP(4).toString();
|
|
57
|
+
|
|
58
|
+
const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
|
|
59
|
+
payload.leveragedType = leveragedType;
|
|
60
|
+
payload.liquidationPrice = '';
|
|
61
|
+
if (leveragedType !== '') {
|
|
62
|
+
payload.leveragedAsset = leveragedAsset;
|
|
63
|
+
let assetPrice = assetsData[leveragedAsset].price;
|
|
64
|
+
if (leveragedType === LeverageType.VolatilePair) {
|
|
65
|
+
const borrowedAsset = (Object.values(usedAssets) as MMUsedAsset[]).find(({ borrowedUsd }: { borrowedUsd: string }) => +borrowedUsd > 0);
|
|
66
|
+
const borrowedAssetPrice = assetsData[borrowedAsset!.symbol].price;
|
|
67
|
+
const leveragedAssetPrice = assetsData[leveragedAsset].price;
|
|
68
|
+
const isReverse = new Dec(leveragedAssetPrice).lt(borrowedAssetPrice);
|
|
69
|
+
if (isReverse) {
|
|
70
|
+
payload.leveragedType = LeverageType.VolatilePairReverse;
|
|
71
|
+
payload.currentVolatilePairRatio = new Dec(borrowedAssetPrice).div(leveragedAssetPrice).toDP(18).toString();
|
|
72
|
+
assetPrice = new Dec(borrowedAssetPrice).div(assetPrice).toString();
|
|
73
|
+
} else {
|
|
74
|
+
assetPrice = new Dec(assetPrice).div(borrowedAssetPrice).toString();
|
|
75
|
+
payload.currentVolatilePairRatio = new Dec(leveragedAssetPrice).div(borrowedAssetPrice).toDP(18).toString();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
payload.liquidationPrice = calcLeverageLiqPrice(payload.leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
payload.minCollRatio = new Dec(payload.borrowLimitUsd).eq(0) ? '0' : new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
|
|
82
|
+
payload.collLiquidationRatio = new Dec(payload.liquidationLimitUsd).eq(0) ? '0' : new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
|
|
83
|
+
payload.exposure = getExposure(payload.borrowedUsd, payload.suppliedUsd);
|
|
84
|
+
|
|
85
|
+
return payload;
|
|
86
|
+
};
|
package/src/index.ts
CHANGED
|
@@ -17,6 +17,7 @@ import * as markets from './markets';
|
|
|
17
17
|
import * as helpers from './helpers';
|
|
18
18
|
import * as exchange from './exchange';
|
|
19
19
|
import * as morphoBlue from './morphoBlue';
|
|
20
|
+
import * as morphoMidnight from './morphoMidnight';
|
|
20
21
|
import * as llamaLend from './llamaLend';
|
|
21
22
|
import * as eulerV2 from './eulerV2';
|
|
22
23
|
import * as portfolio from './portfolio';
|
|
@@ -42,6 +43,7 @@ export {
|
|
|
42
43
|
markets,
|
|
43
44
|
helpers,
|
|
44
45
|
morphoBlue,
|
|
46
|
+
morphoMidnight,
|
|
45
47
|
llamaLend,
|
|
46
48
|
eulerV2,
|
|
47
49
|
fluid,
|
package/src/markets/index.ts
CHANGED
|
@@ -17,6 +17,7 @@ export {
|
|
|
17
17
|
export { SparkMarkets } from './spark';
|
|
18
18
|
export { CrvUsdMarkets } from './curveUsd';
|
|
19
19
|
export { MorphoBlueMarkets, findMorphoBlueMarket } from './morphoBlue';
|
|
20
|
+
export { MorphoMidnightMarkets, findMorphoMidnightMarket } from './morphoMidnight';
|
|
20
21
|
export { LlamaLendMarkets } from './llamaLend';
|
|
21
22
|
export { LiquityV2Markets, findLiquityV2MarketByAddress } from './liquityV2';
|
|
22
23
|
export { EulerV2Markets } from './euler';
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { MorphoMidnightMarketData, MorphoMidnightVersions, NetworkNumber } from '../../types';
|
|
2
|
+
|
|
3
|
+
// Morpho Midnight core contract on Base (same for every market).
|
|
4
|
+
const MIDNIGHT_BASE = '0xAdedD8ab6dE832766Fedf0FaC4992E5C4D3EA18A';
|
|
5
|
+
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
|
|
6
|
+
|
|
7
|
+
// Curated Morpho Midnight markets. Each market is fixed-term: it is uniquely identified on-chain by
|
|
8
|
+
// `marketId` (bytes32), derived from the static struct below via MidnightView.toId. Because markets
|
|
9
|
+
// churn as maturities roll, this list is hand-maintained for the pairs/maturities the app supports.
|
|
10
|
+
// Sourced from the official listing at https://markets.morpho.org/fixed/base (see its sitemap.xml) —
|
|
11
|
+
// currently a single USDC/cbBTC pair offered on a monthly maturity ladder; new maturities are added
|
|
12
|
+
// there progressively. Every `marketId` here is verified against MidnightView.toId(marketStruct) in
|
|
13
|
+
// tests/morphoMidnight.ts.
|
|
14
|
+
|
|
15
|
+
// BASE — USDC/cbBTC, 86% LLTV, monthly maturity ladder
|
|
16
|
+
|
|
17
|
+
export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260731 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
|
|
18
|
+
chainIds: [NetworkNumber.Base],
|
|
19
|
+
label: 'Morpho Midnight cbBTC/USDC',
|
|
20
|
+
shortLabel: 'cbBTC/USDC',
|
|
21
|
+
url: 'cbbtc-usdc-20260731',
|
|
22
|
+
value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260731_Base,
|
|
23
|
+
midnight: MIDNIGHT_BASE,
|
|
24
|
+
loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
|
|
25
|
+
collaterals: [{
|
|
26
|
+
token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
|
|
27
|
+
lltv: 0.86,
|
|
28
|
+
liquidationCursor: '300000000000000000',
|
|
29
|
+
oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
|
|
30
|
+
}],
|
|
31
|
+
maturity: 1785510000, // 2026-07-31T15:00:00Z
|
|
32
|
+
rcfThreshold: '3000000000',
|
|
33
|
+
enterGate: ZERO_ADDRESS,
|
|
34
|
+
liquidatorGate: ZERO_ADDRESS,
|
|
35
|
+
marketId: '0x168e31250e0008b50d2255a5ab85e0265acd6c12e4f9a1336134b36a65a47937',
|
|
36
|
+
protocolName: 'morpho-midnight',
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260828 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
|
|
40
|
+
chainIds: [NetworkNumber.Base],
|
|
41
|
+
label: 'Morpho Midnight cbBTC/USDC',
|
|
42
|
+
shortLabel: 'cbBTC/USDC',
|
|
43
|
+
url: 'cbbtc-usdc-20260828',
|
|
44
|
+
value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260828_Base,
|
|
45
|
+
midnight: MIDNIGHT_BASE,
|
|
46
|
+
loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
|
|
47
|
+
collaterals: [{
|
|
48
|
+
token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
|
|
49
|
+
lltv: 0.86,
|
|
50
|
+
liquidationCursor: '300000000000000000',
|
|
51
|
+
oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
|
|
52
|
+
}],
|
|
53
|
+
maturity: 1787929200, // 2026-08-28T15:00:00Z
|
|
54
|
+
rcfThreshold: '3000000000',
|
|
55
|
+
enterGate: ZERO_ADDRESS,
|
|
56
|
+
liquidatorGate: ZERO_ADDRESS,
|
|
57
|
+
marketId: '0x05959752fdeff325962b9d263edb421efc6e2186a49360dba6c32e86ebf6c84c',
|
|
58
|
+
protocolName: 'morpho-midnight',
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260925 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
|
|
62
|
+
chainIds: [NetworkNumber.Base],
|
|
63
|
+
label: 'Morpho Midnight cbBTC/USDC',
|
|
64
|
+
shortLabel: 'cbBTC/USDC',
|
|
65
|
+
url: 'cbbtc-usdc-20260925',
|
|
66
|
+
value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260925_Base,
|
|
67
|
+
midnight: MIDNIGHT_BASE,
|
|
68
|
+
loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
|
|
69
|
+
collaterals: [{
|
|
70
|
+
token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
|
|
71
|
+
lltv: 0.86,
|
|
72
|
+
liquidationCursor: '300000000000000000',
|
|
73
|
+
oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
|
|
74
|
+
}],
|
|
75
|
+
maturity: 1790348400, // 2026-09-25T15:00:00Z
|
|
76
|
+
rcfThreshold: '3000000000',
|
|
77
|
+
enterGate: ZERO_ADDRESS,
|
|
78
|
+
liquidatorGate: ZERO_ADDRESS,
|
|
79
|
+
marketId: '0x549cd072daf99328554f3a6d2d4d6f4a07f1c59369e891e6391946f9cf75f221',
|
|
80
|
+
protocolName: 'morpho-midnight',
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261030 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
|
|
84
|
+
chainIds: [NetworkNumber.Base],
|
|
85
|
+
label: 'Morpho Midnight cbBTC/USDC',
|
|
86
|
+
shortLabel: 'cbBTC/USDC',
|
|
87
|
+
url: 'cbbtc-usdc-20261030',
|
|
88
|
+
value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261030_Base,
|
|
89
|
+
midnight: MIDNIGHT_BASE,
|
|
90
|
+
loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
|
|
91
|
+
collaterals: [{
|
|
92
|
+
token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
|
|
93
|
+
lltv: 0.86,
|
|
94
|
+
liquidationCursor: '300000000000000000',
|
|
95
|
+
oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
|
|
96
|
+
}],
|
|
97
|
+
maturity: 1793372400, // 2026-10-30T15:00:00Z
|
|
98
|
+
rcfThreshold: '3000000000',
|
|
99
|
+
enterGate: ZERO_ADDRESS,
|
|
100
|
+
liquidatorGate: ZERO_ADDRESS,
|
|
101
|
+
marketId: '0x43d6120738c57b2bc5835901f8250fdf7fc8054efbb006c6ccba61ec898e5ed9',
|
|
102
|
+
protocolName: 'morpho-midnight',
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261127 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
|
|
106
|
+
chainIds: [NetworkNumber.Base],
|
|
107
|
+
label: 'Morpho Midnight cbBTC/USDC',
|
|
108
|
+
shortLabel: 'cbBTC/USDC',
|
|
109
|
+
url: 'cbbtc-usdc-20261127',
|
|
110
|
+
value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261127_Base,
|
|
111
|
+
midnight: MIDNIGHT_BASE,
|
|
112
|
+
loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
|
|
113
|
+
collaterals: [{
|
|
114
|
+
token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
|
|
115
|
+
lltv: 0.86,
|
|
116
|
+
liquidationCursor: '300000000000000000',
|
|
117
|
+
oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
|
|
118
|
+
}],
|
|
119
|
+
maturity: 1795791600, // 2026-11-27T15:00:00Z
|
|
120
|
+
rcfThreshold: '3000000000',
|
|
121
|
+
enterGate: ZERO_ADDRESS,
|
|
122
|
+
liquidatorGate: ZERO_ADDRESS,
|
|
123
|
+
marketId: '0xe1878eec035b601f301484e63a49a428f8e008e2bf57a2fd88a3fc3a4c1b1acd',
|
|
124
|
+
protocolName: 'morpho-midnight',
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261225 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
|
|
128
|
+
chainIds: [NetworkNumber.Base],
|
|
129
|
+
label: 'Morpho Midnight cbBTC/USDC',
|
|
130
|
+
shortLabel: 'cbBTC/USDC',
|
|
131
|
+
url: 'cbbtc-usdc-20261225',
|
|
132
|
+
value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261225_Base,
|
|
133
|
+
midnight: MIDNIGHT_BASE,
|
|
134
|
+
loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
|
|
135
|
+
collaterals: [{
|
|
136
|
+
token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
|
|
137
|
+
lltv: 0.86,
|
|
138
|
+
liquidationCursor: '300000000000000000',
|
|
139
|
+
oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
|
|
140
|
+
}],
|
|
141
|
+
maturity: 1798210800, // 2026-12-25T15:00:00Z
|
|
142
|
+
rcfThreshold: '3000000000',
|
|
143
|
+
enterGate: ZERO_ADDRESS,
|
|
144
|
+
liquidatorGate: ZERO_ADDRESS,
|
|
145
|
+
marketId: '0x9593c3a6dba45b6106af8dc8b45ba8c505d90d3d68a3d33f7c278dd921b637da',
|
|
146
|
+
protocolName: 'morpho-midnight',
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
export const MorphoMidnightMarkets = (networkId: NetworkNumber) => ({
|
|
150
|
+
// BASE
|
|
151
|
+
[MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260731_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20260731(networkId),
|
|
152
|
+
[MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260828_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20260828(networkId),
|
|
153
|
+
[MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260925_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20260925(networkId),
|
|
154
|
+
[MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261030_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20261030(networkId),
|
|
155
|
+
[MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261127_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20261127(networkId),
|
|
156
|
+
[MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261225_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20261225(networkId),
|
|
157
|
+
}) as const;
|
|
158
|
+
|
|
159
|
+
export const findMorphoMidnightMarket = (marketId: string, network: NetworkNumber = NetworkNumber.Base): MorphoMidnightMarketData | undefined => Object.values(MorphoMidnightMarkets(network)).find(
|
|
160
|
+
(market) => market.marketId.toLowerCase() === marketId.toLowerCase(),
|
|
161
|
+
);
|
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,
|
|
11
|
+
MorphoBlueAssetsData, MorphoBlueMarketData, MorphoBlueMarketInfo, MorphoBluePositionData,
|
|
12
12
|
} from '../types';
|
|
13
13
|
import { USD_QUOTE, WAD } from '../constants';
|
|
14
14
|
import { calculateNetApy, getStakingApy, STAKING_ASSETS } from '../staking';
|
|
@@ -21,39 +21,7 @@ import { getViemProvider, setViemBlockNumber } from '../services/viem';
|
|
|
21
21
|
|
|
22
22
|
const HARDCODED_USD_STABLE_PRICE = '100000000'; // $1 with 8 decimals
|
|
23
23
|
|
|
24
|
-
|
|
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> {
|
|
24
|
+
export async function _getMorphoBlueMarketData(provider: Client, network: NetworkNumber, selectedMarket: MorphoBlueMarketData): Promise<MorphoBlueMarketInfo> {
|
|
57
25
|
const {
|
|
58
26
|
loanToken, collateralToken, oracle, irm, lltv, oracleType,
|
|
59
27
|
} = selectedMarket;
|
|
@@ -91,6 +59,16 @@ async function getMorphoBlueMarketDataInternal(
|
|
|
91
59
|
loanTokenPrice = loanTokenPriceRound[1].toString();
|
|
92
60
|
}
|
|
93
61
|
|
|
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
|
+
|
|
94
72
|
const supplyRate = getSupplyRate(marketInfo.totalSupplyAssets.toString(), marketInfo.totalBorrowAssets.toString(), marketInfo.borrowRate.toString(), marketInfo.fee.toString());
|
|
95
73
|
const compoundedBorrowRate = getBorrowRate(marketInfo.borrowRate.toString(), marketInfo.totalBorrowShares.toString());
|
|
96
74
|
const utillization = new Dec(marketInfo.totalBorrowAssets.toString()).div(marketInfo.totalSupplyAssets.toString()).mul(100).toString();
|
|
@@ -112,8 +90,18 @@ async function getMorphoBlueMarketDataInternal(
|
|
|
112
90
|
totalBorrow: new Dec(marketInfo.totalBorrowAssets.toString()).div(scale).toString(),
|
|
113
91
|
canBeSupplied: true,
|
|
114
92
|
canBeBorrowed: true,
|
|
115
|
-
supplyIncentives: [
|
|
116
|
-
|
|
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
|
+
}],
|
|
117
105
|
};
|
|
118
106
|
|
|
119
107
|
assetsData[wethToEth(collateralTokenInfo.symbol)] = {
|
|
@@ -150,70 +138,10 @@ async function getMorphoBlueMarketDataInternal(
|
|
|
150
138
|
};
|
|
151
139
|
}
|
|
152
140
|
|
|
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
|
-
|
|
169
141
|
export async function getMorphoBlueMarketData(provider: EthereumProvider, network: NetworkNumber, selectedMarket: MorphoBlueMarketData): Promise<MorphoBlueMarketInfo> {
|
|
170
142
|
return _getMorphoBlueMarketData(getViemProvider(provider, network), network, selectedMarket);
|
|
171
143
|
}
|
|
172
144
|
|
|
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
|
-
|
|
217
145
|
export const _getMorphoBlueAccountBalances = async (provider: Client, network: NetworkNumber, block: Blockish, addressMapping: boolean, address: EthAddress, selectedMarket: MorphoBlueMarketData): Promise<PositionBalances> => {
|
|
218
146
|
let balances: PositionBalances = {
|
|
219
147
|
collateral: {},
|
|
@@ -310,7 +238,7 @@ export async function getMorphoBlueAccountData(provider: EthereumProvider, netwo
|
|
|
310
238
|
return _getMorphoBlueAccountData(getViemProvider(provider, network), network, account, selectedMarket, marketInfo);
|
|
311
239
|
}
|
|
312
240
|
|
|
313
|
-
export async function getMorphoEarn(provider: Client, network: NetworkNumber, account: EthAddress, selectedMarket: MorphoBlueMarketData, marketInfo: MorphoBlueMarketInfo): Promise<
|
|
241
|
+
export async function getMorphoEarn(provider: Client, network: NetworkNumber, account: EthAddress, selectedMarket: MorphoBlueMarketData, marketInfo: MorphoBlueMarketInfo): Promise<{ apy: string, amount: string, amountUsd: string }> {
|
|
314
242
|
const {
|
|
315
243
|
loanToken, collateralToken, oracle, irm, lltv,
|
|
316
244
|
} = selectedMarket;
|
|
@@ -326,9 +254,24 @@ export async function getMorphoEarn(provider: Client, network: NetworkNumber, ac
|
|
|
326
254
|
const loanTokenInfo = marketInfo.assetsData[marketInfo.loanToken];
|
|
327
255
|
const loanTokenSupplied = assetAmountInEth(loanInfo.suppliedInAssets.toString(), marketInfo.loanToken);
|
|
328
256
|
const loanTokenSuppliedUsd = new Dec(loanTokenSupplied).mul(loanTokenInfo.price).toString();
|
|
329
|
-
|
|
330
|
-
|
|
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,
|
|
331
274
|
amount: loanTokenSupplied,
|
|
332
275
|
amountUsd: loanTokenSuppliedUsd,
|
|
333
|
-
}
|
|
334
|
-
}
|
|
276
|
+
};
|
|
277
|
+
}
|