@defisaver/positions-sdk 2.1.127-midnight-5-dev → 2.1.127-midnight-7-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 (36) hide show
  1. package/cjs/constants/index.d.ts +1 -0
  2. package/cjs/constants/index.js +2 -1
  3. package/cjs/helpers/morphoMidnightHelpers/index.d.ts +8 -14
  4. package/cjs/helpers/morphoMidnightHelpers/index.js +50 -62
  5. package/cjs/helpers/morphoMidnightHelpers/rate.d.ts +11 -0
  6. package/cjs/helpers/morphoMidnightHelpers/rate.js +49 -0
  7. package/cjs/helpers/morphoMidnightHelpers/tenor.d.ts +125 -0
  8. package/cjs/helpers/morphoMidnightHelpers/tenor.js +256 -0
  9. package/cjs/markets/index.d.ts +1 -1
  10. package/cjs/markets/index.js +3 -1
  11. package/cjs/markets/morphoMidnight/index.d.ts +45 -1
  12. package/cjs/markets/morphoMidnight/index.js +542 -42
  13. package/cjs/types/morphoMidnight.d.ts +22 -1
  14. package/cjs/types/morphoMidnight.js +16 -0
  15. package/esm/constants/index.d.ts +1 -0
  16. package/esm/constants/index.js +1 -0
  17. package/esm/helpers/morphoMidnightHelpers/index.d.ts +8 -14
  18. package/esm/helpers/morphoMidnightHelpers/index.js +27 -45
  19. package/esm/helpers/morphoMidnightHelpers/rate.d.ts +11 -0
  20. package/esm/helpers/morphoMidnightHelpers/rate.js +38 -0
  21. package/esm/helpers/morphoMidnightHelpers/tenor.d.ts +125 -0
  22. package/esm/helpers/morphoMidnightHelpers/tenor.js +239 -0
  23. package/esm/markets/index.d.ts +1 -1
  24. package/esm/markets/index.js +1 -1
  25. package/esm/markets/morphoMidnight/index.d.ts +45 -1
  26. package/esm/markets/morphoMidnight/index.js +507 -24
  27. package/esm/types/morphoMidnight.d.ts +22 -1
  28. package/esm/types/morphoMidnight.js +16 -0
  29. package/package.json +1 -1
  30. package/src/constants/index.ts +1 -0
  31. package/src/helpers/morphoMidnightHelpers/index.ts +49 -45
  32. package/src/helpers/morphoMidnightHelpers/rate.ts +46 -0
  33. package/src/helpers/morphoMidnightHelpers/tenor.ts +411 -0
  34. package/src/markets/index.ts +3 -1
  35. package/src/markets/morphoMidnight/index.ts +538 -24
  36. package/src/types/morphoMidnight.ts +23 -0
@@ -1,16 +1,29 @@
1
- import { MorphoMidnightMarketData, MorphoMidnightVersions, NetworkNumber } from '../../types';
1
+ import {
2
+ MorphoMidnightCollateralParams, MorphoMidnightMarketData, MorphoMidnightVersions, NetworkNumber,
3
+ } from '../../types';
4
+ import { ZERO_ADDRESS } from '../../constants';
2
5
 
3
- // Morpho Midnight core contract on Base (same for every market).
4
- const MIDNIGHT_BASE = '0xAdedD8ab6dE832766Fedf0FaC4992E5C4D3EA18A';
5
- const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
6
+ /**
7
+ * Morpho Midnight core contract on Base. Every Midnight market trades against this one, whoever curates
8
+ * its order book — it is part of the market struct the id is hashed from, and it is what offer tuples
9
+ * encode for `Midnight.take`.
10
+ */
11
+ export const MIDNIGHT_BASE = '0xAdedD8ab6dE832766Fedf0FaC4992E5C4D3EA18A' as const;
6
12
 
7
- // Curated Morpho Midnight markets. Each market is fixed-term: it is uniquely identified on-chain by
8
- // `marketId` (bytes32), derived from the static struct below via MidnightView.toId. Because markets
9
- // churn as maturities roll, this list is hand-maintained for the pairs/maturities the app supports.
10
- // Sourced from the official listing at https://markets.morpho.org/fixed/base (see its sitemap.xml) —
11
- // currently a single USDC/cbBTC pair offered on a monthly maturity ladder; new maturities are added
12
- // there progressively. Every `marketId` here is verified against MidnightView.toId(marketStruct) in
13
- // tests/morphoMidnight.ts.
13
+ const USDC_BASE = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' as const;
14
+ const WETH_BASE = '0x4200000000000000000000000000000000000006' as const;
15
+ const CBBTC_BASE = '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf' as const;
16
+ const CBETH_BASE = '0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22' as const;
17
+
18
+ // Tenor's ERC-4626 collateral vaults, one per pair and shared by that pair's whole maturity ladder. Each
19
+ // is a collateral of its markets on-chain without being an asset the app deals in — see the note above
20
+ // the Tenor markets below, and https://www.docs.tenor.finance/technical-docs/addresses/#vaults.
21
+ const TENOR_CBBTC_USDC_VAULT_BASE = '0xf6a70085b7f79FA76B04EbF7A2D7D87C3c5c04BC' as const;
22
+ const TENOR_WETH_USDC_VAULT_BASE = '0xe690a58EF52854513462745237F6A213a0d54dF1' as const;
23
+ const TENOR_CBETH_WETH_VAULT_BASE = '0xFa750DD0099eAdB72d401244De73ce7B89edf90F' as const;
24
+
25
+
26
+ // Sourced from the official listing at https://markets.morpho.org/fixed/base
14
27
 
15
28
  // BASE — USDC/cbBTC, 86% LLTV, monthly maturity ladder
16
29
 
@@ -21,9 +34,9 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260731 = (networkId = NetworkNumbe
21
34
  url: 'cbbtc-usdc-20260731',
22
35
  value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260731_Base,
23
36
  midnight: MIDNIGHT_BASE,
24
- loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
37
+ loanToken: USDC_BASE,
25
38
  collaterals: [{
26
- token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
39
+ token: CBBTC_BASE,
27
40
  lltv: 0.86,
28
41
  liquidationCursor: '300000000000000000',
29
42
  oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
@@ -34,6 +47,7 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260731 = (networkId = NetworkNumbe
34
47
  liquidatorGate: ZERO_ADDRESS,
35
48
  marketId: '0x168e31250e0008b50d2255a5ab85e0265acd6c12e4f9a1336134b36a65a47937',
36
49
  protocolName: 'morpho-midnight',
50
+ curator: 'Morpho',
37
51
  });
38
52
 
39
53
  export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260828 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
@@ -43,9 +57,9 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260828 = (networkId = NetworkNumbe
43
57
  url: 'cbbtc-usdc-20260828',
44
58
  value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260828_Base,
45
59
  midnight: MIDNIGHT_BASE,
46
- loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
60
+ loanToken: USDC_BASE,
47
61
  collaterals: [{
48
- token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
62
+ token: CBBTC_BASE,
49
63
  lltv: 0.86,
50
64
  liquidationCursor: '300000000000000000',
51
65
  oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
@@ -56,6 +70,7 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260828 = (networkId = NetworkNumbe
56
70
  liquidatorGate: ZERO_ADDRESS,
57
71
  marketId: '0x05959752fdeff325962b9d263edb421efc6e2186a49360dba6c32e86ebf6c84c',
58
72
  protocolName: 'morpho-midnight',
73
+ curator: 'Morpho',
59
74
  });
60
75
 
61
76
  export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260925 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
@@ -65,9 +80,9 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260925 = (networkId = NetworkNumbe
65
80
  url: 'cbbtc-usdc-20260925',
66
81
  value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260925_Base,
67
82
  midnight: MIDNIGHT_BASE,
68
- loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
83
+ loanToken: USDC_BASE,
69
84
  collaterals: [{
70
- token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
85
+ token: CBBTC_BASE,
71
86
  lltv: 0.86,
72
87
  liquidationCursor: '300000000000000000',
73
88
  oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
@@ -78,6 +93,7 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260925 = (networkId = NetworkNumbe
78
93
  liquidatorGate: ZERO_ADDRESS,
79
94
  marketId: '0x549cd072daf99328554f3a6d2d4d6f4a07f1c59369e891e6391946f9cf75f221',
80
95
  protocolName: 'morpho-midnight',
96
+ curator: 'Morpho',
81
97
  });
82
98
 
83
99
  export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261030 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
@@ -87,9 +103,9 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261030 = (networkId = NetworkNumbe
87
103
  url: 'cbbtc-usdc-20261030',
88
104
  value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261030_Base,
89
105
  midnight: MIDNIGHT_BASE,
90
- loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
106
+ loanToken: USDC_BASE,
91
107
  collaterals: [{
92
- token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
108
+ token: CBBTC_BASE,
93
109
  lltv: 0.86,
94
110
  liquidationCursor: '300000000000000000',
95
111
  oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
@@ -100,6 +116,7 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261030 = (networkId = NetworkNumbe
100
116
  liquidatorGate: ZERO_ADDRESS,
101
117
  marketId: '0x43d6120738c57b2bc5835901f8250fdf7fc8054efbb006c6ccba61ec898e5ed9',
102
118
  protocolName: 'morpho-midnight',
119
+ curator: 'Morpho',
103
120
  });
104
121
 
105
122
  export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261127 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
@@ -109,9 +126,9 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261127 = (networkId = NetworkNumbe
109
126
  url: 'cbbtc-usdc-20261127',
110
127
  value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261127_Base,
111
128
  midnight: MIDNIGHT_BASE,
112
- loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
129
+ loanToken: USDC_BASE,
113
130
  collaterals: [{
114
- token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
131
+ token: CBBTC_BASE,
115
132
  lltv: 0.86,
116
133
  liquidationCursor: '300000000000000000',
117
134
  oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
@@ -122,6 +139,7 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261127 = (networkId = NetworkNumbe
122
139
  liquidatorGate: ZERO_ADDRESS,
123
140
  marketId: '0xe1878eec035b601f301484e63a49a428f8e008e2bf57a2fd88a3fc3a4c1b1acd',
124
141
  protocolName: 'morpho-midnight',
142
+ curator: 'Morpho',
125
143
  });
126
144
 
127
145
  export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261225 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
@@ -131,9 +149,9 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261225 = (networkId = NetworkNumbe
131
149
  url: 'cbbtc-usdc-20261225',
132
150
  value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261225_Base,
133
151
  midnight: MIDNIGHT_BASE,
134
- loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
152
+ loanToken: USDC_BASE,
135
153
  collaterals: [{
136
- token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
154
+ token: CBBTC_BASE,
137
155
  lltv: 0.86,
138
156
  liquidationCursor: '300000000000000000',
139
157
  oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
@@ -144,18 +162,514 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261225 = (networkId = NetworkNumbe
144
162
  liquidatorGate: ZERO_ADDRESS,
145
163
  marketId: '0x9593c3a6dba45b6106af8dc8b45ba8c505d90d3d68a3d33f7c278dd921b637da',
146
164
  protocolName: 'morpho-midnight',
165
+ curator: 'Morpho',
166
+ });
167
+
168
+ // ── Tenor-curated ────────────────────────────────────────────────────────────────────────────────
169
+
170
+ // Tenor Midnight markets are the same structs as Morpho's (`MorphoMidnightMarketData`), on the same core
171
+ // contract; only the order book differs. Identify them on Morpho's `/v0/midnight/markets` by `market_id`
172
+ // = Tenor's `fixedMarketIdentifier`; they come back `listed: false`, meaning Tenor — not Morpho — serves
173
+ // the book.
174
+ //
175
+ // Every market below is verified against `MidnightView.toMarket(marketId)` on Base: core address,
176
+ // maturity, rcfThreshold, loan token, gates and collaterals all match. On-chain each market carries **two**
177
+ // collaterals — the pair's own token at index 0, and Tenor's ERC-4626 vault at index 1 (98% LLTV; the
178
+ // `metadata.vault` of the parent tenor market, listed at
179
+ // https://www.docs.tenor.finance/technical-docs/addresses/#vaults). The vault is not an asset the app
180
+ // deals in, so it is split out into `hiddenCollaterals` instead of `collaterals`: everything that renders
181
+ // or prices a position sees a single-collateral market, and because the vault stays the *suffix* of the
182
+ // set, the SDK's positional `prices[i]` / `collateral[i]` reads stay aligned with `collaterals`.
183
+ //
184
+ // It is only split out, never dropped: the market id is the hash of the full struct, so a `Market` handed
185
+ // to the core has to be `[...collaterals, ...hiddenCollaterals]` or the call addresses a market of its own
186
+ // making. The take path builds no struct — offer tuples carry the market's full collateral set straight
187
+ // from the router's offer JSON.
188
+
189
+ export const MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20260827 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
190
+ chainIds: [NetworkNumber.Base],
191
+ label: 'Tenor cbBTC/USDC',
192
+ shortLabel: 'Tenor cbBTC/USDC',
193
+ url: 'tenor-cbbtc-usdc-20260827',
194
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20260827_Base,
195
+ midnight: MIDNIGHT_BASE,
196
+ loanToken: USDC_BASE,
197
+ collaterals: [{
198
+ token: CBBTC_BASE,
199
+ lltv: 0.86,
200
+ liquidationCursor: '300000000000000000',
201
+ oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
202
+ }],
203
+ hiddenCollaterals: [{
204
+ token: TENOR_CBBTC_USDC_VAULT_BASE,
205
+ lltv: 0.98,
206
+ liquidationCursor: '300000000000000000',
207
+ oracle: '0x4a24e4bf269cE26aAD2dF00437e7730d25FCdE26',
208
+ }],
209
+ maturity: 1787788800, // 2026-08-27T00:00:00Z
210
+ rcfThreshold: '3000000000',
211
+ enterGate: ZERO_ADDRESS,
212
+ liquidatorGate: ZERO_ADDRESS,
213
+ marketId: '0x44495af1cca7842191a65a73978e01ed72238731e193c3b11460083efd60a318',
214
+ protocolName: 'morpho-midnight',
215
+ curator: 'Tenor',
216
+ });
217
+
218
+ export const MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20260924 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
219
+ chainIds: [NetworkNumber.Base],
220
+ label: 'Tenor cbBTC/USDC',
221
+ shortLabel: 'Tenor cbBTC/USDC',
222
+ url: 'tenor-cbbtc-usdc-20260924',
223
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20260924_Base,
224
+ midnight: MIDNIGHT_BASE,
225
+ loanToken: USDC_BASE,
226
+ collaterals: [{
227
+ token: CBBTC_BASE,
228
+ lltv: 0.86,
229
+ liquidationCursor: '300000000000000000',
230
+ oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
231
+ }],
232
+ hiddenCollaterals: [{
233
+ token: TENOR_CBBTC_USDC_VAULT_BASE,
234
+ lltv: 0.98,
235
+ liquidationCursor: '300000000000000000',
236
+ oracle: '0x4a24e4bf269cE26aAD2dF00437e7730d25FCdE26',
237
+ }],
238
+ maturity: 1790208000, // 2026-09-24T00:00:00Z
239
+ rcfThreshold: '3000000000',
240
+ enterGate: ZERO_ADDRESS,
241
+ liquidatorGate: ZERO_ADDRESS,
242
+ marketId: '0x99fbed74bc7cef3c90d68709d8de8f820261a45875ca197a0e65338affd09481',
243
+ protocolName: 'morpho-midnight',
244
+ curator: 'Tenor',
245
+ });
246
+
247
+ export const MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20261022 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
248
+ chainIds: [NetworkNumber.Base],
249
+ label: 'Tenor cbBTC/USDC',
250
+ shortLabel: 'Tenor cbBTC/USDC',
251
+ url: 'tenor-cbbtc-usdc-20261022',
252
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20261022_Base,
253
+ midnight: MIDNIGHT_BASE,
254
+ loanToken: USDC_BASE,
255
+ collaterals: [{
256
+ token: CBBTC_BASE,
257
+ lltv: 0.86,
258
+ liquidationCursor: '300000000000000000',
259
+ oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
260
+ }],
261
+ hiddenCollaterals: [{
262
+ token: TENOR_CBBTC_USDC_VAULT_BASE,
263
+ lltv: 0.98,
264
+ liquidationCursor: '300000000000000000',
265
+ oracle: '0x4a24e4bf269cE26aAD2dF00437e7730d25FCdE26',
266
+ }],
267
+ maturity: 1792627200, // 2026-10-22T00:00:00Z
268
+ rcfThreshold: '3000000000',
269
+ enterGate: ZERO_ADDRESS,
270
+ liquidatorGate: ZERO_ADDRESS,
271
+ marketId: '0x2f4f088f20c0bebe6167f8c9d7aec11115c08eb73486b6f9642f7c7260d4d094',
272
+ protocolName: 'morpho-midnight',
273
+ curator: 'Tenor',
274
+ });
275
+
276
+ export const MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20261119 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
277
+ chainIds: [NetworkNumber.Base],
278
+ label: 'Tenor cbBTC/USDC',
279
+ shortLabel: 'Tenor cbBTC/USDC',
280
+ url: 'tenor-cbbtc-usdc-20261119',
281
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20261119_Base,
282
+ midnight: MIDNIGHT_BASE,
283
+ loanToken: USDC_BASE,
284
+ collaterals: [{
285
+ token: CBBTC_BASE,
286
+ lltv: 0.86,
287
+ liquidationCursor: '300000000000000000',
288
+ oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
289
+ }],
290
+ hiddenCollaterals: [{
291
+ token: TENOR_CBBTC_USDC_VAULT_BASE,
292
+ lltv: 0.98,
293
+ liquidationCursor: '300000000000000000',
294
+ oracle: '0x4a24e4bf269cE26aAD2dF00437e7730d25FCdE26',
295
+ }],
296
+ maturity: 1795046400, // 2026-11-19T00:00:00Z
297
+ rcfThreshold: '3000000000',
298
+ enterGate: ZERO_ADDRESS,
299
+ liquidatorGate: ZERO_ADDRESS,
300
+ marketId: '0x776e8d667a394650c21615c9b5a9b5355f4aa777db3cebaebb057ffba588c7af',
301
+ protocolName: 'morpho-midnight',
302
+ curator: 'Tenor',
303
+ });
304
+
305
+ export const MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20261217 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
306
+ chainIds: [NetworkNumber.Base],
307
+ label: 'Tenor cbBTC/USDC',
308
+ shortLabel: 'Tenor cbBTC/USDC',
309
+ url: 'tenor-cbbtc-usdc-20261217',
310
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20261217_Base,
311
+ midnight: MIDNIGHT_BASE,
312
+ loanToken: USDC_BASE,
313
+ collaterals: [{
314
+ token: CBBTC_BASE,
315
+ lltv: 0.86,
316
+ liquidationCursor: '300000000000000000',
317
+ oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
318
+ }],
319
+ hiddenCollaterals: [{
320
+ token: TENOR_CBBTC_USDC_VAULT_BASE,
321
+ lltv: 0.98,
322
+ liquidationCursor: '300000000000000000',
323
+ oracle: '0x4a24e4bf269cE26aAD2dF00437e7730d25FCdE26',
324
+ }],
325
+ maturity: 1797465600, // 2026-12-17T00:00:00Z
326
+ rcfThreshold: '3000000000',
327
+ enterGate: ZERO_ADDRESS,
328
+ liquidatorGate: ZERO_ADDRESS,
329
+ marketId: '0xd82863083585d715a2e0d8ed61e0e20e4f6c566171d3bfed513ad55797177b17',
330
+ protocolName: 'morpho-midnight',
331
+ curator: 'Tenor',
332
+ });
333
+
334
+ export const MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20260827 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
335
+ chainIds: [NetworkNumber.Base],
336
+ label: 'Tenor WETH/USDC',
337
+ shortLabel: 'Tenor WETH/USDC',
338
+ url: 'tenor-weth-usdc-20260827',
339
+ value: MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20260827_Base,
340
+ midnight: MIDNIGHT_BASE,
341
+ loanToken: USDC_BASE,
342
+ collaterals: [{
343
+ token: WETH_BASE,
344
+ lltv: 0.86,
345
+ liquidationCursor: '300000000000000000',
346
+ oracle: '0xFEa2D58cEfCb9fcb597723c6bAE66fFE4193aFE4',
347
+ }],
348
+ hiddenCollaterals: [{
349
+ token: TENOR_WETH_USDC_VAULT_BASE,
350
+ lltv: 0.98,
351
+ liquidationCursor: '300000000000000000',
352
+ oracle: '0x784519B1b59A1e1498f077066bB9336672bcc3EE',
353
+ }],
354
+ maturity: 1787788800,
355
+ rcfThreshold: '3000000000',
356
+ enterGate: ZERO_ADDRESS,
357
+ liquidatorGate: ZERO_ADDRESS,
358
+ marketId: '0xf27319855df886a604dda3d5675007f0aa6eee504c99f1d789c86b21075f7c20',
359
+ protocolName: 'morpho-midnight',
360
+ curator: 'Tenor',
361
+ });
362
+
363
+ export const MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20260924 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
364
+ chainIds: [NetworkNumber.Base],
365
+ label: 'Tenor WETH/USDC',
366
+ shortLabel: 'Tenor WETH/USDC',
367
+ url: 'tenor-weth-usdc-20260924',
368
+ value: MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20260924_Base,
369
+ midnight: MIDNIGHT_BASE,
370
+ loanToken: USDC_BASE,
371
+ collaterals: [{
372
+ token: WETH_BASE,
373
+ lltv: 0.86,
374
+ liquidationCursor: '300000000000000000',
375
+ oracle: '0xFEa2D58cEfCb9fcb597723c6bAE66fFE4193aFE4',
376
+ }],
377
+ hiddenCollaterals: [{
378
+ token: TENOR_WETH_USDC_VAULT_BASE,
379
+ lltv: 0.98,
380
+ liquidationCursor: '300000000000000000',
381
+ oracle: '0x784519B1b59A1e1498f077066bB9336672bcc3EE',
382
+ }],
383
+ maturity: 1790208000,
384
+ rcfThreshold: '3000000000',
385
+ enterGate: ZERO_ADDRESS,
386
+ liquidatorGate: ZERO_ADDRESS,
387
+ marketId: '0x9b7fed2a6b24c47b8995dfa4fb2b4bc87fe245c10fb842865e568611a96804aa',
388
+ protocolName: 'morpho-midnight',
389
+ curator: 'Tenor',
390
+ });
391
+
392
+ export const MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20261022 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
393
+ chainIds: [NetworkNumber.Base],
394
+ label: 'Tenor WETH/USDC',
395
+ shortLabel: 'Tenor WETH/USDC',
396
+ url: 'tenor-weth-usdc-20261022',
397
+ value: MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20261022_Base,
398
+ midnight: MIDNIGHT_BASE,
399
+ loanToken: USDC_BASE,
400
+ collaterals: [{
401
+ token: WETH_BASE,
402
+ lltv: 0.86,
403
+ liquidationCursor: '300000000000000000',
404
+ oracle: '0xFEa2D58cEfCb9fcb597723c6bAE66fFE4193aFE4',
405
+ }],
406
+ hiddenCollaterals: [{
407
+ token: TENOR_WETH_USDC_VAULT_BASE,
408
+ lltv: 0.98,
409
+ liquidationCursor: '300000000000000000',
410
+ oracle: '0x784519B1b59A1e1498f077066bB9336672bcc3EE',
411
+ }],
412
+ maturity: 1792627200,
413
+ rcfThreshold: '3000000000',
414
+ enterGate: ZERO_ADDRESS,
415
+ liquidatorGate: ZERO_ADDRESS,
416
+ marketId: '0xfc2562129c7d538fcb6b2490d07aa5c69971d9d0b75e2f9bbf054ef99a311474',
417
+ protocolName: 'morpho-midnight',
418
+ curator: 'Tenor',
419
+ });
420
+
421
+ export const MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20261119 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
422
+ chainIds: [NetworkNumber.Base],
423
+ label: 'Tenor WETH/USDC',
424
+ shortLabel: 'Tenor WETH/USDC',
425
+ url: 'tenor-weth-usdc-20261119',
426
+ value: MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20261119_Base,
427
+ midnight: MIDNIGHT_BASE,
428
+ loanToken: USDC_BASE,
429
+ collaterals: [{
430
+ token: WETH_BASE,
431
+ lltv: 0.86,
432
+ liquidationCursor: '300000000000000000',
433
+ oracle: '0xFEa2D58cEfCb9fcb597723c6bAE66fFE4193aFE4',
434
+ }],
435
+ hiddenCollaterals: [{
436
+ token: TENOR_WETH_USDC_VAULT_BASE,
437
+ lltv: 0.98,
438
+ liquidationCursor: '300000000000000000',
439
+ oracle: '0x784519B1b59A1e1498f077066bB9336672bcc3EE',
440
+ }],
441
+ maturity: 1795046400,
442
+ rcfThreshold: '3000000000',
443
+ enterGate: ZERO_ADDRESS,
444
+ liquidatorGate: ZERO_ADDRESS,
445
+ marketId: '0x8da96adc9a55288bda5f07eb062d501db04d0fa152dd0f78341f6232bc4f884d',
446
+ protocolName: 'morpho-midnight',
447
+ curator: 'Tenor',
448
+ });
449
+
450
+ export const MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20261217 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
451
+ chainIds: [NetworkNumber.Base],
452
+ label: 'Tenor WETH/USDC',
453
+ shortLabel: 'Tenor WETH/USDC',
454
+ url: 'tenor-weth-usdc-20261217',
455
+ value: MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20261217_Base,
456
+ midnight: MIDNIGHT_BASE,
457
+ loanToken: USDC_BASE,
458
+ collaterals: [{
459
+ token: WETH_BASE,
460
+ lltv: 0.86,
461
+ liquidationCursor: '300000000000000000',
462
+ oracle: '0xFEa2D58cEfCb9fcb597723c6bAE66fFE4193aFE4',
463
+ }],
464
+ hiddenCollaterals: [{
465
+ token: TENOR_WETH_USDC_VAULT_BASE,
466
+ lltv: 0.98,
467
+ liquidationCursor: '300000000000000000',
468
+ oracle: '0x784519B1b59A1e1498f077066bB9336672bcc3EE',
469
+ }],
470
+ maturity: 1797465600,
471
+ rcfThreshold: '3000000000',
472
+ enterGate: ZERO_ADDRESS,
473
+ liquidatorGate: ZERO_ADDRESS,
474
+ marketId: '0x24684af2c2c9edaa0ab4472dd9b8cc238aa33b7cc8151ae02fe614536f91af86',
475
+ protocolName: 'morpho-midnight',
476
+ curator: 'Tenor',
477
+ });
478
+
479
+ export const MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20260827 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
480
+ chainIds: [NetworkNumber.Base],
481
+ label: 'Tenor cbETH/WETH',
482
+ shortLabel: 'Tenor cbETH/WETH',
483
+ url: 'tenor-cbeth-weth-20260827',
484
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20260827_Base,
485
+ midnight: MIDNIGHT_BASE,
486
+ loanToken: WETH_BASE,
487
+ collaterals: [{
488
+ token: CBETH_BASE,
489
+ lltv: 0.945,
490
+ liquidationCursor: '300000000000000000',
491
+ oracle: '0xB03855Ad5AFD6B8db8091DD5551CAC4ed621d9E6',
492
+ }],
493
+ hiddenCollaterals: [{
494
+ token: TENOR_CBETH_WETH_VAULT_BASE,
495
+ lltv: 0.98,
496
+ liquidationCursor: '300000000000000000',
497
+ oracle: '0xa02f629871be35d6db0F88C944cF955554Ec87c0',
498
+ }],
499
+ maturity: 1787788800,
500
+ rcfThreshold: '4000000000000000000',
501
+ enterGate: ZERO_ADDRESS,
502
+ liquidatorGate: ZERO_ADDRESS,
503
+ marketId: '0x13cdfedf56f731817322c6932b48f496da937c36a51c7178ac63ed915d02fc98',
504
+ protocolName: 'morpho-midnight',
505
+ curator: 'Tenor',
506
+ });
507
+
508
+ export const MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20260924 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
509
+ chainIds: [NetworkNumber.Base],
510
+ label: 'Tenor cbETH/WETH',
511
+ shortLabel: 'Tenor cbETH/WETH',
512
+ url: 'tenor-cbeth-weth-20260924',
513
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20260924_Base,
514
+ midnight: MIDNIGHT_BASE,
515
+ loanToken: WETH_BASE,
516
+ collaterals: [{
517
+ token: CBETH_BASE,
518
+ lltv: 0.945,
519
+ liquidationCursor: '300000000000000000',
520
+ oracle: '0xB03855Ad5AFD6B8db8091DD5551CAC4ed621d9E6',
521
+ }],
522
+ hiddenCollaterals: [{
523
+ token: TENOR_CBETH_WETH_VAULT_BASE,
524
+ lltv: 0.98,
525
+ liquidationCursor: '300000000000000000',
526
+ oracle: '0xa02f629871be35d6db0F88C944cF955554Ec87c0',
527
+ }],
528
+ maturity: 1790208000,
529
+ rcfThreshold: '4000000000000000000',
530
+ enterGate: ZERO_ADDRESS,
531
+ liquidatorGate: ZERO_ADDRESS,
532
+ marketId: '0x74e310372280cc5c648a1f185db1ee906d2985a7dab8119568a9213f083efec0',
533
+ protocolName: 'morpho-midnight',
534
+ curator: 'Tenor',
535
+ });
536
+
537
+ export const MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20261022 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
538
+ chainIds: [NetworkNumber.Base],
539
+ label: 'Tenor cbETH/WETH',
540
+ shortLabel: 'Tenor cbETH/WETH',
541
+ url: 'tenor-cbeth-weth-20261022',
542
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20261022_Base,
543
+ midnight: MIDNIGHT_BASE,
544
+ loanToken: WETH_BASE,
545
+ collaterals: [{
546
+ token: CBETH_BASE,
547
+ lltv: 0.945,
548
+ liquidationCursor: '300000000000000000',
549
+ oracle: '0xB03855Ad5AFD6B8db8091DD5551CAC4ed621d9E6',
550
+ }],
551
+ hiddenCollaterals: [{
552
+ token: TENOR_CBETH_WETH_VAULT_BASE,
553
+ lltv: 0.98,
554
+ liquidationCursor: '300000000000000000',
555
+ oracle: '0xa02f629871be35d6db0F88C944cF955554Ec87c0',
556
+ }],
557
+ maturity: 1792627200,
558
+ rcfThreshold: '4000000000000000000',
559
+ enterGate: ZERO_ADDRESS,
560
+ liquidatorGate: ZERO_ADDRESS,
561
+ marketId: '0xcfce553a004af262e842c1b83cdfc01835bb83fbee7a8128f9b91663e2ebaf43',
562
+ protocolName: 'morpho-midnight',
563
+ curator: 'Tenor',
564
+ });
565
+
566
+ export const MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20261119 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
567
+ chainIds: [NetworkNumber.Base],
568
+ label: 'Tenor cbETH/WETH',
569
+ shortLabel: 'Tenor cbETH/WETH',
570
+ url: 'tenor-cbeth-weth-20261119',
571
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20261119_Base,
572
+ midnight: MIDNIGHT_BASE,
573
+ loanToken: WETH_BASE,
574
+ collaterals: [{
575
+ token: CBETH_BASE,
576
+ lltv: 0.945,
577
+ liquidationCursor: '300000000000000000',
578
+ oracle: '0xB03855Ad5AFD6B8db8091DD5551CAC4ed621d9E6',
579
+ }],
580
+ hiddenCollaterals: [{
581
+ token: TENOR_CBETH_WETH_VAULT_BASE,
582
+ lltv: 0.98,
583
+ liquidationCursor: '300000000000000000',
584
+ oracle: '0xa02f629871be35d6db0F88C944cF955554Ec87c0',
585
+ }],
586
+ maturity: 1795046400,
587
+ rcfThreshold: '4000000000000000000',
588
+ enterGate: ZERO_ADDRESS,
589
+ liquidatorGate: ZERO_ADDRESS,
590
+ marketId: '0xb1aa171a525fa9f3333ed47d816170930e9a1a83a1816a6b44ee0d89e1610691',
591
+ protocolName: 'morpho-midnight',
592
+ curator: 'Tenor',
593
+ });
594
+
595
+ export const MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20261217 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
596
+ chainIds: [NetworkNumber.Base],
597
+ label: 'Tenor cbETH/WETH',
598
+ shortLabel: 'Tenor cbETH/WETH',
599
+ url: 'tenor-cbeth-weth-20261217',
600
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20261217_Base,
601
+ midnight: MIDNIGHT_BASE,
602
+ loanToken: WETH_BASE,
603
+ collaterals: [{
604
+ token: CBETH_BASE,
605
+ lltv: 0.945,
606
+ liquidationCursor: '300000000000000000',
607
+ oracle: '0xB03855Ad5AFD6B8db8091DD5551CAC4ed621d9E6',
608
+ }],
609
+ hiddenCollaterals: [{
610
+ token: TENOR_CBETH_WETH_VAULT_BASE,
611
+ lltv: 0.98,
612
+ liquidationCursor: '300000000000000000',
613
+ oracle: '0xa02f629871be35d6db0F88C944cF955554Ec87c0',
614
+ }],
615
+ maturity: 1797465600,
616
+ rcfThreshold: '4000000000000000000',
617
+ enterGate: ZERO_ADDRESS,
618
+ liquidatorGate: ZERO_ADDRESS,
619
+ marketId: '0x001f992fd7dbc6f0fee600f1b1c627c4a7b6d70762043221a514b57f8df37cb7',
620
+ protocolName: 'morpho-midnight',
621
+ curator: 'Tenor',
147
622
  });
148
623
 
149
624
  export const MorphoMidnightMarkets = (networkId: NetworkNumber) => ({
150
- // BASE
625
+ // BASE — Morpho-curated
151
626
  [MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260731_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20260731(networkId),
152
627
  [MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260828_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20260828(networkId),
153
628
  [MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260925_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20260925(networkId),
154
629
  [MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261030_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20261030(networkId),
155
630
  [MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261127_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20261127(networkId),
156
631
  [MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261225_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20261225(networkId),
632
+ // BASE — Tenor-curated
633
+ [MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20260827_Base]: MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20260827(networkId),
634
+ [MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20260924_Base]: MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20260924(networkId),
635
+ [MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20261022_Base]: MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20261022(networkId),
636
+ [MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20261119_Base]: MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20261119(networkId),
637
+ [MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20261217_Base]: MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20261217(networkId),
638
+ [MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20260827_Base]: MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20260827(networkId),
639
+ [MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20260924_Base]: MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20260924(networkId),
640
+ [MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20261022_Base]: MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20261022(networkId),
641
+ [MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20261119_Base]: MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20261119(networkId),
642
+ [MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20261217_Base]: MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20261217(networkId),
643
+ [MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20260827_Base]: MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20260827(networkId),
644
+ [MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20260924_Base]: MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20260924(networkId),
645
+ [MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20261022_Base]: MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20261022(networkId),
646
+ [MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20261119_Base]: MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20261119(networkId),
647
+ [MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20261217_Base]: MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20261217(networkId),
157
648
  }) as const;
158
649
 
650
+ // Which markets Tenor's router quotes, by id, for the quote helpers that only receive one.
651
+ const TENOR_MARKET_IDS = new Set(
652
+ Object.values(MorphoMidnightMarkets(NetworkNumber.Base))
653
+ .filter((market) => market.curator === 'Tenor')
654
+ .map((market) => market.marketId.toLowerCase()),
655
+ );
656
+
657
+ export const isTenorMidnightMarket = (market: Pick<MorphoMidnightMarketData, 'curator'> | string): boolean => (
658
+ typeof market === 'string'
659
+ ? TENOR_MARKET_IDS.has(market.toLowerCase())
660
+ : market.curator === 'Tenor'
661
+ );
662
+
159
663
  export const findMorphoMidnightMarket = (marketId: string, network: NetworkNumber = NetworkNumber.Base): MorphoMidnightMarketData | undefined => Object.values(MorphoMidnightMarkets(network)).find(
160
664
  (market) => market.marketId.toLowerCase() === marketId.toLowerCase(),
161
665
  );
666
+
667
+ /**
668
+ * The market's collateral set as the chain knows it: the listed collaterals followed by the curator's
669
+ * hidden ones. This — not `collaterals` — is what a `Market` struct takes, since the market id is the hash
670
+ * of that struct. Anything assembling one for a contract call goes through here so it can't quietly build
671
+ * a market of its own instead.
672
+ */
673
+ export const morphoMidnightMarketCollateralParams = (
674
+ market: Pick<MorphoMidnightMarketData, 'collaterals' | 'hiddenCollaterals'>,
675
+ ): MorphoMidnightCollateralParams[] => [...market.collaterals, ...(market.hiddenCollaterals || [])];