@defisaver/positions-sdk 2.1.127-dev → 2.1.127-midnight-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.
Files changed (73) hide show
  1. package/cjs/config/contracts.d.ts +249 -0
  2. package/cjs/config/contracts.js +11 -1
  3. package/cjs/contracts.d.ts +1510 -0
  4. package/cjs/contracts.js +3 -2
  5. package/cjs/helpers/index.d.ts +1 -0
  6. package/cjs/helpers/index.js +2 -1
  7. package/cjs/helpers/morphoBlueHelpers/index.js +0 -1
  8. package/cjs/helpers/morphoMidnightHelpers/index.d.ts +16 -0
  9. package/cjs/helpers/morphoMidnightHelpers/index.js +68 -0
  10. package/cjs/index.d.ts +2 -1
  11. package/cjs/index.js +3 -1
  12. package/cjs/markets/index.d.ts +1 -0
  13. package/cjs/markets/index.js +4 -1
  14. package/cjs/markets/morphoMidnight/index.d.ts +16 -0
  15. package/cjs/markets/morphoMidnight/index.js +159 -0
  16. package/cjs/morphoBlue/index.d.ts +6 -8
  17. package/cjs/morphoBlue/index.js +40 -69
  18. package/cjs/morphoMidnight/index.d.ts +14 -0
  19. package/cjs/morphoMidnight/index.js +220 -0
  20. package/cjs/portfolio/discovery.js +4 -0
  21. package/cjs/portfolio/index.js +45 -1
  22. package/cjs/services/viem.d.ts +11 -11
  23. package/cjs/types/index.d.ts +1 -0
  24. package/cjs/types/index.js +1 -0
  25. package/cjs/types/morphoBlue.d.ts +0 -9
  26. package/cjs/types/morphoMidnight.d.ts +91 -0
  27. package/cjs/types/morphoMidnight.js +15 -0
  28. package/cjs/types/portfolio.d.ts +4 -0
  29. package/esm/config/contracts.d.ts +249 -0
  30. package/esm/config/contracts.js +9 -0
  31. package/esm/contracts.d.ts +1510 -0
  32. package/esm/contracts.js +1 -0
  33. package/esm/helpers/index.d.ts +1 -0
  34. package/esm/helpers/index.js +1 -0
  35. package/esm/helpers/morphoBlueHelpers/index.js +0 -1
  36. package/esm/helpers/morphoMidnightHelpers/index.d.ts +16 -0
  37. package/esm/helpers/morphoMidnightHelpers/index.js +61 -0
  38. package/esm/index.d.ts +2 -1
  39. package/esm/index.js +2 -1
  40. package/esm/markets/index.d.ts +1 -0
  41. package/esm/markets/index.js +1 -0
  42. package/esm/markets/morphoMidnight/index.d.ts +16 -0
  43. package/esm/markets/morphoMidnight/index.js +148 -0
  44. package/esm/morphoBlue/index.d.ts +6 -8
  45. package/esm/morphoBlue/index.js +39 -62
  46. package/esm/morphoMidnight/index.d.ts +14 -0
  47. package/esm/morphoMidnight/index.js +207 -0
  48. package/esm/portfolio/discovery.js +5 -1
  49. package/esm/portfolio/index.js +47 -3
  50. package/esm/services/viem.d.ts +11 -11
  51. package/esm/types/index.d.ts +1 -0
  52. package/esm/types/index.js +1 -0
  53. package/esm/types/morphoBlue.d.ts +0 -9
  54. package/esm/types/morphoMidnight.d.ts +91 -0
  55. package/esm/types/morphoMidnight.js +12 -0
  56. package/esm/types/portfolio.d.ts +4 -0
  57. package/package.json +1 -1
  58. package/src/config/contracts.ts +9 -0
  59. package/src/contracts.ts +1 -0
  60. package/src/helpers/index.ts +1 -0
  61. package/src/helpers/morphoBlueHelpers/index.ts +0 -1
  62. package/src/helpers/morphoMidnightHelpers/index.ts +86 -0
  63. package/src/index.ts +2 -0
  64. package/src/markets/index.ts +1 -0
  65. package/src/markets/morphoMidnight/index.ts +161 -0
  66. package/src/morphoBlue/index.ts +44 -101
  67. package/src/morphoMidnight/index.ts +234 -0
  68. package/src/portfolio/discovery.ts +6 -0
  69. package/src/portfolio/index.ts +46 -2
  70. package/src/types/index.ts +1 -0
  71. package/src/types/morphoBlue.ts +0 -11
  72. package/src/types/morphoMidnight.ts +104 -0
  73. package/src/types/portfolio.ts +4 -0
@@ -0,0 +1,207 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import Dec from 'decimal.js';
11
+ import { assetAmountInEth, getAssetInfoByAddress } from '@defisaver/tokens';
12
+ import { NetworkNumber, } from '../types/common';
13
+ import { DFSFeedRegistryContractViem, FeedRegistryContractViem, MorphoMidnightViewContractViem, } from '../contracts';
14
+ import { USD_QUOTE } from '../constants';
15
+ import { calculateNetApy } from '../staking';
16
+ import { isMainnetNetwork, wethToEth } from '../services/utils';
17
+ import { getMorphoMidnightAggregatedPositionData } from '../helpers/morphoMidnightHelpers';
18
+ import { getChainlinkAssetAddress } from '../services/priceService';
19
+ import { getViemProvider, setViemBlockNumber } from '../services/viem';
20
+ const HARDCODED_USD_STABLE_PRICE = '100000000'; // $1 with 8 decimals
21
+ const nowInSeconds = () => Math.floor(Date.now() / 1000);
22
+ export function _getMorphoMidnightMarketData(provider, network, selectedMarket) {
23
+ return __awaiter(this, void 0, void 0, function* () {
24
+ const { loanToken, collaterals, marketId } = selectedMarket;
25
+ const loanTokenInfo = getAssetInfoByAddress(loanToken, network);
26
+ const loanSym = wethToEth(loanTokenInfo.symbol);
27
+ const loanTokenFeedAddress = getChainlinkAssetAddress(loanTokenInfo.symbol, network);
28
+ const viewContract = MorphoMidnightViewContractViem(provider, network);
29
+ const isHardcodedUsdStable = ['USDA', 'RLUSD'].includes(loanTokenInfo.symbol);
30
+ let marketInfo;
31
+ let loanTokenPrice;
32
+ if (isMainnetNetwork(network)) {
33
+ const feedRegistryContract = FeedRegistryContractViem(provider, NetworkNumber.Eth);
34
+ const [_loanTokenPrice, _marketInfo] = yield Promise.all([
35
+ isHardcodedUsdStable ? Promise.resolve(HARDCODED_USD_STABLE_PRICE) : feedRegistryContract.read.latestAnswer([loanTokenFeedAddress, USD_QUOTE]),
36
+ viewContract.read.getMarketInfo([marketId]),
37
+ ]);
38
+ marketInfo = _marketInfo;
39
+ loanTokenPrice = _loanTokenPrice;
40
+ }
41
+ else {
42
+ // Currently only Base is supported
43
+ const feedRegistryContract = DFSFeedRegistryContractViem(provider, network);
44
+ const [loanTokenPriceRound, _marketInfo] = yield Promise.all([
45
+ isHardcodedUsdStable ? Promise.resolve([0, HARDCODED_USD_STABLE_PRICE]) : feedRegistryContract.read.latestRoundData([loanTokenFeedAddress, USD_QUOTE]),
46
+ viewContract.read.getMarketInfo([marketId]),
47
+ ]);
48
+ marketInfo = _marketInfo;
49
+ loanTokenPrice = loanTokenPriceRound[1].toString();
50
+ }
51
+ const loanTokenUsd = new Dec(loanTokenPrice).div(1e8).toString();
52
+ const totalUnits = marketInfo.totalUnits.toString();
53
+ const withdrawable = marketInfo.withdrawable.toString();
54
+ const totalDebt = Dec.max(new Dec(totalUnits).sub(withdrawable), 0).toString();
55
+ const assetsData = {};
56
+ assetsData[loanSym] = {
57
+ symbol: loanSym,
58
+ address: loanToken,
59
+ price: loanTokenUsd,
60
+ supplyRate: '0', // fixed rate is orderbook-derived, not exposed on-chain (MVP)
61
+ borrowRate: '0',
62
+ totalSupply: assetAmountInEth(totalUnits, loanSym),
63
+ totalBorrow: assetAmountInEth(totalDebt, loanSym),
64
+ canBeSupplied: true,
65
+ canBeBorrowed: true,
66
+ supplyIncentives: [],
67
+ borrowIncentives: [],
68
+ };
69
+ const collateralSymbols = [];
70
+ collaterals.forEach((coll, i) => {
71
+ const collInfo = getAssetInfoByAddress(coll.token, network);
72
+ const collSym = wethToEth(collInfo.symbol);
73
+ collateralSymbols.push(collSym);
74
+ // Oracle price is returned in loan-token terms, scaled by 10^(36 + loanDec - collDec)
75
+ const scale = new Dec(10).pow(new Dec(36).add(loanTokenInfo.decimals).sub(collInfo.decimals).toString()).toString();
76
+ const rawPrice = marketInfo.prices[i] ? marketInfo.prices[i].toString() : '0';
77
+ const oracleRate = new Dec(rawPrice).div(scale).toString();
78
+ assetsData[collSym] = {
79
+ symbol: collSym,
80
+ address: coll.token,
81
+ price: new Dec(loanTokenUsd).mul(oracleRate).toString(),
82
+ supplyRate: '0',
83
+ borrowRate: '0',
84
+ lltv: new Dec(coll.lltv).toString(),
85
+ canBeSupplied: true,
86
+ canBeBorrowed: false,
87
+ supplyIncentives: [],
88
+ borrowIncentives: [],
89
+ };
90
+ });
91
+ const utillization = new Dec(totalUnits).eq(0) ? '0' : new Dec(totalDebt).div(totalUnits).mul(100).toString();
92
+ return {
93
+ id: marketInfo.id,
94
+ loanToken: loanSym,
95
+ collaterals: collateralSymbols,
96
+ maturity: selectedMarket.maturity,
97
+ isMatured: nowInSeconds() >= selectedMarket.maturity,
98
+ totalUnits: assetAmountInEth(totalUnits, loanSym),
99
+ withdrawable: assetAmountInEth(withdrawable, loanSym),
100
+ totalDebt: assetAmountInEth(totalDebt, loanSym),
101
+ lossFactor: marketInfo.lossFactor.toString(),
102
+ tickSpacing: marketInfo.tickSpacing,
103
+ utillization,
104
+ assetsData,
105
+ };
106
+ });
107
+ }
108
+ export function getMorphoMidnightMarketData(provider, network, selectedMarket) {
109
+ return __awaiter(this, void 0, void 0, function* () {
110
+ return _getMorphoMidnightMarketData(getViemProvider(provider, network), network, selectedMarket);
111
+ });
112
+ }
113
+ export function _getMorphoMidnightAccountData(provider, network, account, selectedMarket, marketInfo) {
114
+ return __awaiter(this, void 0, void 0, function* () {
115
+ const { marketId, collaterals } = selectedMarket;
116
+ const viewContract = MorphoMidnightViewContractViem(provider, network);
117
+ const positionInfo = yield viewContract.read.getPositionInfo([marketId, account]);
118
+ const usedAssets = {};
119
+ const loanTokenData = marketInfo.assetsData[marketInfo.loanToken];
120
+ const credit = assetAmountInEth(positionInfo.credit.toString(), marketInfo.loanToken);
121
+ const debt = assetAmountInEth(positionInfo.debt.toString(), marketInfo.loanToken);
122
+ // A user holds either credit (lender) or debt (borrower) in a market, never both.
123
+ usedAssets[marketInfo.loanToken] = {
124
+ symbol: marketInfo.loanToken,
125
+ supplied: credit,
126
+ borrowed: debt,
127
+ isSupplied: new Dec(positionInfo.credit.toString()).gt(0),
128
+ isBorrowed: new Dec(positionInfo.debt.toString()).gt(0),
129
+ collateral: false,
130
+ suppliedUsd: new Dec(credit).mul(loanTokenData.price).toString(),
131
+ borrowedUsd: new Dec(debt).mul(loanTokenData.price).toString(),
132
+ };
133
+ // positionInfo.collateral is index-aligned with the market's collateral set (0 where unused).
134
+ collaterals.forEach((coll, i) => {
135
+ const collInfo = getAssetInfoByAddress(coll.token, network);
136
+ const collSym = wethToEth(collInfo.symbol);
137
+ const rawAmount = positionInfo.collateral[i] ? positionInfo.collateral[i].toString() : '0';
138
+ const supplied = assetAmountInEth(rawAmount, collSym);
139
+ const collData = marketInfo.assetsData[collSym];
140
+ usedAssets[collSym] = {
141
+ symbol: collSym,
142
+ supplied,
143
+ borrowed: '0',
144
+ isSupplied: new Dec(rawAmount).gt(0),
145
+ isBorrowed: false,
146
+ collateral: true,
147
+ suppliedUsd: new Dec(supplied).mul((collData === null || collData === void 0 ? void 0 : collData.price) || 0).toString(),
148
+ borrowedUsd: '0',
149
+ };
150
+ });
151
+ return Object.assign({ usedAssets,
152
+ credit,
153
+ debt, maturity: marketInfo.maturity, isMatured: marketInfo.isMatured }, getMorphoMidnightAggregatedPositionData({ usedAssets, assetsData: marketInfo.assetsData, marketInfo }));
154
+ });
155
+ }
156
+ export function getMorphoMidnightAccountData(provider, network, account, selectedMarket, marketInfo) {
157
+ return __awaiter(this, void 0, void 0, function* () {
158
+ return _getMorphoMidnightAccountData(getViemProvider(provider, network), network, account, selectedMarket, marketInfo);
159
+ });
160
+ }
161
+ export const _getMorphoMidnightAccountBalances = (provider, network, block, addressMapping, address, selectedMarket) => __awaiter(void 0, void 0, void 0, function* () {
162
+ const balances = { collateral: {}, debt: {} };
163
+ if (!address)
164
+ return balances;
165
+ const { marketId, loanToken, collaterals } = selectedMarket;
166
+ const viewContract = MorphoMidnightViewContractViem(provider, network, block);
167
+ const positionInfo = yield viewContract.read.getPositionInfo([marketId, address], setViemBlockNumber(block));
168
+ const loanTokenInfo = getAssetInfoByAddress(loanToken, network);
169
+ balances.debt = {
170
+ [addressMapping ? loanTokenInfo.address.toLowerCase() : wethToEth(loanTokenInfo.symbol)]: assetAmountInEth(positionInfo.debt.toString(), wethToEth(loanTokenInfo.symbol)),
171
+ };
172
+ const collateral = {};
173
+ collaterals.forEach((coll, i) => {
174
+ const collInfo = getAssetInfoByAddress(coll.token, network);
175
+ const rawAmount = positionInfo.collateral[i] ? positionInfo.collateral[i].toString() : '0';
176
+ collateral[addressMapping ? collInfo.address.toLowerCase() : wethToEth(collInfo.symbol)] = assetAmountInEth(rawAmount, wethToEth(collInfo.symbol));
177
+ });
178
+ balances.collateral = collateral;
179
+ return balances;
180
+ });
181
+ export const getMorphoMidnightAccountBalances = (provider, network, block, addressMapping, address, selectedMarket) => __awaiter(void 0, void 0, void 0, function* () { return _getMorphoMidnightAccountBalances(getViemProvider(provider, network), network, block, addressMapping, address, selectedMarket); });
182
+ // Lender-side (credit-only) supply position, mirroring getMorphoEarn. `amount` is the credit face value
183
+ // redeemable at maturity; `apy` is '0' in MVP because the fixed yield is orderbook-derived, not on-chain.
184
+ export function getMorphoMidnightEarn(provider, network, account, selectedMarket, marketInfo) {
185
+ return __awaiter(this, void 0, void 0, function* () {
186
+ const { marketId } = selectedMarket;
187
+ const viewContract = MorphoMidnightViewContractViem(provider, network);
188
+ const positionInfo = yield viewContract.read.getPositionInfo([marketId, account]);
189
+ const loanTokenData = marketInfo.assetsData[marketInfo.loanToken];
190
+ const credit = assetAmountInEth(positionInfo.credit.toString(), marketInfo.loanToken);
191
+ const creditUsd = new Dec(credit).mul(loanTokenData.price).toString();
192
+ const usedAssets = {
193
+ [marketInfo.loanToken]: {
194
+ symbol: marketInfo.loanToken,
195
+ supplied: credit,
196
+ borrowed: '0',
197
+ isSupplied: new Dec(positionInfo.credit.toString()).gt(0),
198
+ isBorrowed: false,
199
+ collateral: false,
200
+ suppliedUsd: creditUsd,
201
+ borrowedUsd: '0',
202
+ },
203
+ };
204
+ const { netApy } = calculateNetApy({ usedAssets, assetsData: marketInfo.assetsData });
205
+ return { apy: netApy, amount: credit, amountUsd: creditUsd };
206
+ });
207
+ }
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  import Dec from 'decimal.js';
11
11
  import { NetworkNumber, } from '../types/common';
12
12
  import { getViemProvider, setViemBlockNumber } from '../services/viem';
13
- import { AaveMarkets, AaveV4Spokes, CompoundMarkets, CrvUsdMarkets, LlamaLendMarkets, MorphoBlueMarkets, SparkMarkets, } from '../markets';
13
+ import { AaveMarkets, AaveV4Spokes, CompoundMarkets, CrvUsdMarkets, LlamaLendMarkets, MorphoBlueMarkets, MorphoMidnightMarkets, SparkMarkets, } from '../markets';
14
14
  import { AaveVersions, CompoundVersions } from '../types';
15
15
  import { _getAaveV4AccountHasAnyBalance } from '../aaveV4';
16
16
  import { _getCompoundV2AccountBalances } from '../compoundV2';
@@ -18,6 +18,7 @@ import { _getCompoundV3AccountBalances } from '../compoundV3';
18
18
  import { _getCrvUsdAccountBalances } from '../curveUsd';
19
19
  import { _getLlamaLendAccountBalances } from '../llamaLend';
20
20
  import { _getMorphoBlueAccountBalances } from '../morphoBlue';
21
+ import { _getMorphoMidnightAccountBalances } from '../morphoMidnight';
21
22
  import { createViemContractFromConfigFunc } from '../contracts';
22
23
  const hasAnyBalance = (balances) => ([balances.collateral, balances.debt].some((group) => Object.values(group || {}).some((amount) => new Dec(amount || '0').gt(0))));
23
24
  /**
@@ -81,6 +82,9 @@ export function getUserPositionsExistence(provider_1, network_1, address_1) {
81
82
  Object.values(MorphoBlueMarkets(network)).filter((market) => market.chainIds.includes(network)).forEach((market) => {
82
83
  tasks.push(balanceTask(market.value, () => _getMorphoBlueAccountBalances(client, network, block, false, address, market)));
83
84
  });
85
+ Object.values(MorphoMidnightMarkets(network)).filter((market) => market.chainIds.includes(network)).forEach((market) => {
86
+ tasks.push(balanceTask(market.value, () => _getMorphoMidnightAccountBalances(client, network, block, false, address, market)));
87
+ });
84
88
  yield Promise.all(tasks);
85
89
  return existence;
86
90
  });
@@ -9,8 +9,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import Dec from 'decimal.js';
11
11
  import { NetworkNumber } from '../types/common';
12
- import { AaveMarkets, AaveV4Spokes, CompoundMarkets, CrvUsdMarkets, EulerV2Markets, LiquityV2Markets, LlamaLendMarkets, MorphoBlueMarkets, SparkMarkets, } from '../markets';
13
- import { _getMorphoBlueAccountData, _getMorphoBluePortfolioMarketData, getMorphoEarn } from '../morphoBlue';
12
+ import { AaveMarkets, AaveV4Spokes, CompoundMarkets, CrvUsdMarkets, EulerV2Markets, LiquityV2Markets, LlamaLendMarkets, MorphoBlueMarkets, MorphoMidnightMarkets, SparkMarkets, } from '../markets';
13
+ import { _getMorphoBlueAccountData, _getMorphoBlueMarketData, getMorphoEarn } from '../morphoBlue';
14
+ import { _getMorphoMidnightAccountData, _getMorphoMidnightMarketData, getMorphoMidnightEarn } from '../morphoMidnight';
14
15
  import { AaveVersions, CompoundVersions, } from '../types';
15
16
  import { _getCompoundV3AccountData, _getCompoundV3MarketsData } from '../compoundV3';
16
17
  import { _getSparkAccountData, _getSparkMarketsData } from '../spark';
@@ -39,6 +40,7 @@ export function getPortfolioData(provider_1, network_1, defaultProvider_1, addre
39
40
  const isMainnet = network === NetworkNumber.Eth;
40
41
  const isFluidSupported = [NetworkNumber.Eth, NetworkNumber.Arb, NetworkNumber.Base, NetworkNumber.Plasma].includes(network);
41
42
  const morphoMarkets = Object.values(MorphoBlueMarkets(network)).filter((market) => market.chainIds.includes(network));
43
+ const morphoMidnightMarkets = Object.values(MorphoMidnightMarkets(network)).filter((market) => market.chainIds.includes(network));
42
44
  const compoundV3Markets = Object.values(CompoundMarkets(network)).filter((market) => market.chainIds.includes(network) && market.value !== CompoundVersions.CompoundV2);
43
45
  const sparkMarkets = Object.values(SparkMarkets(network)).filter((market) => market.chainIds.includes(network));
44
46
  const eulerV2Markets = Object.values(EulerV2Markets(network)).filter((market) => market.chainIds.includes(network));
@@ -54,6 +56,7 @@ export function getPortfolioData(provider_1, network_1, defaultProvider_1, addre
54
56
  const client = getViemProvider(provider, ...args);
55
57
  const defaultClient = getViemProvider(defaultProvider, ...args);
56
58
  const morphoMarketsData = {};
59
+ const morphoMidnightMarketsData = {};
57
60
  const compoundV3MarketsData = {};
58
61
  const sparkMarketsData = {};
59
62
  const eulerV2MarketsData = {};
@@ -67,6 +70,7 @@ export function getPortfolioData(provider_1, network_1, defaultProvider_1, addre
67
70
  const aaveV4SpokesData = {};
68
71
  const markets = {
69
72
  morphoMarketsData,
73
+ morphoMidnightMarketsData,
70
74
  compoundV3MarketsData,
71
75
  sparkMarketsData,
72
76
  eulerV2MarketsData,
@@ -87,6 +91,7 @@ export function getPortfolioData(provider_1, network_1, defaultProvider_1, addre
87
91
  aaveV3: {},
88
92
  aaveV4: {},
89
93
  morphoBlue: {},
94
+ morphoMidnight: {},
90
95
  compoundV3: {},
91
96
  spark: {},
92
97
  eulerV2: {},
@@ -107,6 +112,7 @@ export function getPortfolioData(provider_1, network_1, defaultProvider_1, addre
107
112
  stakingPositions[address.toLowerCase()] = {
108
113
  aaveV3: {},
109
114
  morphoBlue: {},
115
+ morphoMidnight: {},
110
116
  compoundV3: {},
111
117
  spark: {},
112
118
  aaveV2: {},
@@ -131,9 +137,13 @@ export function getPortfolioData(provider_1, network_1, defaultProvider_1, addre
131
137
  yield Promise.allSettled([
132
138
  // === MARKET DATA (needs to be fetched first) ===
133
139
  ...morphoMarkets.map((market) => __awaiter(this, void 0, void 0, function* () {
134
- const marketData = yield _getMorphoBluePortfolioMarketData(client, network, market);
140
+ const marketData = yield _getMorphoBlueMarketData(client, network, market);
135
141
  morphoMarketsData[market.value] = marketData;
136
142
  })),
143
+ ...morphoMidnightMarkets.map((market) => __awaiter(this, void 0, void 0, function* () {
144
+ const marketData = yield _getMorphoMidnightMarketData(client, network, market);
145
+ morphoMidnightMarketsData[market.value] = marketData;
146
+ })),
137
147
  ...compoundV3Markets.map((market) => __awaiter(this, void 0, void 0, function* () {
138
148
  const marketData = yield _getCompoundV3MarketsData(client, network, market, defaultClient);
139
149
  compoundV3MarketsData[market.value] = marketData;
@@ -444,6 +454,40 @@ export function getPortfolioData(provider_1, network_1, defaultProvider_1, addre
444
454
  positions[address.toLowerCase()].morphoBlue[market.value] = { error: `Error fetching MorphoBlue account data for address ${address} on market ${market.value}`, data: null };
445
455
  }
446
456
  }))).flat(),
457
+ ...morphoMidnightMarkets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
458
+ try {
459
+ const [accDataPromise, earnDataPromise] = yield Promise.allSettled([
460
+ _getMorphoMidnightAccountData(client, network, address, market, morphoMidnightMarketsData[market.value]),
461
+ getMorphoMidnightEarn(client, network, address, market, morphoMidnightMarketsData[market.value]),
462
+ ]);
463
+ if (accDataPromise.status === 'rejected') {
464
+ console.error(`Error fetching MorphoMidnight account data for address ${address} on market ${market.value}:`, accDataPromise.reason);
465
+ positions[address.toLowerCase()].morphoMidnight[market.value] = { error: `Error fetching MorphoMidnight account data for address ${address} on market ${market.value}`, data: null };
466
+ }
467
+ if (earnDataPromise.status === 'rejected') {
468
+ console.error(`Error fetching MorphoMidnight account data for address ${address} on market ${market.value}:`, earnDataPromise.reason);
469
+ positions[address.toLowerCase()].morphoMidnight[market.value] = { error: `Error fetching MorphoMidnight account data for address ${address} on market ${market.value}`, data: null };
470
+ }
471
+ if (accDataPromise.status !== 'rejected') {
472
+ const accData = accDataPromise.value;
473
+ if (new Dec(accData.suppliedUsd).gt(0))
474
+ positions[address.toLowerCase()].morphoMidnight[market.value] = { error: '', data: accData };
475
+ }
476
+ if (earnDataPromise.status !== 'rejected') {
477
+ const earnData = earnDataPromise.value;
478
+ if (earnData && new Dec(earnData.amount).gt(0)) {
479
+ stakingPositions[address.toLowerCase()].morphoMidnight[market.value] = {
480
+ error: '',
481
+ data: earnData,
482
+ };
483
+ }
484
+ }
485
+ }
486
+ catch (error) {
487
+ console.error(`Error fetching MorphoMidnight account data for address ${address} on market ${market.value}:`, error);
488
+ positions[address.toLowerCase()].morphoMidnight[market.value] = { error: `Error fetching MorphoMidnight account data for address ${address} on market ${market.value}`, data: null };
489
+ }
490
+ }))).flat(),
447
491
  ...compoundV3Markets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
448
492
  try {
449
493
  const accData = yield _getCompoundV3AccountData(client, network, address, ZERO_ADDRESS, { selectedMarket: market, assetsData: compoundV3MarketsData[market.value].assetsData });
@@ -833,6 +833,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
833
833
  s: import("viem").Hex;
834
834
  value: bigint;
835
835
  v: bigint;
836
+ chainId?: number | undefined;
836
837
  type: "legacy";
837
838
  gas: bigint;
838
839
  nonce: number;
@@ -847,7 +848,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
847
848
  yParity?: undefined | undefined;
848
849
  input: import("viem").Hex;
849
850
  typeHex: import("viem").Hex | null;
850
- chainId?: number | undefined;
851
851
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T ? T extends (blockTag extends "pending" ? true : false) ? T extends true ? null : bigint : never : never;
852
852
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_1 ? T_1 extends (blockTag extends "pending" ? true : false) ? T_1 extends true ? null : `0x${string}` : never : never;
853
853
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_2 ? T_2 extends (blockTag extends "pending" ? true : false) ? T_2 extends true ? null : number : never : never;
@@ -858,6 +858,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
858
858
  s: import("viem").Hex;
859
859
  value: bigint;
860
860
  v: bigint;
861
+ chainId: number;
861
862
  type: "eip2930";
862
863
  gas: bigint;
863
864
  nonce: number;
@@ -872,7 +873,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
872
873
  yParity: number;
873
874
  input: import("viem").Hex;
874
875
  typeHex: import("viem").Hex | null;
875
- chainId: number;
876
876
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_3 ? T_3 extends (blockTag extends "pending" ? true : false) ? T_3 extends true ? null : bigint : never : never;
877
877
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_4 ? T_4 extends (blockTag extends "pending" ? true : false) ? T_4 extends true ? null : `0x${string}` : never : never;
878
878
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_5 ? T_5 extends (blockTag extends "pending" ? true : false) ? T_5 extends true ? null : number : never : never;
@@ -883,6 +883,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
883
883
  s: import("viem").Hex;
884
884
  value: bigint;
885
885
  v: bigint;
886
+ chainId: number;
886
887
  type: "eip1559";
887
888
  gas: bigint;
888
889
  nonce: number;
@@ -897,7 +898,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
897
898
  yParity: number;
898
899
  input: import("viem").Hex;
899
900
  typeHex: import("viem").Hex | null;
900
- chainId: number;
901
901
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_6 ? T_6 extends (blockTag extends "pending" ? true : false) ? T_6 extends true ? null : bigint : never : never;
902
902
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_7 ? T_7 extends (blockTag extends "pending" ? true : false) ? T_7 extends true ? null : `0x${string}` : never : never;
903
903
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_8 ? T_8 extends (blockTag extends "pending" ? true : false) ? T_8 extends true ? null : number : never : never;
@@ -908,6 +908,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
908
908
  s: import("viem").Hex;
909
909
  value: bigint;
910
910
  v: bigint;
911
+ chainId: number;
911
912
  type: "eip4844";
912
913
  gas: bigint;
913
914
  nonce: number;
@@ -922,7 +923,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
922
923
  yParity: number;
923
924
  input: import("viem").Hex;
924
925
  typeHex: import("viem").Hex | null;
925
- chainId: number;
926
926
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_9 ? T_9 extends (blockTag extends "pending" ? true : false) ? T_9 extends true ? null : bigint : never : never;
927
927
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_10 ? T_10 extends (blockTag extends "pending" ? true : false) ? T_10 extends true ? null : `0x${string}` : never : never;
928
928
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_11 ? T_11 extends (blockTag extends "pending" ? true : false) ? T_11 extends true ? null : number : never : never;
@@ -933,6 +933,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
933
933
  s: import("viem").Hex;
934
934
  value: bigint;
935
935
  v: bigint;
936
+ chainId: number;
936
937
  type: "eip7702";
937
938
  gas: bigint;
938
939
  nonce: number;
@@ -947,7 +948,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
947
948
  yParity: number;
948
949
  input: import("viem").Hex;
949
950
  typeHex: import("viem").Hex | null;
950
- chainId: number;
951
951
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_12 ? T_12 extends (blockTag extends "pending" ? true : false) ? T_12 extends true ? null : bigint : never : never;
952
952
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_13 ? T_13 extends (blockTag extends "pending" ? true : false) ? T_13 extends true ? null : `0x${string}` : never : never;
953
953
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_14 ? T_14 extends (blockTag extends "pending" ? true : false) ? T_14 extends true ? null : number : never : never;
@@ -983,6 +983,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
983
983
  s: import("viem").Hex;
984
984
  value: bigint;
985
985
  v: bigint;
986
+ chainId?: number | undefined;
986
987
  type: "legacy";
987
988
  gas: bigint;
988
989
  nonce: number;
@@ -997,7 +998,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
997
998
  yParity?: undefined | undefined;
998
999
  input: import("viem").Hex;
999
1000
  typeHex: import("viem").Hex | null;
1000
- chainId?: number | undefined;
1001
1001
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T ? T extends (blockTag extends "pending" ? true : false) ? T extends true ? null : bigint : never : never;
1002
1002
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_1 ? T_1 extends (blockTag extends "pending" ? true : false) ? T_1 extends true ? null : `0x${string}` : never : never;
1003
1003
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_2 ? T_2 extends (blockTag extends "pending" ? true : false) ? T_2 extends true ? null : number : never : never;
@@ -1008,6 +1008,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1008
1008
  s: import("viem").Hex;
1009
1009
  value: bigint;
1010
1010
  v: bigint;
1011
+ chainId: number;
1011
1012
  type: "eip2930";
1012
1013
  gas: bigint;
1013
1014
  nonce: number;
@@ -1022,7 +1023,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1022
1023
  yParity: number;
1023
1024
  input: import("viem").Hex;
1024
1025
  typeHex: import("viem").Hex | null;
1025
- chainId: number;
1026
1026
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_3 ? T_3 extends (blockTag extends "pending" ? true : false) ? T_3 extends true ? null : bigint : never : never;
1027
1027
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_4 ? T_4 extends (blockTag extends "pending" ? true : false) ? T_4 extends true ? null : `0x${string}` : never : never;
1028
1028
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_5 ? T_5 extends (blockTag extends "pending" ? true : false) ? T_5 extends true ? null : number : never : never;
@@ -1033,6 +1033,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1033
1033
  s: import("viem").Hex;
1034
1034
  value: bigint;
1035
1035
  v: bigint;
1036
+ chainId: number;
1036
1037
  type: "eip1559";
1037
1038
  gas: bigint;
1038
1039
  nonce: number;
@@ -1047,7 +1048,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1047
1048
  yParity: number;
1048
1049
  input: import("viem").Hex;
1049
1050
  typeHex: import("viem").Hex | null;
1050
- chainId: number;
1051
1051
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_6 ? T_6 extends (blockTag extends "pending" ? true : false) ? T_6 extends true ? null : bigint : never : never;
1052
1052
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_7 ? T_7 extends (blockTag extends "pending" ? true : false) ? T_7 extends true ? null : `0x${string}` : never : never;
1053
1053
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_8 ? T_8 extends (blockTag extends "pending" ? true : false) ? T_8 extends true ? null : number : never : never;
@@ -1058,6 +1058,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1058
1058
  s: import("viem").Hex;
1059
1059
  value: bigint;
1060
1060
  v: bigint;
1061
+ chainId: number;
1061
1062
  type: "eip4844";
1062
1063
  gas: bigint;
1063
1064
  nonce: number;
@@ -1072,7 +1073,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1072
1073
  yParity: number;
1073
1074
  input: import("viem").Hex;
1074
1075
  typeHex: import("viem").Hex | null;
1075
- chainId: number;
1076
1076
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_9 ? T_9 extends (blockTag extends "pending" ? true : false) ? T_9 extends true ? null : bigint : never : never;
1077
1077
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_10 ? T_10 extends (blockTag extends "pending" ? true : false) ? T_10 extends true ? null : `0x${string}` : never : never;
1078
1078
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_11 ? T_11 extends (blockTag extends "pending" ? true : false) ? T_11 extends true ? null : number : never : never;
@@ -1083,6 +1083,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1083
1083
  s: import("viem").Hex;
1084
1084
  value: bigint;
1085
1085
  v: bigint;
1086
+ chainId: number;
1086
1087
  type: "eip7702";
1087
1088
  gas: bigint;
1088
1089
  nonce: number;
@@ -1097,7 +1098,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1097
1098
  yParity: number;
1098
1099
  input: import("viem").Hex;
1099
1100
  typeHex: import("viem").Hex | null;
1100
- chainId: number;
1101
1101
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_12 ? T_12 extends (blockTag extends "pending" ? true : false) ? T_12 extends true ? null : bigint : never : never;
1102
1102
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_13 ? T_13 extends (blockTag extends "pending" ? true : false) ? T_13 extends true ? null : `0x${string}` : never : never;
1103
1103
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_14 ? T_14 extends (blockTag extends "pending" ? true : false) ? T_14 extends true ? null : number : never : never;
@@ -4358,7 +4358,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
4358
4358
  authorizationList: import("viem").TransactionSerializableEIP7702["authorizationList"];
4359
4359
  } ? "eip7702" : never) | (request["type"] extends string | undefined ? Extract<request["type"], string> : never)>) ? T_12 extends "eip7702" ? import("viem").TransactionRequestEIP7702 : never : never : never)>> & {
4360
4360
  chainId?: number | undefined;
4361
- }, (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees" | "chainId") extends infer T_13 ? T_13 extends (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees" | "chainId") ? T_13 extends "fees" ? "gasPrice" | "maxFeePerGas" | "maxPriorityFeePerGas" : T_13 : never : never> & (unknown extends request["kzg"] ? {} : Pick<request, "kzg">) extends infer T ? { [K in keyof T]: T[K]; } : never>;
4361
+ }, (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "chainId" | "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees") extends infer T_13 ? T_13 extends (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "chainId" | "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees") ? T_13 extends "fees" ? "gasPrice" | "maxFeePerGas" | "maxPriorityFeePerGas" : T_13 : never : never> & (unknown extends request["kzg"] ? {} : Pick<request, "kzg">) extends infer T ? { [K in keyof T]: T[K]; } : never>;
4362
4362
  readContract: <const abi extends Abi | readonly unknown[], functionName extends import("viem").ContractFunctionName<abi, "pure" | "view">, const args extends import("viem").ContractFunctionArgs<abi, "pure" | "view", functionName>>(args: import("viem").ReadContractParameters<abi, functionName, args>) => Promise<import("viem").ReadContractReturnType<abi, functionName, args>>;
4363
4363
  sendRawTransaction: (args: import("viem").SendRawTransactionParameters) => Promise<import("viem").SendRawTransactionReturnType>;
4364
4364
  simulate: <const calls extends readonly unknown[]>(args: import("viem").SimulateBlocksParameters<calls>) => Promise<import("viem").SimulateBlocksReturnType<calls>>;
@@ -6,6 +6,7 @@ export * from './liquity';
6
6
  export * from './liquityV2';
7
7
  export * from './maker';
8
8
  export * from './morphoBlue';
9
+ export * from './morphoMidnight';
9
10
  export * from './llamaLend';
10
11
  export * from './euler';
11
12
  export * from './fluid';
@@ -6,6 +6,7 @@ export * from './liquity';
6
6
  export * from './liquityV2';
7
7
  export * from './maker';
8
8
  export * from './morphoBlue';
9
+ export * from './morphoMidnight';
9
10
  export * from './llamaLend';
10
11
  export * from './euler';
11
12
  export * from './fluid';
@@ -212,15 +212,6 @@ export interface MorphoBluePositionData {
212
212
  borrowShares: string;
213
213
  exposure: string;
214
214
  }
215
- export interface MorphoBlueEarnData {
216
- apy: string;
217
- amount: string;
218
- amountUsd: string;
219
- }
220
- export interface MorphoBlueMarketRewards {
221
- supplyApy: string;
222
- borrowApy: string;
223
- }
224
215
  export interface MorphoBlueVault {
225
216
  address: string;
226
217
  }
@@ -0,0 +1,91 @@
1
+ import { EthAddress, IncentiveData, LeverageType, MMUsedAssets, NetworkNumber } from './common';
2
+ export declare enum MorphoMidnightVersions {
3
+ MorphoMidnightCbBTCUSDC_860_20260731_Base = "morphomidnightcbbtcusdc_860_20260731_base",
4
+ MorphoMidnightCbBTCUSDC_860_20260828_Base = "morphomidnightcbbtcusdc_860_20260828_base",
5
+ MorphoMidnightCbBTCUSDC_860_20260925_Base = "morphomidnightcbbtcusdc_860_20260925_base",
6
+ MorphoMidnightCbBTCUSDC_860_20261030_Base = "morphomidnightcbbtcusdc_860_20261030_base",
7
+ MorphoMidnightCbBTCUSDC_860_20261127_Base = "morphomidnightcbbtcusdc_860_20261127_base",
8
+ MorphoMidnightCbBTCUSDC_860_20261225_Base = "morphomidnightcbbtcusdc_860_20261225_base"
9
+ }
10
+ export interface MorphoMidnightCollateralParams {
11
+ token: EthAddress;
12
+ lltv: number | string;
13
+ liquidationCursor: number | string;
14
+ oracle: EthAddress;
15
+ }
16
+ export interface MorphoMidnightMarketData {
17
+ chainIds: NetworkNumber[];
18
+ label: string;
19
+ shortLabel: string;
20
+ url: string;
21
+ value: MorphoMidnightVersions;
22
+ midnight: EthAddress;
23
+ loanToken: EthAddress;
24
+ collaterals: MorphoMidnightCollateralParams[];
25
+ maturity: number;
26
+ rcfThreshold: number | string;
27
+ enterGate: EthAddress;
28
+ liquidatorGate: EthAddress;
29
+ marketId: string;
30
+ protocolName: string;
31
+ }
32
+ export interface MorphoMidnightAssetData {
33
+ symbol: string;
34
+ address: string;
35
+ price: string;
36
+ supplyRate: string;
37
+ borrowRate: string;
38
+ supplyIncentives: IncentiveData[];
39
+ borrowIncentives: IncentiveData[];
40
+ totalSupply?: string;
41
+ totalBorrow?: string;
42
+ canBeSupplied?: boolean;
43
+ canBeBorrowed?: boolean;
44
+ lltv?: string;
45
+ }
46
+ export type MorphoMidnightAssetsData = {
47
+ [key: string]: MorphoMidnightAssetData;
48
+ };
49
+ export interface MorphoMidnightMarketInfo {
50
+ id: string;
51
+ loanToken: string;
52
+ collaterals: string[];
53
+ maturity: number;
54
+ isMatured: boolean;
55
+ totalUnits: string;
56
+ withdrawable: string;
57
+ totalDebt: string;
58
+ lossFactor: string;
59
+ tickSpacing: number;
60
+ utillization: string;
61
+ assetsData: MorphoMidnightAssetsData;
62
+ }
63
+ export interface MorphoMidnightAggregatedPositionData {
64
+ suppliedUsd: string;
65
+ suppliedCollateralUsd: string;
66
+ borrowedUsd: string;
67
+ borrowLimitUsd: string;
68
+ liquidationLimitUsd: string;
69
+ leftToBorrowUsd: string;
70
+ leftToBorrow: string;
71
+ netApy: string;
72
+ incentiveUsd: string;
73
+ totalInterestUsd: string;
74
+ ltv: string;
75
+ ratio: string;
76
+ healthRatio: string;
77
+ leveragedType: LeverageType;
78
+ leveragedAsset?: string;
79
+ currentVolatilePairRatio?: string;
80
+ liquidationPrice?: string;
81
+ minCollRatio?: string;
82
+ collLiquidationRatio?: string;
83
+ exposure: string;
84
+ }
85
+ export interface MorphoMidnightPositionData extends MorphoMidnightAggregatedPositionData {
86
+ usedAssets: MMUsedAssets;
87
+ credit: string;
88
+ debt: string;
89
+ maturity: number;
90
+ isMatured: boolean;
91
+ }
@@ -0,0 +1,12 @@
1
+ export var MorphoMidnightVersions;
2
+ (function (MorphoMidnightVersions) {
3
+ // BASE
4
+ // Fixed-term markets are disambiguated by maturity (YYYYMMDD), so the same pair recurs across dates.
5
+ // Sourced from the official listing at https://markets.morpho.org/fixed/base (see sitemap.xml).
6
+ MorphoMidnightVersions["MorphoMidnightCbBTCUSDC_860_20260731_Base"] = "morphomidnightcbbtcusdc_860_20260731_base";
7
+ MorphoMidnightVersions["MorphoMidnightCbBTCUSDC_860_20260828_Base"] = "morphomidnightcbbtcusdc_860_20260828_base";
8
+ MorphoMidnightVersions["MorphoMidnightCbBTCUSDC_860_20260925_Base"] = "morphomidnightcbbtcusdc_860_20260925_base";
9
+ MorphoMidnightVersions["MorphoMidnightCbBTCUSDC_860_20261030_Base"] = "morphomidnightcbbtcusdc_860_20261030_base";
10
+ MorphoMidnightVersions["MorphoMidnightCbBTCUSDC_860_20261127_Base"] = "morphomidnightcbbtcusdc_860_20261127_base";
11
+ MorphoMidnightVersions["MorphoMidnightCbBTCUSDC_860_20261225_Base"] = "morphomidnightcbbtcusdc_860_20261225_base";
12
+ })(MorphoMidnightVersions || (MorphoMidnightVersions = {}));