@defisaver/positions-sdk 2.1.144-dev → 2.1.145

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 (96) hide show
  1. package/cjs/config/contracts.d.ts +249 -0
  2. package/cjs/config/contracts.js +11 -1
  3. package/cjs/constants/index.d.ts +1 -0
  4. package/cjs/constants/index.js +2 -1
  5. package/cjs/contracts.d.ts +1510 -0
  6. package/cjs/contracts.js +3 -2
  7. package/cjs/fluid/index.js +6 -2
  8. package/cjs/helpers/fluidHelpers/index.js +5 -4
  9. package/cjs/helpers/index.d.ts +1 -0
  10. package/cjs/helpers/index.js +2 -1
  11. package/cjs/helpers/morphoMidnightHelpers/headroom.d.ts +48 -0
  12. package/cjs/helpers/morphoMidnightHelpers/headroom.js +52 -0
  13. package/cjs/helpers/morphoMidnightHelpers/index.d.ts +113 -0
  14. package/cjs/helpers/morphoMidnightHelpers/index.js +298 -0
  15. package/cjs/helpers/morphoMidnightHelpers/rate.d.ts +15 -0
  16. package/cjs/helpers/morphoMidnightHelpers/rate.js +62 -0
  17. package/cjs/helpers/morphoMidnightHelpers/tenor.d.ts +129 -0
  18. package/cjs/helpers/morphoMidnightHelpers/tenor.js +254 -0
  19. package/cjs/index.d.ts +2 -1
  20. package/cjs/index.js +3 -1
  21. package/cjs/markets/index.d.ts +1 -0
  22. package/cjs/markets/index.js +6 -1
  23. package/cjs/markets/morphoMidnight/index.d.ts +60 -0
  24. package/cjs/markets/morphoMidnight/index.js +659 -0
  25. package/cjs/morphoMidnight/index.d.ts +14 -0
  26. package/cjs/morphoMidnight/index.js +261 -0
  27. package/cjs/portfolio/discovery.js +4 -0
  28. package/cjs/portfolio/index.js +44 -0
  29. package/cjs/services/viem.d.ts +11 -11
  30. package/cjs/staking/eligibility.d.ts +15 -1
  31. package/cjs/staking/eligibility.js +12 -1
  32. package/cjs/staking/staking.js +18 -22
  33. package/cjs/types/index.d.ts +1 -0
  34. package/cjs/types/index.js +1 -0
  35. package/cjs/types/morphoMidnight.d.ts +141 -0
  36. package/cjs/types/morphoMidnight.js +47 -0
  37. package/cjs/types/portfolio.d.ts +4 -0
  38. package/esm/config/contracts.d.ts +249 -0
  39. package/esm/config/contracts.js +9 -0
  40. package/esm/constants/index.d.ts +1 -0
  41. package/esm/constants/index.js +1 -0
  42. package/esm/contracts.d.ts +1510 -0
  43. package/esm/contracts.js +1 -0
  44. package/esm/fluid/index.js +6 -2
  45. package/esm/helpers/fluidHelpers/index.js +6 -5
  46. package/esm/helpers/index.d.ts +1 -0
  47. package/esm/helpers/index.js +1 -0
  48. package/esm/helpers/morphoMidnightHelpers/headroom.d.ts +48 -0
  49. package/esm/helpers/morphoMidnightHelpers/headroom.js +45 -0
  50. package/esm/helpers/morphoMidnightHelpers/index.d.ts +113 -0
  51. package/esm/helpers/morphoMidnightHelpers/index.js +271 -0
  52. package/esm/helpers/morphoMidnightHelpers/rate.d.ts +15 -0
  53. package/esm/helpers/morphoMidnightHelpers/rate.js +50 -0
  54. package/esm/helpers/morphoMidnightHelpers/tenor.d.ts +129 -0
  55. package/esm/helpers/morphoMidnightHelpers/tenor.js +238 -0
  56. package/esm/index.d.ts +2 -1
  57. package/esm/index.js +2 -1
  58. package/esm/markets/index.d.ts +1 -0
  59. package/esm/markets/index.js +1 -0
  60. package/esm/markets/morphoMidnight/index.d.ts +60 -0
  61. package/esm/markets/morphoMidnight/index.js +631 -0
  62. package/esm/morphoMidnight/index.d.ts +14 -0
  63. package/esm/morphoMidnight/index.js +248 -0
  64. package/esm/portfolio/discovery.js +5 -1
  65. package/esm/portfolio/index.js +45 -1
  66. package/esm/services/viem.d.ts +11 -11
  67. package/esm/staking/eligibility.d.ts +15 -1
  68. package/esm/staking/eligibility.js +10 -0
  69. package/esm/staking/staking.js +19 -23
  70. package/esm/types/index.d.ts +1 -0
  71. package/esm/types/index.js +1 -0
  72. package/esm/types/morphoMidnight.d.ts +141 -0
  73. package/esm/types/morphoMidnight.js +44 -0
  74. package/esm/types/portfolio.d.ts +4 -0
  75. package/package.json +1 -1
  76. package/src/config/contracts.ts +9 -0
  77. package/src/constants/index.ts +1 -0
  78. package/src/contracts.ts +1 -0
  79. package/src/fluid/index.ts +6 -2
  80. package/src/helpers/fluidHelpers/index.ts +6 -5
  81. package/src/helpers/index.ts +1 -0
  82. package/src/helpers/morphoMidnightHelpers/headroom.ts +82 -0
  83. package/src/helpers/morphoMidnightHelpers/index.ts +485 -0
  84. package/src/helpers/morphoMidnightHelpers/rate.ts +71 -0
  85. package/src/helpers/morphoMidnightHelpers/tenor.ts +407 -0
  86. package/src/index.ts +2 -0
  87. package/src/markets/index.ts +3 -0
  88. package/src/markets/morphoMidnight/index.ts +675 -0
  89. package/src/morphoMidnight/index.ts +276 -0
  90. package/src/portfolio/discovery.ts +6 -0
  91. package/src/portfolio/index.ts +44 -0
  92. package/src/staking/eligibility.ts +29 -2
  93. package/src/staking/staking.ts +20 -22
  94. package/src/types/index.ts +1 -0
  95. package/src/types/morphoMidnight.ts +163 -0
  96. package/src/types/portfolio.ts +4 -0
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildMidnightParsedBook = exports.midnightBookBestFirst = exports.midnightBoundPrice = exports.MIDNIGHT_DEFAULT_RATE_SLIPPAGE = exports.midnightPriceFromApy = exports.midnightApyFromPrice = exports.midnightTimeToMaturityDays = void 0;
7
+ const decimal_js_1 = __importDefault(require("decimal.js"));
8
+ const constants_1 = require("../../constants");
9
+ const nowInSeconds = () => Math.floor(Date.now() / 1000);
10
+ // Days remaining until maturity, optionally measured at a past timestamp (for historical fills).
11
+ const midnightTimeToMaturityDays = (maturity, atSeconds = nowInSeconds()) => new decimal_js_1.default(maturity).sub(atSeconds).div(constants_1.SECONDS_PER_DAY).toNumber();
12
+ exports.midnightTimeToMaturityDays = midnightTimeToMaturityDays;
13
+ // Annualize a fixed-term discount price into an APY percent: (1 / price)^(365 / ttmDays) − 1.
14
+ // `price` is loan-per-unit (assets received / units owed), so 1/price ≥ 1.
15
+ const midnightApyFromPrice = (price, ttmDays) => {
16
+ const p = new decimal_js_1.default(price);
17
+ const ttm = new decimal_js_1.default(ttmDays);
18
+ if (p.lte(0) || ttm.lte(0))
19
+ return '0';
20
+ return new decimal_js_1.default(1).div(p).pow(new decimal_js_1.default(365).div(ttm)).sub(1)
21
+ .mul(100)
22
+ .toString();
23
+ };
24
+ exports.midnightApyFromPrice = midnightApyFromPrice;
25
+ /**
26
+ * Inverse of `midnightApyFromPrice`: the loan-per-unit price a borrow APY implies,
27
+ * price = (1 + rate)^(−ttmDays / 365).
28
+ */
29
+ const midnightPriceFromApy = (ratePercent, ttmDays) => {
30
+ const rate = new decimal_js_1.default(ratePercent);
31
+ const ttm = new decimal_js_1.default(ttmDays);
32
+ if (rate.lte(0) || ttm.lte(0))
33
+ return '1';
34
+ return new decimal_js_1.default(1).div(new decimal_js_1.default(1).add(rate.div(100)).pow(ttm.div(365))).toString();
35
+ };
36
+ exports.midnightPriceFromApy = midnightPriceFromApy;
37
+ exports.MIDNIGHT_DEFAULT_RATE_SLIPPAGE = 0.1;
38
+ const MIDNIGHT_MIN_FLOOR_RATIO = 0.5;
39
+ const midnightBoundPrice = (estRate, ttmDays, kind, boundRate, rateSlippagePercent = exports.MIDNIGHT_DEFAULT_RATE_SLIPPAGE) => {
40
+ if (boundRate !== undefined && new decimal_js_1.default(boundRate).gt(0))
41
+ return (0, exports.midnightPriceFromApy)(boundRate, ttmDays);
42
+ const est = new decimal_js_1.default(estRate);
43
+ const slippage = new decimal_js_1.default(rateSlippagePercent);
44
+ const bound = kind === 'ceiling'
45
+ ? est.add(slippage)
46
+ : decimal_js_1.default.max(est.sub(slippage), est.mul(MIDNIGHT_MIN_FLOOR_RATIO));
47
+ return (0, exports.midnightPriceFromApy)(bound, ttmDays);
48
+ };
49
+ exports.midnightBoundPrice = midnightBoundPrice;
50
+ const midnightBookBestFirst = (side) => (side === 'asks' ? -1 : 1);
51
+ exports.midnightBookBestFirst = midnightBookBestFirst;
52
+ const buildMidnightParsedBook = (offers, side) => {
53
+ const bestFirst = [...offers].sort((a, b) => new decimal_js_1.default(a.rate).minus(b.rate).mul((0, exports.midnightBookBestFirst)(side)).toNumber());
54
+ if (bestFirst.length === 0)
55
+ return null;
56
+ return {
57
+ bestRate: bestFirst[0].rate,
58
+ totalLiquidity: bestFirst.reduce((sum, offer) => sum.add(offer.liquidity), new decimal_js_1.default(0)).toString(),
59
+ offers: bestFirst,
60
+ };
61
+ };
62
+ exports.buildMidnightParsedBook = buildMidnightParsedBook;
@@ -0,0 +1,129 @@
1
+ import Dec from 'decimal.js';
2
+ import { MorphoMidnightBookSide, MorphoMidnightMarketData, MorphoMidnightParsedBook, NetworkNumber } from '../../types';
3
+ import type { MorphoMidnightBorrowQuote, MorphoMidnightPaybackQuote, MorphoMidnightPaybackUnitsQuote } from './index';
4
+ type TenorBookKey = 'asks' | 'bids';
5
+ export declare const tenorBookKeyFor: (side: MorphoMidnightBookSide) => TenorBookKey;
6
+ export declare const tenorBookRateToApyPercent: (rate: Dec.Value) => string;
7
+ interface TenorOfferCollateral {
8
+ token: string;
9
+ lltv: string | number;
10
+ liquidation_cursor: string | number;
11
+ oracle: string;
12
+ }
13
+ interface TenorOffer {
14
+ start: string | number;
15
+ group?: string;
16
+ callback?: string;
17
+ tick: string | number;
18
+ chain_id: string | number;
19
+ maturity: string | number;
20
+ buy: boolean;
21
+ maker: string;
22
+ loan_token_address: string;
23
+ callback_data?: string;
24
+ expiry: string | number;
25
+ ratifier?: string;
26
+ collaterals: TenorOfferCollateral[];
27
+ continuous_fee_cap: string | number;
28
+ enter_gate: string;
29
+ liquidator_gate: string;
30
+ max_assets: string | number;
31
+ max_units: string | number;
32
+ ratifier_data?: string;
33
+ rcf_threshold: string | number;
34
+ receiver_if_maker_is_seller?: string;
35
+ reduce_only: boolean;
36
+ }
37
+ interface TenorOfferFill {
38
+ units: string | number;
39
+ offer: TenorOffer;
40
+ }
41
+ /**
42
+ * Tenor's offer JSON is flat (market fields live on the offer). Morpho's is nested, and that nested
43
+ * shape is what the app encodes for `Midnight.take`. Map Tenor into that shape so recipes stay on one encoder.
44
+ */
45
+ export declare const tenorOfferToApiOffer: (offer: TenorOffer) => {
46
+ market: {
47
+ chain_id: string | number;
48
+ midnight: "0xAdedD8ab6dE832766Fedf0FaC4992E5C4D3EA18A";
49
+ loan_token: string;
50
+ collaterals: TenorOfferCollateral[];
51
+ maturity: string | number;
52
+ rcf_threshold: string | number;
53
+ enter_gate: string;
54
+ liquidator_gate: string;
55
+ };
56
+ buy: boolean;
57
+ maker: string;
58
+ start: string | number;
59
+ expiry: string | number;
60
+ tick: string | number;
61
+ group: string;
62
+ callback: string;
63
+ callback_data: string;
64
+ receiver_if_maker_is_seller: string;
65
+ ratifier: string;
66
+ reduce_only: boolean;
67
+ max_units: string | number;
68
+ max_assets: string | number;
69
+ continuous_fee_cap: string | number;
70
+ };
71
+ export declare const tenorOfferFillToApiFill: (fill: TenorOfferFill) => {
72
+ units: string | number;
73
+ offer: {
74
+ market: {
75
+ chain_id: string | number;
76
+ midnight: "0xAdedD8ab6dE832766Fedf0FaC4992E5C4D3EA18A";
77
+ loan_token: string;
78
+ collaterals: TenorOfferCollateral[];
79
+ maturity: string | number;
80
+ rcf_threshold: string | number;
81
+ enter_gate: string;
82
+ liquidator_gate: string;
83
+ };
84
+ buy: boolean;
85
+ maker: string;
86
+ start: string | number;
87
+ expiry: string | number;
88
+ tick: string | number;
89
+ group: string;
90
+ callback: string;
91
+ callback_data: string;
92
+ receiver_if_maker_is_seller: string;
93
+ ratifier: string;
94
+ reduce_only: boolean;
95
+ max_units: string | number;
96
+ max_assets: string | number;
97
+ continuous_fee_cap: string | number;
98
+ };
99
+ ratifier_data: string;
100
+ market_id: string;
101
+ };
102
+ interface TenorBookBucket {
103
+ rate: number | string;
104
+ liquidity: number | string;
105
+ cumulative_liquidity?: number | string;
106
+ }
107
+ interface TenorBookSidePayload {
108
+ buckets?: TenorBookBucket[];
109
+ }
110
+ interface TenorBookResponse {
111
+ asks?: TenorBookSidePayload | TenorBookBucket[];
112
+ bids?: TenorBookSidePayload | TenorBookBucket[];
113
+ }
114
+ /** The levels resting on the Tenor side a taker of `side` fills, in raw loan-token base units. */
115
+ export declare const parseTenorBookSide: (json: TenorBookResponse, side: MorphoMidnightBookSide) => {
116
+ rate: string;
117
+ liquidityRaw: string;
118
+ }[];
119
+ export declare const parseTenorOrderBook: (json: TenorBookResponse, side: MorphoMidnightBookSide, loanSymbol: string) => MorphoMidnightParsedBook | null;
120
+ export declare const getTenorMarketBook: (market: MorphoMidnightMarketData, network: NetworkNumber, side?: MorphoMidnightBookSide) => Promise<MorphoMidnightParsedBook | null>;
121
+ /**
122
+ * Tenor's router takes no slippage of its own — it prices the fill and hands back the offers. `slippagePercent`
123
+ * is therefore accepted only to keep the signature aligned with the Morpho-hosted quote that `index.ts`
124
+ * forwards to positionally; the guard comes from `rateSlippagePercent` via `midnightBoundPrice`.
125
+ */
126
+ export declare const getTenorBorrowQuote: (marketId: string, assetsRaw: string, slippagePercent: Dec.Value, maturity: number, maxBorrowRate?: Dec.Value, taker?: string, rateSlippagePercent?: Dec.Value, network?: NetworkNumber) => Promise<MorphoMidnightBorrowQuote>;
127
+ export declare const getTenorPaybackQuote: (marketId: string, assetsRaw: string, slippagePercent: Dec.Value, maturity: number, minPaybackRate?: Dec.Value, taker?: string, rateSlippagePercent?: Dec.Value, network?: NetworkNumber) => Promise<MorphoMidnightPaybackQuote>;
128
+ export declare const getTenorPaybackUnitsQuote: (marketId: string, unitsRaw: string, slippagePercent: Dec.Value, maturity: number, minPaybackRate?: Dec.Value, taker?: string, rateSlippagePercent?: Dec.Value, network?: NetworkNumber) => Promise<MorphoMidnightPaybackUnitsQuote>;
129
+ export {};
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.getTenorPaybackUnitsQuote = exports.getTenorPaybackQuote = exports.getTenorBorrowQuote = exports.getTenorMarketBook = exports.parseTenorOrderBook = exports.parseTenorBookSide = exports.tenorOfferFillToApiFill = exports.tenorOfferToApiOffer = exports.tenorBookRateToApyPercent = exports.tenorBookKeyFor = void 0;
16
+ const decimal_js_1 = __importDefault(require("decimal.js"));
17
+ const tokens_1 = require("@defisaver/tokens");
18
+ const constants_1 = require("../../constants");
19
+ const types_1 = require("../../types");
20
+ const morphoMidnight_1 = require("../../markets/morphoMidnight");
21
+ const rate_1 = require("./rate");
22
+ // Notion doc by Rajko: https://app.notion.com/p/defisaver/Tenor-API-3ba0be682adc80dfad35c81a9a4cb442
23
+ const TENOR_QUOTES_URL = 'https://router.tenor.finance/v1/quotes';
24
+ const TENOR_ORDERBOOK_URL = 'https://router.tenor.finance/v1/orderbook';
25
+ const TENOR_TIMEOUT_MS = 15000;
26
+ const TENOR_ALGORITHM = 'branch_and_bound';
27
+ const tenorQuoteError = (reason) => (reason ? `Morpho Midnight quote unavailable: ${reason}` : 'Morpho Midnight quote unavailable');
28
+ const tenorBookKeyFor = (side) => (side === 'bids' ? 'asks' : 'bids');
29
+ exports.tenorBookKeyFor = tenorBookKeyFor;
30
+ // Tenor order-book levels are annualized APR in basis points: 25 → 0.25%, 700 → 7%.
31
+ const tenorBookRateToApyPercent = (rate) => new decimal_js_1.default(rate || 0).div(100).toString();
32
+ exports.tenorBookRateToApyPercent = tenorBookRateToApyPercent;
33
+ const tenorFillPrice = (assets, units) => (new decimal_js_1.default(units).lte(0) ? '0' : new decimal_js_1.default(assets).div(units).toString());
34
+ /**
35
+ * Tenor's offer JSON is flat (market fields live on the offer). Morpho's is nested, and that nested
36
+ * shape is what the app encodes for `Midnight.take`. Map Tenor into that shape so recipes stay on one encoder.
37
+ */
38
+ const tenorOfferToApiOffer = (offer) => ({
39
+ market: {
40
+ chain_id: offer.chain_id,
41
+ midnight: morphoMidnight_1.MIDNIGHT_BASE,
42
+ loan_token: offer.loan_token_address,
43
+ collaterals: offer.collaterals || [],
44
+ maturity: offer.maturity,
45
+ rcf_threshold: offer.rcf_threshold,
46
+ enter_gate: offer.enter_gate,
47
+ liquidator_gate: offer.liquidator_gate,
48
+ },
49
+ buy: offer.buy,
50
+ maker: offer.maker,
51
+ start: offer.start,
52
+ expiry: offer.expiry,
53
+ tick: offer.tick,
54
+ group: offer.group || constants_1.ZERO_BYTES32,
55
+ callback: offer.callback || constants_1.ZERO_ADDRESS,
56
+ callback_data: offer.callback_data || '0x',
57
+ receiver_if_maker_is_seller: offer.receiver_if_maker_is_seller || constants_1.ZERO_ADDRESS,
58
+ ratifier: offer.ratifier || constants_1.ZERO_ADDRESS,
59
+ reduce_only: offer.reduce_only,
60
+ max_units: offer.max_units,
61
+ max_assets: offer.max_assets,
62
+ continuous_fee_cap: offer.continuous_fee_cap,
63
+ });
64
+ exports.tenorOfferToApiOffer = tenorOfferToApiOffer;
65
+ const tenorOfferFillToApiFill = (fill) => ({
66
+ units: fill.units,
67
+ offer: (0, exports.tenorOfferToApiOffer)(fill.offer),
68
+ ratifier_data: fill.offer.ratifier_data || '0x',
69
+ market_id: '',
70
+ });
71
+ exports.tenorOfferFillToApiFill = tenorOfferFillToApiFill;
72
+ const tenorBookBuckets = (side) => {
73
+ if (!side)
74
+ return [];
75
+ if (Array.isArray(side))
76
+ return side;
77
+ return side.buckets || [];
78
+ };
79
+ /** The levels resting on the Tenor side a taker of `side` fills, in raw loan-token base units. */
80
+ const parseTenorBookSide = (json, side) => tenorBookBuckets(json[(0, exports.tenorBookKeyFor)(side)])
81
+ .map((bucket) => ({
82
+ rate: (0, exports.tenorBookRateToApyPercent)(bucket.rate),
83
+ liquidityRaw: new decimal_js_1.default(bucket.liquidity || 0).toFixed(0),
84
+ }))
85
+ .filter((offer) => new decimal_js_1.default(offer.liquidityRaw).gt(0));
86
+ exports.parseTenorBookSide = parseTenorBookSide;
87
+ const parseTenorOrderBook = (json, side, loanSymbol) => {
88
+ const offers = (0, exports.parseTenorBookSide)(json, side).map((offer) => ({
89
+ rate: offer.rate,
90
+ liquidity: (0, tokens_1.assetAmountInEth)(offer.liquidityRaw, loanSymbol),
91
+ }));
92
+ return (0, rate_1.buildMidnightParsedBook)(offers, side);
93
+ };
94
+ exports.parseTenorOrderBook = parseTenorOrderBook;
95
+ const fetchTenorBook = (marketId, network) => __awaiter(void 0, void 0, void 0, function* () {
96
+ const res = yield fetch(`${TENOR_ORDERBOOK_URL}/${marketId}?chain_id=${network}`, { signal: AbortSignal.timeout(TENOR_TIMEOUT_MS) });
97
+ if (!res.ok)
98
+ throw new Error(`Midnight book request failed for ${marketId} (${res.status})`);
99
+ return res.json();
100
+ });
101
+ const getTenorMarketBook = (market_1, network_1, ...args_1) => __awaiter(void 0, [market_1, network_1, ...args_1], void 0, function* (market, network, side = 'bids') {
102
+ const loanSymbol = (0, tokens_1.getAssetInfoByAddress)(market.loanToken, network).symbol;
103
+ return (0, exports.parseTenorOrderBook)(yield fetchTenorBook(market.marketId, network), side, loanSymbol);
104
+ });
105
+ exports.getTenorMarketBook = getTenorMarketBook;
106
+ const tenorBookAvailableAssetsRaw = (marketId, network, side) => __awaiter(void 0, void 0, void 0, function* () {
107
+ try {
108
+ const json = yield fetchTenorBook(marketId, network);
109
+ return (0, exports.parseTenorBookSide)(json, side).reduce((sum, offer) => sum.add(offer.liquidityRaw), new decimal_js_1.default(0)).toFixed(0);
110
+ }
111
+ catch (_a) {
112
+ return '0';
113
+ }
114
+ });
115
+ const fetchTenorQuote = (_a) => __awaiter(void 0, [_a], void 0, function* ({ marketId, side, assets, units, taker, network = types_1.NetworkNumber.Base, }) {
116
+ var _b;
117
+ const hasAssets = assets !== undefined && assets !== null;
118
+ const hasUnits = units !== undefined && units !== null;
119
+ if (hasAssets === hasUnits) {
120
+ throw new Error(tenorQuoteError('Either assets or units must be provided'));
121
+ }
122
+ if (side !== 'asks' && side !== 'bids') {
123
+ throw new Error(tenorQuoteError(`Unsupported Tenor quote side: ${side}`));
124
+ }
125
+ const isBuy = side === 'asks';
126
+ const amount = (hasAssets ? assets : units);
127
+ const res = yield fetch(TENOR_QUOTES_URL, {
128
+ method: 'POST',
129
+ headers: { 'Content-Type': 'application/json' },
130
+ body: JSON.stringify({
131
+ market_hashes: [marketId],
132
+ amount,
133
+ chain_id: network,
134
+ is_buy: isBuy,
135
+ is_exact_in: hasAssets ? isBuy : !isBuy,
136
+ limit_rate: null,
137
+ valid_for: null,
138
+ algorithm: TENOR_ALGORITHM,
139
+ allow_partial: false,
140
+ taker: taker || constants_1.ZERO_ADDRESS,
141
+ }),
142
+ signal: AbortSignal.timeout(TENOR_TIMEOUT_MS),
143
+ });
144
+ const result = yield res.json().catch(() => ({}));
145
+ if (!res.ok) {
146
+ throw new Error(tenorQuoteError(result.error || result.message || `Tenor quote request failed with status ${res.status}`));
147
+ }
148
+ const payload = ((_b = result.quotes) === null || _b === void 0 ? void 0 : _b[0]) || result;
149
+ const quotedUnits = new decimal_js_1.default(payload.units || result.units || 0);
150
+ const offers = payload.offers || result.offers || [];
151
+ // A book that can't fill the size comes back 200 with everything zeroed rather than as an error.
152
+ if (quotedUnits.lte(0) || offers.length === 0) {
153
+ throw new Error(tenorQuoteError('INSUFFICIENT_LIQUIDITY'));
154
+ }
155
+ return {
156
+ units: quotedUnits.toFixed(0),
157
+ buyerAssets: (payload.buyer_assets || result.buyer_assets || '0').toString(),
158
+ offerFills: offers.map(exports.tenorOfferFillToApiFill),
159
+ };
160
+ });
161
+ const TENOR_NO_AVAILABLE_UNITS = '0';
162
+ /**
163
+ * Tenor's router takes no slippage of its own — it prices the fill and hands back the offers. `slippagePercent`
164
+ * is therefore accepted only to keep the signature aligned with the Morpho-hosted quote that `index.ts`
165
+ * forwards to positionally; the guard comes from `rateSlippagePercent` via `midnightBoundPrice`.
166
+ */
167
+ const getTenorBorrowQuote = (marketId_1, assetsRaw_1, slippagePercent_1, maturity_1, maxBorrowRate_1, taker_1, rateSlippagePercent_1, ...args_1) => __awaiter(void 0, [marketId_1, assetsRaw_1, slippagePercent_1, maturity_1, maxBorrowRate_1, taker_1, rateSlippagePercent_1, ...args_1], void 0, function* (marketId, assetsRaw, slippagePercent, maturity, maxBorrowRate, taker, rateSlippagePercent, network = types_1.NetworkNumber.Base) {
168
+ if (!(0, morphoMidnight_1.isTenorMidnightMarket)(marketId)) {
169
+ throw new Error(tenorQuoteError(`Not a Tenor Midnight market: ${marketId}`));
170
+ }
171
+ const [quote, availableAssets] = yield Promise.all([
172
+ fetchTenorQuote({
173
+ marketId, side: 'bids', assets: assetsRaw, taker, network,
174
+ }),
175
+ tenorBookAvailableAssetsRaw(marketId, network, 'bids'),
176
+ ]);
177
+ const ttmDays = (0, rate_1.midnightTimeToMaturityDays)(maturity);
178
+ const bestPrice = tenorFillPrice(assetsRaw, quote.units);
179
+ const estBorrowRate = (0, rate_1.midnightApyFromPrice)(bestPrice, ttmDays);
180
+ const capPrice = (0, rate_1.midnightBoundPrice)(estBorrowRate, ttmDays, 'ceiling', maxBorrowRate, rateSlippagePercent);
181
+ const maxRate = (0, rate_1.midnightApyFromPrice)(capPrice, ttmDays);
182
+ const maxUnits = new decimal_js_1.default(capPrice).lte(0) ? '0' : new decimal_js_1.default(assetsRaw).div(capPrice).toFixed(0);
183
+ return {
184
+ bestPrice,
185
+ worstPrice: capPrice,
186
+ estBorrowRate,
187
+ maxRate,
188
+ newUnits: quote.units,
189
+ maxUnits,
190
+ availableAssets,
191
+ availableUnits: TENOR_NO_AVAILABLE_UNITS,
192
+ takeableOffers: quote.offerFills,
193
+ };
194
+ });
195
+ exports.getTenorBorrowQuote = getTenorBorrowQuote;
196
+ const getTenorPaybackQuote = (marketId_1, assetsRaw_1, slippagePercent_1, maturity_1, minPaybackRate_1, taker_1, rateSlippagePercent_1, ...args_1) => __awaiter(void 0, [marketId_1, assetsRaw_1, slippagePercent_1, maturity_1, minPaybackRate_1, taker_1, rateSlippagePercent_1, ...args_1], void 0, function* (marketId, assetsRaw, slippagePercent, maturity, minPaybackRate, taker, rateSlippagePercent, network = types_1.NetworkNumber.Base) {
197
+ if (!(0, morphoMidnight_1.isTenorMidnightMarket)(marketId)) {
198
+ throw new Error(tenorQuoteError(`Not a Tenor Midnight market: ${marketId}`));
199
+ }
200
+ const [quote, availableAssets] = yield Promise.all([
201
+ fetchTenorQuote({
202
+ marketId, side: 'asks', assets: assetsRaw, taker, network,
203
+ }),
204
+ tenorBookAvailableAssetsRaw(marketId, network, 'asks'),
205
+ ]);
206
+ const ttmDays = (0, rate_1.midnightTimeToMaturityDays)(maturity);
207
+ const bestPrice = tenorFillPrice(assetsRaw, quote.units);
208
+ const estPaybackRate = (0, rate_1.midnightApyFromPrice)(bestPrice, ttmDays);
209
+ const capPrice = (0, rate_1.midnightBoundPrice)(estPaybackRate, ttmDays, 'floor', minPaybackRate, rateSlippagePercent);
210
+ const minRate = (0, rate_1.midnightApyFromPrice)(capPrice, ttmDays);
211
+ const minUnits = new decimal_js_1.default(capPrice).lte(0) ? '0' : new decimal_js_1.default(assetsRaw).div(capPrice).toFixed(0, decimal_js_1.default.ROUND_DOWN);
212
+ return {
213
+ bestPrice,
214
+ worstPrice: capPrice,
215
+ estPaybackRate,
216
+ minRate,
217
+ newUnits: quote.units,
218
+ minUnits,
219
+ availableAssets,
220
+ availableUnits: TENOR_NO_AVAILABLE_UNITS,
221
+ takeableOffers: quote.offerFills,
222
+ };
223
+ });
224
+ exports.getTenorPaybackQuote = getTenorPaybackQuote;
225
+ const getTenorPaybackUnitsQuote = (marketId_1, unitsRaw_1, slippagePercent_1, maturity_1, minPaybackRate_1, taker_1, rateSlippagePercent_1, ...args_1) => __awaiter(void 0, [marketId_1, unitsRaw_1, slippagePercent_1, maturity_1, minPaybackRate_1, taker_1, rateSlippagePercent_1, ...args_1], void 0, function* (marketId, unitsRaw, slippagePercent, maturity, minPaybackRate, taker, rateSlippagePercent, network = types_1.NetworkNumber.Base) {
226
+ if (!(0, morphoMidnight_1.isTenorMidnightMarket)(marketId)) {
227
+ throw new Error(tenorQuoteError(`Not a Tenor Midnight market: ${marketId}`));
228
+ }
229
+ const [quote, availableAssets] = yield Promise.all([
230
+ fetchTenorQuote({
231
+ marketId, side: 'asks', units: unitsRaw, taker, network,
232
+ }),
233
+ tenorBookAvailableAssetsRaw(marketId, network, 'asks'),
234
+ ]);
235
+ const ttmDays = (0, rate_1.midnightTimeToMaturityDays)(maturity);
236
+ const newAssets = quote.buyerAssets;
237
+ const bestPrice = tenorFillPrice(newAssets, unitsRaw);
238
+ const estPaybackRate = (0, rate_1.midnightApyFromPrice)(bestPrice, ttmDays);
239
+ const capPrice = (0, rate_1.midnightBoundPrice)(estPaybackRate, ttmDays, 'floor', minPaybackRate, rateSlippagePercent);
240
+ const minRate = (0, rate_1.midnightApyFromPrice)(capPrice, ttmDays);
241
+ const maxAssets = new decimal_js_1.default(unitsRaw).mul(capPrice).toFixed(0, decimal_js_1.default.ROUND_UP);
242
+ return {
243
+ bestPrice,
244
+ worstPrice: capPrice,
245
+ estPaybackRate,
246
+ minRate,
247
+ newAssets,
248
+ maxAssets,
249
+ availableAssets,
250
+ availableUnits: TENOR_NO_AVAILABLE_UNITS,
251
+ takeableOffers: quote.offerFills,
252
+ };
253
+ });
254
+ exports.getTenorPaybackUnitsQuote = getTenorPaybackUnitsQuote;
package/cjs/index.d.ts CHANGED
@@ -16,9 +16,10 @@ import * as markets from './markets';
16
16
  import * as helpers from './helpers';
17
17
  import * as exchange from './exchange';
18
18
  import * as morphoBlue from './morphoBlue';
19
+ import * as morphoMidnight from './morphoMidnight';
19
20
  import * as llamaLend from './llamaLend';
20
21
  import * as portfolio from './portfolio';
21
22
  import * as claiming from './claiming';
22
23
  import * as savings from './savings';
23
24
  export * from './types';
24
- export { aaveV2, aaveV3, aaveV4, compoundV2, compoundV3, spark, curveUsd, liquity, liquityV2, maker, exchange, staking, moneymarket, markets, helpers, morphoBlue, llamaLend, fluid, portfolio, claiming, savings, };
25
+ export { aaveV2, aaveV3, aaveV4, compoundV2, compoundV3, spark, curveUsd, liquity, liquityV2, maker, exchange, staking, moneymarket, markets, helpers, morphoBlue, morphoMidnight, llamaLend, fluid, portfolio, claiming, savings, };
package/cjs/index.js CHANGED
@@ -36,7 +36,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
36
36
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.savings = exports.claiming = exports.portfolio = exports.fluid = exports.llamaLend = exports.morphoBlue = exports.helpers = exports.markets = exports.moneymarket = exports.staking = exports.exchange = exports.maker = exports.liquityV2 = exports.liquity = exports.curveUsd = exports.spark = exports.compoundV3 = exports.compoundV2 = exports.aaveV4 = exports.aaveV3 = exports.aaveV2 = void 0;
39
+ exports.savings = exports.claiming = exports.portfolio = exports.fluid = exports.llamaLend = exports.morphoMidnight = exports.morphoBlue = exports.helpers = exports.markets = exports.moneymarket = exports.staking = exports.exchange = exports.maker = exports.liquityV2 = exports.liquity = exports.curveUsd = exports.spark = exports.compoundV3 = exports.compoundV2 = exports.aaveV4 = exports.aaveV3 = exports.aaveV2 = void 0;
40
40
  require("./setup");
41
41
  const fluid = __importStar(require("./fluid"));
42
42
  exports.fluid = fluid;
@@ -72,6 +72,8 @@ const exchange = __importStar(require("./exchange"));
72
72
  exports.exchange = exchange;
73
73
  const morphoBlue = __importStar(require("./morphoBlue"));
74
74
  exports.morphoBlue = morphoBlue;
75
+ const morphoMidnight = __importStar(require("./morphoMidnight"));
76
+ exports.morphoMidnight = morphoMidnight;
75
77
  const llamaLend = __importStar(require("./llamaLend"));
76
78
  exports.llamaLend = llamaLend;
77
79
  const portfolio = __importStar(require("./portfolio"));
@@ -3,6 +3,7 @@ export { CompoundMarkets, compoundV2CollateralAssets, v3ETHCollAssets, v3USDbCCo
3
3
  export { SparkMarkets } from './spark';
4
4
  export { CrvUsdMarkets } from './curveUsd';
5
5
  export { MorphoBlueMarkets, findMorphoBlueMarket } from './morphoBlue';
6
+ export { MorphoMidnightMarkets, findMorphoMidnightMarket, isTenorMidnightMarket, morphoMidnightMarketCollateralParams, } from './morphoMidnight';
6
7
  export { LlamaLendMarkets } from './llamaLend';
7
8
  export { LiquityV2Markets, findLiquityV2MarketByAddress } from './liquityV2';
8
9
  export { FluidMarkets, getFluidVersionsDataForNetwork, getFluidMarketInfoById, getFTokenAddress, getFluidMarketInfoByAddress, } from './fluid';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.findAaveV4SpokeByAddress = exports.AaveV4Spokes = exports.getFluidMarketInfoByAddress = exports.getFTokenAddress = exports.getFluidMarketInfoById = exports.getFluidVersionsDataForNetwork = exports.FluidMarkets = exports.findLiquityV2MarketByAddress = exports.LiquityV2Markets = exports.LlamaLendMarkets = exports.findMorphoBlueMarket = exports.MorphoBlueMarkets = exports.CrvUsdMarkets = exports.SparkMarkets = exports.v3USDTCollAssets = exports.v3USDCeCollAssets = exports.v3USDCCollAssets = exports.v3USDbCCollAssets = exports.v3ETHCollAssets = exports.compoundV2CollateralAssets = exports.CompoundMarkets = exports.getAaveV3MarketByMarketAddress = exports.aaveV3AssetsDefaultMarket = exports.aaveV2AssetsDefaultMarket = exports.aaveV1AssetsDefaultMarket = exports.AaveMarkets = void 0;
3
+ exports.findAaveV4SpokeByAddress = exports.AaveV4Spokes = exports.getFluidMarketInfoByAddress = exports.getFTokenAddress = exports.getFluidMarketInfoById = exports.getFluidVersionsDataForNetwork = exports.FluidMarkets = exports.findLiquityV2MarketByAddress = exports.LiquityV2Markets = exports.LlamaLendMarkets = exports.morphoMidnightMarketCollateralParams = exports.isTenorMidnightMarket = exports.findMorphoMidnightMarket = exports.MorphoMidnightMarkets = exports.findMorphoBlueMarket = exports.MorphoBlueMarkets = exports.CrvUsdMarkets = exports.SparkMarkets = exports.v3USDTCollAssets = exports.v3USDCeCollAssets = exports.v3USDCCollAssets = exports.v3USDbCCollAssets = exports.v3ETHCollAssets = exports.compoundV2CollateralAssets = exports.CompoundMarkets = exports.getAaveV3MarketByMarketAddress = exports.aaveV3AssetsDefaultMarket = exports.aaveV2AssetsDefaultMarket = exports.aaveV1AssetsDefaultMarket = exports.AaveMarkets = void 0;
4
4
  var aave_1 = require("./aave");
5
5
  Object.defineProperty(exports, "AaveMarkets", { enumerable: true, get: function () { return aave_1.AaveMarkets; } });
6
6
  Object.defineProperty(exports, "aaveV1AssetsDefaultMarket", { enumerable: true, get: function () { return aave_1.aaveV1AssetsDefaultMarket; } });
@@ -22,6 +22,11 @@ Object.defineProperty(exports, "CrvUsdMarkets", { enumerable: true, get: functio
22
22
  var morphoBlue_1 = require("./morphoBlue");
23
23
  Object.defineProperty(exports, "MorphoBlueMarkets", { enumerable: true, get: function () { return morphoBlue_1.MorphoBlueMarkets; } });
24
24
  Object.defineProperty(exports, "findMorphoBlueMarket", { enumerable: true, get: function () { return morphoBlue_1.findMorphoBlueMarket; } });
25
+ var morphoMidnight_1 = require("./morphoMidnight");
26
+ Object.defineProperty(exports, "MorphoMidnightMarkets", { enumerable: true, get: function () { return morphoMidnight_1.MorphoMidnightMarkets; } });
27
+ Object.defineProperty(exports, "findMorphoMidnightMarket", { enumerable: true, get: function () { return morphoMidnight_1.findMorphoMidnightMarket; } });
28
+ Object.defineProperty(exports, "isTenorMidnightMarket", { enumerable: true, get: function () { return morphoMidnight_1.isTenorMidnightMarket; } });
29
+ Object.defineProperty(exports, "morphoMidnightMarketCollateralParams", { enumerable: true, get: function () { return morphoMidnight_1.morphoMidnightMarketCollateralParams; } });
25
30
  var llamaLend_1 = require("./llamaLend");
26
31
  Object.defineProperty(exports, "LlamaLendMarkets", { enumerable: true, get: function () { return llamaLend_1.LlamaLendMarkets; } });
27
32
  var liquityV2_1 = require("./liquityV2");
@@ -0,0 +1,60 @@
1
+ import { MorphoMidnightCollateralParams, MorphoMidnightMarketData, NetworkNumber } from '../../types';
2
+ /**
3
+ * Morpho Midnight core contract on Base. Every Midnight market trades against this one, whoever curates
4
+ * its order book — it is part of the market struct the id is hashed from, and it is what offer tuples
5
+ * encode for `Midnight.take`.
6
+ */
7
+ export declare const MIDNIGHT_BASE: "0xAdedD8ab6dE832766Fedf0FaC4992E5C4D3EA18A";
8
+ export declare const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260731: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
9
+ export declare const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260828: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
10
+ export declare const MORPHO_MIDNIGHT_CBBTC_USDC_860_20260925: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
11
+ export declare const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261030: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
12
+ export declare const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261127: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
13
+ export declare const MORPHO_MIDNIGHT_CBBTC_USDC_860_20261225: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
14
+ export declare const MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20260827: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
15
+ export declare const MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20260924: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
16
+ export declare const MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20261022: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
17
+ export declare const MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20261119: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
18
+ export declare const MORPHO_MIDNIGHT_TENOR_CBBTC_USDC_860_20261217: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
19
+ export declare const MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20260827: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
20
+ export declare const MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20260924: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
21
+ export declare const MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20261022: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
22
+ export declare const MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20261119: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
23
+ export declare const MORPHO_MIDNIGHT_TENOR_WETH_USDC_860_20261217: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
24
+ export declare const MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20260827: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
25
+ export declare const MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20260924: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
26
+ export declare const MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20261022: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
27
+ export declare const MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20261119: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
28
+ export declare const MORPHO_MIDNIGHT_TENOR_CBETH_WETH_945_20261217: (networkId?: NetworkNumber) => MorphoMidnightMarketData;
29
+ export declare const MorphoMidnightMarkets: (networkId: NetworkNumber) => {
30
+ readonly morphomidnightcbbtcusdc_860_20260731_base: MorphoMidnightMarketData;
31
+ readonly morphomidnightcbbtcusdc_860_20260828_base: MorphoMidnightMarketData;
32
+ readonly morphomidnightcbbtcusdc_860_20260925_base: MorphoMidnightMarketData;
33
+ readonly morphomidnightcbbtcusdc_860_20261030_base: MorphoMidnightMarketData;
34
+ readonly morphomidnightcbbtcusdc_860_20261127_base: MorphoMidnightMarketData;
35
+ readonly morphomidnightcbbtcusdc_860_20261225_base: MorphoMidnightMarketData;
36
+ readonly morphomidnighttenorcbbtcusdc_20260827_base: MorphoMidnightMarketData;
37
+ readonly morphomidnighttenorcbbtcusdc_20260924_base: MorphoMidnightMarketData;
38
+ readonly morphomidnighttenorcbbtcusdc_20261022_base: MorphoMidnightMarketData;
39
+ readonly morphomidnighttenorcbbtcusdc_20261119_base: MorphoMidnightMarketData;
40
+ readonly morphomidnighttenorcbbtcusdc_20261217_base: MorphoMidnightMarketData;
41
+ readonly morphomidnighttenorwethusdc_20260827_base: MorphoMidnightMarketData;
42
+ readonly morphomidnighttenorwethusdc_20260924_base: MorphoMidnightMarketData;
43
+ readonly morphomidnighttenorwethusdc_20261022_base: MorphoMidnightMarketData;
44
+ readonly morphomidnighttenorwethusdc_20261119_base: MorphoMidnightMarketData;
45
+ readonly morphomidnighttenorwethusdc_20261217_base: MorphoMidnightMarketData;
46
+ readonly morphomidnighttenorcbethweth_20260827_base: MorphoMidnightMarketData;
47
+ readonly morphomidnighttenorcbethweth_20260924_base: MorphoMidnightMarketData;
48
+ readonly morphomidnighttenorcbethweth_20261022_base: MorphoMidnightMarketData;
49
+ readonly morphomidnighttenorcbethweth_20261119_base: MorphoMidnightMarketData;
50
+ readonly morphomidnighttenorcbethweth_20261217_base: MorphoMidnightMarketData;
51
+ };
52
+ export declare const isTenorMidnightMarket: (market: Pick<MorphoMidnightMarketData, "curator"> | string) => boolean;
53
+ export declare const findMorphoMidnightMarket: (marketId: string, network?: NetworkNumber) => MorphoMidnightMarketData | undefined;
54
+ /**
55
+ * The market's collateral set as the chain knows it: the listed collaterals followed by the curator's
56
+ * hidden ones. This — not `collaterals` — is what a `Market` struct takes, since the market id is the hash
57
+ * of that struct. Anything assembling one for a contract call goes through here so it can't quietly build
58
+ * a market of its own instead.
59
+ */
60
+ export declare const morphoMidnightMarketCollateralParams: (market: Pick<MorphoMidnightMarketData, "collaterals" | "hiddenCollaterals">) => MorphoMidnightCollateralParams[];