@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,261 @@
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.getMorphoMidnightAccountBalances = exports._getMorphoMidnightAccountBalances = void 0;
16
+ exports._getMorphoMidnightMarketData = _getMorphoMidnightMarketData;
17
+ exports.getMorphoMidnightMarketData = getMorphoMidnightMarketData;
18
+ exports._getMorphoMidnightAccountData = _getMorphoMidnightAccountData;
19
+ exports.getMorphoMidnightAccountData = getMorphoMidnightAccountData;
20
+ exports.getMorphoMidnightEarn = getMorphoMidnightEarn;
21
+ const decimal_js_1 = __importDefault(require("decimal.js"));
22
+ const tokens_1 = require("@defisaver/tokens");
23
+ const common_1 = require("../types/common");
24
+ const contracts_1 = require("../contracts");
25
+ const types_1 = require("../types");
26
+ const constants_1 = require("../constants");
27
+ const staking_1 = require("../staking");
28
+ const utils_1 = require("../services/utils");
29
+ const morphoMidnightHelpers_1 = require("../helpers/morphoMidnightHelpers");
30
+ const priceService_1 = require("../services/priceService");
31
+ const viem_1 = require("../services/viem");
32
+ const HARDCODED_USD_STABLE_PRICE = '100000000'; // $1 with 8 decimals
33
+ const nowInSeconds = () => Math.floor(Date.now() / 1000);
34
+ function _getMorphoMidnightMarketData(provider, network, selectedMarket) {
35
+ return __awaiter(this, void 0, void 0, function* () {
36
+ const { loanToken, collaterals, marketId } = selectedMarket;
37
+ const loanTokenInfo = (0, tokens_1.getAssetInfoByAddress)(loanToken, network);
38
+ const loanSym = (0, utils_1.wethToEth)(loanTokenInfo.symbol);
39
+ const loanTokenFeedAddress = (0, priceService_1.getChainlinkAssetAddress)(loanTokenInfo.symbol, network);
40
+ const viewContract = (0, contracts_1.MorphoMidnightViewContractViem)(provider, network);
41
+ const isHardcodedUsdStable = ['USDA', 'RLUSD'].includes(loanTokenInfo.symbol);
42
+ let marketInfo;
43
+ let loanTokenPrice;
44
+ if ((0, utils_1.isMainnetNetwork)(network)) {
45
+ const feedRegistryContract = (0, contracts_1.FeedRegistryContractViem)(provider, common_1.NetworkNumber.Eth);
46
+ const [_loanTokenPrice, _marketInfo] = yield Promise.all([
47
+ isHardcodedUsdStable ? Promise.resolve(HARDCODED_USD_STABLE_PRICE) : feedRegistryContract.read.latestAnswer([loanTokenFeedAddress, constants_1.USD_QUOTE]),
48
+ viewContract.read.getMarketInfo([marketId]),
49
+ ]);
50
+ marketInfo = _marketInfo;
51
+ loanTokenPrice = _loanTokenPrice;
52
+ }
53
+ else {
54
+ // Currently only Base is supported
55
+ const feedRegistryContract = (0, contracts_1.DFSFeedRegistryContractViem)(provider, network);
56
+ const [loanTokenPriceRound, _marketInfo] = yield Promise.all([
57
+ isHardcodedUsdStable ? Promise.resolve([0, HARDCODED_USD_STABLE_PRICE]) : feedRegistryContract.read.latestRoundData([loanTokenFeedAddress, constants_1.USD_QUOTE]),
58
+ viewContract.read.getMarketInfo([marketId]),
59
+ ]);
60
+ marketInfo = _marketInfo;
61
+ loanTokenPrice = loanTokenPriceRound[1].toString();
62
+ }
63
+ const loanTokenUsd = new decimal_js_1.default(loanTokenPrice).div(1e8).toString();
64
+ const totalUnits = marketInfo.totalUnits.toString();
65
+ const withdrawable = marketInfo.withdrawable.toString();
66
+ const totalDebt = decimal_js_1.default.max(new decimal_js_1.default(totalUnits).sub(withdrawable), 0).toString();
67
+ const assetsData = {};
68
+ assetsData[loanSym] = {
69
+ symbol: loanSym,
70
+ address: loanToken,
71
+ price: loanTokenUsd,
72
+ supplyRate: '0', // fixed rate is orderbook-derived, not exposed on-chain (MVP)
73
+ borrowRate: '0',
74
+ totalSupply: (0, tokens_1.assetAmountInEth)(totalUnits, loanSym),
75
+ totalBorrow: (0, tokens_1.assetAmountInEth)(totalDebt, loanSym),
76
+ canBeSupplied: false,
77
+ canBeBorrowed: true,
78
+ supplyIncentives: [],
79
+ borrowIncentives: [],
80
+ };
81
+ const collateralSymbols = [];
82
+ collaterals.forEach((coll, i) => {
83
+ const collInfo = (0, tokens_1.getAssetInfoByAddress)(coll.token, network);
84
+ const collSym = (0, utils_1.wethToEth)(collInfo.symbol);
85
+ collateralSymbols.push(collSym);
86
+ // Oracle price is returned in loan-token terms, scaled by 10^(36 + loanDec - collDec)
87
+ const scale = new decimal_js_1.default(10).pow(new decimal_js_1.default(36).add(loanTokenInfo.decimals).sub(collInfo.decimals).toString()).toString();
88
+ const rawPrice = marketInfo.prices[i] ? marketInfo.prices[i].toString() : '0';
89
+ const oracleRate = new decimal_js_1.default(rawPrice).div(scale).toString();
90
+ assetsData[collSym] = {
91
+ symbol: collSym,
92
+ address: coll.token,
93
+ price: new decimal_js_1.default(loanTokenUsd).mul(oracleRate).toString(),
94
+ supplyRate: '0',
95
+ borrowRate: '0',
96
+ lltv: new decimal_js_1.default(coll.lltv).toString(),
97
+ canBeSupplied: true,
98
+ canBeBorrowed: false,
99
+ supplyIncentives: [],
100
+ borrowIncentives: [],
101
+ };
102
+ });
103
+ const utillization = new decimal_js_1.default(totalUnits).eq(0) ? '0' : new decimal_js_1.default(totalDebt).div(totalUnits).mul(100).toString();
104
+ return {
105
+ id: marketInfo.id,
106
+ loanToken: loanSym,
107
+ collaterals: collateralSymbols,
108
+ maturity: selectedMarket.maturity,
109
+ isMatured: nowInSeconds() >= selectedMarket.maturity,
110
+ totalUnits: (0, tokens_1.assetAmountInEth)(totalUnits, loanSym),
111
+ withdrawable: (0, tokens_1.assetAmountInEth)(withdrawable, loanSym),
112
+ totalDebt: (0, tokens_1.assetAmountInEth)(totalDebt, loanSym),
113
+ lossFactor: marketInfo.lossFactor.toString(),
114
+ tickSpacing: marketInfo.tickSpacing,
115
+ utillization,
116
+ assetsData,
117
+ };
118
+ });
119
+ }
120
+ function getMorphoMidnightMarketData(provider, network, selectedMarket) {
121
+ return __awaiter(this, void 0, void 0, function* () {
122
+ return _getMorphoMidnightMarketData((0, viem_1.getViemProvider)(provider, network), network, selectedMarket);
123
+ });
124
+ }
125
+ function _getMorphoMidnightAccountData(provider, network, account, selectedMarket, marketInfo) {
126
+ return __awaiter(this, void 0, void 0, function* () {
127
+ const { marketId, collaterals } = selectedMarket;
128
+ const viewContract = (0, contracts_1.MorphoMidnightViewContractViem)(provider, network);
129
+ const positionInfo = yield viewContract.read.getPositionInfo([marketId, account]);
130
+ const usedAssets = {};
131
+ const loanTokenData = marketInfo.assetsData[marketInfo.loanToken];
132
+ const credit = (0, tokens_1.assetAmountInEth)(positionInfo.credit.toString(), marketInfo.loanToken);
133
+ const debt = (0, tokens_1.assetAmountInEth)(positionInfo.debt.toString(), marketInfo.loanToken);
134
+ // A user holds either credit (lender) or debt (borrower) in a market, never both.
135
+ usedAssets[marketInfo.loanToken] = {
136
+ symbol: marketInfo.loanToken,
137
+ supplied: credit,
138
+ borrowed: debt,
139
+ isSupplied: new decimal_js_1.default(positionInfo.credit.toString()).gt(0),
140
+ isBorrowed: new decimal_js_1.default(positionInfo.debt.toString()).gt(0),
141
+ collateral: false,
142
+ suppliedUsd: new decimal_js_1.default(credit).mul(loanTokenData.price).toString(),
143
+ borrowedUsd: new decimal_js_1.default(debt).mul(loanTokenData.price).toString(),
144
+ };
145
+ // positionInfo.collateral is index-aligned with the market's collateral set (0 where unused).
146
+ collaterals.forEach((coll, i) => {
147
+ const collInfo = (0, tokens_1.getAssetInfoByAddress)(coll.token, network);
148
+ const collSym = (0, utils_1.wethToEth)(collInfo.symbol);
149
+ const rawAmount = positionInfo.collateral[i] ? positionInfo.collateral[i].toString() : '0';
150
+ const supplied = (0, tokens_1.assetAmountInEth)(rawAmount, collSym);
151
+ const collData = marketInfo.assetsData[collSym];
152
+ usedAssets[collSym] = {
153
+ symbol: collSym,
154
+ supplied,
155
+ borrowed: '0',
156
+ isSupplied: new decimal_js_1.default(rawAmount).gt(0),
157
+ isBorrowed: false,
158
+ collateral: true,
159
+ suppliedUsd: new decimal_js_1.default(supplied).mul((collData === null || collData === void 0 ? void 0 : collData.price) || 0).toString(),
160
+ borrowedUsd: '0',
161
+ };
162
+ });
163
+ // Enrich borrower positions with the orderbook-derived rate + principal/interest split (off-chain).
164
+ // MidnightView only stores `debt` (= face value at maturity), so we default to full-debt-as-principal and
165
+ // override from the transactions API when available. Never throw here — the position must still render.
166
+ let borrowRate = '0';
167
+ let debtBase = debt; // fallback: treat the full on-chain debt as principal until fill history is known
168
+ let debtInterest = '0';
169
+ let borrowInfoStatus = types_1.MorphoMidnightBorrowInfoStatus.Available;
170
+ let assetsDataForApy = marketInfo.assetsData;
171
+ if (new decimal_js_1.default(positionInfo.debt.toString()).gt(0)) {
172
+ try {
173
+ // Curator-agnostic: `/users/:account/positions` is indexed off the Midnight singleton, so it carries
174
+ // Tenor-curated markets too. Only the *book* differs by curator, and that is quoted elsewhere.
175
+ const borrowInfo = yield (0, morphoMidnightHelpers_1.getMorphoMidnightUserBorrowInfo)(account, marketId, marketInfo.loanToken);
176
+ if (new decimal_js_1.default(borrowInfo.debtTotal).gt(0)) {
177
+ borrowRate = borrowInfo.borrowRate;
178
+ debtBase = borrowInfo.debtBase;
179
+ debtInterest = borrowInfo.debtInterest;
180
+ usedAssets[marketInfo.loanToken].borrowRate = borrowRate;
181
+ // Reflect the real borrow cost in netApy without mutating the shared marketInfo.assetsData.
182
+ assetsDataForApy = Object.assign(Object.assign({}, marketInfo.assetsData), { [marketInfo.loanToken]: Object.assign(Object.assign({}, loanTokenData), { borrowRate }) });
183
+ const describesChainDebt = new decimal_js_1.default(borrowInfo.debtTotal).eq(debt);
184
+ const ratePriced = new decimal_js_1.default(borrowRate).gt(0) || new decimal_js_1.default(debtInterest).lte(0);
185
+ borrowInfoStatus = describesChainDebt && ratePriced
186
+ ? types_1.MorphoMidnightBorrowInfoStatus.Available
187
+ : types_1.MorphoMidnightBorrowInfoStatus.Pending;
188
+ }
189
+ else {
190
+ // No entry for the position: the API does not know it yet, rather than it having no principal.
191
+ borrowInfoStatus = types_1.MorphoMidnightBorrowInfoStatus.Pending;
192
+ }
193
+ }
194
+ catch (err) {
195
+ // Positions API unreachable — the fallback above still renders, and the next call may succeed.
196
+ borrowInfoStatus = types_1.MorphoMidnightBorrowInfoStatus.Pending;
197
+ }
198
+ }
199
+ return Object.assign({ usedAssets,
200
+ credit,
201
+ debt,
202
+ borrowRate,
203
+ debtBase,
204
+ debtInterest,
205
+ borrowInfoStatus, maturity: marketInfo.maturity, isMatured: marketInfo.isMatured }, (0, morphoMidnightHelpers_1.getMorphoMidnightAggregatedPositionData)({ usedAssets, assetsData: assetsDataForApy, marketInfo }));
206
+ });
207
+ }
208
+ function getMorphoMidnightAccountData(provider, network, account, selectedMarket, marketInfo) {
209
+ return __awaiter(this, void 0, void 0, function* () {
210
+ return _getMorphoMidnightAccountData((0, viem_1.getViemProvider)(provider, network), network, account, selectedMarket, marketInfo);
211
+ });
212
+ }
213
+ const _getMorphoMidnightAccountBalances = (provider, network, block, addressMapping, address, selectedMarket) => __awaiter(void 0, void 0, void 0, function* () {
214
+ const balances = { collateral: {}, debt: {} };
215
+ if (!address)
216
+ return balances;
217
+ const { marketId, loanToken, collaterals } = selectedMarket;
218
+ const viewContract = (0, contracts_1.MorphoMidnightViewContractViem)(provider, network, block);
219
+ const positionInfo = yield viewContract.read.getPositionInfo([marketId, address], (0, viem_1.setViemBlockNumber)(block));
220
+ const loanTokenInfo = (0, tokens_1.getAssetInfoByAddress)(loanToken, network);
221
+ balances.debt = {
222
+ [addressMapping ? loanTokenInfo.address.toLowerCase() : (0, utils_1.wethToEth)(loanTokenInfo.symbol)]: (0, tokens_1.assetAmountInEth)(positionInfo.debt.toString(), (0, utils_1.wethToEth)(loanTokenInfo.symbol)),
223
+ };
224
+ const collateral = {};
225
+ collaterals.forEach((coll, i) => {
226
+ const collInfo = (0, tokens_1.getAssetInfoByAddress)(coll.token, network);
227
+ const rawAmount = positionInfo.collateral[i] ? positionInfo.collateral[i].toString() : '0';
228
+ collateral[addressMapping ? collInfo.address.toLowerCase() : (0, utils_1.wethToEth)(collInfo.symbol)] = (0, tokens_1.assetAmountInEth)(rawAmount, (0, utils_1.wethToEth)(collInfo.symbol));
229
+ });
230
+ balances.collateral = collateral;
231
+ return balances;
232
+ });
233
+ exports._getMorphoMidnightAccountBalances = _getMorphoMidnightAccountBalances;
234
+ const getMorphoMidnightAccountBalances = (provider, network, block, addressMapping, address, selectedMarket) => __awaiter(void 0, void 0, void 0, function* () { return (0, exports._getMorphoMidnightAccountBalances)((0, viem_1.getViemProvider)(provider, network), network, block, addressMapping, address, selectedMarket); });
235
+ exports.getMorphoMidnightAccountBalances = getMorphoMidnightAccountBalances;
236
+ // Lender-side (credit-only) supply position, mirroring getMorphoEarn. `amount` is the credit face value
237
+ // redeemable at maturity; `apy` is '0' in MVP because the fixed yield is orderbook-derived, not on-chain.
238
+ function getMorphoMidnightEarn(provider, network, account, selectedMarket, marketInfo) {
239
+ return __awaiter(this, void 0, void 0, function* () {
240
+ const { marketId } = selectedMarket;
241
+ const viewContract = (0, contracts_1.MorphoMidnightViewContractViem)(provider, network);
242
+ const positionInfo = yield viewContract.read.getPositionInfo([marketId, account]);
243
+ const loanTokenData = marketInfo.assetsData[marketInfo.loanToken];
244
+ const credit = (0, tokens_1.assetAmountInEth)(positionInfo.credit.toString(), marketInfo.loanToken);
245
+ const creditUsd = new decimal_js_1.default(credit).mul(loanTokenData.price).toString();
246
+ const usedAssets = {
247
+ [marketInfo.loanToken]: {
248
+ symbol: marketInfo.loanToken,
249
+ supplied: credit,
250
+ borrowed: '0',
251
+ isSupplied: new decimal_js_1.default(positionInfo.credit.toString()).gt(0),
252
+ isBorrowed: false,
253
+ collateral: false,
254
+ suppliedUsd: creditUsd,
255
+ borrowedUsd: '0',
256
+ },
257
+ };
258
+ const { netApy } = (0, staking_1.calculateNetApy)({ usedAssets, assetsData: marketInfo.assetsData });
259
+ return { apy: netApy, amount: credit, amountUsd: creditUsd };
260
+ });
261
+ }
@@ -24,6 +24,7 @@ const compoundV3_1 = require("../compoundV3");
24
24
  const curveUsd_1 = require("../curveUsd");
25
25
  const llamaLend_1 = require("../llamaLend");
26
26
  const morphoBlue_1 = require("../morphoBlue");
27
+ const morphoMidnight_1 = require("../morphoMidnight");
27
28
  const contracts_1 = require("../contracts");
28
29
  const hasAnyBalance = (balances) => ([balances.collateral, balances.debt].some((group) => Object.values(group || {}).some((amount) => new decimal_js_1.default(amount || '0').gt(0))));
29
30
  /**
@@ -87,6 +88,9 @@ function getUserPositionsExistence(provider_1, network_1, address_1) {
87
88
  Object.values((0, markets_1.MorphoBlueMarkets)(network)).filter((market) => market.chainIds.includes(network)).forEach((market) => {
88
89
  tasks.push(balanceTask(market.value, () => (0, morphoBlue_1._getMorphoBlueAccountBalances)(client, network, block, false, address, market)));
89
90
  });
91
+ Object.values((0, markets_1.MorphoMidnightMarkets)(network)).filter((market) => market.chainIds.includes(network)).forEach((market) => {
92
+ tasks.push(balanceTask(market.value, () => (0, morphoMidnight_1._getMorphoMidnightAccountBalances)(client, network, block, false, address, market)));
93
+ });
90
94
  yield Promise.all(tasks);
91
95
  return existence;
92
96
  });
@@ -31,6 +31,7 @@ const decimal_js_1 = __importDefault(require("decimal.js"));
31
31
  const common_1 = require("../types/common");
32
32
  const markets_1 = require("../markets");
33
33
  const morphoBlue_1 = require("../morphoBlue");
34
+ const morphoMidnight_1 = require("../morphoMidnight");
34
35
  const types_1 = require("../types");
35
36
  const compoundV3_1 = require("../compoundV3");
36
37
  const spark_1 = require("../spark");
@@ -58,6 +59,7 @@ function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1)
58
59
  const isMainnet = network === common_1.NetworkNumber.Eth;
59
60
  const isFluidSupported = [common_1.NetworkNumber.Eth, common_1.NetworkNumber.Arb, common_1.NetworkNumber.Base, common_1.NetworkNumber.Plasma].includes(network);
60
61
  const morphoMarkets = Object.values((0, markets_1.MorphoBlueMarkets)(network)).filter((market) => market.chainIds.includes(network));
62
+ const morphoMidnightMarkets = Object.values((0, markets_1.MorphoMidnightMarkets)(network)).filter((market) => market.chainIds.includes(network));
61
63
  const compoundV3Markets = Object.values((0, markets_1.CompoundMarkets)(network)).filter((market) => market.chainIds.includes(network) && market.value !== types_1.CompoundVersions.CompoundV2);
62
64
  const sparkMarkets = Object.values((0, markets_1.SparkMarkets)(network)).filter((market) => market.chainIds.includes(network));
63
65
  const aaveV3Markets = [types_1.AaveVersions.AaveV3, types_1.AaveVersions.AaveV3Lido, types_1.AaveVersions.AaveV3Etherfi].map((version) => (0, markets_1.AaveMarkets)(network)[version]).filter((market) => market.chainIds.includes(network));
@@ -72,6 +74,7 @@ function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1)
72
74
  const client = (0, viem_1.getViemProvider)(provider, ...args);
73
75
  const defaultClient = (0, viem_1.getViemProvider)(defaultProvider, ...args);
74
76
  const morphoMarketsData = {};
77
+ const morphoMidnightMarketsData = {};
75
78
  const compoundV3MarketsData = {};
76
79
  const sparkMarketsData = {};
77
80
  const aaveV3MarketsData = {};
@@ -84,6 +87,7 @@ function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1)
84
87
  const aaveV4SpokesData = {};
85
88
  const markets = {
86
89
  morphoMarketsData,
90
+ morphoMidnightMarketsData,
87
91
  compoundV3MarketsData,
88
92
  sparkMarketsData,
89
93
  aaveV3MarketsData,
@@ -103,6 +107,7 @@ function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1)
103
107
  aaveV3: {},
104
108
  aaveV4: {},
105
109
  morphoBlue: {},
110
+ morphoMidnight: {},
106
111
  compoundV3: {},
107
112
  spark: {},
108
113
  maker: {},
@@ -122,6 +127,7 @@ function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1)
122
127
  stakingPositions[address.toLowerCase()] = {
123
128
  aaveV3: {},
124
129
  morphoBlue: {},
130
+ morphoMidnight: {},
125
131
  compoundV3: {},
126
132
  spark: {},
127
133
  aaveV2: {},
@@ -149,6 +155,10 @@ function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1)
149
155
  const marketData = yield (0, morphoBlue_1._getMorphoBluePortfolioMarketData)(client, network, market);
150
156
  morphoMarketsData[market.value] = marketData;
151
157
  })),
158
+ ...morphoMidnightMarkets.map((market) => __awaiter(this, void 0, void 0, function* () {
159
+ const marketData = yield (0, morphoMidnight_1._getMorphoMidnightMarketData)(client, network, market);
160
+ morphoMidnightMarketsData[market.value] = marketData;
161
+ })),
152
162
  ...compoundV3Markets.map((market) => __awaiter(this, void 0, void 0, function* () {
153
163
  const marketData = yield (0, compoundV3_1._getCompoundV3MarketsData)(client, network, market, defaultClient);
154
164
  compoundV3MarketsData[market.value] = marketData;
@@ -483,6 +493,40 @@ function getPortfolioData(provider_1, network_1, defaultProvider_1, addresses_1)
483
493
  positions[address.toLowerCase()].morphoBlue[market.value] = { error: `Error fetching MorphoBlue account data for address ${address} on market ${market.value}`, data: null };
484
494
  }
485
495
  }))).flat(),
496
+ ...morphoMidnightMarkets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
497
+ try {
498
+ const [accDataPromise, earnDataPromise] = yield Promise.allSettled([
499
+ (0, morphoMidnight_1._getMorphoMidnightAccountData)(client, network, address, market, morphoMidnightMarketsData[market.value]),
500
+ (0, morphoMidnight_1.getMorphoMidnightEarn)(client, network, address, market, morphoMidnightMarketsData[market.value]),
501
+ ]);
502
+ if (accDataPromise.status === 'rejected') {
503
+ console.error(`Error fetching MorphoMidnight account data for address ${address} on market ${market.value}:`, accDataPromise.reason);
504
+ positions[address.toLowerCase()].morphoMidnight[market.value] = { error: `Error fetching MorphoMidnight account data for address ${address} on market ${market.value}`, data: null };
505
+ }
506
+ if (earnDataPromise.status === 'rejected') {
507
+ console.error(`Error fetching MorphoMidnight account data for address ${address} on market ${market.value}:`, earnDataPromise.reason);
508
+ positions[address.toLowerCase()].morphoMidnight[market.value] = { error: `Error fetching MorphoMidnight account data for address ${address} on market ${market.value}`, data: null };
509
+ }
510
+ if (accDataPromise.status !== 'rejected') {
511
+ const accData = accDataPromise.value;
512
+ if (new decimal_js_1.default(accData.suppliedUsd).gt(0))
513
+ positions[address.toLowerCase()].morphoMidnight[market.value] = { error: '', data: accData };
514
+ }
515
+ if (earnDataPromise.status !== 'rejected') {
516
+ const earnData = earnDataPromise.value;
517
+ if (earnData && new decimal_js_1.default(earnData.amount).gt(0)) {
518
+ stakingPositions[address.toLowerCase()].morphoMidnight[market.value] = {
519
+ error: '',
520
+ data: earnData,
521
+ };
522
+ }
523
+ }
524
+ }
525
+ catch (error) {
526
+ console.error(`Error fetching MorphoMidnight account data for address ${address} on market ${market.value}:`, error);
527
+ positions[address.toLowerCase()].morphoMidnight[market.value] = { error: `Error fetching MorphoMidnight account data for address ${address} on market ${market.value}`, data: null };
528
+ }
529
+ }))).flat(),
486
530
  ...compoundV3Markets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
487
531
  try {
488
532
  const accData = yield (0, compoundV3_1._getCompoundV3AccountData)(client, network, address, constants_1.ZERO_ADDRESS, { selectedMarket: market, assetsData: compoundV3MarketsData[market.value].assetsData });
@@ -833,6 +833,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
833
833
  s: import("viem").Hex;
834
834
  value: bigint;
835
835
  v: bigint;
836
+ chainId?: number | undefined;
836
837
  type: "legacy";
837
838
  gas: bigint;
838
839
  nonce: number;
@@ -847,7 +848,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
847
848
  yParity?: undefined | undefined;
848
849
  input: import("viem").Hex;
849
850
  typeHex: import("viem").Hex | null;
850
- chainId?: number | undefined;
851
851
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T ? T extends (blockTag extends "pending" ? true : false) ? T extends true ? null : bigint : never : never;
852
852
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_1 ? T_1 extends (blockTag extends "pending" ? true : false) ? T_1 extends true ? null : `0x${string}` : never : never;
853
853
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_2 ? T_2 extends (blockTag extends "pending" ? true : false) ? T_2 extends true ? null : number : never : never;
@@ -858,6 +858,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
858
858
  s: import("viem").Hex;
859
859
  value: bigint;
860
860
  v: bigint;
861
+ chainId: number;
861
862
  type: "eip2930";
862
863
  gas: bigint;
863
864
  nonce: number;
@@ -872,7 +873,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
872
873
  yParity: number;
873
874
  input: import("viem").Hex;
874
875
  typeHex: import("viem").Hex | null;
875
- chainId: number;
876
876
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_3 ? T_3 extends (blockTag extends "pending" ? true : false) ? T_3 extends true ? null : bigint : never : never;
877
877
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_4 ? T_4 extends (blockTag extends "pending" ? true : false) ? T_4 extends true ? null : `0x${string}` : never : never;
878
878
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_5 ? T_5 extends (blockTag extends "pending" ? true : false) ? T_5 extends true ? null : number : never : never;
@@ -883,6 +883,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
883
883
  s: import("viem").Hex;
884
884
  value: bigint;
885
885
  v: bigint;
886
+ chainId: number;
886
887
  type: "eip1559";
887
888
  gas: bigint;
888
889
  nonce: number;
@@ -897,7 +898,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
897
898
  yParity: number;
898
899
  input: import("viem").Hex;
899
900
  typeHex: import("viem").Hex | null;
900
- chainId: number;
901
901
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_6 ? T_6 extends (blockTag extends "pending" ? true : false) ? T_6 extends true ? null : bigint : never : never;
902
902
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_7 ? T_7 extends (blockTag extends "pending" ? true : false) ? T_7 extends true ? null : `0x${string}` : never : never;
903
903
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_8 ? T_8 extends (blockTag extends "pending" ? true : false) ? T_8 extends true ? null : number : never : never;
@@ -908,6 +908,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
908
908
  s: import("viem").Hex;
909
909
  value: bigint;
910
910
  v: bigint;
911
+ chainId: number;
911
912
  type: "eip4844";
912
913
  gas: bigint;
913
914
  nonce: number;
@@ -922,7 +923,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
922
923
  yParity: number;
923
924
  input: import("viem").Hex;
924
925
  typeHex: import("viem").Hex | null;
925
- chainId: number;
926
926
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_9 ? T_9 extends (blockTag extends "pending" ? true : false) ? T_9 extends true ? null : bigint : never : never;
927
927
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_10 ? T_10 extends (blockTag extends "pending" ? true : false) ? T_10 extends true ? null : `0x${string}` : never : never;
928
928
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_11 ? T_11 extends (blockTag extends "pending" ? true : false) ? T_11 extends true ? null : number : never : never;
@@ -933,6 +933,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
933
933
  s: import("viem").Hex;
934
934
  value: bigint;
935
935
  v: bigint;
936
+ chainId: number;
936
937
  type: "eip7702";
937
938
  gas: bigint;
938
939
  nonce: number;
@@ -947,7 +948,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
947
948
  yParity: number;
948
949
  input: import("viem").Hex;
949
950
  typeHex: import("viem").Hex | null;
950
- chainId: number;
951
951
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_12 ? T_12 extends (blockTag extends "pending" ? true : false) ? T_12 extends true ? null : bigint : never : never;
952
952
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_13 ? T_13 extends (blockTag extends "pending" ? true : false) ? T_13 extends true ? null : `0x${string}` : never : never;
953
953
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_14 ? T_14 extends (blockTag extends "pending" ? true : false) ? T_14 extends true ? null : number : never : never;
@@ -983,6 +983,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
983
983
  s: import("viem").Hex;
984
984
  value: bigint;
985
985
  v: bigint;
986
+ chainId?: number | undefined;
986
987
  type: "legacy";
987
988
  gas: bigint;
988
989
  nonce: number;
@@ -997,7 +998,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
997
998
  yParity?: undefined | undefined;
998
999
  input: import("viem").Hex;
999
1000
  typeHex: import("viem").Hex | null;
1000
- chainId?: number | undefined;
1001
1001
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T ? T extends (blockTag extends "pending" ? true : false) ? T extends true ? null : bigint : never : never;
1002
1002
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_1 ? T_1 extends (blockTag extends "pending" ? true : false) ? T_1 extends true ? null : `0x${string}` : never : never;
1003
1003
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_2 ? T_2 extends (blockTag extends "pending" ? true : false) ? T_2 extends true ? null : number : never : never;
@@ -1008,6 +1008,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1008
1008
  s: import("viem").Hex;
1009
1009
  value: bigint;
1010
1010
  v: bigint;
1011
+ chainId: number;
1011
1012
  type: "eip2930";
1012
1013
  gas: bigint;
1013
1014
  nonce: number;
@@ -1022,7 +1023,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1022
1023
  yParity: number;
1023
1024
  input: import("viem").Hex;
1024
1025
  typeHex: import("viem").Hex | null;
1025
- chainId: number;
1026
1026
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_3 ? T_3 extends (blockTag extends "pending" ? true : false) ? T_3 extends true ? null : bigint : never : never;
1027
1027
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_4 ? T_4 extends (blockTag extends "pending" ? true : false) ? T_4 extends true ? null : `0x${string}` : never : never;
1028
1028
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_5 ? T_5 extends (blockTag extends "pending" ? true : false) ? T_5 extends true ? null : number : never : never;
@@ -1033,6 +1033,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1033
1033
  s: import("viem").Hex;
1034
1034
  value: bigint;
1035
1035
  v: bigint;
1036
+ chainId: number;
1036
1037
  type: "eip1559";
1037
1038
  gas: bigint;
1038
1039
  nonce: number;
@@ -1047,7 +1048,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1047
1048
  yParity: number;
1048
1049
  input: import("viem").Hex;
1049
1050
  typeHex: import("viem").Hex | null;
1050
- chainId: number;
1051
1051
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_6 ? T_6 extends (blockTag extends "pending" ? true : false) ? T_6 extends true ? null : bigint : never : never;
1052
1052
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_7 ? T_7 extends (blockTag extends "pending" ? true : false) ? T_7 extends true ? null : `0x${string}` : never : never;
1053
1053
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_8 ? T_8 extends (blockTag extends "pending" ? true : false) ? T_8 extends true ? null : number : never : never;
@@ -1058,6 +1058,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1058
1058
  s: import("viem").Hex;
1059
1059
  value: bigint;
1060
1060
  v: bigint;
1061
+ chainId: number;
1061
1062
  type: "eip4844";
1062
1063
  gas: bigint;
1063
1064
  nonce: number;
@@ -1072,7 +1073,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1072
1073
  yParity: number;
1073
1074
  input: import("viem").Hex;
1074
1075
  typeHex: import("viem").Hex | null;
1075
- chainId: number;
1076
1076
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_9 ? T_9 extends (blockTag extends "pending" ? true : false) ? T_9 extends true ? null : bigint : never : never;
1077
1077
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_10 ? T_10 extends (blockTag extends "pending" ? true : false) ? T_10 extends true ? null : `0x${string}` : never : never;
1078
1078
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_11 ? T_11 extends (blockTag extends "pending" ? true : false) ? T_11 extends true ? null : number : never : never;
@@ -1083,6 +1083,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1083
1083
  s: import("viem").Hex;
1084
1084
  value: bigint;
1085
1085
  v: bigint;
1086
+ chainId: number;
1086
1087
  type: "eip7702";
1087
1088
  gas: bigint;
1088
1089
  nonce: number;
@@ -1097,7 +1098,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1097
1098
  yParity: number;
1098
1099
  input: import("viem").Hex;
1099
1100
  typeHex: import("viem").Hex | null;
1100
- chainId: number;
1101
1101
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_12 ? T_12 extends (blockTag extends "pending" ? true : false) ? T_12 extends true ? null : bigint : never : never;
1102
1102
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_13 ? T_13 extends (blockTag extends "pending" ? true : false) ? T_13 extends true ? null : `0x${string}` : never : never;
1103
1103
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_14 ? T_14 extends (blockTag extends "pending" ? true : false) ? T_14 extends true ? null : number : never : never;
@@ -4358,7 +4358,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
4358
4358
  authorizationList: import("viem").TransactionSerializableEIP7702["authorizationList"];
4359
4359
  } ? "eip7702" : never) | (request["type"] extends string | undefined ? Extract<request["type"], string> : never)>) ? T_12 extends "eip7702" ? import("viem").TransactionRequestEIP7702 : never : never : never)>> & {
4360
4360
  chainId?: number | undefined;
4361
- }, (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees" | "chainId") extends infer T_13 ? T_13 extends (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees" | "chainId") ? T_13 extends "fees" ? "gasPrice" | "maxFeePerGas" | "maxPriorityFeePerGas" : T_13 : never : never> & (unknown extends request["kzg"] ? {} : Pick<request, "kzg">) extends infer T ? { [K in keyof T]: T[K]; } : never>;
4361
+ }, (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "chainId" | "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees") extends infer T_13 ? T_13 extends (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "chainId" | "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees") ? T_13 extends "fees" ? "gasPrice" | "maxFeePerGas" | "maxPriorityFeePerGas" : T_13 : never : never> & (unknown extends request["kzg"] ? {} : Pick<request, "kzg">) extends infer T ? { [K in keyof T]: T[K]; } : never>;
4362
4362
  readContract: <const abi extends Abi | readonly unknown[], functionName extends import("viem").ContractFunctionName<abi, "pure" | "view">, const args extends import("viem").ContractFunctionArgs<abi, "pure" | "view", functionName>>(args: import("viem").ReadContractParameters<abi, functionName, args>) => Promise<import("viem").ReadContractReturnType<abi, functionName, args>>;
4363
4363
  sendRawTransaction: (args: import("viem").SendRawTransactionParameters) => Promise<import("viem").SendRawTransactionReturnType>;
4364
4364
  simulate: <const calls extends readonly unknown[]>(args: import("viem").SimulateBlocksParameters<calls>) => Promise<import("viem").SimulateBlocksReturnType<calls>>;
@@ -1,4 +1,4 @@
1
- import { IncentiveEligibilityId, MMUsedAssets } from '../types/common';
1
+ import { IncentiveData, IncentiveEligibilityId, MMUsedAssets } from '../types/common';
2
2
  export declare const isEligibleForEthenaUSDeRewards: (usedAssets: MMUsedAssets, { healthRatio }: {
3
3
  healthRatio: string;
4
4
  }) => {
@@ -29,3 +29,17 @@ export declare const EligibilityMapping: {
29
29
  eligibleUSDAmount: string;
30
30
  };
31
31
  };
32
+ export type IncentiveEligibilityResult = {
33
+ isEligible: boolean;
34
+ eligibleUSDAmount: string;
35
+ };
36
+ /**
37
+ * Resolves an incentive's position-specific eligibility and rewarded USD principal. Incentives
38
+ * without a curated eligibility rule apply to the full side amount supplied by the caller.
39
+ */
40
+ export declare const getIncentiveEligibility: ({ incentive, usedAssets, defaultEligibleUSDAmount, optionalData, }: {
41
+ incentive: Pick<IncentiveData, "eligibilityId">;
42
+ usedAssets: MMUsedAssets;
43
+ defaultEligibleUSDAmount: string;
44
+ optionalData?: any;
45
+ }) => IncentiveEligibilityResult;
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.EligibilityMapping = exports.isEligibleForCompoundV3PufEthWethBorrow = exports.isEligibleForAaveV3ArbitrumETHLSBorrow = exports.isEligibleForAaveV3ArbitrumEthSupply = exports.isEligibleForEthenaGHORewards = exports.isEligibleForEthenaUSDeRewards = void 0;
6
+ exports.getIncentiveEligibility = exports.EligibilityMapping = exports.isEligibleForCompoundV3PufEthWethBorrow = exports.isEligibleForAaveV3ArbitrumETHLSBorrow = exports.isEligibleForAaveV3ArbitrumEthSupply = exports.isEligibleForEthenaGHORewards = exports.isEligibleForEthenaUSDeRewards = void 0;
7
7
  const decimal_js_1 = __importDefault(require("decimal.js"));
8
8
  const common_1 = require("../types/common");
9
9
  const isEligibleForEthenaPairRewards = (usedAssets, { healthRatio }, { baseSymbol, pairSymbol, allowedBorrowAssets, maxHealthRatio, rewardSymbol, }) => {
@@ -87,3 +87,14 @@ exports.EligibilityMapping = {
87
87
  [common_1.IncentiveEligibilityId.AaveV3EthenaLiquidLeveragePlasmaGHO]: exports.isEligibleForEthenaGHORewards,
88
88
  [common_1.IncentiveEligibilityId.CompoundV3PufEthWethBorrow]: exports.isEligibleForCompoundV3PufEthWethBorrow,
89
89
  };
90
+ /**
91
+ * Resolves an incentive's position-specific eligibility and rewarded USD principal. Incentives
92
+ * without a curated eligibility rule apply to the full side amount supplied by the caller.
93
+ */
94
+ const getIncentiveEligibility = ({ incentive, usedAssets, defaultEligibleUSDAmount, optionalData, }) => {
95
+ const eligibilityCheck = incentive.eligibilityId ? exports.EligibilityMapping[incentive.eligibilityId] : null;
96
+ return eligibilityCheck
97
+ ? eligibilityCheck(usedAssets, optionalData)
98
+ : { isEligible: true, eligibleUSDAmount: defaultEligibleUSDAmount };
99
+ };
100
+ exports.getIncentiveEligibility = getIncentiveEligibility;