@defisaver/positions-sdk 2.1.127-midnight-4-dev → 2.1.127-midnight-6-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 +34 -13
  4. package/cjs/helpers/morphoMidnightHelpers/index.js +85 -61
  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 +2 -1
  11. package/cjs/markets/morphoMidnight/index.d.ts +37 -0
  12. package/cjs/markets/morphoMidnight/index.js +434 -42
  13. package/cjs/types/morphoMidnight.d.ts +18 -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 +34 -13
  18. package/esm/helpers/morphoMidnightHelpers/index.js +65 -48
  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 +37 -0
  26. package/esm/markets/morphoMidnight/index.js +399 -23
  27. package/esm/types/morphoMidnight.d.ts +18 -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 +120 -48
  32. package/src/helpers/morphoMidnightHelpers/rate.ts +46 -0
  33. package/src/helpers/morphoMidnightHelpers/tenor.ts +411 -0
  34. package/src/markets/index.ts +1 -1
  35. package/src/markets/morphoMidnight/index.ts +424 -23
  36. package/src/types/morphoMidnight.ts +19 -0
@@ -1,16 +1,20 @@
1
1
  import { MorphoMidnightMarketData, MorphoMidnightVersions, NetworkNumber } from '../../types';
2
+ import { ZERO_ADDRESS } from '../../constants';
2
3
 
3
- // Morpho Midnight core contract on Base (same for every market).
4
- const MIDNIGHT_BASE = '0xAdedD8ab6dE832766Fedf0FaC4992E5C4D3EA18A';
5
- const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
4
+ /**
5
+ * Morpho Midnight core contract on Base. Every Midnight market trades against this one, whoever curates
6
+ * its order book — it is part of the market struct the id is hashed from, and it is what offer tuples
7
+ * encode for `Midnight.take`.
8
+ */
9
+ export const MIDNIGHT_BASE = '0xAdedD8ab6dE832766Fedf0FaC4992E5C4D3EA18A' as const;
6
10
 
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.
11
+ const USDC_BASE = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' as const;
12
+ const WETH_BASE = '0x4200000000000000000000000000000000000006' as const;
13
+ const CBBTC_BASE = '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf' as const;
14
+ const CBETH_BASE = '0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22' as const;
15
+
16
+
17
+ // Sourced from the official listing at https://markets.morpho.org/fixed/base
14
18
 
15
19
  // BASE — USDC/cbBTC, 86% LLTV, monthly maturity ladder
16
20
 
@@ -21,9 +25,9 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260731 = (networkId = NetworkNumbe
21
25
  url: 'cbbtc-usdc-20260731',
22
26
  value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260731_Base,
23
27
  midnight: MIDNIGHT_BASE,
24
- loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
28
+ loanToken: USDC_BASE,
25
29
  collaterals: [{
26
- token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
30
+ token: CBBTC_BASE,
27
31
  lltv: 0.86,
28
32
  liquidationCursor: '300000000000000000',
29
33
  oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
@@ -34,6 +38,7 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260731 = (networkId = NetworkNumbe
34
38
  liquidatorGate: ZERO_ADDRESS,
35
39
  marketId: '0x168e31250e0008b50d2255a5ab85e0265acd6c12e4f9a1336134b36a65a47937',
36
40
  protocolName: 'morpho-midnight',
41
+ curator: 'Morpho',
37
42
  });
38
43
 
39
44
  export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260828 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
@@ -43,9 +48,9 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260828 = (networkId = NetworkNumbe
43
48
  url: 'cbbtc-usdc-20260828',
44
49
  value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260828_Base,
45
50
  midnight: MIDNIGHT_BASE,
46
- loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
51
+ loanToken: USDC_BASE,
47
52
  collaterals: [{
48
- token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
53
+ token: CBBTC_BASE,
49
54
  lltv: 0.86,
50
55
  liquidationCursor: '300000000000000000',
51
56
  oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
@@ -56,6 +61,7 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260828 = (networkId = NetworkNumbe
56
61
  liquidatorGate: ZERO_ADDRESS,
57
62
  marketId: '0x05959752fdeff325962b9d263edb421efc6e2186a49360dba6c32e86ebf6c84c',
58
63
  protocolName: 'morpho-midnight',
64
+ curator: 'Morpho',
59
65
  });
60
66
 
61
67
  export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260925 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
@@ -65,9 +71,9 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260925 = (networkId = NetworkNumbe
65
71
  url: 'cbbtc-usdc-20260925',
66
72
  value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260925_Base,
67
73
  midnight: MIDNIGHT_BASE,
68
- loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
74
+ loanToken: USDC_BASE,
69
75
  collaterals: [{
70
- token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
76
+ token: CBBTC_BASE,
71
77
  lltv: 0.86,
72
78
  liquidationCursor: '300000000000000000',
73
79
  oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
@@ -78,6 +84,7 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260925 = (networkId = NetworkNumbe
78
84
  liquidatorGate: ZERO_ADDRESS,
79
85
  marketId: '0x549cd072daf99328554f3a6d2d4d6f4a07f1c59369e891e6391946f9cf75f221',
80
86
  protocolName: 'morpho-midnight',
87
+ curator: 'Morpho',
81
88
  });
82
89
 
83
90
  export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261030 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
@@ -87,9 +94,9 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261030 = (networkId = NetworkNumbe
87
94
  url: 'cbbtc-usdc-20261030',
88
95
  value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261030_Base,
89
96
  midnight: MIDNIGHT_BASE,
90
- loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
97
+ loanToken: USDC_BASE,
91
98
  collaterals: [{
92
- token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
99
+ token: CBBTC_BASE,
93
100
  lltv: 0.86,
94
101
  liquidationCursor: '300000000000000000',
95
102
  oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
@@ -100,6 +107,7 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261030 = (networkId = NetworkNumbe
100
107
  liquidatorGate: ZERO_ADDRESS,
101
108
  marketId: '0x43d6120738c57b2bc5835901f8250fdf7fc8054efbb006c6ccba61ec898e5ed9',
102
109
  protocolName: 'morpho-midnight',
110
+ curator: 'Morpho',
103
111
  });
104
112
 
105
113
  export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261127 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
@@ -109,9 +117,9 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261127 = (networkId = NetworkNumbe
109
117
  url: 'cbbtc-usdc-20261127',
110
118
  value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261127_Base,
111
119
  midnight: MIDNIGHT_BASE,
112
- loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
120
+ loanToken: USDC_BASE,
113
121
  collaterals: [{
114
- token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
122
+ token: CBBTC_BASE,
115
123
  lltv: 0.86,
116
124
  liquidationCursor: '300000000000000000',
117
125
  oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
@@ -122,6 +130,7 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261127 = (networkId = NetworkNumbe
122
130
  liquidatorGate: ZERO_ADDRESS,
123
131
  marketId: '0xe1878eec035b601f301484e63a49a428f8e008e2bf57a2fd88a3fc3a4c1b1acd',
124
132
  protocolName: 'morpho-midnight',
133
+ curator: 'Morpho',
125
134
  });
126
135
 
127
136
  export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261225 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
@@ -131,9 +140,9 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261225 = (networkId = NetworkNumbe
131
140
  url: 'cbbtc-usdc-20261225',
132
141
  value: MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261225_Base,
133
142
  midnight: MIDNIGHT_BASE,
134
- loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC
143
+ loanToken: USDC_BASE,
135
144
  collaterals: [{
136
- token: '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC
145
+ token: CBBTC_BASE,
137
146
  lltv: 0.86,
138
147
  liquidationCursor: '300000000000000000',
139
148
  oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
@@ -144,18 +153,410 @@ export const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261225 = (networkId = NetworkNumbe
144
153
  liquidatorGate: ZERO_ADDRESS,
145
154
  marketId: '0x9593c3a6dba45b6106af8dc8b45ba8c505d90d3d68a3d33f7c278dd921b637da',
146
155
  protocolName: 'morpho-midnight',
156
+ curator: 'Morpho',
157
+ });
158
+
159
+ // ── Tenor-curated ────────────────────────────────────────────────────────────────────────────────
160
+
161
+ // Tenor Midnight markets are the same structs as Morpho's (`MorphoMidnightMarketData`), on the same core
162
+ // contract; only the order book differs. Identify them on Morpho's `/v0/midnight/markets` by `market_id`
163
+ // = Tenor's `fixedMarketIdentifier`; they come back `listed: false`, meaning Tenor — not Morpho — serves
164
+ // the book.
165
+ //
166
+ // Every market below is verified against `MidnightView.toMarket(marketId)` on Base: core address,
167
+ // maturity, rcfThreshold, loan token, gates and collaterals all match. On-chain each market carries **two**
168
+ // collaterals — the pair's own token at index 0, and Tenor's ERC-4626 vault at index 1 (98% LLTV; the
169
+ // `metadata.vault` of the parent tenor market, listed at
170
+ // https://www.docs.tenor.finance/technical-docs/addresses/#vaults). The vault is not an asset the app
171
+ // deals in, so these are modelled as single-collateral markets: the app supplies and prices index 0, and
172
+ // the SDK reads `prices[i]` / `collateral[i]` positionally, so listing the primary alone keeps those
173
+ // lookups aligned. The on-chain take path is unaffected — offer tuples carry the market's full collateral
174
+ // set straight from the router's offer JSON, which is what the market hash is built from.
175
+
176
+ export const MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20260827 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
177
+ chainIds: [NetworkNumber.Base],
178
+ label: 'Tenor cbBTC/USDC',
179
+ shortLabel: 'Tenor cbBTC/USDC',
180
+ url: 'tenor-cbbtc-usdc-20260827',
181
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20260827_Base,
182
+ midnight: MIDNIGHT_BASE,
183
+ loanToken: USDC_BASE,
184
+ collaterals: [{
185
+ token: CBBTC_BASE,
186
+ lltv: 0.86,
187
+ liquidationCursor: '300000000000000000',
188
+ oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
189
+ }],
190
+ maturity: 1787788800, // 2026-08-27T00:00:00Z
191
+ rcfThreshold: '3000000000',
192
+ enterGate: ZERO_ADDRESS,
193
+ liquidatorGate: ZERO_ADDRESS,
194
+ marketId: '0x44495af1cca7842191a65a73978e01ed72238731e193c3b11460083efd60a318',
195
+ protocolName: 'morpho-midnight',
196
+ curator: 'Tenor',
197
+ });
198
+
199
+ export const MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20260924 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
200
+ chainIds: [NetworkNumber.Base],
201
+ label: 'Tenor cbBTC/USDC',
202
+ shortLabel: 'Tenor cbBTC/USDC',
203
+ url: 'tenor-cbbtc-usdc-20260924',
204
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20260924_Base,
205
+ midnight: MIDNIGHT_BASE,
206
+ loanToken: USDC_BASE,
207
+ collaterals: [{
208
+ token: CBBTC_BASE,
209
+ lltv: 0.86,
210
+ liquidationCursor: '300000000000000000',
211
+ oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
212
+ }],
213
+ maturity: 1790208000, // 2026-09-24T00:00:00Z
214
+ rcfThreshold: '3000000000',
215
+ enterGate: ZERO_ADDRESS,
216
+ liquidatorGate: ZERO_ADDRESS,
217
+ marketId: '0x99fbed74bc7cef3c90d68709d8de8f820261a45875ca197a0e65338affd09481',
218
+ protocolName: 'morpho-midnight',
219
+ curator: 'Tenor',
220
+ });
221
+
222
+ export const MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20261022 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
223
+ chainIds: [NetworkNumber.Base],
224
+ label: 'Tenor cbBTC/USDC',
225
+ shortLabel: 'Tenor cbBTC/USDC',
226
+ url: 'tenor-cbbtc-usdc-20261022',
227
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20261022_Base,
228
+ midnight: MIDNIGHT_BASE,
229
+ loanToken: USDC_BASE,
230
+ collaterals: [{
231
+ token: CBBTC_BASE,
232
+ lltv: 0.86,
233
+ liquidationCursor: '300000000000000000',
234
+ oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
235
+ }],
236
+ maturity: 1792627200, // 2026-10-22T00:00:00Z
237
+ rcfThreshold: '3000000000',
238
+ enterGate: ZERO_ADDRESS,
239
+ liquidatorGate: ZERO_ADDRESS,
240
+ marketId: '0x2f4f088f20c0bebe6167f8c9d7aec11115c08eb73486b6f9642f7c7260d4d094',
241
+ protocolName: 'morpho-midnight',
242
+ curator: 'Tenor',
243
+ });
244
+
245
+ export const MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20261119 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
246
+ chainIds: [NetworkNumber.Base],
247
+ label: 'Tenor cbBTC/USDC',
248
+ shortLabel: 'Tenor cbBTC/USDC',
249
+ url: 'tenor-cbbtc-usdc-20261119',
250
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20261119_Base,
251
+ midnight: MIDNIGHT_BASE,
252
+ loanToken: USDC_BASE,
253
+ collaterals: [{
254
+ token: CBBTC_BASE,
255
+ lltv: 0.86,
256
+ liquidationCursor: '300000000000000000',
257
+ oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
258
+ }],
259
+ maturity: 1795046400, // 2026-11-19T00:00:00Z
260
+ rcfThreshold: '3000000000',
261
+ enterGate: ZERO_ADDRESS,
262
+ liquidatorGate: ZERO_ADDRESS,
263
+ marketId: '0x776e8d667a394650c21615c9b5a9b5355f4aa777db3cebaebb057ffba588c7af',
264
+ protocolName: 'morpho-midnight',
265
+ curator: 'Tenor',
266
+ });
267
+
268
+ export const MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20261217 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
269
+ chainIds: [NetworkNumber.Base],
270
+ label: 'Tenor cbBTC/USDC',
271
+ shortLabel: 'Tenor cbBTC/USDC',
272
+ url: 'tenor-cbbtc-usdc-20261217',
273
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20261217_Base,
274
+ midnight: MIDNIGHT_BASE,
275
+ loanToken: USDC_BASE,
276
+ collaterals: [{
277
+ token: CBBTC_BASE,
278
+ lltv: 0.86,
279
+ liquidationCursor: '300000000000000000',
280
+ oracle: '0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9',
281
+ }],
282
+ maturity: 1797465600, // 2026-12-17T00:00:00Z
283
+ rcfThreshold: '3000000000',
284
+ enterGate: ZERO_ADDRESS,
285
+ liquidatorGate: ZERO_ADDRESS,
286
+ marketId: '0xd82863083585d715a2e0d8ed61e0e20e4f6c566171d3bfed513ad55797177b17',
287
+ protocolName: 'morpho-midnight',
288
+ curator: 'Tenor',
289
+ });
290
+
291
+ export const MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20260827 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
292
+ chainIds: [NetworkNumber.Base],
293
+ label: 'Tenor WETH/USDC',
294
+ shortLabel: 'Tenor WETH/USDC',
295
+ url: 'tenor-weth-usdc-20260827',
296
+ value: MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20260827_Base,
297
+ midnight: MIDNIGHT_BASE,
298
+ loanToken: USDC_BASE,
299
+ collaterals: [{
300
+ token: WETH_BASE,
301
+ lltv: 0.86,
302
+ liquidationCursor: '300000000000000000',
303
+ oracle: '0xFEa2D58cEfCb9fcb597723c6bAE66fFE4193aFE4',
304
+ }],
305
+ maturity: 1787788800,
306
+ rcfThreshold: '3000000000',
307
+ enterGate: ZERO_ADDRESS,
308
+ liquidatorGate: ZERO_ADDRESS,
309
+ marketId: '0xf27319855df886a604dda3d5675007f0aa6eee504c99f1d789c86b21075f7c20',
310
+ protocolName: 'morpho-midnight',
311
+ curator: 'Tenor',
312
+ });
313
+
314
+ export const MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20260924 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
315
+ chainIds: [NetworkNumber.Base],
316
+ label: 'Tenor WETH/USDC',
317
+ shortLabel: 'Tenor WETH/USDC',
318
+ url: 'tenor-weth-usdc-20260924',
319
+ value: MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20260924_Base,
320
+ midnight: MIDNIGHT_BASE,
321
+ loanToken: USDC_BASE,
322
+ collaterals: [{
323
+ token: WETH_BASE,
324
+ lltv: 0.86,
325
+ liquidationCursor: '300000000000000000',
326
+ oracle: '0xFEa2D58cEfCb9fcb597723c6bAE66fFE4193aFE4',
327
+ }],
328
+ maturity: 1790208000,
329
+ rcfThreshold: '3000000000',
330
+ enterGate: ZERO_ADDRESS,
331
+ liquidatorGate: ZERO_ADDRESS,
332
+ marketId: '0x9b7fed2a6b24c47b8995dfa4fb2b4bc87fe245c10fb842865e568611a96804aa',
333
+ protocolName: 'morpho-midnight',
334
+ curator: 'Tenor',
335
+ });
336
+
337
+ export const MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20261022 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
338
+ chainIds: [NetworkNumber.Base],
339
+ label: 'Tenor WETH/USDC',
340
+ shortLabel: 'Tenor WETH/USDC',
341
+ url: 'tenor-weth-usdc-20261022',
342
+ value: MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20261022_Base,
343
+ midnight: MIDNIGHT_BASE,
344
+ loanToken: USDC_BASE,
345
+ collaterals: [{
346
+ token: WETH_BASE,
347
+ lltv: 0.86,
348
+ liquidationCursor: '300000000000000000',
349
+ oracle: '0xFEa2D58cEfCb9fcb597723c6bAE66fFE4193aFE4',
350
+ }],
351
+ maturity: 1792627200,
352
+ rcfThreshold: '3000000000',
353
+ enterGate: ZERO_ADDRESS,
354
+ liquidatorGate: ZERO_ADDRESS,
355
+ marketId: '0xfc2562129c7d538fcb6b2490d07aa5c69971d9d0b75e2f9bbf054ef99a311474',
356
+ protocolName: 'morpho-midnight',
357
+ curator: 'Tenor',
358
+ });
359
+
360
+ export const MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20261119 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
361
+ chainIds: [NetworkNumber.Base],
362
+ label: 'Tenor WETH/USDC',
363
+ shortLabel: 'Tenor WETH/USDC',
364
+ url: 'tenor-weth-usdc-20261119',
365
+ value: MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20261119_Base,
366
+ midnight: MIDNIGHT_BASE,
367
+ loanToken: USDC_BASE,
368
+ collaterals: [{
369
+ token: WETH_BASE,
370
+ lltv: 0.86,
371
+ liquidationCursor: '300000000000000000',
372
+ oracle: '0xFEa2D58cEfCb9fcb597723c6bAE66fFE4193aFE4',
373
+ }],
374
+ maturity: 1795046400,
375
+ rcfThreshold: '3000000000',
376
+ enterGate: ZERO_ADDRESS,
377
+ liquidatorGate: ZERO_ADDRESS,
378
+ marketId: '0x8da96adc9a55288bda5f07eb062d501db04d0fa152dd0f78341f6232bc4f884d',
379
+ protocolName: 'morpho-midnight',
380
+ curator: 'Tenor',
381
+ });
382
+
383
+ export const MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20261217 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
384
+ chainIds: [NetworkNumber.Base],
385
+ label: 'Tenor WETH/USDC',
386
+ shortLabel: 'Tenor WETH/USDC',
387
+ url: 'tenor-weth-usdc-20261217',
388
+ value: MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20261217_Base,
389
+ midnight: MIDNIGHT_BASE,
390
+ loanToken: USDC_BASE,
391
+ collaterals: [{
392
+ token: WETH_BASE,
393
+ lltv: 0.86,
394
+ liquidationCursor: '300000000000000000',
395
+ oracle: '0xFEa2D58cEfCb9fcb597723c6bAE66fFE4193aFE4',
396
+ }],
397
+ maturity: 1797465600,
398
+ rcfThreshold: '3000000000',
399
+ enterGate: ZERO_ADDRESS,
400
+ liquidatorGate: ZERO_ADDRESS,
401
+ marketId: '0x24684af2c2c9edaa0ab4472dd9b8cc238aa33b7cc8151ae02fe614536f91af86',
402
+ protocolName: 'morpho-midnight',
403
+ curator: 'Tenor',
404
+ });
405
+
406
+ export const MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20260827 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
407
+ chainIds: [NetworkNumber.Base],
408
+ label: 'Tenor cbETH/WETH',
409
+ shortLabel: 'Tenor cbETH/WETH',
410
+ url: 'tenor-cbeth-weth-20260827',
411
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20260827_Base,
412
+ midnight: MIDNIGHT_BASE,
413
+ loanToken: WETH_BASE,
414
+ collaterals: [{
415
+ token: CBETH_BASE,
416
+ lltv: 0.945,
417
+ liquidationCursor: '300000000000000000',
418
+ oracle: '0xB03855Ad5AFD6B8db8091DD5551CAC4ed621d9E6',
419
+ }],
420
+ maturity: 1787788800,
421
+ rcfThreshold: '4000000000000000000',
422
+ enterGate: ZERO_ADDRESS,
423
+ liquidatorGate: ZERO_ADDRESS,
424
+ marketId: '0x13cdfedf56f731817322c6932b48f496da937c36a51c7178ac63ed915d02fc98',
425
+ protocolName: 'morpho-midnight',
426
+ curator: 'Tenor',
427
+ });
428
+
429
+ export const MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20260924 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
430
+ chainIds: [NetworkNumber.Base],
431
+ label: 'Tenor cbETH/WETH',
432
+ shortLabel: 'Tenor cbETH/WETH',
433
+ url: 'tenor-cbeth-weth-20260924',
434
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20260924_Base,
435
+ midnight: MIDNIGHT_BASE,
436
+ loanToken: WETH_BASE,
437
+ collaterals: [{
438
+ token: CBETH_BASE,
439
+ lltv: 0.945,
440
+ liquidationCursor: '300000000000000000',
441
+ oracle: '0xB03855Ad5AFD6B8db8091DD5551CAC4ed621d9E6',
442
+ }],
443
+ maturity: 1790208000,
444
+ rcfThreshold: '4000000000000000000',
445
+ enterGate: ZERO_ADDRESS,
446
+ liquidatorGate: ZERO_ADDRESS,
447
+ marketId: '0x74e310372280cc5c648a1f185db1ee906d2985a7dab8119568a9213f083efec0',
448
+ protocolName: 'morpho-midnight',
449
+ curator: 'Tenor',
450
+ });
451
+
452
+ export const MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20261022 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
453
+ chainIds: [NetworkNumber.Base],
454
+ label: 'Tenor cbETH/WETH',
455
+ shortLabel: 'Tenor cbETH/WETH',
456
+ url: 'tenor-cbeth-weth-20261022',
457
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20261022_Base,
458
+ midnight: MIDNIGHT_BASE,
459
+ loanToken: WETH_BASE,
460
+ collaterals: [{
461
+ token: CBETH_BASE,
462
+ lltv: 0.945,
463
+ liquidationCursor: '300000000000000000',
464
+ oracle: '0xB03855Ad5AFD6B8db8091DD5551CAC4ed621d9E6',
465
+ }],
466
+ maturity: 1792627200,
467
+ rcfThreshold: '4000000000000000000',
468
+ enterGate: ZERO_ADDRESS,
469
+ liquidatorGate: ZERO_ADDRESS,
470
+ marketId: '0xcfce553a004af262e842c1b83cdfc01835bb83fbee7a8128f9b91663e2ebaf43',
471
+ protocolName: 'morpho-midnight',
472
+ curator: 'Tenor',
473
+ });
474
+
475
+ export const MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20261119 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
476
+ chainIds: [NetworkNumber.Base],
477
+ label: 'Tenor cbETH/WETH',
478
+ shortLabel: 'Tenor cbETH/WETH',
479
+ url: 'tenor-cbeth-weth-20261119',
480
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20261119_Base,
481
+ midnight: MIDNIGHT_BASE,
482
+ loanToken: WETH_BASE,
483
+ collaterals: [{
484
+ token: CBETH_BASE,
485
+ lltv: 0.945,
486
+ liquidationCursor: '300000000000000000',
487
+ oracle: '0xB03855Ad5AFD6B8db8091DD5551CAC4ed621d9E6',
488
+ }],
489
+ maturity: 1795046400,
490
+ rcfThreshold: '4000000000000000000',
491
+ enterGate: ZERO_ADDRESS,
492
+ liquidatorGate: ZERO_ADDRESS,
493
+ marketId: '0xb1aa171a525fa9f3333ed47d816170930e9a1a83a1816a6b44ee0d89e1610691',
494
+ protocolName: 'morpho-midnight',
495
+ curator: 'Tenor',
496
+ });
497
+
498
+ export const MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20261217 = (networkId = NetworkNumber.Base): MorphoMidnightMarketData => ({
499
+ chainIds: [NetworkNumber.Base],
500
+ label: 'Tenor cbETH/WETH',
501
+ shortLabel: 'Tenor cbETH/WETH',
502
+ url: 'tenor-cbeth-weth-20261217',
503
+ value: MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20261217_Base,
504
+ midnight: MIDNIGHT_BASE,
505
+ loanToken: WETH_BASE,
506
+ collaterals: [{
507
+ token: CBETH_BASE,
508
+ lltv: 0.945,
509
+ liquidationCursor: '300000000000000000',
510
+ oracle: '0xB03855Ad5AFD6B8db8091DD5551CAC4ed621d9E6',
511
+ }],
512
+ maturity: 1797465600,
513
+ rcfThreshold: '4000000000000000000',
514
+ enterGate: ZERO_ADDRESS,
515
+ liquidatorGate: ZERO_ADDRESS,
516
+ marketId: '0x001f992fd7dbc6f0fee600f1b1c627c4a7b6d70762043221a514b57f8df37cb7',
517
+ protocolName: 'morpho-midnight',
518
+ curator: 'Tenor',
147
519
  });
148
520
 
149
521
  export const MorphoMidnightMarkets = (networkId: NetworkNumber) => ({
150
- // BASE
522
+ // BASE — Morpho-curated
151
523
  [MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260731_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20260731(networkId),
152
524
  [MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260828_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20260828(networkId),
153
525
  [MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20260925_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20260925(networkId),
154
526
  [MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261030_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20261030(networkId),
155
527
  [MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261127_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20261127(networkId),
156
528
  [MorphoMidnightVersions.MorphoMidnightCbBTCUSDC_860_20261225_Base]: MORPHO_MIDNIGHT_CBBTC_USDC_860_20261225(networkId),
529
+ // BASE — Tenor-curated
530
+ [MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20260827_Base]: MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20260827(networkId),
531
+ [MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20260924_Base]: MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20260924(networkId),
532
+ [MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20261022_Base]: MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20261022(networkId),
533
+ [MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20261119_Base]: MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20261119(networkId),
534
+ [MorphoMidnightVersions.MorphoMidnightTenorCbBTCUSDC_20261217_Base]: MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20261217(networkId),
535
+ [MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20260827_Base]: MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20260827(networkId),
536
+ [MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20260924_Base]: MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20260924(networkId),
537
+ [MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20261022_Base]: MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20261022(networkId),
538
+ [MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20261119_Base]: MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20261119(networkId),
539
+ [MorphoMidnightVersions.MorphoMidnightTenorWETHUSDC_20261217_Base]: MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20261217(networkId),
540
+ [MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20260827_Base]: MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20260827(networkId),
541
+ [MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20260924_Base]: MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20260924(networkId),
542
+ [MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20261022_Base]: MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20261022(networkId),
543
+ [MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20261119_Base]: MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20261119(networkId),
544
+ [MorphoMidnightVersions.MorphoMidnightTenorCbETHWETH_20261217_Base]: MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20261217(networkId),
157
545
  }) as const;
158
546
 
547
+ // Which markets Tenor's router quotes, by id, for the quote helpers that only receive one.
548
+ const TENOR_MARKET_IDS = new Set(
549
+ Object.values(MorphoMidnightMarkets(NetworkNumber.Base))
550
+ .filter((market) => market.curator === 'Tenor')
551
+ .map((market) => market.marketId.toLowerCase()),
552
+ );
553
+
554
+ export const isTenorMidnightMarket = (market: Pick<MorphoMidnightMarketData, 'curator'> | string): boolean => (
555
+ typeof market === 'string'
556
+ ? TENOR_MARKET_IDS.has(market.toLowerCase())
557
+ : market.curator === 'Tenor'
558
+ );
559
+
159
560
  export const findMorphoMidnightMarket = (marketId: string, network: NetworkNumber = NetworkNumber.Base): MorphoMidnightMarketData | undefined => Object.values(MorphoMidnightMarkets(network)).find(
160
561
  (market) => market.marketId.toLowerCase() === marketId.toLowerCase(),
161
562
  );
@@ -12,8 +12,26 @@ export enum MorphoMidnightVersions {
12
12
  MorphoMidnightCbBTCUSDC_860_20261030_Base = 'morphomidnightcbbtcusdc_860_20261030_base',
13
13
  MorphoMidnightCbBTCUSDC_860_20261127_Base = 'morphomidnightcbbtcusdc_860_20261127_base',
14
14
  MorphoMidnightCbBTCUSDC_860_20261225_Base = 'morphomidnightcbbtcusdc_860_20261225_base',
15
+ // Tenor-hosted Midnight markets (same core, different order book)
16
+ MorphoMidnightTenorCbBTCUSDC_20260827_Base = 'morphomidnighttenorcbbtcusdc_20260827_base',
17
+ MorphoMidnightTenorCbBTCUSDC_20260924_Base = 'morphomidnighttenorcbbtcusdc_20260924_base',
18
+ MorphoMidnightTenorCbBTCUSDC_20261022_Base = 'morphomidnighttenorcbbtcusdc_20261022_base',
19
+ MorphoMidnightTenorCbBTCUSDC_20261119_Base = 'morphomidnighttenorcbbtcusdc_20261119_base',
20
+ MorphoMidnightTenorCbBTCUSDC_20261217_Base = 'morphomidnighttenorcbbtcusdc_20261217_base',
21
+ MorphoMidnightTenorWETHUSDC_20260827_Base = 'morphomidnighttenorwethusdc_20260827_base',
22
+ MorphoMidnightTenorWETHUSDC_20260924_Base = 'morphomidnighttenorwethusdc_20260924_base',
23
+ MorphoMidnightTenorWETHUSDC_20261022_Base = 'morphomidnighttenorwethusdc_20261022_base',
24
+ MorphoMidnightTenorWETHUSDC_20261119_Base = 'morphomidnighttenorwethusdc_20261119_base',
25
+ MorphoMidnightTenorWETHUSDC_20261217_Base = 'morphomidnighttenorwethusdc_20261217_base',
26
+ MorphoMidnightTenorCbETHWETH_20260827_Base = 'morphomidnighttenorcbethweth_20260827_base',
27
+ MorphoMidnightTenorCbETHWETH_20260924_Base = 'morphomidnighttenorcbethweth_20260924_base',
28
+ MorphoMidnightTenorCbETHWETH_20261022_Base = 'morphomidnighttenorcbethweth_20261022_base',
29
+ MorphoMidnightTenorCbETHWETH_20261119_Base = 'morphomidnighttenorcbethweth_20261119_base',
30
+ MorphoMidnightTenorCbETHWETH_20261217_Base = 'morphomidnighttenorcbethweth_20261217_base',
15
31
  }
16
32
 
33
+ export type MorphoMidnightCurator = 'Morpho' | 'Tenor';
34
+
17
35
  export interface MorphoMidnightCollateralParams {
18
36
  token: EthAddress,
19
37
  lltv: number | string,
@@ -36,6 +54,7 @@ export interface MorphoMidnightMarketData {
36
54
  liquidatorGate: EthAddress,
37
55
  marketId: string, // bytes32, precomputed off-chain (verify with MidnightView.toId)
38
56
  protocolName: string,
57
+ curator: MorphoMidnightCurator,
39
58
  }
40
59
 
41
60
  export interface MorphoMidnightAssetData {