@defisaver/positions-sdk 2.1.159 → 2.1.160-morpho-vault-dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,3 +10,4 @@ export declare const ZERO_BYTES32 = "0x00000000000000000000000000000000000000000
10
10
  export declare const WAD = 1000000000000000000;
11
11
  export declare const USD_QUOTE = "0x0000000000000000000000000000000000000348";
12
12
  export declare const borrowOperations: string[];
13
+ export declare const MORPHO_API_URL = "https://fe.defisaver.com/api/morpho/graphql";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.borrowOperations = exports.USD_QUOTE = exports.WAD = exports.ZERO_BYTES32 = exports.ZERO_ADDRESS = exports.BLOCKS_IN_A_YEAR = exports.AVG_BLOCK_TIME = exports.SECONDS_PER_WEEK = exports.SECONDS_PER_YEAR = exports.SECONDS_PER_DAY = exports.SECONDS_PER_HOUR = exports.SECONDS_PER_MINUTE = void 0;
3
+ exports.MORPHO_API_URL = exports.borrowOperations = exports.USD_QUOTE = exports.WAD = exports.ZERO_BYTES32 = exports.ZERO_ADDRESS = exports.BLOCKS_IN_A_YEAR = exports.AVG_BLOCK_TIME = exports.SECONDS_PER_WEEK = exports.SECONDS_PER_YEAR = exports.SECONDS_PER_DAY = exports.SECONDS_PER_HOUR = exports.SECONDS_PER_MINUTE = void 0;
4
4
  exports.SECONDS_PER_MINUTE = 60;
5
5
  exports.SECONDS_PER_HOUR = 60 * exports.SECONDS_PER_MINUTE;
6
6
  exports.SECONDS_PER_DAY = 24 * exports.SECONDS_PER_HOUR;
@@ -13,3 +13,6 @@ exports.ZERO_BYTES32 = '0x000000000000000000000000000000000000000000000000000000
13
13
  exports.WAD = 1e18;
14
14
  exports.USD_QUOTE = '0x0000000000000000000000000000000000000348';
15
15
  exports.borrowOperations = ['borrow', 'payback'];
16
+ // Proxies Morpho's GraphQL API through the DFS backend, which attaches the private API key
17
+ // for better rate limits (DEV-13673)
18
+ exports.MORPHO_API_URL = 'https://fe.defisaver.com/api/morpho/graphql';
@@ -139,7 +139,6 @@ const getApyAfterValuesEstimation = (selectedMarket, actions, provider, network)
139
139
  return { borrowRate, supplyRate };
140
140
  });
141
141
  exports.getApyAfterValuesEstimation = getApyAfterValuesEstimation;
142
- const API_URL = 'https://api.morpho.org/graphql';
143
142
  // Morpho Blue ACRM (Adaptive Curve IRM) always targets 90% utilization — protocol constant
144
143
  const ACRM_TARGET_UTILIZATION = '900000000000000000';
145
144
  const MARKET_QUERY = `
@@ -216,7 +215,7 @@ const REWARDS_QUERY = `
216
215
  const getReallocatableLiquidity = (marketId_1, ...args_1) => __awaiter(void 0, [marketId_1, ...args_1], void 0, function* (marketId, network = common_1.NetworkNumber.Eth) {
217
216
  var _a;
218
217
  try {
219
- const response = yield fetch(API_URL, {
218
+ const response = yield fetch(constants_1.MORPHO_API_URL, {
220
219
  method: 'POST',
221
220
  headers: { 'Content-Type': 'application/json' },
222
221
  body: JSON.stringify({
@@ -280,7 +279,7 @@ const getReallocation = (market_1, assetsData_1, amountToBorrow_1, ...args_1) =>
280
279
  var _a, _b, _c;
281
280
  try {
282
281
  const { marketId, loanToken } = market;
283
- const response = yield fetch(API_URL, {
282
+ const response = yield fetch(constants_1.MORPHO_API_URL, {
284
283
  method: 'POST',
285
284
  headers: { 'Content-Type': 'application/json' },
286
285
  body: JSON.stringify({
@@ -354,7 +353,7 @@ const getReallocation = (market_1, assetsData_1, amountToBorrow_1, ...args_1) =>
354
353
  exports.getReallocation = getReallocation;
355
354
  const getRewardsForMarket = (marketId_1, ...args_1) => __awaiter(void 0, [marketId_1, ...args_1], void 0, function* (marketId, network = common_1.NetworkNumber.Eth) {
356
355
  var _a;
357
- const response = yield fetch(API_URL, {
356
+ const response = yield fetch(constants_1.MORPHO_API_URL, {
358
357
  method: 'POST',
359
358
  headers: { 'Content-Type': 'application/json' },
360
359
  body: JSON.stringify({
@@ -60,7 +60,8 @@ exports.summerVaults = summerVaults;
60
60
  const yearnV3Vaults = __importStar(require("./yearnV3Vaults"));
61
61
  exports.yearnV3Vaults = yearnV3Vaults;
62
62
  const getSavingsData = (provider, network, accounts) => __awaiter(void 0, void 0, void 0, function* () {
63
- const morphoVaultsList = Object.keys(morphoVaults.morphoVaultsOptions.MORPHO_VAULTS);
63
+ const morphoVaultsList = Object.keys(morphoVaults.morphoVaultsOptions.MORPHO_VAULTS)
64
+ .filter((key) => morphoVaults.morphoVaultsOptions.getMorphoVault(key).network === network);
64
65
  const yearnVaultsList = Object.keys(yearnVaults.yearnVaultsOptions.YEARN_VAULTS);
65
66
  const sparkSavingsVaultsList = Object.keys(sparkSavingsVaults.sparkSavingsVaultsOptions.SPARK_SAVINGS_VAULTS);
66
67
  const yearnV3VaultsList = Object.keys(yearnV3Vaults.yearnV3VaultsOptions.YEARN_V3_VAULTS);
@@ -68,7 +69,7 @@ const getSavingsData = (provider, network, accounts) => __awaiter(void 0, void 0
68
69
  .filter((key) => summerVaults.summerVaultsOptions.getSummerVault(key).network === network);
69
70
  const savingsData = {};
70
71
  yield Promise.all([
71
- ...(network === common_1.NetworkNumber.Eth ? [
72
+ ...(morphoVaultsList.length ? [
72
73
  (() => __awaiter(void 0, void 0, void 0, function* () {
73
74
  try {
74
75
  const vaults = morphoVaultsList.map((vaultKey) => morphoVaults.morphoVaultsOptions.getMorphoVault(vaultKey));
@@ -79,6 +80,8 @@ const getSavingsData = (provider, network, accounts) => __awaiter(void 0, void 0
79
80
  console.error('[getSavingsData] Error fetching morpho vaults:', err);
80
81
  }
81
82
  }))(),
83
+ ] : []),
84
+ ...(network === common_1.NetworkNumber.Eth ? [
82
85
  ...yearnVaultsList.map((vaultKey) => __awaiter(void 0, void 0, void 0, function* () {
83
86
  try {
84
87
  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
  */
@@ -53,42 +53,50 @@ const graphql_request_1 = require("graphql-request");
53
53
  const tokens_1 = require("@defisaver/tokens");
54
54
  const morphoVaultsOptions = __importStar(require("./options"));
55
55
  exports.morphoVaultsOptions = morphoVaultsOptions;
56
+ const types_1 = require("../../types");
56
57
  const viem_1 = require("../../services/viem");
57
58
  const contracts_1 = require("../../contracts");
58
- const MORPHO_BLUE_API = 'https://api.morpho.org/graphql';
59
+ const constants_1 = require("../../constants");
59
60
  // Morpho API caps list page size at 100 items
60
61
  const MORPHO_API_PAGE_SIZE = 100;
61
- const vaultsLiquidityQuery = `
62
+ const buildLiquidityQuery = (listField) => `
62
63
  query VaultsLiquidity($addresses: [String!], $chainIds: [Int!]) {
63
- vaults(first: ${MORPHO_API_PAGE_SIZE}, where: { address_in: $addresses, chainId_in: $chainIds }) {
64
+ ${listField}(first: ${MORPHO_API_PAGE_SIZE}, where: { address_in: $addresses, chainId_in: $chainIds }) {
64
65
  items {
65
66
  address
66
- liquidity {
67
- underlying
68
- }
67
+ liquidity${listField === 'vaults' ? ' {\n underlying\n }' : ''}
69
68
  }
70
69
  }
71
70
  }`;
71
+ const liquidityQueries = {
72
+ [types_1.MorphoVaultVersion.V1]: { field: 'vaults', query: buildLiquidityQuery('vaults') },
73
+ [types_1.MorphoVaultVersion.V2]: { field: 'vaultV2s', query: buildLiquidityQuery('vaultV2s') },
74
+ };
72
75
  /**
73
- * Fetches liquidity for all given vaults in a single API request (chunked if over the page cap),
76
+ * Fetches liquidity for all given vaults, one API request per vault version (chunked if over the page cap),
74
77
  * returned as a map keyed by lowercased vault address. A vault missing from the API response is
75
78
  * absent from the map.
76
79
  */
77
80
  const fetchMorphoVaultsLiquidity = (network, vaults) => __awaiter(void 0, void 0, void 0, function* () {
78
- const chunks = [];
79
- for (let i = 0; i < vaults.length; i += MORPHO_API_PAGE_SIZE)
80
- chunks.push(vaults.slice(i, i + MORPHO_API_PAGE_SIZE));
81
+ const requests = [];
82
+ [types_1.MorphoVaultVersion.V1, types_1.MorphoVaultVersion.V2].forEach((version) => {
83
+ const versionVaults = vaults.filter((vault) => vault.version === version);
84
+ for (let i = 0; i < versionVaults.length; i += MORPHO_API_PAGE_SIZE)
85
+ requests.push({ version, chunk: versionVaults.slice(i, i + MORPHO_API_PAGE_SIZE) });
86
+ });
81
87
  const liquidityByAddress = {};
82
- yield Promise.all(chunks.map((chunk) => __awaiter(void 0, void 0, void 0, function* () {
83
- const data = yield (0, graphql_request_1.request)(MORPHO_BLUE_API, vaultsLiquidityQuery, {
88
+ yield Promise.all(requests.map((_a) => __awaiter(void 0, [_a], void 0, function* ({ version, chunk }) {
89
+ const { field, query } = liquidityQueries[version];
90
+ const data = yield (0, graphql_request_1.request)(constants_1.MORPHO_API_URL, query, {
84
91
  addresses: chunk.map((vault) => vault.address),
85
92
  chainIds: [network],
86
93
  // the BigInt scalar serializes as a JSON number when it fits in Number.MAX_SAFE_INTEGER, a string otherwise
87
94
  });
88
- (data.vaults.items || []).forEach((item) => {
89
- var _a, _b;
90
- 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) {
91
- liquidityByAddress[item.address.toLowerCase()] = String(item.liquidity.underlying);
95
+ (data[field].items || []).forEach((item) => {
96
+ // V1 exposes liquidity as { underlying }, V2 as a plain BigInt scalar
97
+ 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;
98
+ if (underlying !== undefined && underlying !== null) {
99
+ liquidityByAddress[item.address.toLowerCase()] = String(underlying);
92
100
  }
93
101
  });
94
102
  })));
@@ -102,7 +110,19 @@ const getBatchedViemProvider = (provider, network) => (0, viem_1.getViemProvider
102
110
  },
103
111
  },
104
112
  });
105
- const getMorphoVaultChainData = (provider, morphoVault, accounts) => __awaiter(void 0, void 0, void 0, function* () {
113
+ // Vault V2 is ERC-4626 but has no decimals offset, so shares are converted with convertToAssets
114
+ const getMorphoVaultV2ChainData = (provider, morphoVault, accounts) => __awaiter(void 0, void 0, void 0, function* () {
115
+ const vaultContract = (0, contracts_1.getErc4626ContractViem)(provider, morphoVault.address);
116
+ const [totalAssets, suppliedAssets] = yield Promise.all([
117
+ vaultContract.read.totalAssets(),
118
+ Promise.all(accounts.map((account) => __awaiter(void 0, void 0, void 0, function* () {
119
+ const share = yield vaultContract.read.balanceOf([account]);
120
+ return share === BigInt(0) ? BigInt(0) : vaultContract.read.convertToAssets([share]);
121
+ }))),
122
+ ]);
123
+ return { totalAssets, suppliedAssets };
124
+ });
125
+ const getMorphoVaultV1ChainData = (provider, morphoVault, accounts) => __awaiter(void 0, void 0, void 0, function* () {
106
126
  const morphoVaultContract = (0, contracts_1.getMorphoVaultContractViem)(provider, morphoVault.address);
107
127
  const shares = {};
108
128
  const [totalAssets, totalSupply, decimals, decimalsOffset] = yield Promise.all([
@@ -119,11 +139,29 @@ const getMorphoVaultChainData = (provider, morphoVault, accounts) => __awaiter(v
119
139
  totalAssets, totalSupply, decimals, decimalsOffset, shares,
120
140
  };
121
141
  });
142
+ const getMorphoVaultChainData = (provider, morphoVault, accounts) => __awaiter(void 0, void 0, void 0, function* () {
143
+ return (morphoVault.version === types_1.MorphoVaultVersion.V2
144
+ ? { v2: yield getMorphoVaultV2ChainData(provider, morphoVault, accounts) }
145
+ : { v1: yield getMorphoVaultV1ChainData(provider, morphoVault, accounts) });
146
+ });
122
147
  const formatMorphoVaultData = (morphoVault, chainData, liquidityUnderlying, accounts) => {
123
- const { totalAssets, totalSupply, decimals, decimalsOffset, shares, } = chainData;
124
- const poolSize = (0, tokens_1.assetAmountInEth)(totalAssets.toString(), morphoVault.asset);
125
148
  const liquidity = (0, tokens_1.assetAmountInEth)(liquidityUnderlying, morphoVault.asset);
126
149
  const supplied = {};
150
+ if (chainData.v2) {
151
+ const { totalAssets, suppliedAssets } = chainData.v2;
152
+ accounts.forEach((account, i) => {
153
+ supplied[account.toLowerCase()] = (0, tokens_1.assetAmountInEth)(suppliedAssets[i].toString(), morphoVault.asset);
154
+ });
155
+ return {
156
+ poolSize: (0, tokens_1.assetAmountInEth)(totalAssets.toString(), morphoVault.asset),
157
+ supplied,
158
+ liquidity,
159
+ asset: morphoVault.asset,
160
+ optionType: morphoVault.type,
161
+ };
162
+ }
163
+ const { totalAssets, totalSupply, decimals, decimalsOffset, shares, } = chainData.v1;
164
+ const poolSize = (0, tokens_1.assetAmountInEth)(totalAssets.toString(), morphoVault.asset);
127
165
  accounts.forEach((account) => {
128
166
  const share = shares[account] || BigInt(0);
129
167
  supplied[account.toLowerCase()] = new decimal_js_1.default(new decimal_js_1.default(share.toString()).mul(new decimal_js_1.default(totalAssets.toString()).add(1)).div(new decimal_js_1.default(totalSupply.toString()).add(Math.pow(10, decimalsOffset))).div(Math.pow(10, 18))
@@ -17,5 +17,6 @@ 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;
20
21
  export declare const MORPHO_VAULTS: Record<MorphoVaultType, MorphoVault>;
21
22
  export declare const getMorphoVault: (type: MorphoVaultType) => MorphoVault;
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getMorphoVault = exports.MORPHO_VAULTS = exports.MORPHO_VAULT_SMOKEHOUSE_DAI = exports.MORPHO_VAULT_SMOKEHOUSE_USDC = exports.MORPHO_VAULT_SMOKEHOUSE_USDT = exports.MORPHO_VAULT_STEAKHOUSE_PYUSD = exports.MORPHO_VAULT_STEAKHOUSE_ETH = exports.MORPHO_VAULT_STEAKHOUSE_USDC = exports.MORPHO_VAULT_STEAKHOUSE_USDT = exports.MORPHO_VAULT_GAUNTLET_RESOLV_USDC = exports.MORPHO_VAULT_GAUNTLET_USDT_PRIME = exports.MORPHO_VAULT_GAUNTLET_USDA_CORE = exports.MORPHO_VAULT_FLAGSHIP_USDT = exports.MORPHO_VAULT_BOOSTED_USDC = exports.MORPHO_VAULT_GAUNTLET_WETH_PRIME = exports.MORPHO_VAULT_GAUNTLET_WETH_CORE = exports.MORPHO_VAULT_RE7_WETH = exports.MORPHO_VAULT_GAUNTLET_USDC_PRIME = exports.MORPHO_VAULT_GAUNTLET_USDC_CORE = exports.MORPHO_VAULT_FLAGSHIP_ETH = void 0;
3
+ exports.getMorphoVault = exports.MORPHO_VAULTS = exports.MORPHO_VAULT_GAUNTLET_USDG_PREMIUM = exports.MORPHO_VAULT_SMOKEHOUSE_DAI = exports.MORPHO_VAULT_SMOKEHOUSE_USDC = exports.MORPHO_VAULT_SMOKEHOUSE_USDT = exports.MORPHO_VAULT_STEAKHOUSE_PYUSD = exports.MORPHO_VAULT_STEAKHOUSE_ETH = exports.MORPHO_VAULT_STEAKHOUSE_USDC = exports.MORPHO_VAULT_STEAKHOUSE_USDT = exports.MORPHO_VAULT_GAUNTLET_RESOLV_USDC = exports.MORPHO_VAULT_GAUNTLET_USDT_PRIME = exports.MORPHO_VAULT_GAUNTLET_USDA_CORE = exports.MORPHO_VAULT_FLAGSHIP_USDT = exports.MORPHO_VAULT_BOOSTED_USDC = exports.MORPHO_VAULT_GAUNTLET_WETH_PRIME = exports.MORPHO_VAULT_GAUNTLET_WETH_CORE = exports.MORPHO_VAULT_RE7_WETH = exports.MORPHO_VAULT_GAUNTLET_USDC_PRIME = exports.MORPHO_VAULT_GAUNTLET_USDC_CORE = exports.MORPHO_VAULT_FLAGSHIP_ETH = void 0;
4
4
  const types_1 = require("../../types");
5
5
  exports.MORPHO_VAULT_FLAGSHIP_ETH = {
6
6
  type: types_1.MorphoVaultType.MorphoVaultFlagshipEth,
7
7
  name: 'Flagship ETH',
8
8
  address: '0x38989BBA00BDF8181F4082995b3DEAe96163aC5D',
9
9
  asset: 'WETH',
10
+ network: types_1.NetworkNumber.Eth,
11
+ version: types_1.MorphoVaultVersion.V1,
10
12
  deploymentBlock: 18927491,
11
13
  isLegacy: true,
12
14
  };
@@ -15,6 +17,8 @@ exports.MORPHO_VAULT_GAUNTLET_USDC_CORE = {
15
17
  name: 'Gauntlet USDC Core',
16
18
  address: '0x8eB67A509616cd6A7c1B3c8C21D48FF57df3d458',
17
19
  asset: 'USDC',
20
+ network: types_1.NetworkNumber.Eth,
21
+ version: types_1.MorphoVaultVersion.V1,
18
22
  deploymentBlock: 19777569,
19
23
  isLegacy: true,
20
24
  };
@@ -23,6 +27,8 @@ exports.MORPHO_VAULT_GAUNTLET_USDC_PRIME = {
23
27
  name: 'Gauntlet USDC Prime',
24
28
  address: '0xdd0f28e19C1780eb6396170735D45153D261490d',
25
29
  asset: 'USDC',
30
+ network: types_1.NetworkNumber.Eth,
31
+ version: types_1.MorphoVaultVersion.V1,
26
32
  deploymentBlock: 19777569,
27
33
  isLegacy: true,
28
34
  };
@@ -31,6 +37,8 @@ exports.MORPHO_VAULT_RE7_WETH = {
31
37
  name: 'RE7 WETH',
32
38
  address: '0x78Fc2c2eD1A4cDb5402365934aE5648aDAd094d0',
33
39
  asset: 'WETH',
40
+ network: types_1.NetworkNumber.Eth,
41
+ version: types_1.MorphoVaultVersion.V1,
34
42
  deploymentBlock: 19121118,
35
43
  isLegacy: true,
36
44
  };
@@ -39,6 +47,8 @@ exports.MORPHO_VAULT_GAUNTLET_WETH_CORE = {
39
47
  name: 'Gauntlet WETH Core',
40
48
  address: '0x4881Ef0BF6d2365D3dd6499ccd7532bcdBCE0658',
41
49
  asset: 'WETH',
50
+ network: types_1.NetworkNumber.Eth,
51
+ version: types_1.MorphoVaultVersion.V1,
42
52
  deploymentBlock: 19541126,
43
53
  isLegacy: true,
44
54
  };
@@ -47,6 +57,8 @@ exports.MORPHO_VAULT_GAUNTLET_WETH_PRIME = {
47
57
  name: 'Gauntlet WETH Prime',
48
58
  address: '0x2371e134e3455e0593363cBF89d3b6cf53740618',
49
59
  asset: 'WETH',
60
+ network: types_1.NetworkNumber.Eth,
61
+ version: types_1.MorphoVaultVersion.V1,
50
62
  deploymentBlock: 19372149,
51
63
  isLegacy: true,
52
64
  };
@@ -55,6 +67,8 @@ exports.MORPHO_VAULT_BOOSTED_USDC = {
55
67
  name: 'Boosted USDC',
56
68
  address: '0xd63070114470f685b75B74D60EEc7c1113d33a3D',
57
69
  asset: 'USDC',
70
+ network: types_1.NetworkNumber.Eth,
71
+ version: types_1.MorphoVaultVersion.V1,
58
72
  deploymentBlock: 20377233,
59
73
  isLegacy: true,
60
74
  };
@@ -63,6 +77,8 @@ exports.MORPHO_VAULT_FLAGSHIP_USDT = {
63
77
  name: 'Flagship USDT',
64
78
  address: '0x2C25f6C25770fFEC5959D34B94Bf898865e5D6b1',
65
79
  asset: 'USDT',
80
+ network: types_1.NetworkNumber.Eth,
81
+ version: types_1.MorphoVaultVersion.V1,
66
82
  deploymentBlock: 19127039,
67
83
  isLegacy: true,
68
84
  };
@@ -71,6 +87,8 @@ exports.MORPHO_VAULT_GAUNTLET_USDA_CORE = {
71
87
  name: 'Gauntlet USDA Core',
72
88
  address: '0x125D41A6e5dbf455cD9Df8F80BCC6fd172D52Cc6',
73
89
  asset: 'USDA',
90
+ network: types_1.NetworkNumber.Eth,
91
+ version: types_1.MorphoVaultVersion.V1,
74
92
  deploymentBlock: 19633608,
75
93
  isLegacy: true,
76
94
  };
@@ -79,6 +97,8 @@ exports.MORPHO_VAULT_GAUNTLET_USDT_PRIME = {
79
97
  name: 'Gauntlet USDT Prime',
80
98
  address: '0x8CB3649114051cA5119141a34C200D65dc0Faa73',
81
99
  asset: 'USDT',
100
+ network: types_1.NetworkNumber.Eth,
101
+ version: types_1.MorphoVaultVersion.V1,
82
102
  deploymentBlock: 19486541,
83
103
  isLegacy: true,
84
104
  };
@@ -87,6 +107,8 @@ exports.MORPHO_VAULT_GAUNTLET_RESOLV_USDC = {
87
107
  name: 'Gauntlet Resolv USDC',
88
108
  address: '0x132E6C9C33A62D7727cd359b1f51e5B566E485Eb',
89
109
  asset: 'USDC',
110
+ network: types_1.NetworkNumber.Eth,
111
+ version: types_1.MorphoVaultVersion.V1,
90
112
  deploymentBlock: 21487882,
91
113
  isLegacy: true,
92
114
  };
@@ -96,6 +118,8 @@ exports.MORPHO_VAULT_STEAKHOUSE_USDT = {
96
118
  name: 'Steakhouse USDT',
97
119
  address: '0xbEef047a543E45807105E51A8BBEFCc5950fcfBa',
98
120
  asset: 'USDT',
121
+ network: types_1.NetworkNumber.Eth,
122
+ version: types_1.MorphoVaultVersion.V1,
99
123
  deploymentBlock: 19043398,
100
124
  isLegacy: false,
101
125
  };
@@ -104,6 +128,8 @@ exports.MORPHO_VAULT_STEAKHOUSE_USDC = {
104
128
  name: 'Steakhouse USDC',
105
129
  address: '0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB',
106
130
  asset: 'USDC',
131
+ network: types_1.NetworkNumber.Eth,
132
+ version: types_1.MorphoVaultVersion.V1,
107
133
  deploymentBlock: 18928285,
108
134
  isLegacy: false,
109
135
  };
@@ -112,6 +138,8 @@ exports.MORPHO_VAULT_STEAKHOUSE_ETH = {
112
138
  name: 'Steakhouse WETH',
113
139
  address: '0xBEEf050ecd6a16c4e7bfFbB52Ebba7846C4b8cD4',
114
140
  asset: 'WETH',
141
+ network: types_1.NetworkNumber.Eth,
142
+ version: types_1.MorphoVaultVersion.V1,
115
143
  deploymentBlock: 19380443,
116
144
  isLegacy: false,
117
145
  };
@@ -120,6 +148,8 @@ exports.MORPHO_VAULT_STEAKHOUSE_PYUSD = {
120
148
  name: 'Steakhouse PYUSD',
121
149
  address: '0xbEEF02e5E13584ab96848af90261f0C8Ee04722a',
122
150
  asset: 'PYUSD',
151
+ network: types_1.NetworkNumber.Eth,
152
+ version: types_1.MorphoVaultVersion.V1,
123
153
  deploymentBlock: 19043398,
124
154
  isLegacy: false,
125
155
  };
@@ -129,6 +159,8 @@ exports.MORPHO_VAULT_SMOKEHOUSE_USDT = {
129
159
  name: 'Smokehouse USDT',
130
160
  address: '0xA0804346780b4c2e3bE118ac957D1DB82F9d7484',
131
161
  asset: 'USDT',
162
+ network: types_1.NetworkNumber.Eth,
163
+ version: types_1.MorphoVaultVersion.V1,
132
164
  deploymentBlock: 21522238,
133
165
  isLegacy: false,
134
166
  };
@@ -137,6 +169,8 @@ exports.MORPHO_VAULT_SMOKEHOUSE_USDC = {
137
169
  name: 'Smokehouse USDC',
138
170
  address: '0xBEeFFF209270748ddd194831b3fa287a5386f5bC',
139
171
  asset: 'USDC',
172
+ network: types_1.NetworkNumber.Eth,
173
+ version: types_1.MorphoVaultVersion.V1,
140
174
  deploymentBlock: 21337719,
141
175
  isLegacy: false,
142
176
  };
@@ -145,9 +179,22 @@ exports.MORPHO_VAULT_SMOKEHOUSE_DAI = {
145
179
  name: 'Smokehouse DAI',
146
180
  address: '0xbeeFfF68CC520D68f82641EFF84330C631E2490E',
147
181
  asset: 'DAI',
182
+ network: types_1.NetworkNumber.Eth,
183
+ version: types_1.MorphoVaultVersion.V1,
148
184
  deploymentBlock: 21343808,
149
185
  isLegacy: false,
150
186
  };
187
+ // Vault V2
188
+ exports.MORPHO_VAULT_GAUNTLET_USDG_PREMIUM = {
189
+ type: types_1.MorphoVaultType.MorphoVaultGauntletUSDGPremium,
190
+ name: 'Gauntlet USDG Premium',
191
+ address: '0x390c1bb01F3F627144a40617e287d4cE3D5aBCfa',
192
+ asset: 'USDG',
193
+ network: types_1.NetworkNumber.Arb,
194
+ version: types_1.MorphoVaultVersion.V2,
195
+ deploymentBlock: 510799903,
196
+ isLegacy: false,
197
+ };
151
198
  exports.MORPHO_VAULTS = {
152
199
  [types_1.MorphoVaultType.MorphoVaultFlagshipEth]: exports.MORPHO_VAULT_FLAGSHIP_ETH,
153
200
  [types_1.MorphoVaultType.MorphoVaultGauntletUSDCCore]: exports.MORPHO_VAULT_GAUNTLET_USDC_CORE,
@@ -169,6 +216,8 @@ exports.MORPHO_VAULTS = {
169
216
  [types_1.MorphoVaultType.MorphoVaultSmokehouseUSDT]: exports.MORPHO_VAULT_SMOKEHOUSE_USDT,
170
217
  [types_1.MorphoVaultType.MorphoVaultSmokehouseUSDC]: exports.MORPHO_VAULT_SMOKEHOUSE_USDC,
171
218
  [types_1.MorphoVaultType.MorphoVaultSmokehouseDAI]: exports.MORPHO_VAULT_SMOKEHOUSE_DAI,
219
+ // Vault V2
220
+ [types_1.MorphoVaultType.MorphoVaultGauntletUSDGPremium]: exports.MORPHO_VAULT_GAUNTLET_USDG_PREMIUM,
172
221
  };
173
222
  const getMorphoVault = (type) => exports.MORPHO_VAULTS[type];
174
223
  exports.getMorphoVault = getMorphoVault;
@@ -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,20 @@ 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
+ }
23
+ export declare enum MorphoVaultVersion {
24
+ V1 = 1,
25
+ V2 = 2
21
26
  }
22
27
  export interface MorphoVault {
23
28
  type: MorphoVaultType;
24
29
  name: string;
25
30
  address: EthAddress;
26
31
  asset: string;
32
+ network: NetworkNumber;
33
+ version: MorphoVaultVersion;
27
34
  deploymentBlock: number;
28
35
  isLegacy: boolean;
29
36
  }
@@ -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,11 @@ 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";
26
28
  })(MorphoVaultType || (exports.MorphoVaultType = MorphoVaultType = {}));
29
+ var MorphoVaultVersion;
30
+ (function (MorphoVaultVersion) {
31
+ MorphoVaultVersion[MorphoVaultVersion["V1"] = 1] = "V1";
32
+ MorphoVaultVersion[MorphoVaultVersion["V2"] = 2] = "V2";
33
+ })(MorphoVaultVersion || (exports.MorphoVaultVersion = MorphoVaultVersion = {}));
@@ -10,3 +10,4 @@ export declare const ZERO_BYTES32 = "0x00000000000000000000000000000000000000000
10
10
  export declare const WAD = 1000000000000000000;
11
11
  export declare const USD_QUOTE = "0x0000000000000000000000000000000000000348";
12
12
  export declare const borrowOperations: string[];
13
+ export declare const MORPHO_API_URL = "https://fe.defisaver.com/api/morpho/graphql";
@@ -10,3 +10,6 @@ export const ZERO_BYTES32 = '0x0000000000000000000000000000000000000000000000000
10
10
  export const WAD = 1e18;
11
11
  export const USD_QUOTE = '0x0000000000000000000000000000000000000348';
12
12
  export const borrowOperations = ['borrow', 'payback'];
13
+ // Proxies Morpho's GraphQL API through the DFS backend, which attaches the private API key
14
+ // for better rate limits (DEV-13673)
15
+ export const MORPHO_API_URL = 'https://fe.defisaver.com/api/morpho/graphql';
@@ -12,7 +12,7 @@ import { assetAmountInWei, getAssetInfo, getAssetInfoByAddress } from '@defisave
12
12
  import { aprToApy, calcLeverageLiqPrice, getAssetsTotal, getExposure, isLeveragedPos, } from '../../moneymarket';
13
13
  import { calculateNetApy } from '../../staking';
14
14
  import { LeverageType, NetworkNumber, } from '../../types/common';
15
- import { borrowOperations, SECONDS_PER_YEAR, WAD } from '../../constants';
15
+ import { borrowOperations, MORPHO_API_URL, SECONDS_PER_YEAR, WAD, } from '../../constants';
16
16
  import { MorphoBlueViewContractViem } from '../../contracts';
17
17
  import { compareAddresses, LONGER_TIMEOUT } from '../../services/utils';
18
18
  import { getViemProvider } from '../../services/viem';
@@ -129,7 +129,6 @@ export const getApyAfterValuesEstimation = (selectedMarket, actions, provider, n
129
129
  const supplyRate = getSupplyRate(data[1].totalSupplyAssets.toString(), data[1].totalBorrowAssets.toString(), data[0].toString(), data[1].fee.toString());
130
130
  return { borrowRate, supplyRate };
131
131
  });
132
- const API_URL = 'https://api.morpho.org/graphql';
133
132
  // Morpho Blue ACRM (Adaptive Curve IRM) always targets 90% utilization — protocol constant
134
133
  const ACRM_TARGET_UTILIZATION = '900000000000000000';
135
134
  const MARKET_QUERY = `
@@ -206,7 +205,7 @@ const REWARDS_QUERY = `
206
205
  export const getReallocatableLiquidity = (marketId_1, ...args_1) => __awaiter(void 0, [marketId_1, ...args_1], void 0, function* (marketId, network = NetworkNumber.Eth) {
207
206
  var _a;
208
207
  try {
209
- const response = yield fetch(API_URL, {
208
+ const response = yield fetch(MORPHO_API_URL, {
210
209
  method: 'POST',
211
210
  headers: { 'Content-Type': 'application/json' },
212
211
  body: JSON.stringify({
@@ -268,7 +267,7 @@ export const getReallocation = (market_1, assetsData_1, amountToBorrow_1, ...arg
268
267
  var _a, _b, _c;
269
268
  try {
270
269
  const { marketId, loanToken } = market;
271
- const response = yield fetch(API_URL, {
270
+ const response = yield fetch(MORPHO_API_URL, {
272
271
  method: 'POST',
273
272
  headers: { 'Content-Type': 'application/json' },
274
273
  body: JSON.stringify({
@@ -341,7 +340,7 @@ export const getReallocation = (market_1, assetsData_1, amountToBorrow_1, ...arg
341
340
  });
342
341
  export const getRewardsForMarket = (marketId_1, ...args_1) => __awaiter(void 0, [marketId_1, ...args_1], void 0, function* (marketId, network = NetworkNumber.Eth) {
343
342
  var _a;
344
- const response = yield fetch(API_URL, {
343
+ const response = yield fetch(MORPHO_API_URL, {
345
344
  method: 'POST',
346
345
  headers: { 'Content-Type': 'application/json' },
347
346
  body: JSON.stringify({
@@ -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
  */