@defisaver/positions-sdk 2.1.161-portfolio-api-1-dev → 2.1.162

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/cjs/aaveV3/index.js +7 -1
  2. package/cjs/helpers/aaveHelpers/index.d.ts +9 -1
  3. package/cjs/helpers/aaveHelpers/index.js +23 -6
  4. package/cjs/portfolio/index.d.ts +2 -2
  5. package/cjs/portfolio/index.js +3 -5
  6. package/cjs/savings/index.js +5 -2
  7. package/cjs/savings/morphoVaults/index.d.ts +1 -1
  8. package/cjs/savings/morphoVaults/index.js +56 -18
  9. package/cjs/savings/morphoVaults/options.d.ts +2 -0
  10. package/cjs/savings/morphoVaults/options.js +61 -1
  11. package/cjs/spark/index.js +1 -0
  12. package/cjs/types/aave.d.ts +3 -15
  13. package/cjs/types/compound.d.ts +2 -26
  14. package/cjs/types/curveUsd.d.ts +1 -9
  15. package/cjs/types/llamaLend.d.ts +1 -12
  16. package/cjs/types/morphoBlue.d.ts +0 -2
  17. package/cjs/types/portfolio.d.ts +8 -23
  18. package/cjs/types/savings/morphoVaults.d.ts +10 -2
  19. package/cjs/types/savings/morphoVaults.js +9 -1
  20. package/cjs/types/spark.d.ts +1 -21
  21. package/esm/aaveV3/index.js +7 -1
  22. package/esm/helpers/aaveHelpers/index.d.ts +9 -1
  23. package/esm/helpers/aaveHelpers/index.js +20 -5
  24. package/esm/portfolio/index.d.ts +2 -2
  25. package/esm/portfolio/index.js +3 -5
  26. package/esm/savings/index.js +5 -2
  27. package/esm/savings/morphoVaults/index.d.ts +1 -1
  28. package/esm/savings/morphoVaults/index.js +57 -19
  29. package/esm/savings/morphoVaults/options.d.ts +2 -0
  30. package/esm/savings/morphoVaults/options.js +61 -1
  31. package/esm/spark/index.js +1 -0
  32. package/esm/types/aave.d.ts +3 -15
  33. package/esm/types/compound.d.ts +2 -26
  34. package/esm/types/curveUsd.d.ts +1 -9
  35. package/esm/types/llamaLend.d.ts +1 -12
  36. package/esm/types/morphoBlue.d.ts +0 -2
  37. package/esm/types/portfolio.d.ts +8 -23
  38. package/esm/types/savings/morphoVaults.d.ts +10 -2
  39. package/esm/types/savings/morphoVaults.js +8 -0
  40. package/esm/types/spark.d.ts +1 -21
  41. package/package.json +1 -1
  42. package/src/aaveV3/index.ts +6 -1
  43. package/src/helpers/aaveHelpers/index.ts +24 -7
  44. package/src/portfolio/index.ts +4 -7
  45. package/src/savings/index.ts +5 -2
  46. package/src/savings/morphoVaults/index.ts +73 -21
  47. package/src/savings/morphoVaults/options.ts +67 -1
  48. package/src/spark/index.ts +1 -0
  49. package/src/types/aave.ts +2 -18
  50. package/src/types/compound.ts +2 -38
  51. package/src/types/curveUsd.ts +1 -17
  52. package/src/types/llamaLend.ts +1 -19
  53. package/src/types/morphoBlue.ts +0 -3
  54. package/src/types/portfolio.ts +9 -28
  55. package/src/types/savings/morphoVaults.ts +11 -1
  56. package/src/types/spark.ts +1 -25
@@ -60,7 +60,6 @@ export interface CrvUSDGlobalMarketData {
60
60
  leftToBorrow: string;
61
61
  bands: BandData[];
62
62
  loanDiscount: string;
63
- A?: bigint;
64
63
  }
65
64
  export interface CrvUSDAggregatedPositionData {
66
65
  ratio: string;
@@ -92,8 +91,7 @@ export interface CrvUSDUsedAsset {
92
91
  export interface CrvUSDUsedAssets {
93
92
  [key: string]: CrvUSDUsedAsset;
94
93
  }
95
- export type CrvUSDPositionAggregatedFields = Partial<Pick<CrvUSDAggregatedPositionData, 'borrowLimitUsd' | 'minAllowedRatio' | 'collFactor' | 'leveragedType' | 'leveragedAsset' | 'liquidationPrice'>>;
96
- export interface CrvUSDUserData extends CrvUSDPositionAggregatedFields {
94
+ export interface CrvUSDUserData {
97
95
  debtAmount: string;
98
96
  health: string;
99
97
  healthPercent: string;
@@ -115,10 +113,4 @@ export interface CrvUSDUserData extends CrvUSDPositionAggregatedFields {
115
113
  collateralPrice: string;
116
114
  collRatio: string;
117
115
  exposure: string;
118
- marketCollateralAmount?: bigint;
119
- curveUsdCollateralAmount?: bigint;
120
- N?: bigint;
121
- bandRange?: readonly [bigint, bigint];
122
- usersBands?: readonly [readonly bigint[], readonly bigint[]];
123
- isInSoftLiquidation?: boolean;
124
116
  }
@@ -138,8 +138,7 @@ export interface LlamaLendUsedAsset {
138
138
  export interface LlamaLendUsedAssets {
139
139
  [key: string]: LlamaLendUsedAsset;
140
140
  }
141
- export type LlamaLendPositionAggregatedFields = Partial<Pick<LlamaLendAggregatedPositionData, 'borrowLimitUsd' | 'minAllowedRatio' | 'collFactor' | 'leveragedType' | 'leveragedAsset' | 'liquidationPrice' | 'netApy' | 'incentiveUsd' | 'totalInterestUsd'>>;
142
- export interface LlamaLendUserData extends LlamaLendPositionAggregatedFields {
141
+ export interface LlamaLendUserData {
143
142
  debtAmount: string;
144
143
  health: string;
145
144
  healthPercent: string;
@@ -158,14 +157,4 @@ export interface LlamaLendUserData extends LlamaLendPositionAggregatedFields {
158
157
  loanExists: boolean;
159
158
  borrowRate?: string;
160
159
  exposure: string;
161
- collateralPrice?: bigint;
162
- marketCollateralAmount?: bigint;
163
- debtTokenCollateralAmount?: bigint;
164
- N?: bigint;
165
- bandRange?: readonly [bigint, bigint];
166
- usersBands?: readonly [readonly bigint[], readonly bigint[]];
167
- collRatio?: bigint;
168
- isInSoftLiquidation?: boolean;
169
- debtTokenSuppliedShares?: bigint;
170
- debtTokenSuppliedAssets?: bigint;
171
160
  }
@@ -214,8 +214,6 @@ export interface MorphoBluePositionData {
214
214
  supplyShares: string;
215
215
  borrowShares: string;
216
216
  exposure: string;
217
- minCollRatio?: string;
218
- collLiquidationRatio?: string;
219
217
  }
220
218
  export interface MorphoBlueEarnData {
221
219
  apy: string;
@@ -1,16 +1,15 @@
1
- import { AaveV2MarketData, AaveV2PositionData, AaveV3MarketData, AaveV3PositionData, AaveVersions } from './aave';
2
- import { AaveV4AccountData, AaveV4SpokeData, AaveV4SpokesType } from './aaveV4';
1
+ import { AaveV2PositionData, AaveV3PositionData, AaveVersions } from './aave';
2
+ import { AaveV4AccountData, AaveV4SpokesType } from './aaveV4';
3
3
  import { EthAddress } from './common';
4
- import { CompoundV2MarketsData, CompoundV2PositionData, CompoundV3MarketsData, CompoundV3PositionData, CompoundVersions } from './compound';
5
- import { CrvUSDGlobalMarketData, CrvUSDUserData, CrvUSDVersions } from './curveUsd';
4
+ import { CompoundV2PositionData, CompoundV3PositionData, CompoundVersions } from './compound';
5
+ import { CrvUSDUserData, CrvUSDVersions } from './curveUsd';
6
6
  import { FluidVaultData } from './fluid';
7
7
  import { LiquityTroveInfo } from './liquity';
8
- import { LiquityV2MarketData } from './liquityV2';
9
- import { LlamaLendGlobalMarketData, LlamaLendUserData, LlamaLendVersionsType } from './llamaLend';
8
+ import { LlamaLendUserData, LlamaLendVersionsType } from './llamaLend';
10
9
  import { CdpData } from './maker';
11
- import { MorphoBlueMarketInfo, MorphoBluePositionData, MorphoBlueVersions } from './morphoBlue';
12
- import { MorphoMidnightMarketInfo, MorphoMidnightPositionData, MorphoMidnightVersions } from './morphoMidnight';
13
- import { SparkMarketsData, SparkPositionData, SparkVersions } from './spark';
10
+ import { MorphoBluePositionData, MorphoBlueVersions } from './morphoBlue';
11
+ import { MorphoMidnightPositionData, MorphoMidnightVersions } from './morphoMidnight';
12
+ import { SparkPositionData, SparkVersions } from './spark';
14
13
  export interface PortfolioProtocolData<T> {
15
14
  error: string;
16
15
  data: T | null;
@@ -60,17 +59,3 @@ export interface PortfolioPositionsDataForAddress {
60
59
  export interface PortfolioPositionsData {
61
60
  [key: EthAddress]: PortfolioPositionsDataForAddress;
62
61
  }
63
- /** The `markets` getPortfolioData returns: every market it read, by protocol, keyed by market or spoke. */
64
- export interface PortfolioMarketsData {
65
- morphoMarketsData: Record<string, MorphoBlueMarketInfo>;
66
- morphoMidnightMarketsData: Record<string, MorphoMidnightMarketInfo>;
67
- compoundV3MarketsData: Record<string, CompoundV3MarketsData>;
68
- sparkMarketsData: Record<string, SparkMarketsData>;
69
- aaveV3MarketsData: Record<string, AaveV3MarketData>;
70
- aaveV2MarketsData: Record<string, AaveV2MarketData>;
71
- compoundV2MarketsData: Record<string, CompoundV2MarketsData>;
72
- crvUsdMarketsData: Record<string, CrvUSDGlobalMarketData>;
73
- llamaLendMarketsData: Record<string, LlamaLendGlobalMarketData>;
74
- liquityV2MarketsData: Record<string, LiquityV2MarketData>;
75
- aaveV4SpokesData: Record<string, AaveV4SpokeData>;
76
- }
@@ -1,4 +1,4 @@
1
- import { EthAddress } from '../common';
1
+ import { EthAddress, NetworkNumber } from '../common';
2
2
  export declare enum MorphoVaultType {
3
3
  MorphoVaultFlagshipEth = "morpho_vault_flagship_eth",
4
4
  MorphoVaultGauntletUSDCCore = "morpho_vault_gauntlet_usdc_core",
@@ -17,13 +17,21 @@ export declare enum MorphoVaultType {
17
17
  MorphoVaultSteakhousePYUSD = "morpho_vault_steakhouse_pyusd",
18
18
  MorphoVaultSmokehouseUSDT = "morpho_vault_smokehouse_usdt",
19
19
  MorphoVaultSmokehouseUSDC = "morpho_vault_smokehouse_usdc",
20
- MorphoVaultSmokehouseDAI = "morpho_vault_smokehouse_dai"
20
+ MorphoVaultSmokehouseDAI = "morpho_vault_smokehouse_dai",
21
+ MorphoVaultGauntletUSDGPremium = "morpho_vault_gauntlet_usdg_premium",
22
+ MorphoVaultSteakhouseUSDGPro = "morpho_vault_steakhouse_usdg_pro"
23
+ }
24
+ export declare enum MorphoVaultVersion {
25
+ V1 = 1,
26
+ V2 = 2
21
27
  }
22
28
  export interface MorphoVault {
23
29
  type: MorphoVaultType;
24
30
  name: string;
25
31
  address: EthAddress;
26
32
  asset: string;
33
+ network: NetworkNumber;
34
+ version: MorphoVaultVersion;
27
35
  deploymentBlock: number;
28
36
  isLegacy: boolean;
29
37
  }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MorphoVaultType = void 0;
3
+ exports.MorphoVaultVersion = exports.MorphoVaultType = void 0;
4
4
  var MorphoVaultType;
5
5
  (function (MorphoVaultType) {
6
6
  MorphoVaultType["MorphoVaultFlagshipEth"] = "morpho_vault_flagship_eth";
@@ -23,4 +23,12 @@ var MorphoVaultType;
23
23
  MorphoVaultType["MorphoVaultSmokehouseUSDT"] = "morpho_vault_smokehouse_usdt";
24
24
  MorphoVaultType["MorphoVaultSmokehouseUSDC"] = "morpho_vault_smokehouse_usdc";
25
25
  MorphoVaultType["MorphoVaultSmokehouseDAI"] = "morpho_vault_smokehouse_dai";
26
+ // Vault V2
27
+ MorphoVaultType["MorphoVaultGauntletUSDGPremium"] = "morpho_vault_gauntlet_usdg_premium";
28
+ MorphoVaultType["MorphoVaultSteakhouseUSDGPro"] = "morpho_vault_steakhouse_usdg_pro";
26
29
  })(MorphoVaultType || (exports.MorphoVaultType = MorphoVaultType = {}));
30
+ var MorphoVaultVersion;
31
+ (function (MorphoVaultVersion) {
32
+ MorphoVaultVersion[MorphoVaultVersion["V1"] = 1] = "V1";
33
+ MorphoVaultVersion[MorphoVaultVersion["V2"] = 2] = "V2";
34
+ })(MorphoVaultVersion || (exports.MorphoVaultVersion = MorphoVaultVersion = {}));
@@ -46,21 +46,6 @@ export interface SparkAssetData extends MMAssetData {
46
46
  eModeCategory: number;
47
47
  liquidationBonus: string;
48
48
  liquidationRatio: string;
49
- debtCeilingForIsolationMode?: string;
50
- isSiloed?: boolean;
51
- isolationModeTotalDebt?: string;
52
- isolationModeBorrowingEnabled?: boolean;
53
- assetId?: number;
54
- borrowRateStable?: string;
55
- supplyCap?: string;
56
- isInactive?: boolean;
57
- isFrozen?: boolean;
58
- isPaused?: boolean;
59
- canBeWithdrawn?: boolean;
60
- canBePayBacked?: boolean;
61
- disabledStableBorrowing?: boolean;
62
- isFlashLoanEnabled?: boolean;
63
- aTokenAddress?: EthAddress;
64
49
  }
65
50
  export interface SparkAssetsData {
66
51
  [token: string]: SparkAssetData;
@@ -115,12 +100,7 @@ export interface SparkAggregatedPositionData {
115
100
  minHealthRatio: string;
116
101
  exposure: string;
117
102
  }
118
- /**
119
- * Fields sparkGetAggregatedPositionData adds to every Spark position at runtime, on top of those declared below.
120
- * Optional, so code that builds a position by hand keeps compiling.
121
- */
122
- export type SparkPositionAggregatedFields = Partial<Omit<SparkAggregatedPositionData, keyof MMPositionData | 'ratio' | 'collRatio' | 'suppliedUsd' | 'borrowedUsd' | 'borrowLimitUsd' | 'suppliedCollateralUsd' | 'incentiveUsd' | 'totalInterestUsd'>>;
123
- export interface SparkPositionData extends MMPositionData, SparkPositionAggregatedFields {
103
+ export interface SparkPositionData extends MMPositionData {
124
104
  ratio: string;
125
105
  minRatio: string;
126
106
  collRatio: string;
@@ -31,7 +31,10 @@ export const aaveV3EmodeCategoriesMapping = (extractedState, usedAssets) => {
31
31
  : !usedAssetsValues.filter(u => u.isBorrowed && !e.borrowAssets.includes(u.symbol)).length;
32
32
  const afterEnteringCategory = aaveAnyGetAggregatedPositionData(Object.assign(Object.assign({}, extractedState), { usedAssets, eModeCategory: e.id }));
33
33
  const willStayOverCollateralized = new Dec(afterEnteringCategory.ratio === 'NaN' ? '0' : afterEnteringCategory.ratio).eq(0) || new Dec(afterEnteringCategory.ratio).gt(afterEnteringCategory.liqPercent);
34
- const enteringTerms = [borrowingOnlyFromCategory, willStayOverCollateralized];
34
+ const collateralOnlyFromCategory = e.id === 0 || !e.isolated
35
+ ? true
36
+ : !usedAssetsValues.filter(u => u.isSupplied && u.collateral && !e.collateralAssets.includes(u.symbol)).length;
37
+ const enteringTerms = [borrowingOnlyFromCategory, willStayOverCollateralized, collateralOnlyFromCategory];
35
38
  categoriesMapping[e.id] = {
36
39
  enteringTerms,
37
40
  canEnterCategory: !enteringTerms.includes(false),
@@ -48,6 +51,7 @@ export const aaveV3EmodeCategoriesMapping = (extractedState, usedAssets) => {
48
51
  };
49
52
  export function _getAaveV3MarketData(provider_1, network_1, market_1) {
50
53
  return __awaiter(this, arguments, void 0, function* (provider, network, market, blockNumber = 'latest') {
54
+ var _a;
51
55
  const _addresses = market.assets.map(a => getAssetInfo(getWrappedNativeAssetFromUnwrapped(a), network).address);
52
56
  const loanInfoContract = AaveV3ViewContractViem(provider, network);
53
57
  const aaveIncentivesContract = AaveIncentiveDataProviderV3ContractViem(provider, network);
@@ -81,6 +85,7 @@ export function _getAaveV3MarketData(provider_1, network_1, market_1) {
81
85
  borrowableBitmap: eModesInfo[i].borrowableBitmap.toString(),
82
86
  collateralBitmap: eModesInfo[i].collateralBitmap.toString(),
83
87
  ltvzeroBitmap: eModesInfo[i].ltvzeroBitmap.toString(),
88
+ isolated: (_a = eModesInfo[i].isolated) !== null && _a !== void 0 ? _a : false,
84
89
  borrowAssets: [],
85
90
  collateralAssets: [],
86
91
  ltvZeroAssets: [],
@@ -296,6 +301,7 @@ export function _getAaveV3MarketData(provider_1, network_1, market_1) {
296
301
  collateralAssets: assetsData.map((a) => a.symbol),
297
302
  borrowAssets: assetsData.map((a) => a.symbol),
298
303
  ltvZeroAssets: [],
304
+ isolated: false,
299
305
  };
300
306
  return { assetsData: payload, eModeCategoriesData };
301
307
  });
@@ -1,4 +1,4 @@
1
- import { AaveHelperCommon, AaveMarketInfo, AaveV3AggregatedPositionData, AaveV3AssetsData, AaveV3UsedAsset, AaveV3UsedAssets, AaveVersions } from '../../types';
1
+ import { AaveHelperCommon, AaveMarketInfo, AaveV3AggregatedPositionData, AaveV3AssetsData, AaveV3UsedAsset, AaveV3UsedAssets, AaveVersions, EModeCategoriesData } from '../../types';
2
2
  import { EthereumProvider, NetworkNumber } from '../../types/common';
3
3
  export declare const AAVE_V3_MARKETS: AaveVersions[];
4
4
  export declare const isAaveV2: ({ selectedMarket }: {
@@ -15,6 +15,14 @@ export declare const aaveV3IsInSiloedMode: ({ usedAssets, assetsData }: {
15
15
  usedAssets: AaveV3UsedAssets;
16
16
  assetsData: AaveV3AssetsData;
17
17
  }) => boolean;
18
+ export declare const aaveV3IsEmodeIsolated: ({ eModeCategory, eModeCategoriesData }: {
19
+ eModeCategory: number;
20
+ eModeCategoriesData?: EModeCategoriesData;
21
+ }) => boolean;
22
+ export declare const aaveV3CanBeCollateralInEmode: ({ eModeCategory, eModeCategoriesData }: {
23
+ eModeCategory: number;
24
+ eModeCategoriesData?: EModeCategoriesData;
25
+ }, _asset: string) => boolean;
18
26
  export declare const aaveAnyGetCollSuppliedAssets: ({ usedAssets }: {
19
27
  usedAssets: AaveV3UsedAssets;
20
28
  }) => AaveV3UsedAsset[];
@@ -33,6 +33,12 @@ export const isAaveV2 = ({ selectedMarket }) => selectedMarket.value === AaveVer
33
33
  export const isAaveV3 = ({ selectedMarket }) => AAVE_V3_MARKETS.includes(selectedMarket.value);
34
34
  export const aaveV3IsInIsolationMode = ({ usedAssets, assetsData }) => Object.values(usedAssets).some(({ symbol, collateral }) => collateral && assetsData[symbol].isIsolated);
35
35
  export const aaveV3IsInSiloedMode = ({ usedAssets, assetsData }) => Object.values(usedAssets).some(({ symbol, debt }) => debt && assetsData[symbol].isSiloed);
36
+ export const aaveV3IsEmodeIsolated = ({ eModeCategory, eModeCategoriesData }) => { var _a; return eModeCategory !== 0 && !!((_a = eModeCategoriesData === null || eModeCategoriesData === void 0 ? void 0 : eModeCategoriesData[eModeCategory]) === null || _a === void 0 ? void 0 : _a.isolated); };
37
+ export const aaveV3CanBeCollateralInEmode = ({ eModeCategory, eModeCategoriesData }, _asset) => {
38
+ if (!aaveV3IsEmodeIsolated({ eModeCategory, eModeCategoriesData }))
39
+ return true;
40
+ return eModeCategoriesData[eModeCategory].collateralAssets.includes(getNativeAssetFromWrapped(_asset));
41
+ };
36
42
  export const aaveAnyGetCollSuppliedAssets = ({ usedAssets }) => Object.values(usedAssets)
37
43
  .filter(({ isSupplied, collateral }) => isSupplied && collateral);
38
44
  export const aaveAnyGetSuppliableAssets = (_a) => {
@@ -40,13 +46,16 @@ export const aaveAnyGetSuppliableAssets = (_a) => {
40
46
  const data = Object.assign({ usedAssets, eModeCategory, assetsData, selectedMarket, network }, rest);
41
47
  const collAccountAssets = aaveAnyGetCollSuppliedAssets(data);
42
48
  const marketAssets = Object.values(assetsData);
43
- if (collAccountAssets.length === 0 || !isAaveV3(data))
49
+ if (!isAaveV3(data))
44
50
  return marketAssets.filter(({ canBeSupplied }) => canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: true }));
51
+ const canBeCollateralInEmode = (symbol) => aaveV3CanBeCollateralInEmode(data, symbol);
52
+ if (collAccountAssets.length === 0)
53
+ return marketAssets.filter(({ canBeSupplied }) => canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: canBeCollateralInEmode(symbol) }));
45
54
  if (aaveV3IsInIsolationMode(data)) {
46
55
  const collAsset = collAccountAssets[0].symbol;
47
- return marketAssets.filter(d => d.canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: symbol === collAsset }));
56
+ return marketAssets.filter(d => d.canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: symbol === collAsset && canBeCollateralInEmode(symbol) }));
48
57
  }
49
- return marketAssets.filter(d => d.canBeSupplied).map(({ symbol, isIsolated }) => ({ symbol, canBeCollateral: !isIsolated }));
58
+ return marketAssets.filter(d => d.canBeSupplied).map(({ symbol, isIsolated }) => ({ symbol, canBeCollateral: !isIsolated && canBeCollateralInEmode(symbol) }));
50
59
  };
51
60
  export const aaveAnyGetSuppliableAsCollAssets = (_a) => {
52
61
  var { usedAssets, eModeCategory, assetsData, selectedMarket, network } = _a, rest = __rest(_a, ["usedAssets", "eModeCategory", "assetsData", "selectedMarket", "network"]);
@@ -56,12 +65,15 @@ export const aaveAnyGetEmodeMutableProps = ({ eModeCategory, eModeCategoriesData
56
65
  const asset = getNativeAssetFromWrapped(_asset);
57
66
  const assetData = assetsData[asset];
58
67
  const eModeCategoryData = (eModeCategoriesData === null || eModeCategoriesData === void 0 ? void 0 : eModeCategoriesData[eModeCategory]) || {
59
- collateralAssets: [], ltvZeroAssets: [], collateralFactor: '0', liquidationRatio: '0',
68
+ collateralAssets: [], ltvZeroAssets: [], collateralFactor: '0', liquidationRatio: '0', isolated: false,
60
69
  };
61
70
  if (eModeCategory === 0
62
71
  || !eModeCategoryData.collateralAssets.includes(asset)
63
72
  || new Dec(eModeCategoryData.collateralFactor || 0).eq(0)) {
64
73
  const { liquidationRatio, collateralFactor } = assetData;
74
+ if (eModeCategory !== 0 && eModeCategoryData.isolated && !eModeCategoryData.collateralAssets.includes(asset)) {
75
+ return ({ liquidationRatio, collateralFactor: '0' });
76
+ }
65
77
  return ({ liquidationRatio, collateralFactor });
66
78
  }
67
79
  if (eModeCategoryData.ltvZeroAssets.includes(asset))
@@ -96,7 +108,10 @@ export const aaveAnyGetUserReserveLtvAndLltv = ({ eModeCategory, eModeCategories
96
108
  || !eModeCategoryData
97
109
  || !eModeCategoryData.collateralAssets.includes(asset)
98
110
  || new Dec(eModeCategoryData.collateralFactor || 0).eq(0)) {
99
- return { ltv: assetData.collateralFactor, lltv: assetData.liquidationRatio };
111
+ const ltv = eModeCategory !== 0 && (eModeCategoryData === null || eModeCategoryData === void 0 ? void 0 : eModeCategoryData.isolated) && !eModeCategoryData.collateralAssets.includes(asset)
112
+ ? '0'
113
+ : assetData.collateralFactor;
114
+ return { ltv, lltv: assetData.liquidationRatio };
100
115
  }
101
116
  const ltv = eModeCategoryData.ltvZeroAssets.includes(asset) ? '0' : eModeCategoryData.collateralFactor;
102
117
  return { ltv, lltv: eModeCategoryData.liquidationRatio };
@@ -1,9 +1,9 @@
1
1
  import { EthAddress, EthereumProvider, NetworkNumber } from '../types/common';
2
- import { PortfolioMarketsData, PortfolioPositionsData } from '../types';
2
+ import { PortfolioPositionsData } from '../types';
3
3
  export declare function getPortfolioData(provider: EthereumProvider, network: NetworkNumber, defaultProvider: EthereumProvider, addresses: EthAddress[], isSim?: boolean): Promise<{
4
4
  positions: PortfolioPositionsData;
5
5
  stakingPositions: any;
6
6
  rewardsData: any;
7
- markets: PortfolioMarketsData;
7
+ markets: any;
8
8
  }>;
9
9
  export * from './discovery';
@@ -501,11 +501,9 @@ export function getPortfolioData(provider_1, network_1, defaultProvider_1, addre
501
501
  positions[address.toLowerCase()].spark[market.value] = { error: `Error fetching Spark account data for address ${address} on market ${market.value}`, data: null };
502
502
  }
503
503
  }))).flat(),
504
- // flatMap, not map: each CDP's fetch has to be one of the awaited promises, or getPortfolioData can return
505
- // before a vault's data lands and the vault is missing from the result.
506
- ...addresses.flatMap((address) => {
504
+ ...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
507
505
  var _a;
508
- return ((_a = makerCdps[address.toLowerCase()]) !== null && _a !== void 0 ? _a : []).map((cdpInfo) => __awaiter(this, void 0, void 0, function* () {
506
+ return (_a = makerCdps[address.toLowerCase()]) === null || _a === void 0 ? void 0 : _a.map((cdpInfo) => __awaiter(this, void 0, void 0, function* () {
509
507
  try {
510
508
  const cdpData = yield _getMakerCdpData(client, network, cdpInfo);
511
509
  if (cdpData) {
@@ -517,7 +515,7 @@ export function getPortfolioData(provider_1, network_1, defaultProvider_1, addre
517
515
  positions[address.toLowerCase()].maker[cdpInfo.id] = { error: `Error fetching Maker CDP data for address ${address} with ID ${cdpInfo.id}`, data: null };
518
516
  }
519
517
  }));
520
- }),
518
+ })).flat(),
521
519
  ...aaveV2Markets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
522
520
  try {
523
521
  const accData = yield _getAaveV2AccountData(client, network, address, aaveV2MarketsData[market.value].assetsData, market);
@@ -18,7 +18,8 @@ import * as summerVaults from './summerVaults';
18
18
  import * as yearnV3Vaults from './yearnV3Vaults';
19
19
  export { morphoVaults, yearnVaults, makerDsr, skyOptions, sparkSavingsVaults, summerVaults, yearnV3Vaults, };
20
20
  export const getSavingsData = (provider, network, accounts) => __awaiter(void 0, void 0, void 0, function* () {
21
- const morphoVaultsList = Object.keys(morphoVaults.morphoVaultsOptions.MORPHO_VAULTS);
21
+ const morphoVaultsList = Object.keys(morphoVaults.morphoVaultsOptions.MORPHO_VAULTS)
22
+ .filter((key) => morphoVaults.morphoVaultsOptions.getMorphoVault(key).network === network);
22
23
  const yearnVaultsList = Object.keys(yearnVaults.yearnVaultsOptions.YEARN_VAULTS);
23
24
  const sparkSavingsVaultsList = Object.keys(sparkSavingsVaults.sparkSavingsVaultsOptions.SPARK_SAVINGS_VAULTS);
24
25
  const yearnV3VaultsList = Object.keys(yearnV3Vaults.yearnV3VaultsOptions.YEARN_V3_VAULTS);
@@ -26,7 +27,7 @@ export const getSavingsData = (provider, network, accounts) => __awaiter(void 0,
26
27
  .filter((key) => summerVaults.summerVaultsOptions.getSummerVault(key).network === network);
27
28
  const savingsData = {};
28
29
  yield Promise.all([
29
- ...(network === NetworkNumber.Eth ? [
30
+ ...(morphoVaultsList.length ? [
30
31
  (() => __awaiter(void 0, void 0, void 0, function* () {
31
32
  try {
32
33
  const vaults = morphoVaultsList.map((vaultKey) => morphoVaults.morphoVaultsOptions.getMorphoVault(vaultKey));
@@ -37,6 +38,8 @@ export const getSavingsData = (provider, network, accounts) => __awaiter(void 0,
37
38
  console.error('[getSavingsData] Error fetching morpho vaults:', err);
38
39
  }
39
40
  }))(),
41
+ ] : []),
42
+ ...(network === NetworkNumber.Eth ? [
40
43
  ...yearnVaultsList.map((vaultKey) => __awaiter(void 0, void 0, void 0, function* () {
41
44
  try {
42
45
  const vault = yearnVaults.yearnVaultsOptions.getYearnVault(vaultKey);
@@ -3,7 +3,7 @@ import * as morphoVaultsOptions from './options';
3
3
  import { EthAddress, EthereumProvider, NetworkNumber, MorphoVault, MorphoVaultType, SavingsVaultData } from '../../types';
4
4
  export { morphoVaultsOptions, };
5
5
  /**
6
- * Fetches liquidity for all given vaults in a single API request (chunked if over the page cap),
6
+ * Fetches liquidity for all given vaults, one API request per vault version (chunked if over the page cap),
7
7
  * returned as a map keyed by lowercased vault address. A vault missing from the API response is
8
8
  * absent from the map.
9
9
  */
@@ -11,43 +11,51 @@ import Dec from 'decimal.js';
11
11
  import { request as graphqlRequest } from 'graphql-request';
12
12
  import { assetAmountInEth } from '@defisaver/tokens';
13
13
  import * as morphoVaultsOptions from './options';
14
+ import { MorphoVaultVersion, } from '../../types';
14
15
  import { getViemProvider } from '../../services/viem';
15
- import { getMorphoVaultContractViem } from '../../contracts';
16
+ import { getErc4626ContractViem, getMorphoVaultContractViem } from '../../contracts';
16
17
  import { MORPHO_API_URL } from '../../constants';
17
18
  export { morphoVaultsOptions, };
18
19
  // Morpho API caps list page size at 100 items
19
20
  const MORPHO_API_PAGE_SIZE = 100;
20
- const vaultsLiquidityQuery = `
21
+ const buildLiquidityQuery = (listField) => `
21
22
  query VaultsLiquidity($addresses: [String!], $chainIds: [Int!]) {
22
- vaults(first: ${MORPHO_API_PAGE_SIZE}, where: { address_in: $addresses, chainId_in: $chainIds }) {
23
+ ${listField}(first: ${MORPHO_API_PAGE_SIZE}, where: { address_in: $addresses, chainId_in: $chainIds }) {
23
24
  items {
24
25
  address
25
- liquidity {
26
- underlying
27
- }
26
+ liquidity${listField === 'vaults' ? ' {\n underlying\n }' : ''}
28
27
  }
29
28
  }
30
29
  }`;
30
+ const liquidityQueries = {
31
+ [MorphoVaultVersion.V1]: { field: 'vaults', query: buildLiquidityQuery('vaults') },
32
+ [MorphoVaultVersion.V2]: { field: 'vaultV2s', query: buildLiquidityQuery('vaultV2s') },
33
+ };
31
34
  /**
32
- * Fetches liquidity for all given vaults in a single API request (chunked if over the page cap),
35
+ * Fetches liquidity for all given vaults, one API request per vault version (chunked if over the page cap),
33
36
  * returned as a map keyed by lowercased vault address. A vault missing from the API response is
34
37
  * absent from the map.
35
38
  */
36
39
  export const fetchMorphoVaultsLiquidity = (network, vaults) => __awaiter(void 0, void 0, void 0, function* () {
37
- const chunks = [];
38
- for (let i = 0; i < vaults.length; i += MORPHO_API_PAGE_SIZE)
39
- chunks.push(vaults.slice(i, i + MORPHO_API_PAGE_SIZE));
40
+ const requests = [];
41
+ [MorphoVaultVersion.V1, MorphoVaultVersion.V2].forEach((version) => {
42
+ const versionVaults = vaults.filter((vault) => vault.version === version);
43
+ for (let i = 0; i < versionVaults.length; i += MORPHO_API_PAGE_SIZE)
44
+ requests.push({ version, chunk: versionVaults.slice(i, i + MORPHO_API_PAGE_SIZE) });
45
+ });
40
46
  const liquidityByAddress = {};
41
- yield Promise.all(chunks.map((chunk) => __awaiter(void 0, void 0, void 0, function* () {
42
- const data = yield graphqlRequest(MORPHO_API_URL, vaultsLiquidityQuery, {
47
+ yield Promise.all(requests.map((_a) => __awaiter(void 0, [_a], void 0, function* ({ version, chunk }) {
48
+ const { field, query } = liquidityQueries[version];
49
+ const data = yield graphqlRequest(MORPHO_API_URL, query, {
43
50
  addresses: chunk.map((vault) => vault.address),
44
51
  chainIds: [network],
45
52
  // the BigInt scalar serializes as a JSON number when it fits in Number.MAX_SAFE_INTEGER, a string otherwise
46
53
  });
47
- (data.vaults.items || []).forEach((item) => {
48
- var _a, _b;
49
- if (((_a = item === null || item === void 0 ? void 0 : item.liquidity) === null || _a === void 0 ? void 0 : _a.underlying) !== undefined && ((_b = item.liquidity) === null || _b === void 0 ? void 0 : _b.underlying) !== null) {
50
- liquidityByAddress[item.address.toLowerCase()] = String(item.liquidity.underlying);
54
+ (data[field].items || []).forEach((item) => {
55
+ // V1 exposes liquidity as { underlying }, V2 as a plain BigInt scalar
56
+ const underlying = (item === null || item === void 0 ? void 0 : item.liquidity) !== null && typeof (item === null || item === void 0 ? void 0 : item.liquidity) === 'object' ? item.liquidity.underlying : item === null || item === void 0 ? void 0 : item.liquidity;
57
+ if (underlying !== undefined && underlying !== null) {
58
+ liquidityByAddress[item.address.toLowerCase()] = String(underlying);
51
59
  }
52
60
  });
53
61
  })));
@@ -60,7 +68,19 @@ const getBatchedViemProvider = (provider, network) => getViemProvider(provider,
60
68
  },
61
69
  },
62
70
  });
63
- const getMorphoVaultChainData = (provider, morphoVault, accounts) => __awaiter(void 0, void 0, void 0, function* () {
71
+ // Vault V2 is ERC-4626 but has no decimals offset, so shares are converted with convertToAssets
72
+ const getMorphoVaultV2ChainData = (provider, morphoVault, accounts) => __awaiter(void 0, void 0, void 0, function* () {
73
+ const vaultContract = getErc4626ContractViem(provider, morphoVault.address);
74
+ const [totalAssets, suppliedAssets] = yield Promise.all([
75
+ vaultContract.read.totalAssets(),
76
+ Promise.all(accounts.map((account) => __awaiter(void 0, void 0, void 0, function* () {
77
+ const share = yield vaultContract.read.balanceOf([account]);
78
+ return share === BigInt(0) ? BigInt(0) : vaultContract.read.convertToAssets([share]);
79
+ }))),
80
+ ]);
81
+ return { totalAssets, suppliedAssets };
82
+ });
83
+ const getMorphoVaultV1ChainData = (provider, morphoVault, accounts) => __awaiter(void 0, void 0, void 0, function* () {
64
84
  const morphoVaultContract = getMorphoVaultContractViem(provider, morphoVault.address);
65
85
  const shares = {};
66
86
  const [totalAssets, totalSupply, decimals, decimalsOffset] = yield Promise.all([
@@ -77,11 +97,29 @@ const getMorphoVaultChainData = (provider, morphoVault, accounts) => __awaiter(v
77
97
  totalAssets, totalSupply, decimals, decimalsOffset, shares,
78
98
  };
79
99
  });
100
+ const getMorphoVaultChainData = (provider, morphoVault, accounts) => __awaiter(void 0, void 0, void 0, function* () {
101
+ return (morphoVault.version === MorphoVaultVersion.V2
102
+ ? { v2: yield getMorphoVaultV2ChainData(provider, morphoVault, accounts) }
103
+ : { v1: yield getMorphoVaultV1ChainData(provider, morphoVault, accounts) });
104
+ });
80
105
  const formatMorphoVaultData = (morphoVault, chainData, liquidityUnderlying, accounts) => {
81
- const { totalAssets, totalSupply, decimals, decimalsOffset, shares, } = chainData;
82
- const poolSize = assetAmountInEth(totalAssets.toString(), morphoVault.asset);
83
106
  const liquidity = assetAmountInEth(liquidityUnderlying, morphoVault.asset);
84
107
  const supplied = {};
108
+ if (chainData.v2) {
109
+ const { totalAssets, suppliedAssets } = chainData.v2;
110
+ accounts.forEach((account, i) => {
111
+ supplied[account.toLowerCase()] = assetAmountInEth(suppliedAssets[i].toString(), morphoVault.asset);
112
+ });
113
+ return {
114
+ poolSize: assetAmountInEth(totalAssets.toString(), morphoVault.asset),
115
+ supplied,
116
+ liquidity,
117
+ asset: morphoVault.asset,
118
+ optionType: morphoVault.type,
119
+ };
120
+ }
121
+ const { totalAssets, totalSupply, decimals, decimalsOffset, shares, } = chainData.v1;
122
+ const poolSize = assetAmountInEth(totalAssets.toString(), morphoVault.asset);
85
123
  accounts.forEach((account) => {
86
124
  const share = shares[account] || BigInt(0);
87
125
  supplied[account.toLowerCase()] = new Dec(new Dec(share.toString()).mul(new Dec(totalAssets.toString()).add(1)).div(new Dec(totalSupply.toString()).add(Math.pow(10, decimalsOffset))).div(Math.pow(10, 18))
@@ -17,5 +17,7 @@ export declare const MORPHO_VAULT_STEAKHOUSE_PYUSD: MorphoVault;
17
17
  export declare const MORPHO_VAULT_SMOKEHOUSE_USDT: MorphoVault;
18
18
  export declare const MORPHO_VAULT_SMOKEHOUSE_USDC: MorphoVault;
19
19
  export declare const MORPHO_VAULT_SMOKEHOUSE_DAI: MorphoVault;
20
+ export declare const MORPHO_VAULT_GAUNTLET_USDG_PREMIUM: MorphoVault;
21
+ export declare const MORPHO_VAULT_STEAKHOUSE_USDG_PRO: MorphoVault;
20
22
  export declare const MORPHO_VAULTS: Record<MorphoVaultType, MorphoVault>;
21
23
  export declare const getMorphoVault: (type: MorphoVaultType) => MorphoVault;