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

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 (45) hide show
  1. package/cjs/portfolio/index.d.ts +2 -2
  2. package/cjs/portfolio/index.js +3 -5
  3. package/cjs/savings/index.js +5 -2
  4. package/cjs/savings/morphoVaults/index.d.ts +1 -1
  5. package/cjs/savings/morphoVaults/index.js +56 -18
  6. package/cjs/savings/morphoVaults/options.d.ts +2 -0
  7. package/cjs/savings/morphoVaults/options.js +61 -1
  8. package/cjs/types/aave.d.ts +2 -15
  9. package/cjs/types/compound.d.ts +2 -26
  10. package/cjs/types/curveUsd.d.ts +1 -9
  11. package/cjs/types/llamaLend.d.ts +1 -12
  12. package/cjs/types/morphoBlue.d.ts +0 -2
  13. package/cjs/types/portfolio.d.ts +8 -23
  14. package/cjs/types/savings/morphoVaults.d.ts +10 -2
  15. package/cjs/types/savings/morphoVaults.js +9 -1
  16. package/cjs/types/spark.d.ts +1 -21
  17. package/esm/portfolio/index.d.ts +2 -2
  18. package/esm/portfolio/index.js +3 -5
  19. package/esm/savings/index.js +5 -2
  20. package/esm/savings/morphoVaults/index.d.ts +1 -1
  21. package/esm/savings/morphoVaults/index.js +57 -19
  22. package/esm/savings/morphoVaults/options.d.ts +2 -0
  23. package/esm/savings/morphoVaults/options.js +61 -1
  24. package/esm/types/aave.d.ts +2 -15
  25. package/esm/types/compound.d.ts +2 -26
  26. package/esm/types/curveUsd.d.ts +1 -9
  27. package/esm/types/llamaLend.d.ts +1 -12
  28. package/esm/types/morphoBlue.d.ts +0 -2
  29. package/esm/types/portfolio.d.ts +8 -23
  30. package/esm/types/savings/morphoVaults.d.ts +10 -2
  31. package/esm/types/savings/morphoVaults.js +8 -0
  32. package/esm/types/spark.d.ts +1 -21
  33. package/package.json +1 -1
  34. package/src/portfolio/index.ts +4 -7
  35. package/src/savings/index.ts +5 -2
  36. package/src/savings/morphoVaults/index.ts +73 -21
  37. package/src/savings/morphoVaults/options.ts +67 -1
  38. package/src/types/aave.ts +1 -18
  39. package/src/types/compound.ts +2 -38
  40. package/src/types/curveUsd.ts +1 -17
  41. package/src/types/llamaLend.ts +1 -19
  42. package/src/types/morphoBlue.ts +0 -3
  43. package/src/types/portfolio.ts +9 -28
  44. package/src/types/savings/morphoVaults.ts +11 -1
  45. package/src/types/spark.ts +1 -25
@@ -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.161",
4
4
  "description": "",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./esm/index.js",
@@ -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);
@@ -32,7 +32,8 @@ export const getSavingsData = async (
32
32
  network: NetworkNumber,
33
33
  accounts: EthAddress[],
34
34
  ) => {
35
- const morphoVaultsList = Object.keys(morphoVaults.morphoVaultsOptions.MORPHO_VAULTS) as MorphoVaultType[];
35
+ const morphoVaultsList = (Object.keys(morphoVaults.morphoVaultsOptions.MORPHO_VAULTS) as MorphoVaultType[])
36
+ .filter((key) => morphoVaults.morphoVaultsOptions.getMorphoVault(key).network === network);
36
37
  const yearnVaultsList = Object.keys(yearnVaults.yearnVaultsOptions.YEARN_VAULTS) as YearnVaultType[];
37
38
  const sparkSavingsVaultsList = Object.keys(sparkSavingsVaults.sparkSavingsVaultsOptions.SPARK_SAVINGS_VAULTS) as SparkSavingsVaultType[];
38
39
  const yearnV3VaultsList = Object.keys(yearnV3Vaults.yearnV3VaultsOptions.YEARN_V3_VAULTS) as YearnV3VaultType[];
@@ -42,7 +43,7 @@ export const getSavingsData = async (
42
43
  const savingsData: SavingsData = {};
43
44
 
44
45
  await Promise.all([
45
- ...(network === NetworkNumber.Eth ? [
46
+ ...(morphoVaultsList.length ? [
46
47
  (async () => {
47
48
  try {
48
49
  const vaults = morphoVaultsList.map((vaultKey) => morphoVaults.morphoVaultsOptions.getMorphoVault(vaultKey));
@@ -52,6 +53,8 @@ export const getSavingsData = async (
52
53
  console.error('[getSavingsData] Error fetching morpho vaults:', err);
53
54
  }
54
55
  })(),
56
+ ] : []),
57
+ ...(network === NetworkNumber.Eth ? [
55
58
  ...yearnVaultsList.map(async (vaultKey) => {
56
59
  try {
57
60
  const vault = yearnVaults.yearnVaultsOptions.getYearnVault(vaultKey);
@@ -4,10 +4,10 @@ import { request as graphqlRequest } from 'graphql-request';
4
4
  import { assetAmountInEth } from '@defisaver/tokens';
5
5
  import * as morphoVaultsOptions from './options';
6
6
  import {
7
- EthAddress, EthereumProvider, NetworkNumber, MorphoVault, MorphoVaultType, SavingsVaultData,
7
+ EthAddress, EthereumProvider, NetworkNumber, MorphoVault, MorphoVaultType, MorphoVaultVersion, SavingsVaultData,
8
8
  } from '../../types';
9
9
  import { getViemProvider } from '../../services/viem';
10
- import { getMorphoVaultContractViem } from '../../contracts';
10
+ import { getErc4626ContractViem, getMorphoVaultContractViem } from '../../contracts';
11
11
  import { MORPHO_API_URL } from '../../constants';
12
12
 
13
13
  export {
@@ -17,38 +17,49 @@ export {
17
17
  // Morpho API caps list page size at 100 items
18
18
  const MORPHO_API_PAGE_SIZE = 100;
19
19
 
20
- const vaultsLiquidityQuery = `
20
+ const buildLiquidityQuery = (listField: 'vaults' | 'vaultV2s') => `
21
21
  query VaultsLiquidity($addresses: [String!], $chainIds: [Int!]) {
22
- vaults(first: ${MORPHO_API_PAGE_SIZE}, where: { address_in: $addresses, chainId_in: $chainIds }) {
22
+ ${listField}(first: ${MORPHO_API_PAGE_SIZE}, where: { address_in: $addresses, chainId_in: $chainIds }) {
23
23
  items {
24
24
  address
25
- liquidity {
26
- underlying
27
- }
25
+ liquidity${listField === 'vaults' ? ' {\n underlying\n }' : ''}
28
26
  }
29
27
  }
30
28
  }`;
31
29
 
30
+ const liquidityQueries = {
31
+ [MorphoVaultVersion.V1]: { field: 'vaults', query: buildLiquidityQuery('vaults') },
32
+ [MorphoVaultVersion.V2]: { field: 'vaultV2s', query: buildLiquidityQuery('vaultV2s') },
33
+ } as const;
34
+
35
+ type LiquidityItem = { address: string, liquidity: { underlying: string | number | null } | string | number | null };
36
+
32
37
  /**
33
- * Fetches liquidity for all given vaults in a single API request (chunked if over the page cap),
38
+ * Fetches liquidity for all given vaults, one API request per vault version (chunked if over the page cap),
34
39
  * returned as a map keyed by lowercased vault address. A vault missing from the API response is
35
40
  * absent from the map.
36
41
  */
37
42
  export const fetchMorphoVaultsLiquidity = async (network: NetworkNumber, vaults: MorphoVault[]): Promise<Record<string, string>> => {
38
- const chunks: MorphoVault[][] = [];
39
- for (let i = 0; i < vaults.length; i += MORPHO_API_PAGE_SIZE) chunks.push(vaults.slice(i, i + MORPHO_API_PAGE_SIZE));
43
+ const requests: { version: MorphoVaultVersion, chunk: MorphoVault[] }[] = [];
44
+ [MorphoVaultVersion.V1, MorphoVaultVersion.V2].forEach((version) => {
45
+ const versionVaults = vaults.filter((vault) => vault.version === version);
46
+ for (let i = 0; i < versionVaults.length; i += MORPHO_API_PAGE_SIZE) requests.push({ version, chunk: versionVaults.slice(i, i + MORPHO_API_PAGE_SIZE) });
47
+ });
40
48
 
41
49
  const liquidityByAddress: Record<string, string> = {};
42
- await Promise.all(chunks.map(async (chunk) => {
43
- const data = await graphqlRequest(MORPHO_API_URL, vaultsLiquidityQuery, {
50
+ await Promise.all(requests.map(async ({ version, chunk }) => {
51
+ const { field, query } = liquidityQueries[version];
52
+ const data = await graphqlRequest(MORPHO_API_URL, query, {
44
53
  addresses: chunk.map((vault) => vault.address),
45
54
  chainIds: [network],
46
55
  // the BigInt scalar serializes as a JSON number when it fits in Number.MAX_SAFE_INTEGER, a string otherwise
47
- }) as { vaults: { items: { address: string, liquidity: { underlying: string | number | null } | null }[] | null } };
56
+ }) as Record<string, { items: LiquidityItem[] | null }>;
48
57
 
49
- (data.vaults.items || []).forEach((item) => {
50
- if (item?.liquidity?.underlying !== undefined && item.liquidity?.underlying !== null) {
51
- liquidityByAddress[item.address.toLowerCase()] = String(item.liquidity.underlying);
58
+ (data[field].items || []).forEach((item) => {
59
+ // V1 exposes liquidity as { underlying }, V2 as a plain BigInt scalar
60
+ const underlying = item?.liquidity !== null && typeof item?.liquidity === 'object' ? item.liquidity.underlying : item?.liquidity;
61
+ if (underlying !== undefined && underlying !== null) {
62
+ liquidityByAddress[item.address.toLowerCase()] = String(underlying);
52
63
  }
53
64
  });
54
65
  }));
@@ -63,7 +74,22 @@ const getBatchedViemProvider = (provider: EthereumProvider, network: NetworkNumb
63
74
  },
64
75
  });
65
76
 
66
- const getMorphoVaultChainData = async (provider: Client, morphoVault: MorphoVault, accounts: EthAddress[]) => {
77
+ // Vault V2 is ERC-4626 but has no decimals offset, so shares are converted with convertToAssets
78
+ const getMorphoVaultV2ChainData = async (provider: Client, morphoVault: MorphoVault, accounts: EthAddress[]) => {
79
+ const vaultContract = getErc4626ContractViem(provider, morphoVault.address);
80
+
81
+ const [totalAssets, suppliedAssets] = await Promise.all([
82
+ vaultContract.read.totalAssets(),
83
+ Promise.all(accounts.map(async (account) => {
84
+ const share = await vaultContract.read.balanceOf([account]);
85
+ return share === BigInt(0) ? BigInt(0) : vaultContract.read.convertToAssets([share]);
86
+ })),
87
+ ]);
88
+
89
+ return { totalAssets, suppliedAssets };
90
+ };
91
+
92
+ const getMorphoVaultV1ChainData = async (provider: Client, morphoVault: MorphoVault, accounts: EthAddress[]) => {
67
93
  const morphoVaultContract = getMorphoVaultContractViem(provider, morphoVault.address);
68
94
 
69
95
  const shares: Record<EthAddress, bigint> = {};
@@ -84,20 +110,46 @@ const getMorphoVaultChainData = async (provider: Client, morphoVault: MorphoVaul
84
110
  };
85
111
  };
86
112
 
113
+ type MorphoVaultChainData = {
114
+ v1?: Awaited<ReturnType<typeof getMorphoVaultV1ChainData>>,
115
+ v2?: Awaited<ReturnType<typeof getMorphoVaultV2ChainData>>,
116
+ };
117
+
118
+ const getMorphoVaultChainData = async (provider: Client, morphoVault: MorphoVault, accounts: EthAddress[]): Promise<MorphoVaultChainData> => (
119
+ morphoVault.version === MorphoVaultVersion.V2
120
+ ? { v2: await getMorphoVaultV2ChainData(provider, morphoVault, accounts) }
121
+ : { v1: await getMorphoVaultV1ChainData(provider, morphoVault, accounts) }
122
+ );
123
+
87
124
  const formatMorphoVaultData = (
88
125
  morphoVault: MorphoVault,
89
- chainData: Awaited<ReturnType<typeof getMorphoVaultChainData>>,
126
+ chainData: MorphoVaultChainData,
90
127
  liquidityUnderlying: string,
91
128
  accounts: EthAddress[],
92
129
  ): SavingsVaultData => {
130
+ const liquidity = assetAmountInEth(liquidityUnderlying, morphoVault.asset);
131
+ const supplied: Record<EthAddress, string> = {};
132
+
133
+ if (chainData.v2) {
134
+ const { totalAssets, suppliedAssets } = chainData.v2;
135
+ accounts.forEach((account, i) => {
136
+ supplied[account.toLowerCase() as EthAddress] = assetAmountInEth(suppliedAssets[i].toString(), morphoVault.asset);
137
+ });
138
+ return {
139
+ poolSize: assetAmountInEth(totalAssets.toString(), morphoVault.asset),
140
+ supplied,
141
+ liquidity,
142
+ asset: morphoVault.asset,
143
+ optionType: morphoVault.type,
144
+ };
145
+ }
146
+
93
147
  const {
94
148
  totalAssets, totalSupply, decimals, decimalsOffset, shares,
95
- } = chainData;
149
+ } = chainData.v1!;
96
150
 
97
151
  const poolSize = assetAmountInEth(totalAssets.toString(), morphoVault.asset);
98
- const liquidity = assetAmountInEth(liquidityUnderlying, morphoVault.asset);
99
152
 
100
- const supplied: Record<EthAddress, string> = {};
101
153
  accounts.forEach((account) => {
102
154
  const share = shares[account] || BigInt(0);
103
155
  supplied[account.toLowerCase() as EthAddress] = new Dec(new Dec(share.toString()).mul(new Dec(totalAssets.toString()).add(1)).div(new Dec(totalSupply.toString()).add(10 ** decimalsOffset)).div(10 ** 18)
@@ -1,10 +1,14 @@
1
- import { MorphoVault, MorphoVaultType } from '../../types';
1
+ import {
2
+ MorphoVault, MorphoVaultType, MorphoVaultVersion, NetworkNumber,
3
+ } from '../../types';
2
4
 
3
5
  export const MORPHO_VAULT_FLAGSHIP_ETH: MorphoVault = {
4
6
  type: MorphoVaultType.MorphoVaultFlagshipEth,
5
7
  name: 'Flagship ETH',
6
8
  address: '0x38989BBA00BDF8181F4082995b3DEAe96163aC5D',
7
9
  asset: 'WETH',
10
+ network: NetworkNumber.Eth,
11
+ version: MorphoVaultVersion.V1,
8
12
  deploymentBlock: 18927491,
9
13
  isLegacy: true,
10
14
  };
@@ -14,6 +18,8 @@ export const MORPHO_VAULT_GAUNTLET_USDC_CORE: MorphoVault = {
14
18
  name: 'Gauntlet USDC Core',
15
19
  address: '0x8eB67A509616cd6A7c1B3c8C21D48FF57df3d458',
16
20
  asset: 'USDC',
21
+ network: NetworkNumber.Eth,
22
+ version: MorphoVaultVersion.V1,
17
23
  deploymentBlock: 19777569,
18
24
  isLegacy: true,
19
25
  };
@@ -23,6 +29,8 @@ export const MORPHO_VAULT_GAUNTLET_USDC_PRIME: MorphoVault = {
23
29
  name: 'Gauntlet USDC Prime',
24
30
  address: '0xdd0f28e19C1780eb6396170735D45153D261490d',
25
31
  asset: 'USDC',
32
+ network: NetworkNumber.Eth,
33
+ version: MorphoVaultVersion.V1,
26
34
  deploymentBlock: 19777569,
27
35
  isLegacy: true,
28
36
  };
@@ -32,6 +40,8 @@ export const MORPHO_VAULT_RE7_WETH: MorphoVault = {
32
40
  name: 'RE7 WETH',
33
41
  address: '0x78Fc2c2eD1A4cDb5402365934aE5648aDAd094d0',
34
42
  asset: 'WETH',
43
+ network: NetworkNumber.Eth,
44
+ version: MorphoVaultVersion.V1,
35
45
  deploymentBlock: 19121118,
36
46
  isLegacy: true,
37
47
  };
@@ -41,6 +51,8 @@ export const MORPHO_VAULT_GAUNTLET_WETH_CORE: MorphoVault = {
41
51
  name: 'Gauntlet WETH Core',
42
52
  address: '0x4881Ef0BF6d2365D3dd6499ccd7532bcdBCE0658',
43
53
  asset: 'WETH',
54
+ network: NetworkNumber.Eth,
55
+ version: MorphoVaultVersion.V1,
44
56
  deploymentBlock: 19541126,
45
57
  isLegacy: true,
46
58
  };
@@ -50,6 +62,8 @@ export const MORPHO_VAULT_GAUNTLET_WETH_PRIME: MorphoVault = {
50
62
  name: 'Gauntlet WETH Prime',
51
63
  address: '0x2371e134e3455e0593363cBF89d3b6cf53740618',
52
64
  asset: 'WETH',
65
+ network: NetworkNumber.Eth,
66
+ version: MorphoVaultVersion.V1,
53
67
  deploymentBlock: 19372149,
54
68
  isLegacy: true,
55
69
  };
@@ -59,6 +73,8 @@ export const MORPHO_VAULT_BOOSTED_USDC: MorphoVault = {
59
73
  name: 'Boosted USDC',
60
74
  address: '0xd63070114470f685b75B74D60EEc7c1113d33a3D',
61
75
  asset: 'USDC',
76
+ network: NetworkNumber.Eth,
77
+ version: MorphoVaultVersion.V1,
62
78
  deploymentBlock: 20377233,
63
79
  isLegacy: true,
64
80
  };
@@ -68,6 +84,8 @@ export const MORPHO_VAULT_FLAGSHIP_USDT: MorphoVault = {
68
84
  name: 'Flagship USDT',
69
85
  address: '0x2C25f6C25770fFEC5959D34B94Bf898865e5D6b1',
70
86
  asset: 'USDT',
87
+ network: NetworkNumber.Eth,
88
+ version: MorphoVaultVersion.V1,
71
89
  deploymentBlock: 19127039,
72
90
  isLegacy: true,
73
91
  };
@@ -77,6 +95,8 @@ export const MORPHO_VAULT_GAUNTLET_USDA_CORE: MorphoVault = {
77
95
  name: 'Gauntlet USDA Core',
78
96
  address: '0x125D41A6e5dbf455cD9Df8F80BCC6fd172D52Cc6',
79
97
  asset: 'USDA',
98
+ network: NetworkNumber.Eth,
99
+ version: MorphoVaultVersion.V1,
80
100
  deploymentBlock: 19633608,
81
101
  isLegacy: true,
82
102
  };
@@ -86,6 +106,8 @@ export const MORPHO_VAULT_GAUNTLET_USDT_PRIME: MorphoVault = {
86
106
  name: 'Gauntlet USDT Prime',
87
107
  address: '0x8CB3649114051cA5119141a34C200D65dc0Faa73',
88
108
  asset: 'USDT',
109
+ network: NetworkNumber.Eth,
110
+ version: MorphoVaultVersion.V1,
89
111
  deploymentBlock: 19486541,
90
112
  isLegacy: true,
91
113
  };
@@ -95,6 +117,8 @@ export const MORPHO_VAULT_GAUNTLET_RESOLV_USDC: MorphoVault = {
95
117
  name: 'Gauntlet Resolv USDC',
96
118
  address: '0x132E6C9C33A62D7727cd359b1f51e5B566E485Eb',
97
119
  asset: 'USDC',
120
+ network: NetworkNumber.Eth,
121
+ version: MorphoVaultVersion.V1,
98
122
  deploymentBlock: 21487882,
99
123
  isLegacy: true,
100
124
  };
@@ -106,6 +130,8 @@ export const MORPHO_VAULT_STEAKHOUSE_USDT: MorphoVault = {
106
130
  name: 'Steakhouse USDT',
107
131
  address: '0xbEef047a543E45807105E51A8BBEFCc5950fcfBa',
108
132
  asset: 'USDT',
133
+ network: NetworkNumber.Eth,
134
+ version: MorphoVaultVersion.V1,
109
135
  deploymentBlock: 19043398,
110
136
  isLegacy: false,
111
137
  };
@@ -115,6 +141,8 @@ export const MORPHO_VAULT_STEAKHOUSE_USDC: MorphoVault = {
115
141
  name: 'Steakhouse USDC',
116
142
  address: '0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB',
117
143
  asset: 'USDC',
144
+ network: NetworkNumber.Eth,
145
+ version: MorphoVaultVersion.V1,
118
146
  deploymentBlock: 18928285,
119
147
  isLegacy: false,
120
148
  };
@@ -124,6 +152,8 @@ export const MORPHO_VAULT_STEAKHOUSE_ETH: MorphoVault = {
124
152
  name: 'Steakhouse WETH',
125
153
  address: '0xBEEf050ecd6a16c4e7bfFbB52Ebba7846C4b8cD4',
126
154
  asset: 'WETH',
155
+ network: NetworkNumber.Eth,
156
+ version: MorphoVaultVersion.V1,
127
157
  deploymentBlock: 19380443,
128
158
  isLegacy: false,
129
159
  };
@@ -133,6 +163,8 @@ export const MORPHO_VAULT_STEAKHOUSE_PYUSD: MorphoVault = {
133
163
  name: 'Steakhouse PYUSD',
134
164
  address: '0xbEEF02e5E13584ab96848af90261f0C8Ee04722a',
135
165
  asset: 'PYUSD',
166
+ network: NetworkNumber.Eth,
167
+ version: MorphoVaultVersion.V1,
136
168
  deploymentBlock: 19043398,
137
169
  isLegacy: false,
138
170
  };
@@ -144,6 +176,8 @@ export const MORPHO_VAULT_SMOKEHOUSE_USDT: MorphoVault = {
144
176
  name: 'Smokehouse USDT',
145
177
  address: '0xA0804346780b4c2e3bE118ac957D1DB82F9d7484',
146
178
  asset: 'USDT',
179
+ network: NetworkNumber.Eth,
180
+ version: MorphoVaultVersion.V1,
147
181
  deploymentBlock: 21522238,
148
182
  isLegacy: false,
149
183
  };
@@ -153,6 +187,8 @@ export const MORPHO_VAULT_SMOKEHOUSE_USDC: MorphoVault = {
153
187
  name: 'Smokehouse USDC',
154
188
  address: '0xBEeFFF209270748ddd194831b3fa287a5386f5bC',
155
189
  asset: 'USDC',
190
+ network: NetworkNumber.Eth,
191
+ version: MorphoVaultVersion.V1,
156
192
  deploymentBlock: 21337719,
157
193
  isLegacy: false,
158
194
  };
@@ -162,10 +198,36 @@ export const MORPHO_VAULT_SMOKEHOUSE_DAI: MorphoVault = {
162
198
  name: 'Smokehouse DAI',
163
199
  address: '0xbeeFfF68CC520D68f82641EFF84330C631E2490E',
164
200
  asset: 'DAI',
201
+ network: NetworkNumber.Eth,
202
+ version: MorphoVaultVersion.V1,
165
203
  deploymentBlock: 21343808,
166
204
  isLegacy: false,
167
205
  };
168
206
 
207
+ // Vault V2
208
+
209
+ export const MORPHO_VAULT_GAUNTLET_USDG_PREMIUM: MorphoVault = {
210
+ type: MorphoVaultType.MorphoVaultGauntletUSDGPremium,
211
+ name: 'Gauntlet USDG Premium',
212
+ address: '0x390c1bb01F3F627144a40617e287d4cE3D5aBCfa',
213
+ asset: 'USDG',
214
+ network: NetworkNumber.Arb,
215
+ version: MorphoVaultVersion.V2,
216
+ deploymentBlock: 510799903,
217
+ isLegacy: false,
218
+ };
219
+
220
+ export const MORPHO_VAULT_STEAKHOUSE_USDG_PRO: MorphoVault = {
221
+ type: MorphoVaultType.MorphoVaultSteakhouseUSDGPro,
222
+ name: 'Steakhouse USDG Pro',
223
+ address: '0xbeeFf72B77e7584a450E887125F25E8D8819016a',
224
+ asset: 'USDG',
225
+ network: NetworkNumber.Arb,
226
+ version: MorphoVaultVersion.V2,
227
+ deploymentBlock: 512247107,
228
+ isLegacy: false,
229
+ };
230
+
169
231
  export const MORPHO_VAULTS: Record<MorphoVaultType, MorphoVault> = {
170
232
  [MorphoVaultType.MorphoVaultFlagshipEth]: MORPHO_VAULT_FLAGSHIP_ETH,
171
233
  [MorphoVaultType.MorphoVaultGauntletUSDCCore]: MORPHO_VAULT_GAUNTLET_USDC_CORE,
@@ -189,6 +251,10 @@ export const MORPHO_VAULTS: Record<MorphoVaultType, MorphoVault> = {
189
251
  [MorphoVaultType.MorphoVaultSmokehouseUSDT]: MORPHO_VAULT_SMOKEHOUSE_USDT,
190
252
  [MorphoVaultType.MorphoVaultSmokehouseUSDC]: MORPHO_VAULT_SMOKEHOUSE_USDC,
191
253
  [MorphoVaultType.MorphoVaultSmokehouseDAI]: MORPHO_VAULT_SMOKEHOUSE_DAI,
254
+
255
+ // Vault V2
256
+ [MorphoVaultType.MorphoVaultGauntletUSDGPremium]: MORPHO_VAULT_GAUNTLET_USDG_PREMIUM,
257
+ [MorphoVaultType.MorphoVaultSteakhouseUSDGPro]: MORPHO_VAULT_STEAKHOUSE_USDG_PRO,
192
258
  };
193
259
 
194
260
  export const getMorphoVault = (type: MorphoVaultType): MorphoVault => MORPHO_VAULTS[type];
package/src/types/aave.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import {
2
- EthAddress,
3
2
  IncentiveData,
4
3
  LeverageType,
5
4
  MMAssetData, MMPositionData, MMUsedAsset, NetworkNumber,
@@ -97,9 +96,6 @@ export interface AaveV3AssetData extends AaveAssetData {
97
96
  liquidationBonus: string,
98
97
  supplyIncentives: IncentiveData[];
99
98
  borrowIncentives: IncentiveData[];
100
- // Set by _getAaveV3MarketData. Optional, so objects built by hand still type-check.
101
- aTokenAddress?: EthAddress,
102
- vTokenAddress?: EthAddress,
103
99
  }
104
100
 
105
101
  export type EModeCategoriesData = Record<number, EModeCategoryData>;
@@ -141,15 +137,7 @@ export type AaveV2UsedAssets = AaveUsedAssets<AaveV2UsedAsset>;
141
137
 
142
138
  export type AaveV3UsedAssets = AaveUsedAssets<AaveV3UsedAsset>;
143
139
 
144
- /**
145
- * Fields aaveAnyGetAggregatedPositionData adds to every Aave V2/V3 position at runtime, on top of those declared
146
- * below. Optional, so code that builds a position by hand keeps compiling.
147
- */
148
- export type AavePositionAggregatedFields = Partial<Omit<AaveV3AggregatedPositionData,
149
- | keyof MMPositionData | 'ratio' | 'collRatio' | 'safetyRatioWithLtvZeroFallback' | 'suppliedUsd' | 'borrowedUsd'
150
- | 'borrowLimitUsd' | 'suppliedCollateralUsd' | 'incentiveUsd' | 'totalInterestUsd'>>;
151
-
152
- export interface AavePositionData extends MMPositionData, AavePositionAggregatedFields {
140
+ export interface AavePositionData extends MMPositionData {
153
141
  ratio: string,
154
142
  minRatio: string,
155
143
  collRatio: string,
@@ -168,11 +156,6 @@ export interface AavePositionData extends MMPositionData, AavePositionAggregated
168
156
 
169
157
  export interface AaveV2PositionData extends AavePositionData {
170
158
  usedAssets: AaveV2UsedAssets,
171
- // Always their empty values: _getAaveV2AccountData starts from Aave V3's EMPTY_AAVE_DATA, which carries them.
172
- eModeCategory?: number,
173
- isInIsolationMode?: boolean,
174
- isInSiloedMode?: boolean,
175
- eModeCategories?: { [key: number]: EModeCategoryDataMapping },
176
159
  }
177
160
 
178
161
  export interface AaveV3PositionData extends AavePositionData {
@@ -70,8 +70,6 @@ export interface CompoundAssetData extends MMAssetData {
70
70
  }
71
71
 
72
72
  export interface CompoundV2AssetData extends CompoundAssetData {
73
- // Set by _getCompoundV2MarketsData. Optional, so objects built by hand still type-check.
74
- exchangeRate?: string,
75
73
  }
76
74
  export interface CompoundV3AssetData extends CompoundAssetData {
77
75
  borrowCollateralFactor: string,
@@ -83,20 +81,6 @@ export interface CompoundV3AssetData extends CompoundAssetData {
83
81
  supplyCap: string,
84
82
  priceInBaseAsset: string,
85
83
  canBeWithdrawn: boolean,
86
- // The rest are set by formatMarketData and formatBaseData, which also spread in the view contract's raw asset
87
- // data. Optional, so objects built by hand still type-check.
88
- tokenAddr?: EthAddress,
89
- // The base asset's only.
90
- isBase?: boolean,
91
- baseBorrowMin?: string,
92
- baseTrackingBorrowRewardsSpeed?: string,
93
- baseTrackingSupplyRewardsSpeed?: string,
94
- borrowIndex?: string,
95
- supplyIndex?: string,
96
- trackingBorrowIndex?: string,
97
- trackingSupplyIndex?: string,
98
- rewardSupplySpeed?: string,
99
- rewardBorrowSpeed?: string,
100
84
  }
101
85
 
102
86
  export interface CompoundAssetsData<T> {
@@ -157,30 +141,10 @@ export interface CompoundPositionData extends MMPositionData {
157
141
  automationResubscribeRequired?: boolean,
158
142
  }
159
143
 
160
- /**
161
- * Fields getCompoundV2AggregatedData adds to every Compound V2 position at runtime — a subset of
162
- * CompoundAggregatedPositionData. Optional, so code that builds a position by hand keeps compiling.
163
- */
164
- export type CompoundV2PositionAggregatedFields = Partial<Pick<CompoundAggregatedPositionData,
165
- | 'suppliedCollateralUsd' | 'liquidationLimitUsd' | 'leftToBorrowUsd' | 'collRatio' | 'leveragedType'
166
- | 'leveragedAsset' | 'liquidationPrice'>>;
167
-
168
- /**
169
- * Fields getCompoundV3AggregatedData adds to every Compound V3 position at runtime, on top of those declared in
170
- * CompoundPositionData. Optional, so code that builds a position by hand keeps compiling.
171
- */
172
- export type CompoundV3PositionAggregatedFields = Partial<Omit<CompoundAggregatedPositionData,
173
- | keyof MMPositionData | 'ratio' | 'minRatio' | 'suppliedUsd' | 'borrowedUsd' | 'borrowLimitUsd' | 'incentiveUsd'
174
- | 'totalInterestUsd'>>;
175
-
176
- export interface CompoundV2PositionData extends CompoundPositionData, CompoundV2PositionAggregatedFields {
144
+ export interface CompoundV2PositionData extends CompoundPositionData {
177
145
  usedAssets: CompoundV2UsedAssets,
178
- // Always false: _getCompoundV2AccountData starts from EMPTY_COMPOUND_DATA, which carries it.
179
- borrowStableSupplyUnstable?: boolean,
180
146
  }
181
147
 
182
- export interface CompoundV3PositionData extends CompoundPositionData, CompoundV3PositionAggregatedFields {
148
+ export interface CompoundV3PositionData extends CompoundPositionData {
183
149
  usedAssets: CompoundV3UsedAssets,
184
- // Whether the user's smart wallet is allowed to manage the account on Comet (Comet.isAllowed).
185
- isAllowed?: boolean,
186
150
  }
@@ -66,9 +66,6 @@ export interface CrvUSDGlobalMarketData {
66
66
  leftToBorrow: string,
67
67
  bands: BandData[],
68
68
  loanDiscount: string;
69
- // crvUSDView's globalData field that _getCurveUsdGlobalData spreads in unconverted. Optional, so objects built by
70
- // hand still type-check.
71
- A?: bigint,
72
69
  }
73
70
 
74
71
  export interface CrvUSDAggregatedPositionData {
@@ -104,12 +101,7 @@ export interface CrvUSDUsedAssets {
104
101
  [key: string]: CrvUSDUsedAsset,
105
102
  }
106
103
 
107
- // Set by getCrvUsdAggregatedData, which _getCurveUsdUserData spreads in. Optional, so objects built by hand still
108
- // type-check.
109
- export type CrvUSDPositionAggregatedFields = Partial<Pick<CrvUSDAggregatedPositionData,
110
- | 'borrowLimitUsd' | 'minAllowedRatio' | 'collFactor' | 'leveragedType' | 'leveragedAsset' | 'liquidationPrice'>>;
111
-
112
- export interface CrvUSDUserData extends CrvUSDPositionAggregatedFields {
104
+ export interface CrvUSDUserData {
113
105
  debtAmount: string,
114
106
  health: string,
115
107
  healthPercent: string,
@@ -131,12 +123,4 @@ export interface CrvUSDUserData extends CrvUSDPositionAggregatedFields {
131
123
  collateralPrice: string,
132
124
  collRatio: string,
133
125
  exposure: string,
134
- // Fields of crvUSDView's userData that _getCurveUsdUserData spreads in unconverted. Optional, so objects built by
135
- // hand still type-check.
136
- marketCollateralAmount?: bigint,
137
- curveUsdCollateralAmount?: bigint,
138
- N?: bigint,
139
- bandRange?: readonly [bigint, bigint],
140
- usersBands?: readonly [readonly bigint[], readonly bigint[]],
141
- isInSoftLiquidation?: boolean,
142
126
  }