@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
@@ -1,9 +1,11 @@
1
- import { MorphoVaultType } from '../../types';
1
+ import { MorphoVaultType, MorphoVaultVersion, NetworkNumber, } from '../../types';
2
2
  export const MORPHO_VAULT_FLAGSHIP_ETH = {
3
3
  type: MorphoVaultType.MorphoVaultFlagshipEth,
4
4
  name: 'Flagship ETH',
5
5
  address: '0x38989BBA00BDF8181F4082995b3DEAe96163aC5D',
6
6
  asset: 'WETH',
7
+ network: NetworkNumber.Eth,
8
+ version: MorphoVaultVersion.V1,
7
9
  deploymentBlock: 18927491,
8
10
  isLegacy: true,
9
11
  };
@@ -12,6 +14,8 @@ export const MORPHO_VAULT_GAUNTLET_USDC_CORE = {
12
14
  name: 'Gauntlet USDC Core',
13
15
  address: '0x8eB67A509616cd6A7c1B3c8C21D48FF57df3d458',
14
16
  asset: 'USDC',
17
+ network: NetworkNumber.Eth,
18
+ version: MorphoVaultVersion.V1,
15
19
  deploymentBlock: 19777569,
16
20
  isLegacy: true,
17
21
  };
@@ -20,6 +24,8 @@ export const MORPHO_VAULT_GAUNTLET_USDC_PRIME = {
20
24
  name: 'Gauntlet USDC Prime',
21
25
  address: '0xdd0f28e19C1780eb6396170735D45153D261490d',
22
26
  asset: 'USDC',
27
+ network: NetworkNumber.Eth,
28
+ version: MorphoVaultVersion.V1,
23
29
  deploymentBlock: 19777569,
24
30
  isLegacy: true,
25
31
  };
@@ -28,6 +34,8 @@ export const MORPHO_VAULT_RE7_WETH = {
28
34
  name: 'RE7 WETH',
29
35
  address: '0x78Fc2c2eD1A4cDb5402365934aE5648aDAd094d0',
30
36
  asset: 'WETH',
37
+ network: NetworkNumber.Eth,
38
+ version: MorphoVaultVersion.V1,
31
39
  deploymentBlock: 19121118,
32
40
  isLegacy: true,
33
41
  };
@@ -36,6 +44,8 @@ export const MORPHO_VAULT_GAUNTLET_WETH_CORE = {
36
44
  name: 'Gauntlet WETH Core',
37
45
  address: '0x4881Ef0BF6d2365D3dd6499ccd7532bcdBCE0658',
38
46
  asset: 'WETH',
47
+ network: NetworkNumber.Eth,
48
+ version: MorphoVaultVersion.V1,
39
49
  deploymentBlock: 19541126,
40
50
  isLegacy: true,
41
51
  };
@@ -44,6 +54,8 @@ export const MORPHO_VAULT_GAUNTLET_WETH_PRIME = {
44
54
  name: 'Gauntlet WETH Prime',
45
55
  address: '0x2371e134e3455e0593363cBF89d3b6cf53740618',
46
56
  asset: 'WETH',
57
+ network: NetworkNumber.Eth,
58
+ version: MorphoVaultVersion.V1,
47
59
  deploymentBlock: 19372149,
48
60
  isLegacy: true,
49
61
  };
@@ -52,6 +64,8 @@ export const MORPHO_VAULT_BOOSTED_USDC = {
52
64
  name: 'Boosted USDC',
53
65
  address: '0xd63070114470f685b75B74D60EEc7c1113d33a3D',
54
66
  asset: 'USDC',
67
+ network: NetworkNumber.Eth,
68
+ version: MorphoVaultVersion.V1,
55
69
  deploymentBlock: 20377233,
56
70
  isLegacy: true,
57
71
  };
@@ -60,6 +74,8 @@ export const MORPHO_VAULT_FLAGSHIP_USDT = {
60
74
  name: 'Flagship USDT',
61
75
  address: '0x2C25f6C25770fFEC5959D34B94Bf898865e5D6b1',
62
76
  asset: 'USDT',
77
+ network: NetworkNumber.Eth,
78
+ version: MorphoVaultVersion.V1,
63
79
  deploymentBlock: 19127039,
64
80
  isLegacy: true,
65
81
  };
@@ -68,6 +84,8 @@ export const MORPHO_VAULT_GAUNTLET_USDA_CORE = {
68
84
  name: 'Gauntlet USDA Core',
69
85
  address: '0x125D41A6e5dbf455cD9Df8F80BCC6fd172D52Cc6',
70
86
  asset: 'USDA',
87
+ network: NetworkNumber.Eth,
88
+ version: MorphoVaultVersion.V1,
71
89
  deploymentBlock: 19633608,
72
90
  isLegacy: true,
73
91
  };
@@ -76,6 +94,8 @@ export const MORPHO_VAULT_GAUNTLET_USDT_PRIME = {
76
94
  name: 'Gauntlet USDT Prime',
77
95
  address: '0x8CB3649114051cA5119141a34C200D65dc0Faa73',
78
96
  asset: 'USDT',
97
+ network: NetworkNumber.Eth,
98
+ version: MorphoVaultVersion.V1,
79
99
  deploymentBlock: 19486541,
80
100
  isLegacy: true,
81
101
  };
@@ -84,6 +104,8 @@ export const MORPHO_VAULT_GAUNTLET_RESOLV_USDC = {
84
104
  name: 'Gauntlet Resolv USDC',
85
105
  address: '0x132E6C9C33A62D7727cd359b1f51e5B566E485Eb',
86
106
  asset: 'USDC',
107
+ network: NetworkNumber.Eth,
108
+ version: MorphoVaultVersion.V1,
87
109
  deploymentBlock: 21487882,
88
110
  isLegacy: true,
89
111
  };
@@ -93,6 +115,8 @@ export const MORPHO_VAULT_STEAKHOUSE_USDT = {
93
115
  name: 'Steakhouse USDT',
94
116
  address: '0xbEef047a543E45807105E51A8BBEFCc5950fcfBa',
95
117
  asset: 'USDT',
118
+ network: NetworkNumber.Eth,
119
+ version: MorphoVaultVersion.V1,
96
120
  deploymentBlock: 19043398,
97
121
  isLegacy: false,
98
122
  };
@@ -101,6 +125,8 @@ export const MORPHO_VAULT_STEAKHOUSE_USDC = {
101
125
  name: 'Steakhouse USDC',
102
126
  address: '0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB',
103
127
  asset: 'USDC',
128
+ network: NetworkNumber.Eth,
129
+ version: MorphoVaultVersion.V1,
104
130
  deploymentBlock: 18928285,
105
131
  isLegacy: false,
106
132
  };
@@ -109,6 +135,8 @@ export const MORPHO_VAULT_STEAKHOUSE_ETH = {
109
135
  name: 'Steakhouse WETH',
110
136
  address: '0xBEEf050ecd6a16c4e7bfFbB52Ebba7846C4b8cD4',
111
137
  asset: 'WETH',
138
+ network: NetworkNumber.Eth,
139
+ version: MorphoVaultVersion.V1,
112
140
  deploymentBlock: 19380443,
113
141
  isLegacy: false,
114
142
  };
@@ -117,6 +145,8 @@ export const MORPHO_VAULT_STEAKHOUSE_PYUSD = {
117
145
  name: 'Steakhouse PYUSD',
118
146
  address: '0xbEEF02e5E13584ab96848af90261f0C8Ee04722a',
119
147
  asset: 'PYUSD',
148
+ network: NetworkNumber.Eth,
149
+ version: MorphoVaultVersion.V1,
120
150
  deploymentBlock: 19043398,
121
151
  isLegacy: false,
122
152
  };
@@ -126,6 +156,8 @@ export const MORPHO_VAULT_SMOKEHOUSE_USDT = {
126
156
  name: 'Smokehouse USDT',
127
157
  address: '0xA0804346780b4c2e3bE118ac957D1DB82F9d7484',
128
158
  asset: 'USDT',
159
+ network: NetworkNumber.Eth,
160
+ version: MorphoVaultVersion.V1,
129
161
  deploymentBlock: 21522238,
130
162
  isLegacy: false,
131
163
  };
@@ -134,6 +166,8 @@ export const MORPHO_VAULT_SMOKEHOUSE_USDC = {
134
166
  name: 'Smokehouse USDC',
135
167
  address: '0xBEeFFF209270748ddd194831b3fa287a5386f5bC',
136
168
  asset: 'USDC',
169
+ network: NetworkNumber.Eth,
170
+ version: MorphoVaultVersion.V1,
137
171
  deploymentBlock: 21337719,
138
172
  isLegacy: false,
139
173
  };
@@ -142,9 +176,32 @@ export const MORPHO_VAULT_SMOKEHOUSE_DAI = {
142
176
  name: 'Smokehouse DAI',
143
177
  address: '0xbeeFfF68CC520D68f82641EFF84330C631E2490E',
144
178
  asset: 'DAI',
179
+ network: NetworkNumber.Eth,
180
+ version: MorphoVaultVersion.V1,
145
181
  deploymentBlock: 21343808,
146
182
  isLegacy: false,
147
183
  };
184
+ // Vault V2
185
+ export const MORPHO_VAULT_GAUNTLET_USDG_PREMIUM = {
186
+ type: MorphoVaultType.MorphoVaultGauntletUSDGPremium,
187
+ name: 'Gauntlet USDG Premium',
188
+ address: '0x390c1bb01F3F627144a40617e287d4cE3D5aBCfa',
189
+ asset: 'USDG',
190
+ network: NetworkNumber.Arb,
191
+ version: MorphoVaultVersion.V2,
192
+ deploymentBlock: 510799903,
193
+ isLegacy: false,
194
+ };
195
+ export const MORPHO_VAULT_STEAKHOUSE_USDG_PRO = {
196
+ type: MorphoVaultType.MorphoVaultSteakhouseUSDGPro,
197
+ name: 'Steakhouse USDG Pro',
198
+ address: '0xbeeFf72B77e7584a450E887125F25E8D8819016a',
199
+ asset: 'USDG',
200
+ network: NetworkNumber.Arb,
201
+ version: MorphoVaultVersion.V2,
202
+ deploymentBlock: 512247107,
203
+ isLegacy: false,
204
+ };
148
205
  export const MORPHO_VAULTS = {
149
206
  [MorphoVaultType.MorphoVaultFlagshipEth]: MORPHO_VAULT_FLAGSHIP_ETH,
150
207
  [MorphoVaultType.MorphoVaultGauntletUSDCCore]: MORPHO_VAULT_GAUNTLET_USDC_CORE,
@@ -166,5 +223,8 @@ export const MORPHO_VAULTS = {
166
223
  [MorphoVaultType.MorphoVaultSmokehouseUSDT]: MORPHO_VAULT_SMOKEHOUSE_USDT,
167
224
  [MorphoVaultType.MorphoVaultSmokehouseUSDC]: MORPHO_VAULT_SMOKEHOUSE_USDC,
168
225
  [MorphoVaultType.MorphoVaultSmokehouseDAI]: MORPHO_VAULT_SMOKEHOUSE_DAI,
226
+ // Vault V2
227
+ [MorphoVaultType.MorphoVaultGauntletUSDGPremium]: MORPHO_VAULT_GAUNTLET_USDG_PREMIUM,
228
+ [MorphoVaultType.MorphoVaultSteakhouseUSDGPro]: MORPHO_VAULT_STEAKHOUSE_USDG_PRO,
169
229
  };
170
230
  export const getMorphoVault = (type) => MORPHO_VAULTS[type];
@@ -81,6 +81,7 @@ export const _getSparkMarketsData = (provider, network, selectedMarket) => __awa
81
81
  collateralAssets: eModeCategoriesData[emodeCategoryId] ? [...eModeCategoriesData[emodeCategoryId].collateralAssets, selectedMarket.assets[i]] : [selectedMarket.assets[i]],
82
82
  borrowAssets: eModeCategoriesData[emodeCategoryId] ? [...eModeCategoriesData[emodeCategoryId].borrowAssets, selectedMarket.assets[i]] : [selectedMarket.assets[i]],
83
83
  ltvZeroAssets: [],
84
+ isolated: false,
84
85
  };
85
86
  return ({
86
87
  symbol: selectedMarket.assets[i],
@@ -1,4 +1,4 @@
1
- import { EthAddress, IncentiveData, LeverageType, MMAssetData, MMPositionData, MMUsedAsset, NetworkNumber } from './common';
1
+ import { IncentiveData, LeverageType, MMAssetData, MMPositionData, MMUsedAsset, NetworkNumber } from './common';
2
2
  export declare enum AaveVersions {
3
3
  AaveV1 = "v1",
4
4
  AaveV2 = "v2default",
@@ -40,6 +40,7 @@ export interface EModeCategoryData {
40
40
  borrowAssets: string[];
41
41
  ltvzeroBitmap?: string;
42
42
  ltvZeroAssets: string[];
43
+ isolated: boolean;
43
44
  }
44
45
  export interface EModeCategoryDataMapping {
45
46
  enteringTerms: boolean[];
@@ -84,8 +85,6 @@ export interface AaveV3AssetData extends AaveAssetData {
84
85
  liquidationBonus: string;
85
86
  supplyIncentives: IncentiveData[];
86
87
  borrowIncentives: IncentiveData[];
87
- aTokenAddress?: EthAddress;
88
- vTokenAddress?: EthAddress;
89
88
  }
90
89
  export type EModeCategoriesData = Record<number, EModeCategoryData>;
91
90
  export type AaveAssetsData<T> = {
@@ -123,12 +122,7 @@ export type AaveUsedAssets<T> = {
123
122
  };
124
123
  export type AaveV2UsedAssets = AaveUsedAssets<AaveV2UsedAsset>;
125
124
  export type AaveV3UsedAssets = AaveUsedAssets<AaveV3UsedAsset>;
126
- /**
127
- * Fields aaveAnyGetAggregatedPositionData adds to every Aave V2/V3 position at runtime, on top of those declared
128
- * below. Optional, so code that builds a position by hand keeps compiling.
129
- */
130
- export type AavePositionAggregatedFields = Partial<Omit<AaveV3AggregatedPositionData, keyof MMPositionData | 'ratio' | 'collRatio' | 'safetyRatioWithLtvZeroFallback' | 'suppliedUsd' | 'borrowedUsd' | 'borrowLimitUsd' | 'suppliedCollateralUsd' | 'incentiveUsd' | 'totalInterestUsd'>>;
131
- export interface AavePositionData extends MMPositionData, AavePositionAggregatedFields {
125
+ export interface AavePositionData extends MMPositionData {
132
126
  ratio: string;
133
127
  minRatio: string;
134
128
  collRatio: string;
@@ -145,12 +139,6 @@ export interface AavePositionData extends MMPositionData, AavePositionAggregated
145
139
  }
146
140
  export interface AaveV2PositionData extends AavePositionData {
147
141
  usedAssets: AaveV2UsedAssets;
148
- eModeCategory?: number;
149
- isInIsolationMode?: boolean;
150
- isInSiloedMode?: boolean;
151
- eModeCategories?: {
152
- [key: number]: EModeCategoryDataMapping;
153
- };
154
142
  }
155
143
  export interface AaveV3PositionData extends AavePositionData {
156
144
  usedAssets: AaveV3UsedAssets;
@@ -52,7 +52,6 @@ export interface CompoundAssetData extends MMAssetData {
52
52
  sortIndex?: number;
53
53
  }
54
54
  export interface CompoundV2AssetData extends CompoundAssetData {
55
- exchangeRate?: string;
56
55
  }
57
56
  export interface CompoundV3AssetData extends CompoundAssetData {
58
57
  borrowCollateralFactor: string;
@@ -64,17 +63,6 @@ export interface CompoundV3AssetData extends CompoundAssetData {
64
63
  supplyCap: string;
65
64
  priceInBaseAsset: string;
66
65
  canBeWithdrawn: boolean;
67
- tokenAddr?: EthAddress;
68
- isBase?: boolean;
69
- baseBorrowMin?: string;
70
- baseTrackingBorrowRewardsSpeed?: string;
71
- baseTrackingSupplyRewardsSpeed?: string;
72
- borrowIndex?: string;
73
- supplyIndex?: string;
74
- trackingBorrowIndex?: string;
75
- trackingSupplyIndex?: string;
76
- rewardSupplySpeed?: string;
77
- rewardBorrowSpeed?: string;
78
66
  }
79
67
  export interface CompoundAssetsData<T> {
80
68
  [token: string]: T;
@@ -135,21 +123,9 @@ export interface CompoundPositionData extends MMPositionData {
135
123
  isSubscribedToAutomation?: boolean;
136
124
  automationResubscribeRequired?: boolean;
137
125
  }
138
- /**
139
- * Fields getCompoundV2AggregatedData adds to every Compound V2 position at runtime — a subset of
140
- * CompoundAggregatedPositionData. Optional, so code that builds a position by hand keeps compiling.
141
- */
142
- export type CompoundV2PositionAggregatedFields = Partial<Pick<CompoundAggregatedPositionData, 'suppliedCollateralUsd' | 'liquidationLimitUsd' | 'leftToBorrowUsd' | 'collRatio' | 'leveragedType' | 'leveragedAsset' | 'liquidationPrice'>>;
143
- /**
144
- * Fields getCompoundV3AggregatedData adds to every Compound V3 position at runtime, on top of those declared in
145
- * CompoundPositionData. Optional, so code that builds a position by hand keeps compiling.
146
- */
147
- export type CompoundV3PositionAggregatedFields = Partial<Omit<CompoundAggregatedPositionData, keyof MMPositionData | 'ratio' | 'minRatio' | 'suppliedUsd' | 'borrowedUsd' | 'borrowLimitUsd' | 'incentiveUsd' | 'totalInterestUsd'>>;
148
- export interface CompoundV2PositionData extends CompoundPositionData, CompoundV2PositionAggregatedFields {
126
+ export interface CompoundV2PositionData extends CompoundPositionData {
149
127
  usedAssets: CompoundV2UsedAssets;
150
- borrowStableSupplyUnstable?: boolean;
151
128
  }
152
- export interface CompoundV3PositionData extends CompoundPositionData, CompoundV3PositionAggregatedFields {
129
+ export interface CompoundV3PositionData extends CompoundPositionData {
153
130
  usedAssets: CompoundV3UsedAssets;
154
- isAllowed?: boolean;
155
131
  }
@@ -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
  }
@@ -20,4 +20,12 @@ export var MorphoVaultType;
20
20
  MorphoVaultType["MorphoVaultSmokehouseUSDT"] = "morpho_vault_smokehouse_usdt";
21
21
  MorphoVaultType["MorphoVaultSmokehouseUSDC"] = "morpho_vault_smokehouse_usdc";
22
22
  MorphoVaultType["MorphoVaultSmokehouseDAI"] = "morpho_vault_smokehouse_dai";
23
+ // Vault V2
24
+ MorphoVaultType["MorphoVaultGauntletUSDGPremium"] = "morpho_vault_gauntlet_usdg_premium";
25
+ MorphoVaultType["MorphoVaultSteakhouseUSDGPro"] = "morpho_vault_steakhouse_usdg_pro";
23
26
  })(MorphoVaultType || (MorphoVaultType = {}));
27
+ export var MorphoVaultVersion;
28
+ (function (MorphoVaultVersion) {
29
+ MorphoVaultVersion[MorphoVaultVersion["V1"] = 1] = "V1";
30
+ MorphoVaultVersion[MorphoVaultVersion["V2"] = 2] = "V2";
31
+ })(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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defisaver/positions-sdk",
3
- "version": "2.1.161-portfolio-api-1-dev",
3
+ "version": "2.1.162",
4
4
  "description": "",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./esm/index.js",
@@ -61,7 +61,10 @@ export const aaveV3EmodeCategoriesMapping = (extractedState: any, usedAssets: Aa
61
61
  ...extractedState, usedAssets, eModeCategory: e.id,
62
62
  });
63
63
  const willStayOverCollateralized = new Dec(afterEnteringCategory.ratio === 'NaN' ? '0' : afterEnteringCategory.ratio).eq(0) || new Dec(afterEnteringCategory.ratio).gt(afterEnteringCategory.liqPercent);
64
- const enteringTerms = [borrowingOnlyFromCategory, willStayOverCollateralized];
64
+ const collateralOnlyFromCategory = e.id === 0 || !e.isolated
65
+ ? true
66
+ : !usedAssetsValues.filter(u => u.isSupplied && u.collateral && !e.collateralAssets.includes(u.symbol)).length;
67
+ const enteringTerms = [borrowingOnlyFromCategory, willStayOverCollateralized, collateralOnlyFromCategory];
65
68
  categoriesMapping[e.id] = {
66
69
  enteringTerms,
67
70
  canEnterCategory: !enteringTerms.includes(false),
@@ -118,6 +121,7 @@ export async function _getAaveV3MarketData(provider: Client, network: NetworkNum
118
121
  borrowableBitmap: eModesInfo[i].borrowableBitmap.toString(),
119
122
  collateralBitmap: eModesInfo[i].collateralBitmap.toString(),
120
123
  ltvzeroBitmap: eModesInfo[i].ltvzeroBitmap.toString(),
124
+ isolated: eModesInfo[i].isolated ?? false,
121
125
  borrowAssets: [],
122
126
  collateralAssets: [],
123
127
  ltvZeroAssets: [],
@@ -345,6 +349,7 @@ export async function _getAaveV3MarketData(provider: Client, network: NetworkNum
345
349
  collateralAssets: assetsData.map((a) => a.symbol),
346
350
  borrowAssets: assetsData.map((a) => a.symbol),
347
351
  ltvZeroAssets: [],
352
+ isolated: false,
348
353
  };
349
354
 
350
355
  return { assetsData: payload, eModeCategoriesData };
@@ -2,7 +2,7 @@ import Dec from 'decimal.js';
2
2
  import { assetAmountInWei, getAssetInfo, getAssetInfoByAddress } from '@defisaver/tokens';
3
3
  import { Client } from 'viem';
4
4
  import {
5
- AaveAssetData, AaveHelperCommon, AaveMarketInfo, AaveV3AggregatedPositionData, AaveV3AssetsData, AaveV3UsedAsset, AaveV3UsedAssets, AaveVersions,
5
+ AaveAssetData, AaveHelperCommon, AaveMarketInfo, AaveV3AggregatedPositionData, AaveV3AssetsData, AaveV3UsedAsset, AaveV3UsedAssets, AaveVersions, EModeCategoriesData,
6
6
  } from '../../types';
7
7
  import { getNativeAssetFromWrapped, getWrappedNativeAssetFromUnwrapped } from '../../services/utils';
8
8
  import {
@@ -24,6 +24,13 @@ export const isAaveV3 = ({ selectedMarket }: { selectedMarket: Partial<AaveMarke
24
24
  export const aaveV3IsInIsolationMode = ({ usedAssets, assetsData }: { usedAssets: AaveV3UsedAssets, assetsData: AaveV3AssetsData }) => Object.values(usedAssets).some(({ symbol, collateral }) => collateral && assetsData[symbol].isIsolated);
25
25
  export const aaveV3IsInSiloedMode = ({ usedAssets, assetsData }: { usedAssets: AaveV3UsedAssets, assetsData: AaveV3AssetsData }) => Object.values(usedAssets).some(({ symbol, debt }) => debt && assetsData[symbol].isSiloed);
26
26
 
27
+ export const aaveV3IsEmodeIsolated = ({ eModeCategory, eModeCategoriesData }: { eModeCategory: number, eModeCategoriesData?: EModeCategoriesData }) => eModeCategory !== 0 && !!eModeCategoriesData?.[eModeCategory]?.isolated;
28
+
29
+ export const aaveV3CanBeCollateralInEmode = ({ eModeCategory, eModeCategoriesData }: { eModeCategory: number, eModeCategoriesData?: EModeCategoriesData }, _asset: string) => {
30
+ if (!aaveV3IsEmodeIsolated({ eModeCategory, eModeCategoriesData })) return true;
31
+ return eModeCategoriesData![eModeCategory].collateralAssets.includes(getNativeAssetFromWrapped(_asset));
32
+ };
33
+
27
34
  export const aaveAnyGetCollSuppliedAssets = ({ usedAssets }: { usedAssets: AaveV3UsedAssets }) => Object.values(usedAssets)
28
35
  .filter(({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral);
29
36
 
@@ -37,14 +44,18 @@ export const aaveAnyGetSuppliableAssets = ({
37
44
  const collAccountAssets = aaveAnyGetCollSuppliedAssets(data);
38
45
  const marketAssets = Object.values(assetsData) as AaveAssetData[];
39
46
 
40
- if (collAccountAssets.length === 0 || !isAaveV3(data)) return marketAssets.filter(({ canBeSupplied }) => canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: true }));
47
+ if (!isAaveV3(data)) return marketAssets.filter(({ canBeSupplied }) => canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: true }));
48
+
49
+ const canBeCollateralInEmode = (symbol: string) => aaveV3CanBeCollateralInEmode(data, symbol);
50
+
51
+ if (collAccountAssets.length === 0) return marketAssets.filter(({ canBeSupplied }) => canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: canBeCollateralInEmode(symbol) }));
41
52
 
42
53
  if (aaveV3IsInIsolationMode(data)) {
43
54
  const collAsset = collAccountAssets[0].symbol;
44
- return marketAssets.filter(d => d.canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: symbol === collAsset }));
55
+ return marketAssets.filter(d => d.canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: symbol === collAsset && canBeCollateralInEmode(symbol) }));
45
56
  }
46
57
 
47
- 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) }));
48
59
  };
49
60
 
50
61
  export const aaveAnyGetSuppliableAsCollAssets = ({
@@ -62,8 +73,8 @@ export const aaveAnyGetEmodeMutableProps = (
62
73
  const asset = getNativeAssetFromWrapped(_asset);
63
74
 
64
75
  const assetData = assetsData[asset];
65
- const eModeCategoryData: { collateralAssets: string[], collateralFactor: string, liquidationRatio: string, ltvZeroAssets: string[] } = eModeCategoriesData?.[eModeCategory] || {
66
- collateralAssets: [], ltvZeroAssets: [], collateralFactor: '0', liquidationRatio: '0',
76
+ const eModeCategoryData: { collateralAssets: string[], collateralFactor: string, liquidationRatio: string, ltvZeroAssets: string[], isolated?: boolean } = eModeCategoriesData?.[eModeCategory] || {
77
+ collateralAssets: [], ltvZeroAssets: [], collateralFactor: '0', liquidationRatio: '0', isolated: false,
67
78
  };
68
79
 
69
80
  if (
@@ -72,6 +83,9 @@ export const aaveAnyGetEmodeMutableProps = (
72
83
  || new Dec(eModeCategoryData.collateralFactor || 0).eq(0)
73
84
  ) {
74
85
  const { liquidationRatio, collateralFactor } = assetData;
86
+ if (eModeCategory !== 0 && eModeCategoryData.isolated && !eModeCategoryData.collateralAssets.includes(asset)) {
87
+ return ({ liquidationRatio, collateralFactor: '0' });
88
+ }
75
89
  return ({ liquidationRatio, collateralFactor });
76
90
  }
77
91
  if (eModeCategoryData.ltvZeroAssets.includes(asset)) return ({ liquidationRatio: '0', collateralFactor: '0' });
@@ -118,7 +132,10 @@ export const aaveAnyGetUserReserveLtvAndLltv = (
118
132
  || !eModeCategoryData.collateralAssets.includes(asset)
119
133
  || new Dec(eModeCategoryData.collateralFactor || 0).eq(0)
120
134
  ) {
121
- return { ltv: assetData.collateralFactor, lltv: assetData.liquidationRatio };
135
+ const ltv = eModeCategory !== 0 && eModeCategoryData?.isolated && !eModeCategoryData.collateralAssets.includes(asset)
136
+ ? '0'
137
+ : assetData.collateralFactor;
138
+ return { ltv, lltv: assetData.liquidationRatio };
122
139
  }
123
140
 
124
141
  const ltv = eModeCategoryData.ltvZeroAssets.includes(asset) ? '0' : eModeCategoryData.collateralFactor;
@@ -27,7 +27,6 @@ import {
27
27
  LlamaLendGlobalMarketData,
28
28
  MorphoBlueMarketInfo,
29
29
  MorphoMidnightMarketInfo,
30
- PortfolioMarketsData,
31
30
  PortfolioPositionsData,
32
31
  SparkMarketsData,
33
32
  } from '../types';
@@ -56,7 +55,7 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
56
55
  positions: PortfolioPositionsData;
57
56
  stakingPositions: any;
58
57
  rewardsData: any;
59
- markets: PortfolioMarketsData;
58
+ markets: any;
60
59
  }> {
61
60
  const isMainnet = network === NetworkNumber.Eth;
62
61
  const isFluidSupported = [NetworkNumber.Eth, NetworkNumber.Arb, NetworkNumber.Base, NetworkNumber.Plasma].includes(network);
@@ -97,7 +96,7 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
97
96
  const liquityV2MarketsData: Record<string, LiquityV2MarketData> = {};
98
97
  const aaveV4SpokesData: Record<string, AaveV4SpokeData> = {};
99
98
 
100
- const markets: PortfolioMarketsData = {
99
+ const markets = {
101
100
  morphoMarketsData,
102
101
  morphoMidnightMarketsData,
103
102
  compoundV3MarketsData,
@@ -507,9 +506,7 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
507
506
  positions[address.toLowerCase() as EthAddress].spark[market.value] = { error: `Error fetching Spark account data for address ${address} on market ${market.value}`, data: null };
508
507
  }
509
508
  })).flat(),
510
- // flatMap, not map: each CDP's fetch has to be one of the awaited promises, or getPortfolioData can return
511
- // before a vault's data lands and the vault is missing from the result.
512
- ...addresses.flatMap((address) => (makerCdps[address.toLowerCase() as EthAddress] ?? []).map(async (cdpInfo) => {
509
+ ...addresses.map(async (address) => makerCdps[address.toLowerCase() as EthAddress]?.map(async (cdpInfo) => {
513
510
  try {
514
511
  const cdpData = await _getMakerCdpData(client, network, cdpInfo);
515
512
  if (cdpData) {
@@ -519,7 +516,7 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
519
516
  console.error(`Error fetching Maker CDP data for address ${address} with ID ${cdpInfo.id}:`, error);
520
517
  positions[address.toLowerCase() as EthAddress].maker[cdpInfo.id] = { error: `Error fetching Maker CDP data for address ${address} with ID ${cdpInfo.id}`, data: null };
521
518
  }
522
- })),
519
+ })).flat(),
523
520
  ...aaveV2Markets.map((market) => addresses.map(async (address) => {
524
521
  try {
525
522
  const accData = await _getAaveV2AccountData(client, network, address, aaveV2MarketsData[market.value].assetsData, market);