@defisaver/positions-sdk 2.1.158-dev → 2.1.158-morpho-batch-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.
@@ -100745,6 +100745,26 @@ export declare const MorphoBlueViewContractViem: (client: Client, network: Netwo
100745
100745
  export declare const MorphoMidnightViewContractViem: (client: Client, network: NetworkNumber, block?: Blockish) => {
100746
100746
  read: {
100747
100747
  getRatio: (args: readonly [`0x${string}`, `0x${string}`], options?: import("viem").Prettify<import("viem").UnionOmit<import("viem").ReadContractParameters<readonly [{
100748
+ readonly inputs: readonly [];
100749
+ readonly name: "InvalidCollateralIndex";
100750
+ readonly type: "error";
100751
+ }, {
100752
+ readonly inputs: readonly [];
100753
+ readonly name: "InvalidOfferMarketId";
100754
+ readonly type: "error";
100755
+ }, {
100756
+ readonly inputs: readonly [];
100757
+ readonly name: "InvalidOfferType";
100758
+ readonly type: "error";
100759
+ }, {
100760
+ readonly inputs: readonly [];
100761
+ readonly name: "NoOrdersProvided";
100762
+ readonly type: "error";
100763
+ }, {
100764
+ readonly inputs: readonly [];
100765
+ readonly name: "ZeroAmountRequested";
100766
+ readonly type: "error";
100767
+ }, {
100748
100768
  readonly inputs: readonly [{
100749
100769
  readonly internalType: "bytes32";
100750
100770
  readonly name: "_id";
@@ -100986,6 +101006,26 @@ export declare const MorphoMidnightViewContractViem: (client: Client, network: N
100986
101006
  readonly type: "function";
100987
101007
  }], "getRatio", readonly [`0x${string}`, `0x${string}`]>, "address" | "args" | "abi" | "functionName">> | undefined) => Promise<bigint>;
100988
101008
  getMarketInfo: (args: readonly [`0x${string}`], options?: import("viem").Prettify<import("viem").UnionOmit<import("viem").ReadContractParameters<readonly [{
101009
+ readonly inputs: readonly [];
101010
+ readonly name: "InvalidCollateralIndex";
101011
+ readonly type: "error";
101012
+ }, {
101013
+ readonly inputs: readonly [];
101014
+ readonly name: "InvalidOfferMarketId";
101015
+ readonly type: "error";
101016
+ }, {
101017
+ readonly inputs: readonly [];
101018
+ readonly name: "InvalidOfferType";
101019
+ readonly type: "error";
101020
+ }, {
101021
+ readonly inputs: readonly [];
101022
+ readonly name: "NoOrdersProvided";
101023
+ readonly type: "error";
101024
+ }, {
101025
+ readonly inputs: readonly [];
101026
+ readonly name: "ZeroAmountRequested";
101027
+ readonly type: "error";
101028
+ }, {
100989
101029
  readonly inputs: readonly [{
100990
101030
  readonly internalType: "bytes32";
100991
101031
  readonly name: "_id";
@@ -101237,6 +101277,26 @@ export declare const MorphoMidnightViewContractViem: (client: Client, network: N
101237
101277
  prices: readonly bigint[];
101238
101278
  }>;
101239
101279
  getPositionInfo: (args: readonly [`0x${string}`, `0x${string}`], options?: import("viem").Prettify<import("viem").UnionOmit<import("viem").ReadContractParameters<readonly [{
101280
+ readonly inputs: readonly [];
101281
+ readonly name: "InvalidCollateralIndex";
101282
+ readonly type: "error";
101283
+ }, {
101284
+ readonly inputs: readonly [];
101285
+ readonly name: "InvalidOfferMarketId";
101286
+ readonly type: "error";
101287
+ }, {
101288
+ readonly inputs: readonly [];
101289
+ readonly name: "InvalidOfferType";
101290
+ readonly type: "error";
101291
+ }, {
101292
+ readonly inputs: readonly [];
101293
+ readonly name: "NoOrdersProvided";
101294
+ readonly type: "error";
101295
+ }, {
101296
+ readonly inputs: readonly [];
101297
+ readonly name: "ZeroAmountRequested";
101298
+ readonly type: "error";
101299
+ }, {
101240
101300
  readonly inputs: readonly [{
101241
101301
  readonly internalType: "bytes32";
101242
101302
  readonly name: "_id";
@@ -101499,6 +101559,26 @@ export declare const MorphoMidnightViewContractViem: (client: Client, network: N
101499
101559
  enterGate: `0x${string}`;
101500
101560
  liquidatorGate: `0x${string}`;
101501
101561
  }], options?: import("viem").Prettify<import("viem").UnionOmit<import("viem").ReadContractParameters<readonly [{
101562
+ readonly inputs: readonly [];
101563
+ readonly name: "InvalidCollateralIndex";
101564
+ readonly type: "error";
101565
+ }, {
101566
+ readonly inputs: readonly [];
101567
+ readonly name: "InvalidOfferMarketId";
101568
+ readonly type: "error";
101569
+ }, {
101570
+ readonly inputs: readonly [];
101571
+ readonly name: "InvalidOfferType";
101572
+ readonly type: "error";
101573
+ }, {
101574
+ readonly inputs: readonly [];
101575
+ readonly name: "NoOrdersProvided";
101576
+ readonly type: "error";
101577
+ }, {
101578
+ readonly inputs: readonly [];
101579
+ readonly name: "ZeroAmountRequested";
101580
+ readonly type: "error";
101581
+ }, {
101502
101582
  readonly inputs: readonly [{
101503
101583
  readonly internalType: "bytes32";
101504
101584
  readonly name: "_id";
@@ -101754,6 +101834,26 @@ export declare const MorphoMidnightViewContractViem: (client: Client, network: N
101754
101834
  liquidatorGate: `0x${string}`;
101755
101835
  }]>, "address" | "args" | "abi" | "functionName">> | undefined) => Promise<`0x${string}`>;
101756
101836
  toMarket: (args: readonly [`0x${string}`], options?: import("viem").Prettify<import("viem").UnionOmit<import("viem").ReadContractParameters<readonly [{
101837
+ readonly inputs: readonly [];
101838
+ readonly name: "InvalidCollateralIndex";
101839
+ readonly type: "error";
101840
+ }, {
101841
+ readonly inputs: readonly [];
101842
+ readonly name: "InvalidOfferMarketId";
101843
+ readonly type: "error";
101844
+ }, {
101845
+ readonly inputs: readonly [];
101846
+ readonly name: "InvalidOfferType";
101847
+ readonly type: "error";
101848
+ }, {
101849
+ readonly inputs: readonly [];
101850
+ readonly name: "NoOrdersProvided";
101851
+ readonly type: "error";
101852
+ }, {
101853
+ readonly inputs: readonly [];
101854
+ readonly name: "ZeroAmountRequested";
101855
+ readonly type: "error";
101856
+ }, {
101757
101857
  readonly inputs: readonly [{
101758
101858
  readonly internalType: "bytes32";
101759
101859
  readonly name: "_id";
@@ -102011,6 +102111,26 @@ export declare const MorphoMidnightViewContractViem: (client: Client, network: N
102011
102111
  };
102012
102112
  address: `0x${string}`;
102013
102113
  abi: readonly [{
102114
+ readonly inputs: readonly [];
102115
+ readonly name: "InvalidCollateralIndex";
102116
+ readonly type: "error";
102117
+ }, {
102118
+ readonly inputs: readonly [];
102119
+ readonly name: "InvalidOfferMarketId";
102120
+ readonly type: "error";
102121
+ }, {
102122
+ readonly inputs: readonly [];
102123
+ readonly name: "InvalidOfferType";
102124
+ readonly type: "error";
102125
+ }, {
102126
+ readonly inputs: readonly [];
102127
+ readonly name: "NoOrdersProvided";
102128
+ readonly type: "error";
102129
+ }, {
102130
+ readonly inputs: readonly [];
102131
+ readonly name: "ZeroAmountRequested";
102132
+ readonly type: "error";
102133
+ }, {
102014
102134
  readonly inputs: readonly [{
102015
102135
  readonly internalType: "bytes32";
102016
102136
  readonly name: "_id";
@@ -27,16 +27,16 @@ export const getSavingsData = (provider, network, accounts) => __awaiter(void 0,
27
27
  const savingsData = {};
28
28
  yield Promise.all([
29
29
  ...(network === NetworkNumber.Eth ? [
30
- ...morphoVaultsList.map((vaultKey) => __awaiter(void 0, void 0, void 0, function* () {
30
+ (() => __awaiter(void 0, void 0, void 0, function* () {
31
31
  try {
32
- const vault = morphoVaults.morphoVaultsOptions.getMorphoVault(vaultKey);
33
- const data = yield morphoVaults.getMorphoVaultData(provider, network, vault, accounts);
34
- savingsData[vaultKey] = data;
32
+ const vaults = morphoVaultsList.map((vaultKey) => morphoVaults.morphoVaultsOptions.getMorphoVault(vaultKey));
33
+ const data = yield morphoVaults.getMorphoVaultsData(provider, network, vaults, accounts);
34
+ Object.assign(savingsData, data);
35
35
  }
36
36
  catch (err) {
37
- console.error(`[getSavingsData] Error fetching morpho vault ${vaultKey}:`, err);
37
+ console.error('[getSavingsData] Error fetching morpho vaults:', err);
38
38
  }
39
- })),
39
+ }))(),
40
40
  ...yearnVaultsList.map((vaultKey) => __awaiter(void 0, void 0, void 0, function* () {
41
41
  try {
42
42
  const vault = yearnVaults.yearnVaultsOptions.getYearnVault(vaultKey);
@@ -1,7 +1,19 @@
1
1
  import { Client } from 'viem';
2
2
  import * as morphoVaultsOptions from './options';
3
- import { EthAddress, EthereumProvider, NetworkNumber } from '../../types/common';
4
- import { MorphoVault, SavingsVaultData } from '../../types';
3
+ import { EthAddress, EthereumProvider, NetworkNumber, MorphoVault, MorphoVaultType, SavingsVaultData } from '../../types';
5
4
  export { morphoVaultsOptions, };
6
- export declare const _getMorphoVaultData: (provider: Client, network: NetworkNumber, morphoVault: MorphoVault, accounts: EthAddress[]) => Promise<SavingsVaultData>;
5
+ /**
6
+ * Fetches liquidity for all given vaults in a single API request (chunked if over the page cap),
7
+ * returned as a map keyed by lowercased vault address. A vault missing from the API response is
8
+ * absent from the map.
9
+ */
10
+ export declare const fetchMorphoVaultsLiquidity: (network: NetworkNumber, vaults: MorphoVault[]) => Promise<Record<string, string>>;
11
+ /**
12
+ * Fetches data for all given vaults with a single Morpho API request for their liquidity,
13
+ * instead of one request per vault. The on-chain reads run in parallel with the API request.
14
+ * A vault whose on-chain reads fail or that is missing from the API response is left out of
15
+ * the result; a failed API request rejects, leaving all vaults out.
16
+ */
17
+ export declare const _getMorphoVaultsData: (provider: Client, network: NetworkNumber, vaults: MorphoVault[], accounts: EthAddress[]) => Promise<Partial<Record<MorphoVaultType, SavingsVaultData>>>;
18
+ export declare function getMorphoVaultsData(provider: EthereumProvider, network: NetworkNumber, vaults: MorphoVault[], accounts: EthAddress[]): Promise<Partial<Record<MorphoVaultType, SavingsVaultData>>>;
7
19
  export declare function getMorphoVaultData(provider: EthereumProvider, network: NetworkNumber, morphoVault: MorphoVault, accounts: EthAddress[]): Promise<SavingsVaultData>;
@@ -14,38 +14,73 @@ import * as morphoVaultsOptions from './options';
14
14
  import { getViemProvider } from '../../services/viem';
15
15
  import { getMorphoVaultContractViem } from '../../contracts';
16
16
  export { morphoVaultsOptions, };
17
- const vaultDataQuery = `
18
- query VaultByAddress($address: String!, $chainId: Int!) {
19
- vaultByAddress(address: $address, chainId: $chainId) {
20
- address
21
- state {
22
- totalAssets
23
- totalAssetsUsd
24
- totalSupply
25
- }
26
- liquidity {
27
- underlying
28
- usd
17
+ const MORPHO_BLUE_API = 'https://api.morpho.org/graphql';
18
+ // Morpho API caps list page size at 100 items
19
+ const MORPHO_API_PAGE_SIZE = 100;
20
+ const vaultsLiquidityQuery = `
21
+ query VaultsLiquidity($addresses: [String!], $chainIds: [Int!]) {
22
+ vaults(first: ${MORPHO_API_PAGE_SIZE}, where: { address_in: $addresses, chainId_in: $chainIds }) {
23
+ items {
24
+ address
25
+ liquidity {
26
+ underlying
27
+ }
29
28
  }
30
29
  }
31
30
  }`;
32
- const MORPHO_BLUE_API = 'https://api.morpho.org/graphql';
33
- export const _getMorphoVaultData = (provider, network, morphoVault, accounts) => __awaiter(void 0, void 0, void 0, function* () {
31
+ /**
32
+ * Fetches liquidity for all given vaults in a single API request (chunked if over the page cap),
33
+ * returned as a map keyed by lowercased vault address. A vault missing from the API response is
34
+ * absent from the map.
35
+ */
36
+ export const fetchMorphoVaultsLiquidity = (network, vaults) => __awaiter(void 0, void 0, void 0, function* () {
37
+ const chunks = [];
38
+ for (let i = 0; i < vaults.length; i += MORPHO_API_PAGE_SIZE)
39
+ chunks.push(vaults.slice(i, i + MORPHO_API_PAGE_SIZE));
40
+ const liquidityByAddress = {};
41
+ yield Promise.all(chunks.map((chunk) => __awaiter(void 0, void 0, void 0, function* () {
42
+ const data = yield graphqlRequest(MORPHO_BLUE_API, vaultsLiquidityQuery, {
43
+ addresses: chunk.map((vault) => vault.address),
44
+ chainIds: [network],
45
+ // the BigInt scalar serializes as a JSON number when it fits in Number.MAX_SAFE_INTEGER, a string otherwise
46
+ });
47
+ (data.vaults.items || []).forEach((item) => {
48
+ var _a, _b;
49
+ if (((_a = item === null || item === void 0 ? void 0 : item.liquidity) === null || _a === void 0 ? void 0 : _a.underlying) !== undefined && ((_b = item.liquidity) === null || _b === void 0 ? void 0 : _b.underlying) !== null) {
50
+ liquidityByAddress[item.address.toLowerCase()] = String(item.liquidity.underlying);
51
+ }
52
+ });
53
+ })));
54
+ return liquidityByAddress;
55
+ });
56
+ const getBatchedViemProvider = (provider, network) => getViemProvider(provider, network, {
57
+ batch: {
58
+ multicall: {
59
+ batchSize: 2500000,
60
+ },
61
+ },
62
+ });
63
+ const getMorphoVaultChainData = (provider, morphoVault, accounts) => __awaiter(void 0, void 0, void 0, function* () {
34
64
  const morphoVaultContract = getMorphoVaultContractViem(provider, morphoVault.address);
35
65
  const shares = {};
36
- const [totalAssets, totalSupply, decimals, decimalsOffset, vaultData] = yield Promise.all([
66
+ const [totalAssets, totalSupply, decimals, decimalsOffset] = yield Promise.all([
37
67
  morphoVaultContract.read.totalAssets(),
38
68
  morphoVaultContract.read.totalSupply(),
39
69
  morphoVaultContract.read.decimals(),
40
70
  morphoVaultContract.read.DECIMALS_OFFSET(),
41
- graphqlRequest(MORPHO_BLUE_API, vaultDataQuery, { address: morphoVault.address, chainId: network }),
42
71
  ...accounts.map((account) => __awaiter(void 0, void 0, void 0, function* () {
43
72
  const share = yield morphoVaultContract.read.balanceOf([account]);
44
73
  shares[account] = share;
45
74
  })),
46
75
  ]);
76
+ return {
77
+ totalAssets, totalSupply, decimals, decimalsOffset, shares,
78
+ };
79
+ });
80
+ const formatMorphoVaultData = (morphoVault, chainData, liquidityUnderlying, accounts) => {
81
+ const { totalAssets, totalSupply, decimals, decimalsOffset, shares, } = chainData;
47
82
  const poolSize = assetAmountInEth(totalAssets.toString(), morphoVault.asset);
48
- const liquidity = assetAmountInEth(vaultData.vaultByAddress.liquidity.underlying, morphoVault.asset);
83
+ const liquidity = assetAmountInEth(liquidityUnderlying, morphoVault.asset);
49
84
  const supplied = {};
50
85
  accounts.forEach((account) => {
51
86
  const share = shares[account] || BigInt(0);
@@ -60,15 +95,49 @@ export const _getMorphoVaultData = (provider, network, morphoVault, accounts) =>
60
95
  asset: morphoVault.asset,
61
96
  optionType: morphoVault.type,
62
97
  };
98
+ };
99
+ /**
100
+ * Fetches data for all given vaults with a single Morpho API request for their liquidity,
101
+ * instead of one request per vault. The on-chain reads run in parallel with the API request.
102
+ * A vault whose on-chain reads fail or that is missing from the API response is left out of
103
+ * the result; a failed API request rejects, leaving all vaults out.
104
+ */
105
+ export const _getMorphoVaultsData = (provider, network, vaults, accounts) => __awaiter(void 0, void 0, void 0, function* () {
106
+ const [liquidityByAddress, chainData] = yield Promise.all([
107
+ fetchMorphoVaultsLiquidity(network, vaults),
108
+ Promise.all(vaults.map((vault) => getMorphoVaultChainData(provider, vault, accounts).catch((err) => {
109
+ console.error(`[getMorphoVaultsData] Error fetching on-chain data for morpho vault ${vault.type}:`, err);
110
+ return null;
111
+ }))),
112
+ ]);
113
+ const savingsData = {};
114
+ vaults.forEach((vault, i) => {
115
+ const vaultChainData = chainData[i];
116
+ if (!vaultChainData)
117
+ return;
118
+ const liquidityUnderlying = liquidityByAddress[vault.address.toLowerCase()];
119
+ if (liquidityUnderlying === undefined) {
120
+ console.error(`[getMorphoVaultsData] Vault ${vault.type} (${vault.address}) missing from Morpho API response`);
121
+ return;
122
+ }
123
+ savingsData[vault.type] = formatMorphoVaultData(vault, vaultChainData, liquidityUnderlying, accounts);
124
+ });
125
+ return savingsData;
63
126
  });
127
+ export function getMorphoVaultsData(provider, network, vaults, accounts) {
128
+ return __awaiter(this, void 0, void 0, function* () {
129
+ return _getMorphoVaultsData(getBatchedViemProvider(provider, network), network, vaults, accounts);
130
+ });
131
+ }
64
132
  export function getMorphoVaultData(provider, network, morphoVault, accounts) {
65
133
  return __awaiter(this, void 0, void 0, function* () {
66
- return _getMorphoVaultData(getViemProvider(provider, network, {
67
- batch: {
68
- multicall: {
69
- batchSize: 2500000,
70
- },
71
- },
72
- }), network, morphoVault, accounts);
134
+ const [liquidityByAddress, chainData] = yield Promise.all([
135
+ fetchMorphoVaultsLiquidity(network, [morphoVault]),
136
+ getMorphoVaultChainData(getBatchedViemProvider(provider, network), morphoVault, accounts),
137
+ ]);
138
+ const liquidityUnderlying = liquidityByAddress[morphoVault.address.toLowerCase()];
139
+ if (liquidityUnderlying === undefined)
140
+ throw new Error(`Vault ${morphoVault.address} missing from Morpho API response`);
141
+ return formatMorphoVaultData(morphoVault, chainData, liquidityUnderlying, accounts);
73
142
  });
74
143
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defisaver/positions-sdk",
3
- "version": "2.1.158-dev",
3
+ "version": "2.1.158-morpho-batch-dev",
4
4
  "description": "",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./esm/index.js",
@@ -50,6 +50,7 @@ export const AAVE_V4_TOKENIZED_SPOKES: Record<string, EthAddress> = {
50
50
  USDT_PRIME: '0x46c588DD8453aC259c1f6a54b4C9A93C2aC3762D',
51
51
 
52
52
  USDC_PAXOS: '0xaed7c529bD2878170B61C758DfAa215AC7a4FD07',
53
+ USDG_PAXOS: '0x378B4a7c394E22bd562F66eB612165893533c124',
53
54
  USDT_PAXOS: '0xa0e97e45C2f89003730E467Bd484fA3eEcE5B4Cf',
54
55
  PT_USDG_Sep_PAXOS: '0x7Df10B4A01350D2A1d95cFbE7c9207d7210A2663',
55
56
  };
@@ -1126,15 +1126,27 @@ export const MorphoBlueView = {
1126
1126
  },
1127
1127
  } as const;
1128
1128
  export const MidnightView = {
1129
- "abi": [{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"getMarketInfo","outputs":[{"components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint128","name":"totalUnits","type":"uint128"},{"internalType":"uint128","name":"lossFactor","type":"uint128"},{"internalType":"uint128","name":"withdrawable","type":"uint128"},{"internalType":"uint128","name":"continuousFeeCredit","type":"uint128"},{"internalType":"uint16[7]","name":"settlementFees","type":"uint16[7]"},{"internalType":"uint32","name":"continuousFee","type":"uint32"},{"internalType":"uint8","name":"tickSpacing","type":"uint8"},{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"internalType":"struct MidnightView.MarketInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"address","name":"_user","type":"address"}],"name":"getPositionInfo","outputs":[{"components":[{"internalType":"uint128","name":"credit","type":"uint128"},{"internalType":"uint128","name":"pendingFee","type":"uint128"},{"internalType":"uint128","name":"debt","type":"uint128"},{"internalType":"uint128","name":"collateralBitmap","type":"uint128"},{"internalType":"uint128[]","name":"collateral","type":"uint128[]"},{"internalType":"uint256","name":"ratio","type":"uint256"}],"internalType":"struct MidnightView.PositionInfo","name":"pos","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"address","name":"_user","type":"address"}],"name":"getRatio","outputs":[{"internalType":"uint256","name":"ratio","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"midnight","type":"address"},{"internalType":"address","name":"loanToken","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"lltv","type":"uint256"},{"internalType":"uint256","name":"liquidationCursor","type":"uint256"},{"internalType":"address","name":"oracle","type":"address"}],"internalType":"struct CollateralParams[]","name":"collateralParams","type":"tuple[]"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"rcfThreshold","type":"uint256"},{"internalType":"address","name":"enterGate","type":"address"},{"internalType":"address","name":"liquidatorGate","type":"address"}],"internalType":"struct Market","name":"_market","type":"tuple"}],"name":"toId","outputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"toMarket","outputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"midnight","type":"address"},{"internalType":"address","name":"loanToken","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"lltv","type":"uint256"},{"internalType":"uint256","name":"liquidationCursor","type":"uint256"},{"internalType":"address","name":"oracle","type":"address"}],"internalType":"struct CollateralParams[]","name":"collateralParams","type":"tuple[]"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"rcfThreshold","type":"uint256"},{"internalType":"address","name":"enterGate","type":"address"},{"internalType":"address","name":"liquidatorGate","type":"address"}],"internalType":"struct Market","name":"market","type":"tuple"}],"stateMutability":"view","type":"function"}],
1129
+ "abi": [{"inputs":[],"name":"InvalidCollateralIndex","type":"error"},{"inputs":[],"name":"InvalidOfferMarketId","type":"error"},{"inputs":[],"name":"InvalidOfferType","type":"error"},{"inputs":[],"name":"NoOrdersProvided","type":"error"},{"inputs":[],"name":"ZeroAmountRequested","type":"error"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"getMarketInfo","outputs":[{"components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint128","name":"totalUnits","type":"uint128"},{"internalType":"uint128","name":"lossFactor","type":"uint128"},{"internalType":"uint128","name":"withdrawable","type":"uint128"},{"internalType":"uint128","name":"continuousFeeCredit","type":"uint128"},{"internalType":"uint16[7]","name":"settlementFees","type":"uint16[7]"},{"internalType":"uint32","name":"continuousFee","type":"uint32"},{"internalType":"uint8","name":"tickSpacing","type":"uint8"},{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"internalType":"struct MidnightView.MarketInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"address","name":"_user","type":"address"}],"name":"getPositionInfo","outputs":[{"components":[{"internalType":"uint128","name":"credit","type":"uint128"},{"internalType":"uint128","name":"pendingFee","type":"uint128"},{"internalType":"uint128","name":"debt","type":"uint128"},{"internalType":"uint128","name":"collateralBitmap","type":"uint128"},{"internalType":"uint128[]","name":"collateral","type":"uint128[]"},{"internalType":"uint256","name":"ratio","type":"uint256"}],"internalType":"struct MidnightView.PositionInfo","name":"pos","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"address","name":"_user","type":"address"}],"name":"getRatio","outputs":[{"internalType":"uint256","name":"ratio","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"midnight","type":"address"},{"internalType":"address","name":"loanToken","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"lltv","type":"uint256"},{"internalType":"uint256","name":"liquidationCursor","type":"uint256"},{"internalType":"address","name":"oracle","type":"address"}],"internalType":"struct CollateralParams[]","name":"collateralParams","type":"tuple[]"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"rcfThreshold","type":"uint256"},{"internalType":"address","name":"enterGate","type":"address"},{"internalType":"address","name":"liquidatorGate","type":"address"}],"internalType":"struct Market","name":"_market","type":"tuple"}],"name":"toId","outputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"toMarket","outputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"midnight","type":"address"},{"internalType":"address","name":"loanToken","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"lltv","type":"uint256"},{"internalType":"uint256","name":"liquidationCursor","type":"uint256"},{"internalType":"address","name":"oracle","type":"address"}],"internalType":"struct CollateralParams[]","name":"collateralParams","type":"tuple[]"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"rcfThreshold","type":"uint256"},{"internalType":"address","name":"enterGate","type":"address"},{"internalType":"address","name":"liquidatorGate","type":"address"}],"internalType":"struct Market","name":"market","type":"tuple"}],"stateMutability":"view","type":"function"}],
1130
1130
  "networks": {
1131
1131
  "1": {
1132
- "address": "0xB64FBf011343961D9AC4A04b714414E35ebE6BE0",
1133
- "createdBlock": 25938908,
1132
+ "address": "0xb8e1dAAd42e18203cfCED7193FE0e2E19d713A56",
1133
+ "createdBlock": 25983494,
1134
+ "oldVersions": {
1135
+ "25938908": {
1136
+ "abi": [{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"getMarketInfo","outputs":[{"components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint128","name":"totalUnits","type":"uint128"},{"internalType":"uint128","name":"lossFactor","type":"uint128"},{"internalType":"uint128","name":"withdrawable","type":"uint128"},{"internalType":"uint128","name":"continuousFeeCredit","type":"uint128"},{"internalType":"uint16[7]","name":"settlementFees","type":"uint16[7]"},{"internalType":"uint32","name":"continuousFee","type":"uint32"},{"internalType":"uint8","name":"tickSpacing","type":"uint8"},{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"internalType":"struct MidnightView.MarketInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"address","name":"_user","type":"address"}],"name":"getPositionInfo","outputs":[{"components":[{"internalType":"uint128","name":"credit","type":"uint128"},{"internalType":"uint128","name":"pendingFee","type":"uint128"},{"internalType":"uint128","name":"debt","type":"uint128"},{"internalType":"uint128","name":"collateralBitmap","type":"uint128"},{"internalType":"uint128[]","name":"collateral","type":"uint128[]"},{"internalType":"uint256","name":"ratio","type":"uint256"}],"internalType":"struct MidnightView.PositionInfo","name":"pos","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"address","name":"_user","type":"address"}],"name":"getRatio","outputs":[{"internalType":"uint256","name":"ratio","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"midnight","type":"address"},{"internalType":"address","name":"loanToken","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"lltv","type":"uint256"},{"internalType":"uint256","name":"liquidationCursor","type":"uint256"},{"internalType":"address","name":"oracle","type":"address"}],"internalType":"struct CollateralParams[]","name":"collateralParams","type":"tuple[]"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"rcfThreshold","type":"uint256"},{"internalType":"address","name":"enterGate","type":"address"},{"internalType":"address","name":"liquidatorGate","type":"address"}],"internalType":"struct Market","name":"_market","type":"tuple"}],"name":"toId","outputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"toMarket","outputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"midnight","type":"address"},{"internalType":"address","name":"loanToken","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"lltv","type":"uint256"},{"internalType":"uint256","name":"liquidationCursor","type":"uint256"},{"internalType":"address","name":"oracle","type":"address"}],"internalType":"struct CollateralParams[]","name":"collateralParams","type":"tuple[]"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"rcfThreshold","type":"uint256"},{"internalType":"address","name":"enterGate","type":"address"},{"internalType":"address","name":"liquidatorGate","type":"address"}],"internalType":"struct Market","name":"market","type":"tuple"}],"stateMutability":"view","type":"function"}],
1137
+ "address": "0xB64FBf011343961D9AC4A04b714414E35ebE6BE0",
1138
+ }
1139
+ },
1134
1140
  },
1135
1141
  "8453": {
1136
- "address": "0x3aa272f329E8B562A3bA56Bb6979a44D23A28839",
1137
- "createdBlock": 48932293,
1142
+ "address": "0xdEab43eb1519bD4314bc99c4019866734103D3Ae",
1143
+ "createdBlock": 51346932,
1144
+ "oldVersions": {
1145
+ "48932293": {
1146
+ "abi": [{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"getMarketInfo","outputs":[{"components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint128","name":"totalUnits","type":"uint128"},{"internalType":"uint128","name":"lossFactor","type":"uint128"},{"internalType":"uint128","name":"withdrawable","type":"uint128"},{"internalType":"uint128","name":"continuousFeeCredit","type":"uint128"},{"internalType":"uint16[7]","name":"settlementFees","type":"uint16[7]"},{"internalType":"uint32","name":"continuousFee","type":"uint32"},{"internalType":"uint8","name":"tickSpacing","type":"uint8"},{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"internalType":"struct MidnightView.MarketInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"address","name":"_user","type":"address"}],"name":"getPositionInfo","outputs":[{"components":[{"internalType":"uint128","name":"credit","type":"uint128"},{"internalType":"uint128","name":"pendingFee","type":"uint128"},{"internalType":"uint128","name":"debt","type":"uint128"},{"internalType":"uint128","name":"collateralBitmap","type":"uint128"},{"internalType":"uint128[]","name":"collateral","type":"uint128[]"},{"internalType":"uint256","name":"ratio","type":"uint256"}],"internalType":"struct MidnightView.PositionInfo","name":"pos","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"address","name":"_user","type":"address"}],"name":"getRatio","outputs":[{"internalType":"uint256","name":"ratio","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"midnight","type":"address"},{"internalType":"address","name":"loanToken","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"lltv","type":"uint256"},{"internalType":"uint256","name":"liquidationCursor","type":"uint256"},{"internalType":"address","name":"oracle","type":"address"}],"internalType":"struct CollateralParams[]","name":"collateralParams","type":"tuple[]"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"rcfThreshold","type":"uint256"},{"internalType":"address","name":"enterGate","type":"address"},{"internalType":"address","name":"liquidatorGate","type":"address"}],"internalType":"struct Market","name":"_market","type":"tuple"}],"name":"toId","outputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"toMarket","outputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"midnight","type":"address"},{"internalType":"address","name":"loanToken","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"lltv","type":"uint256"},{"internalType":"uint256","name":"liquidationCursor","type":"uint256"},{"internalType":"address","name":"oracle","type":"address"}],"internalType":"struct CollateralParams[]","name":"collateralParams","type":"tuple[]"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"rcfThreshold","type":"uint256"},{"internalType":"address","name":"enterGate","type":"address"},{"internalType":"address","name":"liquidatorGate","type":"address"}],"internalType":"struct Market","name":"market","type":"tuple"}],"stateMutability":"view","type":"function"}],
1147
+ "address": "0x3aa272f329E8B562A3bA56Bb6979a44D23A28839",
1148
+ }
1149
+ },
1138
1150
  }
1139
1151
  },
1140
1152
  } as const;
@@ -43,15 +43,15 @@ export const getSavingsData = async (
43
43
 
44
44
  await Promise.all([
45
45
  ...(network === NetworkNumber.Eth ? [
46
- ...morphoVaultsList.map(async (vaultKey) => {
46
+ (async () => {
47
47
  try {
48
- const vault = morphoVaults.morphoVaultsOptions.getMorphoVault(vaultKey);
49
- const data = await morphoVaults.getMorphoVaultData(provider, network, vault, accounts);
50
- savingsData[vaultKey] = data;
48
+ const vaults = morphoVaultsList.map((vaultKey) => morphoVaults.morphoVaultsOptions.getMorphoVault(vaultKey));
49
+ const data = await morphoVaults.getMorphoVaultsData(provider, network, vaults, accounts);
50
+ Object.assign(savingsData, data);
51
51
  } catch (err) {
52
- console.error(`[getSavingsData] Error fetching morpho vault ${vaultKey}:`, err);
52
+ console.error('[getSavingsData] Error fetching morpho vaults:', err);
53
53
  }
54
- }),
54
+ })(),
55
55
  ...yearnVaultsList.map(async (vaultKey) => {
56
56
  try {
57
57
  const vault = yearnVaults.yearnVaultsOptions.getYearnVault(vaultKey);